From 2b6723e41c170ea9afdb44c42ddc25d40f1ed724 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 15 Feb 2026 02:52:44 +0000 Subject: [PATCH] Retry inactive reconnect cleanup after string delete failures Co-authored-by: Eric Allam --- packages/ai/src/chatTransport.test.ts | 50 ++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/ai/src/chatTransport.test.ts b/packages/ai/src/chatTransport.test.ts index 9f4a53e0e..28479f3f7 100644 --- a/packages/ai/src/chatTransport.test.ts +++ b/packages/ai/src/chatTransport.test.ts @@ -706,6 +706,52 @@ describe("TriggerChatTransport", function () { expect(stream).toBeNull(); }); + it("retries inactive reconnect string cleanup on subsequent reconnect attempts", async function () { + const errors: TriggerChatTransportError[] = []; + const runStore = new FailingCleanupDeleteValueRunStore("cleanup delete string failure"); + runStore.set({ + chatId: "chat-inactive-delete-string-retry", + runId: "run_inactive_delete_string_retry", + publicAccessToken: "pk_inactive_delete_string_retry", + streamKey: "chat-stream", + lastEventId: "10-0", + isActive: false, + }); + + const transport = new TriggerChatTransport({ + task: "chat-task", + stream: "chat-stream", + accessToken: "pk_trigger", + runStore, + onError: function onError(error) { + errors.push(error); + }, + }); + + const firstReconnect = await transport.reconnectToStream({ + chatId: "chat-inactive-delete-string-retry", + }); + + expect(firstReconnect).toBeNull(); + expect(errors).toHaveLength(1); + expect(errors[0]).toMatchObject({ + phase: "reconnect", + chatId: "chat-inactive-delete-string-retry", + runId: "run_inactive_delete_string_retry", + }); + expect(runStore.get("chat-inactive-delete-string-retry")).toMatchObject({ + isActive: false, + }); + + const secondReconnect = await transport.reconnectToStream({ + chatId: "chat-inactive-delete-string-retry", + }); + + expect(secondReconnect).toBeNull(); + expect(errors).toHaveLength(1); + expect(runStore.get("chat-inactive-delete-string-retry")).toBeUndefined(); + }); + it("normalizes non-Error inactive reconnect cleanup delete failures through onError", async function () { const errors: TriggerChatTransportError[] = []; const runStore = new FailingCleanupDeleteValueRunStore("cleanup delete string failure"); @@ -3624,11 +3670,13 @@ class FailingCleanupDeleteValueRunStore extends InMemoryTriggerChatRunStore { super(); } - public delete(_chatId: string): void { + public delete(chatId: string): void { this.deleteCalls += 1; if (this.deleteCalls === 1) { throw this.thrownValue; } + + super.delete(chatId); } }