| """ |
| Auto-Dev Database Models |
| |
| SQLAlchemy models for the self-evolving agent system: |
| - ToolMutation: Tracks code mutations and lineage for AlphaEvolver |
| - WorkflowVariant: Tracks workflow variations with fitness scores |
| - SkillCandidate: Memento-generated skill proposals awaiting validation |
| """ |
|
|
| import uuid |
| from datetime import datetime, timezone |
|
|
| from sqlalchemy import Column, DateTime, Float, Index, JSON, String, Text |
|
|
| from core.database import Base |
|
|
|
|
| class ToolMutation(Base): |
| """ |
| AlphaEvolve: Tracks tool code mutations, lineage, and sandbox test results. |
| |
| Each mutation has a parent_tool_id for lineage tracing, allowing the system |
| to track evolutionary chains of code improvements. |
| """ |
|
|
| __tablename__ = "tool_mutations" |
|
|
| id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) |
| tenant_id = Column(String(36), nullable=False, index=True) |
| parent_tool_id = Column(String(36), nullable=True, index=True) |
| tool_name = Column(String(255), nullable=False) |
| mutated_code = Column(Text, nullable=False) |
| sandbox_status = Column(String(50), default="pending") |
| execution_error = Column(Text, nullable=True) |
| created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) |
|
|
|
|
| class WorkflowVariant(Base): |
| """ |
| AlphaEvolve: Tracks variations of workflows/prompts alongside their |
| automated fitness scores. |
| |
| Fitness is evaluated in two stages: |
| 1. Immediate proxy signals (compilation, execution success) |
| 2. Deferred async signals (webhook events, conversion data) |
| """ |
|
|
| __tablename__ = "workflow_variants" |
|
|
| id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) |
| tenant_id = Column(String(36), nullable=False, index=True) |
| parent_variant_id = Column(String(36), nullable=True, index=True) |
| agent_id = Column(String(36), nullable=True, index=True) |
| workflow_definition = Column(JSON, nullable=False) |
| fitness_score = Column(Float, nullable=True) |
| fitness_signals = Column(JSON, nullable=True) |
| evaluation_status = Column(String(50), default="pending") |
| created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) |
| last_evaluated_at = Column(DateTime(timezone=True), nullable=True) |
|
|
|
|
| class SkillCandidate(Base): |
| """ |
| Memento-Skills: Skill proposals generated from failed episodes. |
| |
| When an agent fails a task repeatedly, the MementoEngine analyzes |
| the failure pattern and generates a new skill candidate. The candidate |
| must pass sandbox validation before it can be promoted to the active |
| skill registry. |
| |
| Lifecycle: pending → validated/failed → promoted |
| """ |
|
|
| __tablename__ = "skill_candidates" |
|
|
| id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) |
| tenant_id = Column(String(36), nullable=False, index=True) |
| agent_id = Column(String(36), nullable=True, index=True) |
| source_episode_id = Column(String(36), nullable=True, index=True) |
| skill_name = Column(String(255), nullable=False) |
| skill_description = Column(Text, nullable=True) |
| generated_code = Column(Text, nullable=False) |
| failure_pattern = Column(JSON, nullable=True) |
| validation_status = Column( |
| String(50), default="pending" |
| ) |
| validation_result = Column(JSON, nullable=True) |
| fitness_score = Column(Float, nullable=True) |
| created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) |
| validated_at = Column(DateTime(timezone=True), nullable=True) |
| promoted_at = Column(DateTime(timezone=True), nullable=True) |
|
|
| __table_args__ = ( |
| Index("ix_skill_candidates_tenant_status", "tenant_id", "validation_status"), |
| ) |
|
|