From a76777759867f08f0ad03733b67dedad97ecb63a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 16:36:27 +0000 Subject: [PATCH] refactor(skills): dedupe env overrides --- src/agents/skills/env-overrides.ts | 99 +++++++++++++++--------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/src/agents/skills/env-overrides.ts b/src/agents/skills/env-overrides.ts index 4d6e97a2e..281efc8a2 100644 --- a/src/agents/skills/env-overrides.ts +++ b/src/agents/skills/env-overrides.ts @@ -3,34 +3,32 @@ import type { SkillEntry, SkillSnapshot } from "./types.js"; import { resolveSkillConfig } from "./config.js"; import { resolveSkillKey } from "./frontmatter.js"; -export function applySkillEnvOverrides(params: { skills: SkillEntry[]; config?: OpenClawConfig }) { - const { skills, config } = params; - const updates: Array<{ key: string; prev: string | undefined }> = []; +type EnvUpdate = { key: string; prev: string | undefined }; +type SkillConfig = NonNullable>; - 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; +function applySkillConfigEnvOverrides(params: { + updates: EnvUpdate[]; + skillConfig: SkillConfig; + primaryEnv?: string | null; +}) { + const { updates, skillConfig, primaryEnv } = params; + if (skillConfig.env) { + for (const [envKey, envValue] of Object.entries(skillConfig.env)) { + if (!envValue || process.env[envKey]) { + continue; } - } - - const primaryEnv = entry.metadata?.primaryEnv; - if (primaryEnv && skillConfig.apiKey && !process.env[primaryEnv]) { - updates.push({ key: primaryEnv, prev: process.env[primaryEnv] }); - process.env[primaryEnv] = skillConfig.apiKey; + updates.push({ key: envKey, prev: process.env[envKey] }); + process.env[envKey] = envValue; } } + if (primaryEnv && skillConfig.apiKey && !process.env[primaryEnv]) { + updates.push({ key: primaryEnv, prev: process.env[primaryEnv] }); + process.env[primaryEnv] = skillConfig.apiKey; + } +} + +function createEnvReverter(updates: EnvUpdate[]) { return () => { for (const update of updates) { if (update.prev === undefined) { @@ -42,6 +40,27 @@ export function applySkillEnvOverrides(params: { skills: SkillEntry[]; config?: }; } +export function applySkillEnvOverrides(params: { skills: SkillEntry[]; config?: OpenClawConfig }) { + const { skills, config } = params; + const updates: EnvUpdate[] = []; + + for (const entry of skills) { + const skillKey = resolveSkillKey(entry.skill, entry); + const skillConfig = resolveSkillConfig(config, skillKey); + if (!skillConfig) { + continue; + } + + applySkillConfigEnvOverrides({ + updates, + skillConfig, + primaryEnv: entry.metadata?.primaryEnv, + }); + } + + return createEnvReverter(updates); +} + export function applySkillEnvOverridesFromSnapshot(params: { snapshot?: SkillSnapshot; config?: OpenClawConfig; @@ -50,7 +69,7 @@ export function applySkillEnvOverridesFromSnapshot(params: { if (!snapshot) { return () => {}; } - const updates: Array<{ key: string; prev: string | undefined }> = []; + const updates: EnvUpdate[] = []; for (const skill of snapshot.skills) { const skillConfig = resolveSkillConfig(config, skill.name); @@ -58,32 +77,12 @@ export function applySkillEnvOverridesFromSnapshot(params: { 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; - } + applySkillConfigEnvOverrides({ + updates, + skillConfig, + primaryEnv: skill.primaryEnv, + }); } - return () => { - for (const update of updates) { - if (update.prev === undefined) { - delete process.env[update.key]; - } else { - process.env[update.key] = update.prev; - } - } - }; + return createEnvReverter(updates); }