feat: unification VWB ↔ Léa — import/export bidirectionnel

- Workflows appris par Léa visibles dans le VWB ("Appris par Léa")
- Bouton "Importer" pour éditer un workflow appris
- Bouton "Exporter pour Léa" pour rendre un workflow VWB exécutable
- Conversion bidirectionnelle core ↔ VWB via learned_workflow_bridge
- Liste unifiée dans le chat Léa (merged + dédupliquée)
- reload_workflows() sur le streaming server (pas de redémarrage)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-18 22:41:34 +01:00
parent aa39af327f
commit 5973058f08
10 changed files with 1407 additions and 6 deletions

View File

@@ -678,6 +678,33 @@ async def list_workflows(machine_id: Optional[str] = None):
return result
@app.post("/api/v1/traces/stream/reload-workflows")
async def reload_workflows():
"""Recharger les workflows depuis le disque.
Appelé par le VWB après un export-for-lea pour que le streaming server
voie immédiatement les nouveaux workflows sans redémarrage.
"""
count = processor.reload_workflows()
return {"success": True, "workflows_count": count}
@app.get("/api/v1/traces/stream/workflow/{workflow_id}")
async def get_workflow_detail(workflow_id: str):
"""Retourne le détail complet d'un workflow (format core JSON).
Utilisé par le VWB pour importer un workflow appris qui n'est pas
encore sur disque (seulement en mémoire dans le streaming server).
"""
with processor._data_lock:
wf = processor._workflows.get(workflow_id)
if not wf:
raise HTTPException(status_code=404, detail=f"Workflow '{workflow_id}' non trouvé")
return wf.to_dict()
@app.get("/api/v1/traces/stream/session/{session_id}")
async def get_session(session_id: str):
"""État d'une session."""