Quand la façade tient les tâches (LOKI_TASKS=rust), les quatre outils par lesquels le modèle gère ses tâches planifiées — task_list, task_create, task_update, task_delete — s'exécutent dans ses tours (src/tasks/tools.rs, port de tasks_tools.go), sans passer par le Go : mêmes messages, projet actif, fuseau de l'utilisateur, tâche unique « dans N minutes » ou « à HH:MM », fréquence validée, script vérifié, compte-rendu coupé comme le Go. ChatShared porte la même base de tâches que les routes. Côté Go, les outils prennent l'heure des tâches (tasksNow) au lieu de time.Now : rien ne change en service, le journal de parité la fixe. Parité : journal de 44 appels tiré du Go (parity_tasks_tools_test.go → tests/parity_tasks/tools.json), rejoué par tests/tasks.rs ; un tour de la façade qui crée une tâche (tests/lot6.rs). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
2.8 KiB
Lot 37 — Outils task_* de l'agent en Rust
Contexte
Depuis le lot 26, la façade tient les tâches planifiées (LOKI_TASKS=rust) :
- les routes ;
- le planificateur ;
- les tâches « script seul ».
Les quatre outils par lesquels le modèle gère lui-même ses tâches
(tasks_tools.go) restaient au Go, appelés par /internal/v1/tool/exec :
task_list;task_create;task_update;task_delete.
Le lot
src/tasks/tools.rs porte les quatre outils, mêmes messages au caractère
près :
task_list:- liste du projet actif, aperçu d'une ligne par tâche ;
- compte-rendu coupé à 300 octets, un caractère coupé valant U+FFFD par octet comme à l'encodage JSON du Go ;
- avec un id, la tâche seule et son compte-rendu complet ;
- une tâche d'un autre projet est « introuvable » ;
task_create:- tâche unique « dans N minutes » (durée tronquée comme
time.Duration(v)) ou « à HH:MM » (le lendemain si l'heure est passée, à la même heure murale) ou « à AAAA-MM-JJ HH:MM » ; - fréquence validée ;
- script vérifié dans le dossier protégé ;
- tâche rattachée au projet actif ;
- fuseau : celui du navigateur, sinon celui de la première tâche qui en a un ;
- tâche unique « dans N minutes » (durée tronquée comme
task_update: modification partielle ; la prochaine exécution est recalculée sur une nouvelle fréquence, ou à la reprise d'une tâche qui n'en a pas ;task_delete.
Un projet disparu vaut le projet par défaut (taskProjectOf).
GoTurnHost::exec_tool les exécute quand la façade tient les tâches
(ChatShared.tasks, la même base que celle des routes). Sinon l'appel part
au Go comme avant.
Côté Go, les outils prennent l'heure des tâches (tasksNow) au lieu de
time.Now. Rien ne change en service ; le journal de parité peut ainsi la
fixer.
Parité
internal/loki/parity_tasks_tools_test.go tire du Go un journal de 44
appels (tests/parity_tasks/tools.json). Chaque étape porte :
- l'heure, le fuseau, le projet actif, les projets connus ;
- les scripts présents ;
- une tâche posée telle quelle en base ;
- les arguments tels que le modèle les envoie ;
- le résultat tel qu'il le reçoit ;
- les tâches en base après coup.
Le journal couvre :
- l'heure du trou du changement d'heure ;
- une date passée ou impossible ;
- des arguments d'un autre type ;
- un script absent, hostile ou dossier ;
- le compte-rendu coupé au milieu d'un caractère ;
- le fuseau d'une tâche existante.
tests/tasks.rs (parite_des_outils) le rejoue contre le port Rust.
tests/lot6.rs (outil_task_par_la_facade) fait tourner un tour de la
façade qui crée une tâche. Il vérifie :
- rien ne passe par le Go ;
- la tâche est rangée au fuseau de l'utilisateur, dans le projet actif ;
- le résultat est celui que le modèle reçoit.