From c414f0c3ce4ddab03663c625940d971f55be3102 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 18 Jul 2025 17:49:24 +0400 Subject: [PATCH] enh: follow up prompts behaviour --- src/lib/components/chat/Chat.svelte | 3 + src/lib/components/chat/Messages.svelte | 3 + .../components/chat/Messages/Message.svelte | 3 + .../Messages/MultiResponseMessages.svelte | 2 + .../chat/Messages/ResponseMessage.svelte | 11 +++- .../components/chat/Settings/Interface.svelte | 62 +++++++++++++++++++ .../components/common/RichTextInput.svelte | 4 ++ 7 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 7b13d74265..6e93052f2b 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2123,6 +2123,9 @@ bind:history bind:autoScroll bind:prompt + setInputText={(text) => { + messageInput?.setText(text); + }} {selectedModels} {atSelectedModel} {sendPrompt} diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index dcc765d883..eb4c71bf2b 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -36,6 +36,8 @@ let messages = []; + export let setInputText: Function = () => {}; + export let sendPrompt: Function; export let continueResponse: Function; export let regenerateResponse: Function; @@ -426,6 +428,7 @@ messageId={message.id} idx={messageIdx} {user} + {setInputText} {gotoMessage} {showPreviousMessage} {showNextMessage} diff --git a/src/lib/components/chat/Messages/Message.svelte b/src/lib/components/chat/Messages/Message.svelte index 8d7896ccb8..7dc7125598 100644 --- a/src/lib/components/chat/Messages/Message.svelte +++ b/src/lib/components/chat/Messages/Message.svelte @@ -21,6 +21,7 @@ export let user; + export let setInputText: Function = () => {}; export let gotoMessage; export let showPreviousMessage; export let showNextMessage; @@ -74,6 +75,7 @@ {selectedModels} isLastMessage={messageId === history.currentId} siblings={history.messages[history.messages[messageId].parentId]?.childrenIds ?? []} + {setInputText} {gotoMessage} {showPreviousMessage} {showNextMessage} @@ -96,6 +98,7 @@ {messageId} {selectedModels} isLastMessage={messageId === history?.currentId} + {setInputText} {updateChat} {editMessage} {saveMessage} diff --git a/src/lib/components/chat/Messages/MultiResponseMessages.svelte b/src/lib/components/chat/Messages/MultiResponseMessages.svelte index 52c430e4d8..3b3dd9b194 100644 --- a/src/lib/components/chat/Messages/MultiResponseMessages.svelte +++ b/src/lib/components/chat/Messages/MultiResponseMessages.svelte @@ -28,6 +28,7 @@ export let isLastMessage; export let readOnly = false; + export let setInputText: Function = () => {}; export let updateChat: Function; export let editMessage: Function; export let saveMessage: Function; @@ -259,6 +260,7 @@ gotoMessage={(message, messageIdx) => gotoMessage(modelIdx, messageIdx)} showPreviousMessage={() => showPreviousMessage(modelIdx)} showNextMessage={() => showNextMessage(modelIdx)} + {setInputText} {updateChat} {editMessage} {saveMessage} diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 014a43a070..5aee1edfcd 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -117,6 +117,7 @@ export let siblings; + export let setInputText: Function = () => {}; export let gotoMessage: Function = () => {}; export let showPreviousMessage: Function; export let showNextMessage: Function; @@ -1464,12 +1465,18 @@ /> {/if} - {#if isLastMessage && message.done && !readOnly && (message?.followUps ?? []).length > 0} + {#if (isLastMessage || ($settings?.keepFollowUpPrompts ?? false)) && message.done && !readOnly && (message?.followUps ?? []).length > 0}
{ - submitMessage(message?.id, prompt); + if ($settings?.insertFollowUpPrompt ?? false) { + // Insert the follow-up prompt into the input box + setInputText(prompt); + } else { + // Submit the follow-up prompt directly + submitMessage(message?.id, prompt); + } }} />
diff --git a/src/lib/components/chat/Settings/Interface.svelte b/src/lib/components/chat/Settings/Interface.svelte index da38f9909c..2b517471a9 100644 --- a/src/lib/components/chat/Settings/Interface.svelte +++ b/src/lib/components/chat/Settings/Interface.svelte @@ -43,6 +43,9 @@ let largeTextAsFile = false; + let keepFollowUpPrompts = false; + let insertFollowUpPrompt = false; + let landingPageMode = ''; let chatBubble = true; let chatDirection: 'LTR' | 'RTL' | 'auto' = 'auto'; @@ -230,6 +233,16 @@ saveSettings({ insertPromptAsRichText }); }; + const toggleKeepFollowUpPrompts = async () => { + keepFollowUpPrompts = !keepFollowUpPrompts; + saveSettings({ keepFollowUpPrompts }); + }; + + const toggleInsertFollowUpPrompt = async () => { + insertFollowUpPrompt = !insertFollowUpPrompt; + saveSettings({ insertFollowUpPrompt }); + }; + const toggleLargeTextAsFile = async () => { largeTextAsFile = !largeTextAsFile; saveSettings({ largeTextAsFile }); @@ -325,6 +338,9 @@ insertPromptAsRichText = $settings?.insertPromptAsRichText ?? false; promptAutocomplete = $settings?.promptAutocomplete ?? false; + keepFollowUpPrompts = $settings?.keepFollowUpPrompts ?? false; + insertFollowUpPrompt = $settings?.insertFollowUpPrompt ?? false; + largeTextAsFile = $settings?.largeTextAsFile ?? false; copyFormatted = $settings?.copyFormatted ?? false; @@ -777,6 +793,52 @@ +
+
+
+ {$i18n.t('Keep Follow-Up Prompts in Chat')} +
+ + +
+
+ +
+
+
+ {$i18n.t('Insert Follow-Up Prompt to Input')} +
+ + +
+
+
diff --git a/src/lib/components/common/RichTextInput.svelte b/src/lib/components/common/RichTextInput.svelte index 01a8aac377..2c46a56770 100644 --- a/src/lib/components/common/RichTextInput.svelte +++ b/src/lib/components/common/RichTextInput.svelte @@ -655,6 +655,10 @@ export const setText = (text: string) => { if (!editor) return; text = text.replaceAll('\n\n', '\n'); + + // reset the editor content + editor.commands.clearContent(); + const { state, view } = editor; const { schema, tr } = state;