@@ -117,10 +117,8 @@ export function deriveMessagesTimelineRows(input: {
117117 revertTurnCountByUserMessageId : ReadonlyMap < MessageId , number > ;
118118} ) : MessagesTimelineRow [ ] {
119119 const nextRows : MessagesTimelineRow [ ] = [ ] ;
120- const durationStartByMessageId = computeMessageDurationStart (
121- input . timelineEntries . flatMap ( ( entry ) => ( entry . kind === "message" ? [ entry . message ] : [ ] ) ) ,
122- ) ;
123120 const terminalAssistantMessageIds = deriveTerminalAssistantMessageIds ( input . timelineEntries ) ;
121+ let lastDurationBoundary : string | null = null ;
124122
125123 for ( let index = 0 ; index < input . timelineEntries . length ; index += 1 ) {
126124 const timelineEntry = input . timelineEntries [ index ] ;
@@ -157,31 +155,34 @@ export function deriveMessagesTimelineRows(input: {
157155 continue ;
158156 }
159157
158+ const message = timelineEntry . message ;
159+ if ( message . role === "user" ) {
160+ lastDurationBoundary = message . createdAt ;
161+ }
162+ const durationStart = lastDurationBoundary ?? message . createdAt ;
163+ const isTerminalAssistant =
164+ message . role === "assistant" && terminalAssistantMessageIds . has ( message . id ) ;
165+
160166 nextRows . push ( {
161167 kind : "message" ,
162168 id : timelineEntry . id ,
163169 createdAt : timelineEntry . createdAt ,
164- message : timelineEntry . message ,
165- durationStart :
166- durationStartByMessageId . get ( timelineEntry . message . id ) ?? timelineEntry . message . createdAt ,
170+ message,
171+ durationStart,
167172 showCompletionDivider :
168- timelineEntry . message . role === "assistant" &&
169- input . completionDividerBeforeEntryId === timelineEntry . id ,
170- showAssistantCopyButton :
171- timelineEntry . message . role === "assistant" &&
172- terminalAssistantMessageIds . has ( timelineEntry . message . id ) ,
173- showAssistantTerminalMetadata :
174- timelineEntry . message . role === "assistant" &&
175- terminalAssistantMessageIds . has ( timelineEntry . message . id ) ,
173+ message . role === "assistant" && input . completionDividerBeforeEntryId === timelineEntry . id ,
174+ showAssistantCopyButton : isTerminalAssistant ,
175+ showAssistantTerminalMetadata : isTerminalAssistant ,
176176 assistantTurnDiffSummary :
177- timelineEntry . message . role === "assistant"
178- ? input . turnDiffSummaryByAssistantMessageId . get ( timelineEntry . message . id )
177+ message . role === "assistant"
178+ ? input . turnDiffSummaryByAssistantMessageId . get ( message . id )
179179 : undefined ,
180180 revertTurnCount :
181- timelineEntry . message . role === "user"
182- ? input . revertTurnCountByUserMessageId . get ( timelineEntry . message . id )
183- : undefined ,
181+ message . role === "user" ? input . revertTurnCountByUserMessageId . get ( message . id ) : undefined ,
184182 } ) ;
183+ if ( message . role === "assistant" && message . completedAt ) {
184+ lastDurationBoundary = message . completedAt ;
185+ }
185186 }
186187
187188 if ( input . isWorking ) {
0 commit comments