From 2a118b52147675f4d71dd684b672ab1a7788560b Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 14 Apr 2026 19:40:05 -0400 Subject: [PATCH] refactor(config): use effectful HttpApi group builder Build the config providers HttpApi handler with an effectful group callback so the provider service is resolved once at layer construction time and the endpoint handler closes over the resulting service access. --- .../src/server/instance/httpapi/config.ts | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/opencode/src/server/instance/httpapi/config.ts b/packages/opencode/src/server/instance/httpapi/config.ts index 6e3fb04018..65251e82da 100644 --- a/packages/opencode/src/server/instance/httpapi/config.ts +++ b/packages/opencode/src/server/instance/httpapi/config.ts @@ -134,20 +134,27 @@ const Api = HttpApi.make("config") }), ) -const providers = Effect.fn("ConfigHttpApi.providers")(function* () { - const svc = yield* Provider.Service - const all = mapValues(yield* svc.list(), (item) => item) - return Schema.decodeUnknownSync(Providers)( - JSON.parse( - JSON.stringify({ - providers: Object.values(all), - default: mapValues(all, (item) => Provider.sort(Object.values(item.models))[0].id), - }), - ), - ) -}) +const ConfigLive = HttpApiBuilder.group( + Api, + "config", + Effect.fn("ConfigHttpApi.handlers")(function* (handlers) { + const svc = yield* Provider.Service -const ConfigLive = HttpApiBuilder.group(Api, "config", (handlers) => handlers.handle("providers", providers)) + const providers = Effect.fn("ConfigHttpApi.providers")(function* () { + const all = mapValues(yield* svc.list(), (item) => item) + return Schema.decodeUnknownSync(Providers)( + JSON.parse( + JSON.stringify({ + providers: Object.values(all), + default: mapValues(all, (item) => Provider.sort(Object.values(item.models))[0].id), + }), + ), + ) + }) + + return handlers.handle("providers", providers) + }), +).pipe(Layer.provide(Provider.defaultLayer)) const web = lazy(() => HttpRouter.toWebHandler(