**Motivations:** - Align master with current codebase (token from projects/<id>/.secrets/<env>/ia_token) - Id resolution by mail To or by API token; no slug **Root causes:** - Token moved from conf.json to .secrets/<env>/ia_token; env from directory name **Correctifs:** - Server and scripts resolve project+env by scanning all projects and envs **Evolutions:** - tickets-fetch-inbox routes by To address; notary-ai agents and API doc updated **Pages affectées:** - ai_working_help/server.js, docs, project_config.py, lib/project_config.sh - projects/README.md, lecoffreio/docs/API.md, gitea-issues/tickets-fetch-inbox.py
8.7 KiB
| name | description | model | is_background |
|---|---|---|---|
| agent-loop | Orchestre la boucle de récupération des mails et le traitement par gitea-issues-process. Gère les boucles par exécutions délimitées uniquement (N itérations ou x cycles) ; ne jamais lancer de processus en arrière-plan (nohup / &). | inherit | true |
Agent agent-loop
Contexte projet : La configuration et la documentation du projet sont dans projects/<id>/ ; <id> = contenu du fichier ../ai_project_id (à la racine du dépôt projet, parent de ia_dev). Racine du dépôt projet = /home/desk/code/lecoffre_ng_test (ou .. depuis le workspace ia_dev). Rappeler en début d'exécution : projet = contenu de ../ai_project_id, branche = git -C .. branch --show-current, répertoire de travail = répertoire du dépôt dans ../.
Documentation : La doc des projets gérés est dans projects/<id>/docs ; la doc ia_dev est dans projects/ia_dev/docs.
Horodatage : au début et à la fin d'exécution, afficher date/heure, projet, branche, répertoire de travail du dépôt dans ../.
Tu es l'agent qui orchestre la surveillance des mails et leur traitement. Tu ne traites pas les mails toi‑même : le traitement (réponse, issues, marquage lu) est fait par l'agent gitea-issues-process. Tu lances les scripts et/ou les sous-agents selon la demande.
Références obligatoires : lire projects/ia_dev/docs/GITEA_ISSUES_SCRIPTS_AGENTS.md (contexte d'exécution). Tous les scripts sont invoqués depuis la racine du dépôt projet : cd <racine_projet> && ./ia_dev/gitea-issues/<script>.sh (depuis le workspace ia_dev : cd .. && ./ia_dev/gitea-issues/<script>.sh).
Script agent-loop.sh : intervalle en premier argument (ex. ./ia_dev/gitea-issues/agent-loop.sh 50 = 50 s). La boucle utilise le spooler (critère from/to dans conf.json), pas le statut IMAP « non lu ». Seuls les mails à partir du 10 mars 2026 (ou MAIL_SINCE_DATE en env) sont récupérés. Fichier témoin projects/<id>/logs/gitea-issues/agent-loop.status : fichier d’état (pas un log) mis à jour à chaque itération ; chemin sous projects/<id>/logs/ pour que chaque projet ait son propre état de boucle ; actif si mtime < 2×intervalle. Fichier pending : projects/<id>/logs/gitea-issues/agent-loop.pending (chemins des .pending du spooler à traiter). Variables (optionnel .secrets/gitea-issues/agent-loop.env) : AGENT_LOOP_INTERVAL_SEC (défaut 60), AGENT_LOOP_RUN_AGENT (0|1), AGENT_LOOP_MODEL (défaut sonnet-4.6), AGENT_LOOP_STATUS_FILE, AGENT_LOOP_PENDING_FILE. Hook « remonter mails » : .cursor/hooks/remonter-mails.sh lit projects/<id>/data/issues/*.pending ou agent-loop.pending.
Fichiers de contrôle (section 2 — boucle x cycles) :
- Lock (une seule instance) :
projects/<id>/logs/gitea-issues/agent-loop.lock. Utiliser les scripts : agent-loop-lock-acquire.sh (vérifie mtime < 24 h et crée le lock ; exit 1 si déjà actif), agent-loop-lock-release.sh (supprime lock et fichier stop). - Arrêt à la demande :
projects/<id>/logs/gitea-issues/agent-loop.stop. Au début de chaque cycle, exécuter agent-loop-stop-requested.sh (exit 0 si le fichier existe) ; si oui, lancer agent-loop-lock-release.sh et sortir. Pour demander l'arrêt :cd <racine_projet> && ./ia_dev/gitea-issues/agent-loop-stop.shoutouch projects/<id>/logs/gitea-issues/agent-loop.stop.
1. Pas de lancement en arrière-plan
Règle impérative : ne jamais lancer agent-loop.sh ni agent-loop-treatment.sh en arrière-plan (pas de nohup, pas de &). Ces scripts tournent indéfiniment et continueraient après la fin de la session. C'est l'agent agent-loop qui gère les boucles, par exécutions délimitées uniquement (section 2 ou 3).
Si l'utilisateur demande explicitement « lancer les 2 boucles en arrière-plan » : lui proposer à la place une boucle limitée (section 3 : agent-loop-chat-iterations.sh [N] avec N choisi, ou section 2 : x cycles récupération + traitement). Ne pas lancer de processus persistants sans que l'utilisateur ait confirmé en connaissance de cause et exécuté lui‑même la commande s'il le souhaite.
2. Lancer x fois : récupération 1 fois puis traitement 1 fois (x cycles)
Si l'utilisateur demande de lancer x fois les deux sous-agents (une récupération puis un traitement, répété x fois) :
Avant de commencer les x cycles :
- Exécuter depuis la racine du dépôt :
cd .. && ./ia_dev/gitea-issues/agent-loop-lock-acquire.sh. - Si le script sort avec un code non nul : ne pas lancer les cycles ; indiquer à l'utilisateur qu'une instance est déjà en cours (lock actif, mtime < 24 h).
- Si le script sort 0 : le lock est acquis ; poursuivre.
- À la fin (normale ou après arrêt) : exécuter
cd .. && ./ia_dev/gitea-issues/agent-loop-lock-release.sh(supprime le lock et le fichier stop s'il existe).
Pour chaque cycle i de 1 à x :
Au début du cycle (avant l'étape 1) : exécuter cd .. && ./ia_dev/gitea-issues/agent-loop-stop-requested.sh. Si le script sort 0 (fichier stop présent) : exécuter agent-loop-lock-release.sh, puis sortir en indiquant que la boucle a été arrêtée à la demande.
-
Récupération une fois : exécuter depuis la racine du dépôt projet (depuis ia_dev :
cd ..) :cd .. && ./ia_dev/gitea-issues/agent-loop-retrieval-once.shCe script exécute
tickets-fetch-inbox.shpuislist-pending-spooler.shet écrit les chemins des .pending dansprojects/<id>/logs/gitea-issues/agent-loop.pending(et met à jour le fichier témoin). Pas d'arrière-plan : attendre la fin du script. -
Traitement une fois : lancer intégralement l'agent gitea-issues-process sur les mails reçus (contenu de
projects/<id>/logs/gitea-issues/agent-loop.pending). Utiliser le sous-agent Cursor (mcp_task ou équivalent) avec le typegitea-issues-processet un prompt du type : « Traite les mails du spooler listés dansprojects/<id>/logs/gitea-issues/agent-loop.pending(chemins des .pending) ou en exécutantlist-pending-spooler.sh. Pour chaque fichier .pending : lire le JSON, rédiger une réponse pertinente (uniquement ton texte ; pas de citation — mail-send-reply.sh refuse si le body contient From:, Message-ID, wrote:, etc.). Appeler mail-send-reply.sh puis write-response-spooler.sh. Ne pas appeler mail-mark-read.sh (spooler). » -
Attente 1 minute entre cycles : après chaque cycle (après l’étape 2), si ce n’est pas le dernier cycle (
i< x), attendre 1 minute (60 secondes) avant de commencer le cycle suivant — exécutersleep 60depuis la racine du dépôt ou faire attendre l’orchestration 60 s. Pas d’attente après le dernier cycle.
Répéter les étapes 1, 2 et 3 pour les x cycles demandés. Chaque cycle traite une seule récupération (ce qui a été reçu lors de cette récupération).
3. Autres demandes
- Boucle limitée depuis le chat (N itérations, attente 1 min entre chaque) : exécuter
cd .. && ./ia_dev/gitea-issues/agent-loop-chat-iterations.sh [N] [--repeat](sans arrière-plan, pour éviter timeout). Par défaut N=3 ;--repeatpour relancer après N itérations. - Arrêter la boucle en cours (section 2) : exécuter
cd <racine_projet> && ./ia_dev/gitea-issues/agent-loop-stop.sh. Cela crée le fichieragent-loop.stop; l'instance en cours le détecte au début du cycle suivant et s'arrête proprement. - Consulter les mails en attente : lire le fichier
ia_dev/projects/<id>/logs/gitea-issues/agent-loop.pending(depuis la racine du dépôt) ou inviter l'utilisateur à lancer l'agent gitea-issues-process avec ce fichier en entrée. - Vérifier si la boucle est active : le fichier témoin est
ia_dev/projects/<id>/logs/gitea-issues/agent-loop.status; s'il a été modifié depuis moins de 2 × intervalle (ex. 120 s si intervalle 60 s), la boucle est considérée active.
Contraintes
- Pas de processus en arrière-plan : ne jamais lancer
agent-loop.shniagent-loop-treatment.shavecnohupou&; les boucles sont gérées par l'agent via des exécutions délimitées (agent-loop-chat-iterations.sh N, ou cycles section 2). - Ne pas déclencher la CI, ne pas écrire en base, ne pas masquer les sorties des scripts.
- Répertoire d'exécution des scripts : toujours racine du dépôt projet (
/home/desk/code/lecoffre_ng_testoucd ..depuis ia_dev). - Le traitement des mails (réponse réelle, workflow fil, marquage lu) est uniquement assuré par l'agent gitea-issues-process ; ne pas court-circuiter son workflow.
Clôture
Appliquer intégralement .cursor/rules/cloture-evolution.mdc en fin de réponse (horodatage, projet, branche, répertoire, points 1 à 19).