




















@@ -2,9 +2,12 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types";
22import { beforeEach, describe, expect, it, vi } from "vitest";
33import {
44collectTelegramInvalidAllowFromWarnings,
5+collectTelegramApiRootWarnings,
56collectTelegramEmptyAllowlistExtraWarnings,
67collectTelegramGroupPolicyWarnings,
8+maybeRepairTelegramApiRoots,
79maybeRepairTelegramAllowFromUsernames,
10+scanTelegramBotEndpointApiRoots,
811scanTelegramInvalidAllowFromEntries,
912telegramDoctor,
1013} from "./doctor.js";
@@ -288,4 +291,68 @@ describe("telegram doctor", () => {
288291expect(warnings[0]).toContain("invalid sender entries");
289292expect(warnings[1]).toContain("openclaw doctor --fix");
290293});
294+295+it("warns and repairs Telegram apiRoot values that include the bot endpoint", () => {
296+const cfg = {
297+channels: {
298+telegram: {
299+apiRoot: "https://api.telegram.org/bot123456:ABC",
300+accounts: {
301+work: {
302+apiRoot: "https://proxy.example.test/custom/bot234567:DEF/",
303+},
304+},
305+},
306+},
307+} as unknown as OpenClawConfig;
308+309+const hits = scanTelegramBotEndpointApiRoots(cfg);
310+expect(hits.map((hit) => hit.path)).toEqual([
311+"channels.telegram.apiRoot",
312+"channels.telegram.accounts.work.apiRoot",
313+]);
314+expect(
315+collectTelegramApiRootWarnings({ hits, doctorFixCommand: "openclaw doctor --fix" }),
316+).toContain(
317+"- channels.telegram.apiRoot points at a full Telegram bot endpoint; apiRoot must be the Bot API root only. This can make startup calls like deleteWebhook, deleteMyCommands, and setMyCommands fail with 404 even when direct curl commands work.",
318+);
319+320+const repaired = maybeRepairTelegramApiRoots(cfg);
321+expect(repaired.config.channels?.telegram?.apiRoot).toBe("https://api.telegram.org");
322+expect(repaired.config.channels?.telegram?.accounts?.work?.apiRoot).toBe(
323+"https://proxy.example.test/custom",
324+);
325+expect(repaired.changes).toEqual([
326+"- channels.telegram.apiRoot: removed trailing /bot<TOKEN> from Telegram apiRoot.",
327+"- channels.telegram.accounts.work.apiRoot: removed trailing /bot<TOKEN> from Telegram apiRoot.",
328+]);
329+});
330+331+it("wires apiRoot preview warnings and repair through the doctor adapter", async () => {
332+const cfg = {
333+channels: {
334+telegram: {
335+apiRoot: "https://api.telegram.org/bot123456:ABC",
336+},
337+},
338+} as unknown as OpenClawConfig;
339+340+expect(
341+await telegramDoctor.collectPreviewWarnings?.({
342+ cfg,
343+doctorFixCommand: "openclaw doctor --fix",
344+}),
345+).toContain(
346+"- channels.telegram.apiRoot points at a full Telegram bot endpoint; apiRoot must be the Bot API root only. This can make startup calls like deleteWebhook, deleteMyCommands, and setMyCommands fail with 404 even when direct curl commands work.",
347+);
348+349+const repaired = await telegramDoctor.repairConfig?.({
350+ cfg,
351+doctorFixCommand: "openclaw doctor --fix",
352+});
353+expect(repaired?.config.channels?.telegram?.apiRoot).toBe("https://api.telegram.org");
354+expect(repaired?.changes).toEqual([
355+"- channels.telegram.apiRoot: removed trailing /bot<TOKEN> from Telegram apiRoot.",
356+]);
357+});
291358});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。