Skip to content

Commit 6eb33c8

Browse files
committed
refactor: simplify instance store wiring
1 parent 7b58be1 commit 6eb33c8

4 files changed

Lines changed: 14 additions & 24 deletions

File tree

packages/opencode/src/project/instance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ export const Instance = {
1111
return InstanceStore.runtime.runPromise((store) => store.load(input))
1212
},
1313
async provide<R>(input: { directory: string; init?: () => Promise<any>; fn: () => R }): Promise<R> {
14-
return context.provide(await Instance.load(input), async () => input.fn())
14+
return context.provide(
15+
await Instance.load({ directory: input.directory, init: input.init }),
16+
async () => input.fn(),
17+
)
1518
},
1619
get current() {
1720
return context.use()

packages/opencode/src/server/routes/instance/httpapi/handlers/global.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Config } from "@/config/config"
22
import { GlobalBus, type GlobalEvent as GlobalBusEvent } from "@/bus/global"
33
import { Installation } from "@/installation"
4-
import { Instance } from "@/project/instance"
4+
import { InstanceStore } from "@/project/instance-store"
55
import { InstallationVersion } from "@opencode-ai/core/installation/version"
66
import * as Log from "@opencode-ai/core/util/log"
77
import { Effect, Queue, Schema } from "effect"
@@ -68,6 +68,7 @@ export const globalHandlers = HttpApiBuilder.group(RootHttpApi, "global", (handl
6868
Effect.gen(function* () {
6969
const config = yield* Config.Service
7070
const installation = yield* Installation.Service
71+
const store = yield* InstanceStore.Service
7172

7273
const health = Effect.fn("GlobalHttpApi.health")(function* () {
7374
return { healthy: true as const, version: InstallationVersion }
@@ -86,7 +87,7 @@ export const globalHandlers = HttpApiBuilder.group(RootHttpApi, "global", (handl
8687
})
8788

8889
const dispose = Effect.fn("GlobalHttpApi.dispose")(function* () {
89-
yield* Effect.promise(() => Instance.disposeAll())
90+
yield* store.disposeAll()
9091
GlobalBus.emit("event", {
9192
directory: "global",
9293
payload: { type: "global.disposed", properties: {} },
Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
import type { WorkspaceID } from "@/control-plane/schema"
2-
import { WorkspaceContext } from "@/control-plane/workspace-context"
3-
import { WorkspaceRef } from "@/effect/instance-ref"
4-
import { Instance, type InstanceContext } from "@/project/instance"
1+
import { EffectBridge } from "@/effect/bridge"
2+
import type { InstanceContext } from "@/project/instance"
53
import { InstanceStore } from "@/project/instance-store"
64
import { Effect } from "effect"
75
import { HttpEffect, HttpMiddleware, HttpServerRequest } from "effect/unstable/http"
86

97
type MarkedInstance = {
108
ctx: InstanceContext
119
store: InstanceStore.Interface
12-
workspaceID?: WorkspaceID
10+
bridge: EffectBridge.Shape
1311
}
1412

1513
// Disposal is requested by an endpoint handler, but must run from the outer
@@ -19,20 +17,9 @@ const disposeAfterResponse = new WeakMap<object, MarkedInstance>()
1917

2018
const mark = (ctx: InstanceContext) =>
2119
Effect.gen(function* () {
22-
return { ctx, store: yield* InstanceStore.Service, workspaceID: yield* WorkspaceRef }
20+
return { ctx, store: yield* InstanceStore.Service, bridge: yield* EffectBridge.make() }
2321
})
2422

25-
// InstanceStore lifecycle operations still publish events through legacy ALS helpers.
26-
// Effect request handlers carry these values in services, so bridge them back
27-
// into the legacy contexts only around the lifecycle operation.
28-
const restoreMarked = <A>(marked: MarkedInstance, effect: Effect.Effect<A>) =>
29-
Effect.promise(() =>
30-
WorkspaceContext.provide({
31-
workspaceID: marked.workspaceID,
32-
fn: () => Instance.restore(marked.ctx, () => Effect.runPromise(effect)),
33-
}),
34-
)
35-
3623
export const markInstanceForDisposal = (ctx: InstanceContext) =>
3724
Effect.gen(function* () {
3825
const marked = yield* mark(ctx)
@@ -49,7 +36,7 @@ export const markInstanceForReload = (ctx: InstanceContext, next: InstanceStore.
4936
Effect.gen(function* () {
5037
const marked = yield* mark(ctx)
5138
return yield* HttpEffect.appendPreResponseHandler((_request, response) =>
52-
Effect.as(Effect.uninterruptible(restoreMarked(marked, marked.store.reload(next))), response),
39+
Effect.as(Effect.uninterruptible(marked.bridge.run(marked.store.reload(next))), response),
5340
)
5441
})
5542

@@ -60,6 +47,6 @@ export const disposeMiddleware: HttpMiddleware.HttpMiddleware = (effect) =>
6047
const marked = disposeAfterResponse.get(request.source)
6148
if (!marked) return response
6249
disposeAfterResponse.delete(request.source)
63-
yield* Effect.uninterruptible(restoreMarked(marked, marked.store.dispose(marked.ctx)))
50+
yield* Effect.uninterruptible(marked.bridge.run(marked.store.dispose(marked.ctx)))
6451
return response
6552
})

packages/opencode/src/server/routes/instance/httpapi/middleware/instance-context.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { AppRuntime } from "@/effect/app-runtime"
33
import { InstanceBootstrap } from "@/project/bootstrap"
44
import type { InstanceContext } from "@/project/instance"
55
import { InstanceStore } from "@/project/instance-store"
6-
import { Filesystem } from "@/util/filesystem"
76
import { Effect, Layer } from "effect"
87
import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
98
import { HttpApiMiddleware } from "effect/unstable/httpapi"
@@ -29,7 +28,7 @@ function makeInstanceContext(
2928
directory: string,
3029
): Effect.Effect<InstanceContext> {
3130
return store.load({
32-
directory: Filesystem.resolve(decode(directory)),
31+
directory: decode(directory),
3332
init: () => AppRuntime.runPromise(InstanceBootstrap),
3433
})
3534
}

0 commit comments

Comments
 (0)