fix(qw4): câblage polling frontend → streaming pour PauseDialog
Avant ce fix, le frontend VWB ne savait pas qu'un replay Agent V1 (Windows) était en pause supervisée : le seul polling (App.tsx) interrogeait /execute/status (exécution locale Linux) et n'avait jamais l'info safety_checks / pause_message du replay distant. Côté backend (dag_execute.py) : - ajout du proxy GET /api/v3/replay/state/<replay_id> qui forward vers /api/v1/traces/stream/replay/<id> avec Bearer token. Côté frontend : - ExecutionControls : nouvelle prop onWindowsReplayStarted, appelée avec le replay_id retourné par /api/v3/execute-windows. - App.tsx : nouveau state streamingReplayId + useEffect qui poll /api/v3/replay/state/<id> toutes les secondes et fusionne status, pause_message, pause_reason, safety_checks dans appState.execution. Le PauseDialog existant s'affiche donc automatiquement quand status = paused_need_help. Le polling s'arrête quand le replay est completed/error/cancelled. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1155,3 +1155,34 @@ def replay_resume_proxy():
|
||||
'detail': f'Streaming server non disponible ({streaming_url})'}), 502
|
||||
except req.RequestException as e:
|
||||
return jsonify({'error': 'streaming_unreachable', 'detail': str(e)}), 502
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# QW4 — Proxy GET /api/v3/replay/state/<replay_id> → streaming /replay/{id}
|
||||
# Forward Bearer token vers le serveur streaming.
|
||||
# Permet à App.tsx de récupérer le state du replay actif (Agent V1 Windows)
|
||||
# pour afficher PauseDialog quand status = paused_need_help avec safety_checks.
|
||||
# ---------------------------------------------------------------------------
|
||||
@api_v3_bp.route('/replay/state/<replay_id>', methods=['GET'])
|
||||
def replay_state_proxy(replay_id):
|
||||
"""Proxy QW4 vers le serveur streaming pour récupérer le state replay actif."""
|
||||
import requests as req
|
||||
|
||||
streaming_url = os.environ.get('RPA_STREAMING_URL', 'http://localhost:5005')
|
||||
token = os.environ.get('RPA_API_TOKEN', '')
|
||||
headers = {}
|
||||
if token:
|
||||
headers['Authorization'] = f'Bearer {token}'
|
||||
|
||||
try:
|
||||
resp = req.get(
|
||||
f'{streaming_url}/api/v1/traces/stream/replay/{replay_id}',
|
||||
headers=headers,
|
||||
timeout=5,
|
||||
)
|
||||
return resp.content, resp.status_code, {'Content-Type': 'application/json'}
|
||||
except req.ConnectionError:
|
||||
return jsonify({'error': 'streaming_unreachable',
|
||||
'detail': f'Streaming server non disponible ({streaming_url})'}), 502
|
||||
except req.RequestException as e:
|
||||
return jsonify({'error': 'streaming_unreachable', 'detail': str(e)}), 502
|
||||
|
||||
Reference in New Issue
Block a user