Просмотр исходного кода

fix(app): terminal no longer hangs on exit or ctrl + D and closes the pane (#9506)

Rahul A Mistry 1 месяц назад
Родитель
Сommit
01b12949e3

+ 15 - 0
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)),

+ 13 - 0
packages/app/src/pages/session.tsx

@@ -385,6 +385,19 @@ export default function Page() {
     terminal.new()
   })
 
+  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,

+ 3 - 0
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 })