diff --git a/extensions/slack/src/doctor-contract.ts b/extensions/slack/src/doctor-contract.ts index 21a5794438e..b93b0aa0a34 100644 --- a/extensions/slack/src/doctor-contract.ts +++ b/extensions/slack/src/doctor-contract.ts @@ -4,6 +4,7 @@ import type { } from "openclaw/plugin-sdk/channel-contract"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { + hasLegacyAccountStreamingAliases, hasLegacyStreamingAliases, normalizeLegacyDmAliases, normalizeLegacyStreamingAliases, @@ -21,11 +22,7 @@ function hasLegacySlackStreamingAliases(value: unknown): boolean { } function hasLegacySlackAccountStreamingAliases(value: unknown): boolean { - const accounts = asObjectRecord(value); - if (!accounts) { - return false; - } - return Object.values(accounts).some((account) => hasLegacySlackStreamingAliases(account)); + return hasLegacyAccountStreamingAliases(value, hasLegacySlackStreamingAliases); } export const legacyConfigRules: ChannelDoctorLegacyConfigRule[] = [ diff --git a/extensions/telegram/src/doctor-contract.ts b/extensions/telegram/src/doctor-contract.ts index cc61cbdaca2..c0ca943f5b5 100644 --- a/extensions/telegram/src/doctor-contract.ts +++ b/extensions/telegram/src/doctor-contract.ts @@ -4,6 +4,7 @@ import type { } from "openclaw/plugin-sdk/channel-contract"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { + hasLegacyAccountStreamingAliases, hasLegacyStreamingAliases, normalizeLegacyStreamingAliases, } from "openclaw/plugin-sdk/runtime-doctor"; @@ -20,11 +21,7 @@ function hasLegacyTelegramStreamingAliases(value: unknown): boolean { } function hasLegacyTelegramAccountStreamingAliases(value: unknown): boolean { - const accounts = asObjectRecord(value); - if (!accounts) { - return false; - } - return Object.values(accounts).some((account) => hasLegacyTelegramStreamingAliases(account)); + return hasLegacyAccountStreamingAliases(value, hasLegacyTelegramStreamingAliases); } function resolveCompatibleDefaultGroupEntry(section: Record): { diff --git a/src/config/channel-compat-normalization.ts b/src/config/channel-compat-normalization.ts index bc1445f7e3c..7bd30c74633 100644 --- a/src/config/channel-compat-normalization.ts +++ b/src/config/channel-compat-normalization.ts @@ -9,6 +9,17 @@ function asObjectRecord(value: unknown): Record | null { : null; } +export function hasLegacyAccountStreamingAliases( + value: unknown, + match: (entry: unknown) => boolean, +): boolean { + const accounts = asObjectRecord(value); + if (!accounts) { + return false; + } + return Object.values(accounts).some((account) => match(account)); +} + function ensureNestedRecord(owner: Record, key: string): Record { const existing = asObjectRecord(owner[key]); if (existing) { diff --git a/src/plugin-sdk/runtime-doctor.ts b/src/plugin-sdk/runtime-doctor.ts index e095647a277..af9eebbae61 100644 --- a/src/plugin-sdk/runtime-doctor.ts +++ b/src/plugin-sdk/runtime-doctor.ts @@ -1,5 +1,6 @@ export { collectProviderDangerousNameMatchingScopes } from "../config/dangerous-name-matching.js"; export { + hasLegacyAccountStreamingAliases, hasLegacyStreamingAliases, normalizeLegacyDmAliases, normalizeLegacyStreamingAliases,