nix: include home-manager profile paths when inheriting user PATH (#1040)
`inheritUserEnvironment` set the daemon's PATH to NixOS user/system profiles only, missing `~/.nix-profile/bin` and `~/.local/state/nix/profile/bin` where home-manager installs per-user CLIs. Result: agents like claude/opencode installed via home-manager were invisible to the daemon and provider checks failed with "Provider 'X' is not available. Please ensure the CLI is installed." Prepend both home-manager profile dirs to PATH when running as a real user (cfg.user != "paseo"), and update the option doc accordingly. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
675817f0b2
commit
5762055213
+28
-13
@@ -135,8 +135,9 @@ in
|
|||||||
|
|
||||||
When Paseo runs as a real user (not the default system user), AI agents
|
When Paseo runs as a real user (not the default system user), AI agents
|
||||||
need access to the user's tools (git, ssh, etc.). This adds the user's
|
need access to the user's tools (git, ssh, etc.). This adds the user's
|
||||||
NixOS profile and system paths so agents can use them without manually
|
NixOS profile, home-manager profile (`~/.nix-profile/bin` and
|
||||||
setting PATH.
|
`~/.local/state/nix/profile/bin`), and system paths so agents can use
|
||||||
|
them without manually setting PATH.
|
||||||
|
|
||||||
Enabled by default when `user` is set to a non-default value.
|
Enabled by default when `user` is set to a non-default value.
|
||||||
'';
|
'';
|
||||||
@@ -221,17 +222,31 @@ in
|
|||||||
NODE_ENV = "production";
|
NODE_ENV = "production";
|
||||||
PASEO_HOME = cfg.dataDir;
|
PASEO_HOME = cfg.dataDir;
|
||||||
PASEO_LISTEN = "${cfg.listenAddress}:${toString cfg.port}";
|
PASEO_LISTEN = "${cfg.listenAddress}:${toString cfg.port}";
|
||||||
} // lib.optionalAttrs cfg.inheritUserEnvironment {
|
} // lib.optionalAttrs cfg.inheritUserEnvironment (
|
||||||
# mkForce overrides the default PATH from NixOS's systemd module (which
|
let
|
||||||
# only includes store paths for coreutils/grep/sed/systemd). Our PATH
|
# Match dataDir's convention. We can't read users.users.<name>.home
|
||||||
# includes /run/current-system/sw/bin which is a superset of those.
|
# because the user may be managed outside NixOS.
|
||||||
PATH = lib.mkForce (lib.concatStringsSep ":" [
|
userHome = "/home/${cfg.user}";
|
||||||
"/etc/profiles/per-user/${cfg.user}/bin"
|
in {
|
||||||
"/run/current-system/sw/bin"
|
# mkForce overrides the default PATH from NixOS's systemd module (which
|
||||||
"/run/wrappers/bin"
|
# only includes store paths for coreutils/grep/sed/systemd). When the
|
||||||
"/nix/var/nix/profiles/default/bin"
|
# daemon runs as a real user, also include home-manager profile paths
|
||||||
]);
|
# so user-installed CLIs (claude, opencode, codex, ...) are reachable
|
||||||
} // lib.optionalAttrs (cfg.hostnames == true) {
|
# by agent processes the daemon spawns.
|
||||||
|
PATH = lib.mkForce (lib.concatStringsSep ":" (
|
||||||
|
lib.optionals (cfg.user != "paseo") [
|
||||||
|
"${userHome}/.nix-profile/bin"
|
||||||
|
"${userHome}/.local/state/nix/profile/bin"
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
"/etc/profiles/per-user/${cfg.user}/bin"
|
||||||
|
"/run/current-system/sw/bin"
|
||||||
|
"/run/wrappers/bin"
|
||||||
|
"/nix/var/nix/profiles/default/bin"
|
||||||
|
]
|
||||||
|
));
|
||||||
|
}
|
||||||
|
) // lib.optionalAttrs (cfg.hostnames == true) {
|
||||||
PASEO_HOSTNAMES = "true";
|
PASEO_HOSTNAMES = "true";
|
||||||
} // lib.optionalAttrs (lib.isList cfg.hostnames && cfg.hostnames != [ ]) {
|
} // lib.optionalAttrs (lib.isList cfg.hostnames && cfg.hostnames != [ ]) {
|
||||||
PASEO_HOSTNAMES = lib.concatStringsSep "," cfg.hostnames;
|
PASEO_HOSTNAMES = lib.concatStringsSep "," cfg.hostnames;
|
||||||
|
|||||||
Reference in New Issue
Block a user