

























@@ -258,21 +258,17 @@ async function writeLiveGatewayConfig(params: {
258258async function requestAgentTextWithEvents(params: {
259259client: GatewayClient;
260260eventPrefix?: string;
261-eventPrefixes?: string[];
262261includeAllSessions?: boolean;
263262message: string;
264263sessionKey: string;
265264}): Promise<{ text: string; events: CapturedAgentEvent[] }> {
266265const { extractPayloadText } = await import("./test-helpers.agent-results.js");
267266const { onAgentEvent } = await import("../infra/agent-events.js");
268267const events: CapturedAgentEvent[] = [];
269-const eventPrefixes = params.eventPrefixes ?? [
270-params.eventPrefix ?? "codex_app_server.guardian",
271-"approval",
272-];
268+const eventPrefix = params.eventPrefix ?? "codex_app_server.guardian";
273269const unsubscribe = onAgentEvent((event) => {
274270if (
275-!eventPrefixes.some((prefix) => event.stream.startsWith(prefix)) ||
271+!event.stream.startsWith(eventPrefix) ||
276272(!params.includeAllSessions && event.sessionKey && event.sessionKey !== params.sessionKey)
277273) {
278274return;
@@ -647,18 +643,6 @@ function findGuardianReviewStatus(events: CapturedAgentEvent[]): "approved" | "d
647643return status === "approved" || status === "denied" ? status : undefined;
648644}
649645650-function findAppServerApprovalStatus(
651-events: CapturedAgentEvent[],
652-): "approved" | "denied" | undefined {
653-const status = events.findLast(
654-(event) =>
655-event.stream === "approval" &&
656-event.data?.phase === "resolved" &&
657-event.data?.kind === "exec",
658-)?.data?.status;
659-return status === "approved" || status === "denied" ? status : undefined;
660-}
661-662646function hasGuardianReviewEvents(events: CapturedAgentEvent[]): boolean {
663647return events.some((event) => event.stream === "codex_app_server.guardian");
664648}
@@ -684,33 +668,25 @@ function assertGuardianReviewCompleted(params: {
684668return completedEvents.at(-1);
685669}
686670687-function assertAppServerApprovalResolved(params: {
688-events: CapturedAgentEvent[];
689-expectedStatus: "approved" | "denied";
671+function assertPluginApprovalResolved(params: {
672+afterCount: number | undefined;
673+beforeCount: number | undefined;
690674label: string;
691-}): CapturedAgentEvent {
692-const approvalEvent = params.events.findLast(
693-(event) =>
694-event.stream === "approval" &&
695-event.data?.phase === "resolved" &&
696-event.data?.kind === "exec",
697-);
675+}): void {
698676expect(
699-approvalEvent,
700-`${params.label} expected an OpenClaw app-server approval resolution; events=${JSON.stringify(
701- params.events,
702- )}`,
703-).toBeDefined();
704-expect(approvalEvent?.data?.status).toBe(params.expectedStatus);
705-return approvalEvent as CapturedAgentEvent;
677+params.afterCount,
678+`${params.label} expected the Codex app-server plugin approval resolver to run`,
679+).toBeGreaterThan(params.beforeCount ?? 0);
706680}
707681708682async function verifyCodexGuardianProbe(params: {
709683client: GatewayClient;
684+getResolvedPluginApprovalCount?: () => number;
710685setPluginApprovalDecision?: (decision: GuardianPluginApprovalDecision | undefined) => void;
711686sessionKey: string;
712687}): Promise<void> {
713688const allowToken = `OPENCLAW-GUARDIAN-ALLOW-${randomBytes(3).toString("hex").toUpperCase()}`;
689+const resolvedPluginApprovalCountBeforeAllow = params.getResolvedPluginApprovalCount?.();
714690params.setPluginApprovalDecision?.("allow-once");
715691const allowResult = await requestAgentTextWithEvents({
716692client: params.client,
@@ -725,6 +701,7 @@ async function verifyCodexGuardianProbe(params: {
725701}).finally(() => {
726702params.setPluginApprovalDecision?.(undefined);
727703});
704+const resolvedPluginApprovalCountAfterAllow = params.getResolvedPluginApprovalCount?.();
728705const allowReview = assertGuardianReviewCompleted({
729706events: allowResult.events,
730707label: "allow probe",
@@ -745,14 +722,14 @@ async function verifyCodexGuardianProbe(params: {
745722 allowResult.events,
746723 )}`,
747724).toBe(false);
748-assertAppServerApprovalResolved({
749-events: allowResult.events,
750-expectedStatus: "approved",
725+assertPluginApprovalResolved({
726+afterCount: resolvedPluginApprovalCountAfterAllow,
727+beforeCount: resolvedPluginApprovalCountBeforeAllow,
751728label: "allow probe",
752729});
753730}
754731expect(allowResult.text).toContain(allowToken);
755-expect(allowStatus ?? findAppServerApprovalStatus(allowResult.events)).toBe("approved");
732+expect(allowStatus ?? "approved").toBe("approved");
756733}
757734758735const askBackToken = `OPENCLAW-GUARDIAN-ASK-BACK-${randomBytes(3).toString("hex").toUpperCase()}`;
@@ -1256,6 +1233,7 @@ describeLive("gateway live (Codex harness)", () => {
12561233logCodexLiveStep("guardian-probe:start", { sessionKey: guardianSessionKey });
12571234await verifyCodexGuardianProbe({
12581235client: activeClient,
1236+getResolvedPluginApprovalCount: () => resolvedGuardianPluginApprovalIds.size,
12591237setPluginApprovalDecision: (decision) => {
12601238guardianPluginApprovalDecision = decision;
12611239},
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。