This commit is contained in:
Timothy Jaeryang Baek 2026-08-23 15:06:30 -04:00
parent 78f48a21ee
commit e623c02acc
4 changed files with 76 additions and 7 deletions

View file

@ -169,7 +169,7 @@ function getInlineFileFromToolOutput(callItem?: OutputItem, resultItem?: OutputI
}
const args = parseJSONStringValue(callItem.arguments) as Record<string, unknown>;
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

View file

@ -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 @@
</p>
</div>
<div>
<div class={settingRowClass}>
<div id="terminal-file-display-label" class={settingLabelClass}>
{$i18n.t('Terminal File Display')}
</div>
<button
aria-labelledby="terminal-file-display-label terminal-file-display-state"
class={actionButtonClass}
on:click={() => {
terminalFileDisplay = terminalFileDisplay === 'inline' ? 'sidebar' : 'inline';
saveSettings({ terminalFileDisplay });
}}
type="button"
>
<span id="terminal-file-display-state">
{terminalFileDisplay === 'inline' ? $i18n.t('Inline') : $i18n.t('Sidebar')}
</span>
</button>
</div>
<p class={settingDescriptionClass}>
{$i18n.t('Choose where terminal display_file results appear by default.')}
</p>
</div>
<div>
<div class={settingRowClass}>
<div id="show-files-on-terminal-select-label" class={settingLabelClass}>

View file

@ -252,6 +252,7 @@ type Settings = {
scrollOnBranchChange?: boolean;
scrollOnResponseGeneration?: boolean;
showFilesOnTerminalSelect?: boolean;
terminalFileDisplay?: 'sidebar' | 'inline';
directConnections?: null;
chatBubble?: boolean;
copyFormatted?: boolean;

View file

@ -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) {