# 🎮 Système de Rejeu de Tâches

## Vue d'ensemble

Le système de rejeu permet de **rejouer automatiquement des tâches apprises** en utilisant la reconnaissance visuelle pour localiser les éléments d'interface, même si leur position a changé.

## Architecture

```
TaskReplayEngine
├── Chargement de tâche (load_task)
├── Recherche visuelle (find_element_visually)
│   ├── Capture d'écran
│   ├── Génération d'embeddings
│   └── Recherche par similarité
├── Exécution d'action (execute_action_at_location)
│   ├── Click
│   ├── Type
│   ├── Scroll
│   └── Drag
└── Monitoring en temps réel
```

## Fonctionnalités

### 1. Rejeu Basique

```python
from core.task_replay import TaskReplayEngine

# Rejouer une tâche
results = await replay_engine.replay_task(
    task_id="task_fc1d3e52",
    interactive=False
)

print(f"Succès: {results['success']}")
print(f"Actions exécutées: {results['executed_actions']}")
```

### 2. Rejeu avec Monitoring

```python
def on_step_completed(step_result):
    print(f"Étape {step_result['step']}: {step_result['status']}")

results = await replay_engine.replay_task_with_monitoring(
    task_id="task_fc1d3e52",
    on_step_completed=on_step_completed
)
```

### 3. Liste des Tâches Disponibles

```python
tasks = replay_engine.list_available_tasks()

for task in tasks:
    print(f"{task['task_name']}: {task['observation_count']} observations")
```

## Reconnaissance Visuelle

### Recherche par Grille

Le système divise l'écran en grille et recherche l'élément dans chaque cellule :

```python
# Grille 4x4 par défaut
grid_size = 4

# Pour chaque cellule :
# 1. Extraire la région
# 2. Générer l'embedding CLIP
# 3. Calculer la similarité avec l'embedding cible
# 4. Retourner les meilleures correspondances
```

### Seuil de Similarité

```yaml
replay:
  similarity_threshold: 0.75  # Minimum pour accepter une correspondance
  max_search_attempts: 3      # Nombre de tentatives
```

## Types d'Actions Supportées

| Type | Description | Paramètres |
|------|-------------|------------|
| `click` | Clic souris | x, y, button |
| `type` | Saisie texte | text, interval |
| `scroll` | Défilement | direction, amount |
| `drag` | Glisser-déposer | start_x, start_y, end_x, end_y |

## Gestion des Variations d'Interface

### Adaptation Automatique

Le système s'adapte aux changements :

1. **Position différente** : Recherche visuelle localise l'élément
2. **Taille différente** : Utilise le centre de la région trouvée
3. **Style différent** : L'embedding CLIP capture la sémantique

### Retry et Fallback

```python
# Retry automatique si élément non trouvé
max_search_attempts = 3

# Délai entre tentatives
retry_delay = 0.5  # secondes
```

## Mode Interactif

En mode interactif, le système demande confirmation avant chaque action :

```python
results = await replay_engine.replay_task(
    task_id="task_fc1d3e52",
    interactive=True  # Demande confirmation
)
```

## Résultats du Rejeu

```python
{
    "task_id": "task_fc1d3e52",
    "success": True,
    "total_actions": 3,
    "executed_actions": 3,
    "failed_actions": 0,
    "actions": [
        {
            "step": 1,
            "success": True,
            "location": {
                "x": 640,
                "y": 360,
                "confidence": 0.89,
                "bbox": [600, 340, 680, 380]
            },
            "action_type": "click"
        },
        # ...
    ]
}
```

## Logging

Tous les événements sont loggés :

```python
# Démarrage du rejeu
{"action": "task_replay_started", "task_id": "...", "interactive": False}

# Élément trouvé
{"action": "element_found", "similarity": 0.89, "attempt": 1}

# Élément non trouvé
{"action": "element_not_found", "step": 2, "signature": "..."}

# Rejeu terminé
{"action": "task_replay_completed", "success": True, "executed": 3, "failed": 0}
```

## Utilisation avec le CLI

```bash
# Lister les tâches disponibles
python test_task_replay.py

# Le script vous guidera pour :
# 1. Voir les tâches disponibles
# 2. Choisir une tâche
# 3. Rejouer avec monitoring en temps réel
```

## Exemple Complet

```python
import asyncio
from core.task_replay import TaskReplayEngine
from core.learning_manager import LearningManager
from core.embeddings_manager import EmbeddingsManager
from core.utils.vision_utils import VisionUtils
from core.utils.input_utils import InputUtils
from core.logger import Logger
from core.config import load_config

async def replay_example():
    # Initialiser
    config = load_config()
    logger = Logger(config)
    embeddings_manager = EmbeddingsManager(logger, config)
    learning_manager = LearningManager(embeddings_manager, logger, config)
    vision_utils = VisionUtils(logger, config)
    input_utils = InputUtils(logger, config)
    
    replay_engine = TaskReplayEngine(
        learning_manager,
        embeddings_manager,
        vision_utils,
        input_utils,
        logger,
        config
    )
    
    # Lister les tâches
    tasks = replay_engine.list_available_tasks()
    print(f"Tâches disponibles: {len(tasks)}")
    
    # Rejouer la première tâche
    if tasks:
        task_id = tasks[0]['task_id']
        results = await replay_engine.replay_task(task_id)
        
        if results['success']:
            print("✅ Tâche rejouée avec succès!")
        else:
            print(f"❌ Échec: {results['failed_actions']} actions échouées")

# Exécuter
asyncio.run(replay_example())
```

## Limitations Actuelles

1. **Recherche par grille** : Peut manquer des petits éléments entre les cellules
2. **Pas de détection d'objets** : Utilise uniquement CLIP pour la similarité
3. **Mode interactif basique** : Pas d'interface graphique pour la confirmation

## Améliorations Futures

- [ ] Recherche multi-échelle (grilles de différentes tailles)
- [ ] Intégration avec OWL-v2 pour détection précise
- [ ] Interface graphique pour le mode interactif
- [ ] Gestion des erreurs avec rollback automatique
- [ ] Support des actions conditionnelles
- [ ] Rejeu parallèle de plusieurs tâches

## Configuration

```yaml
replay:
  similarity_threshold: 0.75      # Seuil de similarité minimum
  max_search_attempts: 3          # Tentatives de recherche
  delay_between_actions: 0.5      # Délai entre actions (secondes)
  grid_size: 4                    # Taille de la grille de recherche
```

## Dépendances

- `numpy` : Calculs d'embeddings
- `PIL` : Manipulation d'images
- `pyautogui` : Capture d'écran et contrôle souris/clavier
- `asyncio` : Exécution asynchrone

## Tests

```bash
# Test complet avec interface interactive
python test_task_replay.py

# Test programmatique
python -c "
import asyncio
from test_task_replay import test_list_tasks
asyncio.run(test_list_tasks())
"
```
