Files
rpa_vision_v3/agent_rust
Dom d5deac3029 feat: replay visuel VLM-first, worker séparé, package Léa, AZERTY, sécurité HTTPS
Pipeline replay visuel :
- VLM-first : l'agent appelle Ollama directement pour trouver les éléments
- Template matching en fallback (seuil strict 0.90)
- Stop immédiat si élément non trouvé (pas de clic blind)
- Replay depuis session brute (/replay-session) sans attendre le VLM
- Vérification post-action (screenshot hash avant/après)
- Gestion des popups (Enter/Escape/Tab+Enter)

Worker VLM séparé :
- run_worker.py : process distinct du serveur HTTP
- Communication par fichiers (_worker_queue.txt + _replay_active.lock)
- Le serveur HTTP ne fait plus jamais de VLM → toujours réactif
- Service systemd rpa-worker.service

Capture clavier :
- raw_keys (vk + press/release) pour replay exact indépendant du layout
- Fix AZERTY : ToUnicodeEx + AltGr detection
- Enter capturé comme \n, Tab comme \t
- Filtrage modificateurs seuls (Ctrl/Alt/Shift parasites)
- Fusion text_input consécutifs, dédup key_combo

Sécurité & Internet :
- HTTPS Let's Encrypt (lea.labs + vwb.labs.laurinebazin.design)
- Token API fixe dans .env.local
- HTTP Basic Auth sur VWB
- Security headers (HSTS, CSP, nosniff)
- CORS domaines publics, plus de wildcard

Infrastructure :
- DPI awareness (SetProcessDpiAwareness) Python + Rust
- Métadonnées système (dpi_scale, window_bounds, monitors, os_theme)
- Template matching multi-scale [0.5, 2.0]
- Résolution dynamique (plus de hardcode 1920x1080)
- VLM prefill fix (47x speedup, 3.5s au lieu de 180s)

Modules :
- core/auth/ : credential vault (Fernet AES), TOTP (RFC 6238), auth handler
- core/federation/ : LearningPack export/import anonymisé, FAISS global
- deploy/ : package Léa (config.txt, Lea.bat, install.bat, LISEZMOI.txt)

UX :
- Filtrage OS (VWB + Chat montrent que les workflows de l'OS courant)
- Bibliothèque persistante (cache local + SQLite)
- Clustering hybride (titre fenêtre + DBSCAN)
- EdgeConstraints + PostConditions peuplés
- GraphBuilder compound actions (toutes les frappes)

Agent Rust :
- Token Bearer auth (network.rs)
- sysinfo.rs (DPI, résolution, window bounds via Win32 API)
- config.txt lu automatiquement
- Support Chrome/Brave/Firefox (pas que Edge)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 10:19:18 +01:00
..

RPA Vision Agent (Rust) — Phases 1-5

Agent complet pour RPA Vision V3, ecrit en Rust. Parite fonctionnelle avec l'agent Python (agent_v0/agent_v1/) en un seul executable de 2.4 Mo.

Fonctionnalites

Phase 1 — Agent minimal (headless)

  • Heartbeat : capture ecran toutes les 5s, JPEG, dedup par hash perceptuel
  • Replay : poll serveur, execute actions (click, type, key_combo, scroll, wait)
  • Resolution visuelle : resolution de cibles via le serveur (template matching)
  • Serveur de capture : port 5006 (GET /capture, GET /health, POST /file-action)

Phase 3 — Systray + Notifications

  • Systray : icone avec cercle colore (gris=idle, rouge=enregistrement, vert=connecte, bleu=replay)
  • Menu contextuel : Machine ID, statut, Apprenez-moi, C'est termine, Mes taches, ARRET D'URGENCE, Chat, Fichiers, Quitter
  • Notifications toast : via winrt-notification (bienvenue, session, replay, connexion)
  • Etat partage : thread-safe via AtomicBool + Mutex

Phase 4 — Chat WebView2

  • WebView2 : fenetre 520x720, charge http://{server}:5004/chat
  • Positionnement : bas-droite pres du systray
  • Fallback : HTML embarque si le serveur est indisponible
  • Toggle : show/hide via menu systray

Phase 5 — Parite complete

  • Enregistrement : capture evenements souris/clavier via rdev, envoi au serveur
  • Floutage : detection de champs de saisie + blur gaussien (protection donnees sensibles)
  • Configuration : BLUR_SENSITIVE, LOG_RETENTION_DAYS, CHAT_PORT
  • Health check : verification connexion serveur toutes les 30s

Build

Linux (pour tests)

sudo apt install libpipewire-0.3-dev libclang-dev libgbm-dev libxdo-dev
cargo build --release

Cross-compilation vers Windows

rustup target add x86_64-pc-windows-gnu
sudo apt install gcc-mingw-w64-x86-64
cargo build --release --target x86_64-pc-windows-gnu

Deploiement sur le PC cible

sshpass -p 'loli' scp -o StrictHostKeyChecking=no \
  target/x86_64-pc-windows-gnu/release/rpa-agent.exe \
  dom@192.168.1.11:"C:\\rpa_vision\\rpa-agent.exe"

Configuration

Variable Defaut Description
RPA_SERVER_URL http://localhost:5005/api/v1 URL du serveur streaming
RPA_MACHINE_ID {hostname}_{os} Identifiant de la machine
RPA_CAPTURE_PORT 5006 Port du serveur de capture
RPA_HEARTBEAT_INTERVAL 5 Intervalle heartbeat (secondes)
RPA_JPEG_QUALITY 85 Qualite JPEG (1-100)
RPA_BLUR_SENSITIVE true Flouter les zones sensibles
RPA_LOG_RETENTION_DAYS 180 Retention des logs (jours)
RPA_CHAT_PORT 5004 Port du serveur de chat

Architecture

src/
├── main.rs           — Orchestrateur, 7 threads (heartbeat, replay, serveur, health, recorder, chat, tray)
├── config.rs         — Configuration (env vars + defauts)
├── state.rs          — Etat partage thread-safe (AtomicBool, Mutex)
├── capture.rs        — Capture ecran (xcap), JPEG, hash perceptuel
├── network.rs        — Client HTTP (heartbeat, poll replay, rapport resultat)
├── replay.rs         — Boucle de polling replay avec notifications
├── executor.rs       — Execution actions (click, type, key_combo, scroll, wait)
├── visual.rs         — Resolution visuelle des cibles via le serveur
├── server.rs         — Mini serveur HTTP port 5006 (/capture, /health, /file-action)
├── tray.rs           — Icone systray + menu contextuel (tray-icon, winit)
├── notifications.rs  — Notifications toast Windows (winrt-notification)
├── chat.rs           — Fenetre de chat WebView2 (wry)
├── recorder.rs       — Capture evenements souris/clavier (rdev)
└── blur.rs           — Floutage zones sensibles (detection + box blur)

Taille du binaire

Configuration Taille
Release (LTO + strip + opt-level z) 2.4 Mo
Python equivalent (venv + packages) ~200 Mo

Compatibilite

  • OS : Windows 10/11 (systray, notifications, chat WebView2)
  • Fallback Linux : mode console (heartbeat, replay, serveur)
  • Serveur : compatible api_stream.py (port 5005)