From ad3c192837cc740e189034d8f6fc9f6b72db9bda Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Tue, 17 Feb 2026 17:55:29 -0500 Subject: [PATCH] tui: exit cleanly without hanging after session ends - Force process exit after TUI thread completes to prevent lingering processes - Add 5-second timeout to worker shutdown to prevent indefinite hangs during cleanup --- packages/opencode/src/cli/cmd/tui/thread.ts | 1 + packages/opencode/src/cli/cmd/tui/worker.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/thread.ts b/packages/opencode/src/cli/cmd/tui/thread.ts index 6d41fe857..9eb296032 100644 --- a/packages/opencode/src/cli/cmd/tui/thread.ts +++ b/packages/opencode/src/cli/cmd/tui/thread.ts @@ -184,5 +184,6 @@ export const TuiThreadCommand = cmd({ } finally { unguard?.() } + process.exit(0) }, }) diff --git a/packages/opencode/src/cli/cmd/tui/worker.ts b/packages/opencode/src/cli/cmd/tui/worker.ts index e63f10ba8..bb5495c48 100644 --- a/packages/opencode/src/cli/cmd/tui/worker.ts +++ b/packages/opencode/src/cli/cmd/tui/worker.ts @@ -137,7 +137,12 @@ export const rpc = { async shutdown() { Log.Default.info("worker shutting down") if (eventStream.abort) eventStream.abort.abort() - await Instance.disposeAll() + await Promise.race([ + Instance.disposeAll(), + new Promise((resolve) => { + setTimeout(resolve, 5000) + }), + ]) if (server) server.stop(true) }, }