Lot 6 : un tour de discussion de bout en bout en Rust (chat::generate)

Port d'EnqueueOrStart, StartTurn, generate, drainQueued,
startQueuedIfAny, dropQueued et compactAndPublish :
- envoi : réessai reconnu (cid), tour préparé par le Go (/turn/start), mis
  en file si un tour tourne, sinon moteur prêt (/health), verrou du tour
  puis bail du moteur du Go, bulle journalisée et enregistrée tout de suite ;
- tour : compaction de début de tour, vue d'envoi (tête du Go, historique
  sans <context_update>, préambule fusionné comme InjectSkills), boucle
  dont chaque événement devient un delta du journal, historique rangé
  (outils, réponse, raisonnement renvoyé, rappels en porte-à-faux retirés),
  contexte estimé si le moteur ne le compte pas, compaction de fin de tour ;
- fin : turn_done, journal coalescé, verrou et bail rendus, discussion
  enregistrée, file abandonnée après un stop ou message suivant lancé,
  sinon Web Push ;
- stop : le tour en cours, ou le détenteur Go du moteur.

chat::history porte historyFromView, dropStrayNudges, le rappel des pages
mémoire lues, l'assemblage d'InjectSkills et la forme des tool_used du
journal, avec leurs tests Go. ConvState garde ctxUsedLen et genPeak en
mémoire seulement. EngineLease::interrupted ne garde plus de verrou à
travers une attente.

Écarts : boucle de vérification du mode Code, critères pour la
compaction, préchauffage, télémétrie, retry_patterns personnalisés.

Tests de bout en bout : tour complet (outil, réponse, bail rendu,
discussion enregistrée, doublon), message en file injecté entre deux
étapes, moteur tenu par une tâche planifiée (409, stop), moteur pas prêt.

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 11:00:17 +00:00
1 parent f2d2669690
commit b5649eb506
11 files changed
+1678 -10

No files matched your search

+14
View File
@@ -165,6 +165,12 @@ pub struct ConvState {
pub seq: i64,
pub ctx_used: i64,
pub proj_snap: Option<ProjSnapshot>,
/// Messages que `ctx_used` couvre déjà (0 = inconnu) — en mémoire
/// seulement : un rechargement repart du seul `ctx_used`.
pub ctx_used_len: usize,
/// Génération la plus longue du dernier tour (moteur local), pour la garde
/// de marge de la compaction — en mémoire seulement.
pub gen_peak: i64,
}
/// Forme écrite, empruntée : l'instantané en plein tour écrit un journal
@@ -950,8 +956,16 @@ mod tests {
},
..Default::default()
}),
..Default::default()
};
let b = st.to_json();
// Les compteurs en mémoire ne s'écrivent pas.
let mem = ConvState {
ctx_used_len: 3,
gen_peak: 900,
..st.clone()
};
assert_eq!(mem.to_json(), b);
assert_eq!(
String::from_utf8(b.clone()).unwrap(),
r#"{"messages":[{"role":"user","content":"bonjour"}],"log":[{"seq":1,"ts":0,"delta":{"user":"bonjour"}}],"seq":1,"ctx_used":42,"proj_snap":{"at":7,"state":{"mem":{"a":"1","b":"2"}},"key":"k","sys_hash":""}}"#