@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.
Files changed (253) hide show
  1. package/README.md +651 -42
  2. package/dist/agent-memory-scope.d.ts +131 -0
  3. package/dist/agent-memory-scope.d.ts.map +1 -0
  4. package/dist/agent-memory-scope.js +223 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agent-memory-scope.test.d.ts +8 -0
  7. package/dist/agent-memory-scope.test.d.ts.map +1 -0
  8. package/dist/agent-memory-scope.test.js +463 -0
  9. package/dist/agent-memory-scope.test.js.map +1 -0
  10. package/dist/agentdb-adapter.d.ts +82 -4
  11. package/dist/agentdb-adapter.d.ts.map +1 -1
  12. package/dist/agentdb-adapter.js +388 -17
  13. package/dist/agentdb-adapter.js.map +1 -1
  14. package/dist/agentdb-backend.d.ts +6 -0
  15. package/dist/agentdb-backend.d.ts.map +1 -1
  16. package/dist/agentdb-backend.js +89 -25
  17. package/dist/agentdb-backend.js.map +1 -1
  18. package/dist/auto-memory-bridge.d.ts +237 -0
  19. package/dist/auto-memory-bridge.d.ts.map +1 -0
  20. package/dist/auto-memory-bridge.js +758 -0
  21. package/dist/auto-memory-bridge.js.map +1 -0
  22. package/dist/auto-memory-bridge.test.d.ts +8 -0
  23. package/dist/auto-memory-bridge.test.d.ts.map +1 -0
  24. package/dist/auto-memory-bridge.test.js +849 -0
  25. package/dist/auto-memory-bridge.test.js.map +1 -0
  26. package/dist/benchmark.test.d.ts +2 -0
  27. package/dist/benchmark.test.d.ts.map +1 -0
  28. package/dist/benchmark.test.js +277 -0
  29. package/dist/benchmark.test.js.map +1 -0
  30. package/dist/consolidator.d.ts +96 -0
  31. package/dist/consolidator.d.ts.map +1 -0
  32. package/dist/consolidator.js +209 -0
  33. package/dist/consolidator.js.map +1 -0
  34. package/dist/consolidator.test.d.ts +17 -0
  35. package/dist/consolidator.test.d.ts.map +1 -0
  36. package/dist/consolidator.test.js +239 -0
  37. package/dist/consolidator.test.js.map +1 -0
  38. package/dist/controller-registry.d.ts +248 -0
  39. package/dist/controller-registry.d.ts.map +1 -0
  40. package/dist/controller-registry.js +1086 -0
  41. package/dist/controller-registry.js.map +1 -0
  42. package/dist/controller-registry.test.d.ts +14 -0
  43. package/dist/controller-registry.test.d.ts.map +1 -0
  44. package/dist/controller-registry.test.js +691 -0
  45. package/dist/controller-registry.test.js.map +1 -0
  46. package/dist/database-provider.d.ts +14 -2
  47. package/dist/database-provider.d.ts.map +1 -1
  48. package/dist/database-provider.js +63 -3
  49. package/dist/database-provider.js.map +1 -1
  50. package/dist/database-provider.test.js +56 -3
  51. package/dist/database-provider.test.js.map +1 -1
  52. package/dist/entity-tagger.d.ts +31 -0
  53. package/dist/entity-tagger.d.ts.map +1 -0
  54. package/dist/entity-tagger.js +80 -0
  55. package/dist/entity-tagger.js.map +1 -0
  56. package/dist/entity-tagger.test.d.ts +12 -0
  57. package/dist/entity-tagger.test.d.ts.map +1 -0
  58. package/dist/entity-tagger.test.js +70 -0
  59. package/dist/entity-tagger.test.js.map +1 -0
  60. package/dist/fts5.test.d.ts +13 -0
  61. package/dist/fts5.test.d.ts.map +1 -0
  62. package/dist/fts5.test.js +144 -0
  63. package/dist/fts5.test.js.map +1 -0
  64. package/dist/graceful-retrieval.test.d.ts +14 -0
  65. package/dist/graceful-retrieval.test.d.ts.map +1 -0
  66. package/dist/graceful-retrieval.test.js +192 -0
  67. package/dist/graceful-retrieval.test.js.map +1 -0
  68. package/dist/hnsw-index.d.ts +51 -0
  69. package/dist/hnsw-index.d.ts.map +1 -1
  70. package/dist/hnsw-index.js +396 -12
  71. package/dist/hnsw-index.js.map +1 -1
  72. package/dist/hnsw-persistence.test.d.ts +13 -0
  73. package/dist/hnsw-persistence.test.d.ts.map +1 -0
  74. package/dist/hnsw-persistence.test.js +208 -0
  75. package/dist/hnsw-persistence.test.js.map +1 -0
  76. package/dist/hybrid-backend.d.ts +28 -0
  77. package/dist/hybrid-backend.d.ts.map +1 -1
  78. package/dist/hybrid-backend.js +82 -4
  79. package/dist/hybrid-backend.js.map +1 -1
  80. package/dist/hybrid-backend.test.js +6 -5
  81. package/dist/hybrid-backend.test.js.map +1 -1
  82. package/dist/index.d.ts +167 -9
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +277 -30
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.test.d.ts +10 -0
  87. package/dist/index.test.d.ts.map +1 -0
  88. package/dist/index.test.js +71 -0
  89. package/dist/index.test.js.map +1 -0
  90. package/dist/json-security.d.ts +12 -0
  91. package/dist/json-security.d.ts.map +1 -0
  92. package/dist/json-security.js +20 -0
  93. package/dist/json-security.js.map +1 -0
  94. package/dist/learning-bridge.d.ts +137 -0
  95. package/dist/learning-bridge.d.ts.map +1 -0
  96. package/dist/learning-bridge.js +335 -0
  97. package/dist/learning-bridge.js.map +1 -0
  98. package/dist/learning-bridge.test.d.ts +8 -0
  99. package/dist/learning-bridge.test.d.ts.map +1 -0
  100. package/dist/learning-bridge.test.js +578 -0
  101. package/dist/learning-bridge.test.js.map +1 -0
  102. package/dist/memory-graph.d.ts +100 -0
  103. package/dist/memory-graph.d.ts.map +1 -0
  104. package/dist/memory-graph.js +333 -0
  105. package/dist/memory-graph.js.map +1 -0
  106. package/dist/memory-graph.test.d.ts +8 -0
  107. package/dist/memory-graph.test.d.ts.map +1 -0
  108. package/dist/memory-graph.test.js +609 -0
  109. package/dist/memory-graph.test.js.map +1 -0
  110. package/dist/persistent-sona.d.ts +144 -0
  111. package/dist/persistent-sona.d.ts.map +1 -0
  112. package/dist/persistent-sona.js +332 -0
  113. package/dist/persistent-sona.js.map +1 -0
  114. package/dist/rvf-backend.d.ts +53 -0
  115. package/dist/rvf-backend.d.ts.map +1 -0
  116. package/dist/rvf-backend.js +643 -0
  117. package/dist/rvf-backend.js.map +1 -0
  118. package/dist/rvf-learning-store.d.ts +139 -0
  119. package/dist/rvf-learning-store.d.ts.map +1 -0
  120. package/dist/rvf-learning-store.js +295 -0
  121. package/dist/rvf-learning-store.js.map +1 -0
  122. package/dist/rvf-migration.d.ts +45 -0
  123. package/dist/rvf-migration.d.ts.map +1 -0
  124. package/dist/rvf-migration.js +254 -0
  125. package/dist/rvf-migration.js.map +1 -0
  126. package/dist/smart-retrieval.d.ts +118 -0
  127. package/dist/smart-retrieval.d.ts.map +1 -0
  128. package/dist/smart-retrieval.js +322 -0
  129. package/dist/smart-retrieval.js.map +1 -0
  130. package/dist/smart-retrieval.test.d.ts +2 -0
  131. package/dist/smart-retrieval.test.d.ts.map +1 -0
  132. package/dist/smart-retrieval.test.js +238 -0
  133. package/dist/smart-retrieval.test.js.map +1 -0
  134. package/dist/sqlite-backend.d.ts +10 -0
  135. package/dist/sqlite-backend.d.ts.map +1 -1
  136. package/dist/sqlite-backend.js +104 -8
  137. package/dist/sqlite-backend.js.map +1 -1
  138. package/dist/sqljs-backend.d.ts +9 -0
  139. package/dist/sqljs-backend.d.ts.map +1 -1
  140. package/dist/sqljs-backend.js +96 -5
  141. package/dist/sqljs-backend.js.map +1 -1
  142. package/dist/types.d.ts +3 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/package.json +21 -8
  145. package/.agentic-flow/intelligence.json +0 -16
  146. package/__tests__/coverage/base.css +0 -224
  147. package/__tests__/coverage/block-navigation.js +0 -87
  148. package/__tests__/coverage/coverage-final.json +0 -19
  149. package/__tests__/coverage/favicon.png +0 -0
  150. package/__tests__/coverage/index.html +0 -206
  151. package/__tests__/coverage/lcov-report/base.css +0 -224
  152. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  153. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  154. package/__tests__/coverage/lcov-report/index.html +0 -206
  155. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  156. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  157. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  158. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  159. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  160. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  161. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  162. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  163. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  164. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  165. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  166. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  167. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  168. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  169. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  170. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  171. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  172. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  173. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  174. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  175. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  176. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  177. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  178. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  179. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  180. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  181. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  182. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  183. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  184. package/__tests__/coverage/lcov.info +0 -10238
  185. package/__tests__/coverage/prettify.css +0 -1
  186. package/__tests__/coverage/prettify.js +0 -2
  187. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  188. package/__tests__/coverage/sorter.js +0 -210
  189. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  190. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  191. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  192. package/__tests__/coverage/src/application/commands/index.html +0 -131
  193. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  194. package/__tests__/coverage/src/application/queries/index.html +0 -116
  195. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  196. package/__tests__/coverage/src/application/services/index.html +0 -116
  197. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  198. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  199. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  200. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  201. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  202. package/__tests__/coverage/src/domain/services/index.html +0 -116
  203. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  204. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  205. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  206. package/__tests__/coverage/src/index.html +0 -266
  207. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  208. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  209. package/__tests__/coverage/src/migration.ts.html +0 -2092
  210. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  211. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  212. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  213. package/__tests__/coverage/src/types.ts.html +0 -2266
  214. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  215. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  216. package/benchmarks/memory-write.bench.ts +0 -469
  217. package/benchmarks/vector-search.bench.ts +0 -449
  218. package/docs/AGENTDB-INTEGRATION.md +0 -388
  219. package/docs/CROSS_PLATFORM.md +0 -505
  220. package/docs/WINDOWS_SUPPORT.md +0 -422
  221. package/examples/agentdb-example.ts +0 -345
  222. package/examples/cross-platform-usage.ts +0 -326
  223. package/framework/benchmark.ts +0 -112
  224. package/src/agentdb-adapter.ts +0 -884
  225. package/src/agentdb-backend.test.ts +0 -339
  226. package/src/agentdb-backend.ts +0 -1016
  227. package/src/application/commands/delete-memory.command.ts +0 -172
  228. package/src/application/commands/store-memory.command.ts +0 -103
  229. package/src/application/index.ts +0 -36
  230. package/src/application/queries/search-memory.query.ts +0 -237
  231. package/src/application/services/memory-application-service.ts +0 -236
  232. package/src/cache-manager.ts +0 -516
  233. package/src/database-provider.test.ts +0 -364
  234. package/src/database-provider.ts +0 -511
  235. package/src/domain/entities/memory-entry.ts +0 -289
  236. package/src/domain/index.ts +0 -35
  237. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  238. package/src/domain/services/memory-domain-service.ts +0 -403
  239. package/src/hnsw-index.ts +0 -1013
  240. package/src/hybrid-backend.test.ts +0 -399
  241. package/src/hybrid-backend.ts +0 -694
  242. package/src/index.ts +0 -515
  243. package/src/infrastructure/index.ts +0 -23
  244. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  245. package/src/migration.ts +0 -669
  246. package/src/query-builder.ts +0 -542
  247. package/src/sqlite-backend.ts +0 -732
  248. package/src/sqljs-backend.ts +0 -763
  249. package/src/types.ts +0 -727
  250. package/tmp.json +0 -0
  251. package/tsconfig.json +0 -9
  252. package/tsconfig.tsbuildinfo +0 -1
  253. 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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"}