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; }