153 lines
5.1 KiB
TypeScript
153 lines
5.1 KiB
TypeScript
import {
|
|
ensureAgentEntry,
|
|
ensureRecord,
|
|
getAgentsList,
|
|
getRecord,
|
|
isRecord,
|
|
type LegacyConfigMigration,
|
|
mergeMissing,
|
|
resolveDefaultAgentIdFromRaw,
|
|
} from "./legacy.shared.js";
|
|
|
|
export const LEGACY_CONFIG_MIGRATIONS_PART_3: LegacyConfigMigration[] = [
|
|
{
|
|
id: "auth.anthropic-claude-cli-mode-oauth",
|
|
describe: "Switch anthropic:claude-cli auth profile mode to oauth",
|
|
apply: (raw, changes) => {
|
|
const auth = getRecord(raw.auth);
|
|
const profiles = getRecord(auth?.profiles);
|
|
if (!profiles) return;
|
|
const claudeCli = getRecord(profiles["anthropic:claude-cli"]);
|
|
if (!claudeCli) return;
|
|
if (claudeCli.mode !== "token") return;
|
|
claudeCli.mode = "oauth";
|
|
changes.push('Updated auth.profiles["anthropic:claude-cli"].mode → "oauth".');
|
|
},
|
|
},
|
|
{
|
|
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");
|
|
},
|
|
},
|
|
];
|