From 77060aa9f9a41b876bae04a889a1900e28ccbea0 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:30:41 -0500 Subject: [PATCH] fix(regression): preserve Telegram status fallback without runtime --- extensions/telegram/src/channel.test.ts | 25 ++++++++++++++++++++++++- extensions/telegram/src/channel.ts | 9 ++++++++- extensions/telegram/src/runtime.ts | 9 ++++++--- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/extensions/telegram/src/channel.test.ts b/extensions/telegram/src/channel.test.ts index 6ed5e39f700..2349dac128c 100644 --- a/extensions/telegram/src/channel.test.ts +++ b/extensions/telegram/src/channel.test.ts @@ -8,7 +8,7 @@ import * as auditModule from "./audit.js"; import { telegramPlugin } from "./channel.js"; import * as monitorModule from "./monitor.js"; import * as probeModule from "./probe.js"; -import { setTelegramRuntime } from "./runtime.js"; +import { clearTelegramRuntime, setTelegramRuntime } from "./runtime.js"; const probeTelegramMock = vi.hoisted(() => vi.fn()); const collectTelegramUnmentionedGroupIdsMock = vi.hoisted(() => vi.fn()); @@ -292,6 +292,29 @@ describe("telegramPlugin duplicate token guard", () => { expect(monitorTelegramProvider).toHaveBeenCalled(); }); + it("falls back to direct probe helpers when Telegram runtime is uninitialized", async () => { + try { + clearTelegramRuntime(); + const cfg = createCfg(); + const account = resolveAccount(cfg, "ops"); + + await expect( + telegramPlugin.status!.probeAccount!({ + account, + timeoutMs: 1234, + cfg, + }), + ).resolves.toEqual( + expect.objectContaining({ + ok: expect.any(Boolean), + elapsedMs: expect.any(Number), + }), + ); + } finally { + installTelegramRuntime(); + } + }); + it("passes account proxy and network settings into Telegram probes", async () => { installGatewayRuntime(); probeTelegramMock.mockResolvedValue({ diff --git a/extensions/telegram/src/channel.ts b/extensions/telegram/src/channel.ts index fa7c6039f47..783dd78fa3a 100644 --- a/extensions/telegram/src/channel.ts +++ b/extensions/telegram/src/channel.ts @@ -92,7 +92,14 @@ type TelegramStatusRuntimeHelpers = { }; function getTelegramStatusRuntimeHelpers(): TelegramStatusRuntimeHelpers { - return (getTelegramRuntime().channel?.telegram ?? {}) as TelegramStatusRuntimeHelpers; + try { + return (getTelegramRuntime().channel?.telegram ?? {}) as TelegramStatusRuntimeHelpers; + } catch (error) { + if (error instanceof Error && error.message === "Telegram runtime not initialized") { + return {}; + } + throw error; + } } function resolveTelegramProbe() { diff --git a/extensions/telegram/src/runtime.ts b/extensions/telegram/src/runtime.ts index 1cc0c75b5dc..4d28400d3ec 100644 --- a/extensions/telegram/src/runtime.ts +++ b/extensions/telegram/src/runtime.ts @@ -1,6 +1,9 @@ import type { PluginRuntime } from "openclaw/plugin-sdk/core"; import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; -const { setRuntime: setTelegramRuntime, getRuntime: getTelegramRuntime } = - createPluginRuntimeStore("Telegram runtime not initialized"); -export { getTelegramRuntime, setTelegramRuntime }; +const { + setRuntime: setTelegramRuntime, + clearRuntime: clearTelegramRuntime, + getRuntime: getTelegramRuntime, +} = createPluginRuntimeStore("Telegram runtime not initialized"); +export { clearTelegramRuntime, getTelegramRuntime, setTelegramRuntime };