diff --git a/nexus/mnemosyne/entry.py b/nexus/mnemosyne/entry.py new file mode 100644 index 00000000..a9e4be40 --- /dev/null +++ b/nexus/mnemosyne/entry.py @@ -0,0 +1,44 @@ +"""Archive entry model for Mnemosyne. + +Each entry is a node in the holographic graph — a piece of meaning +with metadata, content, and links to related entries. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from datetime import datetime, timezone +from typing import Optional +import uuid + + +@dataclass +class ArchiveEntry: + """A single node in the Mnemosyne holographic archive.""" + + id: str = field(default_factory=lambda: str(uuid.uuid4())) + title: str = "" + content: str = "" + source: str = "" # "mempalace", "event", "manual", etc. + source_ref: Optional[str] = None # original MemPalace ID, event URI, etc. + topics: list[str] = field(default_factory=list) + metadata: dict = field(default_factory=dict) + created_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat()) + links: list[str] = field(default_factory=list) # IDs of related entries + + def to_dict(self) -> dict: + return { + "id": self.id, + "title": self.title, + "content": self.content, + "source": self.source, + "source_ref": self.source_ref, + "topics": self.topics, + "metadata": self.metadata, + "created_at": self.created_at, + "links": self.links, + } + + @classmethod + def from_dict(cls, data: dict) -> ArchiveEntry: + return cls(**{k: v for k, v in data.items() if k in cls.__dataclass_fields__})