import { Auth } from "@/auth" import { Schema } from "effect" import { HttpApi, HttpApiEndpoint, HttpApiError, HttpApiGroup, OpenApi } from "effect/unstable/httpapi" import { described } from "./metadata" import { ProviderV2 } from "@opencode-ai/core/provider" const AuthParams = Schema.Struct({ providerID: ProviderV2.ID, }) const LogQuery = Schema.Struct({ directory: Schema.optional(Schema.String), workspace: Schema.optional(Schema.String), }) export const LogInput = Schema.Struct({ service: Schema.String.annotate({ description: "Service name for the log entry" }), level: Schema.Union([ Schema.Literal("debug"), Schema.Literal("info"), Schema.Literal("error"), Schema.Literal("warn"), ]).annotate({ description: "Log level" }), message: Schema.String.annotate({ description: "Log message" }), extra: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)).annotate({ description: "Additional metadata for the log entry", }), }) export const ControlPaths = { auth: "/auth/:providerID", log: "/log", } as const export const ControlApi = HttpApi.make("control").add( HttpApiGroup.make("control") .add( HttpApiEndpoint.put("authSet", ControlPaths.auth, { params: AuthParams, payload: Auth.Info, success: described(Schema.Boolean, "Successfully set authentication credentials"), error: HttpApiError.BadRequest, }).annotateMerge( OpenApi.annotations({ identifier: "auth.set", summary: "Set auth credentials", description: "Set authentication credentials", }), ), HttpApiEndpoint.delete("authRemove", ControlPaths.auth, { params: AuthParams, success: described(Schema.Boolean, "Successfully removed authentication credentials"), error: HttpApiError.BadRequest, }).annotateMerge( OpenApi.annotations({ identifier: "auth.remove", summary: "Remove auth credentials", description: "Remove authentication credentials", }), ), HttpApiEndpoint.post("log", ControlPaths.log, { query: LogQuery, payload: LogInput, success: described(Schema.Boolean, "Log entry written successfully"), error: HttpApiError.BadRequest, }).annotateMerge( OpenApi.annotations({ identifier: "app.log", summary: "Write log", description: "Write a log entry to the server logs with specified level and metadata.", }), ), ) .annotateMerge(OpenApi.annotations({ title: "control", description: "Control plane routes." })), )