@zensation/adapter-sqlite
Zero-config SQLite storage adapter for ZenBrain. No database server needed.
Quick Start
npm install @zensation/core @zensation/adapter-sqlite
This package is ESM. require() loads it on Node 22.12 and later; on Node 22.0–22.11, use import.
import { SemanticMemory } from '@zensation/core';
import { SqliteAdapter } from '@zensation/adapter-sqlite';
const storage = new SqliteAdapter({ filename: './my-memory.db' });
import { createMemoryAdapter } from '@zensation/adapter-sqlite';
const testStorage = createMemoryAdapter();
const memory = new SemanticMemory({ storage });
await memory.storeFact('FSRS outperforms SM-2 by 30%', 'research');
When to Use
| Development / prototyping | SQLite |
| Single-user desktop app | SQLite |
| Unit tests | SQLite (:memory:) |
| Multi-user production | PostgreSQL |
| Vector similarity search | PostgreSQL (pgvector) |
Limitations
- Similarity search is a full scan per query: embeddings are stored as JSON arrays and compared
by a cosine-distance function, with no ANN index. Fine for development and single-user data
volumes; use PostgreSQL with pgvector for large stores.
- Without an embedding provider, recall ranks by wording, not meaning: synonyms need one.
- Single-writer concurrency (WAL mode helps with reads)
Schema
The adapter creates these tables on first open (CREATE TABLE IF NOT EXISTS) and records the
schema version in PRAGMA user_version (exported as SCHEMA_VERSION, currently 1).
| Episodic | episodic_memories | id, content, context, embedding (JSON array), emotional_weight, metadata (JSON), created_at |
| Semantic | learned_facts | id, content, confidence, source, embedding, access_count, fsrs_difficulty, fsrs_stability, fsrs_next_review, created_at, last_accessed |
| Procedural | procedural_memories | id, trigger, steps (JSON), tools (JSON), outcome, embedding, success_rate, execution_count, created_at |
| Core | core_memory_blocks | id, label (one block per label), content, pinned (1 or 0), updated_at |
| Cross-context | cross_context_links | id, entity_a, entity_b (one link per pair), created_at |
| — | knowledge_entities | id, name, type, embedding, created_at |
Working and short-term memory live in the process and have no table. Episodes carry
emotional_weight; confidence is a column of facts only.
Timestamps are text in one format: ISO 8601, UTC, milliseconds, Z
(2026-09-28T21:25:17.000Z), so text order is time order and every value parses as UTC. Code
that writes these tables directly should use the same format — in SQL,
strftime('%Y-%m-%dT%H:%M:%fZ','now').
| 1 | One timestamp format. A file written by an earlier version is rewritten once when it is opened; text SQLite cannot read as a time is left as it was. |
Configuration
const storage = new SqliteAdapter({
filename: './data/memory.db',
walMode: true,
logger: console,
});
License
Apache 2.0
About ZenBrain
ZenBrain is a seven-layer, neuroscience-derived memory architecture for LLM agents, built as
zero-dependency TypeScript and published under Apache-2.0. The benchmark results, and the
configuration they were measured in, are reported in the paper; the reproduction packages
are on Zenodo.
Works out of the box without an embedding provider — lexical ranking, zero
dependencies. The paper's measurements used nomic-embed-text as the embedding provider.
License: Apache-2.0