UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

127 lines (126 loc) 5.43 kB
import { t as getBootstrapChannelPlugin } from "./bootstrap-registry-DdZI5Mh6.js"; import { i as listPluginDoctorLegacyConfigRules, n as collectRelevantDoctorPluginIds, r as collectRelevantDoctorPluginIdsForTouchedPaths } from "./doctor-contract-registry-CsKKvCKc.js"; import { c as loadBundledChannelDoctorContractApi, n as LEGACY_CONFIG_MIGRATION_RULES } from "./legacy-config-migrations-DpcSqkVJ.js"; //#region src/channels/plugins/legacy-config.ts function collectConfiguredChannelIds$1(raw) { if (!raw || typeof raw !== "object") return []; const channels = raw.channels; if (!channels || typeof channels !== "object" || Array.isArray(channels)) return []; return Object.keys(channels).filter((channelId) => channelId !== "defaults").map((channelId) => channelId); } function shouldIncludeLegacyRuleForTouchedPaths(rulePath, touchedPaths) { if (!touchedPaths || touchedPaths.length === 0) return true; return touchedPaths.some((touchedPath) => { const sharedLength = Math.min(rulePath.length, touchedPath.length); for (let index = 0; index < sharedLength; index += 1) if (rulePath[index] !== touchedPath[index]) return false; return true; }); } function collectRelevantChannelIdsForTouchedPaths(params) { const channelIds = collectConfiguredChannelIds$1(params.raw); const filteredChannelIds = params.excludedChannelIds?.size ? channelIds.filter((channelId) => !params.excludedChannelIds?.has(channelId)) : channelIds; if (!params.touchedPaths || params.touchedPaths.length === 0) return filteredChannelIds; const touchedChannelIds = /* @__PURE__ */ new Set(); for (const touchedPath of params.touchedPaths) { const [first, second] = touchedPath; if (first !== "channels") continue; if (!second) return filteredChannelIds; if (second === "defaults") continue; touchedChannelIds.add(second); } if (touchedChannelIds.size === 0) return []; return filteredChannelIds.filter((channelId) => touchedChannelIds.has(channelId)); } function collectChannelLegacyConfigRules(raw, touchedPaths, excludedChannelIds) { const channelIds = collectRelevantChannelIdsForTouchedPaths({ raw, touchedPaths, excludedChannelIds }); const rules = []; const unresolvedChannelIds = []; for (const channelId of channelIds) { const contractRules = loadBundledChannelDoctorContractApi(channelId)?.legacyConfigRules; if (Array.isArray(contractRules)) { rules.push(...contractRules); continue; } const plugin = getBootstrapChannelPlugin(channelId); if (plugin?.doctor?.legacyConfigRules?.length) { rules.push(...plugin.doctor.legacyConfigRules); continue; } if (plugin) continue; unresolvedChannelIds.push(channelId); } if (unresolvedChannelIds.length > 0) rules.push(...listPluginDoctorLegacyConfigRules({ config: raw, pluginIds: unresolvedChannelIds })); const seen = /* @__PURE__ */ new Set(); return rules.filter((rule) => { if (!shouldIncludeLegacyRuleForTouchedPaths(rule.path, touchedPaths)) return false; const key = `${rule.path.join(".")}::${rule.message}`; if (seen.has(key)) return false; seen.add(key); return true; }); } //#endregion //#region src/config/legacy.ts function getPathValue(root, path) { let cursor = root; for (const key of path) { if (!cursor || typeof cursor !== "object") return; cursor = cursor[key]; } return cursor; } /** Finds legacy config issues using built-in rules plus optional caller rules. */ function findLegacyConfigIssues(raw, sourceRaw, extraRules = [], _touchedPaths) { if (!raw || typeof raw !== "object") return []; const root = raw; const sourceRoot = sourceRaw && typeof sourceRaw === "object" ? sourceRaw : root; const issues = []; for (const rule of [...LEGACY_CONFIG_MIGRATION_RULES, ...extraRules]) { const cursor = getPathValue(root, rule.path); if (cursor !== void 0 && (!rule.match || rule.match(cursor, root))) { if (rule.requireSourceLiteral) { const sourceCursor = getPathValue(sourceRoot, rule.path); if (sourceCursor === void 0) continue; if (rule.match && !rule.match(sourceCursor, sourceRoot)) continue; } issues.push({ path: rule.path.join("."), message: rule.message }); } } return issues; } //#endregion //#region src/commands/doctor/shared/legacy-config-issues.ts function collectConfiguredChannelIds(raw) { if (!raw || typeof raw !== "object") return /* @__PURE__ */ new Set(); const channels = raw.channels; if (!channels || typeof channels !== "object" || Array.isArray(channels)) return /* @__PURE__ */ new Set(); return new Set(Object.keys(channels).filter((channelId) => channelId !== "defaults")); } function collectPluginLegacyConfigRules(raw, touchedPaths) { const channelIds = collectConfiguredChannelIds(raw); const pluginIds = (touchedPaths ? collectRelevantDoctorPluginIdsForTouchedPaths({ raw, touchedPaths }) : collectRelevantDoctorPluginIds(raw)).filter((pluginId) => !channelIds.has(pluginId)); if (pluginIds.length === 0) return []; return listPluginDoctorLegacyConfigRules({ config: raw, pluginIds }); } /** Find legacy config issues using core rules plus relevant channel/plugin doctor contracts. */ function findDoctorLegacyConfigIssues(raw, sourceRaw, touchedPaths) { return findLegacyConfigIssues(raw, sourceRaw, [...collectChannelLegacyConfigRules(raw, touchedPaths), ...collectPluginLegacyConfigRules(raw, touchedPaths)], touchedPaths); } //#endregion export { findDoctorLegacyConfigIssues as t };