
















@@ -36,6 +36,7 @@ const mocks = vi.hoisted(() => ({
3636loadConfigReturn: {} as Record<string, unknown>,
3737loadVoiceWakeRoutingConfig: vi.fn(),
3838resolveVoiceWakeRouteByTrigger: vi.fn(),
39+resolveSendPolicy: vi.fn(() => "allow"),
3940}));
40414142vi.mock("../session-utils.js", async () => {
@@ -128,7 +129,8 @@ vi.mock("../../infra/voicewake-routing.js", () => ({
128129}));
129130130131vi.mock("../../sessions/send-policy.js", () => ({
131-resolveSendPolicy: () => "allow",
132+resolveSendPolicy: (...args: unknown[]) =>
133+(mocks.resolveSendPolicy as (...args: unknown[]) => unknown)(...args),
132134}));
133135134136vi.mock("../../utils/delivery-context.js", async () => {
@@ -410,6 +412,7 @@ describe("gateway agent handler", () => {
410412mocks.resolveExplicitAgentSessionKey.mockReset().mockReturnValue(undefined);
411413mocks.resolveBareResetBootstrapFileAccess.mockReset().mockReturnValue(true);
412414mocks.listAgentIds.mockReset().mockReturnValue(["main"]);
415+mocks.resolveSendPolicy.mockReset().mockReturnValue("allow");
413416});
414417415418it("preserves ACP metadata from the current stored session entry", async () => {
@@ -2792,6 +2795,53 @@ describe("gateway agent handler", () => {
27922795);
27932796});
279427972798+it("allows non-delivery agent invocations when sendPolicy is deny", async () => {
2799+mocks.agentCommand.mockClear();
2800+primeMainAgentRun();
2801+mocks.resolveSendPolicy.mockReturnValue("deny");
2802+2803+const respond = await runMainAgent("smoke", "non-delivery-deny");
2804+2805+expect(mocks.resolveSendPolicy).not.toHaveBeenCalled();
2806+expect(respond).not.toHaveBeenCalledWith(
2807+false,
2808+undefined,
2809+expect.objectContaining({ message: "send blocked by session policy" }),
2810+);
2811+await waitForAssertion(() => expect(mocks.agentCommand).toHaveBeenCalledTimes(1));
2812+});
2813+2814+it("blocks delivery agent invocations when sendPolicy is deny", async () => {
2815+primeMainAgentRun();
2816+mocks.resolveSendPolicy.mockReturnValue("deny");
2817+mocks.agentCommand.mockClear();
2818+2819+const respond = vi.fn();
2820+await invokeAgent(
2821+{
2822+message: "smoke",
2823+agentId: "main",
2824+sessionKey: "agent:main:main",
2825+idempotencyKey: "delivery-deny",
2826+deliver: true,
2827+},
2828+{ respond, reqId: "delivery-deny" },
2829+);
2830+2831+expect(respond).toHaveBeenCalledWith(
2832+false,
2833+undefined,
2834+expect.objectContaining({ message: "send blocked by session policy" }),
2835+);
2836+expect(mocks.resolveSendPolicy).toHaveBeenCalledWith(
2837+expect.objectContaining({
2838+entry: expect.objectContaining({ sessionId: "existing-session-id" }),
2839+sessionKey: "agent:main:main",
2840+}),
2841+);
2842+expect(mocks.agentCommand).not.toHaveBeenCalled();
2843+});
2844+27952845describe("groupId session-entry persistence validation", () => {
27962846async function captureGroupEntryFields(
27972847sessionKey: string,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。