diff options
| author | Rahul A Mistry <[email protected]> | 2026-01-20 21:12:20 +0530 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-01-20 09:42:20 -0600 |
| commit | 01b12949e3a853dacbb75104461654fc95cee0a2 (patch) | |
| tree | 9f97f52614c24e0434c0db1608584063742a3513 | |
| parent | ac7e674a87ec7efcbf504bd9277164bf8d383e66 (diff) | |
| download | opencode-01b12949e3a853dacbb75104461654fc95cee0a2.tar.gz opencode-01b12949e3a853dacbb75104461654fc95cee0a2.zip | |
fix(app): terminal no longer hangs on exit or ctrl + D and closes the pane (#9506)
| -rw-r--r-- | packages/app/src/context/terminal.tsx | 15 | ||||
| -rw-r--r-- | packages/app/src/pages/session.tsx | 13 | ||||
| -rw-r--r-- | packages/opencode/src/pty/index.ts | 3 |
3 files changed, 31 insertions, 0 deletions
diff --git a/packages/app/src/context/terminal.tsx b/packages/app/src/context/terminal.tsx index 709d7b899..6f92b4adf 100644 --- a/packages/app/src/context/terminal.tsx +++ b/packages/app/src/context/terminal.tsx @@ -38,6 +38,21 @@ function createTerminalSession(sdk: ReturnType<typeof useSDK>, dir: string, sess }), ) + sdk.event.on("pty.exited", (event) => { + const id = event.properties.id + if (!store.all.some((x) => x.id === id)) return + batch(() => { + setStore( + "all", + store.all.filter((x) => x.id !== id), + ) + if (store.active === id) { + const remaining = store.all.filter((x) => x.id !== id) + setStore("active", remaining[0]?.id) + } + }) + }) + return { ready, all: createMemo(() => Object.values(store.all)), diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 89d3ec773..bfd1a3d45 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -387,6 +387,19 @@ export default function Page() { createEffect( on( + () => terminal.all().length, + (count, prevCount) => { + if (prevCount !== undefined && prevCount > 0 && count === 0) { + if (view().terminal.opened()) { + view().terminal.toggle() + } + } + }, + ), + ) + + createEffect( + on( () => visibleUserMessages().at(-1)?.id, (lastId, prevLastId) => { if (lastId && prevLastId && lastId > prevLastId) { diff --git a/packages/opencode/src/pty/index.ts b/packages/opencode/src/pty/index.ts index 39ccebf96..6edff32e1 100644 --- a/packages/opencode/src/pty/index.ts +++ b/packages/opencode/src/pty/index.ts @@ -147,6 +147,9 @@ export namespace Pty { log.info("session exited", { id, exitCode }) session.info.status = "exited" Bus.publish(Event.Exited, { id, exitCode }) + for (const ws of session.subscribers) { + ws.close() + } state().delete(id) }) Bus.publish(Event.Created, { info }) |
