@claude-flow/memory 3.0.0-alpha.9 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +308 -37
- package/dist/agent-memory-scope.d.ts.map +1 -1
- package/dist/agent-memory-scope.js +10 -2
- package/dist/agent-memory-scope.js.map +1 -1
- package/dist/agentdb-adapter-key-isolation.test.d.ts +2 -0
- package/dist/agentdb-adapter-key-isolation.test.d.ts.map +1 -0
- package/dist/agentdb-adapter-key-isolation.test.js +175 -0
- package/dist/agentdb-adapter-key-isolation.test.js.map +1 -0
- package/dist/agentdb-adapter-upsert.test.d.ts +2 -0
- package/dist/agentdb-adapter-upsert.test.d.ts.map +1 -0
- package/dist/agentdb-adapter-upsert.test.js +216 -0
- package/dist/agentdb-adapter-upsert.test.js.map +1 -0
- package/dist/agentdb-adapter.d.ts +70 -1
- package/dist/agentdb-adapter.d.ts.map +1 -1
- package/dist/agentdb-adapter.js +365 -32
- package/dist/agentdb-adapter.js.map +1 -1
- package/dist/agentdb-backend.d.ts +25 -0
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +113 -28
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/agentdb-retrieval-guard.d.ts +76 -0
- package/dist/agentdb-retrieval-guard.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.js +77 -0
- package/dist/agentdb-retrieval-guard.js.map +1 -0
- package/dist/agentdb-retrieval-guard.test.d.ts +12 -0
- package/dist/agentdb-retrieval-guard.test.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.test.js +129 -0
- package/dist/agentdb-retrieval-guard.test.js.map +1 -0
- package/dist/auto-memory-bridge.d.ts +12 -1
- package/dist/auto-memory-bridge.d.ts.map +1 -1
- package/dist/auto-memory-bridge.js +101 -7
- package/dist/auto-memory-bridge.js.map +1 -1
- package/dist/auto-memory-bridge.test.js +121 -15
- package/dist/auto-memory-bridge.test.js.map +1 -1
- package/dist/auto-memory-index-3224.test.d.ts +2 -0
- package/dist/auto-memory-index-3224.test.d.ts.map +1 -0
- package/dist/auto-memory-index-3224.test.js +77 -0
- package/dist/auto-memory-index-3224.test.js.map +1 -0
- package/dist/consolidator-embedding-benchmark.test.d.ts +39 -0
- package/dist/consolidator-embedding-benchmark.test.d.ts.map +1 -0
- package/dist/consolidator-embedding-benchmark.test.js +366 -0
- package/dist/consolidator-embedding-benchmark.test.js.map +1 -0
- package/dist/consolidator.d.ts +131 -0
- package/dist/consolidator.d.ts.map +1 -0
- package/dist/consolidator.js +309 -0
- package/dist/consolidator.js.map +1 -0
- package/dist/consolidator.test.d.ts +17 -0
- package/dist/consolidator.test.d.ts.map +1 -0
- package/dist/consolidator.test.js +376 -0
- package/dist/consolidator.test.js.map +1 -0
- package/dist/controller-registry.d.ts +290 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +1095 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/controller-registry.test.d.ts +14 -0
- package/dist/controller-registry.test.d.ts.map +1 -0
- package/dist/controller-registry.test.js +818 -0
- package/dist/controller-registry.test.js.map +1 -0
- package/dist/database-provider.d.ts +14 -2
- package/dist/database-provider.d.ts.map +1 -1
- package/dist/database-provider.js +63 -3
- package/dist/database-provider.js.map +1 -1
- package/dist/database-provider.test.js +56 -3
- package/dist/database-provider.test.js.map +1 -1
- package/dist/entity-tagger.d.ts +31 -0
- package/dist/entity-tagger.d.ts.map +1 -0
- package/dist/entity-tagger.js +80 -0
- package/dist/entity-tagger.js.map +1 -0
- package/dist/entity-tagger.test.d.ts +12 -0
- package/dist/entity-tagger.test.d.ts.map +1 -0
- package/dist/entity-tagger.test.js +70 -0
- package/dist/entity-tagger.test.js.map +1 -0
- package/dist/fts5.test.d.ts +13 -0
- package/dist/fts5.test.d.ts.map +1 -0
- package/dist/fts5.test.js +144 -0
- package/dist/fts5.test.js.map +1 -0
- package/dist/graceful-retrieval.test.d.ts +14 -0
- package/dist/graceful-retrieval.test.d.ts.map +1 -0
- package/dist/graceful-retrieval.test.js +251 -0
- package/dist/graceful-retrieval.test.js.map +1 -0
- package/dist/hnsw-index.d.ts +62 -0
- package/dist/hnsw-index.d.ts.map +1 -1
- package/dist/hnsw-index.js +461 -16
- package/dist/hnsw-index.js.map +1 -1
- package/dist/hnsw-persistence.test.d.ts +13 -0
- package/dist/hnsw-persistence.test.d.ts.map +1 -0
- package/dist/hnsw-persistence.test.js +208 -0
- package/dist/hnsw-persistence.test.js.map +1 -0
- package/dist/hnsw-quantization.test.d.ts +17 -0
- package/dist/hnsw-quantization.test.d.ts.map +1 -0
- package/dist/hnsw-quantization.test.js +140 -0
- package/dist/hnsw-quantization.test.js.map +1 -0
- package/dist/hybrid-backend.d.ts +46 -2
- package/dist/hybrid-backend.d.ts.map +1 -1
- package/dist/hybrid-backend.js +120 -21
- package/dist/hybrid-backend.js.map +1 -1
- package/dist/hybrid-backend.test.js +139 -5
- package/dist/hybrid-backend.test.js.map +1 -1
- package/dist/index.d.ts +164 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +272 -30
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +10 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +71 -0
- package/dist/index.test.js.map +1 -0
- package/dist/json-security.d.ts +12 -0
- package/dist/json-security.d.ts.map +1 -0
- package/dist/json-security.js +20 -0
- package/dist/json-security.js.map +1 -0
- package/dist/learning-bridge.d.ts +29 -0
- package/dist/learning-bridge.d.ts.map +1 -1
- package/dist/learning-bridge.js +71 -6
- package/dist/learning-bridge.js.map +1 -1
- package/dist/learning-bridge.test.js +181 -1
- package/dist/learning-bridge.test.js.map +1 -1
- package/dist/memory-key.d.ts +3 -0
- package/dist/memory-key.d.ts.map +1 -0
- package/dist/memory-key.js +5 -0
- package/dist/memory-key.js.map +1 -0
- package/dist/migration.d.ts +19 -4
- package/dist/migration.d.ts.map +1 -1
- package/dist/migration.js +99 -24
- package/dist/migration.js.map +1 -1
- package/dist/migration.test.d.ts +11 -0
- package/dist/migration.test.d.ts.map +1 -0
- package/dist/migration.test.js +141 -0
- package/dist/migration.test.js.map +1 -0
- package/dist/mmr-benchmark.test.d.ts +2 -0
- package/dist/mmr-benchmark.test.d.ts.map +1 -0
- package/dist/mmr-benchmark.test.js +286 -0
- package/dist/mmr-benchmark.test.js.map +1 -0
- package/dist/mmr-rerank-perf.test.d.ts +2 -0
- package/dist/mmr-rerank-perf.test.d.ts.map +1 -0
- package/dist/mmr-rerank-perf.test.js +191 -0
- package/dist/mmr-rerank-perf.test.js.map +1 -0
- package/dist/persistent-sona.d.ts +144 -0
- package/dist/persistent-sona.d.ts.map +1 -0
- package/dist/persistent-sona.js +332 -0
- package/dist/persistent-sona.js.map +1 -0
- package/dist/rvf-backend.d.ts +53 -0
- package/dist/rvf-backend.d.ts.map +1 -0
- package/dist/rvf-backend.js +643 -0
- package/dist/rvf-backend.js.map +1 -0
- package/dist/rvf-learning-store.d.ts +139 -0
- package/dist/rvf-learning-store.d.ts.map +1 -0
- package/dist/rvf-learning-store.js +295 -0
- package/dist/rvf-learning-store.js.map +1 -0
- package/dist/rvf-migration.d.ts +45 -0
- package/dist/rvf-migration.d.ts.map +1 -0
- package/dist/rvf-migration.js +254 -0
- package/dist/rvf-migration.js.map +1 -0
- package/dist/smart-retrieval-scores.test.d.ts +2 -0
- package/dist/smart-retrieval-scores.test.d.ts.map +1 -0
- package/dist/smart-retrieval-scores.test.js +75 -0
- package/dist/smart-retrieval-scores.test.js.map +1 -0
- package/dist/smart-retrieval.d.ts +141 -0
- package/dist/smart-retrieval.d.ts.map +1 -0
- package/dist/smart-retrieval.js +389 -0
- package/dist/smart-retrieval.js.map +1 -0
- package/dist/smart-retrieval.test.d.ts +2 -0
- package/dist/smart-retrieval.test.d.ts.map +1 -0
- package/dist/smart-retrieval.test.js +418 -0
- package/dist/smart-retrieval.test.js.map +1 -0
- package/dist/sqlite-backend.d.ts +10 -0
- package/dist/sqlite-backend.d.ts.map +1 -1
- package/dist/sqlite-backend.js +101 -5
- package/dist/sqlite-backend.js.map +1 -1
- package/dist/sqljs-backend.d.ts +9 -0
- package/dist/sqljs-backend.d.ts.map +1 -1
- package/dist/sqljs-backend.js +91 -3
- package/dist/sqljs-backend.js.map +1 -1
- package/dist/tiered-memory.d.ts +171 -0
- package/dist/tiered-memory.d.ts.map +1 -0
- package/dist/tiered-memory.js +350 -0
- package/dist/tiered-memory.js.map +1 -0
- package/dist/tiered-memory.test.d.ts +9 -0
- package/dist/tiered-memory.test.d.ts.map +1 -0
- package/dist/tiered-memory.test.js +220 -0
- package/dist/tiered-memory.test.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +10 -8
package/README.md
CHANGED
|
@@ -1,26 +1,44 @@
|
|
|
1
1
|
# @claude-flow/memory
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@claude-flow/memory)
|
|
4
|
-
[](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.proof.json)
|
|
5
|
+
[](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.ledger.json)
|
|
5
6
|
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
[](https://www.typescriptlang.org/)
|
|
7
|
-
[](./benchmarks/results/)
|
|
8
9
|
|
|
9
|
-
> High-performance memory
|
|
10
|
+
> High-performance memory for Claude Flow V3 — one canonical `MemoryService` API on top of a real hybrid backend (sql.js + AgentDB), persistent HNSW vector search that survives restart, a memory-bound consolidator, graceful keyword (FTS5) fallback when the embedder isn't available, plus the AutoMemoryBridge, self-learning, and knowledge-graph layers that build on top.
|
|
11
|
+
|
|
12
|
+
## What's new in `3.0.0-alpha.18` (ADR-125)
|
|
13
|
+
|
|
14
|
+
This release closes out [ADR-125 — Memory Consolidation](../../../v3/docs/adr/ADR-125-memory-consolidation.md). If you're upgrading from `3.0.0-alpha.17` or earlier, this is the headline:
|
|
15
|
+
|
|
16
|
+
- **One canonical entry point.** `MemoryService` replaces the old `UnifiedMemoryService` name (both still exported — the old one is `@deprecated` and will be removed at `3.0.0-rc`). See [Migration](#migrating-from-30-0-alpha-17-or-earlier) below.
|
|
17
|
+
- **A real hybrid default.** `createHybridService(...)` finally returns a service whose backend is an actual `HybridBackend` (sql.js + AgentDB). Earlier releases silently downgraded this to AgentDB-only — ADR-009's promise wasn't delivered until now.
|
|
18
|
+
- **Persistent HNSW.** Closing a service snapshots its HNSW index to a sidecar (`<dbPath>.hnsw` + `<dbPath>.meta.json`). Reopening on the same path restores in milliseconds rather than rebuilding from scratch — search-ready cold start.
|
|
19
|
+
- **`MemoryConsolidator`.** A background service that evicts expired entries from indexes *and* HNSW, deduplicates by content hash, and rebuilds the HNSW index when it gets fragmented. Auto-runs on a configurable timer (default 6 hours) so memory stays bounded.
|
|
20
|
+
- **Graceful retrieval.** `service.search('query')` no longer throws when `@claude-flow/embeddings` is unavailable — it degrades to FTS5 keyword search and emits `health.embedder = 'degraded'`. The full hybrid path also adds real Reciprocal Rank Fusion + MMR diversity rerank.
|
|
21
|
+
- **Reproducible benchmarks.** `npm run bench` now actually runs. The HNSW search baseline (single-threaded, 1k × 128-dim cosine vectors on Apple Silicon, Node 22): **0.53 ms / search · 1,889 ops/s · 533 ms to build 1k**. See [`benchmarks/results/baseline-20260519T212453Z.md`](./benchmarks/results/baseline-20260519T212453Z.md).
|
|
22
|
+
- **Node 26 install support** ([#1867](https://github.com/ruvnet/ruflo/issues/1867)) — `better-sqlite3` is fully optional; installs succeed on Node 24/26 and the package falls back to sql.js when the native build isn't available.
|
|
10
23
|
|
|
11
24
|
## Features
|
|
12
25
|
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
16
|
-
-
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
- **
|
|
23
|
-
- **
|
|
26
|
+
- **Canonical `MemoryService` API** — one entry point for store / retrieve / search / hybrid query
|
|
27
|
+
- **Real hybrid backend** — `HybridBackend` (sql.js + AgentDB) for structured + vector queries (ADR-009 / ADR-125 Phase 2)
|
|
28
|
+
- **Persistent HNSW** — index survives `close()` and restart; auto-snapshots every Nth write (ADR-125 Phase 3)
|
|
29
|
+
- **`MemoryConsolidator`** — `sweepExpired()` + `dedup()` + `compactHnsw()` + auto-run timer (ADR-125 Phase 4)
|
|
30
|
+
- **Graceful retrieval** — automatic FTS5 keyword fallback when embedder is unreachable; RRF + MMR for hybrid (ADR-125 Phase 5)
|
|
31
|
+
- **HNSW vector search** — measured **0.53 ms / search at 1k × 128 dim** on Apple Silicon; see baseline above
|
|
32
|
+
- **Auto Memory Bridge** — Bidirectional sync between Claude Code auto memory and AgentDB (ADR-048)
|
|
33
|
+
- **Self-Learning** — LearningBridge connects insights to SONA/ReasoningBank neural pipeline (ADR-049)
|
|
34
|
+
- **Knowledge Graph** — PageRank + label propagation community detection over memory entries (ADR-049)
|
|
35
|
+
- **Agent-Scoped Memory** — 3-scope agent memory (project/local/user) with cross-agent knowledge transfer (ADR-049)
|
|
36
|
+
- **Vector Quantization** — Binary, scalar, and product quantization for 4–32x memory reduction
|
|
37
|
+
- **Multiple Distance Metrics** — Cosine, Euclidean, dot product, and Manhattan
|
|
38
|
+
- **Query Builder** — Fluent API for building complex memory queries
|
|
39
|
+
- **Cache Manager** — LRU caching with configurable size and TTL
|
|
40
|
+
- **Migration Tools** — `MemoryMigrator` for moving from V2 memory systems
|
|
41
|
+
- **Cross-platform** — Works on Linux, macOS, and Windows; Node 18+ (including Node 24/26)
|
|
24
42
|
|
|
25
43
|
## Installation
|
|
26
44
|
|
|
@@ -28,28 +46,265 @@
|
|
|
28
46
|
npm install @claude-flow/memory
|
|
29
47
|
```
|
|
30
48
|
|
|
49
|
+
## Standalone use (without the Ruflo CLI)
|
|
50
|
+
|
|
51
|
+
This package works on its own — you don't need `@claude-flow/cli` or the
|
|
52
|
+
full Ruflo install. Use it any time you want HNSW vector search, an
|
|
53
|
+
AgentDB façade, or the v3 controller registry from your own app.
|
|
54
|
+
|
|
55
|
+
Two recipes that exercise the most-installed surface:
|
|
56
|
+
|
|
57
|
+
### Recipe 1 — HNSW index with built-in quantization (no other deps)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// recipe.mjs
|
|
61
|
+
import { HNSWIndex } from '@claude-flow/memory';
|
|
62
|
+
|
|
63
|
+
const index = new HNSWIndex({
|
|
64
|
+
dimensions: 8,
|
|
65
|
+
M: 16,
|
|
66
|
+
efConstruction: 200,
|
|
67
|
+
metric: 'cosine',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Add a few vectors
|
|
71
|
+
await index.addPoint('doc-a', new Float32Array([1, 0, 0, 0, 0, 0, 0, 0]));
|
|
72
|
+
await index.addPoint('doc-b', new Float32Array([0.9, 0.1, 0, 0, 0, 0, 0, 0]));
|
|
73
|
+
await index.addPoint('doc-c', new Float32Array([0, 1, 0, 0, 0, 0, 0, 0]));
|
|
74
|
+
|
|
75
|
+
// Search — top 2 nearest to "doc-a"-shaped query
|
|
76
|
+
const hits = await index.search(new Float32Array([1, 0, 0, 0, 0, 0, 0, 0]), 2);
|
|
77
|
+
console.log(hits); // [{ id: 'doc-a', distance: 0 }, { id: 'doc-b', distance: ~0.005 }]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Recipe 2 — Drive the controller registry against your own AgentDB
|
|
81
|
+
|
|
82
|
+
The registry coordinates 15+ memory controllers (learning bridge, memory
|
|
83
|
+
graph, tiered cache, vector backend, etc.) on top of an AgentDB instance
|
|
84
|
+
you own. Useful when you already have an AgentDB lifecycle and just
|
|
85
|
+
want the v3 governance layer (issue #2019 added the `agentdb` injection
|
|
86
|
+
field that makes this clean).
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { ControllerRegistry } from '@claude-flow/memory';
|
|
90
|
+
import { AgentDB } from 'agentdb';
|
|
91
|
+
|
|
92
|
+
const agentdb = new AgentDB({ dbPath: ':memory:' });
|
|
93
|
+
await agentdb.initialize();
|
|
94
|
+
|
|
95
|
+
const registry = new ControllerRegistry();
|
|
96
|
+
await registry.initialize({ agentdb });
|
|
97
|
+
|
|
98
|
+
// Now everything backed by AgentDB is reachable through the registry
|
|
99
|
+
const reflexion = registry.get('reflexion'); // ReflexionMemory
|
|
100
|
+
const vectorBackend = registry.get('vectorBackend'); // live vector backend
|
|
101
|
+
const enabled = registry.isEnabled('skills'); // true
|
|
102
|
+
|
|
103
|
+
const health = await registry.healthCheck();
|
|
104
|
+
console.log(`${health.activeControllers}/${health.controllers.length} controllers active`);
|
|
105
|
+
|
|
106
|
+
await registry.shutdown();
|
|
107
|
+
```
|
|
108
|
+
|
|
31
109
|
## Quick Start
|
|
32
110
|
|
|
111
|
+
The fastest way to get a full-featured memory service — hybrid backend, HNSW vector index, FTS5 keyword fallback, persistent snapshots, consolidation timer — is `createHybridService`:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { createHybridService } from '@claude-flow/memory';
|
|
115
|
+
|
|
116
|
+
async function embedder(text: string): Promise<Float32Array> {
|
|
117
|
+
// Use any embedding provider — OpenAI, @claude-flow/embeddings, your own model.
|
|
118
|
+
// If the embedder ever fails, MemoryService falls back to FTS5 keyword search
|
|
119
|
+
// automatically (emitting `health.embedder = 'degraded'`).
|
|
120
|
+
return new Float32Array(/* ... */);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const memory = await createHybridService('./data/memory.db', embedder, 1536);
|
|
124
|
+
await memory.initialize();
|
|
125
|
+
|
|
126
|
+
// Store an entry — content is embedded and added to both SQLite and HNSW
|
|
127
|
+
await memory.store({
|
|
128
|
+
key: 'auth-patterns',
|
|
129
|
+
content: 'OAuth 2.0 implementation patterns for secure authentication',
|
|
130
|
+
tags: ['auth', 'security', 'patterns'],
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Semantic search via HNSW
|
|
134
|
+
const similar = await memory.semanticSearch('user authentication best practices', 5);
|
|
135
|
+
|
|
136
|
+
// Keyword search via FTS5 (also used as the automatic fallback)
|
|
137
|
+
const exact = await memory.searchKeyword('OAuth 2.0', { limit: 10 });
|
|
138
|
+
|
|
139
|
+
// Hybrid search — RRF-fused dense + sparse, MMR-diversified
|
|
140
|
+
const blended = await memory.search('authentication patterns', { limit: 10 });
|
|
141
|
+
|
|
142
|
+
// Clean shutdown — flushes the consolidator timer and snapshots HNSW to disk
|
|
143
|
+
await memory.close();
|
|
144
|
+
|
|
145
|
+
// Reopen the same path — entries AND HNSW index are restored from sidecar
|
|
146
|
+
const reopened = await createHybridService('./data/memory.db', embedder, 1536);
|
|
147
|
+
await reopened.initialize();
|
|
148
|
+
// memory.search() is immediately fast — no rebuild
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
You can also use the lower-level primitives directly. `HNSWIndex` is exported and works without any of the service layer if you just want a vector index:
|
|
152
|
+
|
|
33
153
|
```typescript
|
|
34
|
-
import { HNSWIndex
|
|
154
|
+
import { HNSWIndex } from '@claude-flow/memory';
|
|
35
155
|
|
|
36
|
-
// Create HNSW index for vector search
|
|
37
156
|
const index = new HNSWIndex({
|
|
38
157
|
dimensions: 1536, // OpenAI embedding size
|
|
39
158
|
M: 16, // Max connections per node
|
|
40
159
|
efConstruction: 200,
|
|
41
|
-
metric: 'cosine'
|
|
160
|
+
metric: 'cosine',
|
|
42
161
|
});
|
|
43
162
|
|
|
44
|
-
// Add vectors
|
|
45
163
|
await index.addPoint('memory-1', new Float32Array(embedding));
|
|
46
164
|
await index.addPoint('memory-2', new Float32Array(embedding2));
|
|
47
165
|
|
|
48
|
-
// Search for similar vectors
|
|
49
166
|
const results = await index.search(queryVector, 10);
|
|
50
167
|
// [{ id: 'memory-1', distance: 0.05 }, { id: 'memory-2', distance: 0.12 }]
|
|
168
|
+
|
|
169
|
+
// New in 3.0.0-alpha.18: persist the index to a buffer for restore later
|
|
170
|
+
const snapshot: Buffer = index.serialize();
|
|
171
|
+
const restored = HNSWIndex.deserialize(snapshot);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Migrating from `3.0.0-alpha.17` or earlier
|
|
175
|
+
|
|
176
|
+
If you're already using this package:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// Before
|
|
180
|
+
import { UnifiedMemoryService } from '@claude-flow/memory';
|
|
181
|
+
const memory = new UnifiedMemoryService({ /* ... */ });
|
|
182
|
+
|
|
183
|
+
// After (recommended) — both names resolve to the same class
|
|
184
|
+
import { MemoryService } from '@claude-flow/memory';
|
|
185
|
+
const memory = new MemoryService({ /* ... */ });
|
|
186
|
+
|
|
187
|
+
// `UnifiedMemoryService` continues to work through 3.0.0-rc as a `@deprecated` alias.
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Two other things changed in `3.0.0-alpha.18`:
|
|
191
|
+
|
|
192
|
+
1. **`createHybridService` now does what its name says.** If you were relying on the old AgentDB-only downgrade, you'll get a real `HybridBackend` now — semantic search and structured queries both work without extra wiring.
|
|
193
|
+
2. **`semanticSearch` no longer throws when the embedder is absent.** Code that relied on a thrown error to detect a misconfigured embedder should listen for `health.embedder = 'degraded'` events instead. See [Graceful retrieval](#graceful-retrieval-fts5-fallback) below.
|
|
194
|
+
|
|
195
|
+
The `HnswLite` and `RvfBackend` classes are no longer top-level exports (they were internal implementation details). If your code imported them, switch to `HNSWIndex` (more capable, persistent) — they're verified to have zero external importers.
|
|
196
|
+
|
|
197
|
+
## Persistence
|
|
198
|
+
|
|
199
|
+
In `3.0.0-alpha.18` the HNSW index survives `close()` and restart. Snapshots happen automatically:
|
|
200
|
+
|
|
201
|
+
- On `service.close()`, the index is serialized to `<dbPath>.hnsw` and the in-memory entry/namespace/key/tag maps go to `<dbPath>.meta.json`.
|
|
202
|
+
- During the lifetime of the service, the index also auto-snapshots every Nth `store()` call (default `N=1000`, configurable via `MemoryServiceConfig.snapshotInterval`).
|
|
203
|
+
- On initialize, if both sidecars exist, they're restored. The service emits one of three `health.persistence` events: `'restored'` (success), `'fresh'` (no sidecar found — first run), or `'corrupt'` (deserialize failed — automatic fallback to fresh state).
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { MemoryService, HNSWIndex } from '@claude-flow/memory';
|
|
207
|
+
|
|
208
|
+
const memory = new MemoryService({
|
|
209
|
+
persistenceEnabled: true,
|
|
210
|
+
persistencePath: './data/memory.db',
|
|
211
|
+
snapshotInterval: 500, // snapshot every 500 stores
|
|
212
|
+
embeddingGenerator,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
memory.on('health.persistence', (status) => {
|
|
216
|
+
// 'restored' | 'fresh' | 'corrupt'
|
|
217
|
+
console.log('Persistence state:', status);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
await memory.initialize();
|
|
221
|
+
// ...store, query...
|
|
222
|
+
await memory.close(); // flushes a final snapshot
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Manual snapshot/restore on a raw `HNSWIndex`:
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
const buf: Buffer = index.serialize();
|
|
229
|
+
// write buf to disk, transfer between processes, etc.
|
|
230
|
+
|
|
231
|
+
const restored = HNSWIndex.deserialize(buf);
|
|
232
|
+
// search works immediately — no rebuild
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The serialized format is versioned with a magic header (`HNSW\x01`) — a corrupted or stale snapshot is detected and rejected loudly rather than silently producing wrong neighbors.
|
|
236
|
+
|
|
237
|
+
## Memory consolidation
|
|
238
|
+
|
|
239
|
+
`MemoryConsolidator` keeps the index bounded. Three operations:
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
import { MemoryConsolidator } from '@claude-flow/memory';
|
|
243
|
+
|
|
244
|
+
const consolidator = new MemoryConsolidator(memory, {
|
|
245
|
+
dedupStrategy: 'merge-tags', // 'keep-newest' | 'keep-oldest' | 'merge-tags'
|
|
246
|
+
intervalMs: 6 * 60 * 60 * 1000, // auto-run every 6h
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// Evict expired entries from all indexes (including HNSW)
|
|
250
|
+
const swept = await consolidator.sweepExpired();
|
|
251
|
+
// { removed: 142, remaining: 8503 }
|
|
252
|
+
|
|
253
|
+
// Deduplicate by SHA-256 content hash
|
|
254
|
+
const dedup = await consolidator.dedup('keep-newest');
|
|
255
|
+
// { merged: 23 }
|
|
256
|
+
|
|
257
|
+
// Rebuild HNSW to reclaim space after large churn
|
|
258
|
+
const compaction = await consolidator.compactHnsw();
|
|
259
|
+
// { before: 8503, after: 8503, durationMs: 198 }
|
|
260
|
+
|
|
261
|
+
// Or run all three in sequence
|
|
262
|
+
const result = await consolidator.runAll();
|
|
51
263
|
```
|
|
52
264
|
|
|
265
|
+
You don't have to construct it manually — `MemoryService` will wire it up if you opt in:
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
const memory = new MemoryService({
|
|
269
|
+
consolidator: {
|
|
270
|
+
autoRun: true, // start a setInterval that runs runAll()
|
|
271
|
+
intervalMs: 6 * 60 * 60 * 1000, // every 6h (default)
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
memory.on('consolidation.complete', (result) => {
|
|
276
|
+
console.log(`Swept ${result.swept.removed}, deduped ${result.dedup.merged}`);
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
The `nightlyLearner` controller in the AgentDB controller registry now delegates to `MemoryConsolidator.runAll()` instead of the old AgentDB pass-through, so the consolidator is invoked from every layer that expects the "nightly memory hygiene" hook.
|
|
281
|
+
|
|
282
|
+
## Graceful retrieval (FTS5 fallback)
|
|
283
|
+
|
|
284
|
+
`MemoryService.search()` and `semanticSearch()` no longer hard-fail when `@claude-flow/embeddings` (or whatever embedder you injected) is unavailable. They:
|
|
285
|
+
|
|
286
|
+
1. Try the embedder.
|
|
287
|
+
2. If it throws or is missing, emit `health.embedder = 'degraded'`.
|
|
288
|
+
3. Run the same query through FTS5 keyword search (porter + unicode61 tokenizer) and return those results.
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
const memory = new MemoryService({
|
|
292
|
+
// No embeddingGenerator — semantic queries will fall back to FTS5
|
|
293
|
+
});
|
|
294
|
+
await memory.initialize();
|
|
295
|
+
|
|
296
|
+
memory.on('health.embedder', (state) => {
|
|
297
|
+
// 'available' | 'degraded'
|
|
298
|
+
console.warn(`Embedder is ${state}`);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
await memory.store({ key: 'note-1', content: 'OAuth pattern review' });
|
|
302
|
+
const results = await memory.search('OAuth', { limit: 5 });
|
|
303
|
+
// Returns FTS-ranked matches; no throw
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
When **both** dense (HNSW) and sparse (FTS5) paths are available, `service.search(query)` runs both, fuses the rankings with Reciprocal Rank Fusion (`k=60`), and reranks with MMR (`λ=0.7`) for diversity. This is what the AgentDB `hybridSearch` controller exposes too — it used to be a stub that returned `null`; in `3.0.0-alpha.18` it's a real implementation.
|
|
307
|
+
|
|
53
308
|
## API Reference
|
|
54
309
|
|
|
55
310
|
### HNSW Index
|
|
@@ -174,21 +429,21 @@ const results = await new QueryBuilder()
|
|
|
174
429
|
### Migration
|
|
175
430
|
|
|
176
431
|
```typescript
|
|
177
|
-
import {
|
|
432
|
+
import { MemoryMigrator, createMigrator } from '@claude-flow/memory';
|
|
178
433
|
|
|
179
|
-
const
|
|
434
|
+
const migrator = createMigrator({
|
|
180
435
|
source: './data/v2-memory.db',
|
|
181
|
-
destination: './data/v3-memory.db'
|
|
436
|
+
destination: './data/v3-memory.db',
|
|
182
437
|
});
|
|
183
438
|
|
|
184
|
-
//
|
|
185
|
-
const preview = await
|
|
439
|
+
// Inspect what will be migrated
|
|
440
|
+
const preview = await migrator.preview();
|
|
186
441
|
console.log(`Will migrate ${preview.recordCount} records`);
|
|
187
442
|
|
|
188
443
|
// Execute migration
|
|
189
|
-
await
|
|
444
|
+
await migrator.execute({
|
|
190
445
|
batchSize: 1000,
|
|
191
|
-
onProgress: (progress) => console.log(`${progress.percent}%`)
|
|
446
|
+
onProgress: (progress) => console.log(`${progress.percent}%`),
|
|
192
447
|
});
|
|
193
448
|
```
|
|
194
449
|
|
|
@@ -523,13 +778,28 @@ const scopes = await listAgentScopes('/workspaces/my-project');
|
|
|
523
778
|
|
|
524
779
|
## Performance Benchmarks
|
|
525
780
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
781
|
+
Reproducible benchmarks ship in `benchmarks/*.bench.ts`. Run them yourself:
|
|
782
|
+
|
|
783
|
+
```bash
|
|
784
|
+
cd v3/@claude-flow/memory
|
|
785
|
+
npm run build
|
|
786
|
+
npm run bench # runs benchmarks/*.bench.ts under vitest
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### HNSW search baseline ([`baseline-20260519T212453Z.md`](./benchmarks/results/baseline-20260519T212453Z.md))
|
|
790
|
+
|
|
791
|
+
Measured on Apple Silicon (M-series), Node 22.22.1, vitest 4.0.16. Scenario: 1,000 random 128-dim cosine-normalized vectors loaded into a single `HNSWIndex`, then 200 query iterations after warmup.
|
|
792
|
+
|
|
793
|
+
| Metric | Value | Notes |
|
|
794
|
+
|---|---|---|
|
|
795
|
+
| `build_time_ms` | **533.42 ms** | Sequential `addPoint()` × 1,000 |
|
|
796
|
+
| `search_k10_avg_ms` | **0.5294 ms** | Post-warmup, average of 200 iterations |
|
|
797
|
+
| `search_k50_avg_ms` | **0.5235 ms** | k=50 ≈ k=10 — heap-based selection dominates |
|
|
798
|
+
| `add_avg_ms` | **0.8656 ms** | Incremental insert after the initial 1k |
|
|
799
|
+
| `search_k10_ops_per_sec` | **1,888.9 ops/s** | Derived |
|
|
800
|
+
| `search_k50_ops_per_sec` | **1,910.1 ops/s** | Derived |
|
|
801
|
+
|
|
802
|
+
These numbers are device-specific; CI baselines will replace this file once the GitHub Actions bench job lands. ADR-125 Phase 3 (persistent HNSW) means **cold-start** restoration should be a small fraction of `build_time_ms` once the snapshot benchmark is added.
|
|
533
803
|
|
|
534
804
|
### ADR-049 Benchmarks
|
|
535
805
|
|
|
@@ -571,10 +841,11 @@ import type {
|
|
|
571
841
|
|
|
572
842
|
## Dependencies
|
|
573
843
|
|
|
574
|
-
- `agentdb` - Vector database engine
|
|
575
|
-
- `
|
|
576
|
-
- `
|
|
577
|
-
- `@claude-flow/
|
|
844
|
+
- `agentdb` `^3.0.0-alpha.14` — Vector database engine
|
|
845
|
+
- `sql.js` — SQLite driver via WASM (always available; no native build required)
|
|
846
|
+
- `better-sqlite3` — **Optional** native SQLite driver for higher throughput. The package works without it (sql.js fallback), so installs succeed on Node 24/26 even when the native build can't compile ([#1867](https://github.com/ruvnet/ruflo/issues/1867))
|
|
847
|
+
- `@claude-flow/embeddings` — **Optional** for semantic search. When absent or failing, `search()` automatically falls back to FTS5 keyword (see [Graceful retrieval](#graceful-retrieval-fts5-fallback))
|
|
848
|
+
- `@claude-flow/neural` — **Optional** peer dependency for self-learning (graceful fallback when unavailable)
|
|
578
849
|
|
|
579
850
|
## Related Packages
|
|
580
851
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-memory-scope.d.ts","sourceRoot":"","sources":["../src/agent-memory-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,sBAAsB,EAEtB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAIjC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,mDAAmD;AACnD,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC/D,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;AA2CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-memory-scope.d.ts","sourceRoot":"","sources":["../src/agent-memory-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,sBAAsB,EAEtB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAIjC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,mDAAmD;AACnD,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC/D,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;AA2CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAyBR;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,CAWlB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,cAAc,EAC7B,YAAY,EAAE,gBAAgB,EAC9B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAwDzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,UAAU,CAAC,EAAE,MAAM,GAClB,KAAK,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkBtD"}
|
|
@@ -73,7 +73,12 @@ export function resolveAgentMemoryDir(agentName, scope, workingDir) {
|
|
|
73
73
|
// Sanitize agent name to prevent path traversal
|
|
74
74
|
const safeName = agentName.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
75
75
|
if (scope === 'user') {
|
|
76
|
-
const home = process.env.HOME
|
|
76
|
+
const home = process.env.HOME
|
|
77
|
+
|| process.env.USERPROFILE
|
|
78
|
+
|| (process.env.HOMEDRIVE && process.env.HOMEPATH ? process.env.HOMEDRIVE + process.env.HOMEPATH : '');
|
|
79
|
+
if (!home) {
|
|
80
|
+
throw new Error('Cannot determine home directory: HOME, USERPROFILE, and HOMEDRIVE+HOMEPATH are all undefined');
|
|
81
|
+
}
|
|
77
82
|
return path.join(home, '.claude', 'agent-memory', safeName);
|
|
78
83
|
}
|
|
79
84
|
// For project and local scopes, find git root
|
|
@@ -202,7 +207,10 @@ export function listAgentScopes(workingDir) {
|
|
|
202
207
|
const effectiveDir = workingDir || process.cwd();
|
|
203
208
|
const gitRoot = findGitRootSync(effectiveDir);
|
|
204
209
|
const baseDir = gitRoot || effectiveDir;
|
|
205
|
-
const home = process.env.HOME
|
|
210
|
+
const home = process.env.HOME
|
|
211
|
+
|| process.env.USERPROFILE
|
|
212
|
+
|| (process.env.HOMEDRIVE && process.env.HOMEPATH ? process.env.HOMEDRIVE + process.env.HOMEPATH : '')
|
|
213
|
+
|| '';
|
|
206
214
|
const projectDir = path.join(baseDir, '.claude', 'agent-memory');
|
|
207
215
|
const localDir = path.join(baseDir, '.claude', 'agent-memory-local');
|
|
208
216
|
const userDir = path.join(home, '.claude', 'agent-memory');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-memory-scope.js","sourceRoot":"","sources":["../src/agent-memory-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAwC3D,+BAA+B;AAE/B;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAEtC,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+BAA+B;AAE/B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,KAAuB,EACvB,UAAmB;IAEnB,gDAAgD;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAE3D,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"agent-memory-scope.js","sourceRoot":"","sources":["../src/agent-memory-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentdb-adapter-key-isolation.test.d.ts","sourceRoot":"","sources":["../src/agentdb-adapter-key-isolation.test.ts"],"names":[],"mappings":""}
|