@soulcraft/brainy 0.48.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +304 -555
  2. package/dist/brainyData.d.ts +83 -2
  3. package/dist/brainyData.js +536 -66
  4. package/dist/brainyData.js.map +1 -1
  5. package/dist/coreTypes.d.ts +74 -12
  6. package/dist/distributed/configManager.d.ts +9 -0
  7. package/dist/distributed/configManager.js +129 -10
  8. package/dist/distributed/configManager.js.map +1 -1
  9. package/dist/hnsw/hnswIndex.d.ts +1 -1
  10. package/dist/hnsw/hnswIndex.js +44 -25
  11. package/dist/hnsw/hnswIndex.js.map +1 -1
  12. package/dist/hnsw/optimizedHNSWIndex.d.ts +1 -1
  13. package/dist/hnsw/optimizedHNSWIndex.js +3 -3
  14. package/dist/hnsw/optimizedHNSWIndex.js.map +1 -1
  15. package/dist/storage/adapters/baseStorageAdapter.d.ts +18 -2
  16. package/dist/storage/adapters/baseStorageAdapter.js +69 -4
  17. package/dist/storage/adapters/baseStorageAdapter.js.map +1 -1
  18. package/dist/storage/adapters/fileSystemStorage.d.ts +14 -8
  19. package/dist/storage/adapters/fileSystemStorage.js +90 -22
  20. package/dist/storage/adapters/fileSystemStorage.js.map +1 -1
  21. package/dist/storage/adapters/memoryStorage.d.ts +0 -8
  22. package/dist/storage/adapters/memoryStorage.js +26 -45
  23. package/dist/storage/adapters/memoryStorage.js.map +1 -1
  24. package/dist/storage/adapters/opfsStorage.d.ts +40 -8
  25. package/dist/storage/adapters/opfsStorage.js +195 -44
  26. package/dist/storage/adapters/opfsStorage.js.map +1 -1
  27. package/dist/storage/adapters/optimizedS3Search.js +4 -3
  28. package/dist/storage/adapters/optimizedS3Search.js.map +1 -1
  29. package/dist/storage/adapters/s3CompatibleStorage.d.ts +3 -10
  30. package/dist/storage/adapters/s3CompatibleStorage.js +41 -44
  31. package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -1
  32. package/dist/storage/backwardCompatibility.d.ts +84 -0
  33. package/dist/storage/backwardCompatibility.js +141 -0
  34. package/dist/storage/backwardCompatibility.js.map +1 -0
  35. package/dist/storage/baseStorage.d.ts +33 -19
  36. package/dist/storage/baseStorage.js +116 -195
  37. package/dist/storage/baseStorage.js.map +1 -1
  38. package/dist/utils/metadataFilter.d.ts +79 -0
  39. package/dist/utils/metadataFilter.js +229 -0
  40. package/dist/utils/metadataFilter.js.map +1 -0
  41. package/dist/utils/metadataIndex.d.ts +148 -0
  42. package/dist/utils/metadataIndex.js +639 -0
  43. package/dist/utils/metadataIndex.js.map +1 -0
  44. package/dist/utils/metadataIndexCache.d.ts +60 -0
  45. package/dist/utils/metadataIndexCache.js +119 -0
  46. package/dist/utils/metadataIndexCache.js.map +1 -0
  47. package/package.json +1 -1
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Metadata Index System
3
+ * Maintains inverted indexes for fast metadata filtering
4
+ * Automatically updates indexes when data changes
5
+ */
6
+ import { MetadataIndexCache } from './metadataIndexCache.js';
7
+ /**
8
+ * Manages metadata indexes for fast filtering
9
+ * Maintains inverted indexes: field+value -> list of IDs
10
+ */
11
+ export class MetadataIndexManager {
12
+ constructor(storage, config = {}) {
13
+ this.indexCache = new Map();
14
+ this.dirtyEntries = new Set();
15
+ this.isRebuilding = false;
16
+ this.fieldIndexes = new Map();
17
+ this.dirtyFields = new Set();
18
+ this.lastFlushTime = Date.now();
19
+ this.autoFlushThreshold = 50; // Start with 50, will adapt based on usage
20
+ this.storage = storage;
21
+ this.config = {
22
+ maxIndexSize: config.maxIndexSize ?? 10000,
23
+ rebuildThreshold: config.rebuildThreshold ?? 0.1,
24
+ autoOptimize: config.autoOptimize ?? true,
25
+ indexedFields: config.indexedFields ?? [],
26
+ excludeFields: config.excludeFields ?? ['id', 'createdAt', 'updatedAt', 'embedding', 'vector', 'embeddings', 'vectors']
27
+ };
28
+ // Initialize metadata cache with similar config to search cache
29
+ this.metadataCache = new MetadataIndexCache({
30
+ maxAge: 5 * 60 * 1000, // 5 minutes
31
+ maxSize: 500, // 500 entries (field indexes + value chunks)
32
+ enabled: true
33
+ });
34
+ }
35
+ /**
36
+ * Get index key for field and value
37
+ */
38
+ getIndexKey(field, value) {
39
+ const normalizedValue = this.normalizeValue(value);
40
+ return `${field}:${normalizedValue}`;
41
+ }
42
+ /**
43
+ * Generate field index filename for filter discovery
44
+ */
45
+ getFieldIndexFilename(field) {
46
+ return `field_${field}`;
47
+ }
48
+ /**
49
+ * Generate value chunk filename for scalable storage
50
+ */
51
+ getValueChunkFilename(field, value, chunkIndex = 0) {
52
+ const normalizedValue = this.normalizeValue(value);
53
+ const safeValue = this.makeSafeFilename(normalizedValue);
54
+ return `${field}_${safeValue}_chunk${chunkIndex}`;
55
+ }
56
+ /**
57
+ * Make a value safe for use in filenames
58
+ */
59
+ makeSafeFilename(value) {
60
+ // Replace unsafe characters and limit length
61
+ return value
62
+ .replace(/[^a-zA-Z0-9-_]/g, '_')
63
+ .substring(0, 50)
64
+ .toLowerCase();
65
+ }
66
+ /**
67
+ * Normalize value for consistent indexing
68
+ */
69
+ normalizeValue(value) {
70
+ if (value === null || value === undefined)
71
+ return '__NULL__';
72
+ if (typeof value === 'boolean')
73
+ return value ? '__TRUE__' : '__FALSE__';
74
+ if (typeof value === 'number')
75
+ return value.toString();
76
+ if (Array.isArray(value)) {
77
+ const joined = value.map(v => this.normalizeValue(v)).join(',');
78
+ // Hash very long array values to avoid filesystem limits
79
+ if (joined.length > 100) {
80
+ return this.hashValue(joined);
81
+ }
82
+ return joined;
83
+ }
84
+ const stringValue = String(value).toLowerCase().trim();
85
+ // Hash very long string values to avoid filesystem limits
86
+ if (stringValue.length > 100) {
87
+ return this.hashValue(stringValue);
88
+ }
89
+ return stringValue;
90
+ }
91
+ /**
92
+ * Create a short hash for long values to avoid filesystem filename limits
93
+ */
94
+ hashValue(value) {
95
+ // Simple hash function to create shorter keys
96
+ let hash = 0;
97
+ for (let i = 0; i < value.length; i++) {
98
+ const char = value.charCodeAt(i);
99
+ hash = ((hash << 5) - hash) + char;
100
+ hash = hash & hash; // Convert to 32-bit integer
101
+ }
102
+ return `__HASH_${Math.abs(hash).toString(36)}`;
103
+ }
104
+ /**
105
+ * Check if field should be indexed
106
+ */
107
+ shouldIndexField(field) {
108
+ if (this.config.excludeFields.includes(field))
109
+ return false;
110
+ if (this.config.indexedFields.length > 0) {
111
+ return this.config.indexedFields.includes(field);
112
+ }
113
+ return true;
114
+ }
115
+ /**
116
+ * Extract indexable field-value pairs from metadata
117
+ */
118
+ extractIndexableFields(metadata) {
119
+ const fields = [];
120
+ const extract = (obj, prefix = '') => {
121
+ for (const [key, value] of Object.entries(obj)) {
122
+ const fullKey = prefix ? `${prefix}.${key}` : key;
123
+ if (!this.shouldIndexField(fullKey))
124
+ continue;
125
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
126
+ // Recurse into nested objects
127
+ extract(value, fullKey);
128
+ }
129
+ else {
130
+ // Index this field
131
+ fields.push({ field: fullKey, value });
132
+ // If it's an array, also index each element
133
+ if (Array.isArray(value)) {
134
+ for (const item of value) {
135
+ fields.push({ field: fullKey, value: item });
136
+ }
137
+ }
138
+ }
139
+ }
140
+ };
141
+ if (metadata && typeof metadata === 'object') {
142
+ extract(metadata);
143
+ }
144
+ return fields;
145
+ }
146
+ /**
147
+ * Add item to metadata indexes
148
+ */
149
+ async addToIndex(id, metadata, skipFlush = false) {
150
+ const fields = this.extractIndexableFields(metadata);
151
+ for (const { field, value } of fields) {
152
+ const key = this.getIndexKey(field, value);
153
+ // Get or create index entry
154
+ let entry = this.indexCache.get(key);
155
+ if (!entry) {
156
+ const loadedEntry = await this.loadIndexEntry(key);
157
+ entry = loadedEntry ?? {
158
+ field,
159
+ value: this.normalizeValue(value),
160
+ ids: new Set(),
161
+ lastUpdated: Date.now()
162
+ };
163
+ this.indexCache.set(key, entry);
164
+ }
165
+ // Add ID to entry
166
+ entry.ids.add(id);
167
+ entry.lastUpdated = Date.now();
168
+ this.dirtyEntries.add(key);
169
+ // Update field index
170
+ await this.updateFieldIndex(field, value, 1);
171
+ }
172
+ // Adaptive auto-flush based on usage patterns
173
+ if (!skipFlush) {
174
+ const timeSinceLastFlush = Date.now() - this.lastFlushTime;
175
+ const shouldAutoFlush = this.dirtyEntries.size >= this.autoFlushThreshold || // Size threshold
176
+ (this.dirtyEntries.size > 10 && timeSinceLastFlush > 5000); // Time threshold (5 seconds)
177
+ if (shouldAutoFlush) {
178
+ const startTime = Date.now();
179
+ await this.flush();
180
+ const flushTime = Date.now() - startTime;
181
+ // Adapt threshold based on flush performance
182
+ if (flushTime < 50) {
183
+ // Fast flush, can handle more entries
184
+ this.autoFlushThreshold = Math.min(200, this.autoFlushThreshold * 1.2);
185
+ }
186
+ else if (flushTime > 200) {
187
+ // Slow flush, reduce batch size
188
+ this.autoFlushThreshold = Math.max(20, this.autoFlushThreshold * 0.8);
189
+ }
190
+ }
191
+ }
192
+ // Invalidate cache for these fields
193
+ for (const { field } of fields) {
194
+ this.metadataCache.invalidatePattern(`field_values_${field}`);
195
+ }
196
+ }
197
+ /**
198
+ * Update field index with value count
199
+ */
200
+ async updateFieldIndex(field, value, delta) {
201
+ let fieldIndex = this.fieldIndexes.get(field);
202
+ if (!fieldIndex) {
203
+ // Load from storage if not in memory
204
+ fieldIndex = await this.loadFieldIndex(field) ?? {
205
+ values: {},
206
+ lastUpdated: Date.now()
207
+ };
208
+ this.fieldIndexes.set(field, fieldIndex);
209
+ }
210
+ const normalizedValue = this.normalizeValue(value);
211
+ fieldIndex.values[normalizedValue] = (fieldIndex.values[normalizedValue] || 0) + delta;
212
+ // Remove if count drops to 0
213
+ if (fieldIndex.values[normalizedValue] <= 0) {
214
+ delete fieldIndex.values[normalizedValue];
215
+ }
216
+ fieldIndex.lastUpdated = Date.now();
217
+ this.dirtyFields.add(field);
218
+ }
219
+ /**
220
+ * Remove item from metadata indexes
221
+ */
222
+ async removeFromIndex(id, metadata) {
223
+ if (metadata) {
224
+ // Remove from specific field indexes
225
+ const fields = this.extractIndexableFields(metadata);
226
+ for (const { field, value } of fields) {
227
+ const key = this.getIndexKey(field, value);
228
+ let entry = this.indexCache.get(key);
229
+ if (!entry) {
230
+ const loadedEntry = await this.loadIndexEntry(key);
231
+ entry = loadedEntry ?? undefined;
232
+ }
233
+ if (entry) {
234
+ entry.ids.delete(id);
235
+ entry.lastUpdated = Date.now();
236
+ this.dirtyEntries.add(key);
237
+ // Update field index
238
+ await this.updateFieldIndex(field, value, -1);
239
+ // If no IDs left, mark for cleanup
240
+ if (entry.ids.size === 0) {
241
+ this.indexCache.delete(key);
242
+ await this.deleteIndexEntry(key);
243
+ }
244
+ }
245
+ // Invalidate cache
246
+ this.metadataCache.invalidatePattern(`field_values_${field}`);
247
+ }
248
+ }
249
+ else {
250
+ // Remove from all indexes (slower, requires scanning)
251
+ for (const [key, entry] of this.indexCache.entries()) {
252
+ if (entry.ids.has(id)) {
253
+ entry.ids.delete(id);
254
+ entry.lastUpdated = Date.now();
255
+ this.dirtyEntries.add(key);
256
+ if (entry.ids.size === 0) {
257
+ this.indexCache.delete(key);
258
+ await this.deleteIndexEntry(key);
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+ /**
265
+ * Get IDs for a specific field-value combination with caching
266
+ */
267
+ async getIds(field, value) {
268
+ const key = this.getIndexKey(field, value);
269
+ // Check metadata cache first
270
+ const cacheKey = `ids_${key}`;
271
+ const cachedIds = this.metadataCache.get(cacheKey);
272
+ if (cachedIds) {
273
+ return cachedIds;
274
+ }
275
+ // Try in-memory cache
276
+ let entry = this.indexCache.get(key);
277
+ // Load from storage if not cached
278
+ if (!entry) {
279
+ const loadedEntry = await this.loadIndexEntry(key);
280
+ if (loadedEntry) {
281
+ entry = loadedEntry;
282
+ this.indexCache.set(key, entry);
283
+ }
284
+ }
285
+ const ids = entry ? Array.from(entry.ids) : [];
286
+ // Cache the result
287
+ this.metadataCache.set(cacheKey, ids);
288
+ return ids;
289
+ }
290
+ /**
291
+ * Get all available values for a field (for filter discovery)
292
+ */
293
+ async getFilterValues(field) {
294
+ // Check cache first
295
+ const cacheKey = `field_values_${field}`;
296
+ const cachedValues = this.metadataCache.get(cacheKey);
297
+ if (cachedValues) {
298
+ return cachedValues;
299
+ }
300
+ // Check in-memory field indexes first
301
+ let fieldIndex = this.fieldIndexes.get(field);
302
+ // If not in memory, load from storage
303
+ if (!fieldIndex) {
304
+ const loaded = await this.loadFieldIndex(field);
305
+ if (loaded) {
306
+ fieldIndex = loaded;
307
+ this.fieldIndexes.set(field, loaded);
308
+ }
309
+ }
310
+ if (!fieldIndex) {
311
+ return [];
312
+ }
313
+ const values = Object.keys(fieldIndex.values);
314
+ // Cache the result
315
+ this.metadataCache.set(cacheKey, values);
316
+ return values;
317
+ }
318
+ /**
319
+ * Get all indexed fields (for filter discovery)
320
+ */
321
+ async getFilterFields() {
322
+ // Check cache first
323
+ const cacheKey = 'all_filter_fields';
324
+ const cachedFields = this.metadataCache.get(cacheKey);
325
+ if (cachedFields) {
326
+ return cachedFields;
327
+ }
328
+ // Get fields from in-memory indexes and storage
329
+ const fields = new Set(this.fieldIndexes.keys());
330
+ // Also scan storage for persisted field indexes (in case not loaded)
331
+ // This would require a new storage method to list field indexes
332
+ // For now, just use in-memory fields
333
+ const fieldsArray = Array.from(fields);
334
+ // Cache the result
335
+ this.metadataCache.set(cacheKey, fieldsArray);
336
+ return fieldsArray;
337
+ }
338
+ /**
339
+ * Convert MongoDB-style filter to simple field-value criteria for indexing
340
+ */
341
+ convertFilterToCriteria(filter) {
342
+ const criteria = [];
343
+ if (!filter || typeof filter !== 'object') {
344
+ return criteria;
345
+ }
346
+ for (const [key, value] of Object.entries(filter)) {
347
+ // Skip logical operators for now - handle them separately
348
+ if (key.startsWith('$'))
349
+ continue;
350
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
351
+ // Handle MongoDB operators
352
+ for (const [op, operand] of Object.entries(value)) {
353
+ switch (op) {
354
+ case '$in':
355
+ if (Array.isArray(operand)) {
356
+ criteria.push({ field: key, values: operand });
357
+ }
358
+ break;
359
+ case '$eq':
360
+ criteria.push({ field: key, values: [operand] });
361
+ break;
362
+ case '$includes':
363
+ // For $includes, the operand is the value we're looking for in an array field
364
+ criteria.push({ field: key, values: [operand] });
365
+ break;
366
+ // For other operators, we can't use index efficiently, skip for now
367
+ default:
368
+ break;
369
+ }
370
+ }
371
+ }
372
+ else {
373
+ // Direct value or array
374
+ const values = Array.isArray(value) ? value : [value];
375
+ criteria.push({ field: key, values });
376
+ }
377
+ }
378
+ return criteria;
379
+ }
380
+ /**
381
+ * Get IDs matching MongoDB-style metadata filter using indexes where possible
382
+ */
383
+ async getIdsForFilter(filter) {
384
+ if (!filter || Object.keys(filter).length === 0) {
385
+ return [];
386
+ }
387
+ // Handle logical operators
388
+ if (filter.$and && Array.isArray(filter.$and)) {
389
+ // For $and, we need intersection of all sub-filters
390
+ const allIds = [];
391
+ for (const subFilter of filter.$and) {
392
+ const subIds = await this.getIdsForFilter(subFilter);
393
+ allIds.push(subIds);
394
+ }
395
+ if (allIds.length === 0)
396
+ return [];
397
+ if (allIds.length === 1)
398
+ return allIds[0];
399
+ // Intersection of all sets
400
+ return allIds.reduce((intersection, currentSet) => intersection.filter(id => currentSet.includes(id)));
401
+ }
402
+ if (filter.$or && Array.isArray(filter.$or)) {
403
+ // For $or, we need union of all sub-filters
404
+ const unionIds = new Set();
405
+ for (const subFilter of filter.$or) {
406
+ const subIds = await this.getIdsForFilter(subFilter);
407
+ subIds.forEach(id => unionIds.add(id));
408
+ }
409
+ return Array.from(unionIds);
410
+ }
411
+ // Handle regular field filters
412
+ const criteria = this.convertFilterToCriteria(filter);
413
+ const idSets = [];
414
+ for (const { field, values } of criteria) {
415
+ const unionIds = new Set();
416
+ for (const value of values) {
417
+ const ids = await this.getIds(field, value);
418
+ ids.forEach(id => unionIds.add(id));
419
+ }
420
+ idSets.push(Array.from(unionIds));
421
+ }
422
+ if (idSets.length === 0)
423
+ return [];
424
+ if (idSets.length === 1)
425
+ return idSets[0];
426
+ // Intersection of all field criteria (implicit $and)
427
+ return idSets.reduce((intersection, currentSet) => intersection.filter(id => currentSet.includes(id)));
428
+ }
429
+ /**
430
+ * Get IDs matching multiple criteria (intersection) - LEGACY METHOD
431
+ * @deprecated Use getIdsForFilter instead
432
+ */
433
+ async getIdsForCriteria(criteria) {
434
+ return this.getIdsForFilter(criteria);
435
+ }
436
+ /**
437
+ * Flush dirty entries to storage
438
+ */
439
+ async flush() {
440
+ if (this.dirtyEntries.size === 0 && this.dirtyFields.size === 0) {
441
+ return; // Nothing to flush
442
+ }
443
+ const promises = [];
444
+ // Flush value entries
445
+ for (const key of this.dirtyEntries) {
446
+ const entry = this.indexCache.get(key);
447
+ if (entry) {
448
+ promises.push(this.saveIndexEntry(key, entry));
449
+ }
450
+ }
451
+ // Flush field indexes
452
+ for (const field of this.dirtyFields) {
453
+ const fieldIndex = this.fieldIndexes.get(field);
454
+ if (fieldIndex) {
455
+ promises.push(this.saveFieldIndex(field, fieldIndex));
456
+ }
457
+ }
458
+ await Promise.all(promises);
459
+ this.dirtyEntries.clear();
460
+ this.dirtyFields.clear();
461
+ this.lastFlushTime = Date.now();
462
+ }
463
+ /**
464
+ * Load field index from storage
465
+ */
466
+ async loadFieldIndex(field) {
467
+ try {
468
+ const filename = this.getFieldIndexFilename(field);
469
+ const cacheKey = `field_index_${filename}`;
470
+ // Check cache first
471
+ const cached = this.metadataCache.get(cacheKey);
472
+ if (cached) {
473
+ return cached;
474
+ }
475
+ // Load from storage
476
+ const indexId = `__metadata_field_index__${filename}`;
477
+ const data = await this.storage.getMetadata(indexId);
478
+ if (data) {
479
+ const fieldIndex = {
480
+ values: data.values || {},
481
+ lastUpdated: data.lastUpdated || Date.now()
482
+ };
483
+ // Cache it
484
+ this.metadataCache.set(cacheKey, fieldIndex);
485
+ return fieldIndex;
486
+ }
487
+ }
488
+ catch (error) {
489
+ // Field index doesn't exist yet
490
+ }
491
+ return null;
492
+ }
493
+ /**
494
+ * Save field index to storage
495
+ */
496
+ async saveFieldIndex(field, fieldIndex) {
497
+ const filename = this.getFieldIndexFilename(field);
498
+ const indexId = `__metadata_field_index__${filename}`;
499
+ await this.storage.saveMetadata(indexId, {
500
+ values: fieldIndex.values,
501
+ lastUpdated: fieldIndex.lastUpdated
502
+ });
503
+ // Invalidate cache
504
+ this.metadataCache.invalidatePattern(`field_index_${filename}`);
505
+ }
506
+ /**
507
+ * Get index statistics
508
+ */
509
+ async getStats() {
510
+ const fields = new Set();
511
+ let totalEntries = 0;
512
+ let totalIds = 0;
513
+ for (const entry of this.indexCache.values()) {
514
+ fields.add(entry.field);
515
+ totalEntries++;
516
+ totalIds += entry.ids.size;
517
+ }
518
+ return {
519
+ totalEntries,
520
+ totalIds,
521
+ fieldsIndexed: Array.from(fields),
522
+ lastRebuild: 0, // TODO: track rebuild timestamp
523
+ indexSize: totalEntries * 100 // rough estimate
524
+ };
525
+ }
526
+ /**
527
+ * Rebuild entire index from scratch using pagination
528
+ */
529
+ async rebuild() {
530
+ if (this.isRebuilding)
531
+ return;
532
+ this.isRebuilding = true;
533
+ try {
534
+ // Clear existing indexes
535
+ this.indexCache.clear();
536
+ this.dirtyEntries.clear();
537
+ this.fieldIndexes.clear();
538
+ this.dirtyFields.clear();
539
+ // Rebuild noun metadata indexes using pagination
540
+ let nounOffset = 0;
541
+ const nounLimit = 100;
542
+ let hasMoreNouns = true;
543
+ while (hasMoreNouns) {
544
+ const result = await this.storage.getNouns({
545
+ pagination: { offset: nounOffset, limit: nounLimit }
546
+ });
547
+ for (const noun of result.items) {
548
+ const metadata = await this.storage.getMetadata(noun.id);
549
+ if (metadata) {
550
+ // Skip flush during rebuild for performance
551
+ await this.addToIndex(noun.id, metadata, true);
552
+ }
553
+ }
554
+ hasMoreNouns = result.hasMore;
555
+ nounOffset += nounLimit;
556
+ }
557
+ // Rebuild verb metadata indexes using pagination
558
+ let verbOffset = 0;
559
+ const verbLimit = 100;
560
+ let hasMoreVerbs = true;
561
+ while (hasMoreVerbs) {
562
+ const result = await this.storage.getVerbs({
563
+ pagination: { offset: verbOffset, limit: verbLimit }
564
+ });
565
+ for (const verb of result.items) {
566
+ const metadata = await this.storage.getVerbMetadata(verb.id);
567
+ if (metadata) {
568
+ // Skip flush during rebuild for performance
569
+ await this.addToIndex(verb.id, metadata, true);
570
+ }
571
+ }
572
+ hasMoreVerbs = result.hasMore;
573
+ verbOffset += verbLimit;
574
+ }
575
+ // Flush to storage
576
+ await this.flush();
577
+ }
578
+ finally {
579
+ this.isRebuilding = false;
580
+ }
581
+ }
582
+ /**
583
+ * Load index entry from storage using safe filenames
584
+ */
585
+ async loadIndexEntry(key) {
586
+ try {
587
+ // Extract field and value from key
588
+ const [field, value] = key.split(':', 2);
589
+ const filename = this.getValueChunkFilename(field, value);
590
+ // Load from metadata indexes directory with safe filename
591
+ const indexId = `__metadata_index__${filename}`;
592
+ const data = await this.storage.getMetadata(indexId);
593
+ if (data) {
594
+ return {
595
+ field: data.field,
596
+ value: data.value,
597
+ ids: new Set(data.ids || []),
598
+ lastUpdated: data.lastUpdated || Date.now()
599
+ };
600
+ }
601
+ }
602
+ catch (error) {
603
+ // Index entry doesn't exist yet
604
+ }
605
+ return null;
606
+ }
607
+ /**
608
+ * Save index entry to storage using safe filenames
609
+ */
610
+ async saveIndexEntry(key, entry) {
611
+ const data = {
612
+ field: entry.field,
613
+ value: entry.value,
614
+ ids: Array.from(entry.ids),
615
+ lastUpdated: entry.lastUpdated
616
+ };
617
+ // Extract field and value from key for safe filename generation
618
+ const [field, value] = key.split(':', 2);
619
+ const filename = this.getValueChunkFilename(field, value);
620
+ // Store metadata indexes with safe filename
621
+ const indexId = `__metadata_index__${filename}`;
622
+ await this.storage.saveMetadata(indexId, data);
623
+ }
624
+ /**
625
+ * Delete index entry from storage using safe filenames
626
+ */
627
+ async deleteIndexEntry(key) {
628
+ try {
629
+ const [field, value] = key.split(':', 2);
630
+ const filename = this.getValueChunkFilename(field, value);
631
+ const indexId = `__metadata_index__${filename}`;
632
+ await this.storage.saveMetadata(indexId, null);
633
+ }
634
+ catch (error) {
635
+ // Entry might not exist
636
+ }
637
+ }
638
+ }
639
+ //# sourceMappingURL=metadataIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataIndex.js","sourceRoot":"","sources":["../../src/utils/metadataIndex.ts"],"names":[],"mappings":"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"}