From 88fc8bff220f9671ed3165077ffa6e8f660a15b3 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Fri, 15 May 2026 22:58:46 +0300 Subject: [PATCH] fix: animate tool paths in sorted chat mode Adds animated reveals for file path tool descriptions Keeps sorted mode tool animations working without extra chat gaps Preserves file icons, truncation, and click behavior --- packages/ui/src/components/chat/MessageList.tsx | 8 +++++++- .../chat/message/parts/ProgressiveGroup.tsx | 17 ++++++++++++----- .../components/chat/message/parts/ToolPart.tsx | 16 ++++++++++------ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/components/chat/MessageList.tsx b/packages/ui/src/components/chat/MessageList.tsx index 56bf01de..5a12b3a0 100644 --- a/packages/ui/src/components/chat/MessageList.tsx +++ b/packages/ui/src/components/chat/MessageList.tsx @@ -700,6 +700,7 @@ const TurnBlock = React.memo(({ const isFirstAssistant = assistantIndex === 0; const isLastAssistant = assistantIndex === visibleAssistantMessages.length - 1; const isActivityOwner = Boolean(activityOwnerMessageId) && message.info.id === activityOwnerMessageId; + const hasAnchoredActivitySegment = visibleActivitySegments.some((segment) => segment.anchorMessageId === message.info.id); const shouldAttachFullTurnContext = chatRenderMode === 'sorted' ? isAssistantMessage : (isActivityOwner || isFirstAssistant || isLastAssistant); @@ -722,7 +723,11 @@ const TurnBlock = React.memo(({ activityOwnerMessageId, isFirstAssistantInTurn: isFirstAssistant, isLastAssistantInTurn: isLastAssistant, - isWorking: isLastTurn && sessionIsWorking && message.info.id === streamingAssistantMessageId, + isWorking: isLastTurn && sessionIsWorking && ( + chatRenderMode === 'sorted' + ? hasAnchoredActivitySegment + : message.info.id === streamingAssistantMessageId + ), hasTools: turn.hasTools, hasReasoning: turn.hasReasoning, ...(shouldAttachFullTurnContext ? { @@ -777,6 +782,7 @@ const TurnBlock = React.memo(({ activeStreamingPhase, visibleAssistantMessages, visibleAssistantIds, + visibleActivitySegments, activityOwnerMessageId, shouldAnimateUserMessage, onUserAnimationConsumed, diff --git a/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx b/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx index 7ec819df..6bfacdb8 100644 --- a/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx +++ b/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx @@ -242,18 +242,19 @@ const getRelativePathFromDirectory = (filePath: string, currentDirectory: string return normalizedPath; }; -const renderReadFilePath = (displayPath: string) => { +const renderReadFilePath = (displayPath: string, animate = true) => { const lastSlash = displayPath.lastIndexOf('/'); if (lastSlash === -1) { return ( - {displayPath} - + ); } @@ -277,7 +278,13 @@ const renderReadFilePath = (displayPath: string) => { {displayDir} / - {name} + + {name} + ); }; @@ -682,7 +689,7 @@ const StaticToolRowInner: React.FC<{ title={entry.offset ? `${entry.displayPath}:${entry.offset}` : entry.displayPath} > {showToolFileIcons ? : null} - {renderReadFilePath(entry.displayPath)} + {renderReadFilePath(entry.displayPath, animateTailText)} )) : null} diff --git a/packages/ui/src/components/chat/message/parts/ToolPart.tsx b/packages/ui/src/components/chat/message/parts/ToolPart.tsx index d74f6d70..77274067 100644 --- a/packages/ui/src/components/chat/message/parts/ToolPart.tsx +++ b/packages/ui/src/components/chat/message/parts/ToolPart.tsx @@ -1359,20 +1359,20 @@ const renderPathLikeGitChanges = (path: string, grow = true) => { ); }; -const renderAnimatedPathWithIcon = (path: string, _animate = true, grow = true, showFileIcons = true) => { - void _animate; +const renderAnimatedPathWithIcon = (path: string, animate = true, grow = true, showFileIcons = true) => { const lastSlash = path.lastIndexOf('/'); if (lastSlash === -1) { return ( {showFileIcons ? : null} - {path} - + ); } @@ -1399,9 +1399,13 @@ const renderAnimatedPathWithIcon = (path: string, _animate = true, grow = true, {displayDir} / - + {name} - + );