UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

254 lines (253 loc) 7.11 kB
import { a as normalizeEnvVarKey, n as isDangerousHostEnvOverrideVarName, r as isDangerousHostEnvVarName } from "./host-env-security-RnaFYKhk.js"; import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js"; import { n as listKnownProviderAuthEnvVarNames } from "./provider-env-vars-Clp1DREb.js"; import { t as loadGlobalRuntimeDotEnvFiles } from "./dotenv-global-I5G89OLc.js"; import fs from "node:fs"; import path from "node:path"; import dotenv from "dotenv"; //#region src/infra/dotenv.ts const logger = createSubsystemLogger("infra:dotenv"); const BLOCKED_PROVIDER_AUTH_WORKSPACE_DOTENV_KEYS = [ "AI_GATEWAY_API_KEY", "ANTHROPIC_API_KEY", "ANTHROPIC_OAUTH_TOKEN", "ARCEEAI_API_KEY", "AZURE_OPENAI_API_KEY", "AZURE_SPEECH_API_KEY", "AZURE_SPEECH_KEY", "AZURE_SPEECH_REGION", "BRAVE_API_KEY", "BYTEPLUS_API_KEY", "BYTEPLUS_SEED_SPEECH_API_KEY", "CEREBRAS_API_KEY", "CHUTES_API_KEY", "CHUTES_OAUTH_TOKEN", "CLOUDFLARE_AI_GATEWAY_API_KEY", "COMFY_API_KEY", "COMFY_CLOUD_API_KEY", "COPILOT_GITHUB_TOKEN", "DASHSCOPE_API_KEY", "DEEPGRAM_API_KEY", "DEEPINFRA_API_KEY", "DEEPSEEK_API_KEY", "ELEVENLABS_API_KEY", "EXA_API_KEY", "FAL_API_KEY", "FAL_KEY", "FIRECRAWL_API_KEY", "FIREWORKS_API_KEY", "GEMINI_API_KEY", "GH_TOKEN", "GITHUB_TOKEN", "GOOGLE_API_KEY", "GOOGLE_CLOUD_API_KEY", "GRADIUM_API_KEY", "GROQ_API_KEY", "HF_TOKEN", "HUGGINGFACE_HUB_TOKEN", "INWORLD_API_KEY", "KILOCODE_API_KEY", "KIMICODE_API_KEY", "KIMI_API_KEY", "LITELLM_API_KEY", "LM_API_TOKEN", "MINIMAX_API_KEY", "MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY", "MINIMAX_OAUTH_TOKEN", "MISTRAL_API_KEY", "MODELSTUDIO_API_KEY", "MOONSHOT_API_KEY", "NVIDIA_API_KEY", "OLLAMA_API_KEY", "OPENAI_API_KEY", "OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY", "OPENROUTER_API_KEY", "PERPLEXITY_API_KEY", "QIANFAN_API_KEY", "QWEN_API_KEY", "RUNWAY_API_KEY", "RUNWAYML_API_SECRET", "SENSEAUDIO_API_KEY", "SGLANG_API_KEY", "SPEECH_KEY", "SPEECH_REGION", "STEPFUN_API_KEY", "SYNTHETIC_API_KEY", "TAVILY_API_KEY", "TOGETHER_API_KEY", "TOKENHUB_API_KEY", "VENICE_API_KEY", "VLLM_API_KEY", "VOLCANO_ENGINE_API_KEY", "VOLCENGINE_TTS_API_KEY", "VOLCENGINE_TTS_APPID", "VOLCENGINE_TTS_TOKEN", "VOYAGE_API_KEY", "VYDRA_API_KEY", "XAI_API_KEY", "XIAOMI_API_KEY", "XI_API_KEY", "ZAI_API_KEY", "Z_AI_API_KEY" ]; const BLOCKED_WORKSPACE_DOTENV_KEYS = new Set([ ...BLOCKED_PROVIDER_AUTH_WORKSPACE_DOTENV_KEYS, "ALL_PROXY", "BROWSER_EXECUTABLE_PATH", "CLAWHUB_AUTH_TOKEN", "CLAWHUB_CONFIG_PATH", "CLAWHUB_TOKEN", "CLAWHUB_URL", "CLOUDSDK_PYTHON", "COMSPEC", "HTTP_PROXY", "HTTPS_PROXY", "HOMEBREW_BREW_FILE", "HOMEBREW_PREFIX", "IRC_HOST", "LOCALAPPDATA", "MATTERMOST_URL", "MATRIX_HOMESERVER", "MINIMAX_API_HOST", "NODE_TLS_REJECT_UNAUTHORIZED", "NO_PROXY", "NPM_EXECPATH", "OPENAI_API_KEYS", "OPENCLAW_AGENT_DIR", "OPENCLAW_ALLOW_PLUGIN_INSTALL_OVERRIDES", "OPENCLAW_ALLOW_INSECURE_PRIVATE_WS", "OPENCLAW_ALLOW_PROJECT_LOCAL_BIN", "OPENCLAW_BROWSER_EXECUTABLE_PATH", "OPENCLAW_BROWSER_CONTROL_MODULE", "OPENCLAW_BUNDLED_HOOKS_DIR", "OPENCLAW_BUNDLED_PLUGINS_DIR", "OPENCLAW_BUNDLED_SKILLS_DIR", "OPENCLAW_CACHE_TRACE", "OPENCLAW_CACHE_TRACE_FILE", "OPENCLAW_CACHE_TRACE_MESSAGES", "OPENCLAW_CACHE_TRACE_PROMPT", "OPENCLAW_CACHE_TRACE_SYSTEM", "OPENCLAW_CONFIG_PATH", "OPENCLAW_GATEWAY_PASSWORD", "OPENCLAW_GATEWAY_PORT", "OPENCLAW_GATEWAY_SECRET", "OPENCLAW_GATEWAY_TOKEN", "OPENCLAW_GATEWAY_URL", "OPENCLAW_HOME", "OPENCLAW_LIVE_ANTHROPIC_KEY", "OPENCLAW_LIVE_ANTHROPIC_KEYS", "OPENCLAW_LIVE_GEMINI_KEY", "OPENCLAW_LIVE_OPENAI_KEY", "OPENCLAW_MPM_CATALOG_PATHS", "OPENCLAW_NODE_EXEC_FALLBACK", "OPENCLAW_NODE_EXEC_HOST", "OPENCLAW_OAUTH_DIR", "OPENCLAW_PINNED_PYTHON", "OPENCLAW_PINNED_WRITE_PYTHON", "OPENCLAW_PLUGIN_INSTALL_OVERRIDES", "OPENCLAW_PLUGIN_CATALOG_PATHS", "OPENCLAW_PROFILE", "OPENCLAW_RAW_STREAM", "OPENCLAW_RAW_STREAM_PATH", "OPENCLAW_SHOW_SECRETS", "OPENCLAW_SKIP_BROWSER_CONTROL_SERVER", "OPENCLAW_STATE_DIR", "OPENCLAW_TEST_TAILSCALE_BINARY", "PATH", "PI_CODING_AGENT_DIR", "PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH", "PROGRAMFILES", "PROGRAMFILES(X86)", "PROGRAMW6432", "STATE_DIRECTORY", "SYNOLOGY_CHAT_INCOMING_URL", "SYNOLOGY_NAS_HOST", "UV_PYTHON" ]); const BLOCKED_WORKSPACE_DOTENV_SUFFIXES = [ "_API_HOST", "_BASE_URL", "_HOMESERVER" ]; const BLOCKED_WORKSPACE_DOTENV_PREFIXES = [ "ANTHROPIC_API_KEY_", "CLAWHUB_", "OPENAI_API_KEY_", "OPENCLAW_", "OPENCLAW_CLAWHUB_", "OPENCLAW_DISABLE_", "OPENCLAW_SKIP_", "OPENCLAW_UPDATE_" ]; function shouldBlockWorkspaceRuntimeDotEnvKey(key) { return isDangerousHostEnvVarName(key) || isDangerousHostEnvOverrideVarName(key); } function buildProviderAuthWorkspaceDotEnvBlocklist() { const keys = new Set(BLOCKED_PROVIDER_AUTH_WORKSPACE_DOTENV_KEYS); for (const rawKey of listKnownProviderAuthEnvVarNames({ includeUntrustedWorkspacePlugins: false })) { const key = normalizeEnvVarKey(rawKey, { portable: true }); if (key) keys.add(key.toUpperCase()); } return keys; } function shouldBlockWorkspaceDotEnvKey(key, getProviderAuthBlockedKeys) { const upper = key.toUpperCase(); return shouldBlockWorkspaceRuntimeDotEnvKey(upper) || BLOCKED_WORKSPACE_DOTENV_KEYS.has(upper) || BLOCKED_WORKSPACE_DOTENV_PREFIXES.some((prefix) => upper.startsWith(prefix)) || BLOCKED_WORKSPACE_DOTENV_SUFFIXES.some((suffix) => upper.endsWith(suffix)) || getProviderAuthBlockedKeys().has(upper); } function readDotEnvFile(params) { let content; try { content = fs.readFileSync(params.filePath, "utf8"); } catch (error) { if (!params.quiet) { if ((error && typeof error === "object" && "code" in error ? String(error.code) : void 0) !== "ENOENT") logger.warn(`Failed to read ${params.filePath}: ${String(error)}`, { error }); } return null; } let parsed; try { parsed = dotenv.parse(content); } catch (error) { if (!params.quiet) logger.warn(`Failed to parse ${params.filePath}: ${String(error)}`, { error }); return null; } const entries = []; for (const [rawKey, value] of Object.entries(parsed)) { const key = normalizeEnvVarKey(rawKey, { portable: true }); if (!key || params.shouldBlockKey(key)) continue; entries.push({ key, value }); } return { filePath: params.filePath, entries }; } function loadWorkspaceDotEnvFile(filePath, opts) { let providerAuthBlockedKeys; const getProviderAuthBlockedKeys = () => { providerAuthBlockedKeys ??= buildProviderAuthWorkspaceDotEnvBlocklist(); return providerAuthBlockedKeys; }; const parsed = readDotEnvFile({ filePath, shouldBlockKey: (key) => shouldBlockWorkspaceDotEnvKey(key, getProviderAuthBlockedKeys), quiet: opts?.quiet ?? true }); if (!parsed) return; for (const { key, value } of parsed.entries) { if (process.env[key] !== void 0) continue; process.env[key] = value; } } function loadDotEnv(opts) { const quiet = opts?.quiet ?? true; loadWorkspaceDotEnvFile(path.join(process.cwd(), ".env"), { quiet }); loadGlobalRuntimeDotEnvFiles({ quiet }); } //#endregion export { loadWorkspaceDotEnvFile as n, loadDotEnv as t };