import { HttpApiBuilder } from "@effect/platform"; import { Context, Effect } from "effect"; import { addGroup } from "@executor/api"; import type { GraphqlPluginExtension, HeaderValue } from "../sdk/plugin"; import { GraphqlGroup } from "./group"; // --------------------------------------------------------------------------- // Service tag — the server provides the GraphQL extension // --------------------------------------------------------------------------- export class GraphqlExtensionService extends Context.Tag( "GraphqlExtensionService", )() {} // --------------------------------------------------------------------------- // Composed API — core + graphql group // --------------------------------------------------------------------------- const ExecutorApiWithGraphql = addGroup(GraphqlGroup); // --------------------------------------------------------------------------- // Handlers // --------------------------------------------------------------------------- export const GraphqlHandlers = HttpApiBuilder.group( ExecutorApiWithGraphql, "graphql", (handlers) => handlers.handle("addSource", ({ payload }) => Effect.gen(function* () { const ext = yield* GraphqlExtensionService; const result = yield* ext.addSource({ endpoint: payload.endpoint, introspectionJson: payload.introspectionJson, namespace: payload.namespace, headers: payload.headers as Record | undefined, }); return { toolCount: result.toolCount, namespace: payload.namespace ?? "graphql", }; }).pipe(Effect.orDie), ), );