From 710f6dc417ebf303eede3df3605a6938482d83ab Mon Sep 17 00:00:00 2001 From: maria Date: Thu, 3 Sep 2026 22:35:24 -0400 Subject: [PATCH] fix(web): simplify expanded tool details (#9549) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> --- .../src/components/chat/MessagesTimeline.tsx | 92 +++++++++++++------ 1 file changed, 65 insertions(+), 27 deletions(-) diff --git a/apps/web/src/components/chat/MessagesTimeline.tsx b/apps/web/src/components/chat/MessagesTimeline.tsx index 04e33914b623e4f293d055807915cf3471dadcef..cdca3328eb69849a6aeafb29c50d7b73878ded3b 100644 --- a/apps/web/src/components/chat/MessagesTimeline.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.tsx @@ -2886,27 +2886,47 @@ function workEntryRawCommand( function buildToolCallExpandedBody( workEntry: TimelineWorkEntry, workspaceRoot: string | undefined, + visibleLabel: string, + viewedImagePath: string | null, ): string | null { const blocks: string[] = []; + const seen = new Set(); + const addBlock = (value: string | null | undefined) => { + const text = value?.trim(); + if (!text || seen.has(text)) return; + seen.add(text); + blocks.push(text); + }; if (workEntry.itemType === "mcp_tool_call" && workEntry.toolData !== undefined) { - blocks.push(`MCP call\n${JSON.stringify(workEntry.toolData, null, 2)}`); + addBlock(`MCP call\n${JSON.stringify(workEntry.toolData, null, 2)}`); } + const command = workEntry.command?.trim(); const raw = workEntryRawCommand(workEntry); - if (raw?.trim()) { - blocks.push(raw.trim()); - } else if (workEntry.command?.trim()) { - blocks.push(workEntry.command.trim()); + if (command === visibleLabel.trim()) { + seen.add(command); + } else { + addBlock(raw ?? command); } - if (workEntry.detail?.trim()) { - blocks.push(workEntry.detail.trim()); + const detail = workEntry.detail?.trim(); + if (detail !== viewedImagePath?.trim()) { + addBlock(detail); } - const changedFiles = workEntry.changedFiles ?? []; + const viewedImagePaths = new Set( + viewedImagePath + ? [viewedImagePath.trim(), formatWorkspaceRelativePath(viewedImagePath, workspaceRoot)] + : [], + ); + const changedFiles = (workEntry.changedFiles ?? []).flatMap((filePath) => { + const formattedPath = formatWorkspaceRelativePath(filePath, workspaceRoot); + return viewedImagePaths.has(filePath) || + viewedImagePaths.has(formattedPath) || + filePath.trim() === detail || + formattedPath === detail + ? [] + : [formattedPath]; + }); if (changedFiles.length > 0) { - blocks.push( - changedFiles - .map((filePath) => formatWorkspaceRelativePath(filePath, workspaceRoot)) - .join("\n"), - ); + addBlock([...new Set(changedFiles)].join("\n")); } return blocks.length > 0 ? blocks.join("\n\n") : null; } @@ -3092,19 +3112,7 @@ const PlainWorkEntryRow = memo(function PlainWorkEntryRow(props: { ? "circle-alert" : workEntryIconName(workEntry); const previewText = displayLabel ?? workEntryDisplayLabel(workEntry, workspaceRoot); - const displayText = - !toolPresentation && expanded && workEntry.command?.trim() ? "Command" : previewText; const viewedImagePath = workEntryViewedImagePath(workEntry); - const canExpand = - (workEntry.itemType === "mcp_tool_call" && workEntry.toolData !== undefined) || - Boolean( - workEntryRawCommand(workEntry) || - workEntry.command?.trim() || - workEntry.detail?.trim() || - workEntry.changedFiles?.length || - viewedImagePath, - ); - const expandedBody = expanded ? buildToolCallExpandedBody(workEntry, workspaceRoot) : null; const viewedImage = viewedImagePath && threadRef ? resolveViewedImageAsset(viewedImagePath, { @@ -3112,6 +3120,24 @@ const PlainWorkEntryRow = memo(function PlainWorkEntryRow(props: { workspaceRoot, }) : null; + const commandMatchesVisibleLabel = workEntry.command?.trim() === previewText.trim(); + const canExpand = + (workEntry.itemType === "mcp_tool_call" && workEntry.toolData !== undefined) || + Boolean( + (!commandMatchesVisibleLabel && + (workEntryRawCommand(workEntry) || workEntry.command?.trim())) || + workEntry.detail?.trim() || + workEntry.changedFiles?.length || + viewedImage, + ); + const expandedBody = expanded + ? buildToolCallExpandedBody( + workEntry, + workspaceRoot, + previewText, + viewedImage ? viewedImagePath : null, + ) + : null; const showDestructiveRowStyle = showFailedIndicator && (workEntrySignalsSevereFailure(workEntry) || !workLogEntryIsToolLike(workEntry)); @@ -3183,7 +3209,19 @@ const PlainWorkEntryRow = memo(function PlainWorkEntryRow(props: {

- {displayText} + + {previewText} +

{showFailedIndicator && hasSpecialToolIcon ? ( @@ -3224,7 +3262,7 @@ const PlainWorkEntryRow = memo(function PlainWorkEntryRow(props: { ) : null} {expanded && canExpand && expandedBody ? (
-- 2.54.0