Repris d'AJEAN : recherche d'images, aperçu du navigateur, vignettes, liens d'images

- web_images (amont v0.17.7) : recherche d'images DuckDuckGo, pendant de
  web_search ; les images du web s'affichent dans le fil avec la loupe, sans
  Referer, et disparaissent si le site les refuse. Schéma minimal pour tenir
  le budget du préambule.
- Aperçu en direct du navigateur piloté (cu_autoshot.go) : une capture après
  chaque action browser_* qui change la page, gardée en RAM, jamais envoyée au
  modèle, retirée du journal en fin de tour ; une carte dans le fil, en fondu.
- Vignettes calculées par le serveur (?thumb=, amont v0.17.9) : ~560 px au
  lieu de l'original (7 Ko au lieu de 550 Ko sur une capture), chargées deux
  par deux avec un nouvel essai ; la loupe ouvre l'original.
- Un lien vers une image ([graphique](graph.png)) l'affiche au lieu d'un
  bouton de téléchargement.
- Chrome du computer use tué avec Loki sous Linux (Pdeathsig), même en cas
  d'arrêt brutal : plus de navigateur orphelin dans le conteneur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-07 10:30:05 +02:00
1 parent 502f23e833
commit 5016396998
20 files changed
+759 -30

No files matched your search

+15
View File
@@ -361,6 +361,21 @@ func handleChatImage(w http.ResponseWriter, r *http.Request) {
sendJSON(w, 404, map[string]any{"ok": false, "error": "fichier introuvable"})
return
}
// Vignette légère (?thumb=<px>) : le fil n'a besoin que de ~560 px, pas
// d'une capture de 3 Mo — en accès distant, chaque image partait en entier
// dans le tunnel chiffré (repris d'AJEAN). Format non décodable ici (webp…) :
// on sert l'original.
if t := r.URL.Query().Get("thumb"); t != "" {
px, _ := strconv.Atoi(t)
if data, mime, err := chatThumb(abs, st, px); err == nil {
w.Header().Set("Content-Type", mime)
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("Content-Security-Policy", "default-src 'none'; sandbox")
w.Header().Set("Cache-Control", "private, max-age=3600")
_, _ = w.Write(data)
return
}
}
f, err := os.Open(abs)
if err != nil {
sendJSON(w, 500, map[string]any{"ok": false, "error": err.Error()})