From c0e63f76da7b5b3a117f9d1ee30a1371bd306dc4 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 23 Mar 2026 00:03:09 +0700 Subject: [PATCH] feat(terminal): add shift+enter support and force resize on focus --- packages/app/src/components/terminal-emulator.tsx | 1 + packages/server/src/shared/terminal-key-input.test.ts | 10 ++++++++++ packages/server/src/shared/terminal-key-input.ts | 3 +++ 3 files changed, 14 insertions(+) diff --git a/packages/app/src/components/terminal-emulator.tsx b/packages/app/src/components/terminal-emulator.tsx index d75f9af76..6404712cb 100644 --- a/packages/app/src/components/terminal-emulator.tsx +++ b/packages/app/src/components/terminal-emulator.tsx @@ -358,6 +358,7 @@ const TerminalEmulator = forwardRef { runtimeRef.current?.focus(); diff --git a/packages/server/src/shared/terminal-key-input.test.ts b/packages/server/src/shared/terminal-key-input.test.ts index a0bc0b39c..0248a2bae 100644 --- a/packages/server/src/shared/terminal-key-input.test.ts +++ b/packages/server/src/shared/terminal-key-input.test.ts @@ -19,6 +19,16 @@ describe("encodeTerminalKeyInput", () => { expect(encodeTerminalKeyInput({ key: "Backspace" })).toBe("\x7f"); }); + it("encodes shift+enter as kitty keyboard protocol CSI u", () => { + expect(encodeTerminalKeyInput({ key: "Enter", shift: true })).toBe("\x1b[13;2u"); + }); + + it("encodes enter with other modifiers as plain carriage return", () => { + expect(encodeTerminalKeyInput({ key: "Enter", ctrl: true })).toBe("\r"); + expect(encodeTerminalKeyInput({ key: "Enter", alt: true })).toBe("\x1b\r"); + expect(encodeTerminalKeyInput({ key: "Enter", shift: true, ctrl: true })).toBe("\r"); + }); + it("returns empty string for unsupported keys", () => { expect(encodeTerminalKeyInput({ key: "UnidentifiedKey" })).toBe(""); }); diff --git a/packages/server/src/shared/terminal-key-input.ts b/packages/server/src/shared/terminal-key-input.ts index b98f4bd06..35bdb8890 100644 --- a/packages/server/src/shared/terminal-key-input.ts +++ b/packages/server/src/shared/terminal-key-input.ts @@ -86,6 +86,9 @@ export function encodeTerminalKeyInput(input: TerminalKeyInput): string { switch (key) { case "Enter": + if (input.shift && !input.ctrl && !input.alt && !input.meta) { + return "\x1b[13;2u"; + } return applyAltLikePrefix("\r", input); case "Tab": if (input.shift && !input.ctrl && !input.alt && !input.meta) {