Fix composer send shortcut conflicts

This commit is contained in:
Mohamed Boudra
2026-06-12 13:29:51 +07:00
parent 9e9d0ee305
commit 426547bfcc
16 changed files with 152 additions and 101 deletions
-1
View File
@@ -8,7 +8,6 @@ export type KeyboardFocusScope =
export type MessageInputKeyboardActionKind =
| "focus"
| "send"
| "queue"
| "dictation-toggle"
| "dictation-cancel"
| "dictation-confirm"
@@ -2,6 +2,7 @@ import { describe, expect, it, vi } from "vitest";
import {
buildKeyboardShortcutHelpSections,
buildEffectiveBindings,
getBindingIdForAction,
resolveKeyboardShortcut,
type ChordState,
type KeyboardShortcutContext,
@@ -413,6 +414,16 @@ describe("keyboard-shortcuts", () => {
event: { key: "d", code: "KeyD", metaKey: true },
context: { isMac: true, focusScope: "terminal" },
},
{
name: "does not bind Cmd+Enter as a rebindable message queue shortcut",
event: { key: "Enter", code: "Enter", metaKey: true },
context: { isMac: true, focusScope: "message-input" },
},
{
name: "does not bind Ctrl+Enter as a rebindable message queue shortcut",
event: { key: "Enter", code: "Enter", ctrlKey: true },
context: { isMac: false, focusScope: "message-input" },
},
{
name: "does not interrupt agent when terminal is focused",
event: { key: "Escape", code: "Escape" },
@@ -600,4 +611,17 @@ describe("keyboard-shortcut help sections", () => {
expect(openProject?.label).toBe("Open project");
expect(showShortcuts?.noteKey).toBe("settings.shortcuts.helpNotes.showKeyboardShortcuts");
});
it("does not expose Enter send behavior as rebindable shortcut rows", () => {
const sections = buildKeyboardShortcutHelpSections({ isMac: true, isDesktop: true });
expect(findRow(sections, "message-input-send")).toBeNull();
expect(findRow(sections, "message-input-queue")).toBeNull();
expect(
getBindingIdForAction("message-input-send", { isMac: true, isDesktop: true }),
).toBeNull();
expect(
getBindingIdForAction("message-input-queue", { isMac: true, isDesktop: true }),
).toBeNull();
});
});
@@ -154,8 +154,6 @@ const SHORTCUT_HELP_LABEL_KEYS: Record<string, string> = {
"voice-toggle": "settings.shortcuts.help.toggleVoiceMode",
"dictation-toggle": "settings.shortcuts.help.startStopDictation",
"agent-interrupt": "settings.shortcuts.help.interruptAgent",
"message-input-send": "settings.shortcuts.help.sendMessage",
"message-input-queue": "settings.shortcuts.help.queueMessage",
"voice-mute-toggle": "settings.shortcuts.help.muteUnmuteVoiceMode",
};
@@ -953,52 +951,6 @@ const SHORTCUT_BINDINGS: readonly ShortcutBinding[] = [
keys: ["Esc"],
},
},
{
id: "message-input-send-enter",
action: "message-input.action",
combo: "Enter",
when: { focusScope: "message-input", commandCenter: false },
payload: { type: "message-input", kind: "send" },
preventDefault: false,
stopPropagation: false,
help: {
id: "message-input-send",
section: "agent-input",
label: "Send message",
keys: ["Enter"],
},
},
{
id: "message-input-queue-cmd-enter-mac",
action: "message-input.action",
combo: "Cmd+Enter",
when: { mac: true, focusScope: "message-input", commandCenter: false },
payload: { type: "message-input", kind: "queue" },
preventDefault: false,
stopPropagation: false,
help: {
id: "message-input-queue",
section: "agent-input",
label: "Queue message",
keys: ["mod", "Enter"],
},
},
{
id: "message-input-queue-ctrl-enter-non-mac",
action: "message-input.action",
combo: "Ctrl+Enter",
when: { mac: false, focusScope: "message-input", commandCenter: false },
payload: { type: "message-input", kind: "queue" },
preventDefault: false,
stopPropagation: false,
help: {
id: "message-input-queue",
section: "agent-input",
label: "Queue message",
keys: ["mod", "Enter"],
},
},
{
id: "message-input-dictation-confirm-enter",
action: "message-input.action",
@@ -284,15 +284,6 @@ describe("routeKeyboardShortcut — message-input.action", () => {
});
});
it("returns none for unsupported message-input kinds (queue)", () => {
expect(
routeKeyboardShortcut(
{ action: "message-input.action", payload: { kind: "queue" } },
makeCtx(),
),
).toEqual<ShortcutAction>({ kind: "none" });
});
it("returns none when kind is missing", () => {
expect(
routeKeyboardShortcut({ action: "message-input.action", payload: null }, makeCtx()),
@@ -81,7 +81,6 @@ const MESSAGE_INPUT_DISPATCH: Record<
"dictation-confirm": { id: "message-input.dictation-confirm", scope: "message-input" },
"voice-toggle": { id: "message-input.voice-toggle", scope: "message-input" },
"voice-mute-toggle": { id: "message-input.voice-mute-toggle", scope: "message-input" },
queue: null,
};
function hasPayloadKey<K extends "index" | "delta" | "kind">(