""" Data models for Profile and Contact Management UI. Feature: 012-profile-contact-ui """ from dataclasses import dataclass from datetime import datetime from typing import Literal, Optional @dataclass class UserProfile: """User profile entity.""" user_id: str display_name: str profile_picture_url: Optional[str] created_at: datetime last_login: datetime session_id: str # Format: {user_id}_session @dataclass class ContactSession: """Contact session entity.""" session_id: str # Format: {user_id}_{UUID_v4} user_id: str contact_id: str # Contact identifier (maps to project_id in v2 backend) contact_name: str contact_description: Optional[str] is_reference: bool created_at: datetime last_interaction: datetime normalized_name: Optional[str] = None # Feature: 001-refine-memory-producer-logic sequence_number: Optional[int] = None # Feature: 001-refine-memory-producer-logic producer_id: Optional[str] = None # Feature: 001-refine-memory-producer-logic - Format: {user_id}_{normalized_name}_{seq} @dataclass class Fact: """ Fact entity - alias for Message with mode='memorize'. Used for semantic clarity in the application. """ message_id: str # UUID session_id: str content: str created_at: datetime mode: Literal["memorize"] = "memorize" # Always 'memorize' for facts @dataclass class Message: """Message entity - unified model for chat messages and facts.""" message_id: str # UUID session_id: str mode: Literal["chat", "memorize"] # 'chat' for messages, 'memorize' for facts content: str created_at: datetime sender: Optional[Literal["user", "assistant"]] = None # Only for mode='chat' metadata: Optional[dict] = None # Optional (e.g., LLM model, tokens)