summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-05-02 10:56:15 -0400
committerGitHub <[email protected]>2026-05-02 10:56:15 -0400
commit4c4860fb24603ce2e1044bc9d2c98953ce2d78af (patch)
tree09bca00c5746e09ad7a12dcc0bbe5cf855d85a23 /packages
parent5242a1c6b462cf8dea1f9f9a4ddf7190341c558a (diff)
downloadopencode-4c4860fb24603ce2e1044bc9d2c98953ce2d78af.tar.gz
opencode-4c4860fb24603ce2e1044bc9d2c98953ce2d78af.zip
Replace Instance.disposeAll/load with fixture helper (#25418)
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/cli/bootstrap.ts4
-rw-r--r--packages/opencode/src/cli/cmd/tui/worker.ts3
-rw-r--r--packages/opencode/src/config/config.ts12
-rw-r--r--packages/opencode/src/effect/app-runtime.ts2
-rw-r--r--packages/opencode/src/project/instance.ts11
-rw-r--r--packages/opencode/src/server/routes/global.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/index.ts3
-rw-r--r--packages/opencode/src/server/routes/instance/project.ts6
-rw-r--r--packages/opencode/test/agent/agent.test.ts4
-rw-r--r--packages/opencode/test/bus/bus-effect.test.ts4
-rw-r--r--packages/opencode/test/bus/bus-integration.test.ts6
-rw-r--r--packages/opencode/test/bus/bus.test.ts8
-rw-r--r--packages/opencode/test/config/config.test.ts4
-rw-r--r--packages/opencode/test/control-plane/workspace.test.ts4
-rw-r--r--packages/opencode/test/effect/instance-state.test.ts6
-rw-r--r--packages/opencode/test/file/index.test.ts6
-rw-r--r--packages/opencode/test/file/watcher.test.ts4
-rw-r--r--packages/opencode/test/fixture/db.ts4
-rw-r--r--packages/opencode/test/fixture/fixture.ts8
-rw-r--r--packages/opencode/test/permission-task.test.ts4
-rw-r--r--packages/opencode/test/permission/next.test.ts4
-rw-r--r--packages/opencode/test/plugin/loader-shared.test.ts4
-rw-r--r--packages/opencode/test/plugin/workspace-adapter.test.ts4
-rw-r--r--packages/opencode/test/project/instance.test.ts4
-rw-r--r--packages/opencode/test/project/vcs.test.ts6
-rw-r--r--packages/opencode/test/project/worktree.test.ts4
-rw-r--r--packages/opencode/test/provider/provider.test.ts4
-rw-r--r--packages/opencode/test/question/question.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-bridge.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-config.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-event.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-experimental.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-file.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-instance-context.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-instance.legacy.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-instance.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-json-parity.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-mcp.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-provider.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-pty.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-raw-route-auth.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-sdk.test.ts6
-rw-r--r--packages/opencode/test/server/httpapi-session.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-sync.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-tui.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-workspace.test.ts4
-rw-r--r--packages/opencode/test/server/project-init-git.test.ts6
-rw-r--r--packages/opencode/test/server/session-actions.test.ts4
-rw-r--r--packages/opencode/test/server/session-list.test.ts4
-rw-r--r--packages/opencode/test/server/session-messages.test.ts4
-rw-r--r--packages/opencode/test/server/session-select.test.ts4
-rw-r--r--packages/opencode/test/snapshot/snapshot.test.ts4
-rw-r--r--packages/opencode/test/tool/edit.test.ts4
-rw-r--r--packages/opencode/test/tool/lsp.test.ts4
-rw-r--r--packages/opencode/test/tool/read.test.ts4
-rw-r--r--packages/opencode/test/tool/registry.test.ts4
-rw-r--r--packages/opencode/test/tool/skill.test.ts4
-rw-r--r--packages/opencode/test/tool/task.test.ts4
-rw-r--r--packages/opencode/test/tool/write.test.ts4
59 files changed, 139 insertions, 130 deletions
diff --git a/packages/opencode/src/cli/bootstrap.ts b/packages/opencode/src/cli/bootstrap.ts
index 3190fda62..aa6aef6a2 100644
--- a/packages/opencode/src/cli/bootstrap.ts
+++ b/packages/opencode/src/cli/bootstrap.ts
@@ -1,5 +1,5 @@
-import { AppRuntime } from "@/effect/app-runtime"
import { Instance } from "../project/instance"
+import { InstanceStore } from "../project/instance-store"
export async function bootstrap<T>(directory: string, cb: () => Promise<T>) {
return Instance.provide({
@@ -9,7 +9,7 @@ export async function bootstrap<T>(directory: string, cb: () => Promise<T>) {
const result = await cb()
return result
} finally {
- await Instance.dispose()
+ await InstanceStore.runtime.runPromise((s) => s.dispose(Instance.current))
}
},
})
diff --git a/packages/opencode/src/cli/cmd/tui/worker.ts b/packages/opencode/src/cli/cmd/tui/worker.ts
index 8b62c5038..41ca99a71 100644
--- a/packages/opencode/src/cli/cmd/tui/worker.ts
+++ b/packages/opencode/src/cli/cmd/tui/worker.ts
@@ -2,6 +2,7 @@ import { Installation } from "@/installation"
import { Server } from "@/server/server"
import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "@/project/instance"
+import { InstanceStore } from "@/project/instance-store"
import { Rpc } from "@/util/rpc"
import { upgrade } from "@/cli/upgrade"
import { Config } from "@/config/config"
@@ -87,7 +88,7 @@ export const rpc = {
async shutdown() {
Log.Default.info("worker shutting down")
- await Instance.disposeAll()
+ await InstanceStore.runtime.runPromise((s) => s.disposeAll())
if (server) await server.stop(true)
},
}
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 9e9a6e381..4dcab3e8d 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -11,7 +11,9 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { Auth } from "../auth"
import { Env } from "../env"
import { applyEdits, modify } from "jsonc-parser"
-import { Instance, type InstanceContext } from "../project/instance"
+import { type InstanceContext } from "../project/instance"
+import { InstanceStore } from "../project/instance-store"
+import { InstanceRef } from "@/effect/instance-ref"
import { InstallationLocal, InstallationVersion } from "@opencode-ai/core/installation/version"
import { existsSync } from "fs"
import { GlobalBus } from "@/bus/global"
@@ -736,12 +738,16 @@ export const layer = Layer.effect(
yield* fs
.writeFileString(file, JSON.stringify(mergeDeep(writable(existing), writable(config)), null, 2))
.pipe(Effect.orDie)
- if (options?.dispose !== false) yield* Effect.promise(() => Instance.dispose())
+ if (options?.dispose !== false) {
+ const ctx = yield* InstanceRef
+ if (ctx) yield* Effect.promise(() => InstanceStore.runtime.runPromise((s) => s.dispose(ctx)))
+ }
})
const invalidate = Effect.fn("Config.invalidate")(function* (wait?: boolean) {
yield* invalidateGlobal
- const task = Instance.disposeAll()
+ const task = InstanceStore.runtime
+ .runPromise((s) => s.disposeAll())
.catch(() => undefined)
.finally(() =>
GlobalBus.emit("event", {
diff --git a/packages/opencode/src/effect/app-runtime.ts b/packages/opencode/src/effect/app-runtime.ts
index 06969ff9d..f3376ad85 100644
--- a/packages/opencode/src/effect/app-runtime.ts
+++ b/packages/opencode/src/effect/app-runtime.ts
@@ -39,6 +39,7 @@ import { Command } from "@/command"
import { Truncate } from "@/tool/truncate"
import { ToolRegistry } from "@/tool/registry"
import { Format } from "@/format"
+import { InstanceStore } from "@/project/instance-store"
import { Project } from "@/project/project"
import { Vcs } from "@/project/vcs"
import { Workspace } from "@/control-plane/workspace"
@@ -90,6 +91,7 @@ export const AppLayer = Layer.mergeAll(
Truncate.defaultLayer,
ToolRegistry.defaultLayer,
Format.defaultLayer,
+ InstanceStore.defaultLayer,
Project.defaultLayer,
Vcs.defaultLayer,
Workspace.defaultLayer,
diff --git a/packages/opencode/src/project/instance.ts b/packages/opencode/src/project/instance.ts
index afc07ad26..44ba39763 100644
--- a/packages/opencode/src/project/instance.ts
+++ b/packages/opencode/src/project/instance.ts
@@ -6,13 +6,11 @@ export type { InstanceContext } from "./instance-context"
export type { LoadInput } from "./instance-store"
export const Instance = {
- load(input: InstanceStore.LoadInput): Promise<InstanceContext> {
- return InstanceStore.runtime.runPromise((store) => store.load(input))
- },
async provide<R>(input: { directory: string; init?: Effect.Effect<void>; fn: () => R }): Promise<R> {
- return context.provide(await Instance.load({ directory: input.directory, init: input.init }), async () =>
- input.fn(),
+ const ctx = await InstanceStore.runtime.runPromise((store) =>
+ store.load({ directory: input.directory, init: input.init }),
)
+ return context.provide(ctx, async () => input.fn())
},
get current() {
return context.use()
@@ -50,7 +48,4 @@ export const Instance = {
async dispose() {
return InstanceStore.runtime.runPromise((store) => store.dispose(Instance.current))
},
- async disposeAll() {
- return InstanceStore.runtime.runPromise((store) => store.disposeAll())
- },
}
diff --git a/packages/opencode/src/server/routes/global.ts b/packages/opencode/src/server/routes/global.ts
index e78df61c2..97fee3bfc 100644
--- a/packages/opencode/src/server/routes/global.ts
+++ b/packages/opencode/src/server/routes/global.ts
@@ -8,7 +8,7 @@ import { SyncEvent } from "@/sync"
import { GlobalBus } from "@/bus/global"
import { AppRuntime } from "@/effect/app-runtime"
import { AsyncQueue } from "@/util/queue"
-import { Instance } from "../../project/instance"
+import { InstanceStore } from "../../project/instance-store"
import { Installation } from "@/installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import * as Log from "@opencode-ai/core/util/log"
@@ -200,7 +200,7 @@ export const GlobalRoutes = lazy(() =>
},
}),
async (c) => {
- await Instance.disposeAll()
+ await InstanceStore.runtime.runPromise((s) => s.disposeAll())
GlobalBus.emit("event", {
directory: "global",
payload: {
diff --git a/packages/opencode/src/server/routes/instance/index.ts b/packages/opencode/src/server/routes/instance/index.ts
index fa11e3e90..6ee9b4fad 100644
--- a/packages/opencode/src/server/routes/instance/index.ts
+++ b/packages/opencode/src/server/routes/instance/index.ts
@@ -6,6 +6,7 @@ import z from "zod"
import { Format } from "@/format"
import { TuiRoutes } from "./tui"
import { Instance } from "@/project/instance"
+import { InstanceStore } from "@/project/instance-store"
import { Vcs } from "@/project/vcs"
import { Agent } from "@/agent/agent"
import { Skill } from "@/skill"
@@ -62,7 +63,7 @@ export const InstanceRoutes = (upgrade: UpgradeWebSocket): Hono => {
},
}),
async (c) => {
- await Instance.dispose()
+ await InstanceStore.runtime.runPromise((s) => s.dispose(Instance.current))
return c.json(true)
},
)
diff --git a/packages/opencode/src/server/routes/instance/project.ts b/packages/opencode/src/server/routes/instance/project.ts
index 14c8c87b0..7db2bbdda 100644
--- a/packages/opencode/src/server/routes/instance/project.ts
+++ b/packages/opencode/src/server/routes/instance/project.ts
@@ -81,11 +81,7 @@ export const ProjectRoutes = lazy(() =>
Project.Service.use((svc) => svc.initGit({ directory: dir, project: prev })),
)
if (next.id === prev.id && next.vcs === prev.vcs && next.worktree === prev.worktree) return c.json(next)
- await Instance.reload({
- directory: dir,
- worktree: dir,
- project: next,
- })
+ await Instance.reload({ directory: dir, worktree: dir, project: next })
return c.json(next)
},
)
diff --git a/packages/opencode/test/agent/agent.test.ts b/packages/opencode/test/agent/agent.test.ts
index 06bb103f0..44ed0692a 100644
--- a/packages/opencode/test/agent/agent.test.ts
+++ b/packages/opencode/test/agent/agent.test.ts
@@ -1,7 +1,7 @@
import { afterEach, test, expect } from "bun:test"
import { Effect } from "effect"
import path from "path"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
import { Agent } from "../../src/agent/agent"
import { Permission } from "../../src/permission"
@@ -18,7 +18,7 @@ function load<A>(dir: string, fn: (svc: Agent.Interface) => Effect.Effect<A>) {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
test("returns default native agents when no config", async () => {
diff --git a/packages/opencode/test/bus/bus-effect.test.ts b/packages/opencode/test/bus/bus-effect.test.ts
index 0daf8fe6a..101d3be72 100644
--- a/packages/opencode/test/bus/bus-effect.test.ts
+++ b/packages/opencode/test/bus/bus-effect.test.ts
@@ -4,7 +4,7 @@ import { Bus } from "../../src/bus"
import { BusEvent } from "../../src/bus/bus-event"
import { Instance } from "../../src/project/instance"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const TestEvent = {
@@ -151,7 +151,7 @@ describe("Bus (Effect-native)", () => {
}).pipe(provideInstance(dir))
// Dispose from OUTSIDE the instance scope
- yield* Effect.promise(() => Instance.disposeAll())
+ yield* Effect.promise(disposeAllInstances)
yield* Deferred.await(disposed).pipe(Effect.timeout("2 seconds"))
expect(types).toContain("test.effect.ping")
diff --git a/packages/opencode/test/bus/bus-integration.test.ts b/packages/opencode/test/bus/bus-integration.test.ts
index 280834457..7e2138ea8 100644
--- a/packages/opencode/test/bus/bus-integration.test.ts
+++ b/packages/opencode/test/bus/bus-integration.test.ts
@@ -3,7 +3,7 @@ import { Schema } from "effect"
import { Bus } from "../../src/bus"
import { BusEvent } from "../../src/bus/bus-event"
import { Instance } from "../../src/project/instance"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
const TestEvent = BusEvent.define("test.integration", Schema.Struct({ value: Schema.Number }))
@@ -12,7 +12,7 @@ function withInstance(directory: string, fn: () => Promise<void>) {
}
describe("Bus integration: acquireRelease subscriber pattern", () => {
- afterEach(() => Instance.disposeAll())
+ afterEach(() => disposeAllInstances())
test("subscriber via callback facade receives events and cleans up on unsub", async () => {
await using tmp = await tmpdir()
@@ -78,7 +78,7 @@ describe("Bus integration: acquireRelease subscriber pattern", () => {
await Bun.sleep(10)
})
- await Instance.disposeAll()
+ await disposeAllInstances()
await Bun.sleep(50)
expect(received).toEqual([1])
diff --git a/packages/opencode/test/bus/bus.test.ts b/packages/opencode/test/bus/bus.test.ts
index cdacdd517..b24b79b33 100644
--- a/packages/opencode/test/bus/bus.test.ts
+++ b/packages/opencode/test/bus/bus.test.ts
@@ -3,7 +3,7 @@ import { Schema } from "effect"
import { Bus } from "../../src/bus"
import { BusEvent } from "../../src/bus/bus-event"
import { Instance } from "../../src/project/instance"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
const TestEvent = {
Ping: BusEvent.define("test.ping", Schema.Struct({ value: Schema.Number })),
@@ -15,7 +15,7 @@ function withInstance(directory: string, fn: () => Promise<void>) {
}
describe("Bus", () => {
- afterEach(() => Instance.disposeAll())
+ afterEach(() => disposeAllInstances())
describe("publish + subscribe", () => {
test("subscriber is live immediately after subscribe returns", async () => {
@@ -208,8 +208,8 @@ describe("Bus", () => {
await Bun.sleep(10)
})
- // Instance.disposeAll triggers the finalizer which publishes InstanceDisposed
- await Instance.disposeAll()
+ // disposeAllInstances triggers the finalizer which publishes InstanceDisposed
+ await disposeAllInstances()
await Bun.sleep(50)
expect(received).toContain("test.ping")
diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts
index c3ae249e5..5b2e91e37 100644
--- a/packages/opencode/test/config/config.test.ts
+++ b/packages/opencode/test/config/config.test.ts
@@ -12,7 +12,7 @@ import { Account } from "../../src/account/account"
import { AccessToken, AccountID, OrgID } from "../../src/account/schema"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Env } from "../../src/env"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { tmpdir } from "../fixture/fixture"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { testEffect } from "../lib/effect"
@@ -108,7 +108,7 @@ async function check(map: (dir: string) => string) {
},
})
} finally {
- await Instance.disposeAll()
+ await disposeAllInstances()
;(Global.Path as { config: string }).config = prev
await clear()
}
diff --git a/packages/opencode/test/control-plane/workspace.test.ts b/packages/opencode/test/control-plane/workspace.test.ts
index 8545aef7f..ddd10f2e0 100644
--- a/packages/opencode/test/control-plane/workspace.test.ts
+++ b/packages/opencode/test/control-plane/workspace.test.ts
@@ -21,7 +21,7 @@ import { ModelID, ProviderID } from "@/provider/schema"
import { SyncEvent } from "@/sync"
import { EventSequenceTable, EventTable } from "@/sync/event.sql"
import { resetDatabase } from "../fixture/db"
-import { provideTmpdirInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance, tmpdir } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
import { registerAdapter } from "../../src/control-plane/adapters"
import { WorkspaceID } from "../../src/control-plane/schema"
@@ -93,7 +93,7 @@ beforeEach(() => {
afterEach(async () => {
mock.restore()
- await Instance.disposeAll()
+ await disposeAllInstances()
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspacesFlag
restoreEnv()
await resetDatabase()
diff --git a/packages/opencode/test/effect/instance-state.test.ts b/packages/opencode/test/effect/instance-state.test.ts
index 54b2b42c8..02945ac53 100644
--- a/packages/opencode/test/effect/instance-state.test.ts
+++ b/packages/opencode/test/effect/instance-state.test.ts
@@ -4,7 +4,7 @@ import { $ } from "bun"
import { Context, Deferred, Duration, Effect, Exit, Fiber, Layer } from "effect"
import { InstanceState } from "@/effect/instance-state"
import { Instance } from "../../src/project/instance"
-import { provideInstance, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const it = testEffect(CrossSpawnSpawner.defaultLayer)
@@ -19,7 +19,7 @@ const tmpdirGitScoped = Effect.gen(function* () {
})
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
it.live("InstanceState caches values per directory", () =>
@@ -94,7 +94,7 @@ it.live("InstanceState invalidates on disposeAll", () =>
yield* access(state, one)
yield* access(state, two)
- yield* Effect.promise(() => Instance.disposeAll())
+ yield* Effect.promise(disposeAllInstances)
expect(seen.sort()).toEqual([one, two].sort())
}),
diff --git a/packages/opencode/test/file/index.test.ts b/packages/opencode/test/file/index.test.ts
index 091626be8..bf5e7a175 100644
--- a/packages/opencode/test/file/index.test.ts
+++ b/packages/opencode/test/file/index.test.ts
@@ -6,10 +6,10 @@ import fs from "fs/promises"
import { File } from "../../src/file"
import { Instance } from "../../src/project/instance"
import { Filesystem } from "@/util/filesystem"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const init = () => run(File.Service.use((svc) => svc.init()))
@@ -936,7 +936,7 @@ describe("file/index Filesystem patterns", () => {
},
})
- await Instance.disposeAll()
+ await disposeAllInstances()
await fs.writeFile(path.join(tmp.path, "after.ts"), "after", "utf-8")
await fs.rm(path.join(tmp.path, "before.ts"))
diff --git a/packages/opencode/test/file/watcher.test.ts b/packages/opencode/test/file/watcher.test.ts
index 2c2663b0e..e183f673f 100644
--- a/packages/opencode/test/file/watcher.test.ts
+++ b/packages/opencode/test/file/watcher.test.ts
@@ -3,7 +3,7 @@ import { afterEach, describe, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
import { ConfigProvider, Deferred, Effect, Layer, ManagedRuntime, Option } from "effect"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { Bus } from "../../src/bus"
import { Config } from "@/config/config"
import { FileWatcher } from "../../src/file/watcher"
@@ -147,7 +147,7 @@ function ready(directory: string) {
describeWatcher("FileWatcher", () => {
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
test("publishes root create, update, and delete events", async () => {
diff --git a/packages/opencode/test/fixture/db.ts b/packages/opencode/test/fixture/db.ts
index 4e83d0b90..07b42d994 100644
--- a/packages/opencode/test/fixture/db.ts
+++ b/packages/opencode/test/fixture/db.ts
@@ -1,9 +1,9 @@
import { rm } from "fs/promises"
-import { Instance } from "../../src/project/instance"
import { Database } from "@/storage/db"
+import { disposeAllInstances } from "./fixture"
export async function resetDatabase() {
- await Instance.disposeAll().catch(() => undefined)
+ await disposeAllInstances().catch(() => undefined)
Database.close()
await rm(Database.Path, { force: true }).catch(() => undefined)
await rm(`${Database.Path}-wal`, { force: true }).catch(() => undefined)
diff --git a/packages/opencode/test/fixture/fixture.ts b/packages/opencode/test/fixture/fixture.ts
index 91605e15a..a861285a1 100644
--- a/packages/opencode/test/fixture/fixture.ts
+++ b/packages/opencode/test/fixture/fixture.ts
@@ -9,8 +9,16 @@ import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
import type { Config } from "@/config/config"
import { InstanceRef } from "../../src/effect/instance-ref"
import { Instance } from "../../src/project/instance"
+import { InstanceStore } from "../../src/project/instance-store"
import { TestLLMServer } from "../lib/llm-server"
+// Test helper for tearing down all loaded instances. Used in afterEach hooks.
+// Replaces direct Instance.disposeAll() calls so the legacy promise method can be removed.
+// IMPORTANT: must use InstanceStore.runtime, not AppRuntime or a test-layer Service —
+// Instance.provide loads instances into InstanceStore.runtime's Service cache, and that
+// Service is built per-runtime (not shared via memoMap across Effect.runPromise boundaries).
+export const disposeAllInstances = () => InstanceStore.runtime.runPromise((s) => s.disposeAll())
+
// Strip null bytes from paths (defensive fix for CI environment issues)
function sanitizePath(p: string): string {
return p.replace(/\0/g, "")
diff --git a/packages/opencode/test/permission-task.test.ts b/packages/opencode/test/permission-task.test.ts
index 5ce7eee93..d4f9192c7 100644
--- a/packages/opencode/test/permission-task.test.ts
+++ b/packages/opencode/test/permission-task.test.ts
@@ -2,13 +2,13 @@ import { afterEach, describe, test, expect } from "bun:test"
import { Permission } from "../src/permission"
import { Config } from "@/config/config"
import { Instance } from "../src/project/instance"
-import { tmpdir } from "./fixture/fixture"
+import { disposeAllInstances, tmpdir } from "./fixture/fixture"
import { AppRuntime } from "../src/effect/app-runtime"
const load = () => AppRuntime.runPromise(Config.Service.use((svc) => svc.get()))
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("Permission.evaluate for permission.task", () => {
diff --git a/packages/opencode/test/permission/next.test.ts b/packages/opencode/test/permission/next.test.ts
index 0064185f4..850ad2ded 100644
--- a/packages/opencode/test/permission/next.test.ts
+++ b/packages/opencode/test/permission/next.test.ts
@@ -6,7 +6,7 @@ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Permission } from "../../src/permission"
import { PermissionID } from "../../src/permission/schema"
import { Instance } from "../../src/project/instance"
-import { provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
import { MessageID, SessionID } from "../../src/session/schema"
@@ -15,7 +15,7 @@ const env = Layer.mergeAll(Permission.layer.pipe(Layer.provide(bus)), bus, Cross
const it = testEffect(env)
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const rejectAll = (message?: string) =>
diff --git a/packages/opencode/test/plugin/loader-shared.test.ts b/packages/opencode/test/plugin/loader-shared.test.ts
index 211a93a60..e24cd0507 100644
--- a/packages/opencode/test/plugin/loader-shared.test.ts
+++ b/packages/opencode/test/plugin/loader-shared.test.ts
@@ -3,7 +3,7 @@ import { Effect } from "effect"
import fs from "fs/promises"
import path from "path"
import { pathToFileURL } from "url"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { Filesystem } from "@/util/filesystem"
const disableDefault = process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS
@@ -24,7 +24,7 @@ afterAll(() => {
})
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
async function load(dir: string) {
diff --git a/packages/opencode/test/plugin/workspace-adapter.test.ts b/packages/opencode/test/plugin/workspace-adapter.test.ts
index 9abf993d8..249087808 100644
--- a/packages/opencode/test/plugin/workspace-adapter.test.ts
+++ b/packages/opencode/test/plugin/workspace-adapter.test.ts
@@ -3,7 +3,7 @@ import { Effect, Layer } from "effect"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import path from "path"
import { pathToFileURL } from "url"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const disableDefault = process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS
@@ -20,7 +20,7 @@ const experimental = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
afterAll(() => {
diff --git a/packages/opencode/test/project/instance.test.ts b/packages/opencode/test/project/instance.test.ts
index b223bf91d..852c58ef4 100644
--- a/packages/opencode/test/project/instance.test.ts
+++ b/packages/opencode/test/project/instance.test.ts
@@ -5,13 +5,13 @@ import { InstanceRef } from "../../src/effect/instance-ref"
import { registerDisposer } from "../../src/effect/instance-registry"
import { Instance } from "../../src/project/instance"
import { InstanceStore } from "../../src/project/instance-store"
-import { tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const it = testEffect(Layer.mergeAll(InstanceStore.defaultLayer, CrossSpawnSpawner.defaultLayer))
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("InstanceStore", () => {
diff --git a/packages/opencode/test/project/vcs.test.ts b/packages/opencode/test/project/vcs.test.ts
index a2a5cff60..0d0e46fe4 100644
--- a/packages/opencode/test/project/vcs.test.ts
+++ b/packages/opencode/test/project/vcs.test.ts
@@ -3,7 +3,7 @@ import { afterEach, describe, expect, test } from "bun:test"
import { Effect } from "effect"
import fs from "fs/promises"
import path from "path"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { AppRuntime } from "../../src/effect/app-runtime"
import { FileWatcher } from "../../src/file/watcher"
import { Instance } from "../../src/project/instance"
@@ -85,7 +85,7 @@ function nextBranchUpdate(directory: string, timeout = 10_000) {
describeVcs("Vcs", () => {
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
test("branch() returns current branch name", async () => {
@@ -158,7 +158,7 @@ describeVcs("Vcs", () => {
describe("Vcs diff", () => {
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
test("defaultBranch() falls back to main", async () => {
diff --git a/packages/opencode/test/project/worktree.test.ts b/packages/opencode/test/project/worktree.test.ts
index 44a25a8e6..fac82fad3 100644
--- a/packages/opencode/test/project/worktree.test.ts
+++ b/packages/opencode/test/project/worktree.test.ts
@@ -6,7 +6,7 @@ import { Cause, Effect, Exit, Layer } from "effect"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Instance } from "../../src/project/instance"
import { Worktree } from "../../src/worktree"
-import { provideInstance, provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const it = testEffect(Layer.mergeAll(Worktree.defaultLayer, CrossSpawnSpawner.defaultLayer))
@@ -37,7 +37,7 @@ async function waitReady() {
}
describe("Worktree", () => {
- afterEach(() => Instance.disposeAll())
+ afterEach(() => disposeAllInstances())
describe("makeWorktreeInfo", () => {
it.live("returns info with name, branch, and directory", () =>
diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts
index edbf4d664..924f42888 100644
--- a/packages/opencode/test/provider/provider.test.ts
+++ b/packages/opencode/test/provider/provider.test.ts
@@ -2,7 +2,7 @@ import { test, expect } from "bun:test"
import { mkdir, unlink } from "fs/promises"
import path from "path"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { Global } from "@opencode-ai/core/global"
import { Instance } from "../../src/project/instance"
import { Plugin } from "../../src/plugin/index"
@@ -2557,7 +2557,7 @@ test("plugin config providers persist after instance dispose", async () => {
expect(first[ProviderID.make("demo")]).toBeDefined()
expect(first[ProviderID.make("demo")].models[ModelID.make("chat")]).toBeDefined()
- await Instance.disposeAll()
+ await disposeAllInstances()
const second = await Instance.provide({
directory: tmp.path,
diff --git a/packages/opencode/test/question/question.test.ts b/packages/opencode/test/question/question.test.ts
index d44f41f1a..14cf1aefa 100644
--- a/packages/opencode/test/question/question.test.ts
+++ b/packages/opencode/test/question/question.test.ts
@@ -2,7 +2,7 @@ import { afterEach, test, expect } from "bun:test"
import { Question } from "../../src/question"
import { Instance } from "../../src/project/instance"
import { QuestionID } from "../../src/question/schema"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { SessionID } from "../../src/session/schema"
import { AppRuntime } from "../../src/effect/app-runtime"
@@ -17,7 +17,7 @@ const reply = (input: { requestID: QuestionID; answers: ReadonlyArray<Question.A
const reject = (id: QuestionID) => AppRuntime.runPromise(Question.Service.use((svc) => svc.reject(id)))
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
/** Reject all pending questions so dangling Deferred fibers don't hang the test. */
diff --git a/packages/opencode/test/server/httpapi-bridge.test.ts b/packages/opencode/test/server/httpapi-bridge.test.ts
index 2b8a62cc5..352fb2e2f 100644
--- a/packages/opencode/test/server/httpapi-bridge.test.ts
+++ b/packages/opencode/test/server/httpapi-bridge.test.ts
@@ -12,7 +12,7 @@ import { ConfigProvider, Layer } from "effect"
import { HttpRouter } from "effect/unstable/http"
import { OpenApi } from "effect/unstable/httpapi"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -208,7 +208,7 @@ afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original.OPENCODE_EXPERIMENTAL_HTTPAPI
Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD
Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-config.test.ts b/packages/opencode/test/server/httpapi-config.test.ts
index 9469a66fd..7d269b6be 100644
--- a/packages/opencode/test/server/httpapi-config.test.ts
+++ b/packages/opencode/test/server/httpapi-config.test.ts
@@ -6,7 +6,7 @@ import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -37,7 +37,7 @@ async function waitDisposed(directory: string) {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-event.test.ts b/packages/opencode/test/server/httpapi-event.test.ts
index 915d79784..d7e48240a 100644
--- a/packages/opencode/test/server/httpapi-event.test.ts
+++ b/packages/opencode/test/server/httpapi-event.test.ts
@@ -5,7 +5,7 @@ import { Server } from "../../src/server/server"
import { EventPaths } from "../../src/server/routes/instance/httpapi/event"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -29,7 +29,7 @@ async function readFirstChunk(response: Response) {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-experimental.test.ts b/packages/opencode/test/server/httpapi-experimental.test.ts
index a4b0b6619..0185af2df 100644
--- a/packages/opencode/test/server/httpapi-experimental.test.ts
+++ b/packages/opencode/test/server/httpapi-experimental.test.ts
@@ -10,7 +10,7 @@ import { Database } from "@/storage/db"
import * as Log from "@opencode-ai/core/util/log"
import { Worktree } from "../../src/worktree"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -50,7 +50,7 @@ async function waitReady(directory: string) {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-file.test.ts b/packages/opencode/test/server/httpapi-file.test.ts
index b7425007e..81246eb0f 100644
--- a/packages/opencode/test/server/httpapi-file.test.ts
+++ b/packages/opencode/test/server/httpapi-file.test.ts
@@ -6,7 +6,7 @@ import { FilePaths } from "../../src/server/routes/instance/httpapi/groups/file"
import { Instance } from "../../src/project/instance"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -28,7 +28,7 @@ function request(route: string, directory: string, query?: Record<string, string
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-instance-context.test.ts b/packages/opencode/test/server/httpapi-instance-context.test.ts
index 15d3facd3..ece01cf32 100644
--- a/packages/opencode/test/server/httpapi-instance-context.test.ts
+++ b/packages/opencode/test/server/httpapi-instance-context.test.ts
@@ -19,7 +19,7 @@ import { disposeMiddleware, markInstanceForDisposal } from "../../src/server/rou
import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context"
import { workspaceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/workspace-routing"
import { resetDatabase } from "../fixture/db"
-import { tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const testStateLayer = Layer.effectDiscard(
@@ -30,7 +30,7 @@ const testStateLayer = Layer.effectDiscard(
yield* Effect.addFinalizer(() =>
Effect.promise(async () => {
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
}),
)
diff --git a/packages/opencode/test/server/httpapi-instance.legacy.test.ts b/packages/opencode/test/server/httpapi-instance.legacy.test.ts
index 4f9ccc512..22a56ba8a 100644
--- a/packages/opencode/test/server/httpapi-instance.legacy.test.ts
+++ b/packages/opencode/test/server/httpapi-instance.legacy.test.ts
@@ -6,7 +6,7 @@ import { Server } from "../../src/server/server"
import { InstancePaths } from "../../src/server/routes/instance/httpapi/groups/instance"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -37,7 +37,7 @@ async function waitDisposed(directory: string) {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-instance.test.ts b/packages/opencode/test/server/httpapi-instance.test.ts
index 3d9245cd6..61b1af613 100644
--- a/packages/opencode/test/server/httpapi-instance.test.ts
+++ b/packages/opencode/test/server/httpapi-instance.test.ts
@@ -7,13 +7,13 @@ import * as Socket from "effect/unstable/socket/Socket"
import { InstancePaths } from "../../src/server/routes/instance/httpapi/groups/instance"
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
import { resetDatabase } from "../fixture/db"
-import { tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
// Flip the experimental HttpApi flag so backend selection telemetry on the
// production routes reports the right backend, and reset the database around
// the test so per-instance state does not leak between runs. resetDatabase()
-// already calls Instance.disposeAll(), so we don't repeat it.
+// already calls disposeAllInstances(), so we don't repeat it.
const testStateLayer = Layer.effectDiscard(
Effect.gen(function* () {
const originalHttpApi = Flag.OPENCODE_EXPERIMENTAL_HTTPAPI
diff --git a/packages/opencode/test/server/httpapi-json-parity.test.ts b/packages/opencode/test/server/httpapi-json-parity.test.ts
index 0465b1cf6..656541be7 100644
--- a/packages/opencode/test/server/httpapi-json-parity.test.ts
+++ b/packages/opencode/test/server/httpapi-json-parity.test.ts
@@ -15,7 +15,7 @@ import { MessageID, PartID } from "../../src/session/schema"
import { Session } from "@/session/session"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
import { it } from "../lib/effect"
void Log.init({ print: false })
@@ -89,7 +89,7 @@ function expectJsonParity(input: {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-mcp.test.ts b/packages/opencode/test/server/httpapi-mcp.test.ts
index e34886652..d81d749f1 100644
--- a/packages/opencode/test/server/httpapi-mcp.test.ts
+++ b/packages/opencode/test/server/httpapi-mcp.test.ts
@@ -8,7 +8,7 @@ import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
void Log.init({ print: false })
@@ -76,7 +76,7 @@ const readResponse = Effect.fnUntraced(function* (input: { app: TestApp; path: s
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-provider.test.ts b/packages/opencode/test/server/httpapi-provider.test.ts
index 5e8ff01a0..3ff389300 100644
--- a/packages/opencode/test/server/httpapi-provider.test.ts
+++ b/packages/opencode/test/server/httpapi-provider.test.ts
@@ -6,7 +6,7 @@ import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { provideInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
void Log.init({ print: false })
@@ -98,7 +98,7 @@ function withProviderProject<A, E, R>(self: (dir: string) => Effect.Effect<A, E,
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-pty.test.ts b/packages/opencode/test/server/httpapi-pty.test.ts
index e4d22427c..2b6284a31 100644
--- a/packages/opencode/test/server/httpapi-pty.test.ts
+++ b/packages/opencode/test/server/httpapi-pty.test.ts
@@ -7,7 +7,7 @@ import { Server } from "../../src/server/server"
import { PtyPaths } from "../../src/server/routes/instance/httpapi/groups/pty"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir, tmpdirScoped } from "../fixture/fixture"
import { Config, Effect, Layer, Queue, Schema } from "effect"
import { HttpClient, HttpClientRequest, HttpRouter, HttpServer } from "effect/unstable/http"
import * as Socket from "effect/unstable/socket/Socket"
@@ -63,7 +63,7 @@ const directoryHeader = (dir: string) => HttpClientRequest.setHeader("x-opencode
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-raw-route-auth.test.ts b/packages/opencode/test/server/httpapi-raw-route-auth.test.ts
index af373d933..fd82e7863 100644
--- a/packages/opencode/test/server/httpapi-raw-route-auth.test.ts
+++ b/packages/opencode/test/server/httpapi-raw-route-auth.test.ts
@@ -8,7 +8,7 @@ import { PtyPaths } from "../../src/server/routes/instance/httpapi/groups/pty"
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
import { PtyID } from "../../src/pty/schema"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import * as Log from "@opencode-ai/core/util/log"
void Log.init({ print: false })
@@ -49,7 +49,7 @@ async function cancelBody(response: Response) {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = originalHttpApi
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-sdk.test.ts b/packages/opencode/test/server/httpapi-sdk.test.ts
index 596ca4a5c..771fb5701 100644
--- a/packages/opencode/test/server/httpapi-sdk.test.ts
+++ b/packages/opencode/test/server/httpapi-sdk.test.ts
@@ -15,7 +15,7 @@ import { Session as SessionNs } from "@/session/session"
import { TestLLMServer } from "../lib/llm-server"
import path from "path"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { it } from "../lib/effect"
const original = {
@@ -169,7 +169,7 @@ function sessionTitles(value: unknown) {
function resetState() {
return Effect.promise(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
}
@@ -260,7 +260,7 @@ afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original.OPENCODE_EXPERIMENTAL_HTTPAPI
Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD
Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts
index 5f2af06f1..02d590f91 100644
--- a/packages/opencode/test/server/httpapi-session.test.ts
+++ b/packages/opencode/test/server/httpapi-session.test.ts
@@ -20,7 +20,7 @@ import { SessionTable } from "@/session/session.sql"
import * as Log from "@opencode-ai/core/util/log"
import { eq } from "drizzle-orm"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { it } from "../lib/effect"
void Log.init({ print: false })
@@ -138,7 +138,7 @@ function withTmp<A, E, R>(
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-sync.test.ts b/packages/opencode/test/server/httpapi-sync.test.ts
index f51a71457..d022c3797 100644
--- a/packages/opencode/test/server/httpapi-sync.test.ts
+++ b/packages/opencode/test/server/httpapi-sync.test.ts
@@ -7,7 +7,7 @@ import { SyncPaths } from "../../src/server/routes/instance/httpapi/groups/sync"
import { Session } from "@/session/session"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -27,7 +27,7 @@ afterEach(async () => {
mock.restore()
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = originalHttpApi
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-tui.test.ts b/packages/opencode/test/server/httpapi-tui.test.ts
index 3e844fad0..1fd3ce2b3 100644
--- a/packages/opencode/test/server/httpapi-tui.test.ts
+++ b/packages/opencode/test/server/httpapi-tui.test.ts
@@ -11,7 +11,7 @@ import { Server } from "../../src/server/server"
import * as Log from "@opencode-ai/core/util/log"
import { OpenApi } from "effect/unstable/httpapi"
import { resetDatabase } from "../fixture/db"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -45,7 +45,7 @@ async function expectTrue(path: string, headers: Record<string, string>, body?:
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/httpapi-workspace.test.ts b/packages/opencode/test/server/httpapi-workspace.test.ts
index 7fc1ec761..193c2971a 100644
--- a/packages/opencode/test/server/httpapi-workspace.test.ts
+++ b/packages/opencode/test/server/httpapi-workspace.test.ts
@@ -12,7 +12,7 @@ import { Session } from "@/session/session"
import * as Log from "@opencode-ai/core/util/log"
import { Server } from "../../src/server/server"
import { resetDatabase } from "../fixture/db"
-import { provideInstance, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdirScoped } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
import { Project } from "../../src/project/project"
import { InstancePaths } from "../../src/server/routes/instance/httpapi/groups/instance"
@@ -128,7 +128,7 @@ afterEach(async () => {
mock.restore()
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = originalHttpApi
- await Instance.disposeAll()
+ await disposeAllInstances()
await resetDatabase()
})
diff --git a/packages/opencode/test/server/project-init-git.test.ts b/packages/opencode/test/server/project-init-git.test.ts
index 86c52096e..0177cde82 100644
--- a/packages/opencode/test/server/project-init-git.test.ts
+++ b/packages/opencode/test/server/project-init-git.test.ts
@@ -8,7 +8,7 @@ import { Server } from "../../src/server/server"
import { Filesystem } from "@/util/filesystem"
import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -69,7 +69,7 @@ describe("project.initGit endpoint", () => {
),
).toBeTruthy()
} finally {
- await Instance.disposeAll()
+ await disposeAllInstances()
reloadSpy.mockRestore()
GlobalBus.off("event", fn)
}
@@ -114,7 +114,7 @@ describe("project.initGit endpoint", () => {
worktree: tmp.path,
})
} finally {
- await Instance.disposeAll()
+ await disposeAllInstances()
reloadSpy.mockRestore()
GlobalBus.off("event", fn)
}
diff --git a/packages/opencode/test/server/session-actions.test.ts b/packages/opencode/test/server/session-actions.test.ts
index 843986ba8..43f188e74 100644
--- a/packages/opencode/test/server/session-actions.test.ts
+++ b/packages/opencode/test/server/session-actions.test.ts
@@ -5,7 +5,7 @@ import { Server } from "../../src/server/server"
import { Session as SessionNs } from "@/session/session"
import type { SessionID } from "../../src/session/schema"
import * as Log from "@opencode-ai/core/util/log"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -25,7 +25,7 @@ const svc = {
afterEach(async () => {
mock.restore()
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("session action routes", () => {
diff --git a/packages/opencode/test/server/session-list.test.ts b/packages/opencode/test/server/session-list.test.ts
index e2f92c20f..7d479a73b 100644
--- a/packages/opencode/test/server/session-list.test.ts
+++ b/packages/opencode/test/server/session-list.test.ts
@@ -3,7 +3,7 @@ import { Effect } from "effect"
import { Instance } from "../../src/project/instance"
import { Session as SessionNs } from "@/session/session"
import * as Log from "@opencode-ai/core/util/log"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { Flag } from "@opencode-ai/core/flag/flag"
import { mkdir } from "fs/promises"
import path from "path"
@@ -30,7 +30,7 @@ const svc = {
afterEach(async () => {
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("session.list", () => {
diff --git a/packages/opencode/test/server/session-messages.test.ts b/packages/opencode/test/server/session-messages.test.ts
index e64d28bb4..e70847baf 100644
--- a/packages/opencode/test/server/session-messages.test.ts
+++ b/packages/opencode/test/server/session-messages.test.ts
@@ -6,7 +6,7 @@ import { Session as SessionNs } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
import * as Log from "@opencode-ai/core/util/log"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -31,7 +31,7 @@ const svc = {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
async function withoutWatcher<T>(fn: () => Promise<T>) {
diff --git a/packages/opencode/test/server/session-select.test.ts b/packages/opencode/test/server/session-select.test.ts
index 278fba94d..b3230d4b8 100644
--- a/packages/opencode/test/server/session-select.test.ts
+++ b/packages/opencode/test/server/session-select.test.ts
@@ -5,7 +5,7 @@ import type { SessionID } from "../../src/session/schema"
import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
@@ -24,7 +24,7 @@ const svc = {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("tui.selectSession endpoint", () => {
diff --git a/packages/opencode/test/snapshot/snapshot.test.ts b/packages/opencode/test/snapshot/snapshot.test.ts
index b85d570dc..c3216e1c5 100644
--- a/packages/opencode/test/snapshot/snapshot.test.ts
+++ b/packages/opencode/test/snapshot/snapshot.test.ts
@@ -6,7 +6,7 @@ import { Effect } from "effect"
import { Snapshot } from "../../src/snapshot"
import { Instance } from "../../src/project/instance"
import { Filesystem } from "@/util/filesystem"
-import { provideInstance, tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdir } from "../fixture/fixture"
// Git always outputs /-separated paths internally. Snapshot.patch() joins them
// with path.join (which produces \ on Windows) then normalizes back to /.
@@ -14,7 +14,7 @@ import { provideInstance, tmpdir } from "../fixture/fixture"
const fwd = (...parts: string[]) => path.join(...parts).replaceAll("\\", "/")
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
async function bootstrap() {
diff --git a/packages/opencode/test/tool/edit.test.ts b/packages/opencode/test/tool/edit.test.ts
index 01dc74bb2..2c381ad04 100644
--- a/packages/opencode/test/tool/edit.test.ts
+++ b/packages/opencode/test/tool/edit.test.ts
@@ -4,7 +4,7 @@ import fs from "fs/promises"
import { Effect, Layer, ManagedRuntime } from "effect"
import { EditTool } from "../../src/tool/edit"
import { Instance } from "../../src/project/instance"
-import { tmpdir } from "../fixture/fixture"
+import { disposeAllInstances, tmpdir } from "../fixture/fixture"
import { LSP } from "@/lsp/lsp"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Format } from "../../src/format"
@@ -26,7 +26,7 @@ const ctx = {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const runtime = ManagedRuntime.make(
diff --git a/packages/opencode/test/tool/lsp.test.ts b/packages/opencode/test/tool/lsp.test.ts
index 8a3189cab..27623375c 100644
--- a/packages/opencode/test/tool/lsp.test.ts
+++ b/packages/opencode/test/tool/lsp.test.ts
@@ -11,11 +11,11 @@ import { MessageID, SessionID } from "../../src/session/schema"
import { Tool } from "@/tool/tool"
import { Truncate } from "@/tool/truncate"
import { LspTool } from "../../src/tool/lsp"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const ctx = {
diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts
index c20b08437..3fa61401e 100644
--- a/packages/opencode/test/tool/read.test.ts
+++ b/packages/opencode/test/tool/read.test.ts
@@ -13,13 +13,13 @@ import { ReadTool } from "../../src/tool/read"
import { Truncate } from "@/tool/truncate"
import { Tool } from "@/tool/tool"
import { Filesystem } from "@/util/filesystem"
-import { provideInstance, tmpdirScoped } from "../fixture/fixture"
+import { disposeAllInstances, provideInstance, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const FIXTURES_DIR = path.join(import.meta.dir, "fixtures")
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const ctx = {
diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts
index 8e03177f8..0cd3ec4d1 100644
--- a/packages/opencode/test/tool/registry.test.ts
+++ b/packages/opencode/test/tool/registry.test.ts
@@ -5,7 +5,7 @@ import { Effect, Layer } from "effect"
import { Instance } from "../../src/project/instance"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { ToolRegistry } from "@/tool/registry"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const node = CrossSpawnSpawner.defaultLayer
@@ -13,7 +13,7 @@ const node = CrossSpawnSpawner.defaultLayer
const it = testEffect(Layer.mergeAll(ToolRegistry.defaultLayer, node))
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
describe("tool.registry", () => {
diff --git a/packages/opencode/test/tool/skill.test.ts b/packages/opencode/test/tool/skill.test.ts
index 175c1526d..7473d2d56 100644
--- a/packages/opencode/test/tool/skill.test.ts
+++ b/packages/opencode/test/tool/skill.test.ts
@@ -8,7 +8,7 @@ import type { Tool } from "@/tool/tool"
import { Instance } from "../../src/project/instance"
import { SkillTool } from "../../src/tool/skill"
import { ToolRegistry } from "@/tool/registry"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { SessionID, MessageID } from "../../src/session/schema"
import { testEffect } from "../lib/effect"
@@ -23,7 +23,7 @@ const baseCtx: Omit<Tool.Context, "ask"> = {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const node = CrossSpawnSpawner.defaultLayer
diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts
index 147541f3d..a8d62bb68 100644
--- a/packages/opencode/test/tool/task.test.ts
+++ b/packages/opencode/test/tool/task.test.ts
@@ -12,11 +12,11 @@ import { ModelID, ProviderID } from "../../src/provider/schema"
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
import { Truncate } from "@/tool/truncate"
import { ToolRegistry } from "@/tool/registry"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const ref = {
diff --git a/packages/opencode/test/tool/write.test.ts b/packages/opencode/test/tool/write.test.ts
index cc9f87100..4931d2a54 100644
--- a/packages/opencode/test/tool/write.test.ts
+++ b/packages/opencode/test/tool/write.test.ts
@@ -13,7 +13,7 @@ import { Tool } from "@/tool/tool"
import { Agent } from "../../src/agent/agent"
import { SessionID, MessageID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { provideTmpdirInstance } from "../fixture/fixture"
+import { disposeAllInstances, provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
const ctx = {
@@ -28,7 +28,7 @@ const ctx = {
}
afterEach(async () => {
- await Instance.disposeAll()
+ await disposeAllInstances()
})
const it = testEffect(