import { Hono } from "hono" import { describeRoute, validator, resolver } from "hono-openapi" import { Config } from "@/config/config" import { InstanceState } from "@/effect/instance-state" import { InstanceStore } from "@/project/instance-store" import { Provider } from "@/provider/provider" import { errors } from "../../error" import { lazy } from "@/util/lazy" import { jsonRequest } from "./trace" export const ConfigRoutes = lazy(() => new Hono() .get( "/", describeRoute({ summary: "Get configuration", description: "Retrieve the current OpenCode configuration settings and preferences.", operationId: "config.get", responses: { 200: { description: "Get config info", content: { "application/json": { schema: resolver(Config.Info.zod), }, }, }, }, }), async (c) => jsonRequest("ConfigRoutes.get", c, function* () { const cfg = yield* Config.Service return yield* cfg.get() }), ) .patch( "/", describeRoute({ summary: "Update configuration", description: "Update OpenCode configuration settings and preferences.", operationId: "config.update", responses: { 200: { description: "Successfully updated config", content: { "application/json": { schema: resolver(Config.Info.zod), }, }, }, ...errors(400), }, }), validator("json", Config.Info.zod), async (c) => jsonRequest("ConfigRoutes.update", c, function* () { const config = c.req.valid("json") const cfg = yield* Config.Service const store = yield* InstanceStore.Service yield* cfg.update(config) yield* store.dispose(yield* InstanceState.context) return config }), ) .get( "/providers", describeRoute({ summary: "List config providers", description: "Get a list of all configured AI providers and their default models.", operationId: "config.providers", responses: { 200: { description: "List of providers", content: { "application/json": { schema: resolver(Provider.ConfigProvidersResult.zod), }, }, }, }, }), async (c) => jsonRequest("ConfigRoutes.providers", c, function* () { const svc = yield* Provider.Service const providers = yield* svc.list() return { providers: Object.values(providers), default: Provider.defaultModelIDs(providers), } }), ), )