From 02079b4233842da64ac9571431b0271f250abb30 Mon Sep 17 00:00:00 2001 From: Olivi Date: Sun, 25 Oct 2026 16:19:02 +0100 Subject: [PATCH] =?UTF-8?q?Jean:=20le=20mot=20d'activit=C3=A9=20est=20effa?= =?UTF-8?q?c=C3=A9=20=C3=A0=20la=20fin=20du=20tour=20(le=20balayage=20infi?= =?UTF-8?q?ni=20survivait=20dans=20chaque=20ligne=20pass=C3=A9e)=20et=20ch?= =?UTF-8?q?aque=20geste=20m=C3=A9moire=20a=20son=20libell=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/ajean/ui/index.html | 26 ++++++++++++++++++---- internal/ajean/ui/src/js/00a-i18n-data.js | 10 +++++++++ internal/ajean/ui/src/js/09-stream.js | 23 ++++++++++++++++--- internal/ajean/ui/src/js/20-jean-avatar.js | 3 ++- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/internal/ajean/ui/index.html b/internal/ajean/ui/index.html index 31d838a7..87df07e0 100644 --- a/internal/ajean/ui/index.html +++ b/internal/ajean/ui/index.html @@ -3438,6 +3438,11 @@

0) && !(tok>0) && !(pr && !viewOn('hide-preset'))){ removeGenEl(); scrollMaybe(true); return; } const items=genItems(elapsedMs/1000, tok, rate, pr, ''); if(!(elapsedMs>0)) items.shift(); - const g=ensureGenEl(); paintGenParts(g.querySelector('.gtxt'), items); + const g=ensureGenEl(); + const act=g.querySelector('.jact'); if(act){ act.textContent=''; act.classList.remove('jact-in'); } + paintGenParts(g.querySelector('.gtxt'), items); GENEL=null; if(!CHAT_TARGET) JeanAvatar&&JeanAvatar.detach(); scrollMaybe(true); } @@ -12444,7 +12461,8 @@

0) && !(tok>0) && !(pr && !viewOn('hide-preset'))){ removeGenEl(); scrollMaybe(true); return; } const items=genItems(elapsedMs/1000, tok, rate, pr, ''); if(!(elapsedMs>0)) items.shift(); - const g=ensureGenEl(); paintGenParts(g.querySelector('.gtxt'), items); + const g=ensureGenEl(); + // Le mot d'activité DOIT être effacé ici. `GENEL=null` détache la ligne sans la vider : + // elle reste dans le fil comme trace du tour fini, avec son encore + // plein. Or le CSS anime tout `.jact:not(:empty)::after` avec un balayage `infinite`, + // donc chaque « Retient ça… » des tours passés continuait à briller pour toujours — et + // la règle `.jact:not(:empty)+.gtxt{display:none}` cachait par-dessus le coup la ligne + // de métriques (durée · tokens · t/s), remplacée par ce mot figé. + const act=g.querySelector('.jact'); if(act){ act.textContent=''; act.classList.remove('jact-in'); } + paintGenParts(g.querySelector('.gtxt'), items); GENEL=null; if(!CHAT_TARGET) JeanAvatar&&JeanAvatar.detach(); scrollMaybe(true); // révèle la fin (et cette ligne) même sur un fil à peine défilable } diff --git a/internal/ajean/ui/src/js/20-jean-avatar.js b/internal/ajean/ui/src/js/20-jean-avatar.js index 46060e0c..82f3569b 100644 --- a/internal/ajean/ui/src/js/20-jean-avatar.js +++ b/internal/ajean/ui/src/js/20-jean-avatar.js @@ -251,7 +251,8 @@ var JeanAvatar = (()=>{ act(k){ if(!k) return; wake(); - const map={'jean.act_think':'think','jean.act_read':'think','jean.act_search':'search','jean.act_remember':'search','jean.act_forget':'search', + const map={'jean.act_think':'think','jean.act_read':'think','jean.act_search':'search','jean.act_remember':'search','jean.act_note':'search','jean.act_lesson':'search', + 'jean.act_save':'search','jean.act_patch':'search','jean.act_rule':'search','jean.act_forget':'search', 'jean.act_web':'web','jean.act_browse':'web','jean.act_look':'web','jean.act_machine':'work','jean.act_task':'work','jean.act_work':'work'}; setState(map[k]||'think'); },