11/** Tests ACP child-to-parent stream relay notices, routing, and log path resolution. */
22import { afterEach , beforeAll , beforeEach , describe , expect , it , vi } from "vitest" ;
3+ import type { OpenClawConfig } from "../config/types.openclaw.js" ;
34import { mergeMockedModule } from "../test-utils/vitest-module-mocks.js" ;
45
56const enqueueSystemEventMock = vi . fn ( ) ;
@@ -48,10 +49,29 @@ vi.mock("../config/sessions/paths.js", async () => {
4849} ) ;
4950
5051let emitAgentEvent : typeof import ( "../infra/agent-events.js" ) . emitAgentEvent ;
51- let resolveAcpProjectionSettings : typeof import ( "../auto-reply/reply/acp-stream-settings.js" ) . resolveAcpProjectionSettings ;
5252let resolveAcpSpawnStreamLogPath : typeof import ( "./acp-spawn-parent-stream.js" ) . resolveAcpSpawnStreamLogPath ;
5353let startAcpSpawnParentStreamRelay : typeof import ( "./acp-spawn-parent-stream.js" ) . startAcpSpawnParentStreamRelay ;
5454
55+ const progressCommentaryDeliveryContext = {
56+ channel : "forum" ,
57+ to : "-1001234567890" ,
58+ accountId : "default" ,
59+ threadId : 1122 ,
60+ } ;
61+
62+ function progressModeConfig ( acp ?: OpenClawConfig [ "acp" ] ) : OpenClawConfig {
63+ return {
64+ ...( acp ? { acp } : { } ) ,
65+ channels : {
66+ forum : {
67+ streaming : {
68+ mode : "progress" ,
69+ } ,
70+ } ,
71+ } ,
72+ } ;
73+ }
74+
5575function collectedTexts ( ) {
5676 return enqueueSystemEventMock . mock . calls . map ( ( call ) =>
5777 typeof call [ 0 ] === "string" ? call [ 0 ] : ( JSON . stringify ( call [ 0 ] ) ?? "" ) ,
@@ -80,7 +100,6 @@ function firstMockCall(
80100describe ( "startAcpSpawnParentStreamRelay" , ( ) => {
81101 beforeAll ( async ( ) => {
82102 ( { emitAgentEvent } = await import ( "../infra/agent-events.js" ) ) ;
83- ( { resolveAcpProjectionSettings } = await import ( "../auto-reply/reply/acp-stream-settings.js" ) ) ;
84103 ( { resolveAcpSpawnStreamLogPath, startAcpSpawnParentStreamRelay } =
85104 await import ( "./acp-spawn-parent-stream.js" ) ) ;
86105 } ) ;
@@ -487,19 +506,20 @@ describe("startAcpSpawnParentStreamRelay", () => {
487506 relay . dispose ( ) ;
488507 } ) ;
489508
490- it ( "relays commentary-phase assistant text when enabled " , ( ) => {
509+ it ( "relays commentary-phase assistant text in parent progress mode by default " , ( ) => {
491510 const relay = startAcpSpawnParentStreamRelay ( {
492- runId : "run-commentary-enabled " ,
511+ runId : "run-commentary-default " ,
493512 parentSessionKey : "agent:main:main" ,
494- childSessionKey : "agent:codex:acp:child-commentary-enabled " ,
513+ childSessionKey : "agent:codex:acp:child-commentary-default " ,
495514 agentId : "codex" ,
515+ cfg : progressModeConfig ( ) ,
516+ deliveryContext : progressCommentaryDeliveryContext ,
496517 streamFlushMs : 10 ,
497518 noOutputNoticeMs : 120_000 ,
498- assistantCommentary : true ,
499519 } ) ;
500520
501521 emitAgentEvent ( {
502- runId : "run-commentary-enabled " ,
522+ runId : "run-commentary-default " ,
503523 stream : "assistant" ,
504524 data : {
505525 delta : "checking thread context; then post a tight progress reply here." ,
@@ -516,24 +536,149 @@ describe("startAcpSpawnParentStreamRelay", () => {
516536 relay . dispose ( ) ;
517537 } ) ;
518538
519- it ( "relays ACP status progress when assistant commentary and tag visibility are enabled " , ( ) => {
539+ it ( "suppresses commentary-phase assistant text when parent progress commentary is disabled " , ( ) => {
520540 const relay = startAcpSpawnParentStreamRelay ( {
521- runId : "run-status- commentary-enabled " ,
541+ runId : "run-commentary-disabled " ,
522542 parentSessionKey : "agent:main:main" ,
523- childSessionKey : "agent:codex:acp:child-status- commentary-enabled " ,
543+ childSessionKey : "agent:codex:acp:child-commentary-disabled " ,
524544 agentId : "codex" ,
545+ cfg : {
546+ channels : {
547+ forum : {
548+ streaming : {
549+ mode : "progress" ,
550+ progress : {
551+ commentary : false ,
552+ } ,
553+ } ,
554+ } ,
555+ } ,
556+ } ,
557+ deliveryContext : progressCommentaryDeliveryContext ,
525558 streamFlushMs : 10 ,
526559 noOutputNoticeMs : 120_000 ,
527- assistantCommentary : true ,
528- acpProjectionSettings : resolveAcpProjectionSettings ( {
529- acp : {
530- stream : {
531- tagVisibility : {
532- plan : true ,
560+ } ) ;
561+
562+ emitAgentEvent ( {
563+ runId : "run-commentary-disabled" ,
564+ stream : "assistant" ,
565+ data : {
566+ delta : "checking thread context; then post a tight progress reply here." ,
567+ phase : "commentary" ,
568+ } ,
569+ } ) ;
570+ vi . advanceTimersByTime ( 15 ) ;
571+
572+ expectNoTextWithFragment ( collectedTexts ( ) , "checking thread context" ) ;
573+ relay . dispose ( ) ;
574+ } ) ;
575+
576+ it ( "inherits parent channel progress mode for account commentary overrides" , ( ) => {
577+ const relay = startAcpSpawnParentStreamRelay ( {
578+ runId : "run-account-commentary-enabled" ,
579+ parentSessionKey : "agent:main:main" ,
580+ childSessionKey : "agent:codex:acp:child-account-commentary-enabled" ,
581+ agentId : "codex" ,
582+ cfg : {
583+ channels : {
584+ forum : {
585+ streaming : {
586+ mode : "progress" ,
587+ } ,
588+ accounts : {
589+ work : {
590+ streaming : {
591+ progress : {
592+ commentary : true ,
593+ } ,
594+ } ,
595+ } ,
533596 } ,
534597 } ,
535598 } ,
599+ } ,
600+ deliveryContext : {
601+ ...progressCommentaryDeliveryContext ,
602+ accountId : "work" ,
603+ } ,
604+ streamFlushMs : 10 ,
605+ noOutputNoticeMs : 120_000 ,
606+ } ) ;
607+
608+ emitAgentEvent ( {
609+ runId : "run-account-commentary-enabled" ,
610+ stream : "assistant" ,
611+ data : {
612+ delta : "checking account-scoped progress config." ,
613+ phase : "commentary" ,
614+ } ,
615+ } ) ;
616+ vi . advanceTimersByTime ( 15 ) ;
617+
618+ expectTextWithFragment ( collectedTexts ( ) , "codex: checking account-scoped progress config." ) ;
619+ relay . dispose ( ) ;
620+ } ) ;
621+
622+ it ( "inherits legacy parent channel progress mode for account commentary overrides" , ( ) => {
623+ const relay = startAcpSpawnParentStreamRelay ( {
624+ runId : "run-account-legacy-commentary-enabled" ,
625+ parentSessionKey : "agent:main:main" ,
626+ childSessionKey : "agent:codex:acp:child-account-legacy-commentary-enabled" ,
627+ agentId : "codex" ,
628+ cfg : {
629+ channels : {
630+ forum : {
631+ streaming : "progress" ,
632+ accounts : {
633+ work : {
634+ streaming : {
635+ progress : {
636+ commentary : true ,
637+ } ,
638+ } ,
639+ } ,
640+ } ,
641+ } ,
642+ } ,
643+ } ,
644+ deliveryContext : {
645+ ...progressCommentaryDeliveryContext ,
646+ accountId : "work" ,
647+ } ,
648+ streamFlushMs : 10 ,
649+ noOutputNoticeMs : 120_000 ,
650+ } ) ;
651+
652+ emitAgentEvent ( {
653+ runId : "run-account-legacy-commentary-enabled" ,
654+ stream : "assistant" ,
655+ data : {
656+ delta : "checking legacy progress config." ,
657+ phase : "commentary" ,
658+ } ,
659+ } ) ;
660+ vi . advanceTimersByTime ( 15 ) ;
661+
662+ expectTextWithFragment ( collectedTexts ( ) , "codex: checking legacy progress config." ) ;
663+ relay . dispose ( ) ;
664+ } ) ;
665+
666+ it ( "relays ACP status progress when progress commentary and tag visibility are enabled" , ( ) => {
667+ const relay = startAcpSpawnParentStreamRelay ( {
668+ runId : "run-status-commentary-enabled" ,
669+ parentSessionKey : "agent:main:main" ,
670+ childSessionKey : "agent:codex:acp:child-status-commentary-enabled" ,
671+ agentId : "codex" ,
672+ cfg : progressModeConfig ( {
673+ stream : {
674+ tagVisibility : {
675+ plan : true ,
676+ } ,
677+ } ,
536678 } ) ,
679+ deliveryContext : progressCommentaryDeliveryContext ,
680+ streamFlushMs : 10 ,
681+ noOutputNoticeMs : 120_000 ,
537682 } ) ;
538683
539684 emitAgentEvent ( {
@@ -552,15 +697,16 @@ describe("startAcpSpawnParentStreamRelay", () => {
552697 relay . dispose ( ) ;
553698 } ) ;
554699
555- it ( "does not relay hidden ACP status tags when assistant commentary is enabled" , ( ) => {
700+ it ( "does not relay hidden ACP status tags when progress commentary is enabled" , ( ) => {
556701 const relay = startAcpSpawnParentStreamRelay ( {
557702 runId : "run-status-commentary-hidden" ,
558703 parentSessionKey : "agent:main:main" ,
559704 childSessionKey : "agent:codex:acp:child-status-commentary-hidden" ,
560705 agentId : "codex" ,
706+ cfg : progressModeConfig ( ) ,
707+ deliveryContext : progressCommentaryDeliveryContext ,
561708 streamFlushMs : 10 ,
562709 noOutputNoticeMs : 120_000 ,
563- assistantCommentary : true ,
564710 } ) ;
565711
566712 emitAgentEvent ( {
@@ -591,15 +737,16 @@ describe("startAcpSpawnParentStreamRelay", () => {
591737 relay . dispose ( ) ;
592738 } ) ;
593739
594- it ( "does not relay ACP status tags hidden by default when assistant commentary is enabled" , ( ) => {
740+ it ( "does not relay ACP status tags hidden by default when progress commentary is enabled" , ( ) => {
595741 const relay = startAcpSpawnParentStreamRelay ( {
596742 runId : "run-status-commentary-default-hidden" ,
597743 parentSessionKey : "agent:main:main" ,
598744 childSessionKey : "agent:codex:acp:child-status-commentary-default-hidden" ,
599745 agentId : "codex" ,
746+ cfg : progressModeConfig ( ) ,
747+ deliveryContext : progressCommentaryDeliveryContext ,
600748 streamFlushMs : 10 ,
601749 noOutputNoticeMs : 120_000 ,
602- assistantCommentary : true ,
603750 } ) ;
604751
605752 emitAgentEvent ( {
@@ -624,10 +771,11 @@ describe("startAcpSpawnParentStreamRelay", () => {
624771 parentSessionKey : "agent:main:main" ,
625772 childSessionKey : "agent:codex:acp:child-commentary-visible-stall" ,
626773 agentId : "codex" ,
774+ cfg : progressModeConfig ( ) ,
775+ deliveryContext : progressCommentaryDeliveryContext ,
627776 streamFlushMs : 1 ,
628777 noOutputNoticeMs : 1_000 ,
629778 noOutputPollMs : 250 ,
630- assistantCommentary : true ,
631779 } ) ;
632780
633781 emitAgentEvent ( {
0 commit comments