diff --git a/src/routing/resolve-route.test.ts b/src/routing/resolve-route.test.ts index aed0fa755..bb561c069 100644 --- a/src/routing/resolve-route.test.ts +++ b/src/routing/resolve-route.test.ts @@ -77,7 +77,33 @@ describe("resolveAgentRoute", () => { accountId: null, peer: { kind: "dm", id: "222222222222222222" }, }); - expect(route.sessionKey).toBe("agent:main:discord:dm:alice"); + expect(route.sessionKey).toBe("agent:main:dm:alice"); + }); + + test("identityLinks per-channel-peer shares context across channels", () => { + const cfg: ClawdbotConfig = { + session: { + dmScope: "per-channel-peer", + identityLinks: { + alice: ["telegram:111111111", "discord:222222222222222222"], + }, + }, + }; + const telegramRoute = resolveAgentRoute({ + cfg, + channel: "telegram", + accountId: null, + peer: { kind: "dm", id: "111111111" }, + }); + const discordRoute = resolveAgentRoute({ + cfg, + channel: "discord", + accountId: null, + peer: { kind: "dm", id: "222222222222222222" }, + }); + expect(telegramRoute.sessionKey).toBe("agent:main:dm:alice"); + expect(discordRoute.sessionKey).toBe("agent:main:dm:alice"); + expect(telegramRoute.sessionKey).toBe(discordRoute.sessionKey); }); test("peer binding wins over account binding", () => { diff --git a/src/routing/session-key.ts b/src/routing/session-key.ts index 320ffeb83..593bc3101 100644 --- a/src/routing/session-key.ts +++ b/src/routing/session-key.ts @@ -138,6 +138,9 @@ export function buildAgentPeerSessionKey(params: { return `agent:${normalizeAgentId(params.agentId)}:${channel}:${accountId}:dm:${peerId}`; } if (dmScope === "per-channel-peer" && peerId) { + if (linkedPeerId) { + return `agent:${normalizeAgentId(params.agentId)}:dm:${peerId}`; + } const channel = (params.channel ?? "").trim().toLowerCase() || "unknown"; return `agent:${normalizeAgentId(params.agentId)}:${channel}:dm:${peerId}`; }