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

@@ -227,6 +227,9 @@ from .replay_engine import (
_handle_extract_text_action,
_handle_extract_table_action,
_handle_t2a_decision_action,
_handle_llm_generate_action,
_handle_concat_text_vars_action,
_handle_paste_and_execute_action,
_expand_compound_steps,
_pre_check_screen_state as _pre_check_screen_state_impl,
_detect_popup_hint as _detect_popup_hint_impl,
@@ -2946,7 +2949,8 @@ async def get_next_action(session_id: str, machine_id: str = "default"):
if not queue:
return {"action": None, "session_id": session_id, "machine_id": machine_id}
# ── Boucle de traitement : actions serveur (extract_text, t2a_decision)
# ── Boucle de traitement : actions serveur (extract_text, t2a_decision,
# llm_generate)
# exécutées entièrement côté serveur jusqu'à trouver une action visuelle
# à transmettre à l'Agent V1 ou un pause_for_human qui bloque le replay.
action = None
@@ -3006,7 +3010,18 @@ async def get_next_action(session_id: str, machine_id: str = "default"):
owning_replay["status"] = "paused_need_help"
queue.pop(0)
_replay_queues[session_id] = queue
return {"action": None, "session_id": session_id, "machine_id": machine_id}
# Inclure replay_paused/pause_message/replay_id dès ce return
# pour que la bulle Léa s'affiche au PREMIER polling (sinon
# gap 1-2s où le chat est vide). Aligné sur la branche
# target_not_found ligne 2869-2876.
return {
"action": None,
"session_id": session_id,
"machine_id": machine_id,
"replay_paused": True,
"pause_message": owning_replay.get("pause_message", "Validation requise"),
"replay_id": owning_replay["replay_id"],
}
# Mode autonome sans safety_checks → skip (comportement legacy)
logger.info(
@@ -3056,6 +3071,39 @@ async def get_next_action(session_id: str, machine_id: str = "default"):
),
timeout=180,
)
elif type_ == "llm_generate":
await asyncio.wait_for(
loop.run_in_executor(
None,
_handle_llm_generate_action,
action, owning_replay,
),
timeout=180,
)
elif type_ == "_concat_text_vars":
# Action serveur interne (générée par expansion
# extract_text_scroll). Concat 2 vars runtime → 1 var finale.
# Quasi-instantanée (pas de I/O), mais on la gère via le
# même chemin pour cohérence (timeout généreux par sécurité).
await asyncio.wait_for(
loop.run_in_executor(
None,
_handle_concat_text_vars_action,
action, owning_replay,
),
timeout=10,
)
elif type_ == "paste_and_execute":
# Invoque scripts/paste_and_execute_linuxdb.sh
# (Ctrl+V + Ctrl+Enter via ydotool dans la VM).
await asyncio.wait_for(
loop.run_in_executor(
None,
_handle_paste_and_execute_action,
action, owning_replay,
),
timeout=30,
)
except Exception as e:
logger.warning(f"Action serveur {type_} a levé : {e}")
queue.pop(0)