UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

123 lines (122 loc) • 6.58 kB
import { a as copyConfigResolutionFactsThroughRewrite } from "./resolution-facts-NmRQ-VhX.mjs"; import { n as containsConfigIncludeDirective, p as resolveConfigSnapshotHash } from "./io.read-helpers-BBxWMZOW.mjs"; import { t as inheritLegacyDefaultAgentId } from "./legacy.default-agent-owner-CMzbXvh6.mjs"; import { r as validateConfigObjectRaw } from "./validation-core-DHjeBn07.mjs"; import { a as stampConfigWriteMetadata } from "./io.meta-BIiqggKP.mjs"; import { a as preserveDeferredPluginMigrationConfig, c as applyUnsetPathsForWrite, i as omitDeferredPluginMigrationConfig, l as resolveManagedUnsetPathsForWrite, n as getDeferredPluginMigrationConfigFacts, s as setDeferredPluginMigrationConfigFacts } from "./deferred-plugin-migration-config-CohVpj3v.mjs"; import { n as findLegacyConfigRuleIssues, o as LEGACY_TALK_VOICE_CALL_INHERITANCE, t as findLegacyConfigIssues } from "./legacy-DRcorE1g.mjs"; import { r as validateConfigObjectWithPlugins } from "./validation-CTgKi8Pz.mjs"; import { a as transformConfigFile } from "./mutate-C5g37HdW.mjs"; import "./config-VnHbY_QV.mjs"; import { t as findRetiredConfigUpgradeRequirement } from "./retired-config-formats-dWNTYZjK.mjs"; import { i as restoreDoctorConfigEnvRefs, o as applyLegacyDoctorMigrations, r as prepareDoctorConfigReferenceSource } from "./config-flow-steps-BAOy-G5i.mjs"; import { m as withDeferredPluginDoctorMigrations } from "./doctor-contract-registry-6RykhA6j.mjs"; import { t as prepareConfigWriteTopology } from "./io.write-topology-Cl-KxRqI.mjs"; import { n as findDoctorLegacyConfigIssues } from "./legacy-config-issues-CFxv73h_.mjs"; import { isDeepStrictEqual } from "node:util"; //#region src/commands/doctor/shared/automatic-config-repair.ts function canPlanAutomaticConfigRepair(snapshot) { return snapshot.exists && snapshot.raw !== null && !findRetiredConfigUpgradeRequirement(snapshot.sourceConfigBeforeMigrations ?? snapshot.sourceConfig) && (snapshot.includedPaths?.length ?? 0) === 0 && !containsConfigIncludeDirective(snapshot.parsed) && (!snapshot.valid || findLegacyConfigRuleIssues(snapshot.sourceConfig, LEGACY_TALK_VOICE_CALL_INHERITANCE.legacyRules ?? [], snapshot.parsed).length > 0); } function prepareAutomaticConfigRepairWrite(snapshot, config) { const unsetPaths = resolveManagedUnsetPathsForWrite(void 0); return stampConfigWriteMetadata(applyUnsetPathsForWrite(prepareConfigWriteTopology({ snapshot, nextConfig: config, options: { persistCanonicalAgentRoster: true }, unsetPaths, env: process.env }).nextConfig, unsetPaths), void 0, snapshot.parsed); } function planConfigRepair(snapshot, pluginContracts) { if (!canPlanAutomaticConfigRepair(snapshot)) return null; const deferredPluginMigrations = getDeferredPluginMigrationConfigFacts(snapshot.sourceConfig); const withPluginContracts = (run) => deferredPluginMigrations ? withDeferredPluginDoctorMigrations(deferredPluginMigrations.map((pending) => pending.pluginId), run) : run(); const migration = withPluginContracts(() => applyLegacyDoctorMigrations(snapshot.sourceConfig, { sourceConfigBeforeMigrations: snapshot.sourceConfigBeforeMigrations, context: { authoredRaw: snapshot.parsed, resolvedRaw: snapshot.sourceConfig }, pluginContracts })); const config = inheritLegacyDefaultAgentId(migration.next ?? snapshot.sourceConfig, preserveDeferredPluginMigrationConfig({ sourceConfig: snapshot.sourceConfig, nextConfig: migration.next ?? snapshot.sourceConfig, pending: deferredPluginMigrations ?? [] })); if (isDeepStrictEqual(config, snapshot.sourceConfig)) return null; copyConfigResolutionFactsThroughRewrite(snapshot.sourceConfig, config); const writeConfig = pluginContracts ? restoreDoctorConfigEnvRefs(config, prepareDoctorConfigReferenceSource(snapshot)) : config; const validation = withPluginContracts(() => { const validationConfig = omitDeferredPluginMigrationConfig(config, deferredPluginMigrations); const validated = pluginContracts ? validateConfigObjectWithPlugins(prepareAutomaticConfigRepairWrite(snapshot, writeConfig), { deferredPluginMigrations }) : { ...validateConfigObjectRaw(validationConfig), warnings: snapshot.warnings }; const issues = (pluginContracts ? findDoctorLegacyConfigIssues : findLegacyConfigIssues)(validationConfig, validationConfig); return validated.ok && issues.length === 0 ? validated : null; }); if (!validation) return null; const runtimeConfig = deferredPluginMigrations?.length ? validation.config : config; copyConfigResolutionFactsThroughRewrite(snapshot.sourceConfig, runtimeConfig); setDeferredPluginMigrationConfigFacts(config, deferredPluginMigrations); return { config, writeConfig, changes: [...migration.changes, ...migration.warnings ?? []], snapshot: { ...snapshot, sourceConfig: config, resolved: config, runtimeConfig, config: runtimeConfig, warnings: validation.warnings, valid: true, issues: [], legacyIssues: [] } }; } /** Admits only complete, deterministic single-file legacy migrations. */ function planAutomaticConfigRepair(snapshot) { return planConfigRepair(snapshot, true); } /** * Backup inventory and restore overlap checks need legacy roots without changing state. * Full plugin-contract validation belongs to Doctor's repair plan. */ function resolveLegacyConfigSnapshotForBackup(snapshot) { return snapshot.valid ? snapshot : planConfigRepair(snapshot, false)?.snapshot; } /** Commits a planned repair against the exact snapshot admitted by its caller. */ async function commitAutomaticConfigRepair(plan, snapshot) { await transformConfigFile({ baseHash: resolveConfigSnapshotHash(snapshot) ?? void 0, transform: async (_current, { snapshot: currentSnapshot }) => { const { repairLegacyCronOwnersBeforeConfigWrite } = await import("./legacy-owner-beohFz9V.mjs"); const changes = await repairLegacyCronOwnersBeforeConfigWrite({ snapshot: currentSnapshot, nextConfig: plan.writeConfig }); if (changes.length > 0) { const { note } = await import("./terminal-core/note.js"); note(changes.join("\n"), "Doctor changes"); } return { nextConfig: plan.writeConfig }; }, afterWrite: { mode: "none", reason: "automatic migration" }, writeOptions: { expectedConfigPath: snapshot.path, auditOrigin: "doctor", skipOutputLogs: true, skipRuntimeSnapshotRefresh: true, persistCanonicalAgentRoster: true } }); } //#endregion export { resolveLegacyConfigSnapshotForBackup as i, commitAutomaticConfigRepair as n, planAutomaticConfigRepair as r, canPlanAutomaticConfigRepair as t };