mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-12 01:37:06 +02:00
- 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>
48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
package loki
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/color"
|
|
"image/png"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestChatThumbReduitEtCache(t *testing.T) {
|
|
dir := t.TempDir()
|
|
p := filepath.Join(dir, "capture.png")
|
|
src := image.NewNRGBA(image.Rect(0, 0, 2400, 1500))
|
|
x := uint32(1)
|
|
for i := range src.Pix { // bruit : se comprime comme une photo, pas comme un motif
|
|
x ^= x << 13
|
|
x ^= x >> 17
|
|
x ^= x << 5
|
|
src.Pix[i] = byte(x)
|
|
}
|
|
src.Set(0, 0, color.NRGBA{0, 0, 0, 0})
|
|
var buf bytes.Buffer
|
|
_ = png.Encode(&buf, src)
|
|
_ = os.WriteFile(p, buf.Bytes(), 0o644)
|
|
st, _ := os.Stat(p)
|
|
data, mime, err := chatThumb(p, st, 560)
|
|
if err != nil || mime != "image/jpeg" {
|
|
t.Fatalf("vignette : %v %s", err, mime)
|
|
}
|
|
img, _, err := image.Decode(bytes.NewReader(data))
|
|
if err != nil || img.Bounds().Dx() != 560 {
|
|
t.Fatalf("taille inattendue : %v %v", err, img.Bounds())
|
|
}
|
|
if len(data) >= buf.Len() {
|
|
t.Fatalf("vignette (%d o) pas plus légère que l'original (%d o)", len(data), buf.Len())
|
|
}
|
|
again, _, _ := chatThumb(p, st, 560)
|
|
if &again[0] != &data[0] {
|
|
t.Fatal("la 2e demande aurait dû venir du cache")
|
|
}
|
|
if _, _, err := chatThumb(filepath.Join(dir, "x.webp"), st, 560); err == nil {
|
|
t.Fatal("un fichier illisible doit renvoyer une erreur (repli client sur l'original)")
|
|
}
|
|
}
|