diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 9fb1bd148e..7edb0b5a7e 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -502,13 +502,14 @@ return; } - await resolveChatMessageToolCall(localStorage.token, $chatId, messageId, callId, 'answer', { + const res = await resolveChatMessageToolCall(localStorage.token, $chatId, messageId, callId, 'answer', { answers, timed_out: timedOut }).catch(async (error) => { toast.error(`${error}`); await loadChat(); }); + onToolCallResolved(res); }; const rejectPendingAskUser = async (messageId, callId) => { @@ -516,7 +517,7 @@ return; } - await resolveChatMessageToolCall( + const res = await resolveChatMessageToolCall( localStorage.token, $chatId, messageId, @@ -526,6 +527,7 @@ toast.error(`${error}`); await loadChat(); }); + onToolCallResolved(res); }; $: pendingAskUser = findPendingAskUser(history); @@ -658,6 +660,13 @@ } }; + const onToolCallResolved = (res) => { + const newTaskIds = res?.task_ids ?? (res?.task_id ? [res.task_id] : []); + if (newTaskIds.length > 0) { + taskIds = [...(taskIds ?? []), ...newTaskIds]; + } + }; + let oldSelectedModelIds = ['']; $: if (!equal(selectedModelIds, oldSelectedModelIds)) { onSelectedModelIdsChange(); @@ -3568,10 +3577,7 @@ await handleOpenAIError(res.error, responseMessage); } else { // Backend returns task_ids (multi-model) or task_id (single model) - const newTaskIds = res.task_ids ?? (res.task_id ? [res.task_id] : []); - if (newTaskIds.length > 0) { - taskIds = [...(taskIds ?? []), ...newTaskIds]; - } + onToolCallResolved(res); // Backend returns chat_id for new chats — set store + URL. // Only update if the user hasn't navigated to a different chat @@ -4287,6 +4293,7 @@ {mergeResponses} {chatActionHandler} {addMessages} + {onToolCallResolved} allowDelete={!(generating || taskIds?.length)} forkHandler={handleForkChat} topPadding={!embedded} diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index 2f4ad5fec9..301aa93c6b 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -40,6 +40,7 @@ export let showMessage: Function = () => {}; export let submitMessage: Function = () => {}; export let addMessages: Function = () => {}; + export let onToolCallResolved: Function = () => {}; export let forkHandler: Function | null = null; export let readOnly = false; @@ -555,6 +556,7 @@ {continueResponse} {mergeResponses} {addMessages} + {onToolCallResolved} {forkHandler} {allowDelete} {triggerScroll} diff --git a/src/lib/components/chat/Messages/ContentRenderer.svelte b/src/lib/components/chat/Messages/ContentRenderer.svelte index 340a43b00b..36e9fc6ae4 100644 --- a/src/lib/components/chat/Messages/ContentRenderer.svelte +++ b/src/lib/components/chat/Messages/ContentRenderer.svelte @@ -93,6 +93,7 @@ export let onSave = (e) => {}; export let onSourceClick = (e) => {}; export let onTaskClick = (e) => {}; + export let onToolCallResolved = (e) => {}; export let onSetInputText = (text) => {}; let contentContainerElement; @@ -299,6 +300,7 @@ {formatMessageContent} {onSourceClick} {onTaskClick} + {onToolCallResolved} {onSave} onUpdate={markdownUpdateHandler} onPreview={previewHandler} @@ -320,6 +322,7 @@ {sourceIds} {onSourceClick} {onTaskClick} + {onToolCallResolved} {onSave} onUpdate={markdownUpdateHandler} onPreview={previewHandler} @@ -340,6 +343,7 @@ {preview} {compactPreview} {done} + {onToolCallResolved} /> {/if} diff --git a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte index 94410eab80..5f0f36babc 100644 --- a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte +++ b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte @@ -54,6 +54,7 @@ export let onTaskClick: Function = () => {}; export let onSourceClick: Function = () => {}; + export let onToolCallResolved: Function = () => {}; const headerComponent = (depth: number) => { return 'h' + depth; @@ -111,13 +112,14 @@ resolvingCallId = callId; try { - await resolveChatMessageToolCall( + const res = await resolveChatMessageToolCall( localStorage.token, chatId, messageId, callId, approved ? 'approve' : 'reject' ); + onToolCallResolved(res); } catch (err) { toast.error(String(err)); } finally { @@ -314,10 +316,11 @@ {preview} {compactPreview} {editCodeBlock} - {onTaskClick} - {sourceIds} - {onSourceClick} - /> + {onTaskClick} + {sourceIds} + {onSourceClick} + {onToolCallResolved} + /> {/if} {:else if token.type === 'list'} diff --git a/src/lib/components/chat/Messages/Message.svelte b/src/lib/components/chat/Messages/Message.svelte index c899c9dccd..9d1bb0672c 100644 --- a/src/lib/components/chat/Messages/Message.svelte +++ b/src/lib/components/chat/Messages/Message.svelte @@ -39,6 +39,7 @@ export let mergeResponses; export let addMessages; + export let onToolCallResolved: Function = () => {}; export let forkHandler: Function | null = null; export let triggerScroll; export let readOnly = false; @@ -107,6 +108,7 @@ {continueResponse} {regenerateResponse} {addMessages} + {onToolCallResolved} {forkHandler} {readOnly} {compactPreview} @@ -135,6 +137,7 @@ {mergeResponses} {triggerScroll} {addMessages} + {onToolCallResolved} {forkHandler} {readOnly} {compactPreview} diff --git a/src/lib/components/chat/Messages/MultiResponseMessages.svelte b/src/lib/components/chat/Messages/MultiResponseMessages.svelte index c52a6de388..d01ba315af 100644 --- a/src/lib/components/chat/Messages/MultiResponseMessages.svelte +++ b/src/lib/components/chat/Messages/MultiResponseMessages.svelte @@ -48,6 +48,7 @@ export let mergeResponses: Function; export let addMessages: Function; + export let onToolCallResolved: Function = () => {}; export let forkHandler: Function | null = null; export let triggerScroll: Function; @@ -328,6 +329,7 @@ groupedMessageIds[selectedModelIdx].messageIds.length - 1; }} {addMessages} + {onToolCallResolved} {forkHandler} {readOnly} {compactPreview} @@ -391,6 +393,7 @@ groupedMessageIds[modelIdx].messageIds.length - 1; }} {addMessages} + {onToolCallResolved} {forkHandler} {readOnly} {compactPreview} diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 9a2963ca68..a493a42a5b 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -160,6 +160,7 @@ export let forkHandler: Function | null = null; export let addMessages: Function; + export let onToolCallResolved: Function = () => {}; export let isLastMessage = true; export let readOnly = false; @@ -835,6 +836,7 @@ onTaskClick={async (e) => { console.log(e); }} + {onToolCallResolved} onSourceClick={async (id) => { console.log(id); diff --git a/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte b/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte index ac85562d7a..434cd34a68 100644 --- a/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte +++ b/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte @@ -33,6 +33,7 @@ export let onTaskClick: any = () => {}; export let onUpdate: any = () => {}; export let onPreview: any = () => {}; + export let onToolCallResolved: any = () => {}; const getDetailTitle = (detailToken: OutputDetailToken): any => detailToken.summary; const getDetailAttributes = (detailToken: OutputDetailToken): any => detailToken.attributes; @@ -45,13 +46,14 @@ resolvingCallId = callId; try { - await resolveChatMessageToolCall( + const res = await resolveChatMessageToolCall( localStorage.token, chatId, messageId, callId, approved ? 'approve' : 'reject' ); + onToolCallResolved(res); } catch (err) { toast.error(String(err)); } finally { @@ -85,6 +87,7 @@ {sourceIds} {onSourceClick} {onTaskClick} + {onToolCallResolved} {onSave} {onUpdate} {onPreview} @@ -139,6 +142,7 @@ {preview} {compactPreview} {editCodeBlock} + {onToolCallResolved} /> @@ -189,10 +193,11 @@ content={detailToken.text} {done} {save} - {preview} - {compactPreview} - {editCodeBlock} - /> + {preview} + {compactPreview} + {editCodeBlock} + {onToolCallResolved} + />