From f42b12646d8b3478c85842d48275384c0553489b Mon Sep 17 00:00:00 2001 From: danielz1z Date: Sat, 17 Jan 2026 05:11:57 +0000 Subject: [PATCH] fix: handle object-format capabilities in normalizeCapabilities When capabilities is configured as an object (e.g., { inlineButtons: "dm" }) instead of a string array, normalizeCapabilities() would crash with "capabilities.map is not a function". This can occur when using the new Telegram inline buttons scoping feature: channels.telegram.capabilities.inlineButtons = "dm" The fix adds an Array.isArray() guard to return undefined for non-array capabilities, allowing channel-specific handlers (like resolveTelegramInlineButtonsScope) to process the object format separately. Fixes crash when using object-format TelegramCapabilitiesConfig. --- src/config/channel-capabilities.test.ts | 20 ++++++++++++++++++++ src/config/channel-capabilities.ts | 3 +++ 2 files changed, 23 insertions(+) diff --git a/src/config/channel-capabilities.test.ts b/src/config/channel-capabilities.test.ts index c53b5fa00..9e5dccac7 100644 --- a/src/config/channel-capabilities.test.ts +++ b/src/config/channel-capabilities.test.ts @@ -105,6 +105,26 @@ describe("resolveChannelCapabilities", () => { }), ).toEqual(["polls"]); }); + + it("handles object-format capabilities gracefully (e.g., { inlineButtons: 'dm' })", () => { + const cfg = { + channels: { + telegram: { + // Object format - used for granular control like inlineButtons scope. + // Channel-specific handlers (resolveTelegramInlineButtonsScope) process these. + capabilities: { inlineButtons: "dm" }, + }, + }, + }; + + // Should return undefined (not crash), allowing channel-specific handlers to process it. + expect( + resolveChannelCapabilities({ + cfg: cfg as ClawdbotConfig, + channel: "telegram", + }), + ).toBeUndefined(); + }); }); const createRegistry = (channels: PluginRegistry["channels"]): PluginRegistry => ({ diff --git a/src/config/channel-capabilities.ts b/src/config/channel-capabilities.ts index 9161301ad..08ffc1b8b 100644 --- a/src/config/channel-capabilities.ts +++ b/src/config/channel-capabilities.ts @@ -4,6 +4,9 @@ import type { ClawdbotConfig } from "./config.js"; function normalizeCapabilities(capabilities: string[] | undefined): string[] | undefined { if (!capabilities) return undefined; + // Handle object-format capabilities (e.g., { inlineButtons: "dm" }) gracefully. + // Channel-specific handlers (like resolveTelegramInlineButtonsScope) process these separately. + if (!Array.isArray(capabilities)) return undefined; const normalized = capabilities.map((entry) => entry.trim()).filter(Boolean); return normalized.length > 0 ? normalized : undefined; }