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

@@ -103,16 +103,24 @@ class TestImportsRegression:
def test_type_checking_works(self):
"""Test que TYPE_CHECKING fonctionne correctement"""
import core.models as models
# Les imports conditionnels ne devraient pas être disponibles à l'exécution
assert not hasattr(models, 'Workflow')
assert not hasattr(models, 'Action')
assert not hasattr(models, 'TargetSpec')
# Mais les lazy imports devraient être disponibles
# Les types workflow_graph ne sont pas importés directement au niveau module,
# mais sont disponibles via __getattr__ (lazy loading). Vérifier que
# les noms ne sont PAS dans le namespace direct du module (vars()),
# mais sont accessibles via __getattr__ pour le lazy loading.
module_vars = vars(models)
assert 'Workflow' not in module_vars, "Workflow ne devrait pas être dans les attributs directs du module"
assert 'Action' not in module_vars, "Action ne devrait pas être dans les attributs directs du module"
assert 'TargetSpec' not in module_vars, "TargetSpec ne devrait pas être dans les attributs directs du module"
# Les lazy imports explicites devraient être disponibles
assert hasattr(models, 'get_workflow')
assert hasattr(models, 'get_action')
assert hasattr(models, 'get_target_spec')
# Le lazy loading via __getattr__ doit fonctionner
Workflow = models.Workflow
assert Workflow.__name__ == 'Workflow'
def test_existing_imports_still_work(self):
"""Test que les imports existants dans d'autres modules fonctionnent"""