| """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 = "" |
| description: str = "" |
| dream_id: str = "" |
| created_at: str = field(default_factory=lambda: datetime.now().isoformat()) |
| metadata: dict = field(default_factory=dict) |
|
|
| |
| dialog: str = "" |
| location_id: str = "" |
|
|
| |
| quest_status: str = "" |
| 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 |
|
|