refactor(skills): dedupe env overrides
This commit is contained in:
@@ -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<ReturnType<typeof resolveSkillConfig>>;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user