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
@@ -116,8 +116,12 @@ func (p *convPersister) enqueueSnap(s *convSnap) uint64 {
|
||||
func (p *convPersister) enqueueToolRes(j toolResJob) uint64 {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
p.mem[j.key] = j.plain
|
||||
p.res = append(p.res, j)
|
||||
// Discussion déjà supprimée (un outil finit juste après la suppression) :
|
||||
// l'écrivain l'écarterait, et la copie en mémoire ne partirait plus jamais.
|
||||
if !p.deleted[toolResConv(j.key)] {
|
||||
p.mem[j.key] = j.plain
|
||||
p.res = append(p.res, j)
|
||||
}
|
||||
return p.kickLocked()
|
||||
}
|
||||
|
||||
@@ -461,6 +465,17 @@ func convActiveRemember(id string) {
|
||||
convActiveCache.Store(&convActiveRef{path: dbPath(), id: id})
|
||||
}
|
||||
|
||||
// convActiveID lit la discussion active SANS jamais en créer une : cache chaud,
|
||||
// sinon la clé en base (vide si aucune). Pour les lecteurs qui, avant le cache,
|
||||
// lisaient la clé brute — les résultats d'outils d'une tâche de fond sur une base
|
||||
// neuve vont sous « nosession » au lieu de forger une discussion vide.
|
||||
func convActiveID() string {
|
||||
if id := convActiveCached(); id != "" {
|
||||
return id
|
||||
}
|
||||
return getStr(bkChat, ckActive)
|
||||
}
|
||||
|
||||
// convActivate fait de id la discussion active et charge b en mémoire, sous
|
||||
// convActiveMu : le pointeur en base, le cache et le contenu changent ensemble.
|
||||
func convActivate(id string, b []byte) {
|
||||
|
||||
Reference in new issue
Block a user