import type { ClawdbotConfig } from "../../config/config.js"; import { resolveSkillConfig } from "./config.js"; import { resolveSkillKey } from "./frontmatter.js"; import type { SkillEntry, SkillSnapshot } from "./types.js"; export function applySkillEnvOverrides(params: { skills: SkillEntry[]; config?: ClawdbotConfig }) { const { skills, config } = params; const updates: Array<{ key: string; prev: string | undefined }> = []; for (const entry of skills) { const skillKey = resolveSkillKey(entry.skill, entry); const skillConfig = resolveSkillConfig(config, skillKey); if (!skillConfig) continue; if (skillConfig.env) { for (const [envKey, envValue] of Object.entries(skillConfig.env)) { if (!envValue || process.env[envKey]) continue; updates.push({ key: envKey, prev: process.env[envKey] }); process.env[envKey] = envValue; } } const primaryEnv = entry.clawdbot?.primaryEnv; if (primaryEnv && skillConfig.apiKey && !process.env[primaryEnv]) { updates.push({ key: primaryEnv, prev: process.env[primaryEnv] }); process.env[primaryEnv] = skillConfig.apiKey; } } return () => { for (const update of updates) { if (update.prev === undefined) delete process.env[update.key]; else process.env[update.key] = update.prev; } }; } export function applySkillEnvOverridesFromSnapshot(params: { snapshot?: SkillSnapshot; config?: ClawdbotConfig; }) { const { snapshot, config } = params; if (!snapshot) return () => {}; const updates: Array<{ key: string; prev: string | undefined }> = []; for (const skill of snapshot.skills) { const skillConfig = resolveSkillConfig(config, skill.name); if (!skillConfig) continue; if (skillConfig.env) { for (const [envKey, envValue] of Object.entries(skillConfig.env)) { if (!envValue || process.env[envKey]) continue; updates.push({ key: envKey, prev: process.env[envKey] }); process.env[envKey] = envValue; } } if (skill.primaryEnv && skillConfig.apiKey && !process.env[skill.primaryEnv]) { updates.push({ key: skill.primaryEnv, prev: process.env[skill.primaryEnv], }); process.env[skill.primaryEnv] = skillConfig.apiKey; } } return () => { for (const update of updates) { if (update.prev === undefined) delete process.env[update.key]; else process.env[update.key] = update.prev; } }; }