import { HttpApiBuilder, HttpServerRequest, HttpServerResponse, } from "@effect/platform"; import type { ExecutionInteraction, Source, WorkspaceId } from "#schema"; import * as Effect from "effect/Effect"; import { createSource, getSource, listSources, removeSource, updateSource, } from "../../runtime/sources-operations"; import { discoverSourceInspectionTools, getSourceInspection, getSourceInspectionToolDetail, } from "../../runtime/source-inspection"; import { completeSourceCredentialSetup, getSourceCredentialInteraction, submitSourceCredentialInteraction, } from "../../runtime/local-operations"; import { discoverSource } from "../../runtime/source-discovery"; import { hasSourceAdapterFamily } from "../../runtime/source-adapters"; import { RuntimeSourceAuthServiceTag } from "../../runtime/source-auth-service"; import { ControlPlaneBadRequestError, ControlPlaneNotFoundError, ControlPlaneStorageError, } from "../errors"; import { ControlPlaneApi } from "../api"; import { resolveRequestedLocalWorkspace } from "../local-context"; const readHeader = (headers: unknown, name: string): string | null => { if (headers == null || typeof headers !== "object") { return null; } const record = headers as Record; const exact = record[name]; if (typeof exact === "string" && exact.length > 0) { return exact; } const lower = record[name.toLowerCase()]; if (typeof lower === "string" && lower.length > 0) { return lower; } return null; }; const resolveRequestOrigin = (request: { url: string; headers: unknown }): string | null => { try { return new URL(request.url).origin; } catch { const forwardedHost = readHeader(request.headers, "x-forwarded-host"); const host = forwardedHost ?? readHeader(request.headers, "host"); if (!host) { return null; } const forwardedProto = readHeader(request.headers, "x-forwarded-proto"); const protocol = forwardedProto && forwardedProto.length > 0 ? forwardedProto : "http"; return `${protocol}://${host}`; } }; const toBadRequestError = (operation: string, cause: unknown) => { const message = cause instanceof Error ? cause.message : String(cause); return new ControlPlaneBadRequestError({ operation, message, details: message, }); }; const escapeHtml = (value: string): string => value .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll('"', """) .replaceAll("'", "'"); const serializeJsonForScript = (value: unknown): string => JSON.stringify(value) .replaceAll("<", "\\u003c") .replaceAll(">", "\\u003e") .replaceAll("&", "\\u0026"); const SOURCE_OAUTH_RESULT_STORAGE_KEY_PREFIX = "executor:oauth-result:"; const credentialPageDocument = (input: { title: string; eyebrow: string; message: string; sourceLabel: string; endpoint: string; interactionId: string; error?: string; state?: "pending" | "stored" | "continued" | "cancelled" | "inactive"; }) => ` ${escapeHtml(input.title)}
${escapeHtml(input.state ?? "pending")}

${escapeHtml(input.title)}

${escapeHtml(input.message)}


Source ${escapeHtml(input.sourceLabel)}
API endpoint
${escapeHtml(input.endpoint)}
Interaction ${escapeHtml(input.interactionId)}

${ input.error ? `

${escapeHtml(input.error)}

` : "" } ${ input.state === "stored" ? `

Credential stored

Executor resumed the source connection request. You can close this window.

` : input.state === "continued" ? `

Continuing without auth

Executor resumed the source connection without stored credentials. You can close this window.

` : input.state === "cancelled" ? `

Request cancelled

Executor was notified. You can close this window.

` : input.state === "inactive" ? `

No longer active

This credential request has expired. Start a new source connection flow if needed.

` : `

Add a token to enable authenticated requests, or continue without auth if this API supports public access.

` }
`; const sourceOAuthPopupResultDocument = (input: { title: string; message: string; state: "stored" | "cancelled"; sessionId?: string | null; payload: | { type: "executor:source-oauth-result"; ok: true; sourceId: Source["id"]; } | { type: "executor:source-oauth-result"; ok: false; error: string; }; }) => ` ${escapeHtml(input.title)}
${escapeHtml(input.state === "stored" ? "connected" : "failed")}

${escapeHtml(input.title)}

${escapeHtml(input.message)}

`; const htmlResponse = (html: string, status = 200) => HttpServerResponse.html(html).pipe( HttpServerResponse.setStatus(status), ); const credentialErrorResponse = (input: { title: string; message: string; status: number; }) => htmlResponse( credentialPageDocument({ title: input.title, eyebrow: "Executor", message: input.message, sourceLabel: "Unavailable", endpoint: "Unavailable", interactionId: "unavailable", state: "inactive", error: input.message, }), input.status, ); const credentialErrorStatus = ( error: ControlPlaneBadRequestError | ControlPlaneNotFoundError | ControlPlaneStorageError, ) => error instanceof ControlPlaneNotFoundError ? 404 : error instanceof ControlPlaneBadRequestError ? 400 : 500; const credentialSubmitErrorResponse = (input: { workspaceId: WorkspaceId; sourceId: Source["id"]; interactionId: ExecutionInteraction["id"]; message: string; status: number; }) => getSourceCredentialInteraction({ workspaceId: input.workspaceId, sourceId: input.sourceId, interactionId: input.interactionId, }).pipe( Effect.match({ onFailure: () => credentialErrorResponse({ title: "Source Credential Request Failed", message: input.message, status: input.status, }), onSuccess: (interaction) => htmlResponse( credentialPageDocument({ title: "Configure Source Access", eyebrow: "Executor", message: interaction.message, sourceLabel: interaction.sourceLabel, endpoint: interaction.endpoint, interactionId: interaction.interactionId, error: input.message, state: "pending", }), input.status, ), }), ); export const ControlPlaneSourcesLive = HttpApiBuilder.group( ControlPlaneApi, "sources", (handlers) => handlers .handle("discover", ({ payload }) => discoverSource({ url: payload.url, probeAuth: payload.probeAuth, }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.discover", cause)), ), ), ) .handle("connect", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.connect", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => Effect.gen(function* () { const request = yield* HttpServerRequest.HttpServerRequest; const sourceAuthService = yield* RuntimeSourceAuthServiceTag; const baseUrl = resolveRequestOrigin(request); if (payload.kind === "mcp" && hasSourceAdapterFamily(payload.kind, "mcp")) { return yield* sourceAuthService.connectMcpSource({ workspaceId: path.workspaceId, actorAccountId: runtimeLocalWorkspace.installation.accountId, endpoint: payload.endpoint, name: payload.name, namespace: payload.namespace, transport: payload.transport, queryParams: payload.queryParams, headers: payload.headers, baseUrl, }); } return yield* sourceAuthService.addExecutorSource( { workspaceId: path.workspaceId, actorAccountId: runtimeLocalWorkspace.installation.accountId, executionId: null, interactionId: null, ...payload, }, { baseUrl }, ); }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.connect", cause)), ), ) ), ), ) .handle("connectBatch", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.connectBatch", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => Effect.gen(function* () { const request = yield* HttpServerRequest.HttpServerRequest; const sourceAuthService = yield* RuntimeSourceAuthServiceTag; const baseUrl = resolveRequestOrigin(request); return yield* sourceAuthService.connectGoogleDiscoveryBatch({ workspaceId: path.workspaceId, actorAccountId: runtimeLocalWorkspace.installation.accountId, executionId: null, interactionId: null, workspaceOauthClientId: payload.workspaceOauthClientId, sources: payload.sources, baseUrl, }); }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.connectBatch", cause)), ), ), ), ), ) .handle("listWorkspaceOauthClients", ({ path, urlParams }) => resolveRequestedLocalWorkspace("sources.listWorkspaceOauthClients", path.workspaceId).pipe( Effect.flatMap(() => Effect.gen(function* () { const sourceAuthService = yield* RuntimeSourceAuthServiceTag; return yield* sourceAuthService.listWorkspaceOauthClients({ workspaceId: path.workspaceId, providerKey: urlParams.providerKey, }); }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.listWorkspaceOauthClients", cause)), ), ), ), ), ) .handle("createWorkspaceOauthClient", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.createWorkspaceOauthClient", path.workspaceId).pipe( Effect.flatMap(() => Effect.gen(function* () { const sourceAuthService = yield* RuntimeSourceAuthServiceTag; return yield* sourceAuthService.createWorkspaceOauthClient({ workspaceId: path.workspaceId, providerKey: payload.providerKey, label: payload.label, oauthClient: payload.oauthClient, }); }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.createWorkspaceOauthClient", cause)), ), ), ), ), ) .handle("removeWorkspaceOauthClient", ({ path }) => resolveRequestedLocalWorkspace("sources.removeWorkspaceOauthClient", path.workspaceId).pipe( Effect.flatMap(() => Effect.gen(function* () { const sourceAuthService = yield* RuntimeSourceAuthServiceTag; const removed = yield* sourceAuthService.removeWorkspaceOauthClient({ workspaceId: path.workspaceId, oauthClientId: path.oauthClientId, }); return { removed }; }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.removeWorkspaceOauthClient", cause)), ), ), ), ), ) .handle("removeProviderAuthGrant", ({ path }) => resolveRequestedLocalWorkspace("sources.removeProviderAuthGrant", path.workspaceId).pipe( Effect.flatMap(() => Effect.gen(function* () { const sourceAuthService = yield* RuntimeSourceAuthServiceTag; const removed = yield* sourceAuthService.removeProviderAuthGrant({ workspaceId: path.workspaceId, grantId: path.grantId, }).pipe( Effect.catchAll((cause) => Effect.fail(toBadRequestError("sources.removeProviderAuthGrant", cause)), ), ); return { removed }; }), ), ), ) .handle("list", ({ path }) => resolveRequestedLocalWorkspace("sources.list", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => listSources({ workspaceId: path.workspaceId, accountId: runtimeLocalWorkspace.installation.accountId, }) ), ), ) .handle("create", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.create", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => createSource({ workspaceId: path.workspaceId, accountId: runtimeLocalWorkspace.installation.accountId, payload, }) ), ), ) .handle("get", ({ path }) => resolveRequestedLocalWorkspace("sources.get", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => getSource({ workspaceId: path.workspaceId, sourceId: path.sourceId, accountId: runtimeLocalWorkspace.installation.accountId, }) ), ), ) .handle("inspection", ({ path }) => resolveRequestedLocalWorkspace("sources.inspection", path.workspaceId).pipe( Effect.zipRight( getSourceInspection({ workspaceId: path.workspaceId, sourceId: path.sourceId, }), ), ), ) .handle("inspectionTool", ({ path }) => resolveRequestedLocalWorkspace("sources.inspection_tool", path.workspaceId).pipe( Effect.zipRight( getSourceInspectionToolDetail({ workspaceId: path.workspaceId, sourceId: path.sourceId, toolPath: path.toolPath, }), ), ), ) .handle("inspectionDiscover", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.inspection_discover", path.workspaceId).pipe( Effect.zipRight( discoverSourceInspectionTools({ workspaceId: path.workspaceId, sourceId: path.sourceId, payload, }), ), ), ) .handle("update", ({ path, payload }) => resolveRequestedLocalWorkspace("sources.update", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => updateSource({ workspaceId: path.workspaceId, sourceId: path.sourceId, accountId: runtimeLocalWorkspace.installation.accountId, payload, }) ), ), ) .handle("remove", ({ path }) => resolveRequestedLocalWorkspace("sources.remove", path.workspaceId).pipe( Effect.zipRight( removeSource({ workspaceId: path.workspaceId, sourceId: path.sourceId, }), ), ), ) .handle("credentialPage", ({ path, urlParams }) => getSourceCredentialInteraction({ workspaceId: path.workspaceId, sourceId: path.sourceId, interactionId: urlParams.interactionId, }).pipe( Effect.map((interaction) => htmlResponse( credentialPageDocument({ title: "Configure Source Access", eyebrow: "Executor", message: interaction.message, sourceLabel: interaction.sourceLabel, endpoint: interaction.endpoint, interactionId: interaction.interactionId, state: interaction.status === "pending" ? "pending" : "inactive", }), ) ), Effect.catchTags({ ControlPlaneNotFoundError: (error) => Effect.succeed( credentialErrorResponse({ title: "Source Credential Request Unavailable", message: error.message, status: credentialErrorStatus(error), }), ), ControlPlaneStorageError: (error) => Effect.succeed( credentialErrorResponse({ title: "Source Credential Request Failed", message: error.message, status: credentialErrorStatus(error), }), ), }), ), ) .handle("credentialSubmit", ({ path, urlParams, payload }) => submitSourceCredentialInteraction({ workspaceId: path.workspaceId, sourceId: path.sourceId, interactionId: urlParams.interactionId, action: payload.action === "cancel" ? "cancel" : payload.action === "continue" ? "continue" : "submit", token: payload.token, }).pipe( Effect.map((result) => htmlResponse( credentialPageDocument({ title: result.kind === "stored" ? "Source Credential Stored" : result.kind === "continued" ? "Source Access Updated" : "Source Credential Request Cancelled", eyebrow: "Executor", message: result.kind === "stored" ? "Executor stored the credential and resumed the source connection." : result.kind === "continued" ? "Executor resumed the source connection without stored credentials." : "Executor cancelled the source credential request.", sourceLabel: result.sourceLabel, endpoint: result.endpoint, interactionId: urlParams.interactionId, state: result.kind === "stored" ? "stored" : result.kind === "continued" ? "continued" : "cancelled", }), ) ), Effect.catchTags({ ControlPlaneBadRequestError: (error) => credentialSubmitErrorResponse({ workspaceId: path.workspaceId, sourceId: path.sourceId, interactionId: urlParams.interactionId, message: error.message, status: credentialErrorStatus(error), }), ControlPlaneNotFoundError: (error) => Effect.succeed( credentialErrorResponse({ title: "Source Credential Request Unavailable", message: error.message, status: credentialErrorStatus(error), }), ), ControlPlaneStorageError: (error) => Effect.succeed( credentialErrorResponse({ title: "Source Credential Request Failed", message: error.message, status: credentialErrorStatus(error), }), ), }), ), ) .handle("credentialComplete", ({ path, urlParams }) => completeSourceCredentialSetup({ workspaceId: path.workspaceId, sourceId: path.sourceId, state: urlParams.state, code: urlParams.code, error: urlParams.error, errorDescription: urlParams.error_description, }).pipe( Effect.map((completed) => htmlResponse( sourceOAuthPopupResultDocument({ title: "Source connected", message: `Source connected: ${completed.source.id}. You can close this window.`, state: "stored", sessionId: completed.sessionId, payload: { type: "executor:source-oauth-result", ok: true, sourceId: completed.source.id, }, }), ), ), Effect.catchAll((error) => Effect.succeed( htmlResponse( sourceOAuthPopupResultDocument({ title: "OAuth failed", message: error instanceof Error ? error.message : "Failed completing OAuth", state: "cancelled", payload: { type: "executor:source-oauth-result", ok: false, error: error instanceof Error ? error.message : "Failed completing OAuth", }, }), 500, ), ), ), ), ) .handle("providerOauthComplete", ({ path, urlParams }) => resolveRequestedLocalWorkspace("sources.providerOauthComplete", path.workspaceId).pipe( Effect.flatMap((runtimeLocalWorkspace) => Effect.gen(function* () { const sourceAuthService = yield* RuntimeSourceAuthServiceTag; const completed = yield* sourceAuthService.completeProviderOauthCallback({ workspaceId: path.workspaceId, actorAccountId: runtimeLocalWorkspace.installation.accountId, state: urlParams.state, code: urlParams.code, error: urlParams.error, errorDescription: urlParams.error_description, }); const primarySource = completed.sources[0] ?? null; return htmlResponse( sourceOAuthPopupResultDocument({ title: "Sources connected", message: `Connected ${completed.sources.length} source${completed.sources.length === 1 ? "" : "s"}. You can close this window.`, state: "stored", sessionId: completed.sessionId, payload: { type: "executor:source-oauth-result", ok: true, sourceId: primarySource?.id ?? ("src_oauth_complete" as Source["id"]), }, }), ); }).pipe( Effect.catchAll((error) => Effect.succeed( htmlResponse( sourceOAuthPopupResultDocument({ title: "OAuth failed", message: error instanceof Error ? error.message : "Failed completing OAuth", state: "cancelled", payload: { type: "executor:source-oauth-result", ok: false, error: error instanceof Error ? error.message : "Failed completing OAuth", }, }), 500, ), ), ), ), ), Effect.catchAll((error) => Effect.succeed( htmlResponse( sourceOAuthPopupResultDocument({ title: "OAuth failed", message: error instanceof Error ? error.message : "Failed completing OAuth", state: "cancelled", payload: { type: "executor:source-oauth-result", ok: false, error: error instanceof Error ? error.message : "Failed completing OAuth", }, }), 500, ), ), ), ), ), );