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;