summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRahul A Mistry <[email protected]>2026-01-20 21:12:20 +0530
committerGitHub <[email protected]>2026-01-20 09:42:20 -0600
commit01b12949e3a853dacbb75104461654fc95cee0a2 (patch)
tree9f97f52614c24e0434c0db1608584063742a3513
parentac7e674a87ec7efcbf504bd9277164bf8d383e66 (diff)
downloadopencode-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.tsx15
-rw-r--r--packages/app/src/pages/session.tsx13
-rw-r--r--packages/opencode/src/pty/index.ts3
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 })