




















@@ -78,6 +78,7 @@ describe("agent event handler", () => {
7878resolveSessionKeyForRun?: (runId: string) => string | undefined;
7979lifecycleErrorRetryGraceMs?: number;
8080isChatSendRunActive?: (runId: string) => boolean;
81+shouldBackoffLowPrioritySessionToolEvents?: () => boolean;
8182}) {
8283const nowSpy =
8384params?.now === undefined ? undefined : vi.spyOn(Date, "now").mockReturnValue(params.now);
@@ -103,6 +104,8 @@ describe("agent event handler", () => {
103104loadGatewaySessionRowForSnapshot: loadGatewaySessionRow,
104105lifecycleErrorRetryGraceMs: params?.lifecycleErrorRetryGraceMs,
105106isChatSendRunActive: params?.isChatSendRunActive,
107+shouldBackoffLowPrioritySessionToolEvents:
108+params?.shouldBackoffLowPrioritySessionToolEvents,
106109});
107110108111return {
@@ -1519,6 +1522,96 @@ describe("agent event handler", () => {
15191522resetAgentRunContextForTest();
15201523});
152115241525+it("backs off session-scoped tool mirrors during queued gateway pressure", () => {
1526+const { broadcastToConnIds, sessionEventSubscribers, toolEventRecipients, handler } =
1527+createHarness({
1528+resolveSessionKeyForRun: () => "session-pressure",
1529+shouldBackoffLowPrioritySessionToolEvents: () => true,
1530+});
1531+1532+registerAgentRunContext("run-pressure-tool", {
1533+sessionKey: "session-pressure",
1534+verboseLevel: "off",
1535+});
1536+toolEventRecipients.add("run-pressure-tool", "conn-run");
1537+sessionEventSubscribers.subscribe("conn-session");
1538+1539+handler({
1540+runId: "run-pressure-tool",
1541+seq: 1,
1542+stream: "tool",
1543+ts: 1_234,
1544+data: {
1545+phase: "start",
1546+name: "exec",
1547+toolCallId: "tool-pressure-1",
1548+args: { command: "echo hi" },
1549+},
1550+});
1551+1552+expect(broadcastToConnIds).toHaveBeenCalledTimes(1);
1553+expect(requireMockArg(broadcastToConnIds, 0, 0, "run tool event")).toBe("agent");
1554+expect(requireMockArg(broadcastToConnIds, 0, 2, "run tool recipients")).toEqual(
1555+new Set(["conn-run"]),
1556+);
1557+});
1558+1559+it("keeps terminal session-scoped tool mirrors during queued gateway pressure", () => {
1560+let backoffActive = false;
1561+const { broadcastToConnIds, sessionEventSubscribers, handler } = createHarness({
1562+resolveSessionKeyForRun: () => "session-pressure-terminal",
1563+shouldBackoffLowPrioritySessionToolEvents: () => backoffActive,
1564+});
1565+1566+registerAgentRunContext("run-pressure-terminal-tool", {
1567+sessionKey: "session-pressure-terminal",
1568+verboseLevel: "off",
1569+});
1570+sessionEventSubscribers.subscribe("conn-session");
1571+1572+handler({
1573+runId: "run-pressure-terminal-tool",
1574+seq: 1,
1575+stream: "tool",
1576+ts: 1_234,
1577+data: {
1578+phase: "start",
1579+name: "exec",
1580+toolCallId: "tool-pressure-terminal-1",
1581+args: { command: "echo hi" },
1582+},
1583+});
1584+1585+backoffActive = true;
1586+handler({
1587+runId: "run-pressure-terminal-tool",
1588+seq: 2,
1589+stream: "tool",
1590+ts: 1_235,
1591+data: {
1592+phase: "result",
1593+name: "exec",
1594+toolCallId: "tool-pressure-terminal-1",
1595+result: { content: [{ type: "text", text: "done" }] },
1596+},
1597+});
1598+1599+expect(broadcastToConnIds).toHaveBeenCalledTimes(2);
1600+expect(requireMockArg(broadcastToConnIds, 0, 0, "session tool start event")).toBe(
1601+"session.tool",
1602+);
1603+expect(requireMockArg(broadcastToConnIds, 1, 0, "session tool result event")).toBe(
1604+"session.tool",
1605+);
1606+const resultPayload = requireMockPayload(broadcastToConnIds, 1, 1, "session tool result");
1607+expectRecordFields(requireRecord(resultPayload.data, "session tool result data"), {
1608+phase: "result",
1609+name: "exec",
1610+toolCallId: "tool-pressure-terminal-1",
1611+result: { content: [{ type: "text", text: "done" }] },
1612+});
1613+});
1614+15221615it("suppresses heartbeat tool events for Control UI and verbose node subscribers", () => {
15231616const {
15241617 broadcastToConnIds,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。