@@ -261,13 +261,21 @@ export class DynamicWorkflowMissionControlComponent implements Component {
261261 this . recordActivity ( member . index , 'Started' ) ;
262262 }
263263
264+ private markStartedFromActivity ( member : DynamicWorkflowMember ) : void {
265+ if ( member . phase !== 'pending' && member . phase !== 'queued' ) return ;
266+ member . phase = 'running' ;
267+ member . startedAtMs ??= Date . now ( ) ;
268+ delete member . statusDetail ;
269+ this . recordActivity ( member . index , 'Started' ) ;
270+ }
271+
264272 recordToolCall ( input : {
265273 readonly agentId : string ;
266274 readonly name ?: string ;
267275 } ) : void {
268276 const member = this . findMemberByAgentId ( input . agentId ) ;
269277 if ( member === undefined || isTerminalPhase ( member . phase ) ) return ;
270- this . markStarted ( input . agentId ) ;
278+ this . markStartedFromActivity ( member ) ;
271279 const latest = input . name === undefined ? 'Using a tool' : `Using ${ input . name } ` ;
272280 this . setLatest ( member , latest , true ) ;
273281 // Streamed text that follows starts a new line, never continues this label.
@@ -277,7 +285,7 @@ export class DynamicWorkflowMissionControlComponent implements Component {
277285 appendModelDelta ( input : { readonly agentId : string ; readonly delta : string } ) : void {
278286 const member = this . findMemberByAgentId ( input . agentId ) ;
279287 if ( member === undefined || isTerminalPhase ( member . phase ) || input . delta . length === 0 ) return ;
280- this . markStarted ( input . agentId ) ;
288+ this . markStartedFromActivity ( member ) ;
281289 const combined = `${ member . carry } ${ input . delta } ` ;
282290 // Only the text after the last newline is still being written. A delta that
283291 // ends exactly at a newline leaves nothing pending, so carrying the closed
@@ -926,7 +934,8 @@ function parseDynamicWorkflowResultStatuses(output: string): DynamicWorkflowResu
926934 outcome === 'completed' ||
927935 outcome === 'failed' ||
928936 outcome === 'aborted' ||
929- outcome === 'cancelled'
937+ outcome === 'cancelled' ||
938+ outcome === 'schema_error'
930939 ) {
931940 // Omitted `index` falls back to the lowest free slot so unordered tags
932941 // still render in ascending row order.
@@ -948,7 +957,11 @@ function parseDynamicWorkflowResultStatuses(output: string): DynamicWorkflowResu
948957 index,
949958 agentId : xmlAttribute ( attrs , 'agent_id' ) ,
950959 item : xmlAttribute ( attrs , 'item' ) ,
951- status : outcome === 'aborted' || outcome === 'cancelled' ? 'cancelled' : outcome ,
960+ status : outcome === 'aborted' || outcome === 'cancelled'
961+ ? 'cancelled'
962+ : outcome === 'schema_error'
963+ ? 'failed'
964+ : outcome ,
952965 detail : normalizeText ( decodeXmlEntities ( body ) ) ,
953966 } ) ;
954967 }
0 commit comments