diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz
index c5b9166a30..e59d8a2470 100644
Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ
diff --git a/tools/server/webui/src/lib/components/app/misc/KeyboardShortcutInfo.svelte b/tools/server/webui/src/lib/components/app/misc/KeyboardShortcutInfo.svelte
index 5b7522fe1b..bffbf7945f 100644
--- a/tools/server/webui/src/lib/components/app/misc/KeyboardShortcutInfo.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/KeyboardShortcutInfo.svelte
@@ -17,9 +17,11 @@
{#each keys as key, index (index)}
{#if key === 'shift'}
-
+
{:else if key === 'cmd'}
⌘
+ {:else if key === 'ctrl'}
+ Ctrl
{:else}
{key.toUpperCase()}
{/if}
diff --git a/tools/server/webui/src/lib/components/app/notebook/NotebookScreen.svelte b/tools/server/webui/src/lib/components/app/notebook/NotebookScreen.svelte
index 932172e58a..4b0b32d9f2 100644
--- a/tools/server/webui/src/lib/components/app/notebook/NotebookScreen.svelte
+++ b/tools/server/webui/src/lib/components/app/notebook/NotebookScreen.svelte
@@ -5,7 +5,7 @@
import { Play, Square, Settings, Undo, Redo } from '@lucide/svelte';
import { config } from '$lib/stores/settings.svelte';
import DialogChatSettings from '$lib/components/app/dialogs/DialogChatSettings.svelte';
- import { ModelsSelector, ChatMessageStatistics, DialogChatError } from '$lib/components/app';
+ import { ChatMessageStatistics, DialogChatError, KeyboardShortcutInfo, ModelsSelector } from '$lib/components/app';
import { useModelChangeValidation } from '$lib/hooks/use-model-change-validation.svelte';
import { modelsStore, modelOptions, selectedModelId } from '$lib/stores/models.svelte';
import { isRouterMode } from '$lib/stores/server.svelte';
@@ -203,9 +203,36 @@
event.returnValue = '';
}
}
+
+ function handleKeydown(event: KeyboardEvent) {
+ const isCtrlOrCmd = event.ctrlKey || event.metaKey;
+
+ if (event.shiftKey && event.key === 'Enter') {
+ event.preventDefault();
+ if (notebookStore.isGenerating) {
+ handleStop();
+ } else if (canGenerate) {
+ handleGenerate();
+ }
+ }
+
+ if (isCtrlOrCmd && event.key === 'z') {
+ event.preventDefault();
+ if (canUndo) {
+ handleUndo();
+ }
+ }
+
+ if (isCtrlOrCmd && event.key === 'y') {
+ event.preventDefault();
+ if (canRedo) {
+ handleRedo();
+ }
+ }
+ }
-
+