fix(ORA): overlay = minimiser la fenêtre devant, pas juste chercher OK
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 14s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 9s
tests / Lint (ruff + black) (push) Successful in 14s
tests / Tests unitaires (sans GPU) (push) Failing after 15s
tests / Tests sécurité (critique) (push) Has been skipped

Quand la pré-vérification dit NO et qu'aucun pattern de dialogue n'est
détecté, c'est une fenêtre quelconque qui masque la cible (Chrome, etc).
xdotool windowminimize pour la dégager.

Classification améliorée : pré-check rejeté → OVERLAY_BLOCKING
(avant c'était ELEMENT_NOT_FOUND → scroll inutile).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-22 17:03:18 +02:00
parent 6829ad8e79
commit d71d5df4a8

View File

@@ -759,20 +759,21 @@ Règles:
Returns: Returns:
ErrorType constant. ErrorType constant.
""" """
# Si l'action a échoué avant même de cliquer, c'est ELEMENT_NOT_FOUND # Vérifier TOUJOURS si un dialogue/popup/fenêtre bloque
if not act_success:
print(f"🔎 [ORA/classify] → {ErrorType.ELEMENT_NOT_FOUND} (action non exécutée)")
return ErrorType.ELEMENT_NOT_FOUND
# Vérifier si un dialogue/popup bloque
try: try:
from core.execution.input_handler import check_screen_for_patterns from core.execution.input_handler import check_screen_for_patterns
pattern = check_screen_for_patterns() pattern = check_screen_for_patterns()
if pattern: if pattern:
print(f"🔎 [ORA/classify] → {ErrorType.OVERLAY_BLOCKING} (pattern={pattern.get('pattern', '?')})") print(f"🔎 [ORA/classify] → {ErrorType.OVERLAY_BLOCKING} (pattern={pattern.get('pattern', '?')})")
return ErrorType.OVERLAY_BLOCKING return ErrorType.OVERLAY_BLOCKING
except Exception as e: except Exception:
logger.debug(f"[ORA/classify] check_screen_for_patterns échoué: {e}") pass
# Si l'action a échoué (pré-vérification NO) → probablement une fenêtre devant
if not act_success:
# Le VLM a dit "ce n'est pas le bon élément" → une fenêtre masque la cible
print(f"🔎 [ORA/classify] → {ErrorType.OVERLAY_BLOCKING} (pré-check rejeté = fenêtre devant)")
return ErrorType.OVERLAY_BLOCKING
# Vérifier si l'écran a changé du tout # Vérifier si l'écran a changé du tout
distance = self._phash_distance(pre.phash, post.phash) distance = self._phash_distance(pre.phash, post.phash)
@@ -908,32 +909,25 @@ Règles:
try: try:
from core.execution.input_handler import check_screen_for_patterns, handle_detected_pattern from core.execution.input_handler import check_screen_for_patterns, handle_detected_pattern
# --- Étape 1 : Détecter et identifier le dialogue --- # --- Étape 1 : Détecter un dialogue connu ---
pattern = check_screen_for_patterns() pattern = check_screen_for_patterns()
if not pattern: if pattern:
# Le pattern a peut-être disparu entre la classification et ici print(f"🔧 [ORA/recovery/overlay] Pattern détecté: {pattern.get('pattern', '?')}")
return RecoveryAttempt( handled = handle_detected_pattern(pattern)
error_type=ErrorType.OVERLAY_BLOCKING, if handled:
strategy="pattern_vanished", print(f"✅ [ORA/recovery/overlay] Dialogue fermé")
success=True, time.sleep(0.5)
detail="Le dialogue a disparu spontanément" else:
) print(f"⚠️ [ORA/recovery/overlay] Pattern non géré, minimisation fenêtre")
subprocess.run(['xdotool', 'getactivewindow', 'windowminimize'],
print(f"🔧 [ORA/recovery/overlay] Pattern détecté: {pattern.get('pattern', '?')} → action={pattern.get('action', '?')}") capture_output=True, timeout=2)
time.sleep(0.5)
# --- Étape 2 : Gérer le dialogue (cliquer OK/Fermer) --- else:
handled = handle_detected_pattern(pattern) # Pas de dialogue connu → fenêtre quelconque devant → minimiser
if not handled: print(f"🔧 [ORA/recovery/overlay] Aucun dialogue connu — minimisation de la fenêtre active")
print(f"⚠️ [ORA/recovery/overlay] Impossible de gérer le pattern automatiquement") subprocess.run(['xdotool', 'getactivewindow', 'windowminimize'],
return RecoveryAttempt( capture_output=True, timeout=2)
error_type=ErrorType.OVERLAY_BLOCKING, time.sleep(0.5)
strategy="handle_failed",
success=False,
detail=f"Pattern '{pattern.get('pattern', '?')}' détecté mais non géré"
)
print(f"✅ [ORA/recovery/overlay] Dialogue fermé")
time.sleep(0.5)
# --- Étape 3 : Retry l'action originale --- # --- Étape 3 : Retry l'action originale ---
act_ok = self.act(decision, step_params) act_ok = self.act(decision, step_params)