Spaces:
Running
Running
| import type { OpenClawConfig } from "../../config/config.js"; | |
| import type { ProviderAuthOverview } from "./list.types.js"; | |
| import { formatRemainingShort } from "../../agents/auth-health.js"; | |
| import { | |
| type AuthProfileStore, | |
| listProfilesForProvider, | |
| resolveAuthProfileDisplayLabel, | |
| resolveAuthStorePathForDisplay, | |
| resolveProfileUnusableUntilForDisplay, | |
| } from "../../agents/auth-profiles.js"; | |
| import { getCustomProviderApiKey, resolveEnvApiKey } from "../../agents/model-auth.js"; | |
| import { shortenHomePath } from "../../utils.js"; | |
| import { maskApiKey } from "./list.format.js"; | |
| export function resolveProviderAuthOverview(params: { | |
| provider: string; | |
| cfg: OpenClawConfig; | |
| store: AuthProfileStore; | |
| modelsPath: string; | |
| }): ProviderAuthOverview { | |
| const { provider, cfg, store } = params; | |
| const now = Date.now(); | |
| const profiles = listProfilesForProvider(store, provider); | |
| const withUnusableSuffix = (base: string, profileId: string) => { | |
| const unusableUntil = resolveProfileUnusableUntilForDisplay(store, profileId); | |
| if (!unusableUntil || now >= unusableUntil) { | |
| return base; | |
| } | |
| const stats = store.usageStats?.[profileId]; | |
| const kind = | |
| typeof stats?.disabledUntil === "number" && now < stats.disabledUntil | |
| ? `disabled${stats.disabledReason ? `:${stats.disabledReason}` : ""}` | |
| : "cooldown"; | |
| const remaining = formatRemainingShort(unusableUntil - now); | |
| return `${base} [${kind} ${remaining}]`; | |
| }; | |
| const labels = profiles.map((profileId) => { | |
| const profile = store.profiles[profileId]; | |
| if (!profile) { | |
| return `${profileId}=missing`; | |
| } | |
| if (profile.type === "api_key") { | |
| return withUnusableSuffix(`${profileId}=${maskApiKey(profile.key)}`, profileId); | |
| } | |
| if (profile.type === "token") { | |
| return withUnusableSuffix(`${profileId}=token:${maskApiKey(profile.token)}`, profileId); | |
| } | |
| const display = resolveAuthProfileDisplayLabel({ cfg, store, profileId }); | |
| const suffix = | |
| display === profileId | |
| ? "" | |
| : display.startsWith(profileId) | |
| ? display.slice(profileId.length).trim() | |
| : `(${display})`; | |
| const base = `${profileId}=OAuth${suffix ? ` ${suffix}` : ""}`; | |
| return withUnusableSuffix(base, profileId); | |
| }); | |
| const oauthCount = profiles.filter((id) => store.profiles[id]?.type === "oauth").length; | |
| const tokenCount = profiles.filter((id) => store.profiles[id]?.type === "token").length; | |
| const apiKeyCount = profiles.filter((id) => store.profiles[id]?.type === "api_key").length; | |
| const envKey = resolveEnvApiKey(provider); | |
| const customKey = getCustomProviderApiKey(cfg, provider); | |
| const effective: ProviderAuthOverview["effective"] = (() => { | |
| if (profiles.length > 0) { | |
| return { | |
| kind: "profiles", | |
| detail: shortenHomePath(resolveAuthStorePathForDisplay()), | |
| }; | |
| } | |
| if (envKey) { | |
| const isOAuthEnv = | |
| envKey.source.includes("OAUTH_TOKEN") || envKey.source.toLowerCase().includes("oauth"); | |
| return { | |
| kind: "env", | |
| detail: isOAuthEnv ? "OAuth (env)" : maskApiKey(envKey.apiKey), | |
| }; | |
| } | |
| if (customKey) { | |
| return { kind: "models.json", detail: maskApiKey(customKey) }; | |
| } | |
| return { kind: "missing", detail: "missing" }; | |
| })(); | |
| return { | |
| provider, | |
| effective, | |
| profiles: { | |
| count: profiles.length, | |
| oauth: oauthCount, | |
| token: tokenCount, | |
| apiKey: apiKeyCount, | |
| labels, | |
| }, | |
| ...(envKey | |
| ? { | |
| env: { | |
| value: | |
| envKey.source.includes("OAUTH_TOKEN") || envKey.source.toLowerCase().includes("oauth") | |
| ? "OAuth (env)" | |
| : maskApiKey(envKey.apiKey), | |
| source: envKey.source, | |
| }, | |
| } | |
| : {}), | |
| ...(customKey | |
| ? { | |
| modelsJson: { | |
| value: maskApiKey(customKey), | |
| source: `models.json: ${shortenHomePath(params.modelsPath)}`, | |
| }, | |
| } | |
| : {}), | |
| }; | |
| } | |