refactor(config): split legacy handling
This commit is contained in:
143
src/config/legacy.migrations.part-3.ts
Normal file
143
src/config/legacy.migrations.part-3.ts
Normal file
@@ -0,0 +1,143 @@
|
||||
import {
|
||||
ensureAgentEntry,
|
||||
ensureRecord,
|
||||
getAgentsList,
|
||||
getRecord,
|
||||
isRecord,
|
||||
type LegacyConfigMigration,
|
||||
mergeMissing,
|
||||
resolveDefaultAgentIdFromRaw,
|
||||
} from "./legacy.shared.js";
|
||||
|
||||
export const LEGACY_CONFIG_MIGRATIONS_PART_3: LegacyConfigMigration[] = [
|
||||
{
|
||||
id: "agent.defaults-v2",
|
||||
describe: "Move agent config to agents.defaults and tools",
|
||||
apply: (raw, changes) => {
|
||||
const agent = getRecord(raw.agent);
|
||||
if (!agent) return;
|
||||
|
||||
const agents = ensureRecord(raw, "agents");
|
||||
const defaults = getRecord(agents.defaults) ?? {};
|
||||
const tools = ensureRecord(raw, "tools");
|
||||
|
||||
const agentTools = getRecord(agent.tools);
|
||||
if (agentTools) {
|
||||
if (tools.allow === undefined && agentTools.allow !== undefined) {
|
||||
tools.allow = agentTools.allow;
|
||||
changes.push("Moved agent.tools.allow → tools.allow.");
|
||||
}
|
||||
if (tools.deny === undefined && agentTools.deny !== undefined) {
|
||||
tools.deny = agentTools.deny;
|
||||
changes.push("Moved agent.tools.deny → tools.deny.");
|
||||
}
|
||||
}
|
||||
|
||||
const elevated = getRecord(agent.elevated);
|
||||
if (elevated) {
|
||||
if (tools.elevated === undefined) {
|
||||
tools.elevated = elevated;
|
||||
changes.push("Moved agent.elevated → tools.elevated.");
|
||||
} else {
|
||||
changes.push("Removed agent.elevated (tools.elevated already set).");
|
||||
}
|
||||
}
|
||||
|
||||
const bash = getRecord(agent.bash);
|
||||
if (bash) {
|
||||
if (tools.exec === undefined && tools.bash === undefined) {
|
||||
tools.exec = bash;
|
||||
changes.push("Moved agent.bash → tools.exec.");
|
||||
} else if (tools.exec !== undefined) {
|
||||
changes.push("Removed agent.bash (tools.exec already set).");
|
||||
} else {
|
||||
changes.push("Removed agent.bash (tools.bash already set).");
|
||||
}
|
||||
}
|
||||
|
||||
const sandbox = getRecord(agent.sandbox);
|
||||
if (sandbox) {
|
||||
const sandboxTools = getRecord(sandbox.tools);
|
||||
if (sandboxTools) {
|
||||
const toolsSandbox = ensureRecord(tools, "sandbox");
|
||||
const toolPolicy = ensureRecord(toolsSandbox, "tools");
|
||||
mergeMissing(toolPolicy, sandboxTools);
|
||||
delete sandbox.tools;
|
||||
changes.push("Moved agent.sandbox.tools → tools.sandbox.tools.");
|
||||
}
|
||||
}
|
||||
|
||||
const subagents = getRecord(agent.subagents);
|
||||
if (subagents) {
|
||||
const subagentTools = getRecord(subagents.tools);
|
||||
if (subagentTools) {
|
||||
const toolsSubagents = ensureRecord(tools, "subagents");
|
||||
const toolPolicy = ensureRecord(toolsSubagents, "tools");
|
||||
mergeMissing(toolPolicy, subagentTools);
|
||||
delete subagents.tools;
|
||||
changes.push("Moved agent.subagents.tools → tools.subagents.tools.");
|
||||
}
|
||||
}
|
||||
|
||||
const agentCopy: Record<string, unknown> = structuredClone(agent);
|
||||
delete agentCopy.tools;
|
||||
delete agentCopy.elevated;
|
||||
delete agentCopy.bash;
|
||||
if (isRecord(agentCopy.sandbox)) delete agentCopy.sandbox.tools;
|
||||
if (isRecord(agentCopy.subagents)) delete agentCopy.subagents.tools;
|
||||
|
||||
mergeMissing(defaults, agentCopy);
|
||||
agents.defaults = defaults;
|
||||
raw.agents = agents;
|
||||
delete raw.agent;
|
||||
changes.push("Moved agent → agents.defaults.");
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "identity->agents.list",
|
||||
describe: "Move identity to agents.list[].identity",
|
||||
apply: (raw, changes) => {
|
||||
const identity = getRecord(raw.identity);
|
||||
if (!identity) return;
|
||||
|
||||
const agents = ensureRecord(raw, "agents");
|
||||
const list = getAgentsList(agents);
|
||||
const defaultId = resolveDefaultAgentIdFromRaw(raw);
|
||||
const entry = ensureAgentEntry(list, defaultId);
|
||||
if (entry.identity === undefined) {
|
||||
entry.identity = identity;
|
||||
changes.push(
|
||||
`Moved identity → agents.list (id "${defaultId}").identity.`,
|
||||
);
|
||||
} else {
|
||||
changes.push("Removed identity (agents.list identity already set).");
|
||||
}
|
||||
agents.list = list;
|
||||
raw.agents = agents;
|
||||
delete raw.identity;
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "bind-tailnet->auto",
|
||||
describe: "Remap gateway/bridge bind 'tailnet' to 'auto'",
|
||||
apply: (raw, changes) => {
|
||||
const migrateBind = (
|
||||
obj: Record<string, unknown> | null | undefined,
|
||||
key: string,
|
||||
) => {
|
||||
if (!obj) return;
|
||||
const bind = obj.bind;
|
||||
if (bind === "tailnet") {
|
||||
obj.bind = "auto";
|
||||
changes.push(`Migrated ${key}.bind from 'tailnet' to 'auto'.`);
|
||||
}
|
||||
};
|
||||
|
||||
const gateway = getRecord(raw.gateway);
|
||||
migrateBind(gateway, "gateway");
|
||||
|
||||
const bridge = getRecord(raw.bridge);
|
||||
migrateBind(bridge, "bridge");
|
||||
},
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user