import { normalizeAnyChannelId } from "../channels/registry.js"; import type { OutboundSendDeps } from "../infra/outbound/deliver.js"; /** * CLI-internal send function sources, keyed by channel ID. * Each value is a lazily-loaded send function for that channel. */ export type CliOutboundSendSource = { [channelId: string]: unknown }; function normalizeLegacyChannelStem(raw: string): string { return raw .replace(/([a-z0-9])([A-Z])/g, "$1-$2") .replace(/_/g, "-") .trim() .toLowerCase() .replace(/-/g, ""); } function resolveChannelIdFromLegacySourceKey(key: string): string | undefined { const match = key.match(/^sendMessage(.+)$/); if (!match) { return undefined; } const normalizedStem = normalizeLegacyChannelStem(match[1] ?? ""); return normalizeAnyChannelId(normalizedStem) ?? (normalizedStem || undefined); } function resolveLegacyDepKeysForChannel(channelId: string): string[] { const compact = channelId.replace(/[^a-z0-9]+/gi, ""); if (!compact) { return []; } const pascal = compact.charAt(0).toUpperCase() + compact.slice(1); const keys = new Set(); keys.add(`send${pascal}`); if (pascal.startsWith("I") && pascal.length > 1) { keys.add(`sendI${pascal.slice(1)}`); } if (pascal.startsWith("Ms") && pascal.length > 2) { keys.add(`sendMS${pascal.slice(2)}`); } return [...keys]; } /** * Pass CLI send sources through as-is — both CliOutboundSendSource and * OutboundSendDeps are now channel-ID-keyed records. */ export function createOutboundSendDepsFromCliSource(deps: CliOutboundSendSource): OutboundSendDeps { const outbound: OutboundSendDeps = { ...deps }; for (const legacySourceKey of Object.keys(deps)) { const channelId = resolveChannelIdFromLegacySourceKey(legacySourceKey); if (!channelId) { continue; } const sourceValue = deps[legacySourceKey]; if (sourceValue !== undefined && outbound[channelId] === undefined) { outbound[channelId] = sourceValue; } } for (const channelId of Object.keys(outbound)) { const sourceValue = outbound[channelId]; if (sourceValue === undefined) { continue; } for (const legacyDepKey of resolveLegacyDepKeysForChannel(channelId)) { if (outbound[legacyDepKey] === undefined) { outbound[legacyDepKey] = sourceValue; } } } return outbound; }