Jauge de contexte, espace disque sur partage agrégé, panneau Fichiers

Trois défauts sans rapport entre eux, tous visibles à l'écran.

Jauge de contexte bloquée à « 0 / N (0 %) » : le comptage exact vient de
usage.prompt_tokens (include_usage), qu'un llama-server récent a cessé de
renvoyer. On note désormais si l'usage est arrivé ; sinon la fin de tour
publie l'estimation qui pilote déjà la compaction — approximative, mais
jamais absente. Et la souscription envoie la valeur courante juste après
le rattrapage : une page rechargée affichait zéro sur une discussion
pourtant pleine, faute d'événement ctx_used dans la fenêtre rejouée.

Espace disque : « il ne reste que 11,9 Go » sur un partage Unraid qui en
a des centaines. /mnt/user est servi par shfs, un FUSE qui agrège
plusieurs disques — statfs y renvoie l'espace d'un seul, et ce chiffre
REFUSAIT l'installation du modèle. Les systèmes de fichiers qui
approximent (FUSE, overlay, NFS, CIFS, Ceph, Gluster) sont reconnus par
leur magie : leur chiffre reste affiché, précédé d'un « ~ », mais ne
bloque plus rien.

Panneau Fichiers : le panneau entier défilait, emportant vers le haut
l'en-tête, le fil d'Ariane et le pied (occupation disque, bouton .zip)
dès qu'il y avait quelques fichiers. Seule la liste défile maintenant ;
le pied reste en bas et l'état vide se centre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-08-19 08:28:53 +02:00
1 parent 895ff92ed8
commit b405adea6c
5118 files changed
+1264007 -23

No files matched your search

+32
View File
@@ -423,6 +423,13 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
// Non-nil = elle remplace l'historique (elle contient déjà le tour en cours).
var newBase []Message
var content strings.Builder
// Le comptage EXACT du contexte vient de `usage.prompt_tokens` (option
// include_usage). Tous les moteurs ne le renvoient pas — un llama-server
// récent a cessé de le faire, et la jauge est restée bloquée à zéro sur des
// discussions de plusieurs dizaines de milliers de tokens. On note donc si
// l'usage est arrivé ; sinon on retombe sur l'estimation (celle qui pilote
// déjà la compaction), approximative mais jamais absente.
sawUsage := false
extra, _ := runChat(ctx, InjectSkills(final, caps), temperature, caps, func(ev StreamEvent) bool {
switch {
case ev.Err != nil:
@@ -465,6 +472,7 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
// Taille réelle du contexte (usage.prompt_tokens + généré) pour le compteur
// et la décision de compactage au tour suivant.
if ev.Stats.PromptTokensTotal > 0 {
sawUsage = true
c.mu.Lock()
if c.epoch == epoch {
c.CtxUsed = ev.Stats.PromptTokensTotal + ev.Stats.GenTokens
@@ -505,6 +513,20 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
stale := c.epoch != epoch
c.mu.Unlock()
// Moteur muet sur l'usage : on publie l'estimation, sinon la jauge reste à
// zéro et l'utilisateur ne voit jamais son contexte se remplir — ni la
// compaction arriver.
if !stale && !sawUsage {
est := estimateTokens(msgs)
c.mu.Lock()
if c.epoch == epoch {
c.CtxUsed = est
}
c.mu.Unlock()
c.appendDelta(epoch, map[string]any{"ctx_used": est})
ctxUsed = est
}
// Boucle du contrat (mode code) : vérification indépendante des critères,
// corrections, re-vérification — AVANT de rendre la main. Voir
// code_verify.go. No-op hors mode code ou sans critères.
@@ -795,6 +817,16 @@ func (c *Conversation) Subscribe(ctx context.Context, from int, emit func(map[st
if !emit(map[string]any{"caught_up": true}) {
return
}
// Taille du contexte connue MAINTENANT : le journal ne rejoue que les
// événements du fil, et `ctx_used` n'y figure qu'aux tours où il a changé —
// souvent hors de la fenêtre rejouée. Sans cet envoi, toute page rechargée
// affichait « 0 / N (0 %) » sur une discussion pourtant bien remplie.
c.mu.Lock()
used := c.CtxUsed
c.mu.Unlock()
if used > 0 && !emit(map[string]any{"ctx_used": used}) {
return
}
// Le padding doit venir APRÈS caught_up, pas dessus. Un proxy (Cloudflare) garde
// toujours le DERNIER bout de flux en tampon jusqu'au prochain flush (~2-3 s). En
// envoyant un gros pad juste après, ce sont ses octets — et non le dernier vrai