openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
103 lines (102 loc) • 4.83 kB
JavaScript
import { t as sanitizeForLog } from "./ansi-DrXAcdMD.js";
import { r as collectConfiguredModelRefs } from "./configured-model-refs-DEXTV_K3.js";
import { E as applyProviderConfigDefaultsForConfig } from "./io.types-BUCjdS5v.js";
import { a as loadPersistedAuthProfileStore } from "./persisted-B_qhhBlh.js";
import { a as ensureAuthProfileStoreWithoutExternalProfiles } from "./store-F1B2duCT.js";
import { t as repairOAuthProfileIdMismatch } from "./repair-DXThsgJF.js";
import { i as removeAuthProfileConfig, r as configReferencesAuthProfile } from "./provider-auth-helpers-CaYTVMoC.js";
import { t as listAuthProfileRepairCandidates } from "./doctor-auth-legacy-paths-CCOCSqnd.js";
//#region src/commands/doctor-auth-legacy-oauth.ts
/** Removes retired provider profiles and repairs legacy OAuth profile ids. */
function sanitizePromptLabel(label) {
return (label ? sanitizeForLog(label).trim() : void 0) || void 0;
}
/**
* Applies provider-declared OAuth profile id repairs to config after prompting.
*
* Providers own the legacy id mapping; doctor only loads setup-time provider metadata and asks
* before writing config so stale provider-specific ids do not silently shadow current profiles.
*/
async function maybeRepairLegacyOAuthProfileIds(cfg, prompter) {
let nextCfg = cfg;
const retiredProfileCleanupPlans = [];
const repairCandidates = listAuthProfileRepairCandidates(cfg, process.env).map(({ agentDir }) => ({
agentDir,
profiles: loadPersistedAuthProfileStore(agentDir)?.profiles ?? {}
}));
if (Object.keys(cfg.auth?.profiles ?? {}).length === 0 && !Object.values(cfg.auth?.order ?? {}).some((order) => order.length > 0) && !Object.values(cfg.models?.providers ?? {}).some((provider) => typeof provider.apiKey === "string") && repairCandidates.every(({ profiles }) => Object.keys(profiles).length === 0)) return {
config: nextCfg,
retiredProfileCleanupPlans
};
const { resolvePluginProvidersCore } = await import("./providers.runtime.js");
const providers = resolvePluginProvidersCore({
config: cfg,
env: process.env,
mode: "setup"
});
for (const provider of providers) for (const profileId of provider.deprecatedProfileIds ?? []) {
const profileStores = repairCandidates.flatMap(({ agentDir, profiles }) => {
const profile = profiles[profileId];
return profile ? [{
agentDir,
provider: profile.provider
}] : [];
});
if (profileStores.length === 0 && !configReferencesAuthProfile(nextCfg, profileId)) continue;
const { note } = await import("./terminal-core/note.js");
note(`- Remove retired auth profile ${profileId}. The provider's native login remains unchanged.`, "Auth profiles");
const label = sanitizePromptLabel(provider.label) ?? provider.id;
if (!await prompter.confirm({
message: `Remove retired ${label} auth profile now?`,
initialValue: true
})) continue;
const configuredProfileProvider = nextCfg.auth?.profiles?.[profileId]?.provider;
const selectedProviderIds = /* @__PURE__ */ new Set([provider.id, ...profileStores.map((store) => store.provider)]);
if (configuredProfileProvider) selectedProviderIds.add(configuredProfileProvider);
if (collectConfiguredModelRefs(nextCfg).some(({ value }) => {
const separator = value.indexOf("/");
return separator > 0 && selectedProviderIds.has(value.slice(0, separator));
})) nextCfg = applyProviderConfigDefaultsForConfig({
provider: provider.id,
config: nextCfg,
env: process.env
});
nextCfg = removeAuthProfileConfig(nextCfg, profileId);
for (const candidate of profileStores) retiredProfileCleanupPlans.push({
agentDir: candidate.agentDir,
profileIds: [profileId]
});
}
if (!Object.values(nextCfg.auth?.profiles ?? {}).some((profile) => profile?.mode === "oauth")) return {
config: nextCfg,
retiredProfileCleanupPlans
};
const store = ensureAuthProfileStoreWithoutExternalProfiles();
if (Object.keys(store.profiles).length === 0) return {
config: nextCfg,
retiredProfileCleanupPlans
};
for (const provider of providers) for (const repairSpec of provider.oauthProfileIdRepairs ?? []) {
const repair = repairOAuthProfileIdMismatch({
cfg: nextCfg,
store,
provider: provider.id,
legacyProfileId: repairSpec.legacyProfileId
});
if (!repair.migrated || repair.changes.length === 0) continue;
const { note } = await import("./terminal-core/note.js");
note(repair.changes.map((c) => `- ${c}`).join("\n"), "Auth profiles");
const label = sanitizePromptLabel(repairSpec.promptLabel) ?? sanitizePromptLabel(provider.label) ?? provider.id;
if (!await prompter.confirm({
message: `Update ${label} OAuth profile id in config now?`,
initialValue: true
})) continue;
nextCfg = repair.config;
}
return {
config: nextCfg,
retiredProfileCleanupPlans
};
}
//#endregion
export { maybeRepairLegacyOAuthProfileIds };