From e623c02acc70c4ee5d7f2eb2f32d9b7f39287663 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 23 Aug 2026 15:06:30 -0400 Subject: [PATCH] refac --- .../chat/Messages/structuredOutput.ts | 3 +- .../common/InterfaceSettings.svelte | 27 ++++++++++ src/lib/stores/index.ts | 1 + src/routes/+layout.svelte | 52 ++++++++++++++++--- 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/lib/components/chat/Messages/structuredOutput.ts b/src/lib/components/chat/Messages/structuredOutput.ts index 177c02ffbf..317bed19f7 100644 --- a/src/lib/components/chat/Messages/structuredOutput.ts +++ b/src/lib/components/chat/Messages/structuredOutput.ts @@ -169,7 +169,7 @@ function getInlineFileFromToolOutput(callItem?: OutputItem, resultItem?: OutputI } const args = parseJSONStringValue(callItem.arguments) as Record; - if (!args || typeof args !== 'object' || args.inline !== true) { + if (!args || typeof args !== 'object') { return null; } @@ -179,6 +179,7 @@ function getInlineFileFromToolOutput(callItem?: OutputItem, resultItem?: OutputI typeof result !== 'object' || result.type !== 'file' || result.source !== 'open_terminal' || + result.displayed !== true || result.exists === false || !result.path || !result.terminal_selector diff --git a/src/lib/components/common/InterfaceSettings.svelte b/src/lib/components/common/InterfaceSettings.svelte index 72c7066b9f..fa12437e44 100644 --- a/src/lib/components/common/InterfaceSettings.svelte +++ b/src/lib/components/common/InterfaceSettings.svelte @@ -37,6 +37,7 @@ let scrollOnBranchChange = true; let scrollOnResponseGeneration = true; let showFilesOnTerminalSelect = true; + let terminalFileDisplay: 'sidebar' | 'inline' = 'sidebar'; let userLocation = false; // Interface @@ -298,6 +299,7 @@ scrollOnBranchChange = currentSettings?.scrollOnBranchChange ?? true; scrollOnResponseGeneration = currentSettings?.scrollOnResponseGeneration ?? true; showFilesOnTerminalSelect = currentSettings?.showFilesOnTerminalSelect ?? true; + terminalFileDisplay = currentSettings?.terminalFileDisplay === 'inline' ? 'inline' : 'sidebar'; temporaryChatByDefault = currentSettings?.temporaryChatByDefault ?? false; chatDirection = currentSettings?.chatDirection ?? 'auto'; @@ -1257,6 +1259,31 @@

+
+
+
+ {$i18n.t('Terminal File Display')} +
+ + +
+

+ {$i18n.t('Choose where terminal display_file results appear by default.')} +

+
+
diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index cace9cf239..c9ba439021 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -252,6 +252,7 @@ type Settings = { scrollOnBranchChange?: boolean; scrollOnResponseGeneration?: boolean; showFilesOnTerminalSelect?: boolean; + terminalFileDisplay?: 'sidebar' | 'inline'; directConnections?: null; chatBubble?: boolean; copyFormatted?: boolean; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index cb0591ed50..727d0fbca4 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -459,8 +459,41 @@ return { toolServer, toolServerData, token }; }; + const isDirectTerminalServer = (serverUrl) => + !!serverUrl && + (($settings?.terminalServers ?? []).some((server) => server.url === serverUrl) || + ($terminalServers ?? []).some((server) => !server.id && server.url === serverUrl)); + + const terminalFileResult = (result, params, serverUrl, chatId) => { + const path = result?.path ?? params?.path; + const name = result?.name ?? String(path ?? '').split('/').filter(Boolean).at(-1) ?? 'file'; + const contentType = result?.content_type ?? result?.mime_type ?? 'application/octet-stream'; + + return { + ...(result ?? {}), + type: 'file', + source: 'open_terminal', + displayed: true, + terminal_selector: serverUrl, + terminal_url: serverUrl, + session_id: chatId, + path, + full_path: result?.full_path ?? path, + name, + mime_type: contentType, + content_type: contentType + }; + }; + 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; console.log('executeTool', data, toolServer); @@ -469,26 +502,33 @@ token, toolServer.url, data?.name, - data?.params, + params, 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; - if (data?.name === 'display_file' && data?.params?.path && data?.params?.inline !== true) { + if (data?.name === 'display_file' && params?.path && !inlineDisplayFile) { if (result?.exists !== false) { - displayFileHandler(data.params.path, { showControls, showFileNavPath }); + displayFileHandler(params.path, { showControls, showFileNavPath }); } } - if (['write_file'].includes(data?.name) && data?.params?.path) { - showFileNavDir.set(result?.path ?? data.params.path); + if (['write_file'].includes(data?.name) && params?.path) { + showFileNavDir.set(result?.path ?? params.path); } if (cb) { - cb(structuredClone(res)); + cb(structuredClone(output)); } } else { if (cb) {