85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
"""Memory and database models."""
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
from sqlalchemy import Column, String, DateTime, Text, Integer, Boolean, Enum as SQLEnum
|
|
from sqlalchemy.orm import declarative_base
|
|
|
|
Base = declarative_base()
|
|
|
|
|
|
class StreamSession(Base):
|
|
"""Represents a single stream session."""
|
|
|
|
__tablename__ = "stream_sessions"
|
|
|
|
id = Column(String, primary_key=True)
|
|
channel_name = Column(String, nullable=False, index=True)
|
|
started_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
ended_at = Column(DateTime, nullable=True)
|
|
theme = Column(Text, nullable=True)
|
|
is_active = Column(Boolean, default=True)
|
|
|
|
|
|
class ChatMessage(Base):
|
|
"""Represents a chat message from the stream."""
|
|
|
|
__tablename__ = "chat_messages"
|
|
|
|
id = Column(String, primary_key=True)
|
|
session_id = Column(String, nullable=False, index=True)
|
|
username = Column(String, nullable=False)
|
|
content = Column(Text, nullable=False)
|
|
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
is_bot = Column(Boolean, default=False)
|
|
is_moderator = Column(Boolean, default=False)
|
|
|
|
|
|
class AgentActionType(str, Enum):
|
|
"""Types of actions the agent can take."""
|
|
|
|
RESPONSE = "response"
|
|
FLAG_SUSPICIOUS = "flag_suspicious"
|
|
ARCHIVE_CLIP = "archive_clip"
|
|
RECORD_SEED = "record_seed"
|
|
UPDATE_THEME = "update_theme"
|
|
|
|
|
|
class AgentAction(Base):
|
|
"""Records of agent actions taken during a session."""
|
|
|
|
__tablename__ = "agent_actions"
|
|
|
|
id = Column(String, primary_key=True)
|
|
session_id = Column(String, nullable=False, index=True)
|
|
action_type = Column(SQLEnum(AgentActionType), nullable=False)
|
|
mode = Column(String, nullable=False) # hearthkeeper, steward, warden, etc.
|
|
triggered_by_message_id = Column(String, nullable=True)
|
|
description = Column(Text, nullable=False)
|
|
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
|
|
|
|
class ClipCandidate(Base):
|
|
"""Stores potential clip candidates from stream chat."""
|
|
|
|
__tablename__ = "clip_candidates"
|
|
|
|
id = Column(String, primary_key=True)
|
|
session_id = Column(String, nullable=False, index=True)
|
|
message_id = Column(String, nullable=False)
|
|
reason = Column(Text, nullable=False)
|
|
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
|
|
|
|
class BlogSeed(Base):
|
|
"""Stores potential blog post topics/seeds from stream."""
|
|
|
|
__tablename__ = "blog_seeds"
|
|
|
|
id = Column(String, primary_key=True)
|
|
session_id = Column(String, nullable=False, index=True)
|
|
topic = Column(String, nullable=False)
|
|
description = Column(Text, nullable=False)
|
|
related_messages = Column(Text, nullable=True) # JSON array of message IDs
|
|
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
|