@claude-flow/memory 3.0.0-alpha.2 → 3.0.0-alpha.21
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 +651 -42
- package/dist/agent-memory-scope.d.ts +131 -0
- package/dist/agent-memory-scope.d.ts.map +1 -0
- package/dist/agent-memory-scope.js +223 -0
- package/dist/agent-memory-scope.js.map +1 -0
- package/dist/agent-memory-scope.test.d.ts +8 -0
- package/dist/agent-memory-scope.test.d.ts.map +1 -0
- package/dist/agent-memory-scope.test.js +463 -0
- package/dist/agent-memory-scope.test.js.map +1 -0
- package/dist/agentdb-adapter.d.ts +82 -4
- package/dist/agentdb-adapter.d.ts.map +1 -1
- package/dist/agentdb-adapter.js +388 -17
- package/dist/agentdb-adapter.js.map +1 -1
- package/dist/agentdb-backend.d.ts +6 -0
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +89 -25
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/auto-memory-bridge.d.ts +237 -0
- package/dist/auto-memory-bridge.d.ts.map +1 -0
- package/dist/auto-memory-bridge.js +758 -0
- package/dist/auto-memory-bridge.js.map +1 -0
- package/dist/auto-memory-bridge.test.d.ts +8 -0
- package/dist/auto-memory-bridge.test.d.ts.map +1 -0
- package/dist/auto-memory-bridge.test.js +849 -0
- package/dist/auto-memory-bridge.test.js.map +1 -0
- package/dist/benchmark.test.d.ts +2 -0
- package/dist/benchmark.test.d.ts.map +1 -0
- package/dist/benchmark.test.js +277 -0
- package/dist/benchmark.test.js.map +1 -0
- package/dist/consolidator.d.ts +96 -0
- package/dist/consolidator.d.ts.map +1 -0
- package/dist/consolidator.js +209 -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 +239 -0
- package/dist/consolidator.test.js.map +1 -0
- package/dist/controller-registry.d.ts +248 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +1086 -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 +691 -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 +192 -0
- package/dist/graceful-retrieval.test.js.map +1 -0
- package/dist/hnsw-index.d.ts +51 -0
- package/dist/hnsw-index.d.ts.map +1 -1
- package/dist/hnsw-index.js +396 -12
- 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/hybrid-backend.d.ts +28 -0
- package/dist/hybrid-backend.d.ts.map +1 -1
- package/dist/hybrid-backend.js +82 -4
- package/dist/hybrid-backend.js.map +1 -1
- package/dist/hybrid-backend.test.js +6 -5
- package/dist/hybrid-backend.test.js.map +1 -1
- package/dist/index.d.ts +167 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +277 -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 +137 -0
- package/dist/learning-bridge.d.ts.map +1 -0
- package/dist/learning-bridge.js +335 -0
- package/dist/learning-bridge.js.map +1 -0
- package/dist/learning-bridge.test.d.ts +8 -0
- package/dist/learning-bridge.test.d.ts.map +1 -0
- package/dist/learning-bridge.test.js +578 -0
- package/dist/learning-bridge.test.js.map +1 -0
- package/dist/memory-graph.d.ts +100 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +333 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/memory-graph.test.d.ts +8 -0
- package/dist/memory-graph.test.d.ts.map +1 -0
- package/dist/memory-graph.test.js +609 -0
- package/dist/memory-graph.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.d.ts +118 -0
- package/dist/smart-retrieval.d.ts.map +1 -0
- package/dist/smart-retrieval.js +322 -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 +238 -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 +104 -8
- 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 +96 -5
- package/dist/sqljs-backend.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +21 -8
- package/.agentic-flow/intelligence.json +0 -16
- package/__tests__/coverage/base.css +0 -224
- package/__tests__/coverage/block-navigation.js +0 -87
- package/__tests__/coverage/coverage-final.json +0 -19
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +0 -206
- package/__tests__/coverage/lcov-report/base.css +0 -224
- package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +0 -206
- package/__tests__/coverage/lcov-report/prettify.css +0 -1
- package/__tests__/coverage/lcov-report/prettify.js +0 -2
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +0 -210
- package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
- package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
- package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
- package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
- package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
- package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
- package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
- package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
- package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
- package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
- package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
- package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
- package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
- package/__tests__/coverage/lcov-report/src/index.html +0 -266
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
- package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
- package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
- package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
- package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
- package/__tests__/coverage/lcov.info +0 -10238
- package/__tests__/coverage/prettify.css +0 -1
- package/__tests__/coverage/prettify.js +0 -2
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +0 -210
- package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
- package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
- package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
- package/__tests__/coverage/src/application/commands/index.html +0 -131
- package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
- package/__tests__/coverage/src/application/queries/index.html +0 -116
- package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
- package/__tests__/coverage/src/application/services/index.html +0 -116
- package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
- package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
- package/__tests__/coverage/src/database-provider.ts.html +0 -1618
- package/__tests__/coverage/src/domain/entities/index.html +0 -116
- package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
- package/__tests__/coverage/src/domain/services/index.html +0 -116
- package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
- package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
- package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
- package/__tests__/coverage/src/index.html +0 -266
- package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
- package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
- package/__tests__/coverage/src/migration.ts.html +0 -2092
- package/__tests__/coverage/src/query-builder.ts.html +0 -1711
- package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
- package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
- package/__tests__/coverage/src/types.ts.html +0 -2266
- package/benchmarks/cache-hit-rate.bench.ts +0 -535
- package/benchmarks/hnsw-indexing.bench.ts +0 -552
- package/benchmarks/memory-write.bench.ts +0 -469
- package/benchmarks/vector-search.bench.ts +0 -449
- package/docs/AGENTDB-INTEGRATION.md +0 -388
- package/docs/CROSS_PLATFORM.md +0 -505
- package/docs/WINDOWS_SUPPORT.md +0 -422
- package/examples/agentdb-example.ts +0 -345
- package/examples/cross-platform-usage.ts +0 -326
- package/framework/benchmark.ts +0 -112
- package/src/agentdb-adapter.ts +0 -884
- package/src/agentdb-backend.test.ts +0 -339
- package/src/agentdb-backend.ts +0 -1016
- package/src/application/commands/delete-memory.command.ts +0 -172
- package/src/application/commands/store-memory.command.ts +0 -103
- package/src/application/index.ts +0 -36
- package/src/application/queries/search-memory.query.ts +0 -237
- package/src/application/services/memory-application-service.ts +0 -236
- package/src/cache-manager.ts +0 -516
- package/src/database-provider.test.ts +0 -364
- package/src/database-provider.ts +0 -511
- package/src/domain/entities/memory-entry.ts +0 -289
- package/src/domain/index.ts +0 -35
- package/src/domain/repositories/memory-repository.interface.ts +0 -120
- package/src/domain/services/memory-domain-service.ts +0 -403
- package/src/hnsw-index.ts +0 -1013
- package/src/hybrid-backend.test.ts +0 -399
- package/src/hybrid-backend.ts +0 -694
- package/src/index.ts +0 -515
- package/src/infrastructure/index.ts +0 -23
- package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
- package/src/migration.ts +0 -669
- package/src/query-builder.ts +0 -542
- package/src/sqlite-backend.ts +0 -732
- package/src/sqljs-backend.ts +0 -763
- package/src/types.ts +0 -727
- package/tmp.json +0 -0
- package/tsconfig.json +0 -9
- package/tsconfig.tsbuildinfo +0 -1
- package/verify-cross-platform.ts +0 -170
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RVF Migration Utility — bidirectional migration between RVF and legacy
|
|
3
|
+
* formats (JSON files, sql.js / better-sqlite3 databases).
|
|
4
|
+
* @module @claude-flow/memory/rvf-migration
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, writeFile, rename, mkdir } from 'node:fs/promises';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { dirname, resolve } from 'node:path';
|
|
9
|
+
import { RvfBackend } from './rvf-backend.js';
|
|
10
|
+
import { generateMemoryId } from './types.js';
|
|
11
|
+
// -- Internal helpers -------------------------------------------------------
|
|
12
|
+
function fillDefaults(raw) {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
return {
|
|
15
|
+
id: raw.id ?? generateMemoryId(),
|
|
16
|
+
key: raw.key ?? '',
|
|
17
|
+
content: raw.content ?? '',
|
|
18
|
+
type: raw.type ?? 'semantic',
|
|
19
|
+
namespace: raw.namespace ?? 'default',
|
|
20
|
+
tags: raw.tags ?? [],
|
|
21
|
+
metadata: raw.metadata ?? {},
|
|
22
|
+
ownerId: raw.ownerId,
|
|
23
|
+
accessLevel: raw.accessLevel ?? 'private',
|
|
24
|
+
createdAt: raw.createdAt ?? now,
|
|
25
|
+
updatedAt: raw.updatedAt ?? now,
|
|
26
|
+
expiresAt: raw.expiresAt,
|
|
27
|
+
version: raw.version ?? 1,
|
|
28
|
+
references: raw.references ?? [],
|
|
29
|
+
accessCount: raw.accessCount ?? 0,
|
|
30
|
+
lastAccessedAt: raw.lastAccessedAt ?? now,
|
|
31
|
+
embedding: deserializeEmbedding(raw.embedding),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function deserializeEmbedding(value) {
|
|
35
|
+
if (!value)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (value instanceof Float32Array)
|
|
38
|
+
return value;
|
|
39
|
+
if (value instanceof Buffer || value instanceof Uint8Array) {
|
|
40
|
+
if (value.byteLength === 0)
|
|
41
|
+
return undefined;
|
|
42
|
+
const out = new Float32Array(value.byteLength / 4);
|
|
43
|
+
const view = new DataView(value.buffer, value.byteOffset, value.byteLength);
|
|
44
|
+
for (let i = 0; i < out.length; i++)
|
|
45
|
+
out[i] = view.getFloat32(i * 4, true);
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(value))
|
|
49
|
+
return new Float32Array(value);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function serializeForJson(entry) {
|
|
53
|
+
return { ...entry, embedding: entry.embedding ? Array.from(entry.embedding) : undefined };
|
|
54
|
+
}
|
|
55
|
+
function validateMigrationPath(p) {
|
|
56
|
+
if (!p || typeof p !== 'string')
|
|
57
|
+
throw new Error('Path must be a non-empty string');
|
|
58
|
+
if (p.includes('\0'))
|
|
59
|
+
throw new Error('Path contains null bytes');
|
|
60
|
+
}
|
|
61
|
+
async function ensureDir(filePath) {
|
|
62
|
+
validateMigrationPath(filePath);
|
|
63
|
+
const dir = dirname(resolve(filePath));
|
|
64
|
+
if (!existsSync(dir))
|
|
65
|
+
await mkdir(dir, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
async function atomicWrite(targetPath, data) {
|
|
68
|
+
validateMigrationPath(targetPath);
|
|
69
|
+
const abs = resolve(targetPath);
|
|
70
|
+
const tmp = abs + '.tmp.' + Date.now();
|
|
71
|
+
await ensureDir(abs);
|
|
72
|
+
await writeFile(tmp, data, typeof data === 'string' ? 'utf-8' : undefined);
|
|
73
|
+
await rename(tmp, abs);
|
|
74
|
+
}
|
|
75
|
+
function mkResult(success, entriesMigrated, sourceFormat, targetFormat, startMs, errors) {
|
|
76
|
+
return { success, entriesMigrated, sourceFormat, targetFormat, durationMs: Date.now() - startMs, errors };
|
|
77
|
+
}
|
|
78
|
+
function normalizeSqliteRow(row) {
|
|
79
|
+
const out = { ...row };
|
|
80
|
+
for (const col of ['tags', 'metadata', 'references']) {
|
|
81
|
+
if (typeof out[col] === 'string') {
|
|
82
|
+
try {
|
|
83
|
+
out[col] = JSON.parse(out[col]);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
out[col] = col === 'metadata' ? {} : [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
async function readSqliteRows(dbPath) {
|
|
93
|
+
// Attempt better-sqlite3
|
|
94
|
+
try {
|
|
95
|
+
const mod = await import('better-sqlite3');
|
|
96
|
+
const Database = mod.default ?? mod;
|
|
97
|
+
const db = new Database(dbPath, { readonly: true });
|
|
98
|
+
try {
|
|
99
|
+
return db.prepare('SELECT * FROM memory_entries').all();
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
db.close();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch { /* unavailable */ }
|
|
106
|
+
// Attempt sql.js
|
|
107
|
+
try {
|
|
108
|
+
const mod = await import('sql.js');
|
|
109
|
+
const SQL = await (mod.default ?? mod)();
|
|
110
|
+
const db = new SQL.Database(await readFile(dbPath));
|
|
111
|
+
try {
|
|
112
|
+
const stmt = db.prepare('SELECT * FROM memory_entries');
|
|
113
|
+
const rows = [];
|
|
114
|
+
while (stmt.step())
|
|
115
|
+
rows.push(stmt.getAsObject());
|
|
116
|
+
stmt.free();
|
|
117
|
+
return rows;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
db.close();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* unavailable */ }
|
|
124
|
+
throw new Error('Cannot read SQLite: install better-sqlite3 or sql.js');
|
|
125
|
+
}
|
|
126
|
+
// -- Batch migration helper -------------------------------------------------
|
|
127
|
+
async function migrateBatches(items, rvfPath, options, normalize) {
|
|
128
|
+
const batchSize = options.batchSize ?? 500;
|
|
129
|
+
const dimensions = options.dimensions ?? 1536;
|
|
130
|
+
const backend = new RvfBackend({ databasePath: rvfPath, dimensions, verbose: options.verbose });
|
|
131
|
+
await backend.initialize();
|
|
132
|
+
let migrated = 0;
|
|
133
|
+
const errors = [];
|
|
134
|
+
try {
|
|
135
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
136
|
+
const batch = items.slice(i, i + batchSize);
|
|
137
|
+
const entries = [];
|
|
138
|
+
for (const item of batch) {
|
|
139
|
+
try {
|
|
140
|
+
entries.push(fillDefaults(normalize ? normalize(item) : item));
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
errors.push(`Entry ${item.id ?? i}: ${e.message}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (entries.length > 0) {
|
|
147
|
+
await backend.bulkInsert(entries);
|
|
148
|
+
migrated += entries.length;
|
|
149
|
+
}
|
|
150
|
+
options.onProgress?.({ current: Math.min(i + batchSize, items.length), total: items.length, phase: 'migrating' });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await backend.shutdown();
|
|
155
|
+
}
|
|
156
|
+
return { migrated, errors };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Bidirectional migration utility between RVF and legacy memory formats.
|
|
160
|
+
*
|
|
161
|
+
* All methods are static — no instantiation required.
|
|
162
|
+
*/
|
|
163
|
+
export class RvfMigrator {
|
|
164
|
+
/** Migrate a JSON memory file to RVF format. */
|
|
165
|
+
static async fromJsonFile(jsonPath, rvfPath, options = {}) {
|
|
166
|
+
const start = Date.now();
|
|
167
|
+
const raw = await readFile(jsonPath, 'utf-8');
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = JSON.parse(raw);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
return mkResult(false, 0, 'json', 'rvf', start, [`Invalid JSON: ${e.message}`]);
|
|
174
|
+
}
|
|
175
|
+
const items = Array.isArray(parsed) ? parsed : [parsed];
|
|
176
|
+
const { migrated, errors } = await migrateBatches(items, rvfPath, options);
|
|
177
|
+
if (options.verbose)
|
|
178
|
+
console.log(`[RvfMigrator] Migrated ${migrated} entries from JSON to RVF`);
|
|
179
|
+
return mkResult(errors.length === 0, migrated, 'json', 'rvf', start, errors);
|
|
180
|
+
}
|
|
181
|
+
/** Migrate a SQLite (better-sqlite3 / sql.js) database to RVF. */
|
|
182
|
+
static async fromSqlite(dbPath, rvfPath, options = {}) {
|
|
183
|
+
const start = Date.now();
|
|
184
|
+
let rows;
|
|
185
|
+
try {
|
|
186
|
+
rows = await readSqliteRows(dbPath);
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
return mkResult(false, 0, 'sqlite', 'rvf', start, [e.message]);
|
|
190
|
+
}
|
|
191
|
+
options.onProgress?.({ current: 0, total: rows.length, phase: 'reading' });
|
|
192
|
+
const { migrated, errors } = await migrateBatches(rows, rvfPath, options, normalizeSqliteRow);
|
|
193
|
+
if (options.verbose)
|
|
194
|
+
console.log(`[RvfMigrator] Migrated ${migrated} entries from SQLite to RVF`);
|
|
195
|
+
return mkResult(errors.length === 0, migrated, 'sqlite', 'rvf', start, errors);
|
|
196
|
+
}
|
|
197
|
+
/** Export an RVF file back to a JSON array (backward compatibility). */
|
|
198
|
+
static async toJsonFile(rvfPath, jsonPath) {
|
|
199
|
+
const start = Date.now();
|
|
200
|
+
const backend = new RvfBackend({ databasePath: rvfPath });
|
|
201
|
+
await backend.initialize();
|
|
202
|
+
let entries;
|
|
203
|
+
try {
|
|
204
|
+
entries = await backend.query({ type: 'hybrid', limit: Number.MAX_SAFE_INTEGER });
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await backend.shutdown();
|
|
208
|
+
}
|
|
209
|
+
const warnings = [];
|
|
210
|
+
if (entries.length === 0)
|
|
211
|
+
warnings.push('Source RVF file contained no entries');
|
|
212
|
+
await atomicWrite(jsonPath, JSON.stringify(entries.map(serializeForJson), null, 2));
|
|
213
|
+
return mkResult(true, entries.length, 'rvf', 'json', start, warnings);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Detect file format by magic bytes.
|
|
217
|
+
* - RVF\0 (0x52 0x56 0x46 0x00) -> 'rvf'
|
|
218
|
+
* - SQLi (0x53 0x51 0x4C 0x69) -> 'sqlite'
|
|
219
|
+
* - Leading [ or { -> 'json'
|
|
220
|
+
*/
|
|
221
|
+
static async detectFormat(filePath) {
|
|
222
|
+
if (!existsSync(filePath))
|
|
223
|
+
return 'unknown';
|
|
224
|
+
const fd = await import('node:fs').then(m => m.promises.open(filePath, 'r'));
|
|
225
|
+
try {
|
|
226
|
+
const buf = Buffer.alloc(16);
|
|
227
|
+
await fd.read(buf, 0, 16, 0);
|
|
228
|
+
if (buf[0] === 0x52 && buf[1] === 0x56 && buf[2] === 0x46 && buf[3] === 0x00)
|
|
229
|
+
return 'rvf';
|
|
230
|
+
if (buf[0] === 0x53 && buf[1] === 0x51 && buf[2] === 0x4C && buf[3] === 0x69)
|
|
231
|
+
return 'sqlite';
|
|
232
|
+
const head = buf.toString('utf-8').trimStart();
|
|
233
|
+
if (head.startsWith('[') || head.startsWith('{'))
|
|
234
|
+
return 'json';
|
|
235
|
+
return 'unknown';
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
await fd.close();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Auto-detect source format and migrate to RVF. */
|
|
242
|
+
static async autoMigrate(sourcePath, targetRvfPath, options = {}) {
|
|
243
|
+
const format = await RvfMigrator.detectFormat(sourcePath);
|
|
244
|
+
if (options.verbose)
|
|
245
|
+
console.log(`[RvfMigrator] Detected source format: ${format}`);
|
|
246
|
+
switch (format) {
|
|
247
|
+
case 'json': return RvfMigrator.fromJsonFile(sourcePath, targetRvfPath, options);
|
|
248
|
+
case 'sqlite': return RvfMigrator.fromSqlite(sourcePath, targetRvfPath, options);
|
|
249
|
+
case 'rvf': return { success: true, entriesMigrated: 0, sourceFormat: 'rvf', targetFormat: 'rvf', durationMs: 0, errors: [] };
|
|
250
|
+
default: return { success: false, entriesMigrated: 0, sourceFormat: 'unknown', targetFormat: 'rvf', durationMs: 0, errors: [`Unrecognized format: ${sourcePath}`] };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=rvf-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rvf-migration.js","sourceRoot":"","sources":["../src/rvf-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartRetrieval — LongMemEval-derived retrieval pipeline (ADR-090)
|
|
3
|
+
*
|
|
4
|
+
* Wraps a raw HNSW `SearchFn` with the optimizations identified by the
|
|
5
|
+
* ADR-088 LongMemEval benchmark:
|
|
6
|
+
*
|
|
7
|
+
* 1. Query expansion (template-based, no LLM)
|
|
8
|
+
* 2. Multi-query fan-out + Reciprocal Rank Fusion
|
|
9
|
+
* 3. Recency boost from metadata timestamps
|
|
10
|
+
* 4. MMR diversity re-ranking (token-Jaccard proxy)
|
|
11
|
+
* 5. Session round-robin for multi-session coverage
|
|
12
|
+
*
|
|
13
|
+
* The module is pluggable: callers provide a `SearchFn` that hits whatever
|
|
14
|
+
* raw store they use (AgentDB HNSW, sql.js, a test fake, etc.). That keeps
|
|
15
|
+
* `@claude-flow/memory` free of a hard dependency on the CLI's memory-initializer
|
|
16
|
+
* and makes the pipeline easy to benchmark in isolation.
|
|
17
|
+
*/
|
|
18
|
+
export interface SearchCandidate {
|
|
19
|
+
id: string;
|
|
20
|
+
key: string;
|
|
21
|
+
content: string;
|
|
22
|
+
score: number;
|
|
23
|
+
namespace: string;
|
|
24
|
+
/** Optional metadata pulled through from the underlying store. */
|
|
25
|
+
metadata?: Record<string, unknown>;
|
|
26
|
+
/** Optional unix-ms timestamp used by the recency booster. */
|
|
27
|
+
createdAt?: number;
|
|
28
|
+
/** Optional unix-ms timestamp; preferred over createdAt when present. */
|
|
29
|
+
updatedAt?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface RawSearchRequest {
|
|
32
|
+
query: string;
|
|
33
|
+
namespace?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
threshold?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface RawSearchResponse {
|
|
38
|
+
results: SearchCandidate[];
|
|
39
|
+
}
|
|
40
|
+
/** Pluggable raw search function — typically wraps HNSW or a test fake. */
|
|
41
|
+
export type SearchFn = (req: RawSearchRequest) => Promise<RawSearchResponse>;
|
|
42
|
+
export interface SmartSearchOptions {
|
|
43
|
+
query: string;
|
|
44
|
+
namespace?: string;
|
|
45
|
+
/** Final number of results to return (default 10). */
|
|
46
|
+
limit?: number;
|
|
47
|
+
/** Similarity floor applied to the raw store (default 0.3). */
|
|
48
|
+
threshold?: number;
|
|
49
|
+
/** Fan out 2-3 expanded query variants and fuse with RRF. Default: true. */
|
|
50
|
+
multiQuery?: boolean;
|
|
51
|
+
/** Re-score with recency boost using entry timestamps. Default: true. */
|
|
52
|
+
recencyBoost?: boolean;
|
|
53
|
+
/** Apply MMR diversity re-ranking. Default: true. */
|
|
54
|
+
diversityMMR?: boolean;
|
|
55
|
+
/** Round-robin across distinct session_ids. Default: true. */
|
|
56
|
+
sessionDiversity?: boolean;
|
|
57
|
+
/** How many candidates to pull from the raw store per variant (default limit × 3). */
|
|
58
|
+
fanOutK?: number;
|
|
59
|
+
/** RRF constant; 60 is the standard default. */
|
|
60
|
+
rrfK?: number;
|
|
61
|
+
/** Recency half-life in days; older entries decay past this. Default 30. */
|
|
62
|
+
recencyHalfLifeDays?: number;
|
|
63
|
+
/** Max recency multiplier applied to top of the curve. Default 0.2. */
|
|
64
|
+
recencyWeight?: number;
|
|
65
|
+
/** MMR tradeoff λ — 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7. */
|
|
66
|
+
mmrLambda?: number;
|
|
67
|
+
/** Metadata key that identifies a session for round-robin. Default 'session_id'. */
|
|
68
|
+
sessionKey?: string;
|
|
69
|
+
/** "Now" for recency decay — pass a fixed value in tests for determinism. */
|
|
70
|
+
now?: number;
|
|
71
|
+
/** Override the default template-based expansions with your own set. */
|
|
72
|
+
queryExpansions?: (query: string) => string[];
|
|
73
|
+
}
|
|
74
|
+
export interface SmartSearchStats {
|
|
75
|
+
variantCount: number;
|
|
76
|
+
variants: string[];
|
|
77
|
+
rawCandidateCount: number;
|
|
78
|
+
afterRrfCount: number;
|
|
79
|
+
afterRecencyCount: number;
|
|
80
|
+
afterMmrCount: number;
|
|
81
|
+
afterSessionCount: number;
|
|
82
|
+
durationMs: number;
|
|
83
|
+
}
|
|
84
|
+
export interface SmartSearchResult {
|
|
85
|
+
results: SearchCandidate[];
|
|
86
|
+
stats: SmartSearchStats;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Default query expansion set. Keeps variants cheap (≤3) so we only pay
|
|
90
|
+
* ~3× the HNSW cost on the hot path.
|
|
91
|
+
*/
|
|
92
|
+
export declare function defaultQueryExpansions(query: string): string[];
|
|
93
|
+
/**
|
|
94
|
+
* Public-facing Reciprocal Rank Fusion. Takes any number of pre-sorted
|
|
95
|
+
* candidate lists (best-first) and fuses them with the RRF score
|
|
96
|
+
* `sum(1 / (k + rank_i))`. Used by the ADR-125 Phase 5 hybridSearch
|
|
97
|
+
* controller to fuse dense + sparse arms.
|
|
98
|
+
*/
|
|
99
|
+
export declare function applyRRF<T extends SearchCandidate>(rankedLists: T[][], k?: number): Array<{
|
|
100
|
+
candidate: T;
|
|
101
|
+
score: number;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* Public-facing MMR rerank.
|
|
105
|
+
*
|
|
106
|
+
* Re-exported as `applyMMR` for ADR-125 Phase 5 callers (the hybridSearch
|
|
107
|
+
* controller). Takes already-scored candidates plus an MMR lambda
|
|
108
|
+
* (1.0 = pure relevance, 0.0 = pure diversity).
|
|
109
|
+
*/
|
|
110
|
+
export declare function applyMMR<T extends SearchCandidate>(scored: Array<{
|
|
111
|
+
candidate: T;
|
|
112
|
+
score: number;
|
|
113
|
+
}>, lambda?: number, limit?: number): Array<{
|
|
114
|
+
candidate: T;
|
|
115
|
+
score: number;
|
|
116
|
+
}>;
|
|
117
|
+
export declare function smartSearch(search: SearchFn, opts: SmartSearchOptions): Promise<SmartSearchResult>;
|
|
118
|
+
//# sourceMappingURL=smart-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-retrieval.d.ts","sourceRoot":"","sources":["../src/smart-retrieval.ts"],"names":[],"mappings":"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"}
|