From fd8927ce0bb0a3f2bf4a20b5961e82f2635dbc09 Mon Sep 17 00:00:00 2001 From: Sword <55425346+shaw-baobao@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:07:50 +0800 Subject: [PATCH] Fix merge dedupe dropping repeat user messages --- src/utils/threadItems.test.ts | 39 +++++++++++++++++++++++++++++++++++ src/utils/threadItems.ts | 4 ++++ 2 files changed, 43 insertions(+) diff --git a/src/utils/threadItems.test.ts b/src/utils/threadItems.test.ts index 679caa885..69bb3f719 100644 --- a/src/utils/threadItems.test.ts +++ b/src/utils/threadItems.test.ts @@ -173,4 +173,43 @@ describe("threadItems", () => { text: "Hello", }); }); + + it("keeps later optimistic duplicates when the matching remote item is already local", () => { + const remote: ConversationItem[] = [ + { + id: "remote-1", + kind: "message", + role: "user", + text: "Hello", + }, + ]; + const local: ConversationItem[] = [ + { + id: "remote-1", + kind: "message", + role: "user", + text: "Hello", + }, + { + id: "9999-user", + kind: "message", + role: "user", + text: "Hello", + }, + ]; + const merged = mergeThreadItems(remote, local); + expect(merged).toHaveLength(2); + expect(merged[0]).toMatchObject({ + id: "remote-1", + kind: "message", + role: "user", + text: "Hello", + }); + expect(merged[1]).toMatchObject({ + id: "9999-user", + kind: "message", + role: "user", + text: "Hello", + }); + }); }); diff --git a/src/utils/threadItems.ts b/src/utils/threadItems.ts index dd6e198b4..4290edefe 100644 --- a/src/utils/threadItems.ts +++ b/src/utils/threadItems.ts @@ -445,8 +445,12 @@ export function mergeThreadItems( return remoteItems; } const byId = new Map(remoteItems.map((item) => [item.id, item])); + const localIds = new Set(localItems.map((item) => item.id)); const remoteMessageCounts = new Map(); remoteItems.forEach((item) => { + if (localIds.has(item.id)) { + return; + } const key = messageDedupKey(item); if (!key) { return;