From 3e121edf209ccca52e39c09d3c4be89fab89048c Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Thu, 26 Mar 2026 21:26:59 -0500 Subject: [PATCH] fix(msteams): normalize memory store conversation ids --- .../msteams/src/conversation-store-fs.test.ts | 19 +++++++++++++++++++ .../msteams/src/conversation-store-memory.ts | 12 +++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/extensions/msteams/src/conversation-store-fs.test.ts b/extensions/msteams/src/conversation-store-fs.test.ts index 165e9b43e1c..a301e8a4400 100644 --- a/extensions/msteams/src/conversation-store-fs.test.ts +++ b/extensions/msteams/src/conversation-store-fs.test.ts @@ -126,6 +126,25 @@ describe("msteams conversation store (fs)", () => { }); describe("msteams conversation store (memory)", () => { + it("normalizes conversation ids the same way as the fs store", async () => { + const store = createMSTeamsConversationStoreMemory(); + + await store.upsert("conv-norm;messageid=123", { + conversation: { id: "conv-norm" }, + channelId: "msteams", + serviceUrl: "https://service.example.com", + user: { id: "u1" }, + }); + + await expect(store.get("conv-norm")).resolves.toEqual( + expect.objectContaining({ + conversation: { id: "conv-norm" }, + }), + ); + await expect(store.remove("conv-norm")).resolves.toBe(true); + await expect(store.get("conv-norm;messageid=123")).resolves.toBeNull(); + }); + it("upserts, lists, removes, and resolves users by both AAD and Bot Framework ids", async () => { const store = createMSTeamsConversationStoreMemory([ { diff --git a/extensions/msteams/src/conversation-store-memory.ts b/extensions/msteams/src/conversation-store-memory.ts index 906d7675e53..bc521a1682b 100644 --- a/extensions/msteams/src/conversation-store-memory.ts +++ b/extensions/msteams/src/conversation-store-memory.ts @@ -8,20 +8,22 @@ export function createMSTeamsConversationStoreMemory( initial: MSTeamsConversationStoreEntry[] = [], ): MSTeamsConversationStore { const map = new Map(); + const normalizeConversationId = (raw: string): string => raw.split(";")[0] ?? raw; for (const { conversationId, reference } of initial) { - map.set(conversationId, reference); + map.set(normalizeConversationId(conversationId), reference); } return { upsert: async (conversationId, reference) => { - const existing = map.get(conversationId); - map.set(conversationId, { + const normalizedId = normalizeConversationId(conversationId); + const existing = map.get(normalizedId); + map.set(normalizedId, { ...(existing?.timezone && !reference.timezone ? { timezone: existing.timezone } : {}), ...reference, }); }, get: async (conversationId) => { - return map.get(conversationId) ?? null; + return map.get(normalizeConversationId(conversationId)) ?? null; }, list: async () => { return Array.from(map.entries()).map(([conversationId, reference]) => ({ @@ -30,7 +32,7 @@ export function createMSTeamsConversationStoreMemory( })); }, remove: async (conversationId) => { - return map.delete(conversationId); + return map.delete(normalizeConversationId(conversationId)); }, findByUserId: async (id) => { const target = id.trim();