feat(app): make the New tab launcher keyboard-first

Cmd/Ctrl+T now opens the focused pane's launcher, while explicit target shortcuts bypass the menu. Dispatcher ownership is scoped to the app tree so retained workspaces cannot intercept commands.
This commit is contained in:
Mohamed Boudra
2026-08-17 21:15:16 +02:00
parent 8655722296
commit 60bafad3ee
38 changed files with 1047 additions and 168 deletions
+6
View File
@@ -497,6 +497,12 @@ describe("translation resources", () => {
expect(en.message.attachments.imagePreviewLoadFailed).toBe("Unable to load image preview.");
expect(en.workspace.tabs.explorer.changes).toBe("Changes");
expect(en.workspace.tabs.explorer.files).toBe("Files");
expect(en.workspace.tabs.actions.maximizePane).toBe("Maximize pane");
expect(en.workspace.tabs.actions.restorePane).toBe("Restore pane");
expect(en.settings.shortcuts.help.toggleExplorerPaneMaximization).toBe(
"Toggle Explorer pane maximization",
);
expect(en.branchSwitcher.triggerTooltip).toBe("Switch workspace branch");
expect(en.branchSwitcher.uncommittedTitle).toBe("Uncommitted changes");
expect(en.branchSwitcher.uncommittedMessage).toBe(
"You have uncommitted changes. Stash them before switching branches?",
+4
View File
@@ -592,6 +592,8 @@ export const ar: TranslationResources = {
preparingTerminal: "إعداد علامة التبويب المحطة الطرفية",
preparingTerminalTooltip: "جارٍ تحضير المحطة...",
newBrowser: "متصفح جديد",
maximizePane: "تكبير الجزء",
restorePane: "استعادة الجزء",
exitFocusMode: "إنهاء وضع التركيز",
splitRight: "تقسيم الجزء الأيمن",
splitDown: "تقسيم الجزء لأسفل",
@@ -1353,6 +1355,7 @@ export const ar: TranslationResources = {
openPath: "فتح المسار",
},
branchSwitcher: {
triggerTooltip: "تبديل فرع مساحة العمل",
currentBranch: "الفرع الحالي:{{branchName}}. اضغط لتبديل الفرع.",
placeholder: "تبديل الفرع...",
searchPlaceholder: "تصفية الفروع...",
@@ -2053,6 +2056,7 @@ export const ar: TranslationResources = {
toggleBothSidebars: "تبديل كلا الشريطين الجانبيين",
toggleSettings: "تبديل الإعدادات",
toggleFocusMode: "تبديل وضع التركيز",
toggleExplorerPaneMaximization: "تبديل تكبير جزء المستكشف",
cycleTheme: "موضوع الدورة",
focusMessageInput: "التركيز على إدخال الرسالة",
cycleAgentMode: "تبديل وضع الوكيل",
+4
View File
@@ -590,6 +590,8 @@ export const en = {
preparingTerminal: "Preparing terminal tab",
preparingTerminalTooltip: "Preparing terminal...",
newBrowser: "New browser",
maximizePane: "Maximize pane",
restorePane: "Restore pane",
exitFocusMode: "Exit focus mode",
splitRight: "Split pane right",
splitDown: "Split pane down",
@@ -1362,6 +1364,7 @@ export const en = {
openPath: "Open path",
},
branchSwitcher: {
triggerTooltip: "Switch workspace branch",
currentBranch: "Current branch: {{branchName}}. Press to switch branch.",
placeholder: "Switch branch...",
searchPlaceholder: "Filter branches...",
@@ -2117,6 +2120,7 @@ export const en = {
toggleBothSidebars: "Toggle both sidebars",
toggleSettings: "Toggle settings",
toggleFocusMode: "Toggle focus mode",
toggleExplorerPaneMaximization: "Toggle Explorer pane maximization",
cycleTheme: "Cycle theme",
focusMessageInput: "Focus message input",
cycleAgentMode: "Cycle agent mode",
+4
View File
@@ -597,6 +597,8 @@ export const es: TranslationResources = {
preparingTerminal: "Preparando la pestaña del terminal",
preparingTerminalTooltip: "Preparando terminal...",
newBrowser: "Nuevo navegador",
maximizePane: "Maximizar panel",
restorePane: "Restaurar panel",
exitFocusMode: "Salir del modo de concentración",
splitRight: "Panel dividido a la derecha",
splitDown: "Dividir panel hacia abajo",
@@ -1393,6 +1395,7 @@ export const es: TranslationResources = {
openPath: "Abrir ruta",
},
branchSwitcher: {
triggerTooltip: "Cambiar rama del espacio de trabajo",
currentBranch: "Sucursal actual:{{branchName}}. Presione para cambiar de rama.",
placeholder: "Cambiar de rama...",
searchPlaceholder: "Filtrar ramas...",
@@ -2101,6 +2104,7 @@ export const es: TranslationResources = {
toggleBothSidebars: "Alternar ambas barras laterales",
toggleSettings: "Alternar configuración",
toggleFocusMode: "Alternar modo de enfoque",
toggleExplorerPaneMaximization: "Alternar maximización del panel Explorador",
cycleTheme: "Tema del ciclo",
focusMessageInput: "Entrada de mensaje de enfoque",
cycleAgentMode: "Alternar modo del agente",
+4
View File
@@ -597,6 +597,8 @@ export const fr: TranslationResources = {
preparingTerminal: "Préparation de l'onglet du terminal",
preparingTerminalTooltip: "Préparation du terminal...",
newBrowser: "Nouveau navigateur",
maximizePane: "Agrandir le volet",
restorePane: "Restaurer le volet",
exitFocusMode: "Quitter le mode concentration",
splitRight: "Volet divisé à droite",
splitDown: "Diviser le volet vers le bas",
@@ -1396,6 +1398,7 @@ export const fr: TranslationResources = {
openPath: "Ouvrir le chemin",
},
branchSwitcher: {
triggerTooltip: "Changer la branche de l’espace de travail",
currentBranch: "Branche actuelle:{{branchName}}. Appuyez pour changer de branche.",
placeholder: "Changer de branche...",
searchPlaceholder: "Filtrer les branches...",
@@ -2105,6 +2108,7 @@ export const fr: TranslationResources = {
toggleBothSidebars: "Basculer les deux barres latérales",
toggleSettings: "Basculer les paramètres",
toggleFocusMode: "Basculer le mode de mise au point",
toggleExplorerPaneMaximization: "Basculer l’agrandissement du volet Explorateur",
cycleTheme: "Thème du cycle",
focusMessageInput: "Saisie du message de focus",
cycleAgentMode: "Parcourir les modes de l'agent",
+4
View File
@@ -597,6 +597,8 @@ export const ja: TranslationResources = {
preparingTerminal: "ターミナルタブを準備中",
preparingTerminalTooltip: "ターミナルを準備中...",
newBrowser: "新しいブラウザ",
maximizePane: "ペインを最大化",
restorePane: "ペインを元に戻す",
exitFocusMode: "フォーカスモードを終了",
splitRight: "右にペインを分割",
splitDown: "下にペインを分割",
@@ -1366,6 +1368,7 @@ export const ja: TranslationResources = {
openPath: "パスを開く",
},
branchSwitcher: {
triggerTooltip: "ワークスペースのブランチを切り替え",
currentBranch: "現在のブランチ: {{branchName}}。押してブランチを切り替えてください。",
placeholder: "ブランチを切り替え...",
searchPlaceholder: "ブランチをフィルタ...",
@@ -2070,6 +2073,7 @@ export const ja: TranslationResources = {
toggleBothSidebars: "両方のサイドバーを切り替え",
toggleSettings: "設定を切り替え",
toggleFocusMode: "フォーカスモードを切り替え",
toggleExplorerPaneMaximization: "エクスプローラーペインの最大化を切り替え",
cycleTheme: "テーマを順に切り替え",
focusMessageInput: "メッセージ入力にフォーカス",
cycleAgentMode: "エージェントモードを順に切り替え",
+4
View File
@@ -594,6 +594,8 @@ export const ko: TranslationResources = {
preparingTerminal: "터미널 탭 준비 중",
preparingTerminalTooltip: "터미널 준비 중...",
newBrowser: "새 브라우저",
maximizePane: "창 최대화",
restorePane: "창 복원",
exitFocusMode: "집중 모드 종료",
splitRight: "창을 오른쪽으로 분할",
splitDown: "창을 아래로 분할",
@@ -1362,6 +1364,7 @@ export const ko: TranslationResources = {
openPath: "경로 열기",
},
branchSwitcher: {
triggerTooltip: "워크스페이스 브랜치 전환",
currentBranch: "현재 브랜치: {{branchName}}. 브랜치를 전환하려면 누르세요.",
placeholder: "브랜치 전환...",
searchPlaceholder: "브랜치 필터...",
@@ -2064,6 +2067,7 @@ export const ko: TranslationResources = {
toggleBothSidebars: "양쪽 사이드바 토글",
toggleSettings: "설정 토글",
toggleFocusMode: "집중 모드 토글",
toggleExplorerPaneMaximization: "탐색기 창 최대화 전환",
cycleTheme: "테마 순환",
focusMessageInput: "메시지 입력란에 포커스",
cycleAgentMode: "에이전트 모드 전환",
+4
View File
@@ -596,6 +596,8 @@ export const ptBR: TranslationResources = {
preparingTerminal: "Preparando aba de terminal",
preparingTerminalTooltip: "Preparando terminal...",
newBrowser: "Novo navegador",
maximizePane: "Maximizar painel",
restorePane: "Restaurar painel",
exitFocusMode: "Sair do modo de foco",
splitRight: "Dividir painel à direita",
splitDown: "Dividir painel abaixo",
@@ -1379,6 +1381,7 @@ export const ptBR: TranslationResources = {
openPath: "Abrir caminho",
},
branchSwitcher: {
triggerTooltip: "Trocar branch do workspace",
currentBranch: "Branch atual: {{branchName}}. Pressione para trocar de branch.",
placeholder: "Trocar branch...",
searchPlaceholder: "Filtrar branches...",
@@ -2084,6 +2087,7 @@ export const ptBR: TranslationResources = {
toggleBothSidebars: "Alternar ambas as barras laterais",
toggleSettings: "Alternar Configurações",
toggleFocusMode: "Alternar modo de foco",
toggleExplorerPaneMaximization: "Alternar maximização do painel Explorador",
cycleTheme: "Alternar tema",
focusMessageInput: "Focar entrada de mensagem",
cycleAgentMode: "Alternar modo do agente",
+4
View File
@@ -596,6 +596,8 @@ export const ru: TranslationResources = {
preparingTerminal: "Подготовка вкладки терминала",
preparingTerminalTooltip: "Подготовка терминала...",
newBrowser: "Новый браузер",
maximizePane: "Развернуть панель",
restorePane: "Восстановить панель",
exitFocusMode: "Выйти из режима фокусировки",
splitRight: "Разделить панель справа",
splitDown: "Разделить панель вниз",
@@ -1382,6 +1384,7 @@ export const ru: TranslationResources = {
openPath: "Открыть путь",
},
branchSwitcher: {
triggerTooltip: "Переключить ветку рабочего пространства",
currentBranch: "Текущая ветка:{{branchName}}. Нажмите, чтобы переключить ветку.",
placeholder: "Сменить ветку...",
searchPlaceholder: "Фильтровать ветки...",
@@ -2092,6 +2095,7 @@ export const ru: TranslationResources = {
toggleBothSidebars: "Переключить обе боковые панели",
toggleSettings: "Переключить настройки",
toggleFocusMode: "Переключить режим фокусировки",
toggleExplorerPaneMaximization: "Переключить разворачивание панели Проводника",
cycleTheme: "Циклическая тема",
focusMessageInput: "Фокус ввода сообщения",
cycleAgentMode: "Переключить режим агента",
+4
View File
@@ -592,6 +592,8 @@ export const zhCN: TranslationResources = {
preparingTerminal: "正在准备 Terminal 标签",
preparingTerminalTooltip: "正在准备 Terminal...",
newBrowser: "新建浏览器",
maximizePane: "最大化窗格",
restorePane: "还原窗格",
exitFocusMode: "退出专注模式",
splitRight: "向右拆分窗格",
splitDown: "向下拆分窗格",
@@ -1336,6 +1338,7 @@ export const zhCN: TranslationResources = {
openPath: "打开路径",
},
branchSwitcher: {
triggerTooltip: "切换工作区分支",
currentBranch: "当前分支:{{branchName}}。按下以切换分支。",
placeholder: "切换分支...",
searchPlaceholder: "筛选分支...",
@@ -2029,6 +2032,7 @@ export const zhCN: TranslationResources = {
toggleBothSidebars: "切换两侧边栏",
toggleSettings: "切换设置",
toggleFocusMode: "切换专注模式",
toggleExplorerPaneMaximization: "切换资源管理器窗格最大化",
cycleTheme: "循环切换主题",
focusMessageInput: "聚焦消息输入框",
cycleAgentMode: "循环切换代理模式",