fix(followup): scope session dedupe reuse to system-generated runs

This commit is contained in:
KimGLee 2026-03-03 16:44:51 +08:00
parent 868d766b9a
commit 1faa358d00
2 changed files with 34 additions and 1 deletions

View File

@ -447,6 +447,38 @@ describe("createFollowupRunner messaging tool dedupe", () => {
expect(onBlockReply).not.toHaveBeenCalled();
});
it("does not reuse session-level dedupe fingerprints for queued user turns", 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" }],
};
const sessionStore: Record<string, SessionEntry> = { main: sessionEntry };
runEmbeddedPiAgentMock.mockResolvedValueOnce({
payloads: [{ text: "hello world!" }],
meta: {},
});
const runner = createMessagingDedupeRunner(onBlockReply, {
sessionEntry,
sessionStore,
sessionKey: "main",
});
await runner({
...baseQueuedRun("telegram"),
messageId: "user-msg-123",
originatingTo: "123",
});
expect(onBlockReply).toHaveBeenCalledTimes(1);
});
it("does not use session-level dedupe from a previous session id", async () => {
const onBlockReply = vi.fn(async () => {});
const sessionEntry: SessionEntry = {

View File

@ -353,8 +353,9 @@ export function createFollowupRunner(params: {
}),
),
);
const isSystemGeneratedFollowup = !queued.messageId;
const canReuseSessionDedupeFingerprints =
recentTargetMatch && uniquePreviousTargets.size <= 1;
isSystemGeneratedFollowup && recentTargetMatch && uniquePreviousTargets.size <= 1;
const sentTexts = [
...(runResult.messagingToolSentTexts ?? []),