@@ -332,7 +332,7 @@ function buildViewItems(events: TimelineEvent[]): ViewItem[] {
332332 || summarizeToolInput ( ( next . payload . detail as any ) ?. input , next . payload . detail ) ;
333333 const input = inputText ? ` ${ inputText } ` : '' ;
334334 const status = next . payload . error ? `✗ ${ String ( next . payload . error ) } ` : '✓' ;
335- const output = ! next . payload . error && next . payload . output ? String ( next . payload . output ) : undefined ;
335+ const output = ! next . payload . error ? formatToolPayloadValue ( next . payload . output ) : undefined ;
336336 consolidated . push ( {
337337 ...ev ,
338338 type : 'tool.call' ,
@@ -1396,7 +1396,7 @@ function ToolCallGroup({
13961396 </ button >
13971397 )
13981398 ) }
1399- { last && < ChatEvent event = { last } onPathClick = { onPathClick } onDownload = { onDownload } serverId = { serverId } /> }
1399+ { last && < ChatEvent event = { last } onPathClick = { onPathClick } onDownload = { onDownload } serverId = { serverId } showTime /> }
14001400 { expanded && middle . length > 0 && (
14011401 < button class = "chat-tool-fold-btn" onClick = { ( ) => setExpanded ( false ) } >
14021402 { t ( 'chat.tool_group_collapse' ) }
@@ -1483,6 +1483,7 @@ const ChatEvent = memo(function ChatEvent({
14831483 onDownload,
14841484 serverId,
14851485 onResendFailed,
1486+ showTime,
14861487} : {
14871488 event : TimelineEvent ;
14881489 nextTs ?: number ;
@@ -1491,6 +1492,7 @@ const ChatEvent = memo(function ChatEvent({
14911492 onDownload ?: ( path : string ) => void ;
14921493 serverId ?: string ;
14931494 onResendFailed ?: ( commandId : string , text : string ) => void ;
1495+ showTime ?: boolean ;
14941496} ) {
14951497 const { t } = useTranslation ( ) ;
14961498 switch ( event . type ) {
@@ -1550,6 +1552,7 @@ const ChatEvent = memo(function ChatEvent({
15501552 case 'tool.call' : {
15511553 const callDetail = event . payload . _callDetail ?? event . payload . detail ;
15521554 const resultDetail = event . payload . _resultDetail ;
1555+ const shouldShowTime = showTime || event . payload . _merged === true ;
15531556 // Fall back to result detail for input — transport SDK tool.call may arrive without input
15541557 const toolInput = summarizeToolInput ( event . payload . input , callDetail )
15551558 || summarizeToolInput ( ( resultDetail as any ) ?. input , resultDetail ) ;
@@ -1560,6 +1563,7 @@ const ChatEvent = memo(function ChatEvent({
15601563 < span class = "chat-tool-icon" > { '>' } </ span >
15611564 < span class = "chat-tool-name" > { String ( event . payload . tool ?? 'tool' ) } </ span >
15621565 { toolInput && < span class = "chat-tool-input" > { ' ' } { splitPathsAndUrls ( toolInput , onPathClick , undefined , onDownload ) } </ span > }
1566+ { shouldShowTime && < span class = "chat-bubble-time" style = { { display : 'inline' , margin : 0 } } > { new Date ( event . ts ) . toLocaleTimeString ( [ ] , { hour : '2-digit' , minute : '2-digit' } ) } </ span > }
15631567 </ div >
15641568 { toolOutput && (
15651569 < div class = "chat-event chat-tool chat-tool-result-preview" >
@@ -1595,6 +1599,7 @@ const ChatEvent = memo(function ChatEvent({
15951599 ) : (
15961600 < span class = "chat-tool-output" > done</ span >
15971601 ) }
1602+ { showTime && < span class = "chat-bubble-time" style = { { display : 'inline' , margin : 0 } } > { new Date ( event . ts ) . toLocaleTimeString ( [ ] , { hour : '2-digit' , minute : '2-digit' } ) } </ span > }
15981603 </ div >
15991604 { detail && (
16001605 < details class = "chat-tool-detail" >
0 commit comments