|
|
@@ -364,6 +364,12 @@ export const PromptInput: Component<PromptInputProps> = (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<PromptInputProps> = (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<PromptInputProps> = (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)
|
|
|
}
|