From 978a29145b063f27c1b8b5605bd98779e1963d90 Mon Sep 17 00:00:00 2001 From: Yunfei He Date: Wed, 27 May 2026 15:35:07 +0800 Subject: [PATCH] fix: suppress input text for kitty release events Release events now produce empty input to prevent character duplication when reportEventTypes flag is enabled. key.eventType is still passed through so handlers can detect release events. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../integration/pty/fixtures/use-input-kitty.tsx | 5 +++++ packages/runtime-tests/integration/pty/input-kitty.test.ts | 4 ++-- packages/runtime/src/composables/useInput.ts | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/runtime-tests/integration/pty/fixtures/use-input-kitty.tsx b/packages/runtime-tests/integration/pty/fixtures/use-input-kitty.tsx index a8808ce..8cb2af2 100644 --- a/packages/runtime-tests/integration/pty/fixtures/use-input-kitty.tsx +++ b/packages/runtime-tests/integration/pty/fixtures/use-input-kitty.tsx @@ -99,6 +99,11 @@ const KittyInput = defineComponent({ return; } + if (props.test === "releaseEmpty" && input === "" && key.eventType === "release") { + exit(); + return; + } + if (props.test === "queryResponse") { throw new Error("Query response should not reach handler"); } diff --git a/packages/runtime-tests/integration/pty/input-kitty.test.ts b/packages/runtime-tests/integration/pty/input-kitty.test.ts index bf3dc65..b559765 100644 --- a/packages/runtime-tests/integration/pty/input-kitty.test.ts +++ b/packages/runtime-tests/integration/pty/input-kitty.test.ts @@ -66,8 +66,8 @@ it("useInput - handle kitty protocol repeat event", async () => { expect(ps.output).toContain("exited"); }); -it("useInput - handle kitty protocol release event", async () => { - const ps = term("use-input-kitty", ["release"]); +it("useInput - release event produces empty input", async () => { + const ps = term("use-input-kitty", ["releaseEmpty"]); ps.write(kittyKey(97, 1, 3)); await ps.waitForExit(); expect(ps.output).toContain("exited"); diff --git a/packages/runtime/src/composables/useInput.ts b/packages/runtime/src/composables/useInput.ts index 0bb96bf..a652dc6 100644 --- a/packages/runtime/src/composables/useInput.ts +++ b/packages/runtime/src/composables/useInput.ts @@ -70,7 +70,9 @@ export function useInput( let input: string; if (keypress.isKittyProtocol) { - if (keypress.isPrintable) { + if (keypress.eventType === "release") { + input = ""; + } else if (keypress.isPrintable) { input = keypress.text ?? keypress.name; } else if (keypress.ctrl && keypress.name.length === 1) { input = keypress.name;