From f14d78afebae5c4f3afde3b74c8eeaa7fd828a92 Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Mon, 27 Jul 2026 10:42:37 +0200 Subject: [PATCH] tui: skip abort on mini session close (#39067) --- packages/tui/src/mini/runtime.queue.ts | 4 ++-- packages/tui/test/mini/runtime.queue.test.ts | 24 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/tui/src/mini/runtime.queue.ts b/packages/tui/src/mini/runtime.queue.ts index 74a399416e2..1a66980bae8 100644 --- a/packages/tui/src/mini/runtime.queue.ts +++ b/packages/tui/src/mini/runtime.queue.ts @@ -75,7 +75,8 @@ export async function runPromptQueue(input: QueueInput): Promise { 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 { const next = await Promise.race([task, stop.promise]) if (next.type === "closed") { - ctrl.abort() break } diff --git a/packages/tui/test/mini/runtime.queue.test.ts b/packages/tui/test/mini/runtime.queue.test.ts index c7fe59fba80..1d024e43378 100644 --- a/packages/tui/test/mini/runtime.queue.test.ts +++ b/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() + const active = Promise.withResolvers() + 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()