100 lines
3.5 KiB
TypeScript
100 lines
3.5 KiB
TypeScript
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
|