From 8f02f48acd6b2d9794833d8eb58a6e82764efcfb Mon Sep 17 00:00:00 2001 From: Scott Hanselman Date: Mon, 27 Apr 2026 23:20:20 -0700 Subject: [PATCH] fix(tui): dedupe ASCII backspace events Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/tui/tui.test.ts | 8 ++++++++ src/tui/tui.ts | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tui/tui.test.ts b/src/tui/tui.test.ts index 5a573090239..b9d41065472 100644 --- a/src/tui/tui.test.ts +++ b/src/tui/tui.test.ts @@ -210,6 +210,14 @@ describe("createBackspaceDeduper", () => { expect(dedupe("\x7f")).toBe("\x7f"); }); + it("treats ASCII BS as backspace when it is the first event", () => { + const { dedupe, advance } = createTimedDedupe(); + + expect(dedupe("\x08")).toBe("\x08"); + advance(1); + expect(dedupe("\x7f")).toBe(""); + }); + it("never suppresses non-backspace keys", () => { const dedupe = createBackspaceDeduper(); expect(dedupe("a")).toBe("a"); diff --git a/src/tui/tui.ts b/src/tui/tui.ts index a36a78bcd45..a382d3b0765 100644 --- a/src/tui/tui.ts +++ b/src/tui/tui.ts @@ -209,7 +209,7 @@ export function createBackspaceDeduper(params?: { dedupeWindowMs?: number; now?: let lastBackspaceAt = -1; return (data: string): string => { - if (!matchesKey(data, Key.backspace)) { + if (data !== "\x08" && !matchesKey(data, Key.backspace)) { return data; } const ts = now();