Skip to content

Commit 3b91557

Browse files
authored
Delete Instance.dispose and Instance.reload (#25427)
1 parent 7371db5 commit 3b91557

11 files changed

Lines changed: 30 additions & 47 deletions

File tree

packages/opencode/src/project/instance.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,4 @@ export const Instance = {
4242
restore<R>(ctx: InstanceContext, fn: () => R): R {
4343
return context.provide(ctx, fn)
4444
},
45-
// followup: `reload` survives because `test/server/project-init-git.test.ts`
46-
// spies on this exact method. Once that test asserts on `InstanceStore.reloadInstance`
47-
// (or moves to an Effect runtime), this wrapper can drop.
48-
async reload(input: InstanceStore.LoadInput) {
49-
return InstanceStore.reloadInstance(input)
50-
},
51-
// followup: `dispose` survives for legacy fixtures that read `Instance.current`
52-
// out of ALS (e.g. `test/fixture/fixture.ts` `provideTmpdirInstance`,
53-
// `test/question/question.test.ts` cancellation tests). Convert those to call
54-
// `InstanceStore.disposeInstance(ctx)` directly once `Instance.provide` is gone.
55-
async dispose() {
56-
return InstanceStore.disposeInstance(Instance.current)
57-
},
5845
}

packages/opencode/src/server/routes/instance/project.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Hono } from "hono"
22
import { describeRoute, validator } from "hono-openapi"
33
import { resolver } from "hono-openapi"
44
import { Instance } from "@/project/instance"
5+
import { InstanceStore } from "@/project/instance-store"
56
import { Project } from "@/project/project"
67
import z from "zod"
78
import { ProjectID } from "@/project/schema"
@@ -81,11 +82,7 @@ export const ProjectRoutes = lazy(() =>
8182
Project.Service.use((svc) => svc.initGit({ directory: dir, project: prev })),
8283
)
8384
if (next.id === prev.id && next.vcs === prev.vcs && next.worktree === prev.worktree) return c.json(next)
84-
await Instance.reload({
85-
directory: dir,
86-
worktree: dir,
87-
project: next,
88-
})
85+
await InstanceStore.reloadInstance({ directory: dir, worktree: dir, project: next })
8986
return c.json(next)
9087
},
9188
)

packages/opencode/test/effect/instance-state.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
33
import { $ } from "bun"
44
import { Context, Deferred, Duration, Effect, Exit, Fiber, Layer } from "effect"
55
import { InstanceState } from "@/effect/instance-state"
6+
import { InstanceStore } from "../../src/project/instance-store"
67
import { Instance } from "../../src/project/instance"
78
import { disposeAllInstances, provideInstance, tmpdirScoped } from "../fixture/fixture"
89
import { testEffect } from "../lib/effect"
@@ -69,7 +70,7 @@ it.live("InstanceState invalidates on reload", () =>
6970
)
7071

7172
const a = yield* access(state, dir)
72-
yield* Effect.promise(() => Instance.reload({ directory: dir }))
73+
yield* Effect.promise(() => InstanceStore.reloadInstance({ directory: dir }))
7374
const b = yield* access(state, dir)
7475

7576
expect(a).not.toBe(b)
@@ -269,7 +270,7 @@ it.live("InstanceState correct after interleaved init and dispose", () =>
269270

270271
const [, b] = yield* Effect.all(
271272
[
272-
Effect.promise(() => Instance.reload({ directory: one })),
273+
Effect.promise(() => InstanceStore.reloadInstance({ directory: one })),
273274
Test.use((svc) => svc.get()).pipe(provideInstance(two)),
274275
],
275276
{ concurrency: "unbounded" },

packages/opencode/test/fixture/fixture.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type * as Scope from "effect/Scope"
88
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
99
import type { Config } from "@/config/config"
1010
import { InstanceRef } from "../../src/effect/instance-ref"
11+
import { InstanceStore } from "../../src/project/instance-store"
1112
import { Instance } from "../../src/project/instance"
1213
import { TestLLMServer } from "../lib/llm-server"
1314

@@ -149,7 +150,7 @@ export function provideTmpdirInstance<A, E, R>(
149150
? Effect.promise(() =>
150151
Instance.provide({
151152
directory: path,
152-
fn: () => Instance.dispose(),
153+
fn: () => InstanceStore.disposeInstance(Instance.current),
153154
}),
154155
).pipe(Effect.ignore)
155156
: Effect.void,

packages/opencode/test/mcp/lifecycle.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { test, expect, mock, beforeEach } from "bun:test"
2+
import { InstanceStore } from "../../src/project/instance-store"
23
import { Effect } from "effect"
34
import type { MCP as MCPNS } from "../../src/mcp/index"
45

@@ -197,7 +198,7 @@ function withInstance(
197198
fn: async () => {
198199
await Effect.runPromise(MCP.Service.use(fn).pipe(Effect.provide(MCP.defaultLayer)))
199200
// dispose instance to clean up state between tests
200-
await Instance.dispose()
201+
await InstanceStore.disposeInstance(Instance.current)
201202
},
202203
})
203204
}

packages/opencode/test/permission/next.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
66
import { Permission } from "../../src/permission"
77
import { PermissionID } from "../../src/permission/schema"
88
import { Instance } from "../../src/project/instance"
9+
import { InstanceStore } from "../../src/project/instance-store"
910
import { disposeAllInstances, provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
1011
import { testEffect } from "../lib/effect"
1112
import { MessageID, SessionID } from "../../src/session/schema"
@@ -998,7 +999,7 @@ it.live("pending permission rejects on instance dispose", () =>
998999
}).pipe(run, Effect.forkScoped)
9991000

10001001
expect(yield* waitForPending(1).pipe(run)).toHaveLength(1)
1001-
yield* Effect.promise(() => Instance.provide({ directory: dir, fn: () => void Instance.dispose() }))
1002+
yield* Effect.promise(() => Instance.provide({ directory: dir, fn: () => void InstanceStore.disposeInstance(Instance.current) }))
10021003

10031004
const exit = yield* Fiber.await(fiber)
10041005
expect(Exit.isFailure(exit)).toBe(true)
@@ -1021,7 +1022,7 @@ it.live("pending permission rejects on instance reload", () =>
10211022
}).pipe(run, Effect.forkScoped)
10221023

10231024
expect(yield* waitForPending(1).pipe(run)).toHaveLength(1)
1024-
yield* Effect.promise(() => Instance.reload({ directory: dir }))
1025+
yield* Effect.promise(() => InstanceStore.reloadInstance({ directory: dir }))
10251026

10261027
const exit = yield* Fiber.await(fiber)
10271028
expect(Exit.isFailure(exit)).toBe(true)
@@ -1115,7 +1116,7 @@ it.live("ask - abort should clear pending request", () =>
11151116

11161117
const pending = yield* waitForPending(1).pipe(run)
11171118
expect(pending).toHaveLength(1)
1118-
yield* Effect.promise(() => Instance.reload({ directory: dir }))
1119+
yield* Effect.promise(() => InstanceStore.reloadInstance({ directory: dir }))
11191120

11201121
const exit = yield* Fiber.await(fiber)
11211122
expect(Exit.isFailure(exit)).toBe(true)

packages/opencode/test/project/worktree.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import path from "path"
55
import { Cause, Effect, Exit, Layer } from "effect"
66
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
77
import { Instance } from "../../src/project/instance"
8+
import { InstanceStore } from "../../src/project/instance-store"
89
import { Worktree } from "../../src/worktree"
910
import { disposeAllInstances, provideInstance, provideTmpdirInstance } from "../fixture/fixture"
1011
import { testEffect } from "../lib/effect"
@@ -136,7 +137,7 @@ describe("Worktree", () => {
136137
expect(props.name).toBe(info.name)
137138
expect(props.branch).toBe(info.branch)
138139

139-
yield* Effect.promise(() => Instance.dispose()).pipe(provideInstance(info.directory))
140+
yield* Effect.promise(() => InstanceStore.runtime.runPromise((s) => s.load({ directory: info.directory }).pipe(Effect.flatMap(s.dispose))))
140141
yield* Effect.promise(() => Bun.sleep(100))
141142
yield* svc.remove({ directory: info.directory })
142143
}),
@@ -156,7 +157,7 @@ describe("Worktree", () => {
156157
expect(info.branch).toBe("opencode/test-workspace")
157158

158159
yield* Effect.promise(() => ready)
159-
yield* Effect.promise(() => Instance.dispose()).pipe(provideInstance(info.directory))
160+
yield* Effect.promise(() => InstanceStore.runtime.runPromise((s) => s.load({ directory: info.directory }).pipe(Effect.flatMap(s.dispose))))
160161
yield* Effect.promise(() => Bun.sleep(100))
161162
yield* svc.remove({ directory: info.directory })
162163
}),

packages/opencode/test/question/question.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { afterEach, test, expect } from "bun:test"
22
import { Question } from "../../src/question"
33
import { Instance } from "../../src/project/instance"
4+
import { InstanceStore } from "../../src/project/instance-store"
45
import { QuestionID } from "../../src/question/schema"
56
import { disposeAllInstances, tmpdir } from "../fixture/fixture"
67
import { SessionID } from "../../src/session/schema"
@@ -421,7 +422,7 @@ test("pending question rejects on instance dispose", async () => {
421422
fn: async () => {
422423
const items = await list()
423424
expect(items).toHaveLength(1)
424-
await Instance.dispose()
425+
await InstanceStore.disposeInstance(Instance.current)
425426
},
426427
})
427428

@@ -456,7 +457,7 @@ test("pending question rejects on instance reload", async () => {
456457
fn: async () => {
457458
const items = await list()
458459
expect(items).toHaveLength(1)
459-
await Instance.reload({ directory: tmp.path })
460+
await InstanceStore.reloadInstance({ directory: tmp.path })
460461
},
461462
})
462463

packages/opencode/test/server/httpapi-mcp.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
55
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
66
import { McpPaths } from "../../src/server/routes/instance/httpapi/groups/mcp"
77
import { Instance } from "../../src/project/instance"
8+
import { InstanceStore } from "../../src/project/instance-store"
89
import { Server } from "../../src/server/server"
910
import * as Log from "@opencode-ai/core/util/log"
1011
import { resetDatabase } from "../fixture/db"
@@ -57,7 +58,7 @@ function withMcpProject<A, E, R>(self: (dir: string) => Effect.Effect<A, E, R>)
5758
}),
5859
)
5960
yield* Effect.addFinalizer(() =>
60-
Effect.promise(() => Instance.provide({ directory: dir, fn: () => Instance.dispose() })).pipe(Effect.ignore),
61+
Effect.promise(() => Instance.provide({ directory: dir, fn: () => InstanceStore.disposeInstance(Instance.current) })).pipe(Effect.ignore),
6162
)
6263

6364
return yield* self(dir).pipe(provideInstance(dir))

packages/opencode/test/server/httpapi-provider.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Effect, FileSystem, Layer, Path } from "effect"
33
import { NodeFileSystem, NodePath } from "@effect/platform-node"
44
import { Flag } from "@opencode-ai/core/flag/flag"
55
import { Instance } from "../../src/project/instance"
6+
import { InstanceStore } from "../../src/project/instance-store"
67
import { Server } from "../../src/server/server"
78
import * as Log from "@opencode-ai/core/util/log"
89
import { resetDatabase } from "../fixture/db"
@@ -89,7 +90,7 @@ function withProviderProject<A, E, R>(self: (dir: string) => Effect.Effect<A, E,
8990
)
9091
yield* writeProviderAuthPlugin(dir)
9192
yield* Effect.addFinalizer(() =>
92-
Effect.promise(() => Instance.provide({ directory: dir, fn: () => Instance.dispose() })).pipe(Effect.ignore),
93+
Effect.promise(() => Instance.provide({ directory: dir, fn: () => InstanceStore.disposeInstance(Instance.current) })).pipe(Effect.ignore),
9394
)
9495

9596
return yield* self(dir).pipe(provideInstance(dir))

0 commit comments

Comments
 (0)