mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-17 12:56:41 +02:00
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
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"
|
|
|
|
export const ConfigApi = HttpApi.make("config")
|
|
.add(
|
|
HttpApiGroup.make("config")
|
|
.add(
|
|
HttpApiEndpoint.get("get", root, {
|
|
success: Config.Info,
|
|
}).annotateMerge(
|
|
OpenApi.annotations({
|
|
identifier: "config.get",
|
|
summary: "Get configuration",
|
|
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(
|
|
OpenApi.annotations({
|
|
identifier: "config.providers",
|
|
summary: "List config providers",
|
|
description: "Get a list of all configured AI providers and their default models.",
|
|
}),
|
|
),
|
|
)
|
|
.annotateMerge(
|
|
OpenApi.annotations({
|
|
title: "config",
|
|
description: "Experimental HttpApi config routes.",
|
|
}),
|
|
)
|
|
.middleware(Authorization),
|
|
)
|
|
.annotateMerge(
|
|
OpenApi.annotations({
|
|
title: "opencode experimental HttpApi",
|
|
version: "0.0.1",
|
|
description: "Experimental HttpApi surface for selected instance routes.",
|
|
}),
|
|
)
|
|
|
|
export const configHandlers = Layer.unwrap(
|
|
Effect.gen(function* () {
|
|
const providerSvc = yield* Provider.Service
|
|
const configSvc = yield* Config.Service
|
|
|
|
const get = Effect.fn("ConfigHttpApi.get")(function* () {
|
|
return yield* configSvc.get()
|
|
})
|
|
|
|
const update = Effect.fn("ConfigHttpApi.update")(function* (ctx) {
|
|
yield* configSvc.update(ctx.payload, { dispose: false })
|
|
yield* markInstanceForDisposal(yield* InstanceState.context)
|
|
return ctx.payload
|
|
})
|
|
|
|
const providers = Effect.fn("ConfigHttpApi.providers")(function* () {
|
|
const providers = yield* providerSvc.list()
|
|
return {
|
|
providers: Object.values(providers),
|
|
default: Provider.defaultModelIDs(providers),
|
|
}
|
|
})
|
|
|
|
return HttpApiBuilder.group(ConfigApi, "config", (handlers) =>
|
|
handlers.handle("get", get).handle("update", update).handle("providers", providers),
|
|
)
|
|
}),
|
|
).pipe(Layer.provide(Provider.defaultLayer), Layer.provide(Config.defaultLayer))
|