From e2f3d7e01326aeb79fb4e5e024b078076f20d9c2 Mon Sep 17 00:00:00 2001 From: Faycal Ben LarbiDelai Date: Wed, 26 Aug 2026 14:52:45 +0100 Subject: [PATCH] fix: settle executeTool failures so sequential tool calls cannot hang the chat A thrown executeToolServer error never invoked the callback, so the UI waited indefinitely. Catch the error and always complete the callback. Co-authored-by: Cursor --- src/routes/+layout.svelte | 101 ++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index cd832fd95a..2717f0db2a 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -495,63 +495,68 @@ }; const executeTool = async (data, cb, chatId) => { - const { toolServer, toolServerData, token } = resolveToolServer(data.server?.url); - const defaultInline = - data?.name === 'display_file' && - data?.params?.path && - data?.params?.inline === undefined && - $settings?.terminalFileDisplay === 'inline' && - isDirectTerminalServer(data.server?.url); - const params = defaultInline ? { ...data.params, inline: true } : data?.params; - const serverParams = data?.name === 'display_file' && params ? { ...params } : params; - if (serverParams && data?.name === 'display_file') { - delete serverParams.page; - } + try { + const { toolServer, toolServerData, token } = resolveToolServer(data.server?.url); + const defaultInline = + data?.name === 'display_file' && + data?.params?.path && + data?.params?.inline === undefined && + $settings?.terminalFileDisplay === 'inline' && + isDirectTerminalServer(data.server?.url); + const params = defaultInline ? { ...data.params, inline: true } : data?.params; + const serverParams = data?.name === 'display_file' && params ? { ...params } : params; + if (serverParams && data?.name === 'display_file') { + delete serverParams.page; + } - console.log('executeTool', data, toolServer); + console.log('executeTool', data, toolServer); - if (toolServer) { - const res = await executeToolServer( - token, - toolServer.url, - data?.name, - serverParams, - toolServerData, - chatId - ); + if (toolServer) { + const res = await executeToolServer( + token, + toolServer.url, + data?.name, + serverParams, + toolServerData, + chatId + ); - console.log('executeToolServer', res); - const result = Array.isArray(res) ? res[0] : res; - const inlineDisplayFile = - data?.name === 'display_file' && params?.path && params?.inline === true; - const output = - inlineDisplayFile && result?.exists !== false - ? Array.isArray(res) - ? [terminalFileResult(result, params, toolServer.url, chatId)] - : terminalFileResult(result, params, toolServer.url, chatId) - : res; + console.log('executeToolServer', res); + const result = Array.isArray(res) ? res[0] : res; + const inlineDisplayFile = + data?.name === 'display_file' && params?.path && params?.inline === true; + const output = + inlineDisplayFile && result?.exists !== false + ? Array.isArray(res) + ? [terminalFileResult(result, params, toolServer.url, chatId)] + : terminalFileResult(result, params, toolServer.url, chatId) + : res; - if (data?.name === 'display_file' && params?.path && !inlineDisplayFile) { - if (result?.exists !== false) { - displayFileHandler( - params.path, - { showControls, showFileNavPath }, - { page: params?.page } - ); + if (data?.name === 'display_file' && params?.path && !inlineDisplayFile) { + if (result?.exists !== false) { + displayFileHandler( + params.path, + { showControls, showFileNavPath }, + { page: params?.page } + ); + } } - } - if (['write_file'].includes(data?.name) && params?.path) { - showFileNavDir.set(result?.path ?? params.path); - } + if (['write_file'].includes(data?.name) && params?.path) { + showFileNavDir.set(result?.path ?? params.path); + } - if (cb) { - cb(structuredClone(output)); - } - } else { - if (cb) { + if (cb) { + cb(structuredClone(output)); + } + } else if (cb) { cb({ error: 'Tool Server Not Found' }); } + } catch (error) { + console.error('executeTool error:', error); + if (cb) { + cb({ error: error?.message ?? 'Tool execution failed' }); + } } };