mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 22:48:11 +02:00
Persistance : corrections de relecture — un résultat d'outil ne forge plus de discussion
Relecture de l'écrivain différé (chat_persist.go) : l'ordre, la suppression et les bascules tiennent ; trois écarts de comportement corrigés. - saveToolResult et la télémétrie de generate lisaient la clé brute de la discussion active ; passés à convEnsureActive, ils pouvaient en CRÉER une (tâche de fond sur base neuve → discussion vide dans la liste). Nouveau convActiveID : cache chaud, sinon la clé en base, jamais de création. - Un résultat d'outil confié après la suppression de sa discussion restait en mémoire pour toujours (l'écrivain l'écarte, la copie ne partait plus) : il n'est plus retenu. - Vidage de l'écrivain avant « verrouiller la mémoire » (sinon l'envoi tout juste fait ne touchait le disque qu'au déverrouillage) et avant le restart systemd après MAJ (SIGTERM ne laisse rien finir). Tests : résultat d'une discussion supprimée ni écrit ni retenu ; base neuve, saveToolResult reste sous « nosession » sans créer de discussion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c3005f5b56
commit
667e340e57
6 files changed
+58
-4
No files matched your search
@@ -423,3 +423,37 @@ func TestConvEnsureActiveConcurrentForgeUnSeulID(t *testing.T) {
|
||||
t.Fatalf("%d entrées d'index, attendu 1", n)
|
||||
}
|
||||
}
|
||||
|
||||
// Un outil qui finit juste après la suppression de sa discussion : son résultat
|
||||
// n'est ni écrit ni gardé en mémoire pour toujours.
|
||||
func TestToolResultApresSuppressionNeFuitPas(t *testing.T) {
|
||||
testHome(t)
|
||||
resetConvForTest()
|
||||
a := convEnsureActive()
|
||||
convNew()
|
||||
persistQ.forget(a)
|
||||
key := a + ".deadbeef"
|
||||
persistQ.enqueueToolRes(toolResJob{path: dbPath(), key: key, plain: "orphelin"})
|
||||
persistQ.flush()
|
||||
if _, ok := persistQ.toolResPending(key); ok {
|
||||
t.Fatal("résultat d'une discussion supprimée gardé en mémoire")
|
||||
}
|
||||
if b := getBytes(bkToolRes, key); b != nil {
|
||||
t.Fatal("résultat d'une discussion supprimée écrit sur disque")
|
||||
}
|
||||
}
|
||||
|
||||
// Base neuve, sans discussion active : un résultat d'outil (tâche de fond) ne
|
||||
// forge PAS de discussion vide dans la liste — il va sous « nosession », comme
|
||||
// avant le cache.
|
||||
func TestSaveToolResultNeCreePasDeDiscussion(t *testing.T) {
|
||||
testHome(t)
|
||||
id := saveToolResult(strings.Repeat("r", 3000))
|
||||
if !strings.HasPrefix(id, "nosession.") {
|
||||
t.Fatalf("id = %q, attendu nosession.*", id)
|
||||
}
|
||||
persistQ.flush()
|
||||
if getStr(bkChat, ckActive) != "" || len(convIndex()) != 0 {
|
||||
t.Fatal("saveToolResult a créé une discussion")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user