diff options
| author | Kit Langton <[email protected]> | 2026-05-01 22:42:03 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-05-01 22:42:03 -0400 |
| commit | 160928a9a9ca41e09e907a6001a7041f5dee681b (patch) | |
| tree | 6f314a3e7393423745424d4af66cc352fa2e8d2d | |
| parent | d297c29f2276f8e0d4389c8af38b5aad504d3ee1 (diff) | |
| download | opencode-160928a9a9ca41e09e907a6001a7041f5dee681b.tar.gz opencode-160928a9a9ca41e09e907a6001a7041f5dee681b.zip | |
Extract InstanceStore.provide helper (#25372)
| -rw-r--r-- | packages/opencode/src/project/instance-store.ts | 6 | ||||
| -rw-r--r-- | packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts | 17 |
2 files changed, 10 insertions, 13 deletions
diff --git a/packages/opencode/src/project/instance-store.ts b/packages/opencode/src/project/instance-store.ts index 327835ea0..7abb0bb7e 100644 --- a/packages/opencode/src/project/instance-store.ts +++ b/packages/opencode/src/project/instance-store.ts @@ -1,5 +1,6 @@ import { GlobalBus } from "@/bus/global" import { WorkspaceContext } from "@/control-plane/workspace-context" +import { InstanceRef } from "@/effect/instance-ref" import { disposeInstance } from "@/effect/instance-registry" import { makeRuntime } from "@/effect/run-service" import { AppFileSystem } from "@opencode-ai/core/filesystem" @@ -19,6 +20,7 @@ export interface Interface { readonly reload: (input: LoadInput) => Effect.Effect<InstanceContext> readonly dispose: (ctx: InstanceContext) => Effect.Effect<void> readonly disposeAll: () => Effect.Effect<void> + readonly provide: <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> } export class Service extends Context.Service<Service, Interface>()("@opencode/InstanceStore") {} @@ -168,6 +170,9 @@ export const layer: Layer.Layer<Service, never, Project.Service> = Layer.effect( return yield* cachedDisposeAll }) + const provide = <A, E, R>(input: LoadInput, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => + load(input).pipe(Effect.flatMap((ctx) => effect.pipe(Effect.provideService(InstanceRef, ctx)))) + yield* Effect.addFinalizer(() => disposeAll().pipe(Effect.ignore)) return Service.of({ @@ -175,6 +180,7 @@ export const layer: Layer.Layer<Service, never, Project.Service> = Layer.effect( reload, dispose, disposeAll, + provide, }) }), ) diff --git a/packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts b/packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts index 4bb15cd3c..bf0093bd2 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts @@ -1,7 +1,6 @@ -import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref" +import { WorkspaceRef } from "@/effect/instance-ref" import { AppRuntime } from "@/effect/app-runtime" import { InstanceBootstrap } from "@/project/bootstrap" -import type { InstanceContext } from "@/project/instance" import { InstanceStore } from "@/project/instance-store" import { Effect, Layer } from "effect" import { HttpRouter, HttpServerResponse } from "effect/unstable/http" @@ -23,23 +22,15 @@ function decode(input: string): string { } } -function makeInstanceContext(store: InstanceStore.Interface, directory: string): Effect.Effect<InstanceContext> { - return store.load({ - directory: decode(directory), - init: () => AppRuntime.runPromise(InstanceBootstrap), - }) -} - function provideInstanceContext<E>( effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E>, store: InstanceStore.Interface, ): Effect.Effect<HttpServerResponse.HttpServerResponse, E, WorkspaceRouteContext> { return Effect.gen(function* () { const route = yield* WorkspaceRouteContext - const ctx = yield* makeInstanceContext(store, route.directory) - return yield* effect.pipe( - Effect.provideService(InstanceRef, ctx), - Effect.provideService(WorkspaceRef, route.workspaceID), + return yield* store.provide( + { directory: decode(route.directory), init: () => AppRuntime.runPromise(InstanceBootstrap) }, + effect.pipe(Effect.provideService(WorkspaceRef, route.workspaceID)), ) }) } |
