mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-19 13:08:15 +02:00
Lot 7 : boucle du contrat du mode Code tenue par la façade
Port de codeVerifyLoop (rust/loki-rs/src/chat/verify.rs) : à la fin d'un tour de build en mode Code, relances du builder sur les critères encore ouverts, passe de vérification sur un contexte isolé, corrections, abandon dit dans le fil après deux corrections — mêmes deltas que le Go (role, verify_done, mesures ctx_isolated), relances et corrections rangées dans l'historique, vérifications non. Le Go garde les critères (l'outil criteria s'y exécute) : la façade les lit en base (chat/crit:<id>) et reçoit le contexte isolé du vérificateur par POST /internal/v1/turn/verifier (prompt du rôle et faits de la machine, outils fermés, rôle verifier, seul autorisé à marquer passed). Toute compaction en mode Code rend l'état des critères au résumé, comme compactMessages. generate : vue du tour factorisée (turn_view), question à l'utilisateur suivie (une question posée suspend la vérification). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
10 files changed
+961
-37
No files matched your search
@@ -97,6 +97,8 @@ func withInternalAPI(next http.Handler) http.Handler {
|
||||
handleInternalTurnView(w, r)
|
||||
case "/internal/v1/turn/done":
|
||||
handleInternalTurnDone(w, r)
|
||||
case "/internal/v1/turn/verifier":
|
||||
handleInternalTurnVerifier(w, r)
|
||||
case "/internal/v1/conv/active":
|
||||
handleInternalConvActive(w, r)
|
||||
case "/internal/v1/conv/dropped":
|
||||
|
||||
@@ -21,6 +21,8 @@ import (
|
||||
// POST /internal/v1/turn/view {"caps":{…}} → {head, prefix, tools}
|
||||
// 409 : PROJ_SNAPSHOT actif (le bloc projet figé reste au Go)
|
||||
// POST /internal/v1/turn/done {"ms":N} → 204 (Web Push si abonnés)
|
||||
// POST /internal/v1/turn/verifier {"caps":{…}} → {system, tools, caps}
|
||||
// (passe de vérification du mode Code : contexte ISOLÉ, rôle verifier)
|
||||
// POST /internal/v1/conv/active {"id":…} → 204 (discussion active des outils)
|
||||
// POST /internal/v1/conv/dropped {"id":…} → 204 (fichiers, jobs, critères,
|
||||
// mode, résultats d'outils ;
|
||||
@@ -109,6 +111,26 @@ func handleInternalTurnView(w http.ResponseWriter, r *http.Request) {
|
||||
sendJSON(w, http.StatusOK, map[string]any{"head": head, "prefix": injectPrefix(caps, tools), "tools": tools})
|
||||
}
|
||||
|
||||
// handleInternalTurnVerifier : ce que runVerifyPass envoie au moteur hors de
|
||||
// l'historique — le prompt du rôle verifier suivi des faits de la machine, et
|
||||
// le jeu d'outils fermé de la vérification. caps : celles du tour, rôle
|
||||
// remplacé (le Go s'y fie pour laisser l'outil criteria marquer « passed »).
|
||||
func handleInternalTurnVerifier(w http.ResponseWriter, r *http.Request) {
|
||||
var in struct {
|
||||
Caps Caps `json:"caps"`
|
||||
}
|
||||
if !readInternalJSON(w, r, &in) {
|
||||
return
|
||||
}
|
||||
vcaps := in.Caps
|
||||
vcaps.Role = "verifier"
|
||||
sendJSON(w, http.StatusOK, map[string]any{
|
||||
"system": rolePrompt("verifier") + "\n\n" + machineSystemPrompt(vcaps),
|
||||
"tools": EnabledTools(vcaps),
|
||||
"caps": vcaps,
|
||||
})
|
||||
}
|
||||
|
||||
func handleInternalTurnDone(w http.ResponseWriter, r *http.Request) {
|
||||
var in struct {
|
||||
Ms int64 `json:"ms"`
|
||||
|
||||
@@ -127,3 +127,34 @@ func TestTourInterneDiscussions(t *testing.T) {
|
||||
t.Fatalf("corps illisible : %d %q", w.Code, w.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
// La passe de vérification de la façade reçoit exactement le contexte isolé
|
||||
// de runVerifyPass : prompt du rôle et faits de la machine, outils fermés,
|
||||
// rôle verifier (seul autorisé à marquer un critère « passed »).
|
||||
func TestTourInterneVerificateur(t *testing.T) {
|
||||
testHome(t)
|
||||
t.Setenv(internalTokenEnv, jetonTest)
|
||||
got := turnJSON(t, "/internal/v1/turn/verifier", `{"caps":{"Agent":true,"Code":true,"Mem":"off","Role":"builder"}}`, 200)
|
||||
vcaps := Caps{Agent: true, Code: true, Mem: MemOff, Role: "verifier"}
|
||||
if got["system"] != rolePrompt("verifier")+"\n\n"+machineSystemPrompt(vcaps) {
|
||||
t.Fatalf("système : %v", got["system"])
|
||||
}
|
||||
caps, _ := got["caps"].(map[string]any)
|
||||
if caps["Role"] != "verifier" || caps["Code"] != true {
|
||||
t.Fatalf("caps : %v", caps)
|
||||
}
|
||||
tools, _ := got["tools"].([]any)
|
||||
var names []string
|
||||
for _, tl := range tools {
|
||||
f, _ := tl.(map[string]any)["function"].(map[string]any)
|
||||
names = append(names, f["name"].(string))
|
||||
}
|
||||
var want []string
|
||||
for _, tl := range EnabledTools(vcaps) {
|
||||
want = append(want, tl.Function.Name)
|
||||
}
|
||||
if strings.Join(names, ",") != strings.Join(want, ",") || !strings.Contains(strings.Join(names, ","), "criteria") {
|
||||
t.Fatalf("outils : %v, attendu %v", names, want)
|
||||
}
|
||||
turnJSON(t, "/internal/v1/turn/verifier", `{`, 400)
|
||||
}
|
||||
Reference in new issue
Block a user