refactor(skills): dedupe env overrides

This commit is contained in:
Peter Steinberger
2026-02-15 16:36:27 +00:00
parent afa5444242
commit a767777598

View File

@@ -3,34 +3,32 @@ import type { SkillEntry, SkillSnapshot } from "./types.js";
import { resolveSkillConfig } from "./config.js"; import { resolveSkillConfig } from "./config.js";
import { resolveSkillKey } from "./frontmatter.js"; import { resolveSkillKey } from "./frontmatter.js";
export function applySkillEnvOverrides(params: { skills: SkillEntry[]; config?: OpenClawConfig }) { type EnvUpdate = { key: string; prev: string | undefined };
const { skills, config } = params; type SkillConfig = NonNullable<ReturnType<typeof resolveSkillConfig>>;
const updates: Array<{ key: string; prev: string | undefined }> = [];
for (const entry of skills) { function applySkillConfigEnvOverrides(params: {
const skillKey = resolveSkillKey(entry.skill, entry); updates: EnvUpdate[];
const skillConfig = resolveSkillConfig(config, skillKey); skillConfig: SkillConfig;
if (!skillConfig) { primaryEnv?: string | null;
continue; }) {
} const { updates, skillConfig, primaryEnv } = params;
if (skillConfig.env) {
if (skillConfig.env) { for (const [envKey, envValue] of Object.entries(skillConfig.env)) {
for (const [envKey, envValue] of Object.entries(skillConfig.env)) { if (!envValue || process.env[envKey]) {
if (!envValue || process.env[envKey]) { continue;
continue;
}
updates.push({ key: envKey, prev: process.env[envKey] });
process.env[envKey] = envValue;
} }
} updates.push({ key: envKey, prev: process.env[envKey] });
process.env[envKey] = envValue;
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;
} }
} }
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 () => { return () => {
for (const update of updates) { for (const update of updates) {
if (update.prev === undefined) { 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: { export function applySkillEnvOverridesFromSnapshot(params: {
snapshot?: SkillSnapshot; snapshot?: SkillSnapshot;
config?: OpenClawConfig; config?: OpenClawConfig;
@@ -50,7 +69,7 @@ export function applySkillEnvOverridesFromSnapshot(params: {
if (!snapshot) { if (!snapshot) {
return () => {}; return () => {};
} }
const updates: Array<{ key: string; prev: string | undefined }> = []; const updates: EnvUpdate[] = [];
for (const skill of snapshot.skills) { for (const skill of snapshot.skills) {
const skillConfig = resolveSkillConfig(config, skill.name); const skillConfig = resolveSkillConfig(config, skill.name);
@@ -58,32 +77,12 @@ export function applySkillEnvOverridesFromSnapshot(params: {
continue; continue;
} }
if (skillConfig.env) { applySkillConfigEnvOverrides({
for (const [envKey, envValue] of Object.entries(skillConfig.env)) { updates,
if (!envValue || process.env[envKey]) { skillConfig,
continue; primaryEnv: skill.primaryEnv,
} });
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 () => { return createEnvReverter(updates);
for (const update of updates) {
if (update.prev === undefined) {
delete process.env[update.key];
} else {
process.env[update.key] = update.prev;
}
}
};
} }