|
| 1 | +import { |
| 2 | + resolveAgentModelFallbackValues, |
| 3 | + resolveAgentModelPrimaryValue, |
| 4 | +} from "../../config/model-input.js"; |
| 5 | +import type { AgentModelConfig } from "../../config/types.agents-shared.js"; |
| 6 | +import type { OpenClawConfig } from "../../config/types.openclaw.js"; |
| 7 | +import { normalizeProviderId } from "../provider-id.js"; |
| 8 | + |
| 9 | +export type ExternalCliAuthScope = { |
| 10 | + providerIds: string[]; |
| 11 | + profileIds: string[]; |
| 12 | +}; |
| 13 | + |
| 14 | +function addProviderScopeId(out: Set<string>, value: string | undefined): void { |
| 15 | + const raw = value?.trim(); |
| 16 | + if (!raw) { |
| 17 | + return; |
| 18 | + } |
| 19 | + out.add(raw); |
| 20 | + const normalized = normalizeProviderId(raw); |
| 21 | + if (normalized) { |
| 22 | + out.add(normalized); |
| 23 | + } |
| 24 | +} |
| 25 | + |
| 26 | +function addProviderScopeFromModelRef(out: Set<string>, value: string | undefined): void { |
| 27 | + const raw = value?.trim(); |
| 28 | + if (!raw) { |
| 29 | + return; |
| 30 | + } |
| 31 | + const slash = raw.indexOf("/"); |
| 32 | + if (slash <= 0) { |
| 33 | + return; |
| 34 | + } |
| 35 | + addProviderScopeId(out, raw.slice(0, slash)); |
| 36 | +} |
| 37 | + |
| 38 | +function addProviderScopeFromModelConfig(out: Set<string>, model: AgentModelConfig | undefined) { |
| 39 | + addProviderScopeFromModelRef(out, resolveAgentModelPrimaryValue(model)); |
| 40 | + for (const fallback of resolveAgentModelFallbackValues(model)) { |
| 41 | + addProviderScopeFromModelRef(out, fallback); |
| 42 | + } |
| 43 | +} |
| 44 | + |
| 45 | +function addExternalCliRuntimeScope(out: Set<string>, value: string | undefined): void { |
| 46 | + const normalized = normalizeProviderId(value?.trim() ?? ""); |
| 47 | + if ( |
| 48 | + normalized === "claude-cli" || |
| 49 | + normalized === "codex" || |
| 50 | + normalized === "codex-cli" || |
| 51 | + normalized === "openai-codex" || |
| 52 | + normalized === "minimax" || |
| 53 | + normalized === "minimax-cli" || |
| 54 | + normalized === "minimax-portal" |
| 55 | + ) { |
| 56 | + addProviderScopeId(out, normalized); |
| 57 | + } |
| 58 | +} |
| 59 | + |
| 60 | +export function resolveExternalCliAuthScopeFromConfig( |
| 61 | + cfg: OpenClawConfig, |
| 62 | +): ExternalCliAuthScope | undefined { |
| 63 | + const providerIds = new Set<string>(); |
| 64 | + const profileIds = new Set<string>(); |
| 65 | + |
| 66 | + for (const id of Object.keys(cfg.models?.providers ?? {})) { |
| 67 | + addProviderScopeId(providerIds, id); |
| 68 | + } |
| 69 | + for (const [profileId, profile] of Object.entries(cfg.auth?.profiles ?? {})) { |
| 70 | + const normalizedProfileId = profileId.trim(); |
| 71 | + if (normalizedProfileId) { |
| 72 | + profileIds.add(normalizedProfileId); |
| 73 | + } |
| 74 | + addProviderScopeId(providerIds, profile?.provider); |
| 75 | + } |
| 76 | + for (const provider of Object.keys(cfg.auth?.order ?? {})) { |
| 77 | + addProviderScopeId(providerIds, provider); |
| 78 | + } |
| 79 | + |
| 80 | + const defaults = cfg.agents?.defaults; |
| 81 | + addProviderScopeFromModelConfig(providerIds, defaults?.model); |
| 82 | + addProviderScopeFromModelConfig(providerIds, defaults?.imageModel); |
| 83 | + addProviderScopeFromModelConfig(providerIds, defaults?.imageGenerationModel); |
| 84 | + addProviderScopeFromModelConfig(providerIds, defaults?.videoGenerationModel); |
| 85 | + addProviderScopeFromModelConfig(providerIds, defaults?.musicGenerationModel); |
| 86 | + addProviderScopeFromModelConfig(providerIds, defaults?.pdfModel); |
| 87 | + for (const modelRef of Object.keys(defaults?.models ?? {})) { |
| 88 | + addProviderScopeFromModelRef(providerIds, modelRef); |
| 89 | + } |
| 90 | + addExternalCliRuntimeScope(providerIds, defaults?.agentRuntime?.id); |
| 91 | + addExternalCliRuntimeScope(providerIds, defaults?.embeddedHarness?.runtime); |
| 92 | + for (const backendId of Object.keys(defaults?.cliBackends ?? {})) { |
| 93 | + addExternalCliRuntimeScope(providerIds, backendId); |
| 94 | + } |
| 95 | + |
| 96 | + for (const agent of cfg.agents?.list ?? []) { |
| 97 | + addProviderScopeFromModelConfig(providerIds, agent.model); |
| 98 | + addProviderScopeFromModelConfig(providerIds, agent.subagents?.model); |
| 99 | + addExternalCliRuntimeScope(providerIds, agent.agentRuntime?.id); |
| 100 | + addExternalCliRuntimeScope(providerIds, agent.embeddedHarness?.runtime); |
| 101 | + } |
| 102 | + |
| 103 | + if (providerIds.size === 0 && profileIds.size === 0) { |
| 104 | + return undefined; |
| 105 | + } |
| 106 | + return { |
| 107 | + providerIds: [...providerIds].toSorted((left, right) => left.localeCompare(right)), |
| 108 | + profileIds: [...profileIds].toSorted((left, right) => left.localeCompare(right)), |
| 109 | + }; |
| 110 | +} |
0 commit comments