UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

376 lines (375 loc) 13.3 kB
import { p as normalizeUniqueStringEntries } from "./string-normalization-WNUDCpXX.js"; import { s as normalizePluginsConfig } from "./config-state-CikNNz7T.js"; import { i as passesManifestOwnerBasePolicy, n as isActivatedManifestOwner } from "./manifest-owner-policy-DxLYM2ma.js"; import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js"; import { a as resolveProviderAuthEnvVarCandidates } from "./provider-env-vars-Clp1DREb.js"; import "./config-C9RxTsn1.js"; import { i as ensureAuthProfileStoreWithoutExternalProfiles, n as ensureAuthProfileStore } from "./store-C8spD0DG.js"; import { s as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-DEeoLRlM.js"; import { I as resolveProviderUsageAuthWithPlugin, L as resolveProviderUsageSnapshotWithPlugin } from "./provider-runtime-CJtW0nDR.js"; import { t as hasAnyAuthProfileStoreSource } from "./source-check-DlvZuh4h.js"; import "./auth-profiles-84rzaGag.js"; import { n as resolveApiKeyForProfile } from "./oauth-goXQ01JL.js"; import { n as normalizeSecretInput } from "./normalize-secret-input-OwRUfByL.js"; import { n as listProfilesForProvider, t as dedupeProfileIds } from "./profile-list-DI8_o0Rw.js"; import { i as resolveAuthProfileOrder } from "./order-CdBVYd7c.js"; import { o as normalizeProviderId } from "./model-selection-normalize-roKDxQ9_.js"; import { d as isNonSecretApiKeyMarker } from "./model-auth-markers-Sq8HdQFX.js"; import "./model-selection-CA_65iXi.js"; import { t as resolveEnvApiKey } from "./model-auth-env-O5hF4UJr.js"; import { h as resolveUsableCustomProviderApiKey } from "./model-auth-DVfmdW0b.js"; import { t as resolveFetch } from "./fetch-C0IyrVwh.js"; import { a as isOAuthOnlyUsageProvider, c as withTimeout, i as ignoredErrors, n as PROVIDER_LABELS, s as usageProviders } from "./provider-usage.shared-DOxrEMuU.js"; //#region src/infra/provider-usage.auth.ts function resolveUsageAuthStore(state) { state.store ??= ensureAuthProfileStore(state.agentDir, { allowKeychainPrompt: false }); return state.store; } function resolveProviderApiKeyFromConfig(params) { const envDirect = params.envDirect?.map(normalizeSecretInput).find(Boolean); if (envDirect) return envDirect; for (const providerId of params.providerIds) { const envKey = resolveEnvApiKey(providerId, params.state.env)?.apiKey; if (envKey) return envKey; const key = resolveUsableCustomProviderApiKey({ cfg: params.state.cfg, provider: providerId, env: params.state.env })?.apiKey; if (key) return key; } } function hasProviderAuthEnvCredentialSource(params) { const candidates = resolveProviderAuthEnvVarCandidates({ config: params.state.cfg, env: { ...process.env.VITEST ? process.env : {}, ...params.state.env } }); for (const providerId of normalizeProviderIds(params.providerIds)) { const envVars = Object.hasOwn(candidates, providerId) ? candidates[providerId] : void 0; if (!envVars) continue; if (envVars.some((envVar) => Boolean(normalizeSecretInput(params.state.env[envVar])))) return true; } return false; } function resolveProviderApiKeyFromConfigAndStore(params) { const configKey = resolveProviderApiKeyFromConfig(params); if (configKey || !params.state.allowAuthProfileStore) return configKey; const cred = [...new Set(normalizeUniqueStringEntries(params.providerIds.map((providerId) => normalizeProviderId(providerId))))].flatMap((providerId) => listProfilesForProvider(resolveUsageAuthStore(params.state), providerId)).map((id) => resolveUsageAuthStore(params.state).profiles[id]).find((profile) => profile?.type === "api_key" || profile?.type === "token"); if (!cred) return; if (cred.type === "api_key") { const key = normalizeSecretInput(cred.key); if (key && !isNonSecretApiKeyMarker(key)) return key; return; } const token = normalizeSecretInput(cred.token); if (token && !isNonSecretApiKeyMarker(token)) return token; } function normalizeProviderIds(providerIds) { return [...new Set([...providerIds].map((providerId) => providerId ? normalizeProviderId(providerId) : void 0).filter((providerId) => Boolean(providerId)))]; } function isUsageProviderManifestEligible(params) { const normalizedConfig = normalizePluginsConfig(params.state.cfg.plugins); if (!passesManifestOwnerBasePolicy({ plugin: params.plugin, normalizedConfig })) return false; if (params.plugin.origin !== "workspace") return true; return isActivatedManifestOwner({ plugin: params.plugin, normalizedConfig, rootConfig: params.state.cfg }); } function resolveUsageCredentialProviderIds(params) { const providerIds = new Set(normalizeProviderIds([params.provider])); const providerIdSet = new Set(providerIds); try { const snapshot = loadManifestMetadataSnapshot({ config: params.state.cfg, env: params.state.env }); for (const plugin of snapshot.plugins) { const pluginProviderIds = normalizeProviderIds(plugin.providers); if (!pluginProviderIds.some((providerId) => providerIdSet.has(providerId))) continue; if (!isUsageProviderManifestEligible({ plugin, state: params.state })) continue; for (const providerId of pluginProviderIds) providerIds.add(providerId); } } catch {} return [...providerIds]; } async function resolveOAuthToken(params) { if (!params.state.allowAuthProfileStore) return null; const store = resolveUsageAuthStore(params.state); const deduped = dedupeProfileIds(resolveAuthProfileOrder({ cfg: params.state.cfg, store, provider: params.provider })); for (const profileId of deduped) { const cred = store.profiles[profileId]; if (!cred || cred.type !== "oauth" && cred.type !== "token") continue; try { const resolved = await resolveApiKeyForProfile({ cfg: params.state.cfg, store, profileId, agentDir: params.state.agentDir }); if (!resolved) continue; return { provider: params.provider, token: resolved.apiKey, accountId: cred.type === "oauth" && "accountId" in cred ? cred.accountId : void 0 }; } catch {} } return null; } async function resolveProviderUsageAuthViaPlugin(params) { const resolved = await resolveProviderUsageAuthWithPlugin({ provider: params.provider, config: params.state.cfg, env: params.state.env, context: { config: params.state.cfg, agentDir: params.state.agentDir, env: params.state.env, provider: params.provider, resolveApiKeyFromConfigAndStore: (options) => isOAuthOnlyUsageProvider(params.provider) ? void 0 : resolveProviderApiKeyFromConfigAndStore({ state: params.state, providerIds: options?.providerIds ?? [params.provider], envDirect: options?.envDirect }), resolveOAuthToken: async (options) => { const auth = await resolveOAuthToken({ state: params.state, provider: options?.provider ?? params.provider }); return auth ? { token: auth.token, ...auth.accountId ? { accountId: auth.accountId } : {} } : null; } } }); if (!resolved) return { handled: false, auth: null }; if ("handled" in resolved) return { handled: true, auth: null }; return { handled: true, auth: { provider: params.provider, token: resolved.token, ...resolved.accountId ? { accountId: resolved.accountId } : {} } }; } async function resolveProviderUsageAuthFallback(params) { const oauthToken = await resolveOAuthToken({ state: params.state, provider: params.provider }); if (oauthToken) return oauthToken; if (isOAuthOnlyUsageProvider(params.provider)) return null; const apiKey = resolveProviderApiKeyFromConfigAndStore({ state: params.state, providerIds: [params.provider] }); if (apiKey) return { provider: params.provider, token: apiKey }; return null; } function hasAuthProfileCredentialSource(params) { const store = ensureAuthProfileStoreWithoutExternalProfiles(params.state.agentDir, { allowKeychainPrompt: false }); const allowApiKey = !isOAuthOnlyUsageProvider(params.usageProvider); for (const provider of params.providerIds) if (dedupeProfileIds(resolveAuthProfileOrder({ cfg: params.state.cfg, store, provider })).some((profileId) => { const cred = store.profiles[profileId]; return cred?.type === "oauth" || cred?.type === "token" || allowApiKey && cred?.type === "api_key"; })) return true; return false; } async function resolveProviderAuths(params) { if (params.auth) return params.auth; const stateBase = { cfg: params.config ?? getRuntimeConfig(), env: params.env ?? process.env, agentDir: params.agentDir }; const authProfileSourceState = { ...stateBase, allowAuthProfileStore: true }; const hasAuthProfileStoreSource = params.skipPluginAuthWithoutCredentialSource ? hasAnyAuthProfileStoreSource(params.agentDir) : false; const auths = []; for (const provider of params.providers) { if (!params.skipPluginAuthWithoutCredentialSource) { const pluginAuth = await resolveProviderUsageAuthViaPlugin({ state: authProfileSourceState, provider }); if (pluginAuth.auth) { auths.push(pluginAuth.auth); continue; } if (pluginAuth.handled) continue; const fallbackAuth = await resolveProviderUsageAuthFallback({ state: authProfileSourceState, provider }); if (fallbackAuth) auths.push(fallbackAuth); continue; } const directCredentialState = { ...stateBase, allowAuthProfileStore: false }; const credentialProviderIds = resolveUsageCredentialProviderIds({ state: directCredentialState, provider }); const hasDirectCredentialSource = !isOAuthOnlyUsageProvider(provider) && (Boolean(resolveProviderApiKeyFromConfig({ state: directCredentialState, providerIds: credentialProviderIds })) || hasProviderAuthEnvCredentialSource({ state: directCredentialState, providerIds: credentialProviderIds })); const allowAuthProfileStore = hasDirectCredentialSource || hasAuthProfileStoreSource && hasAuthProfileCredentialSource({ state: authProfileSourceState, providerIds: credentialProviderIds, usageProvider: provider }); const state = { ...stateBase, allowAuthProfileStore }; if (hasDirectCredentialSource || allowAuthProfileStore) { const pluginAuth = await resolveProviderUsageAuthViaPlugin({ state, provider }); if (pluginAuth.auth) { auths.push(pluginAuth.auth); continue; } if (pluginAuth.handled) continue; } const fallbackAuth = await resolveProviderUsageAuthFallback({ state, provider }); if (fallbackAuth) auths.push(fallbackAuth); } return auths; } //#endregion //#region src/infra/provider-usage.load.ts async function fetchProviderUsageSnapshotFallback(params) { params.timeoutMs; params.fetchFn; return { provider: params.auth.provider, displayName: PROVIDER_LABELS[params.auth.provider] ?? params.auth.provider, windows: [], error: "Unsupported provider" }; } async function fetchProviderUsageSnapshot(params) { const pluginSnapshot = await resolveProviderUsageSnapshotWithPlugin({ provider: params.auth.hookProvider ?? params.auth.provider, config: params.config, workspaceDir: params.workspaceDir, env: params.env, context: { config: params.config, agentDir: params.agentDir, workspaceDir: params.workspaceDir, env: params.env, provider: params.auth.provider, token: params.auth.token, accountId: params.auth.accountId, authProfileId: params.auth.authProfileId, timeoutMs: params.timeoutMs, fetchFn: params.fetchFn } }); if (pluginSnapshot) return pluginSnapshot; return await fetchProviderUsageSnapshotFallback({ auth: params.auth, timeoutMs: params.timeoutMs, fetchFn: params.fetchFn }); } /** Loads usage snapshots from configured provider auth and plugin-backed usage hooks. */ async function loadProviderUsageSummary(opts = {}) { const now = opts.now ?? Date.now(); const timeoutMs = opts.timeoutMs ?? 5e3; const config = opts.config ?? getRuntimeConfig(); const env = opts.env ?? process.env; const fetchFn = resolveFetch(opts.fetch); if (!fetchFn) throw new Error("fetch is not available"); const auths = await resolveProviderAuths({ providers: opts.providers ?? usageProviders, auth: opts.auth, agentDir: opts.agentDir, config, env, skipPluginAuthWithoutCredentialSource: opts.skipPluginAuthWithoutCredentialSource }); if (auths.length === 0) return { updatedAt: now, providers: [] }; const tasks = auths.map((auth) => { const failureSnapshot = (error) => ({ provider: auth.provider, displayName: PROVIDER_LABELS[auth.provider] ?? auth.provider, windows: [], error }); return withTimeout(fetchProviderUsageSnapshot({ auth, config, env, agentDir: opts.agentDir, workspaceDir: opts.workspaceDir, timeoutMs, fetchFn }), timeoutMs + 1e3, { provider: auth.provider, displayName: PROVIDER_LABELS[auth.provider], windows: [], error: "Timeout" }).catch((error) => { return failureSnapshot((error instanceof Error ? error.message : String(error)).trim() || "Fetch failed"); }); }); return { updatedAt: now, providers: (await Promise.all(tasks)).filter((entry) => { if (entry.windows.length > 0) return true; if (entry.summary?.trim()) return true; if (!entry.error) return true; return !ignoredErrors.has(entry.error); }) }; } //#endregion export { loadProviderUsageSummary as t };