@@ -263,9 +263,12 @@ describe("subagent registry steer restarts", () => {
263263
264264 emitLifecycleEnd ( "run-new" ) ;
265265
266- await flushAnnounce ( ) ;
267- expect ( announceSpy ) . toHaveBeenCalledTimes ( 1 ) ;
268- expect ( runSubagentEndedHookMock ) . toHaveBeenCalledTimes ( 1 ) ;
266+ await vi . waitFor ( ( ) => {
267+ expect ( announceSpy ) . toHaveBeenCalledTimes ( 1 ) ;
268+ } ) ;
269+ await vi . waitFor ( ( ) => {
270+ expect ( runSubagentEndedHookMock ) . toHaveBeenCalledTimes ( 1 ) ;
271+ } ) ;
269272 expect ( runSubagentEndedHookMock ) . toHaveBeenCalledWith (
270273 expect . objectContaining ( {
271274 runId : "run-new" ,
@@ -338,63 +341,75 @@ describe("subagent registry steer restarts", () => {
338341 } ) ;
339342 } ) ;
340343
341- it ( "clears announce retry state when replacing after steer restart" , ( ) => {
342- registerRun ( {
343- runId : "run-retry-reset-old" ,
344- childSessionKey : "agent:main:subagent:retry-reset" ,
345- task : "retry reset" ,
346- } ) ;
344+ it ( "clears announce retry state when replacing after steer restart" , async ( ) => {
345+ await withPendingAgentWait ( async ( ) => {
346+ registerRun ( {
347+ runId : "run-retry-reset-old" ,
348+ childSessionKey : "agent:main:subagent:retry-reset" ,
349+ task : "retry reset" ,
350+ } ) ;
347351
348- const previous = listMainRuns ( ) [ 0 ] ;
349- expect ( previous ?. runId ) . toBe ( "run-retry-reset-old" ) ;
350- if ( previous ) {
351- previous . announceRetryCount = 2 ;
352- previous . lastAnnounceRetryAt = Date . now ( ) ;
353- }
352+ const previous = listMainRuns ( ) [ 0 ] ;
353+ expect ( previous ?. runId ) . toBe ( "run-retry-reset-old" ) ;
354+ if ( previous ) {
355+ previous . announceRetryCount = 2 ;
356+ previous . lastAnnounceRetryAt = Date . now ( ) ;
357+ }
354358
355- const run = replaceRunAfterSteer ( {
356- previousRunId : "run-retry-reset-old" ,
357- nextRunId : "run-retry-reset-new" ,
358- fallback : previous ,
359+ const run = replaceRunAfterSteer ( {
360+ previousRunId : "run-retry-reset-old" ,
361+ nextRunId : "run-retry-reset-new" ,
362+ fallback : previous ,
363+ } ) ;
364+ expect ( run . announceRetryCount ) . toBeUndefined ( ) ;
365+ expect ( run . lastAnnounceRetryAt ) . toBeUndefined ( ) ;
359366 } ) ;
360- expect ( run . announceRetryCount ) . toBeUndefined ( ) ;
361- expect ( run . lastAnnounceRetryAt ) . toBeUndefined ( ) ;
362367 } ) ;
363368
364369 it ( "clears terminal lifecycle state when replacing after steer restart" , async ( ) => {
365- registerRun ( {
366- runId : "run-terminal-state-old" ,
367- childSessionKey : "agent:main:subagent:terminal-state" ,
368- task : "terminal state" ,
369- } ) ;
370+ await withPendingAgentWait ( async ( ) => {
371+ registerRun ( {
372+ runId : "run-terminal-state-old" ,
373+ childSessionKey : "agent:main:subagent:terminal-state" ,
374+ task : "terminal state" ,
375+ } ) ;
370376
371- const previous = listMainRuns ( ) [ 0 ] ;
372- expect ( previous ?. runId ) . toBe ( "run-terminal-state-old" ) ;
373- if ( previous ) {
374- previous . endedHookEmittedAt = Date . now ( ) ;
375- previous . endedReason = "subagent-complete" ;
376- previous . endedAt = Date . now ( ) ;
377- previous . outcome = { status : "ok" } ;
378- }
377+ const previous = listMainRuns ( ) [ 0 ] ;
378+ expect ( previous ?. runId ) . toBe ( "run-terminal-state-old" ) ;
379+ if ( previous ) {
380+ previous . endedHookEmittedAt = Date . now ( ) ;
381+ previous . endedReason = "subagent-complete" ;
382+ previous . endedAt = Date . now ( ) ;
383+ previous . outcome = { status : "ok" } ;
384+ }
379385
380- const run = replaceRunAfterSteer ( {
381- previousRunId : "run-terminal-state-old" ,
382- nextRunId : "run-terminal-state-new" ,
383- fallback : previous ,
386+ const run = replaceRunAfterSteer ( {
387+ previousRunId : "run-terminal-state-old" ,
388+ nextRunId : "run-terminal-state-new" ,
389+ fallback : previous ,
390+ } ) ;
391+ expect ( run . endedHookEmittedAt ) . toBeUndefined ( ) ;
392+ expect ( run . endedReason ) . toBeUndefined ( ) ;
393+
394+ emitLifecycleEnd ( "run-terminal-state-new" ) ;
395+
396+ await vi . waitFor ( ( ) => {
397+ expect ( runSubagentEndedHookMock ) . toHaveBeenCalledWith (
398+ expect . objectContaining ( {
399+ runId : "run-terminal-state-new" ,
400+ } ) ,
401+ expect . objectContaining ( {
402+ runId : "run-terminal-state-new" ,
403+ } ) ,
404+ ) ;
405+ } ) ;
406+ expect ( emitSessionLifecycleEventMock ) . toHaveBeenCalledWith (
407+ expect . objectContaining ( {
408+ sessionKey : "agent:main:subagent:terminal-state" ,
409+ reason : "subagent-status" ,
410+ } ) ,
411+ ) ;
384412 } ) ;
385- expect ( run . endedHookEmittedAt ) . toBeUndefined ( ) ;
386- expect ( run . endedReason ) . toBeUndefined ( ) ;
387-
388- emitLifecycleEnd ( "run-terminal-state-new" ) ;
389-
390- await flushAnnounce ( ) ;
391- expect ( runSubagentEndedHookMock ) . not . toHaveBeenCalled ( ) ;
392- expect ( emitSessionLifecycleEventMock ) . toHaveBeenCalledWith (
393- expect . objectContaining ( {
394- sessionKey : "agent:main:subagent:terminal-state" ,
395- reason : "subagent-status" ,
396- } ) ,
397- ) ;
398413 } ) ;
399414
400415 it ( "clears frozen completion fields when replacing after steer restart" , ( ) => {
0 commit comments