workspace: rapport solaire, prevision de nuit, concierge, courrier, fiche allegee

- Fiche agent maison (AGENTS.md) : prevision de nuit relayee par script, import
  EDF, regle JEEP midi, saisie vehicule/niveau/depart, concierge qui relaie
  « ✅ Noté » ou « Rien n'est noté », groupe A deplace (28 649 -> 25 831 car.).
- Nouvelles references : reference-concierge.md, reference-workspace.md.
- Scripts : rapport-solaire.js, prevision-nuit.js, airtria-ha-vehicule.js,
  concierge-live.js (answer ne sort plus jamais vide, mode CONCIERGE_SIMULATION).
- Courrier Orange / AIRTRIA / Gmail : audits, regles, menage, recents.
- Bancs EVCS tests-pv (G5 accepte « anomal »).
- .gitignore : liste blanche etendue aux nouveaux scripts et bancs.
This commit is contained in:
2026-09-30 11:32:44 +02:00
parent 973a736bc2
commit f121f0a196
37 changed files with 4030 additions and 328 deletions

View File

@@ -0,0 +1,118 @@
# Référence — Gmail (`gog` CLI)
(Déplacé d’AGENTS.md le 26/09/2026 pour la marge de la fiche. Contenu identique, lu à la demande. Les garde-fous de sécurité 4.6/4.7 sont AUSSI répétés dans la fiche.)
## 4. Gmail — `gog` CLI v0.21.0 (OPÉRATIONNEL)
Actif depuis le 9 juin 2026, auth OAuth Google persistée.
Compte : `tallagrand.thierry@gmail.com`. Keyring : `/home/node/.openclaw/gogcli/data/keyring/`.
Règles métier détaillées : `workspace/gmail-rules.md`.
Toutes les commandes ci-dessous s'invoquent via `exec` (voir §1.2).
### 4.1 Lecture
**Préférer `mail-texte` pour lire :** `python3 workspace/mail-texte.py lire <threadId>` /
`… chercher "<requête>"` (texte propre + sécurité imposée). Les commandes gog ci-dessous
sont la référence bas-niveau.
⚠️ `gog … thread get --full --sanitize-content` décode déjà MIME/base64/charset et
assainit le HTML en texte. NE décode JAMAIS le base64 à la main via exec. (`gog gmail
messages get` N'EXISTE PAS en v0.21.0 : c'est `thread get`.)
| Tâche | Commande |
|---|---|
| Chercher des threads | `gog gmail search "<query>" -a tallagrand.thierry@gmail.com -j --max N` |
| Lister les labels | `gog gmail labels list -a tallagrand.thierry@gmail.com` |
| Détail d'un thread (texte propre) | `gog gmail thread get <id> -a tallagrand.thierry@gmail.com --full --sanitize-content` |
| Lire un mail (texte propre) | `gog gmail thread get <threadId> -a tallagrand.thierry@gmail.com --full --sanitize-content` |
### 4.2 Envoi
gog gmail send -a tallagrand.thierry@gmail.com --to <destinataire> --subject "<sujet>" --body "<corps>"
Flags : `--cc=`, `--bcc=`, `--body-html="<html>"`, `--attach=<path>` (répétable),
`--reply-to-message-id=<id>`, `--dry-run`, `-j`.
Exemple avec pièce jointe :
gog gmail send -a tallagrand.thierry@gmail.com --to tallagrand.thierry@gmail.com --subject "Cours ORA" --body "ORA.PA : 17,86€ (+1,16%)" --attach /home/node/.openclaw/workspace/charts/prix_ora.png
### 4.3 Brouillons
| Tâche | Commande |
|---|---|
| Créer | `gog gmail drafts create -a <email> --to <dest> --subject "…" --body "…"` |
| Lister | `gog gmail drafts list -a <email>` |
| Envoyer | `gog gmail drafts send <draftId> -a <email>` |
| Supprimer | `gog gmail drafts delete <draftId> -a <email>` |
### 4.4 Mutations — `--dry-run` obligatoire avant action de masse
| Tâche | Commande |
|---|---|
| Corbeille | `gog gmail trash <messageId…> -a <email> --dry-run` puis `--force` (IDs obtenus par `search … -j`, PAS une requête) |
| Archiver | `gog gmail archive <messageId…> -a <email> --dry-run` puis `--force` (idem : IDs, pas de requête) |
| Labels | `gog gmail messages modify <id> -a <email> --add-label X --remove-label Y` |
### 4.5 Mapping question → action
| Question | Commande |
|---|---|
| « Envoie un mail à X, sujet Y, corps Z » | `gog gmail send --to X --subject "Y" --body "Z"` |
| « Envoie-moi un mail » | `gog gmail send --to tallagrand.thierry@gmail.com …` |
| « Combien de mails aujourd'hui » | `gog gmail search "in:inbox newer_than:1d" -j --max 100` |
| « Trie mes vieilles promos » | `search "category:promotions older_than:30d" -j` pour les IDs, puis `trash <ids> --dry-run` |
| « Liste les mails de X » | `gog gmail search "from:X" -j --max N` |
### 4.6 JAMAIS
1. **Suppression définitive** (`messages.delete`) : interdiction absolue. Toujours `trash` (récupérable 30 jours).
2. **Toucher la whitelist** : voir `gmail-rules.md`. Un mail qui matche un domaine whitelisté → ABORT silencieux.
3. Plus de **200 actions par batch**.
4. Plus de **2000 actions par jour** sans confirmation humaine explicite.
5. **Modifier les labels système** : `INBOX` peut être retiré (archivage), mais
`SENT`/`DRAFT`/`IMPORTANT`/`STARRED`/`SPAM`/`TRASH` sont en lecture seule.
6. Lancer une vague sans dry-run validé.
### 4.7 TOUJOURS
1. **Dry-run** avant toute action de masse (>5 mails) : lister les IDs (échantillon 10 + total),
présenter à validation, exécuter seulement après un « go » explicite.
2. **Logger chaque batch** dans `gmail-housekeeping.md` (append-only) : timestamp, règle,
IDs touchés, action, résultat.
3. **`gmail-rules.md` est la source de vérité unique** des règles de tri.
4. **Relire la whitelist au runtime** à chaque vague, pas seulement au design.
5. **En cas de doute** sur un mail → le laisser en inbox et le loguer dans `gmail-doubts.md`.
6. **Pause de 5 s** entre deux batchs `trash` ou `archive`.
7. En cas d'échec : rapporter l'erreur réelle (stderr). 2 erreurs syntaxe/auth maximum, puis STOP.
### 4.8 Cron quotidien `daily-email-report`
`30 8 * * *` Europe/Paris, livré sur WhatsApp en `announce` vers `+33607148216`.
Format attendu :
- Ligne 1 : résumé global court (ex. « Gmail : 3 nouveaux, 1 important »).
- Ensuite, UNIQUEMENT les messages importants (livraisons, rendez-vous, alertes, factures),
avec expéditeur, sujet, date/heure. **5 messages détaillés maximum.**
- En français. Ignorer promotions et newsletters dans le détail.
### 4.9 Boîtes Orange (`thierry.tallagrand@wanadoo.fr`) et AIRTRIA (`@airtria.fr`, MailPlus sur ARCHIVE2) — IMAP, pas gog
`gog` ne parle qu'à Gmail. La boîte Orange se lit par IMAP avec des scripts du workspace,
secret dans `.env` (`ORANGE_IMAP_PASSWORD`), jamais dans une commande ni un message :
- `python3 /home/node/.openclaw/workspace/mail-recent.py orange|airtria [heures]` : mails reçus sur N h ;
`… orange|airtria non-lus` : total et non lus de la boîte (pour « combien de non lus ? »)
(défaut 24), LECTURE SEULE, une ligne par mail avec `[non lu]` / `[newsletter]`. C'est
l'outil du cron `orange-email-report` (20 h, WhatsApp, même format que §4.8).
- `orange-menage.py` : vagues de ménage selon `orange-rules.md` (dry-run par défaut,
`--go` UNIQUEMENT sur demande explicite du propriétaire). Corbeille = `INBOX/TRASH`
(récupérable), archives = `INBOX/Archives/<année>`. Jamais de suppression définitive.
- Journal : `orange-housekeeping.md`. Audit : `orange-audit.md`.
- **AIRTRIA (boîte pro)** : `python3 /home/node/.openclaw/workspace/mail-recent.py airtria [heures]`
(lecture seule, même format) ; ménage `airtria-menage.py` selon `airtria-rules.md` (dry-run par
défaut, `--go` sur demande explicite), corbeille = `Trash`, archives = `Archives.<année>`,
veille = `Veille`. Crons : `airtria-tri-quotidien` 19h50, `airtria-email-report` 20h30.
Journal `airtria-housekeeping.md`. `mail-recent.py orange` fonctionne aussi (= orange-recent.py).
---