From 38802d9e21056927a8a83c901fb0169766bd3598 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 28 Sep 2026 00:20:02 +0200 Subject: [PATCH] Presets : une bascule faite sur un appareil se voit sur les autres MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repris d'AJEAN 0.13.6. Changer de preset sur le téléphone laissait l'onglet du PC afficher l'ancien, sélection de la liste comprise, jusqu'à un rechargement à la main. /api/status (sondé toutes les 5 s) expose l'id du preset actif ; loadStatus rappelle loadPresets quand il change sans qu'on y ait touché ici. Co-Authored-By: Claude Opus 5.5 --- internal/loki/ui/index.html | 9 +++++++++ internal/loki/ui/src/js/05-status.js | 9 +++++++++ internal/loki/web_api.go | 3 +++ 3 files changed, 21 insertions(+) diff --git a/internal/loki/ui/index.html b/internal/loki/ui/index.html index 1adec20..d5fad03 100644 --- a/internal/loki/ui/index.html +++ b/internal/loki/ui/index.html @@ -3915,8 +3915,17 @@ function askKeyOnce(){ } async function jget(u){ const r=await jfetch(u); return r.json(); } async function jpost(u,b){ const r=await jfetch(u,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(b||{})}); return r.json(); } +let LAST_PRESET=null; // id du preset actif vu au dernier poll (détecte une bascule faite ailleurs) async function loadStatus(){ const s=await jget('/api/status'); + // Preset actif changé alors qu'on n'a rien touché ici : un AUTRE appareil a + // basculé de preset/modèle. On rafraîchit la liste (et le libellé du preset) + // pour rester en phase sans recharger l'app. Premier poll (LAST_PRESET null) : + // on note seulement la valeur, loadPresets a déjà tourné au démarrage. + if(typeof s.preset!=='undefined'){ + if(LAST_PRESET!==null && s.preset!==LAST_PRESET && typeof loadPresets==='function') loadPresets(); + LAST_PRESET=s.preset; + } const el=document.getElementById('status-svc'); // Trois états : service coupé (err) · service actif mais modèle pas encore // chargé (loading, llama-server renvoie 503) · modèle prêt (ok). diff --git a/internal/loki/ui/src/js/05-status.js b/internal/loki/ui/src/js/05-status.js index d1ef222..a992f20 100644 --- a/internal/loki/ui/src/js/05-status.js +++ b/internal/loki/ui/src/js/05-status.js @@ -1,5 +1,14 @@ +let LAST_PRESET=null; // id du preset actif vu au dernier poll (détecte une bascule faite ailleurs) async function loadStatus(){ const s=await jget('/api/status'); + // Preset actif changé alors qu'on n'a rien touché ici : un AUTRE appareil a + // basculé de preset/modèle. On rafraîchit la liste (et le libellé du preset) + // pour rester en phase sans recharger l'app. Premier poll (LAST_PRESET null) : + // on note seulement la valeur, loadPresets a déjà tourné au démarrage. + if(typeof s.preset!=='undefined'){ + if(LAST_PRESET!==null && s.preset!==LAST_PRESET && typeof loadPresets==='function') loadPresets(); + LAST_PRESET=s.preset; + } const el=document.getElementById('status-svc'); // Trois états : service coupé (err) · service actif mais modèle pas encore // chargé (loading, llama-server renvoie 503) · modèle prêt (ok). diff --git a/internal/loki/web_api.go b/internal/loki/web_api.go index 3aedd04..5ffcbf2 100644 --- a/internal/loki/web_api.go +++ b/internal/loki/web_api.go @@ -80,6 +80,9 @@ func handleStatus(w http.ResponseWriter, r *http.Request) { "load_error": loadErr, // modèle qui ne charge pas (incompat moteur…) — vide sinon "load_pct": loadPct, // % estimé du chargement en cours (-1 = non mesurable) "external": external, // preset externe : le chat part vers une API distante + // id du preset actif : un autre appareil a pu basculer, l'UI se + // resynchronise sans reload (voir loadStatus). AJEAN 0.13.6. + "preset": activePresetID(), }) }