UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

141 lines (140 loc) 8.09 kB
import { a as trimToUndefined, i as trimCredentialToUndefined, t as createGatewayCredentialPlan } from "./credential-planner-wESmL_7M.js"; //#region src/gateway/credentials.ts const GATEWAY_SECRET_REF_UNAVAILABLE_ERROR_CODE = "GATEWAY_SECRET_REF_UNAVAILABLE"; /** Raised when a command path needs Gateway credentials before secret refs were resolved. */ var GatewaySecretRefUnavailableError = class extends Error { constructor(path) { super([ `${path} is configured as a secret reference but is unavailable in this command path.`, "Fix: set OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD, pass explicit --token/--password,", "or run a gateway command path that resolves secret references before credential selection." ].join("\n")); this.code = GATEWAY_SECRET_REF_UNAVAILABLE_ERROR_CODE; this.name = "GatewaySecretRefUnavailableError"; this.path = path; } }; /** Type guard for unresolved Gateway secret-ref errors, optionally scoped to a config path. */ function isGatewaySecretRefUnavailableError(error, expectedPath) { if (!(error instanceof GatewaySecretRefUnavailableError)) return false; if (!expectedPath) return true; return error.path === expectedPath; } function firstDefined(values) { for (const value of values) if (value) return value; } function throwUnresolvedGatewaySecretInput(path) { throw new GatewaySecretRefUnavailableError(path); } /** Resolve direct token/password values with caller-selected env-vs-config precedence. */ function resolveGatewayCredentialsFromValues(params) { const env = params.env ?? process.env; const envToken = trimToUndefined(env.OPENCLAW_GATEWAY_TOKEN); const envPassword = trimToUndefined(env.OPENCLAW_GATEWAY_PASSWORD); const configToken = trimCredentialToUndefined(params.configToken); const configPassword = trimCredentialToUndefined(params.configPassword); const tokenPrecedence = params.tokenPrecedence ?? "env-first"; const passwordPrecedence = params.passwordPrecedence ?? "env-first"; return { token: tokenPrecedence === "config-first" ? firstDefined([configToken, envToken]) : firstDefined([envToken, configToken]), password: passwordPrecedence === "config-first" ? firstDefined([configPassword, envPassword]) : firstDefined([envPassword, configPassword]) }; } function resolveLocalGatewayCredentials(params) { const localResolved = resolveGatewayCredentialsFromValues({ configToken: params.plan.localToken.configured ? params.plan.localToken.value : params.plan.remoteToken.value, configPassword: params.plan.localPassword.configured ? params.plan.localPassword.value : params.plan.authMode === "trusted-proxy" ? void 0 : params.plan.remotePassword.value, env: params.env, tokenPrecedence: params.localTokenPrecedence, passwordPrecedence: params.localPasswordPrecedence }); const localPasswordCanWin = params.plan.authMode === "password" || params.plan.authMode === "trusted-proxy" || params.plan.authMode !== "token" && params.plan.authMode !== "none" && !localResolved.token; const localTokenCanWin = params.plan.authMode === "token" || params.plan.authMode !== "password" && params.plan.authMode !== "none" && params.plan.authMode !== "trusted-proxy" && !localResolved.password; if (params.plan.localToken.refPath && params.localTokenPrecedence === "config-first" && !params.plan.localToken.value && Boolean(params.plan.envToken) && localTokenCanWin) throwUnresolvedGatewaySecretInput(params.plan.localToken.refPath); if (params.plan.localPassword.refPath && params.localPasswordPrecedence === "config-first" && !params.plan.localPassword.value && Boolean(params.plan.envPassword) && localPasswordCanWin) throwUnresolvedGatewaySecretInput(params.plan.localPassword.refPath); if (params.plan.localToken.refPath && !localResolved.token && !params.plan.envToken && localTokenCanWin) throwUnresolvedGatewaySecretInput(params.plan.localToken.refPath); if (params.plan.localPassword.refPath && !localResolved.password && !params.plan.envPassword && localPasswordCanWin) throwUnresolvedGatewaySecretInput(params.plan.localPassword.refPath); return localResolved; } function resolveRemoteGatewayCredentials(params) { const token = params.remoteTokenFallback === "remote-only" ? params.plan.remoteToken.value : params.remoteTokenPrecedence === "env-first" ? firstDefined([ params.plan.envToken, params.plan.remoteToken.value, params.plan.localToken.value ]) : firstDefined([ params.plan.remoteToken.value, params.plan.envToken, params.plan.localToken.value ]); const password = params.remotePasswordFallback === "remote-only" ? params.plan.remotePassword.value : params.remotePasswordPrecedence === "env-first" ? firstDefined([ params.plan.envPassword, params.plan.remotePassword.value, params.plan.localPassword.value ]) : firstDefined([ params.plan.remotePassword.value, params.plan.envPassword, params.plan.localPassword.value ]); const localTokenFallbackEnabled = params.remoteTokenFallback !== "remote-only"; const localTokenFallback = params.remoteTokenFallback === "remote-only" ? void 0 : params.plan.localToken.value; const localPasswordFallback = params.remotePasswordFallback === "remote-only" ? void 0 : params.plan.localPassword.value; if (params.plan.remoteToken.refPath && !token && !params.plan.envToken && !localTokenFallback && !password) throwUnresolvedGatewaySecretInput(params.plan.remoteToken.refPath); if (params.plan.remotePassword.refPath && !password && !params.plan.envPassword && !localPasswordFallback && !token) throwUnresolvedGatewaySecretInput(params.plan.remotePassword.refPath); if (params.plan.localToken.refPath && localTokenFallbackEnabled && !token && !password && !params.plan.envToken && !params.plan.remoteToken.value && params.plan.localTokenCanWin) throwUnresolvedGatewaySecretInput(params.plan.localToken.refPath); return { token, password }; } /** Resolve Gateway credentials from config, explicit auth, URL overrides, and mode policy. */ function resolveGatewayCredentialsFromConfig(params) { const env = params.env ?? process.env; const explicitToken = trimToUndefined(params.explicitAuth?.token); const explicitPassword = trimToUndefined(params.explicitAuth?.password); if (explicitToken || explicitPassword) return { token: explicitToken, password: explicitPassword }; if (trimToUndefined(params.urlOverride) && params.urlOverrideSource !== "env") return {}; if (trimToUndefined(params.urlOverride) && params.urlOverrideSource === "env") return resolveGatewayCredentialsFromValues({ configToken: void 0, configPassword: void 0, env, tokenPrecedence: "env-first", passwordPrecedence: "env-first" }); const plan = createGatewayCredentialPlan({ config: params.cfg, env }); const mode = params.modeOverride ?? plan.configuredMode; const localTokenPrecedence = params.localTokenPrecedence ?? (env.OPENCLAW_SERVICE_KIND === "gateway" ? "config-first" : "env-first"); const localPasswordPrecedence = params.localPasswordPrecedence ?? "env-first"; if (mode === "local") return resolveLocalGatewayCredentials({ plan, env, localTokenPrecedence, localPasswordPrecedence }); const remoteTokenFallback = params.remoteTokenFallback ?? "remote-env-local"; const remotePasswordFallback = params.remotePasswordFallback ?? "remote-env-local"; return resolveRemoteGatewayCredentials({ plan, remoteTokenPrecedence: params.remoteTokenPrecedence ?? "remote-first", remotePasswordPrecedence: params.remotePasswordPrecedence ?? "env-first", remoteTokenFallback, remotePasswordFallback }); } /** Resolve the stricter credential view used by Gateway probe paths. */ function resolveGatewayProbeCredentialsFromConfig(params) { return resolveGatewayCredentialsFromConfig({ cfg: params.cfg, env: params.env, explicitAuth: params.explicitAuth, modeOverride: params.mode, remoteTokenFallback: "remote-only" }); } //#endregion export { resolveGatewayProbeCredentialsFromConfig as a, resolveGatewayCredentialsFromValues as i, isGatewaySecretRefUnavailableError as n, resolveGatewayCredentialsFromConfig as r, GatewaySecretRefUnavailableError as t };