UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

239 lines (238 loc) 10.7 kB
import { y as uniqueStrings } from "./string-normalization-DsCfAx8q.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { t as createInstalledPluginEnabledPredicate } from "./installed-plugin-index-wrDsjyMD.js"; import { r as hasKind } from "./slots-CQdAEuat.js"; import { l as normalizePluginsConfig } from "./config-state-BkU1frVq.js"; import { n as getCurrentPluginMetadataSnapshot } from "./current-plugin-metadata-snapshot-CmSX4G3W.js"; import { a as loadPluginMetadataSnapshot } from "./plugin-metadata-snapshot-w-4EjxI4.js"; import { t as appendUniqueEnvVarCandidates } from "./env-var-candidates-D_PA36up.js"; import { i as normalizePluginConfigId, r as isWorkspacePluginAllowedByConfig, t as resolveProviderAuthAliasMap } from "./provider-auth-aliases-DhA9c2am.js"; import { n as listSetupProviderIds } from "./setup-descriptors-C6ZUmfj0.js"; //#region src/secrets/provider-env-vars.ts /** Resolves provider environment variable candidates and auth evidence from core/plugin metadata. */ const CORE_PROVIDER_AUTH_ENV_VAR_CANDIDATES = { anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"], openai: ["CODEX_API_KEY", "OPENAI_API_KEY"], voyage: ["VOYAGE_API_KEY"], cerebras: ["CEREBRAS_API_KEY"], "anthropic-openai": ["ANTHROPIC_API_KEY"], "qwen-dashscope": ["DASHSCOPE_API_KEY"] }; const CORE_PROVIDER_SETUP_ENV_VAR_OVERRIDES = { minimax: ["MINIMAX_API_KEY"], "minimax-cn": ["MINIMAX_API_KEY"] }; function isWorkspacePluginTrustedForProviderEnvVars(plugin, config) { return isWorkspacePluginAllowedByConfig({ config, isImplicitlyAllowed: (pluginId) => hasKind(plugin.kind, "context-engine") && normalizePluginConfigId(config?.plugins?.slots?.contextEngine) === pluginId, plugin }); } function shouldUsePluginProviderEnvVars(plugin, params) { if (plugin.origin !== "workspace" || params?.includeUntrustedWorkspacePlugins !== false) return true; return isWorkspacePluginTrustedForProviderEnvVars(plugin, params?.config); } function shouldUsePluginProviderAuthEvidence(plugin, params) { if (plugin.origin !== "workspace") return true; return isWorkspacePluginTrustedForProviderEnvVars(plugin, params?.config); } function appendUniqueAuthEvidence(target, providerId, evidence) { const normalizedProviderId = providerId.trim(); if (!normalizedProviderId || evidence.length === 0) return; const bucket = target[normalizedProviderId] ??= []; const seen = new Set(bucket.map((entry) => JSON.stringify(entry))); for (const entry of evidence) { const key = JSON.stringify(entry); if (seen.has(key)) continue; seen.add(key); bucket.push(entry); } } function appendUniqueProviderRef(target, providerId) { const normalized = normalizeProviderId(providerId); if (normalized) target.add(normalized); } function resolveProviderMetadataSnapshot(params) { if (params?.metadataSnapshot) return params.metadataSnapshot; const config = params?.config; const env = params?.env ?? process.env; let current; if (config) current = getCurrentPluginMetadataSnapshot({ config, env, ...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {}, allowWorkspaceScopedSnapshot: true }); else current = getCurrentPluginMetadataSnapshot({ env, ...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {}, allowWorkspaceScopedSnapshot: true, requireDefaultDiscoveryContext: true }); if (current) return current; if (config && normalizePluginsConfig(config.plugins).loadPaths.length === 0) { const unscopedCurrent = getCurrentPluginMetadataSnapshot({ env, ...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {}, allowWorkspaceScopedSnapshot: true, requireDefaultDiscoveryContext: true }); if (unscopedCurrent) return unscopedCurrent; } return loadPluginMetadataSnapshot({ config: config ?? {}, workspaceDir: params?.workspaceDir, env, preferPersisted: false }); } function resolveManifestProviderUsageAuthEnvVarNames(params) { const snapshot = resolveProviderMetadataSnapshot(params); return uniqueStrings(snapshot.plugins.filter((plugin) => shouldUsePluginProviderEnvVars(plugin, params)).flatMap((plugin) => Object.values(plugin.providerUsageAuthEnvVars ?? {}).flat())); } function resolveManifestProviderAuthEnvVarCandidates(params, snapshot, sortedAliases) { const candidates = {}; for (const plugin of snapshot.plugins) { if (!shouldUsePluginProviderEnvVars(plugin, params)) continue; for (const provider of plugin.setup?.providers ?? []) appendUniqueEnvVarCandidates(candidates, provider.id, provider.envVars ?? []); } for (const [alias, target] of sortedAliases) { const keys = candidates[target]; if (keys) appendUniqueEnvVarCandidates(candidates, alias, keys); } return candidates; } function resolveManifestRuntimeAuthFacts(params, snapshot, aliasEntries, sortedAliases) { const evidenceByProvider = {}; const refs = /* @__PURE__ */ new Set(); const isEnabled = createInstalledPluginEnabledPredicate(snapshot.index.plugins, params?.config); for (const plugin of snapshot.plugins) { const evidenceProviders = (plugin.setup?.providers ?? []).filter((provider) => provider.authEvidence?.length); const fallbackProviders = plugin.setup?.requiresRuntime !== false && (plugin.setup?.providers || plugin.providers) ? listSetupProviderIds(plugin) : []; if (evidenceProviders.length === 0 && fallbackProviders.length === 0) continue; if (snapshot.index.plugins.length > 0 && !isEnabled(plugin.id)) continue; if (shouldUsePluginProviderAuthEvidence(plugin, params)) for (const provider of evidenceProviders) appendUniqueAuthEvidence(evidenceByProvider, provider.id, provider.authEvidence ?? []); for (const providerId of fallbackProviders) appendUniqueProviderRef(refs, providerId); } for (const [alias, target] of sortedAliases) { const evidence = evidenceByProvider[target]; if (evidence) appendUniqueAuthEvidence(evidenceByProvider, alias, evidence); } for (const [alias, target] of aliasEntries) if (refs.has(target)) appendUniqueProviderRef(refs, alias); return { authEvidenceMap: evidenceByProvider, setupProviderFallbackRefs: [...refs].toSorted((a, b) => a.localeCompare(b)) }; } /** Resolves provider auth env-var candidates from core fallbacks and plugin metadata. */ function resolveProviderAuthEnvVarCandidates(params) { const snapshot = resolveProviderMetadataSnapshot(params); const aliases = resolveProviderAuthAliasMap({ ...params, metadataSnapshot: snapshot }); return { ...resolveManifestProviderAuthEnvVarCandidates(params, snapshot, Object.entries(aliases).toSorted(([left], [right]) => left.localeCompare(right))), ...CORE_PROVIDER_AUTH_ENV_VAR_CANDIDATES }; } /** Resolves all provider auth lookup maps from a single metadata snapshot. */ function resolveProviderAuthLookupMaps(params) { const snapshot = resolveProviderMetadataSnapshot(params); const lookupParams = { ...params, metadataSnapshot: snapshot }; const aliasMap = resolveProviderAuthAliasMap(lookupParams); const aliasEntries = Object.entries(aliasMap); const sortedAliases = aliasEntries.toSorted(([left], [right]) => left.localeCompare(right)); return { aliasMap, envCandidateMap: { ...resolveManifestProviderAuthEnvVarCandidates(params, snapshot, sortedAliases), ...CORE_PROVIDER_AUTH_ENV_VAR_CANDIDATES }, ...resolveManifestRuntimeAuthFacts(params, snapshot, aliasEntries, sortedAliases) }; } /** Resolves env vars used by setup, default SecretRefs, and broad secret scrubbing. */ function withSetupEnvOverrides(authCandidates) { return { ...authCandidates, ...CORE_PROVIDER_SETUP_ENV_VAR_OVERRIDES }; } function createLazyReadonlyRecord(resolve) { let cached; const getResolved = () => { cached ??= resolve(); return cached; }; return new Proxy({}, { get(_target, prop) { if (typeof prop !== "string") return; return getResolved()[prop]; }, has(_target, prop) { return typeof prop === "string" && Object.hasOwn(getResolved(), prop); }, ownKeys() { return Reflect.ownKeys(getResolved()); }, getOwnPropertyDescriptor(_target, prop) { if (typeof prop !== "string") return; const value = getResolved()[prop]; if (value === void 0) return; return { configurable: true, enumerable: true, value, writable: false }; } }); } /** * Provider env vars used for setup/default secret refs and broad secret * scrubbing. This can include non-model providers and may intentionally choose * a different preferred first env var than auth resolution. * * Bundled provider auth envs come from plugin manifests. The override map here * is only for true core/non-plugin providers and a few setup-specific ordering * overrides where generic onboarding wants a different preferred env var. */ const PROVIDER_ENV_VARS = createLazyReadonlyRecord(() => withSetupEnvOverrides(resolveProviderAuthEnvVarCandidates())); /** Returns known env var candidates for a provider id or alias. */ function getProviderEnvVars(providerId, params) { const providerEnvVars = params ? withSetupEnvOverrides(resolveProviderAuthEnvVarCandidates(params)) : PROVIDER_ENV_VARS; const envVars = Object.hasOwn(providerEnvVars, providerId) ? providerEnvVars[providerId] : void 0; return Array.isArray(envVars) ? [...envVars] : []; } /** Lists known provider auth env vars without bridge-only env vars. */ function listKnownProviderAuthEnvVarNames(params) { const authCandidates = resolveProviderAuthEnvVarCandidates(params); return uniqueStrings([ ...Object.values(authCandidates).flat(), ...Object.values(withSetupEnvOverrides(authCandidates)).flat(), ...resolveManifestProviderUsageAuthEnvVarNames(params) ]); } /** Lists env vars that may contain provider secrets for broad scrubbing. */ function listKnownSecretEnvVarNames(params) { return uniqueStrings([...Object.values(withSetupEnvOverrides(resolveProviderAuthEnvVarCandidates(params))).flat(), ...resolveManifestProviderUsageAuthEnvVarNames(params)]); } /** Returns a copy of an env object with denied keys removed case-insensitively. */ function omitEnvKeysCaseInsensitive(baseEnv, keys) { const env = { ...baseEnv }; const denied = /* @__PURE__ */ new Set(); for (const key of keys) { const normalizedKey = key.trim(); if (normalizedKey) denied.add(normalizedKey.toUpperCase()); } if (denied.size === 0) return env; for (const actualKey of Object.keys(env)) if (denied.has(actualKey.toUpperCase())) delete env[actualKey]; return env; } //#endregion export { resolveProviderAuthEnvVarCandidates as a, omitEnvKeysCaseInsensitive as i, listKnownProviderAuthEnvVarNames as n, resolveProviderAuthLookupMaps as o, listKnownSecretEnvVarNames as r, getProviderEnvVars as t };