# TODO — Évolutions agents autonomes ## 1. Fichiers de configuration (dans `/opt/agent/config/`) ### `reports_schedule.json` _(géré par agent1 avec confirmation utilisateur)_ - [x] Créer le fichier avec horaires de sollicitation des rapports par agent - [x] Agent1 : commande !reports pour afficher, PENDING_CONFIG pour confirmation modification - [x] Agent1 : planifier les demandes de rapport selon ce fichier (APScheduler) - [x] Chaque agent2_* : répondre à la demande de rapport avec ses stats locales ### `tasks_schedule.json` _(géré par agent1 avec confirmation utilisateur)_ - [x] Créer le fichier avec les tâches planifiées par agent - [x] Agent1 : !tasks pour afficher, PENDING_CONFIG pour modification avec confirmation - [x] Agent1 : charger ce fichier au démarrage et planifier les tâches via APScheduler ### `blackout_hours.json` _(édité directement par l'utilisateur)_ - [x] Créer le fichier avec plage(s) horaire(s) de blackout (aucun agent ne travaille) - [x] Agent1 : vérifier ce fichier avant chaque délégation de tâche (delegate.py) --- ## 2. Plages horaires par agent (`work_hours` dans `agents_registry.json`) - [x] Ajouter `work_hours: {start, end, days}` pour chaque agent dans `agents_registry.json` - [x] Modifier `skills/delegate.py` : vérifier plage horaire avant d'envoyer la tâche - [x] Si hors plage → retourner message d'indisponibilité (pas d'exécution) - [x] 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`) - [x] Créer table `tasks_queue(id, received_at, started_at, completed_at, task, status, result, duration_s)` - [x] `on_mqtt_message()` : sauvegarder immédiatement le message en base (status: `pending`) - [x] Worker FIFO dans un thread séparé : traiter les tâches une par une - [x] Si paused : worker s'arrête, tâches s'accumulent en base - [x] Au resume : worker reprend depuis les tâches `pending` - [x] MQTT : passer à `clean_session=False` + `QoS=1` pour ne pas perdre les messages offline --- ## 4. Mode pause / veille par agent ### Topic MQTT : `agents//control` - [x] Chaque agent2_* : s'abonner à `agents//control` - [x] pause → worker stoppé, resume → worker relancé - [x] Agent1 en veille : n'accepte que `!agentsON` / `!agentON agent1` ### Commandes XMPP (sylvain → agent1) - [x] `!agentOFF ` / `!agentON ` - [x] `!agentsOFF` / `!agentsON` - [x] `!agentOFF agent1` / `!agentON agent1` (veille agent1 uniquement) --- ## 5. Rapports journaliers - [x] Chaque agent2_* : stats depuis queue.db, envoi sur `agents/daily_report` - [x] Agent1 : souscription `agents/daily_report`, stockage en mémoire - [x] `skills/daily_report.py` : DAILY_REPORT: [agent] - [x] APScheduler : sollicitation agents à 22:00/22:05/22:10, rapport journalier à 22:30 --- ## 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 |