feat: smart systray Léa (plyer), preflight GPU, fix tests, support qwen3-vl

- Smart systray (pystray+plyer) remplace PyQt5 : notifications toast,
  menu dynamique avec workflows, chat "Que dois-je faire ?", icône colorée
- Preflight GPU : check_machine_ready() + @pytest.mark.gpu dans conftest
- Correction 63 tests cassés → 0 failed (1200 passed)
- Tests VWB obsolètes déplacés vers _a_trier/
- Support qwen3-vl:8b sur GPU (remplace qwen2.5vl:3b)
  - fix images < 32x32 (Ollama panic)
  - fix force_json=False (qwen3-vl incompatible)
  - fix temperature 0.1 (0.0 bloque avec images)
- Fix captor Windows : Key.esc, _get_key_name()
- Fix LeaServerClient : check_connection, list_workflows format
- deploy_windows.py : packaging propre client Windows
- VWB : edges visibles (#607d8b) + fitView automatique

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-16 22:25:12 +01:00
parent cf495dd82f
commit ad15237fe0
36 changed files with 432 additions and 8103 deletions

View File

@@ -185,8 +185,8 @@ class TestWorkflowPipelineEnhanced:
# Mock de la récupération
mock_recovery_result = Mock(spec=RecoveryResult)
mock_recovery_result.strategy_used = RecoveryStrategy.HIERARCHICAL_MATCHING
mock_recovery_result.message = "Applied hierarchical matching fallback"
mock_recovery_result.strategy_used = RecoveryStrategy.FALLBACK
mock_recovery_result.message = "Applied fallback matching strategy"
mock_recovery_result.success = False
mock_workflow_pipeline.error_handler.handle_matching_failure.return_value = mock_recovery_result
@@ -214,8 +214,8 @@ class TestWorkflowPipelineEnhanced:
# Vérifier les informations de récupération
assert result.recovery_applied is not None
assert result.recovery_applied.strategy == RecoveryStrategy.HIERARCHICAL_MATCHING.value
assert result.recovery_applied.message == "Applied hierarchical matching fallback"
assert result.recovery_applied.strategy == RecoveryStrategy.FALLBACK.value
assert result.recovery_applied.message == "Applied fallback matching strategy"
assert result.recovery_applied.success is False
assert result.recovery_applied.attempts == 1
assert result.recovery_applied.duration_ms >= 0