Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 14s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped
Pipeline E2E complet validé : Capture VM → streaming → serveur → cleaner → replay → audit trail Mode apprentissage supervisé fonctionne (Léa échoue → humain → reprise) Dashboard : - Cleanup 14→10 onglets (RCE supprimée) - Fleet : enregistrer/révoquer agents, tokens, ZIP pré-configuré téléchargeable - Audit trail MVP (/audit) : filtres, tableau, export CSV, conformité AI Act/RGPD - Formulaire Fleet simplifié (nom + email, machine_id auto) VWB bridge Léa→VWB : - Compound décomposés en N steps (saisie + raccourci visibles) - Layout serpentin 3 colonnes (plus colonne verticale) - Badge OS 🪟/🐧, filtre OS retiré (admin Linux voit Windows) - Fix import SQLite readonly Cleaner intelligent : - Descriptions lisibles (UIA/C2) + détection doublons - Logique C2 : UIElement identifié = jamais parasite - Patterns parasites resserrés - Message Léa : "Je n'y arrive pas, montrez-moi comment faire" Config agent (INC-1 à INC-7) : - SERVER_URL + SERVER_BASE unifiés - RPA_OLLAMA_HOST séparé - allow_redirects=False sur POST - Middleware réécriture URL serveur CI Gitea : fix token + Flask-SocketIO + ruff propre Fleet endpoints : /agents/enroll|uninstall|fleet + agent_registry SQLite Backup : script quotidien workflows.db + audit Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
102 lines
4.0 KiB
Python
102 lines
4.0 KiB
Python
# agent_v1/config.py
|
|
"""
|
|
Configuration avancée pour Agent V1.
|
|
"""
|
|
from __future__ import annotations
|
|
import os
|
|
import platform
|
|
import socket
|
|
from pathlib import Path
|
|
|
|
# --- DPI awareness (DOIT etre appele avant tout import de pynput/mss/tkinter) ---
|
|
# Rend le process DPI-aware sur Windows pour que toutes les API (pynput, mss, pyautogui)
|
|
# travaillent en coordonnees physiques (pixels reels) au lieu de coordonnees logiques
|
|
# (virtualisees par le DPI scaling).
|
|
# Sans cet appel, un ecran 2560x1600 a 150% DPI apparait comme 1707x1067 pour les API,
|
|
# ce qui cause des erreurs de positionnement pendant le replay.
|
|
# Sur Linux/Mac : no-op silencieux.
|
|
# PROCESS_PER_MONITOR_DPI_AWARE = 2 : le niveau le plus precis.
|
|
if platform.system() == "Windows":
|
|
try:
|
|
import ctypes
|
|
ctypes.windll.shcore.SetProcessDpiAwareness(2) # PROCESS_PER_MONITOR_DPI_AWARE
|
|
except Exception:
|
|
try:
|
|
# Fallback pour Windows < 8.1 (API plus ancienne)
|
|
ctypes.windll.user32.SetProcessDPIAware()
|
|
except Exception:
|
|
pass
|
|
|
|
AGENT_VERSION = "1.0.0"
|
|
|
|
# Identifiant unique de la machine (utilisé pour le multi-machine)
|
|
# Configurable via variable d'environnement, sinon auto-généré depuis hostname + OS
|
|
MACHINE_ID = os.environ.get(
|
|
"RPA_MACHINE_ID",
|
|
f"{socket.gethostname()}_{platform.system().lower()}",
|
|
)
|
|
|
|
# Dossier racine de l'agent
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
|
|
# Endpoint du serveur Streaming (port 5005)
|
|
# SERVER_URL contient TOUJOURS /api/v1 à la fin (convention unifiée).
|
|
SERVER_URL = os.getenv("RPA_SERVER_URL", "http://localhost:5005/api/v1")
|
|
# Base sans /api/v1 — pour les routes à la racine (/health)
|
|
SERVER_BASE = SERVER_URL.rsplit("/api/v1", 1)[0]
|
|
UPLOAD_ENDPOINT = f"{SERVER_URL}/traces/upload"
|
|
STREAMING_ENDPOINT = f"{SERVER_URL}/traces/stream"
|
|
|
|
# Host Ollama — SÉPARÉ du serveur RPA.
|
|
# Ollama tourne en local sur la machine serveur, jamais exposé via le reverse proxy.
|
|
# Défaut : localhost (exécution locale ou accès LAN direct).
|
|
OLLAMA_HOST = os.getenv("RPA_OLLAMA_HOST", "localhost")
|
|
|
|
# Token d'authentification API (doit correspondre au token du serveur)
|
|
# Configurable via variable d'environnement RPA_API_TOKEN
|
|
API_TOKEN = os.environ.get("RPA_API_TOKEN", "")
|
|
|
|
# Paramètres de session
|
|
MAX_SESSION_DURATION_S = 60 * 60 # 1 heure
|
|
SESSIONS_ROOT = BASE_DIR / "sessions"
|
|
|
|
# Paramètres Vision (Crops pour la résolution visuelle)
|
|
# 80x80 : assez petit pour être discriminant (icônes), assez grand pour le contexte
|
|
TARGETED_CROP_SIZE = (80, 80)
|
|
SCREENSHOT_QUALITY = 85
|
|
|
|
# Floutage des données sensibles (conformité AI Act)
|
|
# Floute les champs de saisie dans les screenshots AVANT stockage/envoi
|
|
# Désactiver avec RPA_BLUR_SENSITIVE=false pour le développement/tests
|
|
BLUR_SENSITIVE = os.environ.get("RPA_BLUR_SENSITIVE", "true").lower() in ("true", "1", "yes")
|
|
|
|
# Retention des logs — minimum 6 mois (180 jours) requis par le Reglement IA
|
|
# (Article 12 — journalisation automatique, Article 26(6) — conservation minimum)
|
|
# Configurable via variable d'environnement pour permettre l'ajustement
|
|
LOG_RETENTION_DAYS = int(os.environ.get("RPA_LOG_RETENTION_DAYS", "180"))
|
|
|
|
# Monitoring
|
|
PERF_MONITOR_INTERVAL_S = 30
|
|
LOGS_DIR = BASE_DIR / "logs"
|
|
LOG_FILE = LOGS_DIR / "agent_v1.log"
|
|
|
|
# --- Métadonnées système (capturées au chargement du module) ---
|
|
# Utilisées pour la bannière de démarrage et le diagnostic.
|
|
# Import tardif pour éviter les dépendances circulaires.
|
|
try:
|
|
from .vision.system_info import get_dpi_scale, get_os_theme, get_monitor_info
|
|
_monitor_index, _monitors = get_monitor_info()
|
|
_primary = _monitors[0] if _monitors else {"width": 1920, "height": 1080}
|
|
SCREEN_RESOLUTION = (_primary["width"], _primary["height"])
|
|
DPI_SCALE = get_dpi_scale()
|
|
OS_THEME = get_os_theme()
|
|
except Exception:
|
|
# Fallback silencieux si les métadonnées ne sont pas disponibles
|
|
SCREEN_RESOLUTION = (1920, 1080)
|
|
DPI_SCALE = 100
|
|
OS_THEME = "unknown"
|
|
|
|
# Création des dossiers
|
|
os.makedirs(SESSIONS_ROOT, exist_ok=True)
|
|
os.makedirs(LOGS_DIR, exist_ok=True)
|