File size: 1,832 Bytes
1fff71f
 
 
 
1d8729f
1fff71f
 
 
1d8729f
1fff71f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d3ee93
1fff71f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
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)