feat(hermes): partager l'état avec les sessions hermes lancées par marc

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.
This commit is contained in:
Hermes Agent
2026-09-27 13:00:55 -04:00
parent 3c05597360
commit 4c0cdc14d9
3 changed files with 26 additions and 15 deletions
+13 -14
View File
@@ -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;
}
+4
View File
@@ -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;
+8
View File
@@ -91,6 +91,14 @@
home.sessionVariables = {
EDITOR = "nvim";
VISUAL = "nvim";
# 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";