v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution

- Frontend v4 accessible sur réseau local (192.168.1.40)
- Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard)
- Ollama GPU fonctionnel
- Self-healing interactif
- Dashboard confiance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Dom
2026-01-29 11:23:51 +01:00
parent 21bfa3b337
commit a27b74cf22
1595 changed files with 412691 additions and 400 deletions

View File

@@ -21,6 +21,8 @@ class Workflow(db.Model):
id = db.Column(db.String(64), primary_key=True)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text, nullable=True)
tags_json = db.Column(db.Text, nullable=True) # JSON array de tags pour le matching
trigger_examples_json = db.Column(db.Text, nullable=True) # JSON array d'exemples de déclenchement
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
is_active = db.Column(db.Boolean, default=True)
@@ -31,12 +33,44 @@ class Workflow(db.Model):
executions = db.relationship('Execution', backref='workflow', lazy='dynamic',
cascade='all, delete-orphan')
@property
def tags(self) -> List[str]:
"""Retourne les tags comme liste"""
if not self.tags_json:
return []
try:
return json.loads(self.tags_json)
except json.JSONDecodeError:
return []
@tags.setter
def tags(self, value: List[str]):
"""Définit les tags depuis une liste"""
self.tags_json = json.dumps(value) if value else None
@property
def trigger_examples(self) -> List[str]:
"""Retourne les exemples de déclenchement comme liste"""
if not self.trigger_examples_json:
return []
try:
return json.loads(self.trigger_examples_json)
except json.JSONDecodeError:
return []
@trigger_examples.setter
def trigger_examples(self, value: List[str]):
"""Définit les exemples depuis une liste"""
self.trigger_examples_json = json.dumps(value) if value else None
def to_dict(self) -> Dict[str, Any]:
"""Sérialise le workflow complet"""
return {
'id': self.id,
'name': self.name,
'description': self.description,
'tags': self.tags,
'triggerExamples': self.trigger_examples,
'created_at': self.created_at.isoformat() if self.created_at else None,
'updated_at': self.updated_at.isoformat() if self.updated_at else None,
'steps': [step.to_dict() for step in self.steps.order_by(Step.order).all()],