From a1e6f0f943cc1654030c3f21d7f30327cc9906cf Mon Sep 17 00:00:00 2001 From: Kim <150593189+KimGLee@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:51:30 +0800 Subject: [PATCH] fix(reply): narrow cross-run suppression and harden dedupe-state persistence --- src/auto-reply/reply/agent-runner.ts | 28 ++++++++++++++++--------- src/auto-reply/reply/followup-runner.ts | 7 +++---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/auto-reply/reply/agent-runner.ts b/src/auto-reply/reply/agent-runner.ts index a7d3131107a..ecc08a8a7d5 100644 --- a/src/auto-reply/reply/agent-runner.ts +++ b/src/auto-reply/reply/agent-runner.ts @@ -440,16 +440,24 @@ export async function runReplyAgent(params: { activeSessionStore[sessionKey] = sessionDedupeEntry; } if (sessionKey && storePath) { - await updateSessionStoreEntry({ - storePath, - sessionKey, - update: async () => ({ - lastMessagingToolSentAt: sessionDedupeEntry.lastMessagingToolSentAt, - lastMessagingToolSentTexts: sessionDedupeEntry.lastMessagingToolSentTexts, - lastMessagingToolSentMediaUrls: sessionDedupeEntry.lastMessagingToolSentMediaUrls, - lastMessagingToolSentTargets: sessionDedupeEntry.lastMessagingToolSentTargets, - }), - }); + try { + await updateSessionStoreEntry({ + storePath, + sessionKey, + update: async () => ({ + lastMessagingToolSentAt: sessionDedupeEntry.lastMessagingToolSentAt, + lastMessagingToolSentTexts: sessionDedupeEntry.lastMessagingToolSentTexts, + lastMessagingToolSentMediaUrls: sessionDedupeEntry.lastMessagingToolSentMediaUrls, + lastMessagingToolSentTargets: sessionDedupeEntry.lastMessagingToolSentTargets, + }), + }); + } catch (error) { + logger.warning( + "Failed to persist messaging-tool dedupe state for session {}: {}", + sessionKey, + error, + ); + } } } diff --git a/src/auto-reply/reply/followup-runner.ts b/src/auto-reply/reply/followup-runner.ts index cf7384fd3bc..e8ea958f978 100644 --- a/src/auto-reply/reply/followup-runner.ts +++ b/src/auto-reply/reply/followup-runner.ts @@ -330,10 +330,9 @@ export function createFollowupRunner(params: { ...(runResult.messagingToolSentMediaUrls ?? []), ...(recentWindowActive ? (sessionEntry?.lastMessagingToolSentMediaUrls ?? []) : []), ]; - const sentTargets = [ - ...(runResult.messagingToolSentTargets ?? []), - ...(recentWindowActive ? (sessionEntry?.lastMessagingToolSentTargets ?? []) : []), - ]; + // Keep target-based suppression scoped to the current run only. + // Session-level dedupe state is used for text/media duplicate filtering. + const sentTargets = runResult.messagingToolSentTargets ?? []; const dedupedPayloads = filterMessagingToolDuplicates({ payloads: replyTaggedPayloads,