import { normalizeChannelId } from "../channels/plugins/index.js"; import { normalizeAccountId } from "../routing/session-key.js"; import type { ClawdbotConfig } from "./config.js"; import type { TelegramCapabilitiesConfig } from "./types.telegram.js"; type CapabilitiesConfig = TelegramCapabilitiesConfig; const isStringArray = (value: unknown): value is string[] => Array.isArray(value) && value.every((entry) => typeof entry === "string"); function normalizeCapabilities(capabilities: CapabilitiesConfig | undefined): string[] | undefined { // Handle object-format capabilities (e.g., { inlineButtons: "dm" }) gracefully. // Channel-specific handlers (like resolveTelegramInlineButtonsScope) process these separately. if (!isStringArray(capabilities)) return undefined; const normalized = capabilities.map((entry) => entry.trim()).filter(Boolean); return normalized.length > 0 ? normalized : undefined; } function resolveAccountCapabilities(params: { cfg?: { accounts?: Record } & { capabilities?: CapabilitiesConfig; }; accountId?: string | null; }): string[] | undefined { const cfg = params.cfg; if (!cfg) return undefined; const normalizedAccountId = normalizeAccountId(params.accountId); const accounts = cfg.accounts; if (accounts && typeof accounts === "object") { const direct = accounts[normalizedAccountId]; if (direct) { return normalizeCapabilities(direct.capabilities) ?? normalizeCapabilities(cfg.capabilities); } const matchKey = Object.keys(accounts).find( (key) => key.toLowerCase() === normalizedAccountId.toLowerCase(), ); const match = matchKey ? accounts[matchKey] : undefined; if (match) { return normalizeCapabilities(match.capabilities) ?? normalizeCapabilities(cfg.capabilities); } } return normalizeCapabilities(cfg.capabilities); } export function resolveChannelCapabilities(params: { cfg?: Partial; channel?: string | null; accountId?: string | null; }): string[] | undefined { const cfg = params.cfg; const channel = normalizeChannelId(params.channel); if (!cfg || !channel) return undefined; const channelsConfig = cfg.channels as Record | undefined; const channelConfig = (channelsConfig?.[channel] ?? (cfg as Record)[channel]) as | { accounts?: Record; capabilities?: CapabilitiesConfig; } | undefined; return resolveAccountCapabilities({ cfg: channelConfig, accountId: params.accountId, }); }