From c20c066cbcffdf2e2278aaf493c8229a04091a04 Mon Sep 17 00:00:00 2001 From: matevip Date: Fri, 15 May 2026 10:19:32 +0800 Subject: [PATCH] feat(ui): global Ctrl+K / Ctrl+N shortcuts with sidebar hint --- mateclaw-ui/src/i18n/locales/en-US.ts | 3 + mateclaw-ui/src/i18n/locales/zh-CN.ts | 3 + mateclaw-ui/src/views/ChatConsole.vue | 7 +- mateclaw-ui/src/views/layout/MainLayout.vue | 76 +++++++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) diff --git a/mateclaw-ui/src/i18n/locales/en-US.ts b/mateclaw-ui/src/i18n/locales/en-US.ts index 4889dac5..a83c29fa 100644 --- a/mateclaw-ui/src/i18n/locales/en-US.ts +++ b/mateclaw-ui/src/i18n/locales/en-US.ts @@ -400,6 +400,9 @@ export default { appearance: 'Appearance & Language', roleUser: 'User', roleAdmin: 'Admin', + shortcutAgents: 'Agents', + shortcutNew: 'New', + shortcutsHint: 'Ctrl+K {agents} | Ctrl+N {newAction}', }, notifications: { pendingApprovals: '{n} tool call(s) pending approval', diff --git a/mateclaw-ui/src/i18n/locales/zh-CN.ts b/mateclaw-ui/src/i18n/locales/zh-CN.ts index 853d957b..4ca1f6e6 100644 --- a/mateclaw-ui/src/i18n/locales/zh-CN.ts +++ b/mateclaw-ui/src/i18n/locales/zh-CN.ts @@ -400,6 +400,9 @@ export default { appearance: '外观与语言', roleUser: '用户', roleAdmin: '管理员', + shortcutAgents: '智能体', + shortcutNew: '新建', + shortcutsHint: 'Ctrl+K {agents} | Ctrl+N {newAction}', }, // Issue #81: provider-level hint / status text shared across chat popup and ModelSelector. provider: { diff --git a/mateclaw-ui/src/views/ChatConsole.vue b/mateclaw-ui/src/views/ChatConsole.vue index 92cbee0c..7480ccdc 100644 --- a/mateclaw-ui/src/views/ChatConsole.vue +++ b/mateclaw-ui/src/views/ChatConsole.vue @@ -1153,7 +1153,7 @@ onMounted(async () => { mediumQuery.addEventListener('change', handleConvMediumChange) await Promise.all([loadAgents(), loadModelState(), loadConversations()]) await hydrateStateFromRoute() - consumeRouteAction() + applyPendingRouteAction() activityPollTimer = window.setInterval(pollActivity, ACTIVITY_POLL_MS) elapsedTickTimer = window.setInterval(() => { if (activeCronRuns.value.length > 0) elapsedNow.value = Date.now() @@ -1186,8 +1186,11 @@ onBeforeUnmount(() => { }) watch(() => route.query, () => { + // If a fresh action arrives (e.g. user re-fires Ctrl+K via the URL while + // the view is already alive), pick it up immediately. + captureRouteAction() + if (pendingRouteAction) applyPendingRouteAction() void hydrateStateFromRoute() - consumeRouteAction() }) watch([selectedAgentId, currentConversationId], () => { diff --git a/mateclaw-ui/src/views/layout/MainLayout.vue b/mateclaw-ui/src/views/layout/MainLayout.vue index 49175a07..bdc3582e 100644 --- a/mateclaw-ui/src/views/layout/MainLayout.vue +++ b/mateclaw-ui/src/views/layout/MainLayout.vue @@ -126,6 +126,14 @@ + +
+ Ctrl+K + {{ t('nav.shortcutAgents') }} + | + Ctrl+N + {{ t('nav.shortcutNew') }} +