import { Schema } from "effect" import { HttpApi } from "effect/unstable/httpapi" import { EventV2 } from "@opencode-ai/core/event" import { EventManifest } from "@/event-manifest" import { Credential } from "@opencode-ai/core/credential" import { Integration } from "@opencode-ai/core/integration" import { SkillV2 } from "@opencode-ai/core/skill" import { InstanceDisposed } from "@/server/event" import { Question } from "@/question" import { ConfigApi } from "./groups/config" import { ControlApi } from "./groups/control" import { ControlPlaneApi } from "./groups/control-plane" import { EventApi } from "./groups/event" import { ExperimentalApi } from "./groups/experimental" import { FileApi } from "./groups/file" import { InstanceApi } from "./groups/instance" import { McpApi } from "./groups/mcp" import { PermissionApi } from "./groups/permission" import { ProjectApi } from "./groups/project" import { ProjectCopyApi } from "./groups/project-copy" import { ProviderApi } from "./groups/provider" import { PtyApi, PtyConnectApi } from "./groups/pty" import { QuestionApi } from "./groups/question" import { SessionApi } from "./groups/session" import { SyncApi } from "./groups/sync" import { TuiApi } from "./groups/tui" import { WorkspaceApi } from "./groups/workspace" import { makeApi } from "@opencode-ai/protocol/api" import { LocationMiddleware } from "@opencode-ai/server/location" import { FormLocationMiddleware } from "@opencode-ai/server/middleware/form-location" import { SessionLocationMiddleware } from "@opencode-ai/server/middleware/session-location" import { GlobalApi } from "./groups/global" import { Authorization } from "./middleware/authorization" import { SchemaErrorMiddleware } from "./middleware/schema-error" const EventSchema = Schema.Union([ ...EventManifest.Latest.values() .map((definition) => Schema.Struct({ id: EventV2.ID, type: Schema.Literal(definition.type), properties: definition.data, }).annotate({ identifier: `Event.${definition.type}` }), ) .toArray(), InstanceDisposed, ]).annotate({ identifier: "Event" }) export const ServerApi = makeApi({ definitions: EventManifest.Latest.values().toArray(), locationMiddleware: LocationMiddleware, formLocationMiddleware: FormLocationMiddleware, sessionLocationMiddleware: SessionLocationMiddleware, }) export const RootHttpApi = HttpApi.make("opencode-root") .addHttpApi(ControlApi) .addHttpApi(ControlPlaneApi) .addHttpApi(GlobalApi) .middleware(SchemaErrorMiddleware) .middleware(Authorization) export const InstanceHttpApi = HttpApi.make("opencode-instance") .addHttpApi(ConfigApi) .addHttpApi(ExperimentalApi) .addHttpApi(FileApi) .addHttpApi(InstanceApi) .addHttpApi(McpApi) .addHttpApi(ProjectApi) .addHttpApi(ProjectCopyApi) .addHttpApi(PtyApi) .addHttpApi(QuestionApi) .addHttpApi(PermissionApi) .addHttpApi(ProviderApi) .addHttpApi(SessionApi) .addHttpApi(SyncApi) .addHttpApi(TuiApi) .addHttpApi(WorkspaceApi) .middleware(SchemaErrorMiddleware) export const OpenCodeHttpApi = HttpApi.make("opencode") .addHttpApi(RootHttpApi) .addHttpApi(EventApi) .addHttpApi(InstanceHttpApi) .addHttpApi(ServerApi) .addHttpApi(PtyConnectApi) .annotate(HttpApi.AdditionalSchemas, [ EventSchema, Question.Replied, Question.Rejected, Credential.Value, Integration.Inputs, Integration.Method, Integration.Ref, SkillV2.Source, ]) export type RootHttpApiType = typeof RootHttpApi export type InstanceHttpApiType = typeof InstanceHttpApi