diff --git a/packages/opencode/src/project/instance-runtime.ts b/packages/opencode/src/project/instance-runtime.ts
index c8803847a0..4924ec71f5 100644
--- a/packages/opencode/src/project/instance-runtime.ts
+++ b/packages/opencode/src/project/instance-runtime.ts
@@ -1,16 +1,21 @@
-import { AppRuntime } from "@/effect/app-runtime"
+import { Effect, ManagedRuntime } from "effect"
+import { memoMap } from "@opencode-ai/core/effect/memo-map"
import { type InstanceContext } from "./instance-context"
+import { InstanceLayer } from "./instance-layer"
import { InstanceStore, type LoadInput } from "./instance-store"
// Bridge for Promise/ALS callers that cannot yet yield InstanceStore.Service.
// Delete this module once those callers are migrated to Effect boundaries that
// provide InstanceStore directly.
-export const load = (input: LoadInput) => AppRuntime.runPromise(InstanceStore.Service.use((store) => store.load(input)))
-export const disposeInstance = (ctx: InstanceContext) =>
- AppRuntime.runPromise(InstanceStore.Service.use((store) => store.dispose(ctx)))
-export const disposeAllInstances = () => AppRuntime.runPromise(InstanceStore.Service.use((store) => store.disposeAll()))
-export const reloadInstance = (input: LoadInput) =>
- AppRuntime.runPromise(InstanceStore.Service.use((store) => store.reload(input)))
+const runtime = ManagedRuntime.make(InstanceLayer.layer, { memoMap })
+
+const run = (fn: (store: InstanceStore.Interface) => Effect.Effect) =>
+ runtime.runPromise(InstanceStore.Service.use(fn))
+
+export const load = (input: LoadInput) => run((store) => store.load(input))
+export const disposeInstance = (ctx: InstanceContext) => run((store) => store.dispose(ctx))
+export const disposeAllInstances = () => run((store) => store.disposeAll())
+export const reloadInstance = (input: LoadInput) => run((store) => store.reload(input))
export * as InstanceRuntime from "./instance-runtime"