feat(httpapi): bridge config update endpoint (#24387)

This commit is contained in:
Kit Langton
2026-04-25 17:52:34 -04:00
committed by GitHub
parent 75a22f82bd
commit df9e1d9854
6 changed files with 111 additions and 8 deletions

View File

@@ -1,8 +1,10 @@
import { Config } from "@/config"
import { Provider } from "@/provider"
import * as InstanceState from "@/effect/instance-state"
import { Effect, Layer } from "effect"
import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
import { Authorization } from "./auth"
import { markInstanceForDisposal } from "./lifecycle"
const root = "/config"
@@ -19,6 +21,16 @@ export const ConfigApi = HttpApi.make("config")
description: "Retrieve the current OpenCode configuration settings and preferences.",
}),
),
HttpApiEndpoint.patch("update", root, {
payload: Config.Info,
success: Config.Info,
}).annotateMerge(
OpenApi.annotations({
identifier: "config.update",
summary: "Update configuration",
description: "Update OpenCode configuration settings and preferences.",
}),
),
HttpApiEndpoint.get("providers", `${root}/providers`, {
success: Provider.ConfigProvidersResult,
}).annotateMerge(
@@ -54,6 +66,13 @@ export const configHandlers = Layer.unwrap(
return yield* configSvc.get()
})
const update = Effect.fn("ConfigHttpApi.update")(function* (ctx) {
const payload = Config.Info.zod.parse(ctx.payload)
yield* configSvc.update(payload, { dispose: false })
yield* markInstanceForDisposal(yield* InstanceState.context)
return payload
})
const providers = Effect.fn("ConfigHttpApi.providers")(function* () {
const providers = yield* providerSvc.list()
return {
@@ -63,7 +82,7 @@ export const configHandlers = Layer.unwrap(
})
return HttpApiBuilder.group(ConfigApi, "config", (handlers) =>
handlers.handle("get", get).handle("providers", providers),
handlers.handle("get", get).handle("update", update).handle("providers", providers),
)
}),
).pipe(Layer.provide(Provider.defaultLayer), Layer.provide(Config.defaultLayer))

View File

@@ -45,6 +45,7 @@ export const InstanceRoutes = (upgrade: UpgradeWebSocket): Hono => {
app.get("/permission", (c) => handler(c.req.raw, context))
app.post("/permission/:requestID/reply", (c) => handler(c.req.raw, context))
app.get("/config", (c) => handler(c.req.raw, context))
app.patch("/config", (c) => handler(c.req.raw, context))
app.get("/config/providers", (c) => handler(c.req.raw, context))
app.get(ExperimentalPaths.console, (c) => handler(c.req.raw, context))
app.get(ExperimentalPaths.consoleOrgs, (c) => handler(c.req.raw, context))