docs(mail-browser): phase 2 attachments+draft-reply deployes et testes (2026-07-23), skill hermes-tt cable sur API

This commit is contained in:
2026-07-23 06:50:35 +00:00
parent c7053bc5d6
commit 7254dcea63
+52 -60
View File
@@ -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: <objet>` 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.