diff --git a/packages/desktop/src/main/shell-env.test.ts b/packages/desktop/src/main/shell-env.test.ts index e71708ad0491..a4d05bce762a 100644 --- a/packages/desktop/src/main/shell-env.test.ts +++ b/packages/desktop/src/main/shell-env.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" -import { isNushell, mergeShellEnv, parseShellEnv, resolveUserShell } from "./shell-env" +import { isNushell, loadShellEnv, mergeShellEnv, parseShellEnv, resolveUserShell } from "./shell-env" describe("shell env", () => { test("parseShellEnv supports null-delimited pairs", () => { @@ -47,4 +47,16 @@ describe("shell env", () => { expect(isNushell("C:\\Program Files\\nu.exe")).toBe(true) expect(isNushell("/bin/zsh")).toBe(false) }) + + test("loadShellEnv falls back to login shell after interactive timeout", () => { + const modes: string[] = [] + const env = loadShellEnv("/bin/zsh", { log() {} }, (_shell, mode) => { + modes.push(mode) + if (mode === "-il") return { type: "Timeout" } + return { type: "Loaded", value: { PATH: "/usr/local/bin" } } + }) + + expect(modes).toEqual(["-il", "-l"]) + expect(env?.PATH).toBe("/usr/local/bin") + }) }) diff --git a/packages/desktop/src/main/shell-env.ts b/packages/desktop/src/main/shell-env.ts index 082ed5e930db..35553e037008 100644 --- a/packages/desktop/src/main/shell-env.ts +++ b/packages/desktop/src/main/shell-env.ts @@ -67,23 +67,22 @@ export function isNushell(shell: string) { return name === "nu" || name === "nu.exe" || raw.endsWith("\\nu.exe") } -export function loadShellEnv(shell: string, logger: ShellEnvLogger) { +export function loadShellEnv(shell: string, logger: ShellEnvLogger, probeShell = probe) { if (isNushell(shell)) { logger.log(`[server] Skipping shell env probe for nushell: ${shell}`) return null } - const interactive = probe(shell, "-il") + const interactive = probeShell(shell, "-il") if (interactive.type === "Loaded") { logger.log(`[server] Loaded shell environment with -il (${Object.keys(interactive.value).length} vars)`) return interactive.value } if (interactive.type === "Timeout") { - logger.log(`[server] Interactive shell env probe timed out: ${shell}`) - return null + logger.log(`[server] Interactive shell env probe timed out, retrying with -l: ${shell}`) } - const login = probe(shell, "-l") + const login = probeShell(shell, "-l") if (login.type === "Loaded") { logger.log(`[server] Loaded shell environment with -l (${Object.keys(login.value).length} vars)`) return login.value