@claude-flow/memory 3.0.0-alpha.9 → 3.0.1
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-cosine-cache.test.d.ts +2 -0
- package/dist/mmr-rerank-cosine-cache.test.d.ts.map +1 -0
- package/dist/mmr-rerank-cosine-cache.test.js +334 -0
- package/dist/mmr-rerank-cosine-cache.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 +399 -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
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"smart-retrieval-scores.test.d.ts","sourceRoot":"","sources":["../src/smart-retrieval-scores.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { smartSearch } from './smart-retrieval.js';
|
|
3
|
+
const candidate = (id, score) => ({
|
|
4
|
+
id, key: id, content: id, namespace: 'test', score,
|
|
5
|
+
});
|
|
6
|
+
const isolated = {
|
|
7
|
+
query: 'original', recencyBoost: false, diversityMMR: false, sessionDiversity: false,
|
|
8
|
+
};
|
|
9
|
+
describe('smartSearch raw retrieval score (#3327 Finding B)', () => {
|
|
10
|
+
it('retains raw relevance separately from multi-query RRF ranking', async () => {
|
|
11
|
+
const search = async ({ query }) => ({ results: query === 'original'
|
|
12
|
+
? [candidate('a', 0.8)]
|
|
13
|
+
: [candidate('b', 0.9), candidate('a', 0.65)],
|
|
14
|
+
});
|
|
15
|
+
const result = await smartSearch(search, {
|
|
16
|
+
...isolated, queryExpansions: () => ['original', 'expanded'],
|
|
17
|
+
});
|
|
18
|
+
expect(result.results.map(r => r.id)).toEqual(['a', 'b']);
|
|
19
|
+
expect(result.results[0].score).toBe(1 / 61 + 1 / 62);
|
|
20
|
+
expect(result.results[0]).toMatchObject({ rawScore: 0.8 });
|
|
21
|
+
});
|
|
22
|
+
it('retains the highest raw score across query variants', async () => {
|
|
23
|
+
const scores = { a: 0.41, b: 0.73, c: 0.52 };
|
|
24
|
+
const result = await smartSearch(async ({ query }) => ({
|
|
25
|
+
results: [candidate('same-document', scores[query])],
|
|
26
|
+
}), { ...isolated, queryExpansions: () => ['a', 'b', 'c'] });
|
|
27
|
+
expect(result.results[0].score).toBe(3 / 61);
|
|
28
|
+
expect(result.results[0]).toMatchObject({ rawScore: 0.73 });
|
|
29
|
+
});
|
|
30
|
+
it('preserves single-query scores and order, including zero', async () => {
|
|
31
|
+
const inputs = [candidate('a', 0.8), candidate('b', 0)];
|
|
32
|
+
const result = await smartSearch(async () => ({ results: inputs }), {
|
|
33
|
+
...isolated, multiQuery: false, threshold: 0,
|
|
34
|
+
});
|
|
35
|
+
expect(result.results).toEqual(inputs.map(r => ({ ...r, rawScore: r.score })));
|
|
36
|
+
expect(inputs[0]).not.toHaveProperty('rawScore'); // no mutation of SearchFn results
|
|
37
|
+
});
|
|
38
|
+
it('keeps raw zero while recency changes the final ranking score', async () => {
|
|
39
|
+
const result = await smartSearch(async () => ({ results: [{
|
|
40
|
+
...candidate('a', 0), updatedAt: 1000,
|
|
41
|
+
}] }), {
|
|
42
|
+
...isolated, queryExpansions: () => ['a', 'b'], threshold: 0,
|
|
43
|
+
recencyBoost: true, now: 1000,
|
|
44
|
+
});
|
|
45
|
+
expect(result.results[0].score).toBe((2 / 61) * 1.2);
|
|
46
|
+
expect(result.results[0]).toMatchObject({ rawScore: 0 });
|
|
47
|
+
});
|
|
48
|
+
it('preserves an explicitly supplied rawScore of zero', async () => {
|
|
49
|
+
const result = await smartSearch(async () => ({ results: [{
|
|
50
|
+
...candidate('a', 0.4), rawScore: 0,
|
|
51
|
+
}] }), { ...isolated, multiQuery: false });
|
|
52
|
+
expect(result.results[0]).toMatchObject({ score: 0.4, rawScore: 0 });
|
|
53
|
+
});
|
|
54
|
+
it('applies threshold only through raw candidate admission', async () => {
|
|
55
|
+
const admitted = [];
|
|
56
|
+
const thresholds = [];
|
|
57
|
+
const search = async ({ threshold }) => {
|
|
58
|
+
thresholds.push(threshold);
|
|
59
|
+
const results = [candidate('a', 0.7), candidate('b', 0.2)]
|
|
60
|
+
.filter(r => r.score >= (threshold ?? 0));
|
|
61
|
+
admitted.push(results.map(r => r.id));
|
|
62
|
+
return { results };
|
|
63
|
+
};
|
|
64
|
+
const result = await smartSearch(search, {
|
|
65
|
+
...isolated, threshold: 0.3, queryExpansions: () => ['a', 'b'],
|
|
66
|
+
});
|
|
67
|
+
expect(thresholds).toEqual([0.3, 0.3]);
|
|
68
|
+
expect(admitted).toEqual([['a'], ['a']]);
|
|
69
|
+
expect(result.results.map(r => r.id)).toEqual(['a']);
|
|
70
|
+
expect(result.results[0].score).toBe(2 / 61);
|
|
71
|
+
expect(result.results[0].score).toBeLessThan(0.3);
|
|
72
|
+
expect(result.results[0]).toMatchObject({ rawScore: 0.7 });
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=smart-retrieval-scores.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-retrieval-scores.test.js","sourceRoot":"","sources":["../src/smart-retrieval-scores.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
/** Raw retrieval score on input; pipeline ranking score on smartSearch output. */
|
|
23
|
+
score: number;
|
|
24
|
+
/**
|
|
25
|
+
* Underlying retrieval relevance before SmartRetrieval ranking, not necessarily
|
|
26
|
+
* cosine similarity. Defaults to the selected candidate's input score; RRF
|
|
27
|
+
* selects the candidate with the highest input score across query variants.
|
|
28
|
+
*/
|
|
29
|
+
rawScore?: number;
|
|
30
|
+
namespace: string;
|
|
31
|
+
/** Optional metadata pulled through from the underlying store. */
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
/** Optional unix-ms timestamp used by the recency booster. */
|
|
34
|
+
createdAt?: number;
|
|
35
|
+
/** Optional unix-ms timestamp; preferred over createdAt when present. */
|
|
36
|
+
updatedAt?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Optional embedding vector, when the caller's SearchFn has one on hand
|
|
39
|
+
* (e.g. already computed for the primary similarity score). When both
|
|
40
|
+
* candidates in an MMR comparison carry one, `mmrRerank` uses cosine
|
|
41
|
+
* similarity instead of the token-Jaccard proxy — see "MMR Diversity"
|
|
42
|
+
* below. Never forwarded to CLI/MCP JSON responses by this module's
|
|
43
|
+
* callers (they whitelist output fields explicitly).
|
|
44
|
+
*/
|
|
45
|
+
embedding?: number[];
|
|
46
|
+
}
|
|
47
|
+
export interface RawSearchRequest {
|
|
48
|
+
query: string;
|
|
49
|
+
namespace?: string;
|
|
50
|
+
limit?: number;
|
|
51
|
+
threshold?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface RawSearchResponse {
|
|
54
|
+
results: SearchCandidate[];
|
|
55
|
+
}
|
|
56
|
+
/** Pluggable raw search function — typically wraps HNSW or a test fake. */
|
|
57
|
+
export type SearchFn = (req: RawSearchRequest) => Promise<RawSearchResponse>;
|
|
58
|
+
export interface SmartSearchOptions {
|
|
59
|
+
query: string;
|
|
60
|
+
namespace?: string;
|
|
61
|
+
/** Final number of results to return (default 10). */
|
|
62
|
+
limit?: number;
|
|
63
|
+
/** Retrieval relevance floor applied to the raw store, not final ranking (default 0.3). */
|
|
64
|
+
threshold?: number;
|
|
65
|
+
/** Fan out 2-3 expanded query variants and fuse with RRF. Default: true. */
|
|
66
|
+
multiQuery?: boolean;
|
|
67
|
+
/** Re-score with recency boost using entry timestamps. Default: true. */
|
|
68
|
+
recencyBoost?: boolean;
|
|
69
|
+
/** Apply MMR diversity re-ranking. Default: true. */
|
|
70
|
+
diversityMMR?: boolean;
|
|
71
|
+
/** Round-robin across distinct session_ids. Default: true. */
|
|
72
|
+
sessionDiversity?: boolean;
|
|
73
|
+
/** How many candidates to pull from the raw store per variant (default limit × 3). */
|
|
74
|
+
fanOutK?: number;
|
|
75
|
+
/** RRF constant; 60 is the standard default. */
|
|
76
|
+
rrfK?: number;
|
|
77
|
+
/** Recency half-life in days; older entries decay past this. Default 30. */
|
|
78
|
+
recencyHalfLifeDays?: number;
|
|
79
|
+
/** Max recency multiplier applied to top of the curve. Default 0.2. */
|
|
80
|
+
recencyWeight?: number;
|
|
81
|
+
/** MMR tradeoff λ — 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7. */
|
|
82
|
+
mmrLambda?: number;
|
|
83
|
+
/** Metadata key that identifies a session for round-robin. Default 'session_id'. */
|
|
84
|
+
sessionKey?: string;
|
|
85
|
+
/** "Now" for recency decay — pass a fixed value in tests for determinism. */
|
|
86
|
+
now?: number;
|
|
87
|
+
/** Override the default template-based expansions with your own set. */
|
|
88
|
+
queryExpansions?: (query: string) => string[];
|
|
89
|
+
}
|
|
90
|
+
export interface SmartSearchStats {
|
|
91
|
+
variantCount: number;
|
|
92
|
+
variants: string[];
|
|
93
|
+
rawCandidateCount: number;
|
|
94
|
+
afterRrfCount: number;
|
|
95
|
+
afterRecencyCount: number;
|
|
96
|
+
afterMmrCount: number;
|
|
97
|
+
afterSessionCount: number;
|
|
98
|
+
durationMs: number;
|
|
99
|
+
}
|
|
100
|
+
export interface SmartSearchResult {
|
|
101
|
+
results: SearchCandidate[];
|
|
102
|
+
stats: SmartSearchStats;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Default query expansion set. Keeps variants cheap (≤3) so we only pay
|
|
106
|
+
* ~3× the HNSW cost on the hot path.
|
|
107
|
+
*/
|
|
108
|
+
export declare function defaultQueryExpansions(query: string): string[];
|
|
109
|
+
/**
|
|
110
|
+
* Public-facing Reciprocal Rank Fusion. Takes any number of pre-sorted
|
|
111
|
+
* candidate lists (best-first) and fuses them with the RRF score
|
|
112
|
+
* `sum(1 / (k + rank_i))`. Used by the ADR-125 Phase 5 hybridSearch
|
|
113
|
+
* controller to fuse dense + sparse arms.
|
|
114
|
+
*/
|
|
115
|
+
export declare function applyRRF<T extends SearchCandidate>(rankedLists: T[][], k?: number): Array<{
|
|
116
|
+
candidate: T;
|
|
117
|
+
score: number;
|
|
118
|
+
}>;
|
|
119
|
+
/**
|
|
120
|
+
* Public-facing MMR rerank.
|
|
121
|
+
*
|
|
122
|
+
* Re-exported as `applyMMR` for ADR-125 Phase 5 callers (the hybridSearch
|
|
123
|
+
* controller). Takes already-scored candidates plus an MMR lambda
|
|
124
|
+
* (1.0 = pure relevance, 0.0 = pure diversity).
|
|
125
|
+
*/
|
|
126
|
+
export declare function applyMMR<T extends SearchCandidate>(scored: Array<{
|
|
127
|
+
candidate: T;
|
|
128
|
+
score: number;
|
|
129
|
+
}>, lambda?: number, limit?: number): Array<{
|
|
130
|
+
candidate: T;
|
|
131
|
+
score: number;
|
|
132
|
+
}>;
|
|
133
|
+
/**
|
|
134
|
+
* Exported (this package's `exports` map is a `"./*"` wildcard, so this is
|
|
135
|
+
* real public API, not just test access) so the mmrRerank tokenize-call-
|
|
136
|
+
* count regression test can spy on it (Dream Cycle 2026-09-10). Pure and
|
|
137
|
+
* side-effect-free, so widening its visibility carries no behavioral risk.
|
|
138
|
+
*/
|
|
139
|
+
export declare function tokenize(text: string): Set<string>;
|
|
140
|
+
export declare function smartSearch(search: SearchFn, opts: SmartSearchOptions): Promise<SmartSearchResult>;
|
|
141
|
+
//# 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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"}
|