mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 19:00:45 +00:00
perf(config): skip shell env fallback for explicit empty vars
This commit is contained in:
@@ -12,6 +12,14 @@ const resolveIsNixModeMock = vi.hoisted(() => vi.fn(() => false));
|
|||||||
const resolveSecretInputRefMock = vi.hoisted(() =>
|
const resolveSecretInputRefMock = vi.hoisted(() =>
|
||||||
vi.fn((): { ref: unknown } => ({ ref: undefined })),
|
vi.fn((): { ref: unknown } => ({ ref: undefined })),
|
||||||
);
|
);
|
||||||
|
const hasConfiguredSecretInputMock = vi.hoisted(() =>
|
||||||
|
vi.fn((value: unknown): boolean => {
|
||||||
|
if (typeof value === "string" && value.trim()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return resolveSecretInputRefMock(value as never)?.ref != null;
|
||||||
|
}),
|
||||||
|
);
|
||||||
const resolveGatewayAuthMock = vi.hoisted(() =>
|
const resolveGatewayAuthMock = vi.hoisted(() =>
|
||||||
vi.fn(() => ({
|
vi.fn(() => ({
|
||||||
mode: "token",
|
mode: "token",
|
||||||
@@ -70,6 +78,7 @@ vi.mock("../../config/paths.js", () => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
vi.mock("../../config/types.secrets.js", () => ({
|
vi.mock("../../config/types.secrets.js", () => ({
|
||||||
|
hasConfiguredSecretInput: hasConfiguredSecretInputMock,
|
||||||
resolveSecretInputRef: resolveSecretInputRefMock,
|
resolveSecretInputRef: resolveSecretInputRefMock,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,24 @@ describe("shell env fallback", () => {
|
|||||||
expect(exec).not.toHaveBeenCalled();
|
expect(exec).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("treats explicitly empty env vars as intentional overrides", () => {
|
||||||
|
const env: NodeJS.ProcessEnv = { OPENAI_API_KEY: "" };
|
||||||
|
const exec = vi.fn(() => Buffer.from("OPENAI_API_KEY=from-shell\0"));
|
||||||
|
|
||||||
|
const res = runShellEnvFallback({
|
||||||
|
enabled: true,
|
||||||
|
env,
|
||||||
|
expectedKeys: ["OPENAI_API_KEY"],
|
||||||
|
exec,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res.ok).toBe(true);
|
||||||
|
expect(res.applied).toEqual([]);
|
||||||
|
expect(res.ok && res.skippedReason).toBe("already-has-keys");
|
||||||
|
expect(env.OPENAI_API_KEY).toBe("");
|
||||||
|
expect(exec).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
it("imports expected keys without overriding existing env", () => {
|
it("imports expected keys without overriding existing env", () => {
|
||||||
const env: NodeJS.ProcessEnv = {};
|
const env: NodeJS.ProcessEnv = {};
|
||||||
const exec = vi.fn(() => Buffer.from("OPENAI_API_KEY=from-shell\0DISCORD_BOT_TOKEN=discord\0"));
|
const exec = vi.fn(() => Buffer.from("OPENAI_API_KEY=from-shell\0DISCORD_BOT_TOKEN=discord\0"));
|
||||||
|
|||||||
@@ -208,6 +208,10 @@ export type ShellEnvFallbackOptions = {
|
|||||||
exec?: typeof execFileSync;
|
exec?: typeof execFileSync;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function hasExplicitEnvBinding(env: NodeJS.ProcessEnv, key: string): boolean {
|
||||||
|
return Object.prototype.hasOwnProperty.call(env, key);
|
||||||
|
}
|
||||||
|
|
||||||
export function loadShellEnvFallback(opts: ShellEnvFallbackOptions): ShellEnvFallbackResult {
|
export function loadShellEnvFallback(opts: ShellEnvFallbackOptions): ShellEnvFallbackResult {
|
||||||
const logger = opts.logger ?? console;
|
const logger = opts.logger ?? console;
|
||||||
|
|
||||||
@@ -216,7 +220,7 @@ export function loadShellEnvFallback(opts: ShellEnvFallbackOptions): ShellEnvFal
|
|||||||
return { ok: true, applied: [], skippedReason: "disabled" };
|
return { ok: true, applied: [], skippedReason: "disabled" };
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasAnyKey = opts.expectedKeys.some((key) => Boolean(opts.env[key]?.trim()));
|
const hasAnyKey = opts.expectedKeys.some((key) => hasExplicitEnvBinding(opts.env, key));
|
||||||
if (hasAnyKey) {
|
if (hasAnyKey) {
|
||||||
lastAppliedKeys = [];
|
lastAppliedKeys = [];
|
||||||
return { ok: true, applied: [], skippedReason: "already-has-keys" };
|
return { ok: true, applied: [], skippedReason: "already-has-keys" };
|
||||||
@@ -235,7 +239,7 @@ export function loadShellEnvFallback(opts: ShellEnvFallbackOptions): ShellEnvFal
|
|||||||
|
|
||||||
const applied: string[] = [];
|
const applied: string[] = [];
|
||||||
for (const key of opts.expectedKeys) {
|
for (const key of opts.expectedKeys) {
|
||||||
if (opts.env[key]?.trim()) {
|
if (hasExplicitEnvBinding(opts.env, key)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const value = probe.shellEnv.get(key);
|
const value = probe.shellEnv.get(key);
|
||||||
|
|||||||
Reference in New Issue
Block a user