Files
ws-sanctum-chronicler/app/memory/models.py

103 lines
3.5 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 StreamDashboard(Base):
"""Stores the approved stream dashboard for a session."""
__tablename__ = "stream_dashboards"
session_id = Column(String, primary_key=True)
raw_markdown = Column(Text, nullable=False)
stream_title = Column(String, nullable=True)
game = Column(String, nullable=True)
mood = Column(String, nullable=True)
go_live_notification = Column(Text, nullable=True)
social_post = Column(Text, nullable=True)
session_goals = Column(Text, nullable=True) # JSON array of strings
content_angle = Column(Text, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, nullable=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)