Summary
On Linux (and almost certainly macOS), when Buzz is launched from the desktop/GUI, agent model discovery fails and the model dropdown silently falls back to built-in options with:
Using built-in model options. Could not load live models for this provider.
The real cause is that the model-discovery subprocess can't find node, even though Buzz has downloaded its own managed Node runtime. run_agent_models_command sets the subprocess PATH solely from login_shell_path() and never prepends Buzz's bundled managed-node bin dir, so the #!/usr/bin/env node ACP adapter (claude-agent-acp) dies on launch.
This looks like the Linux/macOS sibling of the Windows PATH work in #2247 — same subsystem, different branch/platform.
Environment
- Buzz 0.4.22 (AppImage,
Buzz_0.4.22_amd64.AppImage)
- Linux x86_64 (Ubuntu/Zorin-based, GNOME), app launched from the desktop launcher
- Runtime: Claude Code —
claude CLI v2.1.216, adapter @agentclientprotocol/claude-agent-acp v0.60.0
- Bundled managed node present:
~/.local/share/Buzz/runtimes/node/v24.11.0/linux-x64/bin/node
node provided on this machine only via nvm, initialized in ~/.bashrc after the standard non-interactive guard (# If not running interactively, don't do anything); ~/.bash_profile does not source ~/.bashrc.
What the user sees
Connect Claude Code, open the agent's model dropdown → "Using built-in model options. Could not load live models for this provider." No indication of the real cause. (The "for this provider" wording is just the provider_locked Claude runtime having provider: null — not a red herring worth chasing.)
Root cause
Model discovery runs buzz-acp models --json, which spawns the claude-agent-acp adapter — a Node script with #!/usr/bin/env node. The subprocess PATH comes only from login_shell_path():
desktop/src-tauri/src/commands/agent_model_process.rs (run_agent_models_command):
if let Some(ref path) = crate::managed_agents::login_shell_path() {
cmd.env("PATH", path);
}
On a GUI launch, the process PATH has no node (nvm isn't loaded), and login_shell_path() runs a non-interactive bash -l -c 'echo $PATH', which also lacks node because nvm is only initialized in the interactive branch of ~/.bashrc. So env can't find node, the adapter never starts, buzz-acp exits non-zero, discovery returns Err, and personaModelDiscoveryStatus.ts shows its generic catch-all message.
Crucially, Buzz already downloaded a working node at buzz_managed_node_bin_dir() (managed_node_paths.rs) — it just isn't placed on the discovery subprocess PATH.
Reproduction
Faithful reproduction of Buzz's exact invocation with the app's real (GUI-launch-derived, node-less) login PATH:
$ env -i HOME=$HOME PATH="$(env -i HOME=$HOME PATH=/usr/bin:/bin bash -l -c 'echo $PATH')" \
BUZZ_ACP_AGENT_COMMAND="$HOME/.local/share/Buzz/node-tools/bin/claude-agent-acp" \
BUZZ_ACP_AGENT_ARGS="" \
buzz-acp models --json
/usr/bin/env: 'node': No such file or directory
error: agent communication failed: Agent process exited unexpectedly # exit 1
Prepend the bundled managed node and it succeeds (exit 0, full model list — Default/Opus/Fable/Sonnet/Haiku):
$ PATH="$HOME/.local/share/Buzz/runtimes/node/v24.11.0/linux-x64/bin:$PATH" buzz-acp models --json
{ "agent": { "name": "@agentclientprotocol/claude-agent-acp", ... }, "stable": { "configOptions": [ ... ] } }
Suggested fix
For agent-spawn / model-discovery subprocesses, prepend buzz_managed_node_bin_dir() to PATH (before the login_shell_path() value) whenever it exists — Buzz went to the trouble of bundling a private Node precisely so it wouldn't depend on the user's system/nvm node, but the discovery/spawn paths don't use it. This generalizes the PATH hardening in #2247 to Linux/macOS. Applying the same to spawn_agent_child would prevent the same failure at actual agent-run time, not just discovery.
Secondary, optional: surface the underlying stderr (e.g. env: node: No such file or directory) in the model-discovery status instead of the fully generic fallback, so this class of failure is diagnosable without reproducing the subprocess by hand.
Workaround (for anyone hitting this)
Symlink node onto a dir that's on the login PATH, e.g.:
ln -s ~/.nvm/versions/node/<version>/bin/node ~/.local/bin/node
then fully restart Buzz (login_shell_path() is cached per-process).
Summary
On Linux (and almost certainly macOS), when Buzz is launched from the desktop/GUI, agent model discovery fails and the model dropdown silently falls back to built-in options with:
The real cause is that the model-discovery subprocess can't find
node, even though Buzz has downloaded its own managed Node runtime.run_agent_models_commandsets the subprocessPATHsolely fromlogin_shell_path()and never prepends Buzz's bundled managed-node bin dir, so the#!/usr/bin/env nodeACP adapter (claude-agent-acp) dies on launch.This looks like the Linux/macOS sibling of the Windows PATH work in #2247 — same subsystem, different branch/platform.
Environment
Buzz_0.4.22_amd64.AppImage)claudeCLI v2.1.216, adapter@agentclientprotocol/claude-agent-acpv0.60.0~/.local/share/Buzz/runtimes/node/v24.11.0/linux-x64/bin/nodenodeprovided on this machine only vianvm, initialized in~/.bashrcafter the standard non-interactive guard (# If not running interactively, don't do anything);~/.bash_profiledoes not source~/.bashrc.What the user sees
Connect Claude Code, open the agent's model dropdown → "Using built-in model options. Could not load live models for this provider." No indication of the real cause. (The "for this provider" wording is just the
provider_lockedClaude runtime havingprovider: null— not a red herring worth chasing.)Root cause
Model discovery runs
buzz-acp models --json, which spawns theclaude-agent-acpadapter — a Node script with#!/usr/bin/env node. The subprocessPATHcomes only fromlogin_shell_path():desktop/src-tauri/src/commands/agent_model_process.rs(run_agent_models_command):On a GUI launch, the process
PATHhas nonode(nvm isn't loaded), andlogin_shell_path()runs a non-interactivebash -l -c 'echo $PATH', which also lacksnodebecause nvm is only initialized in the interactive branch of~/.bashrc. Soenvcan't findnode, the adapter never starts,buzz-acpexits non-zero, discovery returnsErr, andpersonaModelDiscoveryStatus.tsshows its generic catch-all message.Crucially, Buzz already downloaded a working
nodeatbuzz_managed_node_bin_dir()(managed_node_paths.rs) — it just isn't placed on the discovery subprocessPATH.Reproduction
Faithful reproduction of Buzz's exact invocation with the app's real (GUI-launch-derived, node-less) login PATH:
Prepend the bundled managed node and it succeeds (exit 0, full model list — Default/Opus/Fable/Sonnet/Haiku):
Suggested fix
For agent-spawn / model-discovery subprocesses, prepend
buzz_managed_node_bin_dir()toPATH(before thelogin_shell_path()value) whenever it exists — Buzz went to the trouble of bundling a private Node precisely so it wouldn't depend on the user's system/nvm node, but the discovery/spawn paths don't use it. This generalizes the PATH hardening in #2247 to Linux/macOS. Applying the same tospawn_agent_childwould prevent the same failure at actual agent-run time, not just discovery.Secondary, optional: surface the underlying stderr (e.g.
env: node: No such file or directory) in the model-discovery status instead of the fully generic fallback, so this class of failure is diagnosable without reproducing the subprocess by hand.Workaround (for anyone hitting this)
Symlink
nodeonto a dir that's on the login PATH, e.g.:then fully restart Buzz (
login_shell_path()is cached per-process).