






















@@ -1,5 +1,6 @@
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";
4556const enqueueSystemEventMock = vi.fn();
@@ -48,10 +49,29 @@ vi.mock("../config/sessions/paths.js", async () => {
4849});
49505051let 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;
545455+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() {
5676return enqueueSystemEventMock.mock.calls.map((call) =>
5777typeof call[0] === "string" ? call[0] : (JSON.stringify(call[0]) ?? ""),
@@ -80,7 +100,6 @@ function firstMockCall(
80100describe("startAcpSpawnParentStreamRelay", () => {
81101beforeAll(async () => {
82102({ emitAgentEvent } = await import("../infra/agent-events.js"));
83-({ resolveAcpProjectionSettings } = await import("../auto-reply/reply/acp-stream-settings.js"));
84103({ resolveAcpSpawnStreamLogPath, startAcpSpawnParentStreamRelay } =
85104await import("./acp-spawn-parent-stream.js"));
86105});
@@ -487,19 +506,20 @@ describe("startAcpSpawnParentStreamRelay", () => {
487506relay.dispose();
488507});
489508490-it("relays commentary-phase assistant text when enabled", () => {
509+it("relays commentary-phase assistant text in parent progress mode by default", () => {
491510const relay = startAcpSpawnParentStreamRelay({
492-runId: "run-commentary-enabled",
511+runId: "run-commentary-default",
493512parentSessionKey: "agent:main:main",
494-childSessionKey: "agent:codex:acp:child-commentary-enabled",
513+childSessionKey: "agent:codex:acp:child-commentary-default",
495514agentId: "codex",
515+cfg: progressModeConfig(),
516+deliveryContext: progressCommentaryDeliveryContext,
496517streamFlushMs: 10,
497518noOutputNoticeMs: 120_000,
498-assistantCommentary: true,
499519});
500520501521emitAgentEvent({
502-runId: "run-commentary-enabled",
522+runId: "run-commentary-default",
503523stream: "assistant",
504524data: {
505525delta: "checking thread context; then post a tight progress reply here.",
@@ -516,24 +536,149 @@ describe("startAcpSpawnParentStreamRelay", () => {
516536relay.dispose();
517537});
518538519-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", () => {
520540const relay = startAcpSpawnParentStreamRelay({
521-runId: "run-status-commentary-enabled",
541+runId: "run-commentary-disabled",
522542parentSessionKey: "agent:main:main",
523-childSessionKey: "agent:codex:acp:child-status-commentary-enabled",
543+childSessionKey: "agent:codex:acp:child-commentary-disabled",
524544agentId: "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,
525558streamFlushMs: 10,
526559noOutputNoticeMs: 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});
538683539684emitAgentEvent({
@@ -552,15 +697,16 @@ describe("startAcpSpawnParentStreamRelay", () => {
552697relay.dispose();
553698});
554699555-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", () => {
556701const relay = startAcpSpawnParentStreamRelay({
557702runId: "run-status-commentary-hidden",
558703parentSessionKey: "agent:main:main",
559704childSessionKey: "agent:codex:acp:child-status-commentary-hidden",
560705agentId: "codex",
706+cfg: progressModeConfig(),
707+deliveryContext: progressCommentaryDeliveryContext,
561708streamFlushMs: 10,
562709noOutputNoticeMs: 120_000,
563-assistantCommentary: true,
564710});
565711566712emitAgentEvent({
@@ -591,15 +737,16 @@ describe("startAcpSpawnParentStreamRelay", () => {
591737relay.dispose();
592738});
593739594-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", () => {
595741const relay = startAcpSpawnParentStreamRelay({
596742runId: "run-status-commentary-default-hidden",
597743parentSessionKey: "agent:main:main",
598744childSessionKey: "agent:codex:acp:child-status-commentary-default-hidden",
599745agentId: "codex",
746+cfg: progressModeConfig(),
747+deliveryContext: progressCommentaryDeliveryContext,
600748streamFlushMs: 10,
601749noOutputNoticeMs: 120_000,
602-assistantCommentary: true,
603750});
604751605752emitAgentEvent({
@@ -624,10 +771,11 @@ describe("startAcpSpawnParentStreamRelay", () => {
624771parentSessionKey: "agent:main:main",
625772childSessionKey: "agent:codex:acp:child-commentary-visible-stall",
626773agentId: "codex",
774+cfg: progressModeConfig(),
775+deliveryContext: progressCommentaryDeliveryContext,
627776streamFlushMs: 1,
628777noOutputNoticeMs: 1_000,
629778noOutputPollMs: 250,
630-assistantCommentary: true,
631779});
632780633781emitAgentEvent({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。