Fix agent spawn PATH resolution and add provider binary checks to status

Shell env PATH was being overridden by process.env PATH in
applyProviderEnv, causing agent spawns to fail with ENOENT when the
daemon runs from the Tauri desktop app (minimal GUI PATH). Flip the
merge order so login shell env wins.

Add a Providers section to `paseo daemon status` that resolves each
agent binary (claude, codex, opencode) and runs --version using the
same applyProviderEnv environment the daemon uses to spawn agents.
This commit is contained in:
Mohamed Boudra
2026-03-18 10:08:48 +07:00
parent e2f20f0e24
commit 0bc903fa21
4 changed files with 87 additions and 9 deletions
@@ -92,6 +92,25 @@ describe("applyProviderEnv", () => {
expect(env.FOO).toBe("bar");
expect(Object.keys(env).length).toBeGreaterThanOrEqual(3);
});
test("shell env PATH wins over base env PATH", () => {
const base = { PATH: "/usr/bin:/bin" };
const shellEnv = { PATH: "/usr/local/bin:/usr/bin:/bin:/home/user/.nvm/bin" };
const env = applyProviderEnv(base, undefined, shellEnv);
expect(env.PATH).toBe("/usr/local/bin:/usr/bin:/bin:/home/user/.nvm/bin");
});
test("runtimeSettings env wins over shell env", () => {
const base = { PATH: "/usr/bin" };
const shellEnv = { PATH: "/usr/local/bin:/usr/bin" };
const runtime: ProviderRuntimeSettings = { env: { PATH: "/custom/path" } };
const env = applyProviderEnv(base, runtime, shellEnv);
expect(env.PATH).toBe("/custom/path");
});
});
describe("findExecutable", () => {
@@ -131,8 +131,8 @@ export function applyProviderEnv(
shellEnv?: Record<string, string>
): Record<string, string | undefined> {
return {
...(shellEnv ?? resolveShellEnv()),
...baseEnv,
...(shellEnv ?? resolveShellEnv()),
...(runtimeSettings?.env ?? {}),
};
}
+3
View File
@@ -24,6 +24,9 @@ export {
type SherpaLoaderEnvResolution,
} from "./speech/providers/local/sherpa/sherpa-runtime-env.js";
// Provider binary resolution
export { findExecutable, applyProviderEnv } from "./agent/provider-launch-config.js";
// Agent SDK types for CLI commands
export type {
AgentMode,