mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-19 21:18:20 +02:00
Lot 44 : navigateur piloté tenu par la façade
La façade tient la session Chrome des outils browser_* (src/browser/, port de computer_cdp.go, computer_use.go, browser_grid.go et cu_autoshot.go) : lancement (profil temporaire, mêmes arguments, tué avec la façade), client CDP multiplexé sur websocket, attente du chargement et du calme réseau, scripts injectés copiés à l'octet près, les neuf outils aux textes du Go (snapshot dédoublonné, recherche, clics, saisie et listes déroulantes, touches, défilement, navigation et ses erreurs), capture rangée propre et quadrillée pour le modèle (mêmes pixels), aperçus JPEG en anneau servis par /api/chat/cushot. Un seul navigateur : quand la façade tient la conversation, le Go lui passe les outils de ses sous-agents et tâches IA, ses aperçus et la fermeture (POST /internal/facade/v1/browser) ; façade injoignable, le navigateur du Go prend le relais. Couper l'interrupteur ferme les deux. Parité : journal de 42 étapes tiré du Go contre un faux Chrome (script + faux serveur CDP qui note chaque commande, scripts résumés par leur empreinte, pixels de la grille), rejoué par tests/browser.rs ; un vrai Chromium de bout en bout avec LOKI_CU_SMOKE=1 ; un tour de la façade qui ouvre une page (tests/lot6.rs) ; TestFacadeNavigateur côté Go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
24 files changed
+3910
-11
No files matched your search
@@ -169,6 +169,9 @@ func cuPromptLine() string {
|
||||
// ─── exécution (appelée par le dispatch de llm_client.go) ────────────────────
|
||||
|
||||
func toolCUOpen(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_open", args); ok {
|
||||
return r
|
||||
}
|
||||
url, _ := args["url"].(string)
|
||||
if strings.TrimSpace(url) == "" {
|
||||
return "[erreur] url manquante"
|
||||
@@ -188,6 +191,9 @@ func toolCUOpen(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUSnapshot() string {
|
||||
if r, _, ok := facadeBrowserTool("browser_snapshot", map[string]any{}); ok {
|
||||
return r
|
||||
}
|
||||
s, err := cdpGet()
|
||||
if err != nil {
|
||||
return "[erreur] " + err.Error()
|
||||
@@ -200,6 +206,9 @@ func toolCUSnapshot() string {
|
||||
}
|
||||
|
||||
func toolCUFind(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_find", args); ok {
|
||||
return r
|
||||
}
|
||||
text, _ := args["text"].(string)
|
||||
if strings.TrimSpace(text) == "" {
|
||||
return "[erreur] texte de recherche manquant"
|
||||
@@ -216,6 +225,9 @@ func toolCUFind(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUClick(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_click", args); ok {
|
||||
return r
|
||||
}
|
||||
ref, ok := intArg(args, "ref")
|
||||
if !ok {
|
||||
return "[erreur] ref manquant (numéro de l'élément)"
|
||||
@@ -232,6 +244,9 @@ func toolCUClick(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUType(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_type", args); ok {
|
||||
return r
|
||||
}
|
||||
text, _ := args["text"].(string)
|
||||
s, err := cdpGet()
|
||||
if err != nil {
|
||||
@@ -249,6 +264,9 @@ func toolCUType(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUKey(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_key", args); ok {
|
||||
return r
|
||||
}
|
||||
key, _ := args["key"].(string)
|
||||
s, err := cdpGet()
|
||||
if err != nil {
|
||||
@@ -262,6 +280,9 @@ func toolCUKey(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUClickXY(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_click_xy", args); ok {
|
||||
return r
|
||||
}
|
||||
x, okx := floatArg(args, "x")
|
||||
y, oky := floatArg(args, "y")
|
||||
if !okx || !oky {
|
||||
@@ -279,6 +300,9 @@ func toolCUClickXY(args map[string]any) string {
|
||||
}
|
||||
|
||||
func toolCUScroll(args map[string]any) string {
|
||||
if r, _, ok := facadeBrowserTool("browser_scroll", args); ok {
|
||||
return r
|
||||
}
|
||||
dir, _ := args["direction"].(string)
|
||||
s, err := cdpGet()
|
||||
if err != nil {
|
||||
@@ -299,6 +323,12 @@ func toolCUScroll(args map[string]any) string {
|
||||
// PNG inexistant sur tout le disque (vécu sur le test IONOS, ~12 bash find pour
|
||||
// rien). Avec le chemin en retour, il n'a plus qu'à le donner en lien Markdown.
|
||||
func toolCUScreenshot() (string, map[string]any) {
|
||||
if r, img, ok := facadeBrowserTool("browser_screenshot", map[string]any{}); ok {
|
||||
if len(img) == 0 {
|
||||
img = nil
|
||||
}
|
||||
return r, img
|
||||
}
|
||||
if !visionEnabled() {
|
||||
return "[erreur] la vision n'est pas active sur ce modèle — impossible de capturer l'écran", nil
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user