openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
147 lines (146 loc) • 5.14 kB
JavaScript
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-1VuiLaaR.mjs";
import { i as buildModelAliasIndex, v as resolveModelRefFromString } from "./model-selection-shared-DcM6hdAC.mjs";
import "./string-coerce-runtime-50qKeWeL.mjs";
import "./agent-runtime-BG96v5EP.mjs";
import { a as CLAUDE_CLI_DEFAULT_ALLOWLIST_REFS, r as CLAUDE_CLI_CANONICAL_DEFAULT_MODEL_REF } from "./cli-constants-D6douw4O.mjs";
import { i as resolveClaudeCliAnthropicModelRefs, o as splitTrailingModelAuthProfile, t as modelEntryWithClaudeCliRuntime } from "./claude-model-refs-BrOsU52V.mjs";
//#region extensions/anthropic/cli-migration.ts
function rewriteModelSelection(config) {
const model = config.agents?.defaults?.model;
const selection = {
cfg: config,
defaultProvider: "anthropic",
allowManifestNormalization: false,
allowPluginNormalization: false
};
const aliasIndex = buildModelAliasIndex(selection);
const runtimeRefs = [];
function rewrite(raw) {
const configured = resolveModelRefFromString({
...selection,
aliasIndex,
raw
});
if (configured?.alias) {
const target = configured.ref.provider + "/" + configured.ref.model;
const resolved = resolveClaudeCliAnthropicModelRefs(target);
runtimeRefs.push(...resolved?.runtimeRefs ?? []);
const selected = resolved?.rewriteRef ?? resolved?.selectedRef;
if (!selected) return {
value: raw,
primary: raw
};
const { profile } = splitTrailingModelAuthProfile(raw);
const value = profile ? selected + "@" + profile : selected;
return {
value,
primary: value,
changed: value !== raw
};
}
const resolved = resolveClaudeCliAnthropicModelRefs(raw);
runtimeRefs.push(...resolved?.runtimeRefs ?? []);
const converted = resolved?.rewriteRef;
return {
value: converted ?? raw,
primary: converted ?? resolved?.selectedRef,
changed: Boolean(converted)
};
}
if (typeof model === "string") {
const rewritten = rewrite(model);
return {
...rewritten,
runtimeRefs,
changed: Boolean(rewritten.changed)
};
}
if (!model || typeof model !== "object" || Array.isArray(model)) return {
value: model,
runtimeRefs,
changed: false
};
const primary = typeof model.primary === "string" ? rewrite(model.primary) : void 0;
const fallbacks = model.fallbacks?.map((entry) => rewrite(entry).value);
const changed = Boolean(primary?.changed) || Boolean(fallbacks?.some((entry, index) => entry !== model.fallbacks?.[index]));
return {
value: changed ? {
...model,
...primary ? { primary: primary.value } : {},
...fallbacks ? { fallbacks } : {}
} : model,
primary: primary?.primary,
runtimeRefs,
changed
};
}
function rewriteModelEntryMap(models) {
if (!models) return {
value: models,
migrated: [],
runtimeRefs: []
};
const next = { ...models };
const migrated = [];
const runtimeRefs = [];
for (const [rawKey, value] of Object.entries(models)) {
const resolved = resolveClaudeCliAnthropicModelRefs(rawKey);
runtimeRefs.push(...resolved?.runtimeRefs ?? []);
const converted = resolved?.rewriteRef;
if (!converted || converted === rawKey) continue;
if (!Object.hasOwn(next, converted)) Object.defineProperty(next, converted, {
value,
writable: true,
enumerable: true,
configurable: true
});
if (normalizeLowercaseStringOrEmpty(rawKey).startsWith(`claude-cli/`)) delete next[rawKey];
migrated.push(converted);
}
return {
value: migrated.length > 0 || runtimeRefs.length > 0 ? next : models,
migrated,
runtimeRefs
};
}
function seedClaudeCliAllowlist(models, selectedRefs = []) {
const next = { ...models };
const runtimeRefs = /* @__PURE__ */ new Set([...CLAUDE_CLI_DEFAULT_ALLOWLIST_REFS.map((ref) => resolveClaudeCliAnthropicModelRefs(ref)?.rewriteRef ?? ref), ...selectedRefs]);
for (const ref of runtimeRefs) {
const current = Object.hasOwn(next, ref) ? next[ref] : void 0;
Object.defineProperty(next, ref, {
value: modelEntryWithClaudeCliRuntime(current),
writable: true,
enumerable: true,
configurable: true
});
}
return next;
}
function buildAnthropicCliMigrationResult(config) {
const defaults = config.agents?.defaults;
const rewrittenModel = rewriteModelSelection(config);
const rewrittenModels = rewriteModelEntryMap(defaults?.models);
const nextModels = seedClaudeCliAllowlist(rewrittenModels.value ?? defaults?.models ?? {}, [
...rewrittenModel.runtimeRefs,
...rewrittenModels.runtimeRefs,
...rewrittenModels.migrated
]);
const defaultModel = rewrittenModel.primary ?? CLAUDE_CLI_CANONICAL_DEFAULT_MODEL_REF;
return {
profiles: [],
configPatch: { agents: { defaults: {
...rewrittenModel.changed ? { model: rewrittenModel.value } : {},
models: nextModels
} } },
replaceDefaultModels: true,
defaultModel,
notes: [
"Claude CLI auth detected; kept Anthropic model refs and selected the local Claude CLI runtime.",
"Existing Anthropic auth profiles are kept for rollback.",
...rewrittenModels.migrated.length > 0 ? [`Migrated allowlist entries: ${rewrittenModels.migrated.join(", ")}.`] : []
]
};
}
//#endregion
export { buildAnthropicCliMigrationResult as t };