from datetime import datetime from typing import Any from sqlalchemy import JSON, BigInteger, DateTime, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.model.base import Base class MemoryUnit(Base): __tablename__ = "memory_unit" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) memory_uuid: Mapped[str] = mapped_column(String(36), unique=True, nullable=False) customer_id: Mapped[int] = mapped_column(BigInteger, nullable=False) memory_key: Mapped[str] = mapped_column(String(128), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) structured_value: Mapped[dict[str, Any] | None] = mapped_column(JSON) memory_type: Mapped[str] = mapped_column(String(24), nullable=False) source_type: Mapped[str] = mapped_column(String(24), nullable=False) source_confidence: Mapped[float] = mapped_column(nullable=False) confidence: Mapped[float] = mapped_column(nullable=False) status: Mapped[str] = mapped_column(String(16), nullable=False) valid_from: Mapped[datetime] = mapped_column(DateTime, nullable=False) valid_until: Mapped[datetime | None] = mapped_column(DateTime) version: Mapped[int] = mapped_column(BigInteger, nullable=False, default=1) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) class MemorySyncOutbox(Base): __tablename__ = "memory_sync_outbox" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) event_uuid: Mapped[str] = mapped_column(String(36), nullable=False) aggregate_type: Mapped[str] = mapped_column(String(24), nullable=False) aggregate_uuid: Mapped[str] = mapped_column(String(36), nullable=False) aggregate_version: Mapped[int] = mapped_column(BigInteger, nullable=False) target_store: Mapped[str] = mapped_column(String(16), nullable=False) operation: Mapped[str] = mapped_column(String(16), nullable=False) payload: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False) status: Mapped[str] = mapped_column(String(16), nullable=False) retry_count: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0) next_retry_at: Mapped[datetime | None] = mapped_column(DateTime) last_error: Mapped[str | None] = mapped_column(Text) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) processed_at: Mapped[datetime | None] = mapped_column(DateTime) class MemoryConflict(Base): __tablename__ = "memory_conflict" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) left_memory_id: Mapped[int] = mapped_column(BigInteger, nullable=False) right_memory_id: Mapped[int] = mapped_column(BigInteger, nullable=False) conflict_type: Mapped[str] = mapped_column(String(24), nullable=False) resolution_status: Mapped[str] = mapped_column(String(16), nullable=False) winner_memory_id: Mapped[int | None] = mapped_column(BigInteger) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) resolved_at: Mapped[datetime | None] = mapped_column(DateTime)