UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

59 lines (58 loc) 2.41 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { t as normalizeOptionalSecretInput } from "./normalize-secret-input-Df_qhWv_.js"; import fs from "node:fs"; import os from "node:os"; //#region src/secrets/provider-auth-evidence.ts /** Resolves cheap, secret-free local credential evidence declared by provider manifests. */ function expandAuthEvidencePath(rawPath, env) { const trimmed = rawPath.trim(); if (!trimmed) return; let unresolvedPlaceholder = false; let explicitOverride = false; const placeholderPattern = /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/gu; const invalidPlaceholder = trimmed.replace(placeholderPattern, "").includes("${"); const expanded = trimmed.replace(placeholderPattern, (_match, name) => { const value = name === "HOME" ? normalizeOptionalString(env.HOME) ?? os.homedir() : normalizeOptionalString(env[name]); if (!value) { unresolvedPlaceholder = true; return ""; } if (name !== "HOME" && name !== "APPDATA") explicitOverride = true; return value; }); return unresolvedPlaceholder || invalidPlaceholder ? void 0 : { path: expanded, explicitOverride }; } function hasRequiredAuthEvidenceEnv(evidence, env) { const hasEnv = (key) => Boolean(normalizeOptionalSecretInput(env[key])); if (evidence.requiresAnyEnv?.length && !evidence.requiresAnyEnv.some(hasEnv)) return false; if (evidence.requiresAllEnv?.length && !evidence.requiresAllEnv.every(hasEnv)) return false; return true; } function hasLocalFileAuthEvidence(evidence, env) { if (evidence.fileEnvVar) { const explicitPath = normalizeOptionalString(env[evidence.fileEnvVar]); if (explicitPath) return fs.existsSync(explicitPath); } for (const rawPath of evidence.fallbackPaths ?? []) { const expandedPath = expandAuthEvidencePath(rawPath, env); if (!expandedPath) continue; if (fs.existsSync(expandedPath.path)) return true; if (expandedPath.explicitOverride) return false; } return false; } function resolveLocalProviderAuthEvidence(evidenceEntries, env) { for (const evidence of evidenceEntries ?? []) { if (evidence.type !== "local-file-with-env" || !hasRequiredAuthEvidenceEnv(evidence, env) || !hasLocalFileAuthEvidence(evidence, env)) continue; return { credentialMarker: evidence.credentialMarker, source: evidence.source ?? "local auth evidence" }; } return null; } //#endregion export { resolveLocalProviderAuthEvidence as t };