Skip to content

Commit 23557ee

Browse files
committed
feat: Add "Continue" action for assistant messages
1 parent 017ecee commit 23557ee

File tree

6 files changed

+269
-8
lines changed

6 files changed

+269
-8
lines changed

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
class?: string;
1010
message: DatabaseMessage;
1111
onCopy?: (message: DatabaseMessage) => void;
12+
onContinueAssistantMessage?: (message: DatabaseMessage) => void;
1213
onDelete?: (message: DatabaseMessage) => void;
1314
onEditWithBranching?: (message: DatabaseMessage, newContent: string) => void;
1415
onEditWithReplacement?: (
1516
message: DatabaseMessage,
1617
newContent: string,
1718
shouldBranch: boolean
1819
) => void;
20+
onEditUserMessagePreserveResponses?: (message: DatabaseMessage, newContent: string) => void;
1921
onNavigateToSibling?: (siblingId: string) => void;
2022
onRegenerateWithBranching?: (message: DatabaseMessage) => void;
2123
siblingInfo?: ChatMessageSiblingInfo | null;
@@ -25,9 +27,11 @@
2527
class: className = '',
2628
message,
2729
onCopy,
30+
onContinueAssistantMessage,
2831
onDelete,
2932
onEditWithBranching,
3033
onEditWithReplacement,
34+
onEditUserMessagePreserveResponses,
3135
onNavigateToSibling,
3236
onRegenerateWithBranching,
3337
siblingInfo = null
@@ -109,6 +113,10 @@
109113
onRegenerateWithBranching?.(message);
110114
}
111115
116+
function handleContinue() {
117+
onContinueAssistantMessage?.(message);
118+
}
119+
112120
function handleSaveEdit() {
113121
if (message.role === 'user') {
114122
onEditWithBranching?.(message, editedContent.trim());
@@ -120,6 +128,14 @@
120128
shouldBranchAfterEdit = false;
121129
}
122130
131+
function handleSaveEditOnly() {
132+
if (message.role === 'user') {
133+
onEditUserMessagePreserveResponses?.(message, editedContent.trim());
134+
}
135+
136+
isEditing = false;
137+
}
138+
123139
function handleShowDeleteDialogChange(show: boolean) {
124140
showDeleteDialog = show;
125141
}
@@ -142,6 +158,7 @@
142158
onEditedContentChange={handleEditedContentChange}
143159
{onNavigateToSibling}
144160
onSaveEdit={handleSaveEdit}
161+
onSaveEditOnly={handleSaveEditOnly}
145162
onShowDeleteDialogChange={handleShowDeleteDialogChange}
146163
{showDeleteDialog}
147164
{siblingInfo}
@@ -157,6 +174,7 @@
157174
messageContent={message.content}
158175
onCancelEdit={handleCancelEdit}
159176
onConfirmDelete={handleConfirmDelete}
177+
onContinue={handleContinue}
160178
onCopy={handleCopy}
161179
onDelete={handleDelete}
162180
onEdit={handleEdit}

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageActions.svelte

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { Edit, Copy, RefreshCw, Trash2 } from '@lucide/svelte';
2+
import { Edit, Copy, RefreshCw, Trash2, ArrowRight } from '@lucide/svelte';
33
import { ActionButton, ConfirmationDialog } from '$lib/components/app';
44
import ChatMessageBranchingControls from './ChatMessageBranchingControls.svelte';
55
@@ -18,6 +18,7 @@
1818
onCopy: () => void;
1919
onEdit?: () => void;
2020
onRegenerate?: () => void;
21+
onContinue?: () => void;
2122
onDelete: () => void;
2223
onConfirmDelete: () => void;
2324
onNavigateToSibling?: (siblingId: string) => void;
@@ -31,6 +32,7 @@
3132
onCopy,
3233
onEdit,
3334
onConfirmDelete,
35+
onContinue,
3436
onDelete,
3537
onNavigateToSibling,
3638
onShowDeleteDialogChange,
@@ -69,6 +71,10 @@
6971
<ActionButton icon={RefreshCw} tooltip="Regenerate" onclick={onRegenerate} />
7072
{/if}
7173

74+
{#if role === 'assistant' && onContinue}
75+
<ActionButton icon={ArrowRight} tooltip="Continue" onclick={onContinue} />
76+
{/if}
77+
7278
<ActionButton icon={Trash2} tooltip="Delete" onclick={onDelete} />
7379
</div>
7480
</div>

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
onCancelEdit?: () => void;
3838
onCopy: () => void;
3939
onConfirmDelete: () => void;
40+
onContinue?: () => void;
4041
onDelete: () => void;
4142
onEdit?: () => void;
4243
onEditKeydown?: (event: KeyboardEvent) => void;
@@ -62,6 +63,7 @@
6263
messageContent,
6364
onCancelEdit,
6465
onConfirmDelete,
66+
onContinue,
6567
onCopy,
6668
onDelete,
6769
onEdit,
@@ -233,6 +235,7 @@
233235
{onCopy}
234236
{onEdit}
235237
{onRegenerate}
238+
{onContinue}
236239
{onDelete}
237240
{onConfirmDelete}
238241
{onNavigateToSibling}

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageUser.svelte

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { Check, X } from '@lucide/svelte';
2+
import { Check, X, Send } from '@lucide/svelte';
33
import { Card } from '$lib/components/ui/card';
44
import { Button } from '$lib/components/ui/button';
55
import { ChatAttachmentsList, MarkdownContent } from '$lib/components/app';
@@ -22,6 +22,7 @@
2222
} | null;
2323
onCancelEdit: () => void;
2424
onSaveEdit: () => void;
25+
onSaveEditOnly?: () => void;
2526
onEditKeydown: (event: KeyboardEvent) => void;
2627
onEditedContentChange: (content: string) => void;
2728
onCopy: () => void;
@@ -43,6 +44,7 @@
4344
deletionInfo,
4445
onCancelEdit,
4546
onSaveEdit,
47+
onSaveEditOnly,
4648
onEditKeydown,
4749
onEditedContentChange,
4850
onCopy,
@@ -100,15 +102,26 @@
100102
></textarea>
101103

102104
<div class="mt-2 flex justify-end gap-2">
103-
<Button class="h-8 px-3" onclick={onCancelEdit} size="sm" variant="outline">
105+
<Button class="h-8 px-3" onclick={onCancelEdit} size="sm" variant="ghost">
104106
<X class="mr-1 h-3 w-3" />
105-
106107
Cancel
107108
</Button>
108109

109-
<Button class="h-8 px-3" onclick={onSaveEdit} disabled={!editedContent.trim()} size="sm">
110-
<Check class="mr-1 h-3 w-3" />
110+
{#if onSaveEditOnly}
111+
<Button
112+
class="h-8 px-3"
113+
onclick={onSaveEditOnly}
114+
disabled={!editedContent.trim()}
115+
size="sm"
116+
variant="outline"
117+
>
118+
<Check class="mr-1 h-3 w-3" />
119+
Save
120+
</Button>
121+
{/if}
111122

123+
<Button class="h-8 px-3" onclick={onSaveEdit} disabled={!editedContent.trim()} size="sm">
124+
<Send class="mr-1 h-3 w-3" />
112125
Send
113126
</Button>
114127
</div>

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessages.svelte

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import { DatabaseStore } from '$lib/stores/database';
44
import {
55
activeConversation,
6+
continueAssistantMessage,
67
deleteMessage,
7-
navigateToSibling,
8-
editMessageWithBranching,
98
editAssistantMessage,
9+
editMessageWithBranching,
10+
editUserMessagePreserveResponses,
11+
navigateToSibling,
1012
regenerateMessageWithBranching
1113
} from '$lib/stores/chat.svelte';
1214
import { getMessageSiblings } from '$lib/utils/branching';
@@ -93,6 +95,26 @@
9395
9496
refreshAllMessages();
9597
}
98+
99+
async function handleContinueAssistantMessage(message: DatabaseMessage) {
100+
onUserAction?.();
101+
102+
await continueAssistantMessage(message.id);
103+
104+
refreshAllMessages();
105+
}
106+
107+
async function handleEditUserMessagePreserveResponses(
108+
message: DatabaseMessage,
109+
newContent: string
110+
) {
111+
onUserAction?.();
112+
113+
await editUserMessagePreserveResponses(message.id, newContent);
114+
115+
refreshAllMessages();
116+
}
117+
96118
async function handleDeleteMessage(message: DatabaseMessage) {
97119
await deleteMessage(message.id);
98120
@@ -110,7 +132,9 @@
110132
onNavigateToSibling={handleNavigateToSibling}
111133
onEditWithBranching={handleEditWithBranching}
112134
onEditWithReplacement={handleEditWithReplacement}
135+
onEditUserMessagePreserveResponses={handleEditUserMessagePreserveResponses}
113136
onRegenerateWithBranching={handleRegenerateWithBranching}
137+
onContinueAssistantMessage={handleContinueAssistantMessage}
114138
/>
115139
{/each}
116140
</div>

0 commit comments

Comments
 (0)