mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-06 14:51:08 +00:00
77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
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<string>();
|
|
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;
|
|
}
|