#!/bin/bash # ============================================================ # build_package.sh — Assemble le package Lea pour deploiement Windows # # Produit : Lea_v.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 uniquement les artefacts de build/test. # IMPORTANT : ne PAS exclure les modules Python ui/ (shared_state, chat_window, # capture_server) — ils sont requis par main.py et causent un crash au demarrage # s'ils sont absents. rsync -a \ --exclude='__pycache__' \ --exclude='*.pyc' \ --exclude='.pytest_cache' \ --exclude='sessions/' \ --exclude='logs/*.log' \ --exclude='.hypothesis' \ --exclude='*.md' \ "$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/__init__.py" "$PACKAGE_DIR/lea_ui/" cp "$PROJECT_ROOT/agent_v0/lea_ui/server_client.py" "$PACKAGE_DIR/lea_ui/" echo " lea_ui/ copie (2 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 "" # --------------------------------------------------------------- # 6b. Verification des modules requis # --------------------------------------------------------------- echo "[6b/7] Verification des modules Python requis..." MISSING=0 REQUIRED_FILES=( "agent_v1/__init__.py" "agent_v1/main.py" "agent_v1/config.py" "agent_v1/window_info.py" "agent_v1/window_info_crossplatform.py" "agent_v1/core/__init__.py" "agent_v1/core/captor.py" "agent_v1/core/executor.py" "agent_v1/core/grounding.py" "agent_v1/core/policy.py" "agent_v1/core/recovery.py" "agent_v1/core/system_dialog_guard.py" "agent_v1/core/uia_helper.py" "agent_v1/network/__init__.py" "agent_v1/network/streamer.py" "agent_v1/network/persistent_buffer.py" "agent_v1/session/__init__.py" "agent_v1/session/storage.py" "agent_v1/ui/__init__.py" "agent_v1/ui/shared_state.py" "agent_v1/ui/smart_tray.py" "agent_v1/ui/chat_window.py" "agent_v1/ui/capture_server.py" "agent_v1/ui/notifications.py" "agent_v1/ui/activity_panel.py" "agent_v1/ui/messages.py" "agent_v1/vision/__init__.py" "agent_v1/vision/capturer.py" "agent_v1/vision/blur_sensitive.py" "agent_v1/vision/system_info.py" "agent_v1/monitoring/__init__.py" "lea_ui/__init__.py" "lea_ui/server_client.py" "run_agent_v1.py" ) for req_file in "${REQUIRED_FILES[@]}"; do if [[ ! -f "$PACKAGE_DIR/$req_file" ]]; then echo -e " ${RED}MANQUANT : $req_file${NC}" MISSING=$((MISSING + 1)) fi done if [[ $MISSING -gt 0 ]]; then echo "" echo -e "${RED} ERREUR : $MISSING fichier(s) requis manquant(s) !${NC}" echo -e "${RED} Le package est INCOMPLET — corrigez build_package.sh avant de deployer.${NC}" exit 1 fi echo -e " ${GREEN}Tous les ${#REQUIRED_FILES[@]} fichiers requis sont presents.${NC}" 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}"