UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

119 lines (118 loc) • 7.35 kB
import { D as withPluginCache, a as createPluginCache } from "./plugin-cache-Bn9I3v9Q.mjs"; import { r as isPathInside } from "./path-guards-CH7noY0Z.mjs"; import { r as cloneEnvWithPlatformSemantics } from "./config-env-vars-oFV7TqIg.mjs"; import { m as withOpenClawStateDatabaseReadSnapshot, r as isArtifactPreservingStateRead } from "./openclaw-state-db-readonly-BLZyK3So.mjs"; import { l as normalizePluginsConfig } from "./config-state-1t-kMQI9.mjs"; import { t as resolvePluginDoctorContractArtifact } from "./doctor-contract-artifact-CcGedeeH.mjs"; import { t as resolveInstalledPluginIndexStateDatabaseOptions } from "./installed-plugin-index-store-path-jarznWL7.mjs"; import { l as withPluginMetadataSnapshotScope } from "./current-plugin-metadata-snapshot-BvP9Ow4r.mjs"; import { r as resolveUpdateRehearsalRoot } from "./update-rehearsal-paths-C4PfIK1q.mjs"; import { r as resolveConfigWidePluginMetadataSnapshot } from "./io.plugin-metadata-C02Zx1rp.mjs"; import { i as passesManifestOwnerBasePolicy } from "./manifest-owner-policy-BRwRqqb1.mjs"; import { a as resolveDeferredPluginMigrationConfigPaths } from "./deferred-plugin-migration-config-BshpW6Yw.mjs"; import { c as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-CVKBkXZ7.mjs"; import { t as createInstalledPluginIndexScopeLookup } from "./installed-plugin-index-scope-lookup-By4QTjbZ.mjs"; import { i as collectConfiguredRuntimeIds } from "./configured-runtime-plugin-installs-F3Exu4DH.mjs"; import { n as isPayloadMissing } from "./payload-verification-C2ZVncEI.mjs"; import { a as collectConfiguredChannelIds, i as collectBlockedPluginIds, n as collectUpdateDeferredPluginIds, o as collectConfiguredPluginIds, r as resolveConfiguredPluginInstallContext } from "./missing-configured-plugin-install.candidates-BUCVMdNJ.mjs"; //#region src/commands/doctor/shared/plugin-migration-availability.ts /** Inspect the selected package generation without importing its Doctor contract. */ async function inspectPluginMigrationAvailability(params) { const artifactPreserving = isArtifactPreservingStateRead(); const env = artifactPreserving ? cloneEnvWithPlatformSemantics(params.env) : params.env; const rehearsalRoot = resolveUpdateRehearsalRoot(env); const inspect = () => withPluginCache(createPluginCache(), async () => { const metadata = params.installRecords !== void 0 ? resolveConfigWidePluginMetadataSnapshot({ config: params.cfg, env, installRecords: params.installRecords, allowCurrent: false }) : loadManifestMetadataSnapshot({ config: params.cfg, env }); return withPluginMetadataSnapshotScope(metadata, async () => { const configuredPluginIds = collectConfiguredPluginIds(params.cfg, env); const configuredChannelIds = collectConfiguredChannelIds(params.cfg, env); const blockedPluginIds = collectBlockedPluginIds(params.cfg); const context = await resolveConfiguredPluginInstallContext({ cfg: params.cfg, env, configuredPluginIds, configuredChannelIds, blockedPluginIds, baselineRecords: params.installRecords }); const selected = collectUpdateDeferredPluginIds({ cfg: params.cfg, env, configuredPluginIds, configuredChannelIds, configuredChannelOwnerPluginIds: context.configuredChannelOwnerPluginIds, blockedPluginIds }); const inspectedIds = /* @__PURE__ */ new Set([...selected, ...params.retainedPluginIds ?? []]); const requiredPluginIds = []; const inspectionRequiredPluginIds = []; const statelessCandidates = /* @__PURE__ */ new Set(); for (const plugin of metadata.plugins) { if (!inspectedIds.has(plugin.id)) continue; const declaration = plugin.doctorContract?.stateMigrations; const artifact = resolvePluginDoctorContractArtifact(plugin); const legacySetup = declaration !== true && !Array.isArray(declaration) && plugin.origin !== "bundled" && plugin.channels.length > 0 && plugin.setupSource; if (declaration === true || Array.isArray(declaration) && declaration.length > 0) requiredPluginIds.push(plugin.id); else if (legacySetup || artifact && (!plugin.doctorContract || Array.isArray(declaration))) inspectionRequiredPluginIds.push(plugin.id); else statelessCandidates.add(plugin.id); } const requiredIds = new Set(requiredPluginIds); const inspectionRequiredIds = new Set(inspectionRequiredPluginIds); const statelessPluginIds = []; const normalizedConfig = normalizePluginsConfig(params.cfg.plugins); const pending = [...inspectedIds].toSorted().flatMap((pluginId) => { if (!passesManifestOwnerBasePolicy({ plugin: { id: pluginId }, normalizedConfig })) return []; const plugin = metadata.plugins.find((candidate) => candidate.id === pluginId); const bundled = context.bundledPluginsById.has(pluginId); const unavailable = !context.knownIds.has(pluginId) || Object.hasOwn(context.records, pluginId) && isPayloadMissing(env, context.records[pluginId]?.installPath) || context.installedPluginIdsWithRepairablePackages.has(pluginId) || context.configuredPluginIdsWithStaleDescriptors.has(pluginId); const availableWithoutPackageConvergence = bundled || !unavailable && context.records[pluginId]?.source === "path" || plugin?.origin === "config" && rehearsalRoot !== void 0 && isPathInside(rehearsalRoot, plugin.rootDir) && !unavailable; if ((availableWithoutPackageConvergence || !params.deferInstallation && !unavailable) && plugin && statelessCandidates.has(pluginId)) statelessPluginIds.push(pluginId); if (!selected.has(pluginId) || availableWithoutPackageConvergence || !params.deferInstallation && !unavailable) return []; return [{ pluginId, ...requiredIds.has(pluginId) ? { requiresStateMigration: true } : {}, ...inspectionRequiredIds.has(pluginId) ? { requiresDoctorInspection: true } : {}, ...resolveDeferredPluginMigrationConfigPaths({ config: params.cfg, pluginId, compatibilityMigrationPaths: plugin?.configContracts?.compatibilityMigrationPaths }), reason: params.deferInstallation ? "Package convergence must wait until the updating parent releases its install records." : "The configured plugin package is missing or has not converged.", command: "openclaw update repair" }]; }); const lookup = createInstalledPluginIndexScopeLookup(metadata.index); const statelessIds = new Set(statelessPluginIds); const runtimePluginAliases = collectConfiguredRuntimeIds(params.cfg).filter((runtime) => { if (selected.has(runtime) || lookup.hasInstalledPluginIds([runtime]) || Object.hasOwn(context.records, runtime) || Object.hasOwn(params.cfg.plugins?.entries ?? {}, runtime)) return false; const owners = /* @__PURE__ */ new Set(); lookup.addAgentHarnessOwners(owners, [runtime]); return owners.size > 0 && [...owners].every((owner) => statelessIds.has(owner)); }); return { pending, requiredPluginIds: requiredPluginIds.toSorted(), inspectionRequiredPluginIds: inspectionRequiredPluginIds.toSorted(), statelessPluginIds, runtimePluginAliases }; }, { config: params.cfg, env }); }); return artifactPreserving ? withOpenClawStateDatabaseReadSnapshot(inspect, resolveInstalledPluginIndexStateDatabaseOptions({ env })) : inspect(); } //#endregion export { inspectPluginMigrationAvailability as t };