@@ -21,7 +21,7 @@ function renderText(component: DynamicWorkflowMissionControlComponent, width = 1
2121}
2222
2323/** Lifecycle progress glyph and label for a running row. */
24- const RUNNING_CELL = / [ ○ ◔ ◑ ◕ ] \s + R U N / u;
24+ const RUNNING_CELL = / [ ◜ ◝ ◞ ◟ ] \s + R U N / u;
2525
2626/** Head of a task cell that lost the preamble every row shared. */
2727const TASK_ELISION_MARK = '…' ;
@@ -143,7 +143,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
143143 } ) ;
144144 expect ( component . applyResult ( result ) ) . toBe ( true ) ;
145145 expect ( memberLine ( renderText ( component , 120 ) , 1 ) ) . toMatch ( / × \s + F A I L \s + S c h e m a w o r k / u) ;
146- expect ( memberLine ( renderText ( component , 120 ) , 2 ) ) . toMatch ( / ● \s + D O N E \s + N o r m a l w o r k / u) ;
146+ expect ( memberLine ( renderText ( component , 120 ) , 2 ) ) . toMatch ( / ✓ \s + D O N E \s + N o r m a l w o r k / u) ;
147147 } ) ;
148148
149149 it ( 'ignores blank items so no phantom row waits forever' , ( ) => {
@@ -160,8 +160,8 @@ describe('DynamicWorkflowMissionControlComponent', () => {
160160 component . markCompleted ( 'agent-2' , 'Done two' ) ;
161161
162162 const output = renderText ( component , 120 ) ;
163- expect ( memberLine ( output , 1 ) ) . toContain ( '● DONE' ) ;
164- expect ( memberLine ( output , 2 ) ) . toContain ( '● DONE' ) ;
163+ expect ( memberLine ( output , 1 ) ) . toContain ( '✓ DONE' ) ;
164+ expect ( memberLine ( output , 2 ) ) . toContain ( '✓ DONE' ) ;
165165 // memberRowCount also counts activity lines, so assert the row's absence.
166166 expect ( ( ) => memberLine ( output , 3 ) ) . toThrow ( / M i s s i n g D y n a m i c W o r k f l o w m e m b e r 0 0 3 / u) ;
167167 expect ( aggregateLine ( output ) ) . toContain ( '2/2 complete' ) ;
@@ -192,7 +192,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
192192 expect ( component . applyResult ( result ) ) . toBe ( true ) ;
193193
194194 const output = renderText ( component , 120 ) ;
195- expect ( memberLine ( output , 1 ) ) . toContain ( '● DONE' ) ;
195+ expect ( memberLine ( output , 1 ) ) . toContain ( '✓ DONE' ) ;
196196 expect ( output ) . not . toContain ( 'Unsupported' ) ;
197197 } ) ;
198198
@@ -243,7 +243,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
243243 expect ( component . applyResult ( result ) ) . toBe ( true ) ;
244244
245245 const output = renderText ( component , 120 ) ;
246- expect ( memberLine ( output , 1 ) ) . toContain ( '● DONE' ) ;
246+ expect ( memberLine ( output , 1 ) ) . toContain ( '✓ DONE' ) ;
247247 expect ( output ) . toContain ( 'Accepted result' ) ;
248248 expect ( output ) . not . toContain ( 'Out-of-range result' ) ;
249249 expect ( output ) . not . toContain ( 'Duplicate result' ) ;
@@ -321,8 +321,8 @@ describe('DynamicWorkflowMissionControlComponent', () => {
321321 expect ( aggregateLine ( output ) ) . toContain ( '2/3 complete' ) ;
322322 expect ( aggregateLine ( output ) ) . not . toMatch ( / \b \d + % / u) ;
323323 expect ( aggregateLine ( output ) ) . not . toContain ( '━' ) ;
324- expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ○ ◔ ◑ ◕ ] \s + R U N \s + L a y o u t h i e r a r c h y / u) ;
325- expect ( memberLine ( output , 2 ) ) . toMatch ( / ● \s + D O N E \s + I n t e r a c t i o n a u d i t / u) ;
324+ expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ◜ ◝ ◞ ◟ ] \s + R U N \s + L a y o u t h i e r a r c h y / u) ;
325+ expect ( memberLine ( output , 2 ) ) . toMatch ( / ✓ \s + D O N E \s + I n t e r a c t i o n a u d i t / u) ;
326326 expect ( output ) . not . toMatch ( / [ ⣿ ⣷ ⣯ ⣟ ⡿ ⢿ ⣻ ⣽ ] { 4 , } / u) ;
327327 } ) ;
328328
@@ -408,11 +408,11 @@ describe('DynamicWorkflowMissionControlComponent', () => {
408408 } ;
409409
410410 const first = colouredMemberLine ( ) ;
411- vi . setSystemTime ( BRAILLE_SPINNER_INTERVAL_MS * 2 ) ;
411+ vi . setSystemTime ( 120 ) ;
412412 const second = colouredMemberLine ( ) ;
413413
414- expect ( first ) . toContain ( chalk . hex ( darkColors . primary ) ( '○ ' ) ) ;
415- expect ( second ) . toContain ( chalk . hex ( darkColors . primary ) ( '◔ ' ) ) ;
414+ expect ( first ) . toContain ( chalk . hex ( darkColors . primary ) ( '◜ ' ) ) ;
415+ expect ( second ) . toContain ( chalk . hex ( darkColors . primary ) ( '◝ ' ) ) ;
416416 expect ( first ) . toContain ( chalk . hex ( darkColors . primary ) ( 'RUN' ) ) ;
417417 vi . setSystemTime ( BRAILLE_SPINNER_INTERVAL_MS ) ;
418418
@@ -439,7 +439,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
439439
440440 const output = renderText ( component , 120 ) ;
441441 expect ( output ) . toContain ( '– Cancelled' ) ;
442- expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ○ ◔ ◑ ◕ ] \s + R U N \s + R u n n i n g w o r k / u) ;
442+ expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ◜ ◝ ◞ ◟ ] \s + R U N \s + R u n n i n g w o r k / u) ;
443443 expect ( memberLine ( output , 2 ) ) . toMatch ( / ○ \s + W A I T \s + Q u e u e d w o r k / u) ;
444444 expect ( output ) . not . toContain ( '– STOP' ) ;
445445 expect ( output ) . not . toContain ( '⠋ Orchestrating' ) ;
@@ -454,7 +454,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
454454 component . markFailed ( 'agent-1' , 'Late failure' ) ;
455455
456456 const output = renderText ( component , 100 ) ;
457- expect ( memberLine ( output , 1 ) ) . toMatch ( / ● \s + D O N E \s + L a y o u t h i e r a r c h y / u) ;
457+ expect ( memberLine ( output , 1 ) ) . toMatch ( / ✓ \s + D O N E \s + L a y o u t h i e r a r c h y / u) ;
458458 expect ( output ) . toContain ( 'Finished first' ) ;
459459 expect ( output ) . not . toContain ( 'Late failure' ) ;
460460 } ) ;
@@ -474,7 +474,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
474474 ] . join ( '\n' ) ) ;
475475
476476 const output = renderText ( component , 120 ) ;
477- expect ( memberLine ( output , 1 ) ) . toMatch ( / ● \s + D O N E \s + O b s e r v e d f i r s t / u) ;
477+ expect ( memberLine ( output , 1 ) ) . toMatch ( / ✓ \s + D O N E \s + O b s e r v e d f i r s t / u) ;
478478 expect ( output ) . toContain ( 'Observed completion' ) ;
479479 expect ( output ) . not . toContain ( 'Late result failure' ) ;
480480 expect ( memberLine ( output , 2 ) ) . toMatch ( / × \s + F A I L \s + R e s u l t - o n l y s e c o n d / u) ;
@@ -495,7 +495,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
495495
496496 const output = renderText ( component , 120 ) ;
497497 expect ( aggregateLine ( output ) ) . toContain ( '1/1 complete' ) ;
498- expect ( memberLine ( output , 1 ) ) . toContain ( '● DONE' ) ;
498+ expect ( memberLine ( output , 1 ) ) . toContain ( '✓ DONE' ) ;
499499 expect ( output ) . not . toContain ( '002' ) ;
500500 expect ( output ) . not . toContain ( 'Phantom failure' ) ;
501501 expect ( output ) . not . toMatch ( / \d + % / u) ;
@@ -515,7 +515,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
515515 expect ( renderText ( component , 100 ) ) . toContain ( 'Rate limited' ) ;
516516
517517 component . markStarted ( 'agent-1' ) ;
518- expect ( memberLine ( renderText ( component , 100 ) , 1 ) ) . toMatch ( / [ ○ ◔ ◑ ◕ ] \s + R U N / u) ;
518+ expect ( memberLine ( renderText ( component , 100 ) , 1 ) ) . toMatch ( / [ ◜ ◝ ◞ ◟ ] \s + R U N / u) ;
519519 } ) ;
520520
521521 it ( 'prefers a suspension detail over stale model progress in the member row' , ( ) => {
@@ -602,7 +602,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
602602 component . markCancelled ( 'agent-6' ) ;
603603
604604 const output = renderText ( component , 140 ) ;
605- for ( const token of [ '○ WAIT' , '◑ HOLD' , '● DONE' , '× FAIL' , '– STOP' ] ) {
605+ for ( const token of [ '○ WAIT' , '◑ HOLD' , '✓ DONE' , '× FAIL' , '– STOP' ] ) {
606606 expect ( output ) . toContain ( token ) ;
607607 }
608608 // Running is the one animated phase, so its symbol varies by frame.
@@ -644,12 +644,12 @@ describe('DynamicWorkflowMissionControlComponent', () => {
644644 const running = renderText ( component , 100 ) ;
645645 expect ( running ) . toContain ( 'PROGRESS' ) ;
646646 expect ( running ) . not . toContain ( 'WORK IDLE' ) ;
647- expect ( memberLine ( running , 1 ) ) . toMatch ( / ○ \s + R U N \s + L i v e w o r k / u) ;
647+ expect ( memberLine ( running , 1 ) ) . toMatch ( / ◜ \s + R U N \s + L i v e w o r k / u) ;
648648 expect ( memberLine ( running , 2 ) ) . toMatch ( / ○ \s + W A I T \s + Q u e u e d w o r k / u) ;
649649 expect ( running ) . not . toMatch ( / \b \d + % | ⚒ | ━ / u) ;
650650 } ) ;
651651
652- it ( 'fills the running circle from the shared workflow clock and freezes completion' , ( ) => {
652+ it ( 'rotates the running arc from the shared workflow clock and freezes completion' , ( ) => {
653653 vi . useFakeTimers ( ) ;
654654 vi . setSystemTime ( 0 ) ;
655655 const previousLevel = chalk . level ;
@@ -664,16 +664,17 @@ describe('DynamicWorkflowMissionControlComponent', () => {
664664 component . registerSubagent ( { agentId : 'agent-1' } ) ;
665665 component . markStarted ( 'agent-1' ) ;
666666
667- for ( const [ time , glyph ] of [ [ 0 , '○ ' ] , [ 160 , '◔ ' ] , [ 320 , '◑ ' ] , [ 480 , '◕ ' ] ] as const ) {
667+ for ( const [ time , glyph ] of [ [ 0 , '◜ ' ] , [ 120 , '◝ ' ] , [ 240 , '◞ ' ] , [ 360 , '◟ ' ] ] as const ) {
668668 vi . setSystemTime ( time ) ;
669- expect ( memberLine ( renderText ( component , 100 ) , 1 ) ) . toContain ( glyph ) ;
669+ const line = component . render ( 100 ) . find ( ( candidate ) => strip ( candidate ) . includes ( '001' ) ) ;
670+ expect ( line ) . toContain ( chalk . hex ( darkColors . primary ) ( glyph ) ) ;
670671 }
671672
672673 component . markCompleted ( 'agent-1' , 'Done' ) ;
673674 const completed = component . render ( 100 ) . find ( ( line ) => strip ( line ) . includes ( '001' ) ) ;
674- expect ( completed ) . toContain ( chalk . hex ( darkColors . success ) ( '● ' ) ) ;
675+ expect ( completed ) . toContain ( chalk . hex ( darkColors . success ) ( '✓ ' ) ) ;
675676 vi . setSystemTime ( 10_000 ) ;
676- expect ( memberLine ( renderText ( component , 100 ) , 1 ) ) . toMatch ( / ● \s + D O N E / u) ;
677+ expect ( memberLine ( renderText ( component , 100 ) , 1 ) ) . toMatch ( / ✓ \s + D O N E / u) ;
677678 } finally {
678679 chalk . level = previousLevel ;
679680 currentTheme . setPalette ( previousPalette ) ;
@@ -697,8 +698,8 @@ describe('DynamicWorkflowMissionControlComponent', () => {
697698
698699 const output = renderText ( component , 100 ) ;
699700 expect ( memberLine ( output , 1 ) ) . toMatch ( / ○ \s + W A I T / u) ;
700- expect ( memberLine ( output , 2 ) ) . toMatch ( / [ ○ ◔ ◑ ◕ ] \s + R U N / u) ;
701- expect ( memberLine ( output , 3 ) ) . toMatch ( / ● \s + D O N E / u) ;
701+ expect ( memberLine ( output , 2 ) ) . toMatch ( / [ ◜ ◝ ◞ ◟ ] \s + R U N / u) ;
702+ expect ( memberLine ( output , 3 ) ) . toMatch ( / ✓ \s + D O N E / u) ;
702703 } finally {
703704 chalk . level = previousLevel ;
704705 }
@@ -716,8 +717,8 @@ describe('DynamicWorkflowMissionControlComponent', () => {
716717 const output = renderText ( component , 100 ) ;
717718 const glyphColumns = [
718719 memberLine ( output , 1 ) . indexOf ( '○' ) ,
719- memberLine ( output , 2 ) . search ( / [ ○ ◔ ◑ ◕ ] / u) ,
720- memberLine ( output , 3 ) . indexOf ( '● ' ) ,
720+ memberLine ( output , 2 ) . search ( / [ ◜ ◝ ◞ ◟ ] / u) ,
721+ memberLine ( output , 3 ) . indexOf ( '✓ ' ) ,
721722 ] ;
722723 expect ( glyphColumns [ 0 ] ) . toBeGreaterThan ( 0 ) ;
723724 expect ( new Set ( glyphColumns ) . size ) . toBe ( 1 ) ;
@@ -882,7 +883,7 @@ describe('DynamicWorkflowMissionControlComponent', () => {
882883 const output = strip ( rendered . join ( '\n' ) ) ;
883884
884885 expect ( rendered . every ( ( line ) => visibleWidth ( line ) <= width ) ) . toBe ( true ) ;
885- expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ○ ◔ ◑ ◕ ] \s + R U N / u) ;
886+ expect ( memberLine ( output , 1 ) ) . toMatch ( / [ ◜ ◝ ◞ ◟ ] \s + R U N / u) ;
886887 expect ( output . includes ( 'PROGRESS' ) ) . toBe ( expectedProgress ) ;
887888 expect ( output . includes ( 'STATUS' ) ) . toBe ( expectedStatus ) ;
888889 expect ( output ) . not . toContain ( 'WORK IDLE' ) ;
@@ -899,15 +900,15 @@ describe('DynamicWorkflowMissionControlComponent', () => {
899900 component . markStarted ( 'agent-1' ) ;
900901
901902 vi . setSystemTime ( 30_000 ) ;
902- const before = memberLine ( renderText ( component , 100 ) , 1 ) . match ( / [ ○ ◔ ◑ ◕ ] / u) ?. [ 0 ] ;
903+ const before = memberLine ( renderText ( component , 100 ) , 1 ) . match ( / [ ◜ ◝ ◞ ◟ ] / u) ?. [ 0 ] ;
903904 component . recordToolCall ( { agentId : 'agent-1' , name : 'Read' } ) ;
904905 for ( let index = 0 ; index < 200 ; index += 1 ) {
905906 component . appendModelDelta ( { agentId : 'agent-1' , delta : `chunk ${ String ( index ) } ` } ) ;
906907 }
907908 component . recordToolCall ( { agentId : 'agent-1' , name : 'Bash' } ) ;
908909
909910 const output = renderText ( component , 100 ) ;
910- const after = memberLine ( output , 1 ) . match ( / [ ○ ◔ ◑ ◕ ] / u) ?. [ 0 ] ;
911+ const after = memberLine ( output , 1 ) . match ( / [ ◜ ◝ ◞ ◟ ] / u) ?. [ 0 ] ;
911912 expect ( before ) . toBeDefined ( ) ;
912913 expect ( after ) . toBe ( before ) ;
913914 expect ( output ) . not . toMatch ( / \b \d + % | ⚒ / u) ;
0 commit comments