@@ -299,6 +299,12 @@ export type AgentEventHandlerOptions = {
299299 clientRunId : string ;
300300 summary : string | undefined ;
301301 } ) => void ;
302+ resolveSessionActiveRunState ?: ( params : {
303+ requestedKey : string ;
304+ canonicalKey : string ;
305+ sessionId ?: string ;
306+ agentId ?: string ;
307+ } ) => { active : boolean ; runIds : string [ ] } ;
302308} ;
303309
304310function roundedChatSendTimingMs ( value : number ) : number {
@@ -324,6 +330,7 @@ export function createAgentEventHandler({
324330 trackTrackedRunTerminalPersistence,
325331 resolveActiveLifecycleGenerationForRun = ( ) => undefined ,
326332 updateRunToolErrorSummary,
333+ resolveSessionActiveRunState,
327334} : AgentEventHandlerOptions ) {
328335 type TerminalLifecycleOptions = {
329336 skipChatErrorFinal ?: boolean ;
@@ -414,6 +421,7 @@ export function createAgentEventHandler({
414421 sessionKey : string ,
415422 evt ?: AgentEventPayload ,
416423 agentId ?: string ,
424+ includeActiveRunState = false ,
417425 ) => {
418426 const row = loadGatewaySessionRowForSnapshot ( sessionKey , agentId ? { agentId } : undefined ) ;
419427 const omitUnscopedGlobalGoal = sessionKey === "global" && ! agentId ;
@@ -437,7 +445,20 @@ export function createAgentEventHandler({
437445 event : evt ,
438446 } )
439447 : { } ;
440- const session = row ? { ...row , ...lifecyclePatch } : undefined ;
448+ const activeRunState = includeActiveRunState
449+ ? resolveSessionActiveRunState ?.( {
450+ requestedKey : sessionKey ,
451+ canonicalKey : row ?. key ?? sessionKey ,
452+ ...( row ?. sessionId ? { sessionId : row . sessionId } : { } ) ,
453+ ...( agentId ? { agentId } : { } ) ,
454+ } )
455+ : undefined ;
456+ // Agent lifecycle broadcasts merge into cached session rows in the UI.
457+ // Always replace run identity so a newer start cannot inherit a completed run.
458+ const activeRunFields = activeRunState
459+ ? { hasActiveRun : activeRunState . active , activeRunIds : activeRunState . runIds }
460+ : { } ;
461+ const session = row ? { ...row , ...lifecyclePatch , ...activeRunFields } : undefined ;
441462 if ( session && omitUnscopedGlobalGoal ) {
442463 delete session . goal ;
443464 }
@@ -490,6 +511,7 @@ export function createAgentEventHandler({
490511 effectiveResponseUsage : row ?. effectiveResponseUsage ,
491512 modelProvider : row ?. modelProvider ,
492513 model : row ?. model ,
514+ ...activeRunFields ,
493515 status : snapshotSource . status ,
494516 startedAt : snapshotSource . startedAt ,
495517 endedAt : snapshotSource . endedAt ,
@@ -715,7 +737,7 @@ export function createAgentEventHandler({
715737 runId : evt . runId ,
716738 ...( eventRunId !== evt . runId ? { clientRunId : eventRunId } : { } ) ,
717739 ts : evt . ts ,
718- ...buildSessionEventSnapshot ( sessionKey , snapshotEvent , sessionAgentId ) ,
740+ ...buildSessionEventSnapshot ( sessionKey , snapshotEvent , sessionAgentId , true ) ,
719741 } ,
720742 sessionEventConnIds ,
721743 { dropIfSlow : true } ,
@@ -1494,7 +1516,7 @@ export function createAgentEventHandler({
14941516 runId : evt . runId ,
14951517 ...( eventRunId !== evt . runId ? { clientRunId : eventRunId } : { } ) ,
14961518 ts : evt . ts ,
1497- ...buildSessionEventSnapshot ( sessionKey , evt , sessionAgentId ) ,
1519+ ...buildSessionEventSnapshot ( sessionKey , evt , sessionAgentId , true ) ,
14981520 } ,
14991521 sessionEventConnIds ,
15001522 { dropIfSlow : true } ,
0 commit comments