Files
Geniusia_v2/.kiro/specs/gui-logs-improvement/design.md
2026-03-05 00:20:25 +01:00

401 lines
12 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Design - Amélioration GUI et Logs
## Overview
Ce document décrit l'architecture et le design de la nouvelle interface utilisateur minimaliste et du système de logs amélioré pour GeniusIA v2.
## Architecture
```
┌─────────────────────────────────────────────────────────┐
│ Main Application │
└────────────────┬────────────────────────────────────────┘
┌────────┴────────┐
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ Orchestrator │ │ Improved GUI │
│ │ │ │
│ - Détecte │──│ - System Tray │
│ - Apprend │ │ - Logs Panel │
│ - Suggère │ │ - Popups │
└──────┬───────┘ └──────────────────┘
┌──────────────┐
│ HumanLogger │
│ │
│ - Messages │
│ - Formatting │
└──────────────┘
```
## Components and Interfaces
### 1. HumanLogger
Classe pour générer des messages lisibles par l'utilisateur.
```python
class HumanLogger:
"""
Logger qui génère des messages simples pour l'utilisateur.
"""
def log_observation(self, action_type: str, window: str):
"""Log une action observée."""
return f"👀 Action dans {window}"
def log_pattern_detected(self, repetitions: int, task_name: str):
"""Log un pattern détecté."""
return f"🎯 Pattern détecté: {task_name} (répété {repetitions}x)"
def log_workflow_learned(self, task_name: str, count: int):
"""Log un workflow appris."""
return f"📚 Workflow appris: {task_name} ({count} observations)"
def log_mode_change(self, old_mode: str, new_mode: str):
"""Log un changement de mode."""
return f"✅ Mode {new_mode} activé"
def log_finetuning_started(self, num_examples: int):
"""Log le début du fine-tuning."""
return f"🧠 Amélioration du modèle ({num_examples} exemples)..."
def log_finetuning_completed(self, duration: float):
"""Log la fin du fine-tuning."""
return f"✅ Modèle amélioré (en {duration:.1f}s)"
```
### 2. ImprovedGUI
Interface minimaliste avec system tray.
#### Layout Principal
```
┌─────────────────────────────────────┐
│ GeniusIA v2 [_][X]│
├─────────────────────────────────────┤
│ │
│ Mode: 👀 Observation │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 📊 Activité: │
│ • 12 actions observées │
│ • 2 patterns détectés │
│ │
│ 🧠 Fine-tuning: │
│ • 8/10 exemples collectés │
│ │
├─────────────────────────────────────┤
│ 📝 Journal: │
│ ┌─────────────────────────────────┐│
│ │14:23 👀 J'observe... ││
│ │14:24 🎯 Pattern: Calculer 9/9 ││
│ │14:24 📚 J'apprends... ││
│ │14:25 💡 Prêt à suggérer ││
│ │14:26 ✅ Mode Suggestions activé ││
│ └─────────────────────────────────┘│
│ │
│ [Pause] [Arrêter] │
└─────────────────────────────────────┘
```
#### System Tray
```
Icône dans la barre: 🤖
Menu clic droit:
┌─────────────────────┐
│ 🤖 GeniusIA v2 │
├─────────────────────┤
│ 👀 Mode: Shadow │
│ 📊 12 actions │
├─────────────────────┤
│ Afficher │
│ Masquer │
│ ───────────────── │
│ Quitter │
└─────────────────────┘
```
#### Popup Interactif
```
┌─────────────────────────────────────────┐
│ 💡 J'ai une idée ! │
│ │
│ J'ai remarqué que vous faites souvent: │
│ "Calculer 9/9 dans la calculatrice" │
│ │
│ Est-ce que je peux essayer de vous │
│ suggérer cette action la prochaine │
│ fois ? │
│ │
│ [Oui, essaie !] [Non, continue] │
│ │
│ ⏱️ Fermeture auto dans 10s │
└─────────────────────────────────────────┘
```
### 3. LogsPanel
Widget pour afficher les logs avec scroll.
```python
class LogsPanel(QWidget):
"""
Panneau d'affichage des logs avec scroll.
- Affiche 5 dernières actions
- Scrollable jusqu'à 30
- Auto-scroll si en bas
- Format: HH:MM emoji Message
"""
def add_log(self, message: str, emoji: str = ""):
"""Ajoute un log avec timestamp."""
pass
def clear(self):
"""Efface tous les logs."""
pass
def get_logs(self) -> List[str]:
"""Retourne l'historique."""
pass
```
### 4. InteractiveDialog
Popup pour dialogues avec timeout.
```python
class InteractiveDialog(QDialog):
"""
Dialogue interactif avec timeout automatique.
- Non-bloquant (l'app continue)
- Timeout 10 secondes
- Callbacks pour réponses
"""
def __init__(
self,
title: str,
message: str,
on_accept: Callable,
on_reject: Callable,
timeout: int = 10
):
pass
```
## Data Models
### LogMessage
```python
@dataclass
class LogMessage:
"""Message de log pour affichage."""
timestamp: datetime
emoji: str
message: str
level: str # 'info', 'success', 'warning', 'error'
technical_details: Optional[str] = None # Pour logs techniques
```
### GUIState
```python
@dataclass
class GUIState:
"""État de la GUI."""
mode: str # 'shadow', 'assist', 'auto'
is_running: bool
actions_count: int
patterns_count: int
workflows_count: int
finetuning_status: Optional[str] # None, 'collecting', 'training', 'completed'
finetuning_progress: Optional[int] # 0-100 ou None
```
## Error Handling
### Erreurs GUI
- **Erreur d'affichage** : Logger et continuer sans GUI
- **Erreur system tray** : Fallback vers fenêtre normale
- **Erreur popup** : Logger et utiliser notification simple
### Erreurs Logs
- **Fichier de log inaccessible** : Créer nouveau fichier avec timestamp
- **Disque plein** : Nettoyer anciens logs automatiquement
- **Permission refusée** : Logger dans /tmp en fallback
## Testing Strategy
### Unit Tests
- Test HumanLogger : Vérifier format des messages
- Test LogsPanel : Vérifier scroll et limite 30
- Test InteractiveDialog : Vérifier timeout
- Test GUIState : Vérifier mise à jour
### Integration Tests
- Test Orchestrator → GUI : Vérifier envoi de messages
- Test Popup → Orchestrator : Vérifier callbacks
- Test System Tray : Vérifier menu et actions
### Manual Tests
- Test sur Ubuntu : Vérifier system tray et thème
- Test avec actions répétitives : Vérifier détection
- Test timeout : Vérifier fermeture auto après 10s
## Correctness Properties
*A property is a characteristic or behavior that should hold true across all valid executions of a system.*
### Property 1: Log History Bounds
*For any* sequence of log messages, the visible history should never exceed 30 messages.
**Validates: Requirements 3.3**
### Property 2: Timeout Consistency
*For any* interactive dialog, if no user response is received within 10 seconds, the dialog should close automatically.
**Validates: Requirements 4.3**
### Property 3: Mode Display Consistency
*For any* mode change, the GUI should display the correct mode icon and label within 100ms.
**Validates: Requirements 5.1**
### Property 4: Message Ordering
*For any* sequence of events, the logs should appear in chronological order.
**Validates: Requirements 2.1, 2.2, 2.3, 2.4**
### Property 5: Non-blocking Dialogs
*For any* interactive dialog displayed, the Orchestrator should continue processing events.
**Validates: Requirements 4.2**
## Implementation Notes
### PyQt5 Signals
Utiliser des signaux Qt pour communication thread-safe :
```python
class GUISignals(QObject):
"""Signaux pour communication Orchestrator → GUI."""
log_message = pyqtSignal(str, str) # (emoji, message)
update_stats = pyqtSignal(dict) # GUIState
show_dialog = pyqtSignal(str, str, object, object) # (title, msg, on_accept, on_reject)
mode_changed = pyqtSignal(str) # nouveau mode
```
### System Tray Ubuntu
Utiliser `QSystemTrayIcon` avec fallback si non supporté :
```python
if QSystemTrayIcon.isSystemTrayAvailable():
self.tray_icon = QSystemTrayIcon(QIcon.fromTheme("robot"))
self.tray_icon.setToolTip("GeniusIA v2")
else:
# Fallback: fenêtre normale
self.setWindowFlags(Qt.Window)
```
### Logs Techniques
Format structuré pour parsing facile :
```
2024-11-20 14:23:45.123 [INFO] EventCapture: Mouse click at (450, 320) in "Calculator"
2024-11-20 14:23:46.456 [DEBUG] SessionManager: Action added to session_001
2024-11-20 14:24:12.789 [INFO] WorkflowDetector: Pattern detected (3 repetitions)
```
### Performance
- Logs GUI : Max 30 messages en mémoire
- Logs fichier : Rotation à 10MB
- Mise à jour GUI : Max 10 fois/seconde
- Popups : Timeout 10s pour éviter accumulation
## UI/UX Considerations
### Discrétion
- Fenêtre petite (300x400px)
- Minimisable
- System tray toujours visible
- Pas de sons
### Clarté
- Messages courts (max 50 caractères)
- Emojis pour reconnaissance rapide
- Couleurs pour niveaux (info/success/warning/error)
- Timestamps relatifs ("il y a 2 min")
### Réactivité
- Mise à jour en temps réel
- Pas de freeze
- Feedback immédiat sur actions
## Migration Plan
### Phase 1: Créer nouveaux composants
1. HumanLogger
2. ImprovedGUI
3. LogsPanel
4. InteractiveDialog
### Phase 2: Modifier Orchestrator
1. Ajouter envoi de messages humains
2. Connecter aux signaux GUI
3. Déclencher dialogues interactifs
### Phase 3: Remplacer ancienne GUI
1. Renommer `minimal_gui.py``minimal_gui_old.py`
2. Renommer `improved_gui.py``minimal_gui.py`
3. Tester
### Phase 4: Cleanup
1. Supprimer anciens boutons (liste blanche, etc.)
2. Supprimer code inutilisé
3. Documentation
## Security Considerations
- Logs techniques : Ne pas logger de données sensibles
- Popups : Timeout pour éviter DOS
- System tray : Vérifier permissions Ubuntu
## Accessibility
- Contraste suffisant pour lisibilité
- Taille de police ajustable
- Support clavier complet
- Screen reader compatible (ARIA labels)