Skip to content

Commit d904115

Browse files
committed
fix telegram dm topic session routing
1 parent 57c88dd commit d904115

2 files changed

Lines changed: 28 additions & 6 deletions

File tree

extensions/telegram/src/channel.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,19 +553,24 @@ function resolveTelegramOutboundSessionRoute(params: {
553553
if (isGroup) {
554554
return baseRoute;
555555
}
556+
const outboundSessionThreadId =
557+
resolvedThreadId !== undefined ? `${chatId}:${resolvedThreadId}` : undefined;
556558
const route = buildThreadAwareOutboundSessionRoute({
557559
route: baseRoute,
558-
threadId: resolvedThreadId,
560+
threadId: outboundSessionThreadId,
559561
currentSessionKey: params.currentSessionKey,
560562
precedence: ["threadId", "currentSession"],
561563
canRecoverCurrentThread: ({ route }) =>
562564
route.chatType !== "direct" || (params.cfg.session?.dmScope ?? "main") !== "main",
563565
});
566+
const deliveryThreadId =
567+
resolvedThreadId ?? parseTelegramThreadId(route.threadId) ?? route.threadId;
564568
return {
565569
...route,
570+
...(deliveryThreadId !== undefined ? { threadId: deliveryThreadId } : {}),
566571
from:
567-
route.threadId !== undefined
568-
? `telegram:${chatId}:topic:${route.threadId}`
572+
deliveryThreadId !== undefined
573+
? `telegram:${chatId}:topic:${deliveryThreadId}`
569574
: `telegram:${chatId}`,
570575
};
571576
}

extensions/telegram/src/session-route.test.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,34 @@ import { describe, expect, it } from "vitest";
22
import { telegramPlugin } from "./channel.js";
33

44
describe("telegram session route", () => {
5-
it("keeps direct topic thread ids in a thread session suffix", async () => {
5+
it("scopes direct topic session suffixes by chat id", async () => {
66
const route = await telegramPlugin.messaging?.resolveOutboundSessionRoute?.({
77
cfg: {},
88
agentId: "main",
99
target: "12345:topic:99",
1010
});
1111

12-
expect(route?.sessionKey).toBe("agent:main:main:thread:99");
12+
expect(route?.sessionKey).toBe("agent:main:main:thread:12345:99");
1313
expect(route?.baseSessionKey).toBe("agent:main:main");
1414
expect(route?.threadId).toBe(99);
1515
});
1616

17+
it("aligns isolated direct topic sessions with inbound reply routing", async () => {
18+
const route = await telegramPlugin.messaging?.resolveOutboundSessionRoute?.({
19+
cfg: { session: { dmScope: "per-account-channel-peer" } },
20+
agentId: "finance",
21+
accountId: "finance",
22+
target: "104506878:topic:174872",
23+
});
24+
25+
expect(route?.sessionKey).toBe(
26+
"agent:finance:telegram:finance:direct:104506878:thread:104506878:174872",
27+
);
28+
expect(route?.baseSessionKey).toBe("agent:finance:telegram:finance:direct:104506878");
29+
expect(route?.threadId).toBe(174872);
30+
expect(route?.from).toBe("telegram:104506878:topic:174872");
31+
});
32+
1733
it("recovers direct topic thread routes from currentSessionKey when the DM scope is isolated", async () => {
1834
const route = await telegramPlugin.messaging?.resolveOutboundSessionRoute?.({
1935
cfg: { session: { dmScope: "per-channel-peer" } },
@@ -24,7 +40,8 @@ describe("telegram session route", () => {
2440

2541
expect(route?.sessionKey).toBe("agent:main:telegram:direct:12345:thread:12345:99");
2642
expect(route?.baseSessionKey).toBe("agent:main:telegram:direct:12345");
27-
expect(route?.threadId).toBe("12345:99");
43+
expect(route?.threadId).toBe(99);
44+
expect(route?.from).toBe("telegram:12345:topic:99");
2845
});
2946

3047
it('does not recover currentSessionKey threads for shared dmScope "main" DMs', async () => {

0 commit comments

Comments
 (0)