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>
This commit is contained in:
166
deploy/build_package.sh
Executable file
166
deploy/build_package.sh
Executable file
@@ -0,0 +1,166 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# build_package.sh — Assemble le package Lea pour deploiement Windows
|
||||
#
|
||||
# Produit : Lea_v<version>.zip (< 5 MB sans venv)
|
||||
#
|
||||
# Usage :
|
||||
# ./deploy/build_package.sh # Package standard
|
||||
# ./deploy/build_package.sh --clean # Nettoyer avant de builder
|
||||
#
|
||||
# Le zip contient tout ce qu'il faut pour un deploiement :
|
||||
# - install.bat (premiere installation)
|
||||
# - Lea.bat (lancement quotidien)
|
||||
# - config.txt (parametres serveur)
|
||||
# - LISEZMOI.txt (documentation utilisateur)
|
||||
# - Code Python de l'agent
|
||||
# ============================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Couleurs pour les messages
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Repertoire racine du projet
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
# Version (lue depuis config.py de l'agent)
|
||||
VERSION=$(grep -oP 'AGENT_VERSION\s*=\s*"([^"]+)"' "$PROJECT_ROOT/agent_v0/agent_v1/config.py" | grep -oP '"[^"]+"' | tr -d '"' || echo "1.0.0")
|
||||
|
||||
# Dossier de sortie
|
||||
BUILD_DIR="$SCRIPT_DIR/build"
|
||||
PACKAGE_DIR="$BUILD_DIR/Lea"
|
||||
OUTPUT_ZIP="$SCRIPT_DIR/Lea_v${VERSION}.zip"
|
||||
|
||||
echo -e "${GREEN}============================================================${NC}"
|
||||
echo -e "${GREEN} Build du package Lea v${VERSION}${NC}"
|
||||
echo -e "${GREEN}============================================================${NC}"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Option --clean
|
||||
# ---------------------------------------------------------------
|
||||
if [[ "${1:-}" == "--clean" ]]; then
|
||||
echo -e "${YELLOW}Nettoyage du build precedent...${NC}"
|
||||
rm -rf "$BUILD_DIR"
|
||||
rm -f "$SCRIPT_DIR"/Lea_v*.zip
|
||||
echo " OK"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 1. Creer le dossier de build
|
||||
# ---------------------------------------------------------------
|
||||
echo "[1/7] Preparation du dossier de build..."
|
||||
rm -rf "$PACKAGE_DIR"
|
||||
mkdir -p "$PACKAGE_DIR"
|
||||
echo " $PACKAGE_DIR cree"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 2. Copier les fichiers de deploiement (bat, config, readme)
|
||||
# ---------------------------------------------------------------
|
||||
echo "[2/7] Copie des fichiers de deploiement..."
|
||||
cp "$SCRIPT_DIR/lea_package/Lea.bat" "$PACKAGE_DIR/"
|
||||
cp "$SCRIPT_DIR/lea_package/install.bat" "$PACKAGE_DIR/"
|
||||
cp "$SCRIPT_DIR/lea_package/config.txt" "$PACKAGE_DIR/"
|
||||
cp "$SCRIPT_DIR/lea_package/LISEZMOI.txt" "$PACKAGE_DIR/"
|
||||
cp "$SCRIPT_DIR/lea_package/requirements_agent.txt" "$PACKAGE_DIR/"
|
||||
echo " 5 fichiers copies"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 3. Copier le point d'entree
|
||||
# ---------------------------------------------------------------
|
||||
echo "[3/7] Copie du point d'entree..."
|
||||
cp "$PROJECT_ROOT/agent_v0/run_agent_v1.py" "$PACKAGE_DIR/"
|
||||
echo " run_agent_v1.py copie"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 4. Copier le package agent_v1 (code Python)
|
||||
# ---------------------------------------------------------------
|
||||
echo "[4/7] Copie du code agent_v1..."
|
||||
# Copier tout le dossier en excluant les fichiers inutiles
|
||||
rsync -a \
|
||||
--exclude='__pycache__' \
|
||||
--exclude='*.pyc' \
|
||||
--exclude='.pytest_cache' \
|
||||
--exclude='sessions/' \
|
||||
--exclude='logs/*.log' \
|
||||
--exclude='.hypothesis' \
|
||||
"$PROJECT_ROOT/agent_v0/agent_v1/" \
|
||||
"$PACKAGE_DIR/agent_v1/"
|
||||
|
||||
# Creer les dossiers necessaires (vides)
|
||||
mkdir -p "$PACKAGE_DIR/agent_v1/sessions"
|
||||
mkdir -p "$PACKAGE_DIR/agent_v1/logs"
|
||||
|
||||
echo " agent_v1/ copie ($(find "$PACKAGE_DIR/agent_v1" -name "*.py" | wc -l) fichiers Python)"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 5. Copier le module lea_ui (client serveur pour le chat)
|
||||
# ---------------------------------------------------------------
|
||||
echo "[5/7] Copie du module lea_ui..."
|
||||
mkdir -p "$PACKAGE_DIR/lea_ui"
|
||||
cp "$PROJECT_ROOT/agent_v0/lea_ui/"*.py "$PACKAGE_DIR/lea_ui/"
|
||||
echo " lea_ui/ copie ($(ls "$PACKAGE_DIR/lea_ui/"*.py | wc -l) fichiers)"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 6. Copier le __init__.py racine (pour les imports relatifs)
|
||||
# ---------------------------------------------------------------
|
||||
echo "[6/7] Configuration des packages Python..."
|
||||
# Le __init__.py au niveau racine du package (agent_v0 level)
|
||||
# n'est PAS necessaire car run_agent_v1.py est au meme niveau que agent_v1/
|
||||
# Mais lea_ui est importe avec un import relatif depuis agent_v1/main.py
|
||||
# via `from ..lea_ui.server_client import LeaServerClient`
|
||||
# Cet import fonctionne uniquement si l'arborescence est un package.
|
||||
# Or, dans le deploiement, lea_ui est au meme niveau que agent_v1,
|
||||
# et le fallback dans main.py fait `from lea_ui.server_client import LeaServerClient`
|
||||
# qui fonctionne car run_agent_v1.py ajoute current_dir au sys.path.
|
||||
echo " Structure d'imports verifiee"
|
||||
echo ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 7. Creer le zip
|
||||
# ---------------------------------------------------------------
|
||||
echo "[7/7] Creation du zip..."
|
||||
cd "$BUILD_DIR"
|
||||
rm -f "$OUTPUT_ZIP"
|
||||
zip -r "$OUTPUT_ZIP" "Lea/" -x "Lea/.venv/*" "Lea/__pycache__/*" "Lea/*/__pycache__/*"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Taille du zip
|
||||
ZIP_SIZE=$(du -h "$OUTPUT_ZIP" | cut -f1)
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}============================================================${NC}"
|
||||
echo -e "${GREEN} Build termine !${NC}"
|
||||
echo -e "${GREEN}============================================================${NC}"
|
||||
echo ""
|
||||
echo " Package : $OUTPUT_ZIP"
|
||||
echo " Taille : $ZIP_SIZE"
|
||||
echo " Version : $VERSION"
|
||||
echo ""
|
||||
echo " Contenu du package :"
|
||||
echo " --------------------"
|
||||
echo ""
|
||||
|
||||
# Lister le contenu du zip (structure lisible)
|
||||
unzip -l "$OUTPUT_ZIP" | tail -n +4 | head -n -2 | awk '{print " " $4}'
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW} Deploiement :${NC}"
|
||||
echo " 1. Copier le zip sur le PC Windows du collaborateur"
|
||||
echo " 2. Dezipper dans un dossier (ex: C:\\Lea)"
|
||||
echo " 3. Editer config.txt si besoin (adresse serveur, token)"
|
||||
echo " 4. Double-cliquer install.bat (une seule fois)"
|
||||
echo " 5. Double-cliquer Lea.bat pour lancer"
|
||||
echo ""
|
||||
echo -e "${GREEN}============================================================${NC}"
|
||||
Reference in New Issue
Block a user