diff --git a/common/MAIL-BROWSER-HERMES-TT.md b/common/MAIL-BROWSER-HERMES-TT.md index 46713c5..6277fef 100644 --- a/common/MAIL-BROWSER-HERMES-TT.md +++ b/common/MAIL-BROWSER-HERMES-TT.md @@ -1,73 +1,65 @@ -# Acces boite mail O365 pro (hermes-tt) — historique et decision +# MAIL-BROWSER-HERMES-TT -## Echec V0 : hermes-mail-proxy (Graph API device code flow) -Tentative : client public officiel Microsoft ("Microsoft Graph Command Line Tools", -client_id 14d82eec-204b-4c2f-b7e8-296a70dab67e) via MSAL device code flow, pour -contourner le besoin d'enregistrement d'appli Azure AD (bloque en self-service sur -le tenant TT). Code deploye port 3060 (hermes-mail-proxy), jamais authentifie : -consentement Mail.Read/Mail.ReadWrite/Mail.Send bloque par l'admin meme sur ce -client pre-consenti. Confirme le 22/07/2026 (curl /auth/status -> authenticated:false -apres plusieurs semaines up). Container arrete et supprime le 22/07/2026, port 3060 -libere. Ne pas retenter la voie Graph API sur ce tenant sans intervention admin TT. +Runbook du service de lecture/reponse mail O365 pour hermes-tt, via un +navigateur Edge deja authentifie tournant dans le conteneur +`hermes-mail-browser` (session MFA maintenue cote serveur). -## Decision V1 : hermes-mail-browser (session navigateur persistante) -Principe : authentification 100% humaine (Nabil, MFA inclus) via noVNC sur un -navigateur reel tournant sur le NAS (IP maison tunisienne). L'automatisation ne -fait QUE lire sur la session deja ouverte — jamais de re-authentification -automatisee, jamais de credentials stockes en clair. +## Architecture -Stack : -- Microsoft Edge reel (channel msedge, pas Chromium generique) — fingerprint - Sec-CH-UA coherent avec un poste Windows corporate, reduction des heuristiques - de detection cote Defender for Cloud Apps. -- Affichage virtuel Xvfb + x11vnc, expose uniquement en LAN via noVNC (port 8810, - bind 192.168.100.33, AUCUN vhost DSM, AUCUN reverse-proxy). -- Edge lance en persistant (--user-data-dir sur volume monte, profil survit aux - redemarrages) avec remote debugging port 9222 (localhost uniquement). -- API FastAPI (port 3110) se connecte au MEME navigateur via CDP - (connect_over_cdp) — pas d'instance separee — pour lire la boite de reception. - hermes-tt consomme cette API en lecture seule. +- Conteneur : `hermes-mail-browser` (reseau Docker `n8n`) +- API interne : `http://hermes-mail-browser:8000` (joignable par + `hermes-agent-tt` sur le meme reseau, pas besoin du port 3110 expose) +- noVNC : port 8810 (LAN uniquement) — pour reconnexion manuelle O365/MFA +- Envoi des projets de reponse : SMTP ik.me vers la boite pro de Nabil + (nabil.derouiche@tunisietelecom.tn) -Scope Phase 1 (lecture seule) : liste boite de reception (expediteur, objet, date, -lu/non lu, apercu), lecture corps complet d'un mail. Aucune action d'ecriture -(envoi, suppression, deplacement) en V1. +## Statut — Phase 2 : COMPLETE (deployee et testee avec succes) -Gestion expiration session : l'API detecte l'atterrissage sur -login.microsoftonline.com et renvoie 409 "reauthentification manuelle requise" -plutot que de tenter quoi que ce soit — Nabil rouvre noVNC, se reauthentifie, -la session persiste a nouveau. +Endpoints construits, deployes et testes le 2026-07-23 : -Ports : 3110 (API interne), 8810 (noVNC, LAN uniquement). Conteneur : -hermes-mail-browser, reseau n8n, UID/GID 1026:100, volume data/ pour le profil -navigateur. +- `GET /health` — conteneur sain, `authenticated: true` +- `GET /inbox?limit=N` — liste (expediteur / objet / heure / apercu) ; + `aria_label` contient "pieces jointes" si le mail en a +- `GET /message/{index}` — corps texte complet du mail +- `GET /message/{index}/attachments` — teste : liste des PJ, OK +- `GET /message/{index}/attachments/{filename}/text` — teste sur .docx ET + .pdf, extraction correcte confirmee (extraction auto PDF/DOCX/XLSX) +- `POST /draft-reply` `{"subject":"...","body_text":"..."}` — teste : mail + reellement recu dans la boite O365 pro. Envoie un PROJET vers la boite de + Nabil (jamais vers le correspondant). Prefixe de sujet + `[REPONSE PROPOSEE] Re: ` ajoute automatiquement par l'API. +- Reseau : `hermes-agent-tt` joint `http://hermes-mail-browser:8000/health` + sans probleme (meme reseau Docker `n8n`) — teste, OK. -Statut : conteneur deploye et sain, en attente authentification manuelle (22/07/2026). +## Skill hermes-tt -## Mise a jour 22/07/2026 soir — validation phase 1 complete +`/opt/data/skills/mail-o365-tt.md` (dans `hermes-agent-tt`) reecrit le +2026-07-23 : les anciennes sections "ENVOI MAIL — SMTP Infomaniak" et +"LECTURE MAIL — OWA Navigateur" (methode `browser_snapshot`, obsolete car +bloquee par le MFA) ont ete entierement remplacees par des instructions +pointant vers l'API ci-dessus. Regle centrale conservee : hermes-tt ne +repond JAMAIS directement a un correspondant, il envoie toujours un projet a +Nabil qui decide et envoie lui-meme depuis OWA. Les Cas d'usage 1 +(Trouver+envoyer), 3 (Ingestion AO), 4 (Veille reglementaire) et le bloc +REGLES COMPORTEMENTALES ont ete conserves, adaptes a la nouvelle API. -Bug corrige pendant la validation : premiere version de main.py ouvrait une -nouvelle connexion Playwright a CHAQUE requete. Deux requetes de test annulees -cote client (timeout curl) ont laisse des coroutines bloquees cote serveur, -qui ont ensuite bloque toute nouvelle tentative (verrou de spawn du driver -Playwright). Corrige : connexion unique partagee, ouverte au demarrage de -app (FastAPI lifespan), reutilisee pour toutes les requetes, timeout de -securite 15s sur la connexion CDP. +## Session expiree (code 409) -Piege reseau rencontre en testant : ports 3110/8810 bindes UNIQUEMENT sur -192.168.100.33 (delibere, pas de bind 0.0.0.0). Injoignable depuis un -conteneur Docker (mcp-nas) via 172.17.0.1 ou directement via 192.168.100.33 -depuis un container — passer par ssh nas-host pour tout test/usage agent. +Si l'API renvoie **409**, la session du navigateur a expire. NE JAMAIS +tenter de re-authentifier depuis l'agent : signaler a Nabil qu'une +reconnexion manuelle via noVNC (port 8810, LAN) est necessaire. -Tests reussis en conditions reelles (session Nabil authentifiee) : -- GET /auth/status -> authenticated:true -- GET /inbox?limit=5 -> expediteur/objet/heure/apercu corrects (5/5), y compris - un mail metier Zone Sud reel -- GET /message/0 -> corps complet correctement extrait +## PIEGE — recreate / docker compose up -d du conteneur -Phase 1 (lecture seule boite de reception) fonctionnelle, prete pour usage -par hermes-tt. +Edge tue brutalement laisse des verrous perimes dans le volume persistant. +AVANT tout `docker compose up -d` / recreate de `hermes-mail-browser`, +TOUJOURS supprimer d'abord : -Reste a faire : calibrer le 409 sur expiration reelle de session (pas encore -observe) ; evaluer robustesse des selecteurs OWA dans la duree ; envisager -V1.5 (appel API interne OWA via page.evaluate+fetch) si le DOM scraping -devient trop lent. +``` +rm -f /volume1/docker/hermes-mail-browser/data/profile/SingletonLock \ + /volume1/docker/hermes-mail-browser/data/profile/SingletonCookie \ + /volume1/docker/hermes-mail-browser/data/profile/SingletonSocket +``` + +Incident deja rencontre et resolu deux fois — cause = verrous Singleton +perimes empechant Edge de redemarrer dans le profil persistant.