import { HttpApi, OpenApi } from "@effect/platform"; import type { HttpApiGroup } from "@effect/platform"; import { ExecutionsApi } from "./executions/api"; import { LocalApi } from "./local/api"; import { PoliciesApi } from "./policies/api"; import { SourcesApi } from "./sources/api"; import type { ExecutorHttpApiExtension, ExecutorHttpPlugin, ExecutorHttpPluginGroups, } from "./plugins"; export const CoreExecutorApi = HttpApi.make("executor") .add(LocalApi) .add(SourcesApi) .add(PoliciesApi) .add(ExecutionsApi) .annotateContext( OpenApi.annotations({ title: "Executor API", description: "Local-first API for workspace sources, policies, auth, and execution", }), ); type HttpApiGroupsOf = TApi extends HttpApi.HttpApi ? TGroups : never; type HttpApiErrorOf = TApi extends HttpApi.HttpApi ? TError : never; type HttpApiContextOf = TApi extends HttpApi.HttpApi ? TContext : never; export type CoreExecutorApiGroups = HttpApiGroupsOf; export type ExecutorApiWithPlugins< TPlugins extends readonly ExecutorHttpApiExtension[] = [], > = HttpApi.HttpApi< "executor", CoreExecutorApiGroups | ExecutorHttpPluginGroups, HttpApiErrorOf, HttpApiContextOf >; export const createExecutorApi = < const TPlugins extends readonly ExecutorHttpApiExtension[] = [], >( options: { plugins?: TPlugins; } = {}, ): ExecutorApiWithPlugins => (options.plugins ?? []).reduce( (api, plugin) => api.add(plugin.group as HttpApiGroup.HttpApiGroup.Any), CoreExecutorApi as HttpApi.HttpApi< "executor", CoreExecutorApiGroups | ExecutorHttpPluginGroups, HttpApiErrorOf, HttpApiContextOf >, ); export const ExecutorApi = createExecutorApi(); export const createExecutorOpenApiSpec = < const TPlugins extends readonly ExecutorHttpPlugin[] = [], >( options: { plugins?: TPlugins; } = {}, ) => OpenApi.fromApi(createExecutorApi(options)); export const executorOpenApiSpec = createExecutorOpenApiSpec();