


























@@ -63,122 +63,92 @@ describe("buildTelegramMessageContext dm thread sessions", () => {
6363message: Record<string, unknown>,
6464params?: Pick<
6565Parameters<typeof buildTelegramMessageContextForTest>[0],
66-"cfg" | "resolveTelegramGroupConfig"
66+"cfg" | "me" | "resolveTelegramGroupConfig"
6767>,
6868) =>
6969await buildTelegramMessageContextForTest({
7070 message,
7171 ...params,
7272});
737374-it("keeps incidental dm message_thread_id on the main session by default", async () => {
75-const ctx = await buildContext({
76-message_id: 1,
77-chat: { id: 1234, type: "private" },
78-date: 1700000000,
79-text: "hello",
80-message_thread_id: 42,
81-from: { id: 42, first_name: "Alice" },
74+const dmThreadMessage = {
75+message_id: 1,
76+chat: { id: 1234, type: "private" },
77+date: 1700000000,
78+text: "hello",
79+message_thread_id: 42,
80+from: { id: 42, first_name: "Alice" },
81+};
82+83+it("keeps DM message_thread_id on the main session when bot topics are absent", async () => {
84+const ctx = await buildContext(dmThreadMessage);
85+86+expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
87+expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main");
88+});
89+90+it("keeps DM message_thread_id on the main session when bot topics are disabled", async () => {
91+const ctx = await buildContext(dmThreadMessage, {
92+me: { has_topics_enabled: false },
8293});
83948495expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
8596expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main");
8697});
879888-it("uses thread session key for configured dm topics", async () => {
99+it("uses thread session key when Telegram reports bot topics enabled", async () => {
100+const ctx = await buildContext(dmThreadMessage, {
101+me: { has_topics_enabled: true },
102+});
103+104+expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
105+expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main:thread:1234:42");
106+});
107+108+it("does not use configured DM topics without bot topic capability", async () => {
89109const ctx = await buildContext(
90110{
111+ ...dmThreadMessage,
91112message_id: 3,
92-chat: { id: 1234, type: "private" },
93113date: 1700000002,
94-text: "hello",
95-message_thread_id: 42,
96-from: { id: 42, first_name: "Alice" },
97114},
98115{
99116resolveTelegramGroupConfig: () => ({
100117groupConfig: { requireTopic: true },
101-topicConfig: undefined,
118+topicConfig: { agentId: "support" },
102119}),
103120},
104121);
105122106123expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
107-expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main:thread:1234:42");
124+expect(ctx?.ctxPayload?.SessionKey).toBe("agent:support:main");
108125});
109126110-it("uses thread session key for DM topics when dm.threadReplies is inbound", async () => {
127+it("uses configured DM topic routing once bot topic capability is present", async () => {
111128const ctx = await buildContext(
112129{
113-message_id: 1,
114-chat: { id: 1234, type: "private" },
115-date: 1700000000,
116-text: "hello",
117-message_thread_id: 42,
118-from: { id: 42, first_name: "Alice" },
130+ ...dmThreadMessage,
131+message_id: 4,
132+date: 1700000003,
119133},
120134{
121-cfg: {
122-agents: {
123-defaults: { model: "anthropic/claude-opus-4-5", workspace: "/tmp/openclaw" },
124-},
125-channels: {
126-telegram: {
127-dmPolicy: "open",
128-allowFrom: ["*"],
129-dm: { threadReplies: "inbound" },
130-},
131-},
132-messages: { groupChat: { mentionPatterns: [] } },
133-},
135+me: { has_topics_enabled: true },
136+resolveTelegramGroupConfig: () => ({
137+groupConfig: { requireTopic: true },
138+topicConfig: { agentId: "support" },
139+}),
134140},
135141);
136142137143expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
138-expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main:thread:1234:42");
139-});
140-141-it("lets direct chat config opt one DM back into thread session keys", async () => {
142-const cfg = {
143-agents: { defaults: { model: "anthropic/claude-opus-4-5", workspace: "/tmp/openclaw" } },
144-channels: {
145-telegram: {
146-dmPolicy: "open",
147-allowFrom: ["*"],
148-direct: {
149-"1234": {
150-threadReplies: "inbound",
151-},
152-},
153-},
154-},
155-messages: { groupChat: { mentionPatterns: [] } },
156-};
157-const ctx = await buildTelegramMessageContextForTest({
158- cfg,
159-message: {
160-message_id: 1,
161-chat: { id: 1234, type: "private" },
162-date: 1700000000,
163-text: "hello",
164-message_thread_id: 42,
165-from: { id: 42, first_name: "Alice" },
166-},
167-resolveTelegramGroupConfig: () => ({
168-groupConfig: { threadReplies: "inbound" },
169-topicConfig: undefined,
170-}),
171-});
172-173-expect(ctx?.ctxPayload?.MessageThreadId).toBe(42);
174-expect(ctx?.ctxPayload?.SessionKey).toBe("agent:main:main:thread:1234:42");
144+expect(ctx?.ctxPayload?.SessionKey).toBe("agent:support:main:thread:1234:42");
175145});
176146177147it("uses the main session key when no thread id", async () => {
178148const ctx = await buildContext({
179-message_id: 2,
149+message_id: 1,
180150chat: { id: 1234, type: "private" },
181-date: 1700000001,
151+date: 1700000000,
182152text: "hello",
183153from: { id: 42, first_name: "Alice" },
184154});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。