File size: 2,373 Bytes
b0b150b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.postgresql import JSONB
from core.database import Base


class Agent(Base):
    """AI Agent with all metadata stored in Supabase"""
    __tablename__ = "agents"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
    name = Column(String, nullable=False)
    domain = Column(String, nullable=True)
    system_prompt = Column(Text, nullable=False)
    
    # All metadata stored in Supabase (no filesystem)
    domain_keywords = Column(JSONB, nullable=True)
    domain_signature = Column(JSONB, nullable=True)
    prompt_analysis = Column(JSONB, nullable=True)
    knowledge_graph_json = Column(JSONB, nullable=True)
    compilation_stats = Column(JSONB, nullable=True)
    
    status = Column(String, default="initializing")  # initializing, compiling, ready, failed
    storage_path = Column(String, nullable=True)  # Deprecated, kept for compatibility
    chunk_count = Column(Integer, default=0)
    entity_count = Column(Integer, default=0)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    
    # Relationships
    user = relationship("User", backref="agents")
    compilation_jobs = relationship("CompilationJob", back_populates="agent", cascade="all, delete-orphan")
    conversations = relationship("Conversation", back_populates="agent", cascade="all, delete-orphan")
    chunks = relationship("DocumentChunk", back_populates="agent", cascade="all, delete-orphan")


class CompilationJob(Base):
    """Background job for agent compilation"""
    __tablename__ = "compilation_jobs"

    id = Column(Integer, primary_key=True, index=True)
    agent_id = Column(Integer, ForeignKey("agents.id", ondelete="CASCADE"), nullable=False)
    status = Column(String, default="queued")  # queued, processing, completed, failed
    progress = Column(Integer, default=0)
    current_step = Column(String, nullable=True)
    error_message = Column(Text, nullable=True)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    completed_at = Column(DateTime(timezone=True), nullable=True)

    agent = relationship("Agent", back_populates="compilation_jobs")