0cb9ee5c58
- Landing: replace nonexistent `mempalace remember` CLI demo with real
`mempalace mine ./notes`
- Landing: soften unverifiable absolutes ("forever available",
"100% recall by design", "<50 ms", "90%+ compression",
"two-thousand-year-old", "tens of thousands of entries")
- MCP tool count: 19 → 29 across mcp-integration, claude-code, openclaw,
and modules; expand tool overview with Drawers, Tunnels, and System
categories to match mcp_server.py
- Wake-up token range: ~170–900 → ~600–900 in cli/api-reference/python-api
to match cli.py help text and concept docs
- Gemini CLI: move `--scope user` before target name and add `--`
separator so `-m mempalace.mcp_server` isn't parsed as Gemini flags
247 lines
8.0 KiB
Markdown
247 lines
8.0 KiB
Markdown
# API Reference
|
||
|
||
Comprehensive parameter-level documentation for all public Python APIs.
|
||
|
||
## `mempalace.searcher`
|
||
|
||
### `search(query, palace_path, wing=None, room=None, n_results=5)`
|
||
|
||
CLI-oriented search that prints results to stdout.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|-----------|------|---------|-------------|
|
||
| `query` | `str` | — | Search query text |
|
||
| `palace_path` | `str` | — | Path to ChromaDB palace directory |
|
||
| `wing` | `str` | `None` | Filter by wing name |
|
||
| `room` | `str` | `None` | Filter by room name |
|
||
| `n_results` | `int` | `5` | Maximum number of results |
|
||
|
||
**Raises:** `SearchError` if palace not found or query fails.
|
||
|
||
---
|
||
|
||
### `search_memories(query, palace_path, wing=None, room=None, n_results=5) → dict`
|
||
|
||
Programmatic search returning a dict. Used by the MCP server.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|-----------|------|---------|-------------|
|
||
| `query` | `str` | — | Search query text |
|
||
| `palace_path` | `str` | — | Path to ChromaDB palace directory |
|
||
| `wing` | `str` | `None` | Filter by wing name |
|
||
| `room` | `str` | `None` | Filter by room name |
|
||
| `n_results` | `int` | `5` | Maximum number of results |
|
||
|
||
**Returns:**
|
||
```python
|
||
{
|
||
"query": str,
|
||
"filters": {"wing": str | None, "room": str | None},
|
||
"results": [
|
||
{
|
||
"text": str, # verbatim drawer content
|
||
"wing": str, # wing name
|
||
"room": str, # room name
|
||
"source_file": str, # original file basename
|
||
"similarity": float, # 0.0 to 1.0
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
On error: `{"error": str, "hint": str}`
|
||
|
||
---
|
||
|
||
## `mempalace.layers`
|
||
|
||
### `class Layer0(identity_path=None)`
|
||
|
||
Identity layer (~50 tokens). Reads from `~/.mempalace/identity.txt`.
|
||
|
||
| Method | Returns | Description |
|
||
|--------|---------|-------------|
|
||
| `render()` | `str` | Identity text or default message |
|
||
| `token_estimate()` | `int` | Approximate token count (`len(text) // 4`) |
|
||
|
||
---
|
||
|
||
### `class Layer1(palace_path=None, wing=None)`
|
||
|
||
Essential story layer (~500–800 tokens). Auto-generated from top drawers.
|
||
|
||
| Attribute | Type | Description |
|
||
|-----------|------|-------------|
|
||
| `MAX_DRAWERS` | `int` | Max moments in wake-up (15) |
|
||
| `MAX_CHARS` | `int` | Hard cap on L1 text (3200) |
|
||
|
||
| Method | Returns | Description |
|
||
|--------|---------|-------------|
|
||
| `generate()` | `str` | Compact L1 text grouped by room |
|
||
|
||
---
|
||
|
||
### `class Layer2(palace_path=None)`
|
||
|
||
On-demand retrieval layer (~200–500 tokens per call).
|
||
|
||
| Method | Parameters | Returns |
|
||
|--------|-----------|---------|
|
||
| `retrieve(wing, room, n_results=10)` | Wing/room filters | Formatted drawer text |
|
||
|
||
---
|
||
|
||
### `class Layer3(palace_path=None)`
|
||
|
||
Deep semantic search layer (unlimited depth).
|
||
|
||
| Method | Parameters | Returns |
|
||
|--------|-----------|---------|
|
||
| `search(query, wing=None, room=None, n_results=5)` | Query + optional filters | Formatted result text |
|
||
| `search_raw(query, wing=None, room=None, n_results=5)` | Query + optional filters | List of result dicts |
|
||
|
||
---
|
||
|
||
### `class MemoryStack(palace_path=None, identity_path=None)`
|
||
|
||
Unified 4-layer interface.
|
||
|
||
| Method | Parameters | Returns | Description |
|
||
|--------|-----------|---------|-------------|
|
||
| `wake_up(wing=None)` | Optional wing | `str` | L0 + L1 context (~600–900 tokens) |
|
||
| `recall(wing, room, n_results=10)` | Filters | `str` | L2 on-demand retrieval |
|
||
| `search(query, wing, room, n_results=5)` | Query + filters | `str` | L3 deep search |
|
||
| `status()` | — | `dict` | All layer status info |
|
||
|
||
---
|
||
|
||
## `mempalace.knowledge_graph`
|
||
|
||
### `class KnowledgeGraph(db_path=None)`
|
||
|
||
Default path: `~/.mempalace/knowledge_graph.sqlite3`
|
||
|
||
#### Write Methods
|
||
|
||
| Method | Parameters | Returns | Description |
|
||
|--------|-----------|---------|-------------|
|
||
| `add_entity(name, entity_type='unknown', properties=None)` | Name, type, props dict | `str` (entity ID) | Add or update entity node |
|
||
| `add_triple(subject, predicate, obj, valid_from, valid_to, confidence, source_closet, source_file)` | See below | `str` (triple ID) | Add relationship triple |
|
||
| `invalidate(subject, predicate, obj, ended=None)` | Entity names, end date | — | Mark relationship as ended |
|
||
|
||
**`add_triple` parameters:**
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|-----------|------|---------|-------------|
|
||
| `subject` | `str` | — | Source entity name |
|
||
| `predicate` | `str` | — | Relationship type |
|
||
| `obj` | `str` | — | Target entity name |
|
||
| `valid_from` | `str` | `None` | Start date (YYYY-MM-DD) |
|
||
| `valid_to` | `str` | `None` | End date |
|
||
| `confidence` | `float` | `1.0` | Confidence score 0.0–1.0 |
|
||
| `source_closet` | `str` | `None` | Link to verbatim memory |
|
||
| `source_file` | `str` | `None` | Original source file |
|
||
|
||
#### Query Methods
|
||
|
||
| Method | Parameters | Returns |
|
||
|--------|-----------|---------|
|
||
| `query_entity(name, as_of=None, direction='outgoing')` | Entity name, date filter, direction | `list[dict]` |
|
||
| `query_relationship(predicate, as_of=None)` | Relationship type, date filter | `list[dict]` |
|
||
| `timeline(entity_name=None)` | Optional entity filter | `list[dict]` |
|
||
| `stats()` | — | `dict` with entities, triples, predicates |
|
||
| `seed_from_entity_facts(entity_facts)` | Dict of entity facts | — |
|
||
|
||
**`query_entity` direction values:** `"outgoing"` (entity→?), `"incoming"` (?→entity), `"both"`
|
||
|
||
---
|
||
|
||
## `mempalace.palace_graph`
|
||
|
||
### `build_graph(col=None, config=None) → (nodes, edges)`
|
||
|
||
Build the palace graph from ChromaDB metadata.
|
||
|
||
**Returns:**
|
||
- `nodes`: `dict` of `{room: {wings: list, halls: list, count: int, dates: list}}`
|
||
- `edges`: `list` of `{room, wing_a, wing_b, hall, count}`
|
||
|
||
---
|
||
|
||
### `traverse(start_room, col=None, config=None, max_hops=2) → list`
|
||
|
||
BFS graph traversal from a room across wings.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|-----------|------|---------|-------------|
|
||
| `start_room` | `str` | — | Room slug to start from |
|
||
| `max_hops` | `int` | `2` | Max connection depth |
|
||
|
||
**Returns:** `[{room, wings, halls, count, hop, connected_via}]` (max 50)
|
||
|
||
---
|
||
|
||
### `find_tunnels(wing_a=None, wing_b=None, col=None, config=None) → list`
|
||
|
||
Find rooms spanning multiple wings.
|
||
|
||
**Returns:** `[{room, wings, halls, count, recent}]` (max 50)
|
||
|
||
---
|
||
|
||
### `graph_stats(col=None, config=None) → dict`
|
||
|
||
**Returns:** `{total_rooms, tunnel_rooms, total_edges, rooms_per_wing, top_tunnels}`
|
||
|
||
---
|
||
|
||
## `mempalace.dialect`
|
||
|
||
### `class Dialect(entities=None, skip_names=None)`
|
||
|
||
| Parameter | Type | Description |
|
||
|-----------|------|-------------|
|
||
| `entities` | `dict[str, str]` | Full name → 3-letter code mapping |
|
||
| `skip_names` | `list[str]` | Names to skip (fictional characters, etc.) |
|
||
|
||
#### Class Methods
|
||
|
||
| Method | Parameters | Returns |
|
||
|--------|-----------|---------|
|
||
| `from_config(config_path)` | JSON file path | `Dialect` instance |
|
||
|
||
#### Instance Methods
|
||
|
||
| Method | Parameters | Returns | Description |
|
||
|--------|-----------|---------|-------------|
|
||
| `compress(text, metadata=None)` | Plain text + optional metadata dict | `str` | AAAK-formatted summary |
|
||
| `encode_entity(name)` | Entity name | `str \| None` | 3-letter entity code |
|
||
| `encode_emotions(emotions)` | List of emotion strings | `str` | Compact emotion codes |
|
||
| `compress_file(path, output=None)` | Zettel JSON path | `str` | Compress zettel file |
|
||
| `compress_all(dir, output=None)` | Zettel directory | `str` | Compress all zettels |
|
||
| `save_config(path)` | Output path | — | Save entity mappings |
|
||
| `compression_stats(original, compressed)` | Both texts | `dict` | Compression ratio stats |
|
||
|
||
#### Static Methods
|
||
|
||
| Method | Parameters | Returns |
|
||
|--------|-----------|---------|
|
||
| `count_tokens(text)` | Any text | `int` |
|
||
|
||
---
|
||
|
||
## `mempalace.config`
|
||
|
||
### `class MempalaceConfig()`
|
||
|
||
Reads from `~/.mempalace/config.json` and environment variables.
|
||
|
||
| Property | Type | Default | Description |
|
||
|----------|------|---------|-------------|
|
||
| `palace_path` | `str` | `~/.mempalace/palace` | ChromaDB storage path |
|
||
| `collection_name` | `str` | `mempalace_drawers` | ChromaDB collection name |
|
||
|
||
| Method | Description |
|
||
|--------|-------------|
|
||
| `init()` | Create config directory and default files |
|