diff --git a/extensions/telegram/src/channel.ts b/extensions/telegram/src/channel.ts index f0cdfca63717..d84916c09196 100644 --- a/extensions/telegram/src/channel.ts +++ b/extensions/telegram/src/channel.ts @@ -1246,7 +1246,11 @@ export const telegramPlugin = createChatChannelPlugin({ }, security: telegramSecurityAdapter, threading: { - topLevelReplyToMode: "telegram", + scopedAccountReplyToMode: { + resolveAccount: (cfg, accountId) => resolveTelegramAccount({ cfg, accountId }), + resolveReplyToMode: (account) => account.config.replyToMode, + fallback: "off", + }, buildToolContext: (params) => buildTelegramThreadingToolContext(params), resolveAutoThreadId: ({ to, toolContext }) => resolveTelegramAutoThreadId({ to, toolContext }), resolveCurrentChannelId: ({ to, threadId }) => { diff --git a/extensions/telegram/src/threading-tool-context.test.ts b/extensions/telegram/src/threading-tool-context.test.ts index f3169347c698..c75f1a2a4bb7 100644 --- a/extensions/telegram/src/threading-tool-context.test.ts +++ b/extensions/telegram/src/threading-tool-context.test.ts @@ -1,8 +1,48 @@ // Telegram tests cover threading tool context plugin behavior. import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; import { describe, expect, it } from "vitest"; +import { telegramPlugin } from "./channel.js"; import { buildTelegramThreadingToolContext } from "./threading-tool-context.js"; +describe("telegramPlugin reply threading", () => { + it.each([ + { + name: "uses an account override", + telegram: { + botToken: "token-default", + accounts: { sut: { botToken: "token-sut", replyToMode: "first" as const } }, + }, + expected: "first", + }, + { + name: "inherits the top-level mode", + telegram: { + botToken: "token-default", + replyToMode: "all" as const, + accounts: { sut: { botToken: "token-sut" } }, + }, + expected: "all", + }, + { + name: "allows an account to disable replies", + telegram: { + botToken: "token-default", + replyToMode: "all" as const, + accounts: { sut: { botToken: "token-sut", replyToMode: "off" as const } }, + }, + expected: "off", + }, + ])("$name", ({ telegram, expected }) => { + const resolveReplyToMode = telegramPlugin.threading?.resolveReplyToMode; + if (!resolveReplyToMode) { + throw new Error("Telegram reply mode resolver is unavailable"); + } + + const cfg = { channels: { telegram } } as OpenClawConfig; + expect(resolveReplyToMode({ cfg, accountId: "sut" })).toBe(expected); + }); +}); + describe("buildTelegramThreadingToolContext", () => { it("keeps topic thread state in plugin-owned tool context", () => { const hasRepliedRef = { value: false };