From 4f92b1fbb0b5bed5949a5cd5a5436e87f20bcd87 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 13 Apr 2026 23:59:26 +0530 Subject: [PATCH] fix(telegram): allow topic cache without session runtime --- .../bot-message-context.dm-threads.test.ts | 23 +++++++++++++++++++ .../src/bot-message-context.test-harness.ts | 14 +++++++---- .../telegram/src/bot-message-context.ts | 8 ++++--- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/extensions/telegram/src/bot-message-context.dm-threads.test.ts b/extensions/telegram/src/bot-message-context.dm-threads.test.ts index 10c9441ee19..6efd0e0d2f9 100644 --- a/extensions/telegram/src/bot-message-context.dm-threads.test.ts +++ b/extensions/telegram/src/bot-message-context.dm-threads.test.ts @@ -168,6 +168,29 @@ describe("buildTelegramMessageContext group sessions without forum", () => { expect(ctx?.ctxPayload?.TopicName).toBe("Deployments"); }); + it("handles forum messages without session runtime overrides", async () => { + const ctx = await buildTelegramMessageContextForTest({ + message: { + message_id: 3, + chat: { id: -1001234567890, type: "supergroup", title: "Test Forum", is_forum: true }, + date: 1700000002, + text: "@bot hello", + message_thread_id: 99, + from: { id: 42, first_name: "Alice" }, + reply_to_message: { + message_id: 2, + forum_topic_created: { name: "Deployments", icon_color: 0x6fb9f0 }, + }, + }, + options: { forceWasMentioned: true }, + resolveGroupActivation: () => true, + sessionRuntime: null, + }); + + expect(ctx).not.toBeNull(); + expect(ctx?.ctxPayload?.TopicName).toBe("Deployments"); + }); + it("reloads topic name from disk after cache reset", async () => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-telegram-topic-name-")); const sessionStorePath = path.join(tempDir, "sessions.json"); diff --git a/extensions/telegram/src/bot-message-context.test-harness.ts b/extensions/telegram/src/bot-message-context.test-harness.ts index f19b631b338..3dd0dec8bad 100644 --- a/extensions/telegram/src/bot-message-context.test-harness.ts +++ b/extensions/telegram/src/bot-message-context.test-harness.ts @@ -36,7 +36,7 @@ type BuildTelegramMessageContextForTestParams = { cfg?: Record; accountId?: string; runtime?: BuildTelegramMessageContextParams["runtime"]; - sessionRuntime?: BuildTelegramMessageContextParams["sessionRuntime"]; + sessionRuntime?: BuildTelegramMessageContextParams["sessionRuntime"] | null; resolveGroupActivation?: BuildTelegramMessageContextParams["resolveGroupActivation"]; resolveGroupRequireMention?: BuildTelegramMessageContextParams["resolveGroupRequireMention"]; resolveTelegramGroupConfig?: BuildTelegramMessageContextParams["resolveTelegramGroupConfig"]; @@ -59,6 +59,13 @@ export async function buildTelegramMessageContextForTest( > { const { vi } = await loadVitestModule(); const buildTelegramMessageContext = await loadBuildTelegramMessageContext(); + const sessionRuntime = + params.sessionRuntime === null + ? undefined + : { + ...telegramMessageContextSessionRuntimeForTest, + ...params.sessionRuntime, + }; return await buildTelegramMessageContext({ primaryCtx: { message: { @@ -85,10 +92,7 @@ export async function buildTelegramMessageContextForTest( recordChannelActivity: () => undefined, ...params.runtime, }, - sessionRuntime: { - ...telegramMessageContextSessionRuntimeForTest, - ...params.sessionRuntime, - }, + sessionRuntime, account: { accountId: params.accountId ?? "default" } as never, historyLimit: 0, groupHistories: new Map(), diff --git a/extensions/telegram/src/bot-message-context.ts b/extensions/telegram/src/bot-message-context.ts index 5f7bcb16006..7bd40b5dcac 100644 --- a/extensions/telegram/src/bot-message-context.ts +++ b/extensions/telegram/src/bot-message-context.ts @@ -149,9 +149,11 @@ export const buildTelegramMessageContext = async ({ const resolvedThreadId = threadSpec.scope === "forum" ? threadSpec.id : undefined; const replyThreadId = threadSpec.id; const dmThreadId = threadSpec.scope === "dm" ? threadSpec.id : undefined; - const topicNameCachePath = resolveTopicNameCachePath( - sessionRuntime.resolveStorePath(cfg.session?.store, { agentId: account.accountId }), - ); + const topicNameCachePath = sessionRuntime?.resolveStorePath + ? resolveTopicNameCachePath( + sessionRuntime.resolveStorePath(cfg.session?.store, { agentId: account.accountId }), + ) + : undefined; let topicName: string | undefined; if (isForum && resolvedThreadId != null) { const ftCreated = msg.forum_topic_created;