openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
85 lines (84 loc) • 4.46 kB
JavaScript
import { p as shortenHomePath } from "./utils-DgZn2dLu.mjs";
import { a as resolveAgentDir, h as resolveDefaultAgentDir } from "./agent-scope-config-CDYpzA0r.mjs";
import { i as listAgentIds } from "./agent-roster-BXD1uMJD.mjs";
import "./agent-scope-CG17uXFn.mjs";
import { r as repairPluginModelCatalogTransportMetadata } from "./plugin-model-catalog-repair-gbFum2dR.mjs";
import { a as loadPersistedPluginModelCatalogsReadOnly, i as inspectLegacyPluginModelCatalogs, o as migrateLegacyPluginModelCatalogs, s as repairPersistedPluginModelCatalogs } from "./plugin-model-catalog-BkfUsFfG.mjs";
import { t as note } from "./note-Byxgt4MB.mjs";
//#region src/commands/doctor-plugin-model-catalog.ts
/** Doctor-owned migration and repair of persisted generated provider catalogs. */
function resolveMigrationAgentDirs(params) {
let agentDirs = params.agentDirs;
const env = params.env ?? process.env;
if (!agentDirs) {
const agentIds = listAgentIds(params.cfg);
agentDirs = agentIds.length > 0 ? agentIds.map((agentId) => resolveAgentDir(params.cfg, agentId, env)) : [resolveDefaultAgentDir(params.cfg, env)];
}
return [...new Set(agentDirs)].toSorted((left, right) => left.localeCompare(right));
}
/** Imports released sidecars and repairs persisted SQLite catalogs only with Doctor authority. */
async function maybeMigrateLegacyPluginModelCatalogs(params) {
const warnings = [];
const agents = [];
for (const agentDir of resolveMigrationAgentDirs(params)) {
const inspected = inspectLegacyPluginModelCatalogs(agentDir);
const agentWarnings = inspected.warnings.map((warning) => shortenHomePath(warning));
const migrations = inspected.catalogs;
const repairablePluginIds = loadPersistedPluginModelCatalogsReadOnly(agentDir).filter(({ contents }) => repairPluginModelCatalogTransportMetadata(contents).removedModelCount > 0).map(({ pluginId }) => pluginId);
agents.push({
agentDir,
migrations,
warnings: agentWarnings,
repairablePluginIds
});
warnings.push(...agentWarnings);
}
const migrations = agents.flatMap((agent) => agent.migrations);
const detected = migrations.length + agents.reduce((count, agent) => count + agent.repairablePluginIds.length, 0);
for (const warning of warnings) params.runtime.error(warning);
const emitNote = params.note ?? note;
if (detected > 0) {
const details = migrations.length > 0 ? ["Legacy generated provider catalogs contain model and credential state.", ...migrations.map((migration) => `- ${shortenHomePath(migration.pathname)}`)] : [];
for (const agent of agents) for (const pluginId of agent.repairablePluginIds) details.push(`Generated catalog ${pluginId} in ${shortenHomePath(agent.agentDir)} contains model rows without transport API metadata.`);
details.push("Run openclaw doctor --fix to verify and repair these catalogs.");
emitNote(details.join("\n"), "Plugin model catalogs");
}
if (!(params.prompter.shouldRepair || detected > 0 && await params.prompter.confirmAutoFix({
message: "Repair generated provider model catalogs now?",
initialValue: true
}))) return {
detected,
migrated: 0,
repaired: 0,
warnings
};
let migrated = 0;
const repairs = [];
for (const agent of agents) {
const result = migrateLegacyPluginModelCatalogs({
agentDir: agent.agentDir,
...agent.migrations.length > 0 ? { expectedContents: new Map(agent.migrations.map((migration) => [migration.pluginId, migration.contents])) } : {}
});
migrated += result.migrated;
for (const warning of result.warnings) {
const displayWarning = shortenHomePath(warning);
if (warnings.includes(displayWarning)) continue;
warnings.push(displayWarning);
params.runtime.error(displayWarning);
}
if (agent.warnings.length === 0 && result.warnings.length === 0) repairs.push(...repairPersistedPluginModelCatalogs({
agentDir: agent.agentDir,
catalogs: loadPersistedPluginModelCatalogsReadOnly(agent.agentDir)
}));
}
if (migrated > 0) emitNote(`Migrated and verified ${migrated} generated provider catalog${migrated === 1 ? "" : "s"} in agent SQLite.`, "Doctor changes");
if (repairs.length > 0) emitNote(repairs.map(({ pluginId, removedModelCount }) => `Repaired generated model catalog ${pluginId}: removed ${removedModelCount} model row(s) without transport API metadata.`).join("\n"), "Doctor changes");
return {
detected,
migrated,
repaired: repairs.length,
warnings
};
}
//#endregion
export { maybeMigrateLegacyPluginModelCatalogs };