diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..1f8deea --- /dev/null +++ b/TODO.md @@ -0,0 +1,109 @@ +# TODO — Évolutions agents autonomes + +## 1. Fichiers de configuration (dans `/opt/agent/config/`) + +### `reports_schedule.json` _(géré par agent1 avec confirmation utilisateur)_ +- [ ] Créer le fichier avec horaires de sollicitation des rapports par agent +- [ ] Agent1 : commande XMPP pour modifier ce fichier (confirmation avant écriture) +- [ ] Agent1 : planifier les demandes de rapport selon ce fichier (APScheduler) +- [ ] Chaque agent2_* : répondre à la demande de rapport avec ses stats locales + +### `tasks_schedule.json` _(géré par agent1 avec confirmation utilisateur)_ +- [ ] Créer le fichier avec les tâches planifiées par agent +- [ ] Agent1 : commande XMPP pour ajouter/modifier/supprimer une tâche (confirmation avant écriture) +- [ ] Agent1 : charger ce fichier au démarrage et planifier les tâches via APScheduler +- [ ] Remplacer / compléter l'actuel `SCHEDULE:` skill + +### `blackout_hours.json` _(édité directement par l'utilisateur)_ +- [ ] Créer le fichier avec plage(s) horaire(s) de blackout (aucun agent ne travaille) +- [ ] Format : `[{"start": "02:00", "end": "05:00", "label": "maintenance"}]` +- [ ] Agent1 : vérifier ce fichier avant chaque délégation de tâche +- [ ] Agent1 : vérifier ce fichier avant chaque tâche planifiée + +--- + +## 2. Plages horaires par agent (`work_hours` dans `agents_registry.json`) +- [ ] Ajouter `work_hours: {start, end, days}` pour chaque agent dans `agents_registry.json` +- [ ] Modifier `skills/delegate.py` : vérifier plage horaire avant d'envoyer la tâche +- [ ] Si hors plage → retourner message d'indisponibilité (pas d'exécution) +- [ ] Prendre en compte le blackout_hours.json également dans delegate.py + +--- + +## 3. File d'attente locale par agent (SQLite) + +### Pour chaque agent2_* (`/opt/agent2_*/queue.db`) +- [ ] Créer table `tasks_queue(id, received_at, started_at, completed_at, task, status, result, duration_s)` +- [ ] `on_mqtt_message()` : sauvegarder immédiatement le message en base (status: `pending`) +- [ ] Worker FIFO dans un thread séparé : traiter les tâches une par une +- [ ] Si paused : worker s'arrête, tâches s'accumulent en base +- [ ] Au resume : worker reprend depuis les tâches `pending` +- [ ] MQTT : passer à `clean_session=False` + `QoS=1` pour ne pas perdre les messages offline + +--- + +## 4. Mode pause / veille par agent + +### Nouveau topic MQTT : `agents//control` +- [ ] Chaque agent2_* : s'abonner à `agents//control` +- [ ] Payload `{"command": "pause"}` → flag `self.paused = True`, stopper le worker +- [ ] Payload `{"command": "resume"}` → flag `self.paused = False`, relancer le worker +- [ ] Agent1 en veille : rester connecté XMPP, n'accepter que `!agentsON` / `!agentON agent1` + +### Commandes XMPP (sylvain → agent1) +- [ ] `!agentOFF ` → envoyer pause à l'agent ciblé +- [ ] `!agentON ` → envoyer resume à l'agent ciblé +- [ ] `!agentsOFF` → agent1 en veille + pause à tous les agent2_* +- [ ] `!agentsON` → agent1 sort de veille + resume à tous les agent2_* +- [ ] `!agentOFF agent1` → agent1 en veille uniquement +- [ ] Mettre à jour `agents_online.json` à chaque changement d'état + +--- + +## 5. Rapports journaliers + +### Chaque agent2_* (stats locales) +- [ ] Tracker en mémoire : `tasks_total`, `tasks_success`, `tasks_error`, `avg_duration_s`, `uptime_s`, `last_error` +- [ ] Alimenter ces stats depuis la `queue.db` +- [ ] Répondre à la demande de rapport d'agent1 via MQTT (`agents//control` payload `{"command": "report"}`) +- [ ] Publier le rapport sur `agents/daily_report` avec toutes les stats + +### Agent1 (compilation) +- [ ] S'abonner à `agents/daily_report` +- [ ] Stocker les rapports reçus en mémoire + SQLite (`daily_reports` table dans `executions.db`) +- [ ] Nouveau skill `skills/daily_report.py` : trigger `DAILY_REPORT:` + - [ ] Compiler les rapports de tous les agents + - [ ] Formater un résumé lisible + - [ ] Envoyer à `sylvain@xmpp.ovh` via XMPP + - [ ] Stocker pour historique +- [ ] Planifier `DAILY_REPORT:` dans `tasks_schedule.json` (ex: 22:30) +- [ ] Disponible aussi à la demande : `DAILY_REPORT:` depuis CLI + +--- + +## 6. Ordre d'implémentation suggéré + +1. `blackout_hours.json` + `work_hours` dans registry (simple, peu de code) +2. File d'attente SQLite + mode pause dans chaque agent2_* +3. Commandes `!agentON/OFF` dans agent1 +4. `reports_schedule.json` + stats + rapport journalier +5. `tasks_schedule.json` + gestion par agent1 avec confirmation +6. Tests end-to-end + +--- + +## Fichiers impactés + +| Fichier | Action | +|---------|--------| +| `config/agents_registry.json` | Ajouter `work_hours` par agent | +| `config/reports_schedule.json` | **Créer** | +| `config/tasks_schedule.json` | **Créer** | +| `config/blackout_hours.json` | **Créer** | +| `agent1.py` | Commandes !agent*, veille, souscription daily_report, gestion configs | +| `skills/delegate.py` | Check work_hours + blackout avant délégation | +| `skills/daily_report.py` | **Créer** — compilation rapport journalier | +| `skills/schedule_tasks.py` | Intégrer tasks_schedule.json | +| `agent2_debian13/agent2_debian13.py` | Queue SQLite, pause/resume, stats, rapport | +| `agent2_ansible/agent2_ansible.py` | Queue SQLite, pause/resume, stats, rapport | +| `agent2_deploy/agent2_deploy.py` | Queue SQLite, pause/resume, stats, rapport |