From 5e36b1cf82d2b2978393f3d47f141750527855d3 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Fri, 2 Oct 2026 23:25:32 +0200 Subject: [PATCH] =?UTF-8?q?Discussions=20:=20la=20liste=20montre=20la=20no?= =?UTF-8?q?uvelle=20d=C3=A8s=20le=20premier=20message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repris d'AJEAN 0.17.6. La discussion est enregistrée au début du tour (StartTurn persiste), mais la liste ne se rafraîchissait qu'à la fin de la réponse. Elle se recharge maintenant à l'arrivée du message, groupée quand plusieurs événements se suivent. Co-Authored-By: Claude Opus 5.5 --- internal/loki/ui/index.html | 12 ++++++++++++ internal/loki/ui/src/js/09-stream.js | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/internal/loki/ui/index.html b/internal/loki/ui/index.html index 1bfd47d..ee407c7 100644 --- a/internal/loki/ui/index.html +++ b/internal/loki/ui/index.html @@ -7412,6 +7412,15 @@ function feedBlock(el, full){ if(REPLAYING) scheduleRender(el, full); else smoot // bulle d'outil) doit voir le texte complet. function settleBlocks(){ smoothSnap(); flushRender(); } +// Rafraîchissement groupé de la liste des discussions (plusieurs événements +// rapprochés = un seul appel). +let histRefreshTimer=null; +function histRefreshSoon(){ + if(typeof loadConversations!=='function') return; + clearTimeout(histRefreshTimer); + histRefreshTimer=setTimeout(()=>{ histRefreshTimer=null; loadConversations(); }, 400); +} + // Traite UN événement du flux — même sémantique que l'ancien switch inline, mais // piloté par le serveur et rejouable à l'identique. function handleDelta(d){ @@ -7467,6 +7476,9 @@ function handleDelta(d){ // bulle de réponse du tour. T.model = d.model || ''; if(!REPLAYING) queueTake(d.user); // message en file désormais pris en compte + // Le serveur a déjà enregistré la discussion (StartTurn persiste) : la liste + // la montre dès le premier message, sans attendre la fin de la réponse. + if(!REPLAYING) histRefreshSoon(); let el=PENDING; if(!confirmPending(d.user)) el=addMsg('user', d.user); // Pièces jointes du tour : rendues DANS la bulle. La bulle en attente en diff --git a/internal/loki/ui/src/js/09-stream.js b/internal/loki/ui/src/js/09-stream.js index 579f9d4..f715f1b 100644 --- a/internal/loki/ui/src/js/09-stream.js +++ b/internal/loki/ui/src/js/09-stream.js @@ -437,6 +437,15 @@ function feedBlock(el, full){ if(REPLAYING) scheduleRender(el, full); else smoot // bulle d'outil) doit voir le texte complet. function settleBlocks(){ smoothSnap(); flushRender(); } +// Rafraîchissement groupé de la liste des discussions (plusieurs événements +// rapprochés = un seul appel). +let histRefreshTimer=null; +function histRefreshSoon(){ + if(typeof loadConversations!=='function') return; + clearTimeout(histRefreshTimer); + histRefreshTimer=setTimeout(()=>{ histRefreshTimer=null; loadConversations(); }, 400); +} + // Traite UN événement du flux — même sémantique que l'ancien switch inline, mais // piloté par le serveur et rejouable à l'identique. function handleDelta(d){ @@ -492,6 +501,9 @@ function handleDelta(d){ // bulle de réponse du tour. T.model = d.model || ''; if(!REPLAYING) queueTake(d.user); // message en file désormais pris en compte + // Le serveur a déjà enregistré la discussion (StartTurn persiste) : la liste + // la montre dès le premier message, sans attendre la fin de la réponse. + if(!REPLAYING) histRefreshSoon(); let el=PENDING; if(!confirmPending(d.user)) el=addMsg('user', d.user); // Pièces jointes du tour : rendues DANS la bulle. La bulle en attente en