Conversation tenue par la façade : le Go lui remet ce qui lui arrive

Avec LOKI_CHAT=rust, la façade sert les routes du chat. Deux chemins
arrivent pourtant au Go sans passer par elle — le tunnel du relais et sa
redistribution /api/e2e/req — et liraient la conversation du Go, périmée,
voire l'écriraient en base par-dessus celle de la façade. facade_chat.go :
- routes du chat remises à la façade (après requireWebAuth), avec le jeton
  interne qui y tient lieu d'authentification, flux compris ;
- /api/e2e/chat lit le flux de la façade et le rechiffre événement par
  événement (nombres repris tels quels) ;
- les événements d'affichage nés ici (bascule du mode Code, critères)
  vont au journal de la façade (/internal/facade/v1/delta) ;
- l'export lit la discussion enregistrée ;
- le déverrouillage de la mémoire fait recharger la façade.

L'outil d'exécution ne rend plus les critères : critNotify les pousse lui-
même, d'où qu'il soit appelé. Sans LOKI_CHAT=rust, rien ne change.

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:19:42 +00:00
1 parent 846b561efb
commit 306c7a2f6c
10 files changed
+374 -52

No files matched your search

+4 -23
View File
@@ -58,29 +58,10 @@ func handleInternalToolExec(w http.ResponseWriter, r *http.Request) {
sendJSON(w, http.StatusOK, struct {
Label string `json:"label"`
toolExecResult
Image string `json:"image,omitempty"`
Shot string `json:"shot,omitempty"`
Relay *Message `json:"relay,omitempty"`
Criteria []Criterion `json:"criteria,omitempty"`
}{label, res, image, shot, relay, criteriaAfter(in.Name, in.Args, res)})
}
// criteriaAfter : la liste des critères après un appel qui l'a changée
// (critNotify la pousse au journal du Go ; une conversation tenue par la
// façade la reçoit ici). nil sinon.
func criteriaAfter(name string, args map[string]any, res toolExecResult) []Criterion {
if name != "criteria" || strings.HasPrefix(res.Result, "[erreur]") {
return nil
}
switch a, _ := args["action"].(string); a {
case "add", "set", "clear":
list := critList(convActiveID())
if list == nil {
list = []Criterion{}
}
return list
}
return nil
Image string `json:"image,omitempty"`
Shot string `json:"shot,omitempty"`
Relay *Message `json:"relay,omitempty"`
}{label, res, image, shot, relay})
}
// toolStepExtras : ce que runChatLoop tire d'un résultat d'outil après