Historique : plusieurs discussions, et mise à jour par l'image en conteneur

L'amont ne connaît qu'un fil unique (bkChat/conversation) que « clear chat »
effaçait définitivement. On garde toute la machinerie (un seul conv en
mémoire, mêmes flux SSE, même compactage) mais rangée par discussion :

  bkChat/index      liste des discussions (métadonnées seules)
  bkChat/active     discussion ouverte, partagée par tous les appareils
  bkChat/conv:<id>  état complet d'une discussion

Basculer réutilise le mécanisme d'epoch du reset : les abonnés SSE reçoivent
{reset:true} et rejouent le nouveau fil — aucun code de rendu à toucher. Le
fil unique existant est repris comme première discussion au premier
démarrage, et sa clé d'origine est laissée intacte.

- routes /api/conversations (liste, new, switch, rename, delete)
- barre latérale : liste (titre déduit du 1er message, date, nb d'échanges),
  bouton +, renommer, supprimer ; lignes construites en DOM et non en
  innerHTML, les titres venant de messages utilisateur
- suppression de la dernière discussion : convCreate et non convNew, qui
  aurait réenregistré celle qu'on vient d'effacer

Le bouton « Vérifier les mises à jour » répondait « GitHub a répondu 404 » :
il interrogeait les releases du dépôt du fork, qui n'en publie aucune. En
conteneur, remplacer le binaire n'a de toute façon pas de sens — l'UI, l'API
et la CLI renvoient désormais « docker compose pull ».

Vérifié en conteneur : création, bascule, renommage (titre accentué avec
< > &), suppression de l'active puis de la dernière ; /api/update et
loki update renvoient la note Docker.
This commit is contained in:
Loki committed 2026-08-15 11:07:45 +00:00
1 parent 1f24d8ccf5
commit 2fbf86cdde
12 files changed
+586 -17

No files matched your search

+21
View File
@@ -239,6 +239,10 @@ func cmdUpdate(args []string) error {
checkOnly = true
}
}
if containerManaged() {
fmt.Println(containerUpdateNote)
return nil
}
fmt.Println("recherche de la dernière version…")
info, err := checkForUpdate()
if err != nil {
@@ -422,8 +426,21 @@ func cleanupOldBinary() {
removeOldBinaries(filepath.Join(filepath.Dir(exe), "loki.exe"))
}
// containerManaged : le binaire appartient à l'image Docker, la mise à jour
// passe donc par elle (docker compose pull) et non par un remplacement du
// fichier — que l'image, en lecture seule à l'exécution, ne permettrait pas.
// Sans ce garde-fou, l'UI interrogeait les releases GitHub du dépôt du fork,
// qui n'en publie aucune : « GitHub a répondu 404 Not Found ».
func containerManaged() bool { return os.Getenv("LOKI_CONTAINER") == "1" }
const containerUpdateNote = "Mise à jour par l'image Docker : docker compose pull && docker compose up -d"
// handleUpdateCheck (GET /api/update) : renvoie l'état de mise à jour pour l'UI.
func handleUpdateCheck(w http.ResponseWriter, r *http.Request) {
if containerManaged() {
sendJSON(w, 200, map[string]any{"current": Version, "available": false, "note": containerUpdateNote})
return
}
info, err := checkForUpdate()
if err != nil {
sendJSON(w, 200, map[string]any{"current": Version, "available": false, "error": err.Error()})
@@ -437,6 +454,10 @@ func handleUpdateCheck(w http.ResponseWriter, r *http.Request) {
// d'UI (loki-ui : il sert l'UI, le chat et le tunnel) pour appliquer la MAJ sans
// avoir à SSH — voir restartAfterUpdate. Renvoie la version + le message de statut.
func handleUpdateApply(w http.ResponseWriter, r *http.Request) {
if containerManaged() {
sendJSON(w, 409, map[string]any{"ok": false, "error": containerUpdateNote})
return
}
newVer, err := applyUpdate()
if err != nil {
// 500 : un client script peut tester le statut HTTP ; l'UI, elle, lit le JSON.