from sqlalchemy import Column, String, Integer, ForeignKey, DateTime, Enum, JSON, Boolean
from sqlalchemy.orm import relationship
import uuid
import datetime
from app.db.database import Base
class AgentTemplate(Base):
__tablename__ = 'agent_templates'
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
name = Column(String, nullable=False)
description = Column(String, nullable=True)
system_prompt_path = Column(String, nullable=True)
max_loop_iterations = Column(Integer, default=20)
instances = relationship("AgentInstance", back_populates="template")
class AgentInstance(Base):
__tablename__ = 'agent_instances'
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
template_id = Column(String, ForeignKey('agent_templates.id'), nullable=False)
session_id = Column(Integer, ForeignKey('sessions.id'), nullable=True)
mesh_node_id = Column(String, nullable=True) # Just use string or connect to agent_nodes.node_id if needed
status = Column(String, default='idle') # Enum: active, idle, listening, error_suspended
current_workspace_jail = Column(String, nullable=True)
last_heartbeat = Column(DateTime, default=datetime.datetime.utcnow)
template = relationship("AgentTemplate", back_populates="instances")
triggers = relationship("AgentTrigger", back_populates="instance")
class AgentTrigger(Base):
__tablename__ = 'agent_triggers'
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
instance_id = Column(String, ForeignKey('agent_instances.id'), nullable=False)
trigger_type = Column(String, nullable=False) # Enum: webhook, cron, manual
cron_expression = Column(String, nullable=True)
webhook_secret = Column(String, nullable=True)
webhook_mapping_schema = Column(JSON, nullable=True)
instance = relationship("AgentInstance", back_populates="triggers")