"""Core data models for DreamLand.""" from dataclasses import dataclass, field from datetime import datetime from typing import Optional import uuid def _new_id() -> str: """Generate a short unique ID.""" return uuid.uuid4().hex[:8] @dataclass class Entity: """A world entity extracted from or generated from a dream.""" id: str = field(default_factory=_new_id) name: str = "" entity_type: str = "" # "location" | "npc" | "item" | "quest" description: str = "" dream_id: str = "" created_at: str = field(default_factory=lambda: datetime.now().isoformat()) metadata: dict = field(default_factory=dict) # NPC-specific fields dialog: str = "" location_id: str = "" # Quest-specific fields quest_status: str = "" # "active" | "completed" giver_id: str = "" def to_dict(self) -> dict: """Serialize to dict for JSON storage.""" return { "id": self.id, "name": self.name, "type": self.entity_type, "description": self.description, "dream_source": self.dream_id, "created_at": self.created_at, "metadata": self.metadata, "dialog": self.dialog, "location_id": self.location_id, "quest_status": self.quest_status, "giver_id": self.giver_id, } @classmethod def from_dict(cls, data: dict) -> "Entity": """Deserialize from dict.""" return cls( id=data.get("id", ""), name=data.get("name", ""), entity_type=data.get("type", ""), description=data.get("description", ""), dream_id=data.get("dream_source", ""), created_at=data.get("created_at", ""), metadata=data.get("metadata", {}), dialog=data.get("dialog", ""), location_id=data.get("location_id", ""), quest_status=data.get("quest_status", ""), giver_id=data.get("giver_id", ""), ) @dataclass class DreamEntry: """A single dream record.""" id: str = field(default_factory=_new_id) raw_text: str = "" entities: list[Entity] = field(default_factory=list) emotions: list[str] = field(default_factory=list) summary: str = "" timestamp: str = field(default_factory=lambda: datetime.now().isoformat()) has_image: bool = False def to_dict(self) -> dict: return { "id": self.id, "raw_text": self.raw_text, "entities_extracted": [e.id for e in self.entities], "emotions": self.emotions, "summary": self.summary, "timestamp": self.timestamp, "has_image": self.has_image, } @dataclass class DreamParseResult: """Structured output from the dream parser.""" entities: list[Entity] = field(default_factory=list) emotions: list[str] = field(default_factory=list) summary: str = "" @dataclass class WorldContext: """Context passed to generators about the current world state.""" nearby_locations: list[str] = field(default_factory=list) existing_npcs: list[str] = field(default_factory=list) emotions: list[str] = field(default_factory=list) total_entities: int = 0