Source code for rath.memory.op_types
"""Concrete :class:`MemoryOp` payload types dispatched through a memory backend.
Mirrors :mod:`rath.backend.tool_types` for the memory plane: every concrete op
is a frozen, slotted dataclass with value semantics (hashable, equality by
field values).
"""
from __future__ import annotations
from collections.abc import Mapping, Sequence
from dataclasses import dataclass, field
from typing import Any, Literal
__all__ = [
"MemoryOp",
"MemoryOpWrite",
"MemoryOpRead",
"MemoryOpList",
"MemoryOpTree",
"MemoryOpFind",
"MemoryOpSearch",
"MemoryOpResource",
"MemoryOpCommit",
]
[docs]
class MemoryOp:
"""Marker root for memory-plane op payloads.
Concrete subclasses are frozen dataclasses. The marker exists so backends
can declare :meth:`~rath.memory.abc.MemoryBackend.supported_ops` and so
the registry can refuse unknown subtypes.
"""
__slots__ = ()
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpWrite(MemoryOp):
"""Update an existing memory entry at ``uri`` with free-form text content.
OpenViking's ``write`` semantics are an *update* of an existing memory
file (created by ``commit_session`` extraction or seeded via
:class:`MemoryOpResource`); it is not a generic create-file path.
"""
uri: str
content: str
mode: str = "replace"
wait: bool = False
timeout_seconds: float | None = None
metadata: Mapping[str, str] | None = None
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpRead(MemoryOp):
"""Read the entry at ``uri`` at the requested hierarchical level."""
uri: str
level: Literal["abstract", "overview", "detail"] = "detail"
encoding: str | None = "utf-8"
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpList(MemoryOp):
"""List immediate entries under ``uri`` (non-recursive)."""
uri: str
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpTree(MemoryOp):
"""Recursively list entries under ``uri`` up to ``depth`` levels."""
uri: str
depth: int = 2
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpFind(MemoryOp):
"""Direct semantic search; ``target_uri`` scopes the search namespace."""
query: str
target_uri: str | None = None
top_k: int = 8
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpSearch(MemoryOp):
"""Intent-aware search; ``session_id`` scopes ranking against a session."""
query: str
session_id: str | None = None
target_uri: str | None = None
top_k: int = 8
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpResource(MemoryOp):
"""Register an external resource (URL / file / dir) for ingestion.
``target_uri`` is the destination directory under ``memory://resources/``.
"""
source: str
target_uri: str | None = None
reason: str = ""
instruction: str = ""
wait: bool = True
timeout_seconds: float | None = None
[docs]
@dataclass(frozen=True, slots=True)
class MemoryOpCommit(MemoryOp):
"""Commit a session's messages for archive + memory extraction.
Each entry in ``messages`` is a ``{"role": ..., "content": ...}`` dict
(or ``{"role": ..., "parts": [...]}`` for multipart messages).
"""
session_id: str
messages: Sequence[Any]
used_uris: Sequence[str] = field(default_factory=tuple)
wait: bool = False
timeout_seconds: float | None = None