





























@@ -2641,6 +2641,47 @@ describe("agent event handler", () => {
26412641expect(agentRunSeq.has("run-terminal-error")).toBe(false);
26422642});
264326432644+it("finalizes fallback-exhausted lifecycle errors without waiting for retry grace", () => {
2645+vi.useFakeTimers();
2646+const { broadcast, clearAgentRunContext, agentRunSeq, handler } = createHarness({
2647+resolveSessionKeyForRun: () => "session-terminal-error",
2648+lifecycleErrorRetryGraceMs: 100,
2649+});
2650+registerAgentRunContext("run-terminal-final-failure", {
2651+sessionKey: "session-terminal-error",
2652+});
2653+2654+handler({
2655+runId: "run-terminal-final-failure",
2656+seq: 1,
2657+stream: "lifecycle",
2658+ts: Date.now(),
2659+data: {
2660+phase: "error",
2661+error: "LLM request failed: network connection error.",
2662+fallbackExhaustedFailure: true,
2663+},
2664+});
2665+2666+const finalPayload = chatBroadcastCalls(broadcast).at(-1)?.[1] as {
2667+state?: string;
2668+runId?: string;
2669+errorMessage?: string;
2670+};
2671+expect(finalPayload.state).toBe("error");
2672+expect(finalPayload.runId).toBe("run-terminal-final-failure");
2673+expect(finalPayload.errorMessage).toContain("network connection error");
2674+expect(clearAgentRunContext).toHaveBeenCalledWith("run-terminal-final-failure");
2675+expect(agentRunSeq.has("run-terminal-final-failure")).toBe(false);
2676+expect(
2677+persistGatewaySessionLifecycleEventMock.mock.calls.some(
2678+([params]) =>
2679+(params as { event?: { data?: { fallbackExhaustedFailure?: boolean } } }).event?.data
2680+?.fallbackExhaustedFailure === true,
2681+),
2682+).toBe(true);
2683+});
2684+26442685it("keeps deferred lifecycle-error cleanup across later non-terminal events", () => {
26452686vi.useFakeTimers();
26462687const { broadcast, clearAgentRunContext, agentRunSeq, handler } = createHarness({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。