From 81d62b56cf838ea80849153666ba40ced985ea80 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 15 Feb 2026 03:07:33 +0000 Subject: [PATCH] Assert active reconnect delete failures retry via inactive cleanup path Co-authored-by: Eric Allam --- packages/ai/src/chatTransport.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/ai/src/chatTransport.test.ts b/packages/ai/src/chatTransport.test.ts index d7b647d86..425d600b6 100644 --- a/packages/ai/src/chatTransport.test.ts +++ b/packages/ai/src/chatTransport.test.ts @@ -2787,6 +2787,7 @@ describe("TriggerChatTransport", function () { it("preserves reconnect failures when cleanup run-store delete throws", async function () { const errors: TriggerChatTransportError[] = []; const runStore = new FailingCleanupDeleteRunStore(1); + let fetchCalls = 0; runStore.set({ chatId: "chat-reconnect-cleanup-delete-failure", runId: "run_reconnect_cleanup_delete_failure", @@ -2807,6 +2808,7 @@ describe("TriggerChatTransport", function () { }); (transport as any).fetchRunStream = async function fetchRunStream() { + fetchCalls += 1; throw new Error("reconnect root cause"); }; @@ -2822,6 +2824,20 @@ describe("TriggerChatTransport", function () { runId: "run_reconnect_cleanup_delete_failure", }); expect(errors[0]?.error.message).toBe("reconnect root cause"); + expect(fetchCalls).toBe(1); + expect(runStore.get("chat-reconnect-cleanup-delete-failure")).toMatchObject({ + isActive: false, + lastEventId: "100-0", + }); + + const secondReconnect = await transport.reconnectToStream({ + chatId: "chat-reconnect-cleanup-delete-failure", + }); + + expect(secondReconnect).toBeNull(); + expect(fetchCalls).toBe(1); + expect(errors).toHaveLength(1); + expect(runStore.get("chat-reconnect-cleanup-delete-failure")).toBeUndefined(); }); it("attempts both reconnect cleanup steps when set and delete both throw", async function () {