@monoes/memory 1.0.1 → 1.0.3

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 (47) hide show
  1. package/README.md +1 -7
  2. package/dist/controller-registry.d.ts +1 -1
  3. package/dist/controller-registry.d.ts.map +1 -1
  4. package/dist/controller-registry.js +3 -3
  5. package/dist/controller-registry.js.map +1 -1
  6. package/dist/database-provider.d.ts +1 -2
  7. package/dist/database-provider.d.ts.map +1 -1
  8. package/dist/database-provider.js +0 -25
  9. package/dist/database-provider.js.map +1 -1
  10. package/dist/index.d.ts +0 -12
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +0 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/lancedb-backend.d.ts.map +1 -1
  15. package/dist/lancedb-backend.js +40 -12
  16. package/dist/lancedb-backend.js.map +1 -1
  17. package/dist/types.d.ts +1 -1
  18. package/dist/types.d.ts.map +1 -1
  19. package/package.json +10 -11
  20. package/dist/hnsw-lite.d.ts +0 -29
  21. package/dist/hnsw-lite.d.ts.map +0 -1
  22. package/dist/hnsw-lite.js +0 -240
  23. package/dist/hnsw-lite.js.map +0 -1
  24. package/dist/hybrid-backend.d.ts +0 -297
  25. package/dist/hybrid-backend.d.ts.map +0 -1
  26. package/dist/hybrid-backend.js +0 -805
  27. package/dist/hybrid-backend.js.map +0 -1
  28. package/dist/persistent-sona.d.ts +0 -144
  29. package/dist/persistent-sona.d.ts.map +0 -1
  30. package/dist/persistent-sona.js +0 -311
  31. package/dist/persistent-sona.js.map +0 -1
  32. package/dist/procedural/procedure-extractor-worker.d.ts +0 -27
  33. package/dist/procedural/procedure-extractor-worker.d.ts.map +0 -1
  34. package/dist/procedural/procedure-extractor-worker.js +0 -39
  35. package/dist/procedural/procedure-extractor-worker.js.map +0 -1
  36. package/dist/rvf-backend.d.ts +0 -53
  37. package/dist/rvf-backend.d.ts.map +0 -1
  38. package/dist/rvf-backend.js +0 -507
  39. package/dist/rvf-backend.js.map +0 -1
  40. package/dist/rvf-learning-store.d.ts +0 -141
  41. package/dist/rvf-learning-store.d.ts.map +0 -1
  42. package/dist/rvf-learning-store.js +0 -344
  43. package/dist/rvf-learning-store.js.map +0 -1
  44. package/dist/rvf-migration.d.ts +0 -45
  45. package/dist/rvf-migration.d.ts.map +0 -1
  46. package/dist/rvf-migration.js +0 -254
  47. package/dist/rvf-migration.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"rvf-backend.d.ts","sourceRoot":"","sources":["../src/rvf-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAqBD,qBAAa,UAAW,YAAW,cAAc;IAC/C,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,WAAW,CAAgB;gBAEvB,MAAM,EAAE,gBAAgB;IAoBpC,kGAAkG;IAClG,OAAO,CAAC,UAAU;IAcZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBzB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ5C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAMrE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAe9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqD7C,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBhF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAe1C,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS1C,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMnC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAelD,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IA+BjC,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;YA2BjC,aAAa;IAK3B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,GAAG;YAIG,YAAY;YAoDZ,aAAa;CAyD5B"}
@@ -1,507 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { readFile, writeFile, mkdir, rename } from 'node:fs/promises';
3
- import { dirname, resolve } from 'node:path';
4
- import { HnswLite, cosineSimilarity } from './hnsw-lite.js';
5
- /** Validate a file path is safe (no null bytes, no traversal above root) */
6
- function validatePath(p) {
7
- if (p === ':memory:')
8
- return;
9
- if (p.includes('\0'))
10
- throw new Error('Path contains null bytes');
11
- const resolved = resolve(p);
12
- if (resolved.includes('\0'))
13
- throw new Error('Resolved path contains null bytes');
14
- }
15
- const MAGIC = 'RVF\0';
16
- const VERSION = 1;
17
- const DEFAULT_DIMENSIONS = 1536;
18
- const DEFAULT_M = 16;
19
- const DEFAULT_EF_CONSTRUCTION = 200;
20
- const DEFAULT_MAX_ELEMENTS = 100000;
21
- const DEFAULT_PERSIST_INTERVAL = 30000;
22
- export class RvfBackend {
23
- entries = new Map();
24
- keyIndex = new Map();
25
- hnswIndex = null;
26
- nativeDb = null;
27
- config;
28
- initialized = false;
29
- dirty = false;
30
- persisting = false;
31
- persistTimer = null;
32
- queryTimes = [];
33
- searchTimes = [];
34
- constructor(config) {
35
- const dimensions = config.dimensions ?? DEFAULT_DIMENSIONS;
36
- if (!Number.isInteger(dimensions) || dimensions < 1 || dimensions > 10000) {
37
- throw new Error(`Invalid dimensions: ${dimensions}. Must be an integer between 1 and 10000.`);
38
- }
39
- this.config = {
40
- databasePath: config.databasePath,
41
- dimensions,
42
- metric: config.metric ?? 'cosine',
43
- quantization: config.quantization ?? 'fp32',
44
- hnswM: config.hnswM ?? DEFAULT_M,
45
- hnswEfConstruction: config.hnswEfConstruction ?? DEFAULT_EF_CONSTRUCTION,
46
- maxElements: config.maxElements ?? DEFAULT_MAX_ELEMENTS,
47
- verbose: config.verbose ?? false,
48
- defaultNamespace: config.defaultNamespace ?? 'default',
49
- autoPersistInterval: config.autoPersistInterval ?? DEFAULT_PERSIST_INTERVAL,
50
- };
51
- validatePath(this.config.databasePath);
52
- }
53
- /** Lazily create the HNSW index with the given dimension (auto-detected from first embedding). */
54
- ensureHnsw(dim) {
55
- if (this.hnswIndex)
56
- return;
57
- // If config.dimensions differs from actual embedding dim, prefer the embedding dim
58
- const actualDim = this.config.dimensions !== 1536 && this.config.dimensions > 0
59
- ? this.config.dimensions
60
- : dim;
61
- this.hnswIndex = new HnswLite(actualDim, this.config.hnswM, this.config.hnswEfConstruction, this.config.metric);
62
- }
63
- async initialize() {
64
- if (this.initialized)
65
- return;
66
- const useNative = await this.tryNativeInit();
67
- if (!useNative) {
68
- // HnswLite index is created lazily in store() when we know the embedding dimension.
69
- // Pre-create with config.dimensions only when it differs from the default sentinel.
70
- if (this.config.dimensions !== 1536) {
71
- this.hnswIndex = new HnswLite(this.config.dimensions, this.config.hnswM, this.config.hnswEfConstruction, this.config.metric);
72
- }
73
- await this.loadFromDisk();
74
- }
75
- if (this.config.autoPersistInterval > 0 && this.config.databasePath !== ':memory:') {
76
- this.persistTimer = setInterval(() => {
77
- if (this.dirty && !this.persisting)
78
- this.persistToDisk().catch(() => { });
79
- }, this.config.autoPersistInterval);
80
- if (this.persistTimer.unref)
81
- this.persistTimer.unref();
82
- }
83
- this.initialized = true;
84
- if (this.config.verbose) {
85
- const mode = this.nativeDb ? 'native' : 'pure-TS fallback';
86
- console.log(`[RvfBackend] Initialized (${mode}), ${this.entries.size} entries loaded`);
87
- }
88
- }
89
- async shutdown() {
90
- if (!this.initialized)
91
- return;
92
- if (this.persistTimer) {
93
- clearInterval(this.persistTimer);
94
- this.persistTimer = null;
95
- }
96
- if (this.dirty) {
97
- await this.persistToDisk();
98
- }
99
- if (this.nativeDb) {
100
- try {
101
- await this.nativeDb.close();
102
- }
103
- catch { }
104
- this.nativeDb = null;
105
- }
106
- this.entries.clear();
107
- this.keyIndex.clear();
108
- this.hnswIndex = null;
109
- this.initialized = false;
110
- }
111
- async store(entry) {
112
- const ns = entry.namespace || this.config.defaultNamespace;
113
- const e = ns !== entry.namespace ? { ...entry, namespace: ns } : entry;
114
- this.entries.set(e.id, e);
115
- this.keyIndex.set(this.compositeKey(e.namespace, e.key), e.id);
116
- if (e.embedding) {
117
- if (!this.hnswIndex)
118
- this.ensureHnsw(e.embedding.length);
119
- if (this.hnswIndex)
120
- this.hnswIndex.add(e.id, e.embedding);
121
- }
122
- this.dirty = true;
123
- }
124
- async get(id) {
125
- const entry = this.entries.get(id);
126
- if (!entry)
127
- return null;
128
- entry.accessCount++;
129
- entry.lastAccessedAt = Date.now();
130
- return entry;
131
- }
132
- async getByKey(namespace, key) {
133
- const id = this.keyIndex.get(this.compositeKey(namespace, key));
134
- if (!id)
135
- return null;
136
- return this.get(id);
137
- }
138
- async update(id, updateData) {
139
- const entry = this.entries.get(id);
140
- if (!entry)
141
- return null;
142
- const updated = {
143
- ...entry,
144
- ...updateData,
145
- updatedAt: Date.now(),
146
- version: entry.version + 1,
147
- };
148
- this.entries.set(id, updated);
149
- this.dirty = true;
150
- return updated;
151
- }
152
- async delete(id) {
153
- const entry = this.entries.get(id);
154
- if (!entry)
155
- return false;
156
- this.entries.delete(id);
157
- this.keyIndex.delete(this.compositeKey(entry.namespace, entry.key));
158
- if (this.hnswIndex)
159
- this.hnswIndex.remove(id);
160
- this.dirty = true;
161
- return true;
162
- }
163
- async query(q) {
164
- const start = performance.now();
165
- // Compute expiry cutoff once outside the filter to avoid repeated Date.now() calls
166
- const expiryCutoff = q.includeExpired ? 0 : Date.now();
167
- // Single-pass filter replaces up to 12 chained .filter() calls, each of which
168
- // would allocate a new intermediate array.
169
- let results = Array.from(this.entries.values()).filter(e => {
170
- if (q.namespace && e.namespace !== q.namespace)
171
- return false;
172
- if (q.key && e.key !== q.key)
173
- return false;
174
- if (q.keyPrefix && !e.key.startsWith(q.keyPrefix))
175
- return false;
176
- if (q.tags?.length && !q.tags.every(t => e.tags.includes(t)))
177
- return false;
178
- if (q.memoryType && e.type !== q.memoryType)
179
- return false;
180
- if (q.accessLevel && e.accessLevel !== q.accessLevel)
181
- return false;
182
- if (q.ownerId && e.ownerId !== q.ownerId)
183
- return false;
184
- if (q.createdAfter && e.createdAt <= q.createdAfter)
185
- return false;
186
- if (q.createdBefore && e.createdAt >= q.createdBefore)
187
- return false;
188
- if (q.updatedAfter && e.updatedAt <= q.updatedAfter)
189
- return false;
190
- if (q.updatedBefore && e.updatedAt >= q.updatedBefore)
191
- return false;
192
- if (!q.includeExpired && e.expiresAt && e.expiresAt <= expiryCutoff)
193
- return false;
194
- return true;
195
- });
196
- if (q.type === 'semantic' && q.embedding && this.hnswIndex) {
197
- const searchResults = this.hnswIndex.search(q.embedding, q.limit, q.threshold);
198
- const idSet = new Set(searchResults.map(r => r.id));
199
- results = results.filter(e => idSet.has(e.id));
200
- }
201
- // Apply sort if requested
202
- if (q.sortField && q.sortField !== 'score') {
203
- const field = q.sortField;
204
- const dir = q.sortDirection === 'asc' ? 1 : -1;
205
- results = results.slice().sort((a, b) => {
206
- const av = field === 'key' ? a.key : field === 'updatedAt' ? a.updatedAt
207
- : field === 'lastAccessedAt' ? (a.lastAccessedAt ?? 0)
208
- : field === 'accessCount' ? a.accessCount : a.createdAt;
209
- const bv = field === 'key' ? b.key : field === 'updatedAt' ? b.updatedAt
210
- : field === 'lastAccessedAt' ? (b.lastAccessedAt ?? 0)
211
- : field === 'accessCount' ? b.accessCount : b.createdAt;
212
- if (av < bv)
213
- return -dir;
214
- if (av > bv)
215
- return dir;
216
- return 0;
217
- });
218
- }
219
- const offset = q.offset ?? 0;
220
- results = results.slice(offset, offset + q.limit);
221
- this.recordTiming(this.queryTimes, start);
222
- return results;
223
- }
224
- async search(embedding, options) {
225
- const start = performance.now();
226
- let results;
227
- if (this.hnswIndex) {
228
- const raw = this.hnswIndex.search(embedding, options.k * 2, options.threshold);
229
- results = [];
230
- for (const r of raw) {
231
- const entry = this.entries.get(r.id);
232
- if (!entry)
233
- continue;
234
- if (options.filters?.namespace && entry.namespace !== options.filters.namespace)
235
- continue;
236
- if (options.filters?.tags && !options.filters.tags.every(t => entry.tags.includes(t)))
237
- continue;
238
- if (options.filters?.memoryType && entry.type !== options.filters.memoryType)
239
- continue;
240
- results.push({ entry, score: r.score, distance: 1 - r.score });
241
- }
242
- results = results.slice(0, options.k);
243
- }
244
- else {
245
- results = this.bruteForceSearch(embedding, options);
246
- }
247
- this.recordTiming(this.searchTimes, start);
248
- return results;
249
- }
250
- async bulkInsert(entries) {
251
- for (const entry of entries) {
252
- this.entries.set(entry.id, entry);
253
- this.keyIndex.set(this.compositeKey(entry.namespace, entry.key), entry.id);
254
- if (entry.embedding) {
255
- if (!this.hnswIndex)
256
- this.ensureHnsw(entry.embedding.length);
257
- if (this.hnswIndex)
258
- this.hnswIndex.add(entry.id, entry.embedding);
259
- }
260
- }
261
- this.dirty = true;
262
- }
263
- async bulkDelete(ids) {
264
- let count = 0;
265
- for (const id of ids) {
266
- const entry = this.entries.get(id);
267
- if (entry) {
268
- this.entries.delete(id);
269
- this.keyIndex.delete(this.compositeKey(entry.namespace, entry.key));
270
- if (this.hnswIndex)
271
- this.hnswIndex.remove(id);
272
- count++;
273
- }
274
- }
275
- this.dirty = true;
276
- return count;
277
- }
278
- async count(namespace) {
279
- if (!namespace)
280
- return this.entries.size;
281
- let c = 0;
282
- for (const entry of this.entries.values()) {
283
- if (entry.namespace === namespace)
284
- c++;
285
- }
286
- return c;
287
- }
288
- async listNamespaces() {
289
- const ns = new Set();
290
- for (const entry of this.entries.values())
291
- ns.add(entry.namespace);
292
- return Array.from(ns);
293
- }
294
- async clearNamespace(namespace) {
295
- const toDelete = [];
296
- for (const [id, entry] of this.entries) {
297
- if (entry.namespace === namespace)
298
- toDelete.push(id);
299
- }
300
- for (const id of toDelete) {
301
- const entry = this.entries.get(id);
302
- this.entries.delete(id);
303
- this.keyIndex.delete(this.compositeKey(entry.namespace, entry.key));
304
- if (this.hnswIndex)
305
- this.hnswIndex.remove(id);
306
- }
307
- if (toDelete.length > 0)
308
- this.dirty = true;
309
- return toDelete.length;
310
- }
311
- async getStats() {
312
- const entriesByNamespace = {};
313
- const entriesByType = {};
314
- let memoryUsage = 0;
315
- for (const entry of this.entries.values()) {
316
- entriesByNamespace[entry.namespace] = (entriesByNamespace[entry.namespace] ?? 0) + 1;
317
- entriesByType[entry.type] = (entriesByType[entry.type] ?? 0) + 1;
318
- memoryUsage += entry.content.length * 2;
319
- if (entry.embedding)
320
- memoryUsage += entry.embedding.byteLength;
321
- }
322
- const avgQuery = this.avg(this.queryTimes);
323
- const avgSearch = this.avg(this.searchTimes);
324
- return {
325
- totalEntries: this.entries.size,
326
- entriesByNamespace,
327
- entriesByType: entriesByType,
328
- memoryUsage,
329
- hnswStats: this.hnswIndex ? {
330
- vectorCount: this.hnswIndex.size,
331
- memoryUsage: this.hnswIndex.size * this.config.dimensions * 4,
332
- avgSearchTime: avgSearch,
333
- buildTime: 0,
334
- } : undefined,
335
- avgQueryTime: avgQuery,
336
- avgSearchTime: avgSearch,
337
- };
338
- }
339
- async healthCheck() {
340
- const issues = [];
341
- const recommendations = [];
342
- if (!this.initialized)
343
- issues.push('Backend not initialized');
344
- if (!this.nativeDb) {
345
- recommendations.push('Running in pure-TS HnswLite fallback — @monoes/rvf not installed');
346
- }
347
- const status = issues.length === 0
348
- ? 'healthy'
349
- : issues.some(i => i.includes('not initialized')) ? 'unhealthy' : 'degraded';
350
- return {
351
- status,
352
- mode: this.nativeDb ? 'native-rvf' : 'pure-ts-fallback',
353
- components: {
354
- storage: { status: this.initialized ? 'healthy' : 'unhealthy', latency: 0 },
355
- index: { status: this.initialized ? 'healthy' : 'degraded', latency: 0 },
356
- cache: { status: 'healthy', latency: 0 },
357
- },
358
- timestamp: Date.now(),
359
- issues,
360
- recommendations,
361
- };
362
- }
363
- async tryNativeInit() {
364
- // Native @monoes/rvf removed — using pure-TS fallback
365
- return false;
366
- }
367
- compositeKey(namespace, key) {
368
- return `${namespace}\0${key}`;
369
- }
370
- bruteForceSearch(embedding, options) {
371
- const results = [];
372
- for (const entry of this.entries.values()) {
373
- if (!entry.embedding)
374
- continue;
375
- const score = cosineSimilarity(embedding, entry.embedding);
376
- if (options.threshold && score < options.threshold)
377
- continue;
378
- if (options.filters?.namespace && entry.namespace !== options.filters.namespace)
379
- continue;
380
- if (options.filters?.tags && !options.filters.tags.every(t => entry.tags.includes(t)))
381
- continue;
382
- results.push({ entry, score, distance: 1 - score });
383
- }
384
- results.sort((a, b) => b.score - a.score);
385
- return results.slice(0, options.k);
386
- }
387
- recordTiming(arr, start) {
388
- arr.push(performance.now() - start);
389
- if (arr.length > 100)
390
- arr.shift();
391
- }
392
- avg(arr) {
393
- return arr.length > 0 ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;
394
- }
395
- async loadFromDisk() {
396
- if (this.config.databasePath === ':memory:')
397
- return;
398
- if (!existsSync(this.config.databasePath))
399
- return;
400
- try {
401
- const raw = await readFile(this.config.databasePath);
402
- if (raw.length < 8)
403
- return;
404
- const magic = String.fromCharCode(raw[0], raw[1], raw[2], raw[3]);
405
- if (magic !== MAGIC)
406
- return;
407
- const headerLen = raw.readUInt32LE(4);
408
- const MAX_HEADER_SIZE = 10 * 1024 * 1024; // 10MB max header
409
- if (headerLen > MAX_HEADER_SIZE || 8 + headerLen > raw.length)
410
- return;
411
- const headerJson = raw.subarray(8, 8 + headerLen).toString('utf-8');
412
- let header;
413
- try {
414
- header = JSON.parse(headerJson);
415
- }
416
- catch {
417
- if (this.config.verbose)
418
- console.error('[RvfBackend] Corrupt RVF header');
419
- return;
420
- }
421
- if (!header || typeof header.entryCount !== 'number' || typeof header.version !== 'number')
422
- return;
423
- let offset = 8 + headerLen;
424
- for (let i = 0; i < header.entryCount; i++) {
425
- if (offset + 4 > raw.length)
426
- break;
427
- const entryLen = raw.readUInt32LE(offset);
428
- offset += 4;
429
- if (offset + entryLen > raw.length)
430
- break;
431
- const entryJson = raw.subarray(offset, offset + entryLen).toString('utf-8');
432
- offset += entryLen;
433
- const parsed = JSON.parse(entryJson);
434
- if (parsed.embedding)
435
- parsed.embedding = new Float32Array(parsed.embedding);
436
- const entry = parsed;
437
- this.entries.set(entry.id, entry);
438
- this.keyIndex.set(this.compositeKey(entry.namespace, entry.key), entry.id);
439
- if (entry.embedding) {
440
- if (!this.hnswIndex)
441
- this.ensureHnsw(entry.embedding.length);
442
- if (this.hnswIndex)
443
- this.hnswIndex.add(entry.id, entry.embedding);
444
- }
445
- }
446
- }
447
- catch (err) {
448
- if (this.config.verbose) {
449
- console.error('[RvfBackend] Error loading from disk:', err);
450
- }
451
- }
452
- }
453
- async persistToDisk() {
454
- if (this.config.databasePath === ':memory:')
455
- return;
456
- if (this.persisting)
457
- return; // Prevent concurrent persist calls
458
- this.persisting = true;
459
- try {
460
- const dir = dirname(this.config.databasePath);
461
- if (!existsSync(dir))
462
- await mkdir(dir, { recursive: true });
463
- const entries = Array.from(this.entries.values());
464
- // Compute min createdAt without spread operator (avoids stack overflow for large arrays)
465
- let minCreatedAt = Date.now();
466
- for (const e of entries) {
467
- if (e.createdAt < minCreatedAt)
468
- minCreatedAt = e.createdAt;
469
- }
470
- const header = {
471
- magic: MAGIC,
472
- version: VERSION,
473
- dimensions: this.config.dimensions,
474
- metric: this.config.metric,
475
- quantization: this.config.quantization,
476
- entryCount: entries.length,
477
- createdAt: entries.length > 0 ? minCreatedAt : Date.now(),
478
- updatedAt: Date.now(),
479
- };
480
- const headerBuf = Buffer.from(JSON.stringify(header), 'utf-8');
481
- const entryBuffers = [];
482
- for (const entry of entries) {
483
- const serialized = {
484
- ...entry,
485
- embedding: entry.embedding ? Array.from(entry.embedding) : undefined,
486
- };
487
- const buf = Buffer.from(JSON.stringify(serialized), 'utf-8');
488
- const lenBuf = Buffer.alloc(4);
489
- lenBuf.writeUInt32LE(buf.length, 0);
490
- entryBuffers.push(lenBuf, buf);
491
- }
492
- const magicBuf = Buffer.from([0x52, 0x56, 0x46, 0x00]);
493
- const headerLenBuf = Buffer.alloc(4);
494
- headerLenBuf.writeUInt32LE(headerBuf.length, 0);
495
- const output = Buffer.concat([magicBuf, headerLenBuf, headerBuf, ...entryBuffers]);
496
- // Atomic write: write to temp file then rename (crash-safe)
497
- const tmpPath = this.config.databasePath + '.tmp';
498
- await writeFile(tmpPath, output);
499
- await rename(tmpPath, this.config.databasePath);
500
- this.dirty = false;
501
- }
502
- finally {
503
- this.persisting = false;
504
- }
505
- }
506
- }
507
- //# sourceMappingURL=rvf-backend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rvf-backend.js","sourceRoot":"","sources":["../src/rvf-backend.ts"],"names":[],"mappings":"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"}