Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 3409661

Browse files
committed
handle config errors gracefully
1 parent 92604b3 commit 3409661

4 files changed

Lines changed: 45 additions & 25 deletions

File tree

packages/opencode/src/cli/cmd/tui/context/exit.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import { useRenderer } from "@opentui/solid"
22
import { createSimpleContext } from "./helper"
3+
import { FormatError } from "@/cli/error"
34

45
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
56
name: "Exit",
67
init: (input: { onExit?: () => Promise<void> }) => {
78
const renderer = useRenderer()
8-
return async () => {
9+
return async (reason?: any) => {
910
renderer.destroy()
1011
await input.onExit?.()
12+
if (reason) {
13+
const formatted = FormatError(reason) ?? JSON.stringify(reason)
14+
process.stderr.write(formatted + "\n")
15+
}
1116
process.exit(0)
1217
}
1318
},

packages/opencode/src/cli/cmd/tui/context/sync.tsx

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import { useSDK } from "@tui/context/sdk"
1717
import { Binary } from "@/util/binary"
1818
import { createSimpleContext } from "./helper"
1919
import type { Snapshot } from "@/snapshot"
20+
import { useExit } from "./exit"
21+
import { onMount } from "solid-js"
2022

2123
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
2224
name: "Sync",
@@ -215,28 +217,36 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
215217
}
216218
})
217219

218-
// blocking
219-
Promise.all([
220-
sdk.client.config.providers({ throwOnError: true }).then((x) => setStore("provider", x.data!.providers)),
221-
sdk.client.app.agents({ throwOnError: true }).then((x) => setStore("agent", x.data ?? [])),
222-
sdk.client.config.get({ throwOnError: true }).then((x) => setStore("config", x.data!)),
223-
]).then(() => {
224-
setStore("status", "partial")
225-
// non-blocking
220+
const exit = useExit()
221+
222+
onMount(() => {
223+
// blocking
226224
Promise.all([
227-
sdk.client.session.list().then((x) =>
228-
setStore(
229-
"session",
230-
(x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
231-
),
232-
),
233-
sdk.client.command.list().then((x) => setStore("command", x.data ?? [])),
234-
sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)),
235-
sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)),
236-
sdk.client.formatter.status().then((x) => setStore("formatter", x.data!)),
237-
]).then(() => {
238-
setStore("status", "complete")
239-
})
225+
sdk.client.config.providers({ throwOnError: true }).then((x) => setStore("provider", x.data!.providers)),
226+
sdk.client.app.agents({ throwOnError: true }).then((x) => setStore("agent", x.data ?? [])),
227+
sdk.client.config.get({ throwOnError: true }).then((x) => setStore("config", x.data!)),
228+
])
229+
.then(() => {
230+
setStore("status", "partial")
231+
// non-blocking
232+
Promise.all([
233+
sdk.client.session.list().then((x) =>
234+
setStore(
235+
"session",
236+
(x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
237+
),
238+
),
239+
sdk.client.command.list().then((x) => setStore("command", x.data ?? [])),
240+
sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)),
241+
sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)),
242+
sdk.client.formatter.status().then((x) => setStore("formatter", x.data!)),
243+
]).then(() => {
244+
setStore("status", "complete")
245+
})
246+
})
247+
.catch(async (e) => {
248+
await exit(e)
249+
})
240250
})
241251

242252
const result = {

packages/opencode/src/cli/cmd/tui/worker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const rpc = {
4343
}
4444
},
4545
async shutdown() {
46+
Log.Default.info("worker shutting down")
4647
await Instance.disposeAll()
4748
await server.stop(true)
4849
},

packages/opencode/src/project/instance.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,14 @@ export const Instance = {
5353
await State.dispose(Instance.directory)
5454
},
5555
async disposeAll() {
56+
Log.Default.info("disposing all instances")
5657
for (const [_key, value] of cache) {
57-
await context.provide(await value, async () => {
58-
await Instance.dispose()
59-
})
58+
const awaited = await value.catch(() => {})
59+
if (awaited) {
60+
await context.provide(await value, async () => {
61+
await Instance.dispose()
62+
})
63+
}
6064
}
6165
cache.clear()
6266
},

0 commit comments

Comments
 (0)