diff --git a/internal/loki/ui/src/index.tmpl.html b/internal/loki/ui/src/index.tmpl.html index 84313c7..4bf32fc 100644 --- a/internal/loki/ui/src/index.tmpl.html +++ b/internal/loki/ui/src/index.tmpl.html @@ -198,7 +198,8 @@ document.documentElement.setAttribute('data-side',localStorage.getItem('loki-sid
diff --git a/internal/loki/ui/src/js/09-stream.js b/internal/loki/ui/src/js/09-stream.js index 350e3c9..d06fed8 100644 --- a/internal/loki/ui/src/js/09-stream.js +++ b/internal/loki/ui/src/js/09-stream.js @@ -466,7 +466,8 @@ function handleDelta(d){ if(T.serverStats) renderStats(T.contentEl||T.reasonEl, T.serverStats); else if(T.contentEl) paintStats(T.contentEl); // sans mesures serveur, la durée reste paintTurnClock(); // fige le total au-dessus de la carte - setBusy(false); if(!REPLAYING && typeof loadConversations==='function') loadConversations(); return; } + setBusy(false); if(!REPLAYING && typeof loadConversations==='function') loadConversations(); + if(typeof filesOnActivity==='function') filesOnActivity(); return; } if(d.error){ settleBlocks(); removeTyping(); T.contentEl=null; T.reasonEl=null; const eb=addMsg('assistant',''); eb.classList.add('errmsg'); renderBody(eb, d.error); return; } if(d.compacting!==undefined){ setCompacting(d.compacting); return; } if(d.compacted){ setCompacting(false); addCompactMark(); return; } @@ -504,7 +505,8 @@ function handleDelta(d){ // Carte à image : retirée de la liste du tour, sinon le repli de fin de // tour (collapseAll) la fermerait quand même. if(tu.image && T.pendingToolEl){ const i=T.turnCollapsibles.indexOf(T.pendingToolEl); if(i>=0) T.turnCollapsibles.splice(i,1); } - T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); } + T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); + if(typeof filesOnActivity==='function') filesOnActivity(); } return; } if(d.drop_reasoning){ smoothReset(); cancelRender(); // le bloc raisonnement disparaît : rien à rendre diff --git a/internal/loki/ui/src/js/14-attach.js b/internal/loki/ui/src/js/14-attach.js index a2f84a1..1405c0a 100644 --- a/internal/loki/ui/src/js/14-attach.js +++ b/internal/loki/ui/src/js/14-attach.js @@ -365,6 +365,7 @@ window.addEventListener('drop', e=>{ // rouge, elle dit déjà ce qui s'est passé. async function attachPaths(){ await Promise.all(ATTACH.filter(a=>a.state==='queued').map(uploadAttach)); + if(typeof filesOnActivity==='function') filesOnActivity(); // les dépôts apparaissent dans le panneau Fichiers return ATTACH.filter(a=>a.state==='ok'&&a.path).map(a=>a.path); } renderAttach(); diff --git a/internal/loki/ui/src/js/15-files.js b/internal/loki/ui/src/js/15-files.js index 87fb15a..9ad98a9 100644 --- a/internal/loki/ui/src/js/15-files.js +++ b/internal/loki/ui/src/js/15-files.js @@ -263,6 +263,21 @@ function filesOnConvChange(){ if(FILES_OPEN) loadFiles(''); } +// Quelque chose a pu changer sur disque : un outil vient de rendre son résultat +// (l'agent écrit un rapport, une capture, un script), le tour est fini, une +// pièce jointe vient d'être déposée. Le panneau se redessine tout seul — +// jusqu'ici il fallait cliquer « rafraîchir » pour voir apparaître ce que +// l'agent venait d'écrire. Regroupé : une rafale d'appels d'outils ne +// déclenche qu'une lecture. Panneau fermé ou rejeu du journal : rien à faire, +// l'ouverture recharge de toute façon. +let filesRefreshT = 0; +function filesOnActivity(){ + if(!FILES_OPEN) return; + if(typeof REPLAYING !== 'undefined' && REPLAYING) return; + clearTimeout(filesRefreshT); + filesRefreshT = setTimeout(()=>{ filesRefreshT = 0; loadFiles(); }, 400); +} + // Date courte : l'heure pour aujourd'hui, la date sinon. Ce qu'on veut savoir, // c'est « est-ce que ça vient du tour que je viens de lancer ? ». document.addEventListener('DOMContentLoaded', initFiles);