API interne d'un tour de discussion tenu par Rust

Ce qui décrit un tour reste au Go le temps d'être porté (lot 7) ; la
façade le demande ici :
- /turn/start : pièces jointes et vision (userMessageContent), capacités
  demandées et celles du tour (rôle du mode Code figé), nom du modèle,
  puce « mode Code » (une fois par discussion) ;
- /turn/view : la tête de turnView sans PROJ_SNAPSHOT (prompt du preset,
  consignes du dépôt, contexte du projet), le préambule d'InjectSkills et
  les outils du tour, MCP compris ; 409 sous PROJ_SNAPSHOT ;
- /turn/done : notification Web Push de fin de tour ;
- /conv/active : la discussion active des outils suit la façade ;
- /conv/dropped : fichiers, travaux, critères, mode et résultats d'outils
  d'une discussion supprimée.

injectPrefix et codeHintDue sortent d'InjectSkills et de maybeCodeHint,
sans changement de comportement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
Claude committed 2026-10-15 10:48:38 +00:00
1 parent fea055fd52
commit ef11454a21
5 files changed
+334 -17

No files matched your search

+19 -13
View File
@@ -263,6 +263,24 @@ func globalCaps() Caps {
// skills directory (when skills are enabled). Merges with an existing system
// message if present. tools = the tools sent on this same turn (see prepareTurn).
func InjectSkills(msgs []Message, caps Caps, tools []Tool) []Message {
prefix := injectPrefix(caps, tools)
if prefix == "" {
return msgs
}
// Un message PROJET en tête (pas de prompt de preset) ne doit pas absorber le
// préambule : il perdrait son préfixe, et normalizeSystemMessages ne saurait
// plus le sortir du bloc système commun (voir isProjectSystem).
if len(msgs) > 0 && msgs[0].Role == "system" && !isProjectSystem(msgs[0]) {
existing, _ := msgs[0].Content.(string)
merged := append([]Message{{Role: "system", Content: prefix + "\n\n" + existing}}, msgs[1:]...)
return merged
}
return append([]Message{{Role: "system", Content: prefix}}, msgs...)
}
// injectPrefix : le texte qu'InjectSkills pose en tête — préambule d'agent
// décidé, puis briefing machine ; "" s'il n'y a rien à dire.
func injectPrefix(caps Caps, tools []Tool) string {
var parts []string
// Decisive-agent preamble (anti-loop) — only when the model actually has
// tools, otherwise it nudges a plain chat model to "call tools" it doesn't
@@ -273,19 +291,7 @@ func InjectSkills(msgs []Message, caps Caps, tools []Tool) []Message {
if mp := machineSystemPrompt(caps); mp != "" {
parts = append(parts, mp)
}
if len(parts) == 0 {
return msgs
}
prefix := strings.Join(parts, "\n\n")
// Un message PROJET en tête (pas de prompt de preset) ne doit pas absorber le
// préambule : il perdrait son préfixe, et normalizeSystemMessages ne saurait
// plus le sortir du bloc système commun (voir isProjectSystem).
if len(msgs) > 0 && msgs[0].Role == "system" && !isProjectSystem(msgs[0]) {
existing, _ := msgs[0].Content.(string)
merged := append([]Message{{Role: "system", Content: prefix + "\n\n" + existing}}, msgs[1:]...)
return merged
}
return append([]Message{{Role: "system", Content: prefix}}, msgs...)
return strings.Join(parts, "\n\n")
}
// prepareTurn calcule UNE fois les outils du tour, puis le préambule à partir