@tinyclaw/memory
Adaptive memory engine (v3) that learns what to remember and what to forget. Combines episodic memory, full-text search, and temporal decay for context-aware retrieval.Installation
Core Concepts
Tiny Claw’s memory system uses a 3-layer architecture:- Layer 1: Episodic Memory - Timestamped events with outcomes and importance scoring
- Layer 2: Semantic Index - FTS5 full-text search with BM25 ranking (built into bun:sqlite)
- Layer 3: Temporal Decay - Ebbinghaus forgetting curve + access frequency strengthening
Scoring Formula
- fts5_rank: Normalized SQLite FTS5 BM25 rank (0.0–1.0)
- temporal_score:
e^(-0.05 × days_since_last_access) × (1 + 0.02 × access_count) - importance: Base importance from event type, decayed over time
Main Exports
createMemoryEngine(db: Database): MemoryEngine
Create a memory engine instance.
Database instance from
@tinyclaw/coreMemory engine with methods for recording, searching, consolidating, and retrieving memories
MemoryEngine Methods
recordEvent(userId, event): string
Store an episodic memory event.
User ID
Event type:
task_completed, preference_learned, correction, delegation_result, or fact_storedEvent content
Optional outcome or result
Importance score (0.0–1.0). Defaults based on event type.
UUID of the created event
correction: 0.9preference_learned: 0.8fact_stored: 0.6task_completed: 0.5delegation_result: 0.5
search(userId, query, limit?): MemorySearchResult[]
Search memories using hybrid scoring (FTS5 + temporal decay + importance).
User ID
Search query
Maximum results (default: 20)
Sorted results (highest relevance first)
consolidate(userId): { merged, pruned, decayed }
Consolidate memories (merge duplicates, prune low-value entries, apply temporal decay).
User ID
Number of duplicate entries merged
Number of low-value entries deleted
Number of entries with importance decayed
- Decay: Reduce importance by 5% for entries not accessed in 7+ days
- Prune: Delete entries with importance < 0.1 AND access_count == 0 AND older than 30 days
- Merge: Combine duplicate/similar entries (>80% content similarity)
getContextForAgent(userId, query?): string
Get formatted context string for injection into agent system prompt.
User ID
Optional search query for relevant memories
Formatted context with relevant memories, high-importance events, and key-value facts
reinforce(memoryId): void
Strengthen a memory (bump access count and last accessed timestamp).
Event ID to reinforce
getEvent(id): EpisodicRecord | null
Retrieve a single episodic event by ID.
Event ID
Event record or null if not found
getEvents(userId, limit?): EpisodicRecord[]
Get recent episodic events for a user.
User ID
Maximum events (default: 50)
Events sorted by created_at (descending)
Types
EpisodicEventType
EpisodicRecord
MemorySearchResult
MemoryEngine
Example Usage
Basic Memory Operations
Integration with Agent Loop
Periodic Consolidation
Manual Memory Reinforcement
Performance Considerations
- FTS5 Index: All episodic events are automatically indexed in SQLite FTS5
- Search Speed: ~1-2ms for 1000 events, ~10-20ms for 10,000 events
- Consolidation: Run daily or weekly to prevent database bloat
- Memory Usage: ~1KB per episodic event (including FTS5 index)
Design Philosophy
Why not vector embeddings? Tiny Claw’s memory system uses FTS5 + temporal decay + importance scoring instead of vector embeddings for several reasons:- Zero API dependencies - No OpenAI/Anthropic API calls for embeddings
- 100% local - Works offline, no external services
- Deterministic - Same query always returns same results (reproducible)
- Fast - BM25 is faster than cosine similarity on small-medium datasets
- Explainable - Clear why a memory was retrieved (keyword match + temporal + importance)
- Ebbinghaus-inspired - Mimics human memory decay patterns
- Dataset < 100K entries (typical for personal agent)
- Exact keyword matches are important
- Temporal recency matters
- Offline operation is required
Related Packages
- @tinyclaw/core - Core agent runtime and database
- @tinyclaw/types - Type definitions
- @tinyclaw/learning - Pattern learning engine