Explorar o código

tui: skip abort on mini session close (#39067)

Simon Klee hai 2 semanas
pai
achega
f14d78afeb

+ 2 - 2
packages/tui/src/mini/runtime.queue.ts

@@ -75,7 +75,8 @@ export async function runPromptQueue(input: QueueInput): Promise<void> {
 
     state.closed = true
     state.queue.length = 0
-    state.ctrl?.abort()
+    // Ordinary turn signals map to session.interrupt; exiting should only detach the TUI.
+    if (state.active?.mode === "shell") state.ctrl?.abort()
     admissionController.abort()
     stop.resolve({ type: "closed" })
     finish()
@@ -198,7 +199,6 @@ export async function runPromptQueue(input: QueueInput): Promise<void> {
 
             const next = await Promise.race([task, stop.promise])
             if (next.type === "closed") {
-              ctrl.abort()
               break
             }
 

+ 24 - 0
packages/tui/test/mini/runtime.queue.test.ts

@@ -338,6 +338,30 @@ describe("run runtime queue", () => {
     expect(admissionHit).toBe(true)
   })
 
+  test.each([
+    ["session", undefined, false],
+    ["shell", "shell", true],
+  ] as const)("close handles an active %s turn", async (_name, mode, aborted) => {
+    const ui = createFooterApiFixture()
+    const started = Promise.withResolvers<AbortSignal>()
+    const active = Promise.withResolvers<void>()
+    const task = runPromptQueue({
+      footer: ui.api,
+      run: async (_input, signal) => {
+        started.resolve(signal)
+        await active.promise
+      },
+    })
+
+    ui.submit("one", mode)
+    const signal = await started.promise
+    ui.api.close()
+    await task
+
+    expect(signal.aborted).toBe(aborted)
+    active.resolve()
+  })
+
   test("propagates run errors", async () => {
     const ui = createFooterApiFixture()