fix(tui): preserve shell after Ctrl+C (#5502)

This commit is contained in:
chengyongru
2026-08-24 14:32:48 +08:00
committed by GitHub
parent 09d3bd76c9
commit 7f288a49fc
2 changed files with 8 additions and 3 deletions
+4 -2
View File
@@ -2379,7 +2379,7 @@ describe("NanobotTui layout", () => {
expect(exited).toEqual(["chat"])
})
test("exits immediately when Ctrl+C is pressed on an idle empty composer", async () => {
test("exits after Ctrl+C input dispatch completes on an idle empty composer", async () => {
setup = await createRenderer({ width: 72, height: 20, screenMode: "alternate-screen" })
let closed = false
const transport = client()
@@ -2393,7 +2393,9 @@ describe("NanobotTui layout", () => {
setup.mockInput.pressCtrlC()
expect(closed).toBe(true)
expect(closed).toBe(false)
expect(setup.renderer.isDestroyed).toBe(false)
await waitUntil(() => closed)
expect(setup.renderer.isDestroyed).toBe(true)
})
+4 -1
View File
@@ -1653,7 +1653,10 @@ export class NanobotTui {
this.clearComposer()
this.status.content = this.readyStatus()
} else {
this.quit()
// Finish dispatching the raw ETX before destroy() restores terminal input.
// Releasing the terminal from inside this callback can leak the same Ctrl+C
// to the parent shell on Windows terminals.
setTimeout(() => this.quit(), 0)
}
return
}