From c9bbea4266a8844f80b2248457437d80ae42cc85 Mon Sep 17 00:00:00 2001 From: adamelmore <2363879+adamdottv@users.noreply.github.com> Date: Wed, 28 Jan 2026 06:21:39 -0600 Subject: [PATCH] chore: cleanup --- packages/opencode/src/config/config.ts | 29 +++++++------- packages/opencode/src/project/instance.ts | 46 ++++++++++++++++------- packages/opencode/src/project/state.ts | 4 +- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index f7b1a4c1e1..8c65726e23 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -1104,20 +1104,23 @@ export namespace Config { mergeDeep(await loadFile(path.join(Global.Path.config, "opencode.jsonc"))), ) - await import(path.join(Global.Path.config, "config"), { - with: { - type: "toml", - }, - }) - .then(async (mod) => { - const { provider, model, ...rest } = mod.default - if (provider && model) result.model = `${provider}/${model}` - result["$schema"] = "https://opencode.ai/config.json" - result = mergeDeep(result, rest) - await Bun.write(path.join(Global.Path.config, "config.json"), JSON.stringify(result, null, 2)) - await fs.unlink(path.join(Global.Path.config, "config")) + const legacy = path.join(Global.Path.config, "config") + if (existsSync(legacy)) { + await import(pathToFileURL(legacy).href, { + with: { + type: "toml", + }, }) - .catch(() => {}) + .then(async (mod) => { + const { provider, model, ...rest } = mod.default + if (provider && model) result.model = `${provider}/${model}` + result["$schema"] = "https://opencode.ai/config.json" + result = mergeDeep(result, rest) + await Bun.write(path.join(Global.Path.config, "config.json"), JSON.stringify(result, null, 2)) + await fs.unlink(legacy) + }) + .catch(() => {}) + } return result }) diff --git a/packages/opencode/src/project/instance.ts b/packages/opencode/src/project/instance.ts index e5a88101c0..e6793b64fd 100644 --- a/packages/opencode/src/project/instance.ts +++ b/packages/opencode/src/project/instance.ts @@ -17,6 +17,10 @@ const cache = new Map>() const DISPOSE_TIMEOUT_MS = 10_000 +const disposal = { + all: undefined as Promise | undefined, +} + export const Instance = { async provide(input: { directory: string; init?: () => Promise; fn: () => R }): Promise { let existing = cache.get(input.directory) @@ -80,20 +84,34 @@ export const Instance = { }) }, async disposeAll() { - Log.Default.info("disposing all instances") - for (const [key, value] of cache) { - const ctx = await withTimeout(value, DISPOSE_TIMEOUT_MS).catch((error) => { - Log.Default.warn("instance dispose timed out", { key, error }) - return undefined - }) - if (!ctx) { - cache.delete(key) - continue + if (disposal.all) return disposal.all + + disposal.all = iife(async () => { + Log.Default.info("disposing all instances") + const entries = [...cache.entries()] + for (const [key, value] of entries) { + if (cache.get(key) !== value) continue + + const ctx = await withTimeout(value, DISPOSE_TIMEOUT_MS).catch((error) => { + Log.Default.warn("instance dispose timed out", { key, error }) + return undefined + }) + + if (!ctx) { + if (cache.get(key) === value) cache.delete(key) + continue + } + + if (cache.get(key) !== value) continue + + await context.provide(ctx, async () => { + await Instance.dispose() + }) } - await context.provide(ctx, async () => { - await Instance.dispose() - }) - } - cache.clear() + }).finally(() => { + disposal.all = undefined + }) + + return disposal.all }, } diff --git a/packages/opencode/src/project/state.ts b/packages/opencode/src/project/state.ts index f2cf599461..3c84393bfb 100644 --- a/packages/opencode/src/project/state.ts +++ b/packages/opencode/src/project/state.ts @@ -66,9 +66,11 @@ export namespace State { tasks.push(task) } + await Promise.all(tasks) + entries.clear() recordsByKey.delete(key) - await Promise.all(tasks) + disposalFinished = true log.info("state disposal completed", { key }) }