Commit Graph
1074 Commits
Author SHA1 Message Date
Hermes Agent 4b98a6e013 fix(nix-on-droid): fiabilise l'auto-réparation (wake-lock borné, retries sshd, watchdog 2 min, precmd auto-réparation, alias up, phone-update) 2026-11-03 01:21:45 -05:00
Hermes Agent b8b657a366 feat(nix-on-droid): watchdog (rejoue phone-up toutes les 5 min) + allow-external-apps (automatisation boot future) 2026-11-03 01:02:01 -05:00
Hermes Agent 8870cafdf9 feat(android-capture): capture reseau isolee par instance Android ; pcaps qui tournent et digest par cible
Une cible = une instance Android, donc une interface et ses propres fichiers : c'est la
seule isolation franche du trafic par appli, et elle ne demande aucun root.

- waydroid : capture sur le bridge waydroid0.
- avd : alimentee par le -tcpdump de l'emulateur, qui sort par la pile reseau de l'hote.
- rotation de 10 min, 72 fichiers conserves (12 h), digest d'hotes par cible.

Pas de root : CAP_NET_RAW et CAP_NET_ADMIN en capacites ambiantes, donc NoNewPrivileges
reste a false (systemd refuse la combinaison). Utilisateur statique et non DynamicUser,
plusieurs unites partageant le meme arbre d'etat. marc et hermes sont ajoutes au groupe
pour lire les captures sans root.

Verifie sur tower : tcpdump a l'ecoute sur waydroid0, deux jeux de pcaps distincts, digests
ecrits par les timers (avd : connectivitycheck.gstatic.com ; waydroid : play.googleapis.com).
2026-11-03 00:58:45 -05:00
Hermes Agent bdd332897c feat(nix-on-droid): module hermes-access (sshd + tunnel inverse vers rack) ; accès SSH hermes au tel sans port ouvert 2026-11-03 00:54:50 -05:00
Hermes Agent b2878b05dd feat(macos): Firefox quotidien pilotable par Hermes (launchd + MCP connectExisting) 2026-11-02 21:38:13 -05:00
Hermes Agent 7128ce5dec feat(hermes): paquet anthropic dans le venv (provider natif claude)
Les lignes du sélecteur de modèle SANS suffixe [1m] (claude-opus-5-5, claude-opus-5, claude-sonnet-5) passent par le provider natif anthropic, pas par claude-subscription-directsdk. Sans le paquet python anthropic dans le venv scellé, une session ouverte sur une de ces lignes meurt en agent_init_failed : "The 'anthropic' package is required for the Anthropic provider" (lazy installs désactivés par le packaging nix).

Auth du provider natif : aucune clé API à poser, agent/anthropic_credentials.py prend l'OAuth de l'abonnement dans ~/.claude/.credentials.json (refresh et réécriture gérés par Hermes), ou un grant Hermes via hermes auth add anthropic --type oauth.

Les lignes AVEC [1m] (provider claude-subscription-directsdk, CLI claude) ne changent pas. Supprime aussi la ligne commentée devenue doublon : extraDependencyGroups n'est défini qu'une fois.
2026-11-01 13:00:43 -05:00
Hermes Agent 2cab48297f chore(gitea-mcp): PAT réel dans sops (remplace le placeholder)
Token créé dans Gitea (compte mazex, son compte SSO Zitadel). Débloque le serveur MCP gitea (GITEA_ACCESS_TOKEN_FILE) et les opérations git/API sur git.marcpartensky.com, dont le miroir des repos GitHub.
2026-10-24 15:58:14 -04:00
Hermes Agent 59b41c48f0 feat(mcp): serveur MCP "mac" pour piloter le Mac (builds Winnie)
MCP stdio lancé par hermes-agent sur tower ; parle au Mac en ssh (alias
maclan puis mac, clé hermes). Tools : status (winnie-doctor + révisions),
sync, doctor_fix, xcode_fix (3 opérations root via la règle sudo
NOPASSWD xcode-select/xcodebuild/xcrun), runtime_install et les builds
(arrière-plan, suivi par log_tail) : ios_init, ios_build_sim,
macos_build.

Vérifié : pycodestyle/pyflakes, build de la dérivation, sonde stdio
(tools/list + appels réels sur le Mac), éval du toplevel avant commit.
2026-10-24 15:54:34 -04:00
Hermes Agent eb71f8ae64 fix(gitea): OIDC Zitadel réellement fonctionnel (source OAuth2, app Web)
L'ancien câblage ne pouvait pas marcher : client_id littéral "gitea"
(impossible, Zitadel génère les client_id) et oneshot qui échouait à chaque
boot sur --enabled (flag inexistant en Gitea 1.27.x), avalé par `|| true`.

- App Zitadel "Gitea" (projet marcpartensky) : appId 396570385799184684,
  clientId 396570385799250220, type Web, redirect
  https://git.marcpartensky.com/user/oauth2/zitadel/callback
- oneshot gitea-oidc-init : add-or-update (id de login_source via psql),
  secret lu depuis sops à chaque exécution, idempotent même en dérive
- [openid] d'app.ini : OpenID 2.0 legacy, désactivé (sans rapport avec OIDC,
  échouait en "rel=openid2.provider not found" avec une URL Zitadel)
- [oauth2_client] : ENABLE_AUTO_REGISTRATION, USERNAME=email,
  ACCOUNT_LINKING=login (page de liaison unique pour le compte local marc)
- ressource Pangolin : auth.sso-enabled=false (auth Gitea seule, une seule
  couche, clients git/API à token non bloqués par un redirect SSO)
- secrets/gitea-oidc.yml : vrai oidc_client_secret (chiffré, clé tower)
2026-10-24 15:44:57 -04:00
Hermes Agent dd7ed87ac2 feat(macos): sudo NOPASSWD Xcode pour l'agent
hermes@tower, connecté en ssh sur marc@mac, doit lancer les rares
opérations root du toolchain Xcode sans mot de passe : bascule de
xcode-select, acceptation de la licence, runtime du simulateur.

Fragment sudoers.d dédié (security.sudo.extraConfig est déjà posé par le
bloc terminfo de nix-darwin), scopé aux trois shims
/usr/bin/{xcode-select,xcodebuild,xcrun} ; le reste du sudo de marc reste
inchangé. Vérifié : visudo parsed OK, éval du fragment et du toplevel.
2026-10-24 15:24:06 -04:00
Hermes Agent 037c49265e fix(winnie): reinit. unique du layout Garage et ingest en Type=exec
Le premier bootstrap avait laisse un layout Garage a zero noeud (quorum de 0, inapplicable) : purge unique de meta/data avant le demarrage du service, winnie-bucket reprovisionne bucket, cle et s3.env. L'ingest passe de Type=oneshot a Type=exec pour que RuntimeMaxSec s'applique, et S3_ENV_FILE force le redemarrage du backend quand Garage est provisionne apres son premier demarrage.
2026-10-24 15:08:22 -04:00
Hermes Agent ffee0792c1 fix(vaultwarden): initialiser le mot de passe apres postgresql
postgresql.service est Type=notify : sans after et requires, le oneshot qui pose le mot de passe de la base partait en parallele et mourait sur « connection to server on socket /run/postgresql/.s.PGSQL.5432 failed » (boots du 22/10 20:29 et du 23/10 09:37).
2026-10-24 15:08:22 -04:00
Hermes Agent 68a5c3fb55 fix(hermes): refus explicite de la telemetrie shared_metrics
enabled=false, send=false et offer_version=2 ecrits dans config.yaml : la question de partage des stats ne revient plus a chaque session (le defaut ne compte pas comme reponse) et rien n'est collecte.
2026-10-24 15:08:22 -04:00
Hermes Agent bcb7eb43d5 feat(hermes-guests): agents anna et yves pour l'appli mobile
Deux agents separes au niveau OS (utilisateurs anna et yves, HERMES_HOME dedie, tmpfiles + ExecStartPre qui recree le squelette du home en mode managed), outils dangereux desactives et /api/pty comme /api/files bloques par nginx. Exposes en hermes-anna et hermes-yves.marcpartensky.com ; identifiants hors store nix sous /var/lib/hermes/guests.
2026-10-24 15:08:22 -04:00
Hermes Agent f875aaf9de feat(hermes-mobile): backend de l'appli mobile sur le profil default
services/hermes-pocket devient services/hermes-mobile : le backend de l'appli F-Droid sert le profil default (meme historique, memoire, skills et modele que le gateway Matrix et le dashboard) au lieu du profil isole pocket, en gardant la porte d'auth native (mobile-serve.env). Le nom de ressource Pangolin reste hermes-pocket : le renommer recreerait une ressource sur un domaine deja pris.
2026-10-24 15:08:11 -04:00
Hermes Agent 6ee385ce93 feat(mac): tunnel SSH inverse autoreparant et cle du Mac acceptee
ExitOnForwardFailure=yes sur l'autossh du Mac : un forward rate (port deja pris, sshd pas encore pret au boot) ne laisse plus une session inutile, launchd reessaie. La cle du Mac (marc@Air-de-Marc) est autorisee sur tower et sur le deck : ssh tower et ssh deck passent par rack en ProxyJump.
2026-10-24 15:08:11 -04:00
Hermes Agent b9b165b2c3 fix(deck): lancement de MK8DX robuste (base / update / DLC)
mk8dx selectionne le dump de base (Title ID 0100152000022000, sinon un fichier hors update/DLC, sinon le premier .nsp/.xci) au lieu du MK8DX.xci code en dur : Eden applique seul l'update pose a cote du jeu, mais lancer le NSP d'update comme s'il etait le jeu echoue. La tuile Gaming Mode passe par ce script.
2026-10-24 15:08:11 -04:00
Hermes Agent 030332d4a3 feat(tower): route le LAN dans wg1 (routeur + NAT)
tower fait routeur pour son LAN : ip_forward et NAT wg1 -> wlan0 (sortie avec l'IP LAN 192.168.1.44), et le pair tower cote VPS declare desormais 192.168.1.0/24 dans ses allowedIPs. Le Steam Deck et le reste du LAN deviennent joignables depuis rack sans dependre d'un forward de la box.
2026-10-24 15:08:11 -04:00
Hermes Agent 69dd5cae6c feat(pangolin): garde runtime de wg0 (adresse + exception pare-feu)
Timer de 5 minutes qui remet 100.89.128.1/24 et la route du 100.89.128.0/24 sur wg0, et reinsere l'exception iptables INPUT pour 100.89.128.0/24 : tailscaled jette cette source recue sur une interface autre que tailscale0, ce qui avait coupe le tunnel Pangolin 6h40 le 23/10. Complement de gerbil-wg0-ensure.nix, qui ne couvre que le demarrage de gerbil.
2026-10-24 15:08:03 -04:00
Hermes Agent 932e3bc83d feat(mesh): headscale durci (DERP embarque) et noeuds tailscale
Le controleur headscale du VPS passe en mode durci : flotte DERP de Tailscale retiree (derp.urls vide), DERP embarque sur le VPS (region 900, verify_clients) et STUN en UDP 3478 ; route Traefik headscale.marcpartensky.com -> 127.0.0.1:8090. Cote clients, services/tailscale remplace l'ancien secret tailscale/auth_key (absent) par headscale/preauth_key, coupe l'envoi de logs vers Tailscale Inc (disableUpstreamLogging) et est importe sur tower, le deck et anywhere.
2026-10-24 15:08:03 -04:00
Hermes Agent 10058770c4 feat(secrets): cles Switch (deck) et cle de pre-auth du mesh headscale
secrets/switch-keys.yml (prod.keys d'Eden sur le deck, posees dans le home de marc) et secrets/headscale.yml (preauth_key reutilisable, consommee par services/tailscale sur tower, le deck et le VPS). Regles de creation sops associees dans .sops.yaml.
2026-10-24 15:07:55 -04:00
Hermes Agent a9cd5f6045 chore(deps): bump hermes-agent et uv2nix
hermes-agent 04ea129b -> cb757fac ; uv2nix 5a836d39 -> 7aba73a3 (backend uv du build Python).
2026-10-24 15:07:55 -04:00
Hermes Agent feab54082e feat(ssh): alias mac et maclan pour joindre le Mac depuis tower
Le Mac expose deja son sshd (services.openssh dans profiles/macos) et son
tunnel inverse autossh (rack:2223), il manquait les alias cote marc.

- maclan = marc@192.168.1.48 (LAN, IP DHCP)
- mac = marc@localhost:2223 via rack (tunnel inverse, hors LAN)

Verifie en construisant le fichier genere (hm_.sshconfig) : les deux entrees
sortent avec le bon HostName/Port/ProxyJump.
2026-10-24 15:00:10 -04:00
Hermes Agent 7498ea4971 feat(macos): setup nix-darwin pour builder l'app Winnie
L'app se build sur le Mac en trois commandes, le toolchain restant dans le
devShell du flake winnie (jamais installé sur le Mac) :
  cd ~/git/nixos && just mac   # déploie ce setup
  winnie-sync                  # attrape ~/git/winnie depuis tower (rsync ssh)
  winnie-ios                   # simulateur ; npm ci + tauri ios init au besoin

- modules/home-mac/winnie : winnie-doctor [--fix], winnie-sync [--delete],
  winnie-shell, winnie-front, winnie-macos, winnie-build-macos, winnie-ios,
  winnie-build-ios, winnie-verify. Scripts en writeShellApplication (shellcheck
  au build) ; scripts.nix est séparé du module pour être constructible depuis
  tower avec les pkgs linux et testable sans Mac.
- profiles/macos : flakes + trusted-users dans nix.conf, et
  system.activationScripts.winnie-xcode (xcode-select -s, licence Xcode,
  -runFirstLaunch) pour que seule l'installation App Store reste manuelle.
- Embarque aussi le setup SSH entrant du Mac (sshd, clé hermes@tower, tunnel
  inverse autossh) qui était déjà dans l'arbre de travail.

Vérifié depuis tower : nix eval du darwinConfigurations.macos (toplevel et
home-manager-generation) + build des scripts en x86_64-linux (shellcheck) et
rsync de bout en bout depuis le dépôt de tower.
2026-10-24 14:33:35 -04:00
Hermes Agent 1435174674 feat(ygg-mesh): client macOS (nix-darwin)
Paquets yggdrasil + tor et deux launchd.daemons (tor SOCKS 127.0.0.1:9050,
yggdrasil sur /etc/yggdrasil.conf) pour faire entrer le Mac dans le mesh.
/etc/yggdrasil.conf (mot de passe partagé) reste hors du store, à créer
une fois à la main ; le torrc ne contient aucun secret.
2026-10-23 10:31:36 -04:00
Hermes Agent ab03b394a0 feat(ygg-mesh): réseau privé Yggdrasil entre tower, deck et anywhere
Module services/ygg-mesh : Yggdrasil en réseau privé (mot de passe partagé,
clés publiques épinglées), liens Tor via une instance tor dédiée (onion
service par machine) et lien direct multicast prioritaire sur le LAN.
Chaque machine garde une adresse IPv6 stable et un nom <host>.ygg.

Secret dans secrets/ygg-mesh.yml (règle .sops.yaml dédiée) ; config rendue
à chaud au démarrage (ExecStartPre + credential systemd), le mot de passe
ne touche jamais le store. Identités et clés dans la table `nodes`.
2026-10-23 10:31:36 -04:00
Hermes Agent 2f51bb8d49 chore(newt): 1.17.0 (unstable) pour le P2P 2026-10-23 10:24:12 -04:00
Hermes Agent dcc8ce342c feat(macos): client Pangolin (derivation dmg + activation) 2026-10-23 10:24:12 -04:00
Hermes Agent 1ca4f0b070 feat(nextcloud): domaine trusted cloud.p2p.marcpartensky.com 2026-10-23 10:24:12 -04:00
Hermes Agent c0002126b6 chore(sops): rotation du mdp postgres et cle API pangolin 2026-10-23 10:24:12 -04:00
Hermes Agent d73b7c5d7d feat(pangolin): API d'integration pilotable par MCP
enable_integration_api + route traefik int-api (127.0.0.1:3003).
MCP hermes: cle sops pangolin_api_key, binaire nix, outils
private-resource completes (domainId/subdomain/scheme).
Stub de licence patche localement (AdvancedPrivateResources).
2026-10-23 10:24:12 -04:00
Hermes Agent ce068684ef feat(deck): calendrier sg sur le mineur Monero 2026-10-19 02:40:58 -04:00
Hermes Agent c005dc21db chore(sops): cle age du deck dans les destinataires common 2026-10-19 02:40:07 -04:00
Hermes Agent 1bf853a56a fix(deck): secret monero dedie et planning sans CalDAV 2026-10-19 02:38:26 -04:00
Hermes Agent 58ace4257f feat(starship): affiche la branche et l'etat git dans le prompt
Le format n'incluait aucun module git et starship s'initialise apres
p10k : impossible de voir sur quelle branche on est.
2026-10-19 02:07:33 -04:00
Hermes Agent 08547e5cf8 fix(home): force .gtkrc-2.0 pour que l'activation passe
gtk.enable genere le fichier, mais l'ancien ~/.gtkrc-2.0 n'est pas un
lien vers le store : checkLinkTargets echouait sans force = true.
2026-10-19 02:07:33 -04:00
Hermes Agent 542969c86c fix(nvim): fond reellement transparent (onedark + lualine)
onedark.transparent couvre tous les groupes du theme, pas seulement
Normal ; les highlights Lualine sont nettoyes apres ColorScheme et
les ~ de fin de buffer deviennent des espaces.
2026-10-19 02:07:33 -04:00
Hermes Agent 7615d98b36 feat(stalwart-mcp): serveur MCP JMAP pour tower
stalwart-mcp (Rust) parle JMAP au Stalwart du VPS, patche pour l'URL
API et l'envoi depuis l'identite marc. Mot de passe dedie dans
secrets/stalwart-mcp.yml ; importe par tower seulement, pour eviter
le conflit de cle sops avec services/stalwart sur anywhere.
2026-10-19 02:07:33 -04:00
Hermes Agent 4f5acfaf61 feat(monero): minage planifie selon le calendrier Nextcloud
Le mineur ne tourne que 01:00-09:00, plus en semaine 09:00-18:00
quand un evenement du calendrier sg est actif. Le wallet vient de
secrets/monero.yml via LoadCredential (plus dans la ligne de
commande) ; meme planning sur le Deck.
2026-10-19 02:07:32 -04:00
Hermes Agent de94c3e4bf feat(wireguard): tower rejoint le wg1 du VPS en pair 10.100.0.3
Le forward de box 77.207.176.170:42070 est mort : tower devient pair
client du hub wg1 avec persistentKeepalive. L'alias ssh tower pointe
sur 10.100.0.3 et la cle root du VPS est autorisee sur tower. Cle
privee dans secrets/wireguard.yml (recipient tower).
2026-10-19 02:07:32 -04:00
Hermes Agent 8e604e3f8f fix(stalwart): cles de secrets explicites, allowed-ip, meetup
Renomme stalwart_mail_pw2/pw3, spam_pw, noreply_pw, admin_pw, bob_pw
et acme_secret en stalwart_*_password / stalwart_acme_secret, un
fichier sops par usage.
66.108.44.154 passe en allowed-ip : l'auto-ban persiste en base et
bloquait le domicile sur 25/465/993.
meetup@marcpartensky.com partage la boite de marc.

Les blobs common.yml et anywhere.yml sont re-chiffres dans le meme
commit (renommage des cles Stalwart, rotation, postgres_crt/key).
2026-10-19 02:07:32 -04:00
Hermes Agent 7655391102 feat(zitadel): secret SMTP + PAT admin lisible par hermes
secrets/zitadel-smtp.yml porte le mot de passe du compte d'envoi pour
le provisioning SMTP par API (v2 ignore la config runtime). Le PAT
admin est materialise en 0400 pour hermes et rotate.
2026-10-19 02:07:32 -04:00
Hermes Agent f859ddb8e5 fix(hermes-pocket): active la porte d'auth du serve headless
dashboard.public_url engage auth_required : la racine ne sert plus le
token de session en clair derriere Pangolin. Le flux client passe par
/auth/password-login puis un ws-ticket a usage unique. nginx annonce
https et la sonde devient /api/status.
2026-10-19 02:07:20 -04:00
Hermes Agent 25a4da39af fix(hermes-webui): OIDC Zitadel a la place du SSO Pangolin
App Zitadel publique en PKCE (client_id 395733475048620332), claim
preferred_username limite a marc@marcpartensky.com, redirect explicite
car nginx reecrit le Host. SSO Pangolin coupe pour eviter le double
login.
2026-10-19 02:07:20 -04:00
Hermes Agent 0d03aa3a83 feat(hermes): DeepSeek v4.1 Flash par defaut, MCP beeper declare
DeepSeek v4.1 Flash devient le modele par defaut ; chaine de secours
DeepSeek puis Nemotron 3 Ultra gratuit ; le salon de Zoe (Matrix) y
passe aussi.
Beeper est declare dans les mcpServers avec le token lu depuis
l'environnement (plus de token en dur dans config.yaml) et l'URL LAN
pour etre cliquable depuis Hermes Desktop. Le timeout du MCP gitea
est complete.
2026-10-19 02:07:19 -04:00
Hermes Agent dbf57bcb74 feat(mcp): Anki headless + acces LAN filtre aux MCP
anki-mcp : Anki sans bureau et addon AnkiMCP, HTTP MCP sur 3141,
connecte a la collection du serveur de sync.
mcp-lan-access republie sur l'adresse LAN de tower les endpoints
loopback (3141, 8710, 6060, 23373), firewall limite au Mac ; l'addon
Anki autorise ce Host (anti DNS-rebinding).
arr-mcp ne publie plus 6060 sur 0.0.0.0. Le module mcp-lan-access
est importe par services/default.nix avec anki-mcp, wise-mcp et
bank-mcp.
2026-10-19 02:07:19 -04:00
Hermes Agent c427110b4b feat(mcp): serveurs MCP Wise et Bank
wise-mcp passe par le CLI officiel, token dans secrets/wise.yml.
bank-mcp lit une config locale 0600 (pas de secret nix).
2026-10-19 02:07:19 -04:00
Hermes Agent 52ff370ea0 chore(sops): creation_rules des nouveaux secrets
Regles pour secrets/monero.yml (tower + deck), stalwart-mcp.yml,
wireguard.yml, zitadel-smtp.yml et wise.yml (recipient tower).
2026-10-19 02:07:19 -04:00
Hermes Agent 161cd8e4d9 feat(hermes-skins): pack Hermes Menagerie pour le Mac
Input brut hermes-menagerie (github:ZakiChair/hermes-catppuccin),
module home-mac/hermes-skins qui installe les palettes dans
~/.hermes/skins, active dans la home de marc@macos.
2026-10-19 02:07:18 -04:00
Hermes Agent 9abcab4e00 perf(deck): 6 threads XMRig et reprise thermique a 84 C 2026-10-19 01:40:11 -04:00