import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, String, Text from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column from app.db import Base EVENT_KINDS = {"anomaly", "utterance", "question", "reply", "system"} class Event(Base): """One line in a contact session's transcript: an anomaly, an utterance, a user question, or a spirit reply.""" __tablename__ = "events" id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4) session_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("contact_sessions.id"), index=True ) kind: Mapped[str] = mapped_column(String(32)) text: Mapped[str | None] = mapped_column(Text, nullable=True) payload: Mapped[dict | None] = mapped_column(JSONB, nullable=True) audio_path: Mapped[str | None] = mapped_column(String(255), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), index=True )