From 868d766b9a47e0feac6bf0db97b0135d2bfda8f4 Mon Sep 17 00:00:00 2001 From: KimGLee <05_bolster_inkling@icloud.com> Date: Tue, 3 Mar 2026 00:37:32 +0800 Subject: [PATCH] fix(ci): resolve tsgo regressions and target-scoped followup dedupe --- src/auto-reply/reply/followup-runner.test.ts | 34 ++++++++++++++++++++ src/auto-reply/reply/followup-runner.ts | 11 ++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/auto-reply/reply/followup-runner.test.ts b/src/auto-reply/reply/followup-runner.test.ts index 82f95ee5551..c0da2f757eb 100644 --- a/src/auto-reply/reply/followup-runner.test.ts +++ b/src/auto-reply/reply/followup-runner.test.ts @@ -540,6 +540,40 @@ describe("createFollowupRunner messaging tool dedupe", () => { expect(onBlockReply).toHaveBeenCalled(); }); + it("reuses session-level text dedupe when prior run had repeated sends to one target", async () => { + const onBlockReply = vi.fn(async () => {}); + const sessionEntry: SessionEntry = { + sessionId: "session", + updatedAt: Date.now(), + lastMessagingToolSessionId: "session", + lastMessagingToolSentAt: Date.now(), + lastMessagingToolSentTexts: ["hello world!"], + lastMessagingToolSentTargets: [ + { tool: "message", provider: "telegram", to: "123" }, + { tool: "message", provider: "telegram", to: "123" }, + ], + }; + const sessionStore: Record = { main: sessionEntry }; + + runEmbeddedPiAgentMock.mockResolvedValueOnce({ + payloads: [{ text: "hello world!" }], + meta: {}, + }); + + const runner = createMessagingDedupeRunner(onBlockReply, { + sessionEntry, + sessionStore, + sessionKey: "main", + }); + + await runner({ + ...baseQueuedRun("telegram"), + originatingTo: "123", + }); + + expect(onBlockReply).not.toHaveBeenCalled(); + }); + it("drops media URL from payload when messaging tool already sent it", async () => { const onBlockReply = vi.fn(async () => {}); runEmbeddedPiAgentMock.mockResolvedValueOnce({ diff --git a/src/auto-reply/reply/followup-runner.ts b/src/auto-reply/reply/followup-runner.ts index 021eadcf241..7eceda2628f 100644 --- a/src/auto-reply/reply/followup-runner.ts +++ b/src/auto-reply/reply/followup-runner.ts @@ -344,8 +344,17 @@ export function createFollowupRunner(params: { originatingTo, accountId: originAccountId, }); + const uniquePreviousTargets = new Set( + previousSentTargets.map((target) => + JSON.stringify({ + provider: target.provider, + to: target.to ?? "", + accountId: target.accountId ?? "", + }), + ), + ); const canReuseSessionDedupeFingerprints = - recentTargetMatch && previousSentTargets.length <= 1; + recentTargetMatch && uniquePreviousTargets.size <= 1; const sentTexts = [ ...(runResult.messagingToolSentTexts ?? []),