From 4c0cdc14d9a209d1144630d6e6bd8e9e4d5ad0ad Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sun, 27 Sep 2026 13:00:55 -0400 Subject: [PATCH] =?UTF-8?q?feat(hermes):=20partager=20l'=C3=A9tat=20avec?= =?UTF-8?q?=20les=20sessions=20hermes=20lanc=C3=A9es=20par=20marc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les sessions hermes ouvertes dans un pane herdr tournent sous marc, pas sous le compte de service : HERMES_HOME=/var/lib/hermes/.hermes (users/marc/home.nix) pour qu'elles lisent et écrivent le même état (sessions, mémoire, lazy-python) que le service hermes-agent. Accès : groupe secondaire hermes pour marc (users.nix) et ACL tmpfiles sur /var/lib/hermes (traversée) puis .hermes et .hermes/plugins (rwx + défauts ACL), pour que les fichiers créés par marc restent lisibles côté service. C'est ce qui rend le plugin herdr-agent-state utilisable : il parle au socket herdr de marc. --- profiles/tower/configuration.nix | 27 +++++++++++++-------------- users.nix | 4 ++++ users/marc/home.nix | 10 +++++++++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/profiles/tower/configuration.nix b/profiles/tower/configuration.nix index 9f65b47..45fab43 100644 --- a/profiles/tower/configuration.nix +++ b/profiles/tower/configuration.nix @@ -26,7 +26,18 @@ # users/marc/home.nix) : elles ecrivent dans /var/lib/hermes/.hermes. Le # groupe hermes (users.nix) plus les chmod g+rw du module hermes couvrent # l'existant ; ces ACL garantissent la traversee de /var/lib/hermes (2770) et - # que les fichiers crees par marc restent lisiblc sort en "No output found" et + # que les fichiers crees par marc restent lisibles par le service. + # Pattern repris de services/firefox-mcp et amazon-mcp. + systemd.tmpfiles.rules = [ + "a /var/lib/hermes - - - - u:marc:--x,m::rwx" + "a /var/lib/hermes/.hermes - - - - u:marc:rwx,d:u:marc:rwx,m::rwx,d:m::rwx" + "a /var/lib/hermes/.hermes/plugins - - - - u:marc:rwx,d:u:marc:rwx,m::rwx,d:m::rwx" + ]; + + boot.kernelParams = ["panic=10"]; # reboot 10 s après un kernel panic, le dump reste dans pstore + systemd.settings.Manager.RuntimeWatchdogSec = "30s"; # reboot si la machine gèle (si `sudo wdctl` trouve un watchdog) + # vkms = écran virtuel. Sans écran branché (DP-1/DP-2/HDMI-A-1 en disconnected sur + # le Renoir), niri n'a AUCUNE sortie vidéo : wayvnc sort en "No output found" et # il n'y a rien à afficher en VNC. vkms crée une sortie virtuelle que niri adopte. boot.kernelModules = ["vkms"]; # boot.initrd.clevis.enable = true; @@ -50,17 +61,5 @@ # (user@host = hermes@tower, auth par clé, pas de mot de passe). # Déclaratif exprès : /var/lib/hermes est en 2770 (écriture groupe, requis par # le partage hermes/marc) et sshd (StrictModes, cf services/hermes) ignore - # alors %h/.ssh/authorized_keys. Cette option écrit /etc/ssh/authorized_keys.d/ - # hermes en root 444, qui passe le contrôle, et survit aux rebuilds. - users.users.hermes.openssh.authorizedKeys.keys = lib.mkAfter [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMdX5m7b8xWL/9ZUeFRxahB4YY0v2rAV5CCFv8xTOlUh marc@Air-de-Marc" - ]; - - networking.hostName = "tower"; - sops.defaultSopsFile = lib.mkForce ../../secrets/tower.yml; - - # Token Matrix du bot @hermes : seul tower est destinataire du fichier sops - # (secrets/hermes-matrix.yml). Les autres hôtes qui importent services/hermes - # (laptop, anywhere) ne doivent PAS le déclarer. Voir services/hermes. - services.hermes.enableMatrixToken = true; + # alors %h/.ssh/authorized_keys. Cette option écrit /etc/ssxToken = true; } diff --git a/users.nix b/users.nix index 30f84cf..aa15f33 100644 --- a/users.nix +++ b/users.nix @@ -26,6 +26,10 @@ "network" "manager" "ydotool" + # sessions hermes lancees par marc dans les panes herdr : elles + # partagent le state dir /var/lib/hermes/.hermes du service (cf + # HERMES_HOME dans users/marc/home.nix), donc acces groupe hermes. + "hermes" ]; # openssh.authorizedKeys.keys = shell = pkgs.zsh; diff --git a/users/marc/home.nix b/users/marc/home.nix index 7dce215..599b8fb 100644 --- a/users/marc/home.nix +++ b/users/marc/home.nix @@ -91,7 +91,15 @@ home.sessionVariables = { EDITOR = "nvim"; VISUAL = "nvim"; - GSETTINGS_SCHEMA_DIR = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"; + # Sessions hermes lancees par marc (panes herdr) : partager l'etat du + # service au lieu de /home/marc/.hermes. C'est ce qui rend l'integration + # herdr utilisable : hermes tourne alors sous marc, meme utilisateur que le + # serveur herdr, donc HERDR_ENV/HERDR_PANE_ID survivent et le socket + # ~/.config/herdr/herdr.sock est accessible. + # Acces au state dir : groupe hermes (users.nix) + ACL declarees dans + # profiles/tower/configuration.nix. + HERMES_HOME = "/var/lib/hermes/.hermes"; + GSETTINGS_SCHEMA_DIR = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"; DEFAULT_BROWSER = "${inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/zen"; BROWSER = "${inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/zen"; ELECTRON_OZONE_PLATFORM_HINT = "wayland";