diff --git a/agent_v0/server_v1/api_stream.py b/agent_v0/server_v1/api_stream.py index 1f2cbf0e1..e8338d144 100644 --- a/agent_v0/server_v1/api_stream.py +++ b/agent_v0/server_v1/api_stream.py @@ -563,6 +563,11 @@ class RawReplayRequest(BaseModel): session_id: str = "" machine_id: Optional[str] = None # Machine cible (multi-machine) task_description: str = "" + # Paramètres runtime du replay (lus dans replay_state.params côté pipeline). + # Notamment execution_mode : "autonomous" (défaut, pause_for_human skippée) + # ou "supervised" (pause_for_human bloque jusqu'à validation humaine via + # PauseDialog VWB). Cf. replay_engine.py / api_stream.py:2964. + params: Optional[Dict[str, Any]] = None class SingleActionRequest(BaseModel): @@ -2137,7 +2142,7 @@ async def start_raw_replay(request: RawReplayRequest): workflow_id=f"free_task:{task[:50]}", session_id=session_id, total_actions=len(actions), - params={}, + params=dict(request.params or {}), machine_id=resolved_machine_id, actions=actions, ) @@ -4411,7 +4416,10 @@ async def resolve_target(request: ResolveTargetRequest): # par le dernier heartbeat avant la cascade _resolve_target_sync. effective_w = request.screen_width effective_h = request.screen_height - if img.height < 200 or img.width < 400: + # Seuil large : un écran moderne fait 2560x1600 ou plus. Tout en dessous + # de 1200x800 est suspect — bug client mss.monitors[1] qui crop sur + # barre des tâches (2560x60), Edge fenêtré (622x856), etc. + if img.height < 800 or img.width < 1200: logger.warning( "[RESOLVE_TARGET] Image client tronquée %dx%d (declared %dx%d) — " "fallback heartbeat full screen", diff --git a/visual_workflow_builder/backend/api_v3/dag_execute.py b/visual_workflow_builder/backend/api_v3/dag_execute.py index cafb291ee..7803a7773 100644 --- a/visual_workflow_builder/backend/api_v3/dag_execute.py +++ b/visual_workflow_builder/backend/api_v3/dag_execute.py @@ -1082,6 +1082,15 @@ def execute_windows(): if not data.get('session_id'): data['session_id'] = 'agent_demo_user' + # Forcer le mode supervisé : pause_for_human DÉCLENCHE au lieu d'être + # skippée. Le médecin valide la décision Léa avant que les saisies + # type_text ne s'exécutent dans l'onglet Codage. Crucial pour la démo + # GHT : Léa propose, humain valide, Léa finalise (cf. workflow Urgence). + # Sans ça, mode "autonomous" par défaut → pause skippée → saisies + # tentées sans validation → désordre visuel. + data.setdefault('params', {}) + data['params'].setdefault('execution_mode', 'supervised') + # Injecter le machine_id pour le ciblage multi-machine. # Cibler la machine Windows la plus récemment active (heartbeat last_activity) # plutôt que la première dans l'ordre arbitraire renvoyé par /machines :