summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-13 18:59:09 -0500
committerDax Raad <[email protected]>2025-11-13 18:59:09 -0500
commit340966195b613d068486f792b434d878a3e71fbd (patch)
tree1d2832bd4b01fcb460527ee04b43e6fefe5b8fcf /packages
parent92604b391b21438d87b86cfc36f937030017bdaf (diff)
downloadopencode-340966195b613d068486f792b434d878a3e71fbd.tar.gz
opencode-340966195b613d068486f792b434d878a3e71fbd.zip
handle config errors gracefully
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/exit.tsx7
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/sync.tsx52
-rw-r--r--packages/opencode/src/cli/cmd/tui/worker.ts1
-rw-r--r--packages/opencode/src/project/instance.ts10
4 files changed, 45 insertions, 25 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/context/exit.tsx b/packages/opencode/src/cli/cmd/tui/context/exit.tsx
index 7d7feaa28..612c39157 100644
--- a/packages/opencode/src/cli/cmd/tui/context/exit.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/exit.tsx
@@ -1,13 +1,18 @@
import { useRenderer } from "@opentui/solid"
import { createSimpleContext } from "./helper"
+import { FormatError } from "@/cli/error"
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
name: "Exit",
init: (input: { onExit?: () => Promise<void> }) => {
const renderer = useRenderer()
- return async () => {
+ return async (reason?: any) => {
renderer.destroy()
await input.onExit?.()
+ if (reason) {
+ const formatted = FormatError(reason) ?? JSON.stringify(reason)
+ process.stderr.write(formatted + "\n")
+ }
process.exit(0)
}
},
diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
index 6899cf575..eb8c3dfaa 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
@@ -17,6 +17,8 @@ import { useSDK } from "@tui/context/sdk"
import { Binary } from "@/util/binary"
import { createSimpleContext } from "./helper"
import type { Snapshot } from "@/snapshot"
+import { useExit } from "./exit"
+import { onMount } from "solid-js"
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
name: "Sync",
@@ -215,28 +217,36 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
}
})
- // blocking
- Promise.all([
- sdk.client.config.providers({ throwOnError: true }).then((x) => setStore("provider", x.data!.providers)),
- sdk.client.app.agents({ throwOnError: true }).then((x) => setStore("agent", x.data ?? [])),
- sdk.client.config.get({ throwOnError: true }).then((x) => setStore("config", x.data!)),
- ]).then(() => {
- setStore("status", "partial")
- // non-blocking
+ const exit = useExit()
+
+ onMount(() => {
+ // blocking
Promise.all([
- sdk.client.session.list().then((x) =>
- setStore(
- "session",
- (x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
- ),
- ),
- sdk.client.command.list().then((x) => setStore("command", x.data ?? [])),
- sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)),
- sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)),
- sdk.client.formatter.status().then((x) => setStore("formatter", x.data!)),
- ]).then(() => {
- setStore("status", "complete")
- })
+ sdk.client.config.providers({ throwOnError: true }).then((x) => setStore("provider", x.data!.providers)),
+ sdk.client.app.agents({ throwOnError: true }).then((x) => setStore("agent", x.data ?? [])),
+ sdk.client.config.get({ throwOnError: true }).then((x) => setStore("config", x.data!)),
+ ])
+ .then(() => {
+ setStore("status", "partial")
+ // non-blocking
+ Promise.all([
+ sdk.client.session.list().then((x) =>
+ setStore(
+ "session",
+ (x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
+ ),
+ ),
+ sdk.client.command.list().then((x) => setStore("command", x.data ?? [])),
+ sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)),
+ sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)),
+ sdk.client.formatter.status().then((x) => setStore("formatter", x.data!)),
+ ]).then(() => {
+ setStore("status", "complete")
+ })
+ })
+ .catch(async (e) => {
+ await exit(e)
+ })
})
const result = {
diff --git a/packages/opencode/src/cli/cmd/tui/worker.ts b/packages/opencode/src/cli/cmd/tui/worker.ts
index 32cd5562a..db1eb8ecb 100644
--- a/packages/opencode/src/cli/cmd/tui/worker.ts
+++ b/packages/opencode/src/cli/cmd/tui/worker.ts
@@ -43,6 +43,7 @@ export const rpc = {
}
},
async shutdown() {
+ Log.Default.info("worker shutting down")
await Instance.disposeAll()
await server.stop(true)
},
diff --git a/packages/opencode/src/project/instance.ts b/packages/opencode/src/project/instance.ts
index 39625e087..6e8ebb7a0 100644
--- a/packages/opencode/src/project/instance.ts
+++ b/packages/opencode/src/project/instance.ts
@@ -53,10 +53,14 @@ export const Instance = {
await State.dispose(Instance.directory)
},
async disposeAll() {
+ Log.Default.info("disposing all instances")
for (const [_key, value] of cache) {
- await context.provide(await value, async () => {
- await Instance.dispose()
- })
+ const awaited = await value.catch(() => {})
+ if (awaited) {
+ await context.provide(await value, async () => {
+ await Instance.dispose()
+ })
+ }
}
cache.clear()
},