#283
fix: sanitize Eino reduction paths on Windows
Problème
Sur Windows, certains identifiants CallID Eino générés pour les tool calls contiennent le caractère | (par exemple call_...|fc_...). Le middleware de réduction réutilisait cet identifiant tel quel dans les chemins tmp/reduction/.../trunc et clear, ce qui provoquait une erreur NodeRunError fatale : The filename, directory name, or volume label syntax is incorrect.
Les événements « audit agent rejected » observés dans la conversation sont séparés : ils correspondent à un échec d’appel du LLM d’audit et restent des refus de sécurité souples, sans auto-approbation.
Correctif
- Ajout de callbacks de chemin dédiés aux réductions Eino classique et agentique.
- Sanitisation des segments avant écriture : caractères interdits Windows, caractères de contrôle, séquences de traversal et noms de périphériques DOS.
- Application de la même protection aux fichiers de spill MCP/exec.
- Tests de régression avec l’identifiant fautif exact, couvrant l’écriture via Eino et le backend local.
Vérification
- Tests ciblés des packages internal/multiagent et internal/tooloutput passent avec CGO/SQLite.
- go vet passe sur les packages modifiés.
- Build complet du serveur avec CGO/SQLite réussi.
- Binaire corrigé redémarré localement et endpoint HTTP répondant 200.
Périmètre
Cette PR ne contient que les 4 fichiers nécessaires : 2 fichiers de production et leurs 2 tests. Aucun refactor ni fichier généré.