From 0f18e035a13f7fe89d51cf40a47dc0f7b1550c40 Mon Sep 17 00:00:00 2001 From: Joseph Harrison Date: Tue, 13 Jan 2026 15:00:10 -0500 Subject: [PATCH] fix(prompt-input): handle Shift+Enter before IME check to prevent stuck state The IME composing check was running before the Shift+Enter handler, which caused Shift+Enter to stop working if the composing signal got stuck in true state (e.g., if compositionend event never fired). Changes: - Move Shift+Enter handler before the IME composing check since Shift+Enter is never used for IME input and should always insert a newline - Add safety effect to reset composing state on focus loss, preventing stuck state from persisting This fixes an intermittent bug where Shift+Enter would stop working and only recover after deleting the session. --- packages/app/src/components/prompt-input.tsx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index f1ca3ee888b5..2f85652a93ee 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -364,6 +364,12 @@ export const PromptInput: Component = (props) => { if (!isFocused()) setStore("popover", null) }) + // Safety: reset composing state on focus change to prevent stuck state + // This handles edge cases where compositionend event may not fire + createEffect(() => { + if (!isFocused()) setComposing(false) + }) + type AtOption = { type: "agent"; name: string; display: string } | { type: "file"; path: string; display: string } const agentList = createMemo(() => @@ -881,6 +887,14 @@ export const PromptInput: Component = (props) => { } } + // Handle Shift+Enter BEFORE IME check - Shift+Enter is never used for IME input + // and should always insert a newline regardless of composition state + if (event.key === "Enter" && event.shiftKey) { + addPart({ type: "text", content: "\n", start: 0, end: 0 }) + event.preventDefault() + return + } + if (event.key === "Enter" && isImeComposing(event)) { return } @@ -944,11 +958,7 @@ export const PromptInput: Component = (props) => { return } - if (event.key === "Enter" && event.shiftKey) { - addPart({ type: "text", content: "\n", start: 0, end: 0 }) - event.preventDefault() - return - } + // Note: Shift+Enter is handled earlier, before IME check if (event.key === "Enter" && !event.shiftKey) { handleSubmit(event) }