openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
135 lines (134 loc) • 5.8 kB
JavaScript
import { c as isRecord, t as asNonArrayRecord } from "./record-coerce-DItp3I4t.js";
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js";
import "./string-coerce-runtime-GQa0ehRA.js";
import { a as createMigrationConfigPatchItem, c as hasMigrationConfigPatchConflict, f as mergeMigrationConfigValue, s as createMigrationManualItem } from "./migration-q6QzXKht.js";
import { n as childRecord, s as readStringArray, u as sanitizeName } from "./helpers-DWNr52wp.js";
import { r as providerConfig } from "./config-provider-contract-DFe5VpP9.js";
import { n as mapMcpServer, r as mcpManualItems, t as importsMcpSensitiveValues } from "./config-mcp-sB-ku8Jt.js";
import { i as providerManualItems, r as collectHermesProviders, t as addSelectedModelToProvider } from "./config-providers-Cy1MVYhW.js";
import { parse } from "yaml";
//#region extensions/migrate-hermes/config.ts
function mapSkillEntries(config) {
const skills = childRecord(config, "skills");
const entries = /* @__PURE__ */ new Map();
for (const [skillKey, value] of Object.entries(childRecord(skills, "config"))) if (isRecord(value)) entries.set(skillKey, { config: value });
let disabled = skills.disabled;
if (typeof disabled === "string" && disabled.trimStart().startsWith("[")) try {
disabled = parse(disabled);
} catch {}
for (const value of readStringArray(Array.isArray(disabled) ? disabled : [disabled])) {
const skillKey = value.trim();
if (skillKey !== "hermes-agent") entries.set(skillKey, {
...entries.get(skillKey),
enabled: false
});
}
return asNonArrayRecord(mergeMigrationConfigValue({}, Object.fromEntries(entries)));
}
function buildConfigItems(params) {
const items = [];
const addConfigPatch = (patch) => {
items.push(createMigrationConfigPatchItem({
...patch,
conflict: !params.ctx.overwrite && hasMigrationConfigPatchConflict(params.ctx.config, patch.path, patch.value)
}));
};
const memory = childRecord(params.config, "memory");
const memoryProvider = normalizeOptionalString(memory.provider);
if (params.hasMemoryFiles || memoryProvider) addConfigPatch({
id: "config:memory-plugin-slot",
target: "plugins.slots",
path: ["plugins", "slots"],
value: { memory: "memory-core" },
message: "Select the default OpenClaw memory plugin for imported file memory."
});
if (memoryProvider === "honcho") {
addConfigPatch({
id: "config:memory-plugin:honcho",
target: "plugins.entries.honcho",
path: ["plugins", "entries"],
value: { honcho: {
enabled: true,
config: childRecord(memory, "honcho")
} },
message: "Preserve Hermes Honcho memory settings as a plugin entry for manual activation."
});
items.push(createMigrationManualItem({
id: "manual:memory-provider:honcho",
source: "config.yaml:memory.provider",
message: "Hermes used Honcho memory. OpenClaw keeps built-in memory selected until the matching plugin is installed and reviewed.",
recommendation: "Install or review the Honcho memory plugin before selecting it for plugins.slots.memory."
}));
} else if (memoryProvider && ![
"builtin",
"file",
"files"
].includes(memoryProvider)) items.push(createMigrationManualItem({
id: `manual:memory-provider:${memoryProvider}`,
source: "config.yaml:memory.provider",
message: `Hermes memory provider "${memoryProvider}" does not have a known OpenClaw mapping.`,
recommendation: "Install or configure an equivalent OpenClaw memory plugin manually."
}));
const providers = collectHermesProviders(params.config, params.env, Boolean(params.ctx.includeSecrets));
addSelectedModelToProvider(providers, params.modelRef);
for (const provider of providers) {
const value = { [provider.id]: providerConfig(provider) };
addConfigPatch({
id: `config:model-provider:${sanitizeName(provider.id)}`,
target: `models.providers.${provider.id}`,
path: ["models", "providers"],
value,
message: `Import Hermes provider and custom endpoint config for "${provider.id}".`,
sensitive: provider.sensitive
});
}
items.push(...providerManualItems(params.config, params.env ?? {}, Boolean(params.ctx.includeSecrets)));
const mcpConfig = params.config.mcp;
const rawMcpServers = params.config.mcp_servers ?? (isRecord(mcpConfig) && isRecord(mcpConfig.servers) ? mcpConfig.servers : mcpConfig);
const rawMcpSource = params.config.mcp_servers !== void 0 ? "config.yaml:mcp_servers" : isRecord(mcpConfig) && isRecord(mcpConfig.servers) ? "config.yaml:mcp.servers" : "config.yaml:mcp";
if (isRecord(rawMcpServers)) {
const mcpEnv = {
...params.runtimeEnv,
...params.env
};
for (const [name, rawServer] of Object.entries(rawMcpServers)) {
if (!isRecord(rawServer)) continue;
const server = mapMcpServer(rawServer, Boolean(params.ctx.includeSecrets), mcpEnv);
if (Object.keys(server).length > 0) {
const value = { [name]: server };
addConfigPatch({
id: `config:mcp-server:${sanitizeName(name)}`,
target: `mcp.servers.${name}`,
path: ["mcp", "servers"],
value,
message: `Import Hermes MCP server definition "${name}".`,
sensitive: importsMcpSensitiveValues(rawServer, Boolean(params.ctx.includeSecrets))
});
}
items.push(...mcpManualItems({
name,
raw: rawServer,
includeSecrets: Boolean(params.ctx.includeSecrets),
env: mcpEnv,
source: `${rawMcpSource}.${name}`
}));
}
}
for (const [skillKey, value] of Object.entries(mapSkillEntries(params.config))) {
const configPath = [
"skills",
"entries",
skillKey
];
addConfigPatch({
id: `config:skill-entry:${sanitizeName(skillKey)}`,
target: configPath.join("."),
path: configPath,
value,
message: "Import Hermes skill config values and global disabled state."
});
}
return items;
}
//#endregion
export { buildConfigItems as t };