Résultats d'outils : aperçu + « voir plus », vrai compteur, MCP complet

Le flux n'envoie plus tout le résultat d'un outil : un aperçu de 1600
caractères, sa taille RÉELLE et l'id de l'appel. Le bouton « voir plus »
charge le reste à la demande (/api/chat/tool-result), et déplie vraiment le
bloc (plafond de 280 px levé) au lieu de le laisser scroller. « voir plus »
et « copier » vivent dans la même barre, ancrée en bas à droite d'un
bloc-parent non scrollant : elle reste au coin quand on scrolle le résultat.

Le compteur « ~N tok » de la bulle disait la taille de ce que l'UI avait
reçu, donc toujours le plafond sur un long résultat. Il lit maintenant
result_chars, la taille réelle.

MCP : plus de troncature à 12000 caractères avant le modèle (même règle que
la lecture mémoire). Un serveur MCP est configuré exprès pour ce qu'il rend ;
le couper au milieu rendait la réponse inutilisable. L'UI, elle, n'en affiche
que l'aperçu.

Reprises d'AJEAN 0.15.1, 0.15.2 et 0.15.4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6CAgoLJzufeA8rZTSpSpY
This commit is contained in:
Claude committed 2026-09-22 13:24:53 +00:00
1 parent 00b2350fb9
commit 91d1796615
9 files changed
+250 -31

No files matched your search

+29
View File
@@ -202,6 +202,35 @@ func handleChatState(w http.ResponseWriter, r *http.Request) {
sendJSON(w, 200, conv.state())
}
// handleToolResult renvoie le résultat COMPLET d'un appel d'outil, chargé à la
// demande par le bouton « voir plus » de la bulle (le flux ne transporte qu'un
// aperçu). Le résultat complet vit dans la vue « modèle » (conv.Messages), repéré
// par son tool_call_id. Absent (compacté, archivé, discussion changée) → 404, et
// l'UI garde son aperçu plutôt que d'afficher une erreur.
func handleToolResult(w http.ResponseWriter, r *http.Request) {
id := strings.TrimSpace(r.URL.Query().Get("id"))
if id == "" {
sendJSON(w, 400, map[string]any{"error": "id manquant"})
return
}
conv.mu.Lock()
found, ok := "", false
for _, m := range conv.Messages {
if m.Role == "tool" && m.ToolCallID == id {
if s, isStr := m.Content.(string); isStr {
found, ok = s, true
}
break
}
}
conv.mu.Unlock()
if !ok {
sendJSON(w, 404, map[string]any{"error": "résultat non disponible"})
return
}
sendJSON(w, 200, map[string]any{"result": found})
}
func handleChat(w http.ResponseWriter, r *http.Request) {
var body chatReq
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {