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