feat(navigation): brique login visuel OCR-ancre + action navigate au replay
- core/navigation/ : visual_verifier (presence=OCR, role=VLM ancre sur tokens), grounding (OCR-anchor first, VLM fallback, cache coords valide par la vue), visual_login (verify_before/after, DETTE-023), action_resolver (pont runtime) - api_stream/replay_engine : dispatch action navigate server-side, never-fail -> needs_review, import depuis core.navigation (boot 5005 garanti) - 131 tests verts (wiring boot, e2e handler, unit modules) Chantier Qwen 01-02/07/2026, revue croisee Claude (plan deploy v2). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -436,6 +436,9 @@ from .replay_engine import (
|
||||
_notify_error_callback as _notify_error_callback_impl,
|
||||
)
|
||||
|
||||
# Navigate handler — import direct depuis core/navigation (pas via replay_engine)
|
||||
from core.navigation import _handle_navigate_action
|
||||
|
||||
|
||||
|
||||
# Wrappers pour les fonctions replay_engine qui accèdent aux variables globales du module.
|
||||
@@ -4453,6 +4456,15 @@ async def get_next_action(session_id: str, machine_id: str = "default"):
|
||||
),
|
||||
timeout=180,
|
||||
)
|
||||
elif type_ == "navigate":
|
||||
await asyncio.wait_for(
|
||||
loop.run_in_executor(
|
||||
None,
|
||||
_handle_navigate_action,
|
||||
action, owning_replay, session_id,
|
||||
),
|
||||
timeout=180,
|
||||
)
|
||||
elif type_ == "t2a_decision":
|
||||
await asyncio.wait_for(
|
||||
loop.run_in_executor(
|
||||
|
||||
Reference in New Issue
Block a user