backup: snapshot post-démo GHT 2026-05-19
Some checks failed
tests / Lint (ruff + black) (push) Successful in 1m50s
tests / Tests unitaires (sans GPU) (push) Failing after 1m50s
tests / Tests sécurité (critique) (push) Has been skipped

Backup état complet après enregistrement vidéo démo de bout en bout.
À utiliser comme point de référence pour la consolidation post-démo.

Changements majeurs de la session 18-19 mai :
- AIVA-URGENCE : page autonome avec preset URL + auto-focus chain
- Workflow Demo_urgence_3_db : merge linux_db + steps AIVA + pause humaine NoMachine
- Bypass LLM (static_result / static_text) dans replay_engine
  pour démos déterministes sans appel Ollama
- Fix api_stream:3013 — replay_paused au premier polling /next
- dag_execute : lift duration_ms vers top-level pour wait runtime
- NPM bypass auth /aiva-urgence/ via location ^~ (proxy_host/10.conf hors git)
- scripts/cancel-replays.sh — workaround Stop VWB qui ne purge pas la queue

Anchors visuels (468) forcés dans le commit pour garantir restorabilité.
DB workflows actuelle + ~12 .bak DB de la journée incluses.

Sujets identifiés pour consolidation post-démo (TODO) :
1. Bug VWB recapture anchor ne régénère pas le PNG
2. Léa client accumule état mémoire (restart périodique requis)
3. Stop VWB ne purge pas la queue serveur (lien manquant vers /replay/cancel)
4. Bug coord client mss tronqué 2560x60 → mapping Y cassé
5. delay_before/delay_after ignorés au runtime (fix partiel duration_ms)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-05-19 14:55:06 +02:00
parent f2212e77e3
commit 5ea4960e65
627 changed files with 211348 additions and 169 deletions

View File

@@ -0,0 +1,88 @@
# agent_v1/tools/test_lea_pause_flow.py
"""Smoke test : simuler un lea:paused localement et vérifier la bulle ChatWindow.
À lancer SUR WINDOWS (PC démo) :
cd C:/rpa_vision
.venv\\Scripts\\python.exe -m agent_v1.tools.test_lea_pause_flow
Ce script ouvre une ChatWindow, simule l'arrivée d'un payload paused_need_help
avec un message LONG (350+ chars pour tester le scroll interne), puis attend
les clics utilisateur sur Continuer/Annuler. Le test vérifie qu'il y a UN SEUL
affichage (la bulle chat), pas de toast supplémentaire.
Exit code 0 si succès. Logs dans la console.
"""
import logging
import os
import sys
import time
# Configurer le logging avant tout import du package
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(name)s] %(levelname)s: %(message)s',
)
logger = logging.getLogger("test_lea_pause_flow")
# Forcer le bus feedback (pour que les boutons puissent émettre vers
# rpa-agent-chat — port 5004). Si on ne veut PAS du bus, mettre LEA_FEEDBACK_BUS=0.
os.environ.setdefault("LEA_FEEDBACK_BUS", "1")
os.environ.setdefault("RPA_API_TOKEN", "") # à remplir si serveur exige Bearer
def main() -> int:
try:
from agent_v1.ui.chat_window import ChatWindow
except ImportError as e:
print(f"[TEST] Import ChatWindow KO : {e}")
return 2
print("[TEST] Création ChatWindow...")
cw = ChatWindow(
server_client=None,
on_start_callback=None,
server_host=os.environ.get("RPA_SERVER_HOST", "192.168.1.40"),
chat_port=5004,
)
# Attendre que le tk loop soit prêt
time.sleep(2.0)
cw.show()
time.sleep(0.5)
print("[TEST] Simulation lea:paused avec long message (350 chars)...")
long_msg = (
"Je n'arrive pas à trouver le champ « Numéro de dossier patient » "
"sur l'écran courant. J'ai essayé 3 stratégies de grounding visuel "
"(template matching, OCR, VLM) sans succès. Pouvez-vous me montrer "
"l'emplacement exact du champ, ou cliquer dessus à ma place ? "
"Quand vous avez fini, cliquez sur Continuer pour que je reprenne."
)
payload = {
"replay_id": "test_replay_pause_flow_001",
"workflow": "Démo UHCD",
"reason": long_msg,
"completed": 5,
"total": 12,
}
cw._add_paused_bubble(payload)
print(f"[TEST] Bulle envoyée. Message len={len(long_msg)} chars.")
print("[TEST] Vérifiez visuellement :")
print(" 1) UN SEUL popup (la bulle chat dans la fenêtre Léa)")
print(" 2) Le message long s'affiche en intégralité (scroll interne si besoin)")
print(" 3) Boutons Continuer / Annuler visibles")
print(" 4) Cliquez sur Annuler → bulle fermée + feedback '✗ Annulé'")
print("[TEST] La fenêtre reste ouverte 30s. Ctrl+C pour quitter avant.")
try:
for i in range(30):
time.sleep(1.0)
except KeyboardInterrupt:
print("[TEST] Interruption clavier.")
print("[TEST] Test terminé. Vérifier visuellement les 4 points ci-dessus.")
return 0
if __name__ == "__main__":
sys.exit(main())