UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

119 lines (118 loc) 5.12 kB
import { t as sanitizeForLog } from "./ansi-BI9w76Cm.js"; import { d as parseLegacyBundledPluginPath, f as parsePackagedBundledPluginPath, l as buildBundledPluginLoadPathAliases, u as normalizeBundledLookupPath } from "./discovery-BDSfxwT6.js"; import { p as resolveUserPath } from "./utils-CCC-BEJH.js"; import "./agent-scope-MrLta7Pq.js"; import { c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js"; import { i as resolveBundledPluginSources } from "./bundled-sources-C3sNzxQs.js"; import { t as asObjectRecord } from "./object-BsiS9JXh.js"; import path from "node:path"; //#region src/commands/doctor/shared/bundled-plugin-load-paths.ts function resolveBundledWorkspaceDir(cfg) { return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg)) ?? void 0; } function isOpenClawNodeModulesPackageRoot(packageRoot) { const normalized = normalizeBundledLookupPath(packageRoot); const packageDir = path.basename(normalized); const parentDir = path.basename(path.dirname(normalized)); return packageDir === "openclaw" && parentDir === "node_modules"; } /** Find configured plugin load paths that alias bundled plugins already shipped by OpenClaw. */ function scanBundledPluginLoadPathMigrations(cfg, env = process.env) { const load = asObjectRecord(asObjectRecord(cfg.plugins)?.load); const rawPaths = Array.isArray(load?.paths) ? load.paths : []; if (rawPaths.length === 0) return []; const bundled = resolveBundledPluginSources({ workspaceDir: resolveBundledWorkspaceDir(cfg), env }); if (bundled.size === 0) return []; const bundledPathMap = /* @__PURE__ */ new Map(); const packagedBundledLeafMap = /* @__PURE__ */ new Map(); for (const source of bundled.values()) { for (const alias of buildBundledPluginLoadPathAliases(source.localPath)) bundledPathMap.set(normalizeBundledLookupPath(alias.path), { pluginId: source.pluginId, toPath: source.localPath }); const packaged = parsePackagedBundledPluginPath(source.localPath); if (packaged) packagedBundledLeafMap.set(normalizeBundledLookupPath(packaged.bundledLeaf), { pluginId: source.pluginId, toPath: source.localPath }); } const hits = []; for (const rawPath of rawPaths) { if (typeof rawPath !== "string") continue; const normalized = normalizeBundledLookupPath(resolveUserPath(rawPath, env)); const match = bundledPathMap.get(normalized); if (!match) { const oldPackaged = parsePackagedBundledPluginPath(normalized); const oldLegacy = oldPackaged ? null : parseLegacyBundledPluginPath(normalized); const oldPackageRoot = oldPackaged?.packageRoot ?? oldLegacy?.packageRoot; const oldBundledLeaf = oldPackaged?.bundledLeaf ?? oldLegacy?.bundledLeaf; const oldPackageMatch = oldPackageRoot && oldBundledLeaf && isOpenClawNodeModulesPackageRoot(oldPackageRoot) ? packagedBundledLeafMap.get(normalizeBundledLookupPath(oldBundledLeaf)) : void 0; if (!oldPackageMatch) continue; hits.push({ pluginId: oldPackageMatch.pluginId, fromPath: rawPath, toPath: oldPackageMatch.toPath, pathLabel: "plugins.load.paths" }); continue; } hits.push({ pluginId: match.pluginId, fromPath: rawPath, toPath: match.toPath, pathLabel: "plugins.load.paths" }); } return hits; } /** Format user-facing warnings for redundant bundled plugin load path aliases. */ function collectBundledPluginLoadPathWarnings(params) { if (params.hits.length === 0) return []; const lines = params.hits.map((hit) => `- ${hit.pathLabel}: bundled plugin path "${hit.fromPath}" still aliases ${hit.pluginId}; OpenClaw loads the packaged bundled plugin from "${hit.toPath}".`); lines.push(`- Run "${params.doctorFixCommand}" to remove these redundant bundled plugin paths.`); return lines.map((line) => sanitizeForLog(line)); } /** Remove redundant bundled plugin load path aliases while preserving unrelated custom paths. */ function maybeRepairBundledPluginLoadPaths(cfg, env = process.env) { const hits = scanBundledPluginLoadPathMigrations(cfg, env); if (hits.length === 0) return { config: cfg, changes: [] }; const next = structuredClone(cfg); const paths = next.plugins?.load?.paths; if (!Array.isArray(paths)) return { config: cfg, changes: [] }; const removable = new Set(hits.map((hit) => normalizeBundledLookupPath(resolveUserPath(hit.fromPath, env)))); const seen = /* @__PURE__ */ new Set(); const rewritten = []; for (const entry of paths) { if (typeof entry !== "string") { rewritten.push(entry); continue; } const resolved = normalizeBundledLookupPath(resolveUserPath(entry, env)); if (removable.has(resolved)) continue; if (seen.has(resolved)) continue; seen.add(resolved); rewritten.push(entry); } next.plugins = { ...next.plugins, load: { ...next.plugins?.load, paths: rewritten } }; return { config: next, changes: hits.map((hit) => `- plugins.load.paths: removed bundled ${hit.pluginId} path alias ${hit.fromPath}`) }; } //#endregion export { maybeRepairBundledPluginLoadPaths as n, scanBundledPluginLoadPathMigrations as r, collectBundledPluginLoadPathWarnings as t };