tillu-daemon / app /models /database.py
tillu-AI's picture
upload app/models/database.py
dce607f verified
"""
Database Model Schemas (for reference and validation)
These mirror the Supabase schema for type safety.
"""
from typing import Any, Dict, List, Optional
from datetime import datetime, date, time
from uuid import UUID
from pydantic import BaseModel, Field
class UserProfile(BaseModel):
"""User profile with personality parameters"""
id: UUID
user_id: UUID
email: Optional[str] = None
name: Optional[str] = None
timezone: str = "UTC"
active_hours_start: time = Field(default_factory=lambda: time(8, 0))
active_hours_end: time = Field(default_factory=lambda: time(22, 0))
dnd_enabled: bool = False
dnd_start: time = Field(default_factory=lambda: time(22, 0))
dnd_end: time = Field(default_factory=lambda: time(8, 0))
interests: List[str] = Field(default_factory=list)
behavioral_patterns: Dict[str, Any] = Field(default_factory=dict)
personality_params: Dict[str, Any] = Field(default_factory=dict)
preference_history: List[Dict[str, Any]] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class Interaction(BaseModel):
"""Interaction record with quality scores"""
id: UUID
user_id: UUID
session_id: Optional[UUID] = None
interaction_type: str
input_text: Optional[str] = None
input_metadata: Dict[str, Any] = Field(default_factory=dict)
intent_class: Optional[str] = None
emotion_scores: Dict[str, float] = Field(default_factory=dict)
stress_score: float = 0.0
chain_used: str
model_used: Optional[str] = None
latency_ms: Optional[int] = None
tokens_used: Optional[int] = None
response_text: Optional[str] = None
response_metadata: Dict[str, Any] = Field(default_factory=dict)
personality_mode: Optional[str] = None
quality_accuracy_score: Optional[float] = None
quality_helpfulness_score: Optional[float] = None
quality_personality_fit_score: Optional[float] = None
sources_used: List[Dict[str, Any]] = Field(default_factory=list)
context_tiers: Dict[str, Any] = Field(default_factory=dict)
created_at: datetime
class KnowledgeBase(BaseModel):
"""Semantic knowledge store"""
id: UUID
user_id: UUID
content: str
content_type: str # fact, preference, insight, pattern
category: Optional[str] = None
source_interaction_id: Optional[UUID] = None
source_type: Optional[str] = None
source_metadata: Dict[str, Any] = Field(default_factory=dict)
# embedding: List[float] # 768-dim vector, handled separately
access_count: int = 0
last_accessed: Optional[datetime] = None
confidence_score: float = 0.8
quality_score: float = 0.8
created_at: datetime
updated_at: datetime
expires_at: Optional[datetime] = None
class NewsArticle(BaseModel):
"""Processed news article"""
id: UUID
user_id: UUID
title: str
summary: Optional[str] = None
content_hash: Optional[str] = None
url: Optional[str] = None
source_name: Optional[str] = None
source_type: Optional[str] = None
original_text: Optional[str] = None
bart_summary: Optional[str] = None
entities: List[Dict[str, Any]] = Field(default_factory=list)
topics: List[str] = Field(default_factory=list)
# embedding: List[float]
urgency_score: Optional[int] = None
relevance_score: Optional[float] = None
interest_match: Dict[str, Any] = Field(default_factory=dict)
processed: bool = False
delivered: bool = False
delivery_method: Optional[str] = None
published_at: Optional[datetime] = None
fetched_at: datetime
processed_at: Optional[datetime] = None
expires_at: Optional[datetime] = None
class EventQueue(BaseModel):
"""Proactive event queue"""
id: UUID
user_id: UUID
event_type: str
urgency: int
source_agent: str
title: str
body: Optional[str] = None
tillu_message: Optional[str] = None
structured_data: Dict[str, Any] = Field(default_factory=dict)
sources: List[Dict[str, Any]] = Field(default_factory=list)
actions: List[str] = Field(default_factory=list)
personality_mode: Optional[str] = None
deliver_after: datetime
expires_at: Optional[datetime] = None
require_ack: bool = False
target_client_id: Optional[UUID] = None
status: str = "pending"
delivered_at: Optional[datetime] = None
acknowledged_at: Optional[datetime] = None
dedup_key: Optional[str] = None
generated_at: datetime
class ResearchSession(BaseModel):
"""Research session record"""
id: UUID
user_id: UUID
query: str
research_plan: Dict[str, Any] = Field(default_factory=dict)
search_results: List[Dict[str, Any]] = Field(default_factory=list)
scraped_content: List[Dict[str, Any]] = Field(default_factory=list)
synthesis: Optional[str] = None
critique: Dict[str, Any] = Field(default_factory=dict)
iteration_count: int = 0
full_synthesis: Dict[str, Any] = Field(default_factory=dict)
executive_summary: Optional[str] = None
citations: List[Dict[str, Any]] = Field(default_factory=list)
# embedding: List[float]
status: str = "pending"
created_at: datetime
completed_at: Optional[datetime] = None
class TaskGoal(BaseModel):
"""Task or goal with probability scoring"""
id: UUID
user_id: UUID
title: str
description: Optional[str] = None
type: str # task, goal, habit, project
category: Optional[str] = None
due_date: Optional[datetime] = None
start_date: Optional[datetime] = None
recurrence: Optional[str] = None
status: str = "active"
priority: int = 3
progress_percent: int = 0
completed_at: Optional[datetime] = None
probability_of_completion: float = 0.5
estimated_effort_hours: Optional[int] = None
days_at_current_rate: Optional[int] = None
last_nudge_at: Optional[datetime] = None
nudge_count: int = 0
nudge_next_at: Optional[datetime] = None
related_knowledge_ids: List[UUID] = Field(default_factory=list)
tags: List[str] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class EmotionLog(BaseModel):
"""Emotional state record"""
id: UUID
user_id: UUID
joy: float = 0.0
sadness: float = 0.0
anger: float = 0.0
fear: float = 0.0
surprise: float = 0.0
disgust: float = 0.0
neutral: float = 0.0
dominant_emotion: Optional[str] = None
emotion_intensity: Optional[float] = None
stress_level: Optional[str] = None
interaction_id: Optional[UUID] = None
context: Optional[str] = None
recorded_at: datetime
class FinancialTracking(BaseModel):
"""Financial asset tracking"""
id: UUID
user_id: UUID
asset_type: str # crypto, stock, forex, commodity
symbol: str
name: Optional[str] = None
current_price: Optional[float] = None
price_currency: str = "USD"
price_history: List[Dict[str, Any]] = Field(default_factory=list)
alert_threshold_pct: float = 2.0
last_alert_at: Optional[datetime] = None
alert_count: int = 0
quantity_held: float = 0.0
cost_basis: Optional[float] = None
source: str = "coingecko"
metadata: Dict[str, Any] = Field(default_factory=dict)
created_at: datetime
updated_at: datetime
class WebMonitor(BaseModel):
"""Web change monitor"""
id: UUID
user_id: UUID
url: str
name: Optional[str] = None
description: Optional[str] = None
check_interval_minutes: int = 30
css_selector: Optional[str] = None
content_type: str = "text"
last_content: Optional[str] = None
last_content_hash: Optional[str] = None
last_checked_at: Optional[datetime] = None
last_changed_at: Optional[datetime] = None
change_count: int = 0
alert_threshold: float = 0.1
notify_on_change: bool = True
is_active: bool = True
last_error: Optional[str] = None
consecutive_errors: int = 0
created_at: datetime
updated_at: datetime
class PeopleKnowledge(BaseModel):
"""Relationship intelligence"""
id: UUID
user_id: UUID
name: str
relationship_type: Optional[str] = None
contact_info: Dict[str, Any] = Field(default_factory=dict)
notes: Optional[str] = None
preferences: Dict[str, Any] = Field(default_factory=dict)
conversation_history: List[Dict[str, Any]] = Field(default_factory=list)
last_interaction_at: Optional[datetime] = None
interaction_frequency: Optional[str] = None
relationship_health_score: float = 0.8
birthday: Optional[date] = None
anniversary: Optional[date] = None
other_dates: List[Dict[str, Any]] = Field(default_factory=list)
# embedding: List[float]
needs_attention: bool = False
suggested_actions: List[str] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class ClientRegistry(BaseModel):
"""Registered client"""
id: UUID
user_id: UUID
client_name: str
client_type: str
supports_text: bool = True
supports_audio: bool = False
supports_image: bool = False
supports_document: bool = False
supports_location: bool = False
supports_sse: bool = False
supports_websocket: bool = False
preferences: Dict[str, Any] = Field(default_factory=dict)
is_connected: bool = False
last_connected_at: Optional[datetime] = None
connection_metadata: Dict[str, Any] = Field(default_factory=dict)
api_key_hash: Optional[str] = None
created_at: datetime
updated_at: datetime