UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

208 lines (207 loc) 8.81 kB
import { y as uniqueStrings } from "./string-normalization-DsCfAx8q.js"; import { c as resolveUserPath } from "./home-dir-BPhrG-aM.js"; import "./utils-P__uGsPB.js"; import { o as listAgentIds, u as resolveAgentDir } from "./agent-scope-config-DcbEhP0R.js"; import { t as cloneConfigWithResolutionFacts } from "./resolution-facts-Dks1tbik.js"; import { s as resolveSharedAuthStorePath } from "./path-resolve-oRkRBkQd.js"; import { h as resolveAuthProfileDatabasePath } from "./sqlite-MN_7y26V.js"; import { R as prepareRuntimeAuthProfileStoreSnapshots, d as getRuntimeAuthProfileStoreSnapshotsRevision, o as getRuntimeAuthProfileStoreCredentialsRevision } from "./runtime-snapshots-CHAErv1O.js"; import { r as resolveLegacyInheritedAuthAgentDir } from "./legacy-inherited-auth-dir-CMGSmv-F.js"; import { n as hasSecretRefCandidate, t as hasCredentialBearingObjectValue } from "./runtime-secret-scan-ByLaDc9T.js"; import { existsSync } from "node:fs"; //#region src/secrets/runtime-fast-path.ts /** Detects when secrets runtime preparation can safely use a fast path. */ const RUNTIME_PATH_ENV_KEYS = [ "HOME", "USERPROFILE", "HOMEDRIVE", "HOMEPATH", "OPENCLAW_HOME", "OPENCLAW_STATE_DIR", "OPENCLAW_CONFIG_PATH", "OPENCLAW_AGENT_DIR" ]; /** * Merges caller env with process path env needed for config and agent-dir resolution. */ function mergeSecretsRuntimeEnv(env) { const merged = { ...env ?? process.env }; for (const key of RUNTIME_PATH_ENV_KEYS) { if (merged[key] !== void 0) continue; const processValue = process.env[key]; if (processValue !== void 0) merged[key] = processValue; } return merged; } /** * Collects default and named agent directories that may contain auth profile stores. */ function collectCandidateAgentDirs(config, env = process.env) { const dirs = /* @__PURE__ */ new Set(); dirs.add(resolveUserPath(resolveAgentDir(config, "main", env), env)); dirs.add(resolveUserPath(resolveLegacyInheritedAuthAgentDir(config, env), env)); for (const agentId of listAgentIds(config)) dirs.add(resolveUserPath(resolveAgentDir(config, agentId, env), env)); return [...dirs]; } /** * Combines explicit refresh agent dirs with config-derived dirs for runtime refresh. */ function resolveRefreshAgentDirs(config, context) { const configDerived = collectCandidateAgentDirs(config, context.env); if (!context.explicitAgentDirs || context.explicitAgentDirs.length === 0) return configDerived; return uniqueStrings([...context.explicitAgentDirs, ...configDerived]); } function resolveCandidateAgentDirs(params) { return params.agentDirs?.length ? uniqueStrings(params.agentDirs.map((entry) => resolveUserPath(entry, params.env))) : collectCandidateAgentDirs(params.config, params.env); } function hasCandidateAuthProfileStoreSource(agentDir) { return existsSync(resolveAuthProfileDatabasePath(agentDir)); } /** * Returns whether canonical auth-profile databases exist for candidate agent dirs. */ function hasCandidateAuthProfileStoreSources(params) { return resolveCandidateAgentDirs(params).some((agentDir) => hasCandidateAuthProfileStoreSource(agentDir)) || existsSync(resolveSharedAuthStorePath(params.env)); } /** * Creates empty web-tool metadata for snapshots that do not need secret resolution. */ function createEmptyRuntimeWebToolsMetadata() { return { search: { providerSource: "none", diagnostics: [] }, fetch: { providerSource: "none", diagnostics: [] }, diagnostics: [] }; } function hasActiveRuntimeWebFetchProviderSurface(fetch, defaults) { if (!fetch || typeof fetch !== "object" || Array.isArray(fetch)) return false; const fetchConfig = fetch; if (fetchConfig.enabled === false) return false; if (typeof fetchConfig.provider === "string" && fetchConfig.provider.trim()) return true; return hasCredentialBearingObjectValue(fetchConfig, defaults); } function hasRuntimeWebToolConfigSurface(config) { const web = config.tools?.web; const defaults = config.secrets?.defaults; const fetchExplicitlyDisabled = web && typeof web === "object" && !Array.isArray(web) && typeof web.fetch === "object" && web.fetch?.enabled === false; if (web && typeof web === "object" && !Array.isArray(web)) { const webRecord = web; if ("search" in webRecord) return true; if ("fetch" in webRecord && hasActiveRuntimeWebFetchProviderSurface(webRecord.fetch, defaults)) return true; } const entries = config.plugins?.entries; if (!entries || typeof entries !== "object" || Array.isArray(entries)) return false; return Object.values(entries).some((entry) => { if (!entry || typeof entry !== "object" || Array.isArray(entry)) return false; const pluginConfig = entry.config; return pluginConfig !== null && typeof pluginConfig === "object" && !Array.isArray(pluginConfig) && ("webSearch" in pluginConfig || !fetchExplicitlyDisabled && "webFetch" in pluginConfig); }); } /** * Returns whether a snapshot can skip full SecretRef/web-tool resolution. */ /** Returns whether current config/auth/plugin state allows skipping full secret preparation. */ function canUseSecretsRuntimeFastPath(params) { if (hasRuntimeWebToolConfigSurface(params.sourceConfig)) return false; const defaults = params.sourceConfig.secrets?.defaults; if (hasSecretRefCandidate(params.sourceConfig, defaults)) return false; return !params.authStores.some((entry) => hasSecretRefCandidate(entry.store, defaults)); } /** * Prepares a runtime snapshot without resolving refs when config and auth stores contain none. */ function prepareSecretsRuntimeFastPathSnapshot(params) { const runtimeEnv = mergeSecretsRuntimeEnv(params.env); const authStoreCredentialsRevision = getRuntimeAuthProfileStoreCredentialsRevision(); const authStoreSnapshotsRevision = getRuntimeAuthProfileStoreSnapshotsRevision(); const sourceConfig = cloneConfigWithResolutionFacts(params.config); const resolvedConfig = cloneConfigWithResolutionFacts(params.config); const includeAuthStoreRefs = params.includeAuthStoreRefs ?? true; const candidateDirs = resolveCandidateAgentDirs({ config: resolvedConfig, env: runtimeEnv, agentDirs: params.agentDirs }); let authStores = []; if (includeAuthStoreRefs) { if (!params.loadAuthStore) { if (hasCandidateAuthProfileStoreSources({ config: resolvedConfig, env: runtimeEnv, agentDirs: candidateDirs })) return null; authStores = candidateDirs.map((agentDir) => ({ agentDir, store: { version: 1, profiles: {} } })); } else { const loadAuthStore = params.loadAuthStore; authStores = candidateDirs.map((agentDir) => ({ agentDir, store: structuredClone(loadAuthStore(agentDir)) })); } } if (!canUseSecretsRuntimeFastPath({ sourceConfig, authStores })) return null; return { snapshot: { sourceConfig, config: resolvedConfig, authStores: prepareRuntimeAuthProfileStoreSnapshots(authStores, runtimeEnv), authStoreCredentialsRevision, authStoreSnapshotsRevision, warnings: [], degradedOwners: [], secretOwners: [], webTools: createEmptyRuntimeWebToolsMetadata() }, usesAuthStoreFallback: !params.loadAuthStore, refreshContext: { env: runtimeEnv, explicitAgentDirs: params.agentDirs?.length ? [...candidateDirs] : null, includeAuthStoreRefs, loadablePluginOrigins: params.loadablePluginOrigins ?? /* @__PURE__ */ new Map(), ...params.manifestRegistry ? { manifestRegistry: params.manifestRegistry } : {}, ...params.loadAuthStore ? { loadAuthStore: params.loadAuthStore } : {} } }; } //#endregion //#region src/secrets/runtime-provider-auth-activation.ts let activationHandler = null; function registerProviderAuthRuntimeSnapshotActivation(handler) { activationHandler = handler; } function registerProviderAuthRuntimeSnapshotActivationOwner(owner) { registerProviderAuthRuntimeSnapshotActivation(async (params) => await owner.runExclusive(async () => { if (!owner.isCurrent(params.snapshot, params.expectedRevision)) return false; try { owner.assertValid(params.snapshot); if (!params.activateSnapshotIfCurrent()) return false; await owner.publish(params.snapshot); return true; } catch (error) { return owner.onError(error, params.snapshot); } })); } function clearProviderAuthRuntimeSnapshotActivation() { activationHandler = null; } async function activateProviderAuthRuntimeSnapshot(params) { return activationHandler ? await activationHandler(params) : params.activateSnapshotIfCurrent(); } //#endregion export { collectCandidateAgentDirs as a, prepareSecretsRuntimeFastPathSnapshot as c, canUseSecretsRuntimeFastPath as i, resolveRefreshAgentDirs as l, clearProviderAuthRuntimeSnapshotActivation as n, createEmptyRuntimeWebToolsMetadata as o, registerProviderAuthRuntimeSnapshotActivationOwner as r, mergeSecretsRuntimeEnv as s, activateProviderAuthRuntimeSnapshot as t };