mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
- module github.com/R0m1k3/Loki, cmd/loki, internal/loki (package loki) - LOKI_HOME, LOKI_MODEL_DIRS, LOKI_SERVICE, LOKI_DL_CONNS ; /etc/loki ; units loki-engine / loki-ui ; binaire et aide CLI - updateRepo pointe sur R0m1k3/Loki (l'auto-update ne tirera plus les binaires AJEAN amont) Conservé à l'identique : le domaine ajean.link (service de tunnel amont), les littéraux de migration 0.7.x (migrate_07.go), RELEASE_NOTES.md et LICENSE (historique et licence de l'amont). go build/vet/test : verts.
74 lines
2.2 KiB
Go
74 lines
2.2 KiB
Go
package loki
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// Préférences d'apparence de l'UI web (thème, mode d'affichage). Stockées côté
|
|
// serveur — sur la machine Loki — pour être partagées entre tous les appareils
|
|
// qui pilotent la même instance (téléphone, laptop, accès distant ajean.link).
|
|
// Avant ça, elles ne vivaient qu'en localStorage, donc par navigateur/appareil.
|
|
|
|
var webPrefsMu sync.Mutex
|
|
|
|
// webPrefsAllowed liste les clés de préférence acceptées et, pour chacune, les
|
|
// valeurs valides. On ne stocke que ce qui est connu (pas de champ libre).
|
|
var webPrefsAllowed = map[string]map[string]bool{
|
|
"theme": {"light": true, "dark": true},
|
|
"hide_reasoning": {"0": true, "1": true},
|
|
"hide_tools": {"0": true, "1": true},
|
|
"fold_tools": {"0": true, "1": true},
|
|
"hide_side": {"0": true, "1": true},
|
|
"hide_stats": {"0": true, "1": true},
|
|
}
|
|
|
|
// loadWebPrefs lit les préférences enregistrées (map vide si aucune).
|
|
func loadWebPrefs() map[string]string {
|
|
out := map[string]string{}
|
|
for k, v := range allKV(bkPrefs) {
|
|
out[k] = v
|
|
}
|
|
return out
|
|
}
|
|
|
|
// saveWebPrefs fusionne les valeurs valides de `in` puis enregistre le tout.
|
|
func saveWebPrefs(in map[string]string) (map[string]string, error) {
|
|
webPrefsMu.Lock()
|
|
defer webPrefsMu.Unlock()
|
|
prefs := loadWebPrefs()
|
|
for k, v := range in {
|
|
allowed, ok := webPrefsAllowed[k]
|
|
if !ok {
|
|
continue
|
|
}
|
|
v = strings.ToLower(strings.TrimSpace(v))
|
|
if !allowed[v] {
|
|
continue
|
|
}
|
|
prefs[k] = v
|
|
}
|
|
return prefs, replaceKV(bkPrefs, prefs)
|
|
}
|
|
|
|
// handleWebPrefs expose les préférences d'apparence partagées entre appareils.
|
|
//
|
|
// GET → {ok, prefs:{theme, hide_*, fold_*}}
|
|
// POST {theme?, hide_*?, fold_*?} → fusionne puis renvoie {ok, prefs}
|
|
func handleWebPrefs(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method == http.MethodPost {
|
|
var req map[string]string
|
|
_ = json.NewDecoder(r.Body).Decode(&req)
|
|
prefs, err := saveWebPrefs(req)
|
|
if err != nil {
|
|
sendJSON(w, 500, map[string]any{"ok": false, "error": err.Error()})
|
|
return
|
|
}
|
|
sendJSON(w, 200, map[string]any{"ok": true, "prefs": prefs})
|
|
return
|
|
}
|
|
sendJSON(w, 200, map[string]any{"ok": true, "prefs": loadWebPrefs()})
|
|
}
|