mcard-js 2.0.0 → 2.1.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 (103) hide show
  1. package/README.md +91 -3
  2. package/dist/model/ContentTypeInterpreter.d.ts +16 -0
  3. package/dist/model/ContentTypeInterpreter.d.ts.map +1 -0
  4. package/dist/model/ContentTypeInterpreter.js +78 -0
  5. package/dist/model/ContentTypeInterpreter.js.map +1 -0
  6. package/dist/model/GTime.d.ts +15 -0
  7. package/dist/model/GTime.d.ts.map +1 -1
  8. package/dist/model/GTime.js +44 -2
  9. package/dist/model/GTime.js.map +1 -1
  10. package/dist/model/detectors/BaseDetector.d.ts +26 -0
  11. package/dist/model/detectors/BaseDetector.d.ts.map +1 -0
  12. package/dist/model/detectors/BaseDetector.js +5 -0
  13. package/dist/model/detectors/BaseDetector.js.map +1 -0
  14. package/dist/model/detectors/BinaryDetector.d.ts +12 -0
  15. package/dist/model/detectors/BinaryDetector.d.ts.map +1 -0
  16. package/dist/model/detectors/BinaryDetector.js +82 -0
  17. package/dist/model/detectors/BinaryDetector.js.map +1 -0
  18. package/dist/model/detectors/DataFormatDetectors.d.ts +29 -0
  19. package/dist/model/detectors/DataFormatDetectors.d.ts.map +1 -0
  20. package/dist/model/detectors/DataFormatDetectors.js +223 -0
  21. package/dist/model/detectors/DataFormatDetectors.js.map +1 -0
  22. package/dist/model/detectors/LanguageDetector.d.ts +11 -0
  23. package/dist/model/detectors/LanguageDetector.d.ts.map +1 -0
  24. package/dist/model/detectors/LanguageDetector.js +148 -0
  25. package/dist/model/detectors/LanguageDetector.js.map +1 -0
  26. package/dist/model/detectors/MarkupDetectors.d.ts +22 -0
  27. package/dist/model/detectors/MarkupDetectors.d.ts.map +1 -0
  28. package/dist/model/detectors/MarkupDetectors.js +132 -0
  29. package/dist/model/detectors/MarkupDetectors.js.map +1 -0
  30. package/dist/model/detectors/OBJDetector.d.ts +8 -0
  31. package/dist/model/detectors/OBJDetector.d.ts.map +1 -0
  32. package/dist/model/detectors/OBJDetector.js +48 -0
  33. package/dist/model/detectors/OBJDetector.js.map +1 -0
  34. package/dist/model/detectors/registry.d.ts +13 -0
  35. package/dist/model/detectors/registry.d.ts.map +1 -0
  36. package/dist/model/detectors/registry.js +67 -0
  37. package/dist/model/detectors/registry.js.map +1 -0
  38. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts +20 -0
  39. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts.map +1 -0
  40. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js +42 -0
  41. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js.map +1 -0
  42. package/dist/ptr/node/CLMLoader.d.ts.map +1 -1
  43. package/dist/ptr/node/CLMLoader.js +8 -0
  44. package/dist/ptr/node/CLMLoader.js.map +1 -1
  45. package/dist/ptr/node/CLMRunner.d.ts.map +1 -1
  46. package/dist/ptr/node/CLMRunner.js +4 -3
  47. package/dist/ptr/node/CLMRunner.js.map +1 -1
  48. package/dist/ptr/node/Runtimes.d.ts +7 -0
  49. package/dist/ptr/node/Runtimes.d.ts.map +1 -1
  50. package/dist/ptr/node/Runtimes.js +94 -3
  51. package/dist/ptr/node/Runtimes.js.map +1 -1
  52. package/dist/rag/HandleVectorStore.d.ts +201 -0
  53. package/dist/rag/HandleVectorStore.d.ts.map +1 -0
  54. package/dist/rag/HandleVectorStore.js +527 -0
  55. package/dist/rag/HandleVectorStore.js.map +1 -0
  56. package/dist/rag/PersistentIndexer.d.ts +144 -0
  57. package/dist/rag/PersistentIndexer.d.ts.map +1 -0
  58. package/dist/rag/PersistentIndexer.js +275 -0
  59. package/dist/rag/PersistentIndexer.js.map +1 -0
  60. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts +87 -0
  61. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts.map +1 -0
  62. package/dist/rag/embeddings/VisionEmbeddingProvider.js +164 -0
  63. package/dist/rag/embeddings/VisionEmbeddingProvider.js.map +1 -0
  64. package/dist/rag/graph/community.d.ts +56 -0
  65. package/dist/rag/graph/community.d.ts.map +1 -0
  66. package/dist/rag/graph/community.js +247 -0
  67. package/dist/rag/graph/community.js.map +1 -0
  68. package/dist/rag/graph/extractor.d.ts +99 -0
  69. package/dist/rag/graph/extractor.d.ts.map +1 -0
  70. package/dist/rag/graph/extractor.js +210 -0
  71. package/dist/rag/graph/extractor.js.map +1 -0
  72. package/dist/rag/graph/store.d.ts +176 -0
  73. package/dist/rag/graph/store.d.ts.map +1 -0
  74. package/dist/rag/graph/store.js +504 -0
  75. package/dist/rag/graph/store.js.map +1 -0
  76. package/dist/rag/index.d.ts +19 -0
  77. package/dist/rag/index.d.ts.map +1 -0
  78. package/dist/rag/index.js +24 -0
  79. package/dist/rag/index.js.map +1 -0
  80. package/dist/rag/semanticVersioning.d.ts +187 -0
  81. package/dist/rag/semanticVersioning.d.ts.map +1 -0
  82. package/dist/rag/semanticVersioning.js +253 -0
  83. package/dist/rag/semanticVersioning.js.map +1 -0
  84. package/dist/storage/IndexedDBEngine.d.ts.map +1 -1
  85. package/dist/storage/IndexedDBEngine.js +9 -1
  86. package/dist/storage/IndexedDBEngine.js.map +1 -1
  87. package/dist/storage/SqliteNodeEngine.d.ts.map +1 -1
  88. package/dist/storage/SqliteNodeEngine.js +26 -4
  89. package/dist/storage/SqliteNodeEngine.js.map +1 -1
  90. package/dist/storage/SqliteWasmEngine.d.ts.map +1 -1
  91. package/dist/storage/SqliteWasmEngine.js +9 -1
  92. package/dist/storage/SqliteWasmEngine.js.map +1 -1
  93. package/dist/storage/StorageAdapter.d.ts +2 -0
  94. package/dist/storage/StorageAdapter.d.ts.map +1 -1
  95. package/dist/storage/VectorStore.d.ts +28 -5
  96. package/dist/storage/VectorStore.d.ts.map +1 -1
  97. package/dist/storage/VectorStore.js +110 -50
  98. package/dist/storage/VectorStore.js.map +1 -1
  99. package/dist/storage/schema.d.ts +123 -80
  100. package/dist/storage/schema.d.ts.map +1 -1
  101. package/dist/storage/schema.js +305 -217
  102. package/dist/storage/schema.js.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1,527 @@
1
+ /**
2
+ * Handle-Aware Vector Store for Semantic Versioning
3
+ *
4
+ * Extends VectorStore to enable semantic similarity detection
5
+ * across MCard versions linked to handles.
6
+ *
7
+ * Key Features:
8
+ * - Link MCards to handles during indexing
9
+ * - Compare versions within a handle by semantic similarity
10
+ * - Filter searches by handle
11
+ * - Sort version history by distance to current or query
12
+ * - Automatic upgrade type classification based on semantic delta
13
+ *
14
+ * @module mcard-js/rag/HandleVectorStore
15
+ */
16
+ import { MCardVectorStore, cosineSimilarity, deserializeVector } from '../storage/VectorStore';
17
+ import { initSemanticSchemas, HANDLE_VERSION_VECTORS_SCHEMA, VERSION_SIMILARITY_CACHE_SCHEMA } from '../storage/schema';
18
+ // ─────────────────────────────────────────────────────────────────────────────
19
+ // Upgrade Type Classification
20
+ // ─────────────────────────────────────────────────────────────────────────────
21
+ /**
22
+ * Classify upgrade type based on semantic similarity to parent.
23
+ *
24
+ * Thresholds:
25
+ * - >= 0.95: trivial (formatting, typo fixes)
26
+ * - 0.85 - 0.94: minor (small edits, clarifications)
27
+ * - 0.70 - 0.84: major (significant content changes)
28
+ * - < 0.70: breaking (major semantic drift)
29
+ *
30
+ * @param semanticDelta Cosine similarity to parent version
31
+ * @returns Upgrade type string
32
+ */
33
+ export function classifyUpgradeType(semanticDelta) {
34
+ if (semanticDelta >= 0.95) {
35
+ return 'trivial';
36
+ }
37
+ else if (semanticDelta >= 0.85) {
38
+ return 'minor';
39
+ }
40
+ else if (semanticDelta >= 0.70) {
41
+ return 'major';
42
+ }
43
+ else {
44
+ return 'breaking';
45
+ }
46
+ }
47
+ /**
48
+ * Calculate Euclidean distance between two vectors.
49
+ */
50
+ export function euclideanDistance(a, b) {
51
+ if (a.length !== b.length) {
52
+ throw new Error('Vectors must have same length');
53
+ }
54
+ let sum = 0;
55
+ for (let i = 0; i < a.length; i++) {
56
+ const diff = a[i] - b[i];
57
+ sum += diff * diff;
58
+ }
59
+ return Math.sqrt(sum);
60
+ }
61
+ // ─────────────────────────────────────────────────────────────────────────────
62
+ // Handle-Aware Vector Store
63
+ // ─────────────────────────────────────────────────────────────────────────────
64
+ /**
65
+ * Extended vector store with handle-aware version similarity.
66
+ *
67
+ * This class implements the Handle-Hash Duality pattern with semantic
68
+ * awareness, enabling:
69
+ *
70
+ * - Version tracking via handles
71
+ * - Semantic similarity detection across versions
72
+ * - Intelligent upgrade classification
73
+ * - Cross-version semantic search
74
+ *
75
+ * Architecture:
76
+ * - Handles remain stable identifiers (Proxy Pattern)
77
+ * - Hashes reference immutable content (Content-Addressing)
78
+ * - Embeddings enable semantic understanding (Vector Search)
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const store = new HandleVectorStore(':memory:');
83
+ *
84
+ * // Index with handle association
85
+ * await store.indexWithHandle(mcard, 'my_document');
86
+ *
87
+ * // Get versions sorted by similarity to current
88
+ * const versions = await store.getVersionsBySimilarity('my_document');
89
+ *
90
+ * // Find versions similar to a query
91
+ * const results = await store.searchHandleVersions('my_document', 'machine learning');
92
+ * ```
93
+ */
94
+ export class HandleVectorStore extends MCardVectorStore {
95
+ constructor(dbPath = ':memory:', config = {}) {
96
+ super(dbPath, config);
97
+ this.initHandleTables();
98
+ }
99
+ /**
100
+ * Create handle-vector bridge tables for semantic versioning.
101
+ */
102
+ initHandleTables() {
103
+ // Create handle-version-vector bridge table
104
+ if (HANDLE_VERSION_VECTORS_SCHEMA) {
105
+ this.db.exec(HANDLE_VERSION_VECTORS_SCHEMA);
106
+ }
107
+ // Create similarity cache table
108
+ if (VERSION_SIMILARITY_CACHE_SCHEMA) {
109
+ this.db.exec(VERSION_SIMILARITY_CACHE_SCHEMA);
110
+ }
111
+ // Use the schema initialization function if tables weren't created
112
+ try {
113
+ initSemanticSchemas(this.db);
114
+ }
115
+ catch (e) {
116
+ // Tables might already exist, ignore
117
+ }
118
+ }
119
+ // ─────────────────────────────────────────────────────────────────────────
120
+ // Indexing with Handle Association
121
+ // ─────────────────────────────────────────────────────────────────────────
122
+ /**
123
+ * Index an MCard and associate it with a handle.
124
+ *
125
+ * This method:
126
+ * 1. Indexes the MCard content with embeddings (via base class)
127
+ * 2. Links the MCard hash to the handle with version tracking
128
+ * 3. Computes semantic delta from parent version (if exists)
129
+ * 4. Classifies the upgrade type based on similarity
130
+ *
131
+ * @param mcard MCard to index
132
+ * @param handle Handle name to associate with
133
+ * @param isCurrent Whether this is the current version
134
+ * @param chunk Whether to chunk long content
135
+ * @returns Number of vectors indexed (0 if content couldn't be indexed)
136
+ */
137
+ async indexWithHandle(mcard, handle, isCurrent = true, chunk = true) {
138
+ // Extract content from MCard for indexing
139
+ const content = typeof mcard.content === 'string'
140
+ ? mcard.content
141
+ : typeof mcard.content === 'object' && mcard.content !== null
142
+ ? JSON.stringify(mcard.content)
143
+ : String(mcard.content ?? '');
144
+ if (!content) {
145
+ console.warn(`MCard ${mcard.hash.slice(0, 8)} has no content, skipping index`);
146
+ return 0;
147
+ }
148
+ // Standard indexing (generates embeddings)
149
+ const indexed = await this.index(mcard.hash, content, undefined, chunk);
150
+ if (indexed === 0) {
151
+ console.warn(`MCard ${mcard.hash.slice(0, 8)} could not be indexed, skipping handle link`);
152
+ return 0;
153
+ }
154
+ const now = new Date().toISOString();
155
+ // Get embedding ID for this hash (chunk 0)
156
+ const metaRow = this.db.prepare(`
157
+ SELECT id FROM mcard_vector_metadata
158
+ WHERE hash = ? AND chunk_index = 0 LIMIT 1
159
+ `).get(mcard.hash);
160
+ const embeddingId = metaRow?.id ?? null;
161
+ // Get current version info for calculating semantic delta
162
+ let parentHash = null;
163
+ let semanticDelta = null;
164
+ let upgradeType = null;
165
+ if (isCurrent) {
166
+ // Get the current version before updating
167
+ const currentRow = this.db.prepare(`
168
+ SELECT hash, embedding_id FROM handle_version_vectors
169
+ WHERE handle = ? AND is_current = TRUE LIMIT 1
170
+ `).get(handle);
171
+ if (currentRow) {
172
+ parentHash = currentRow.hash;
173
+ const parentEmbeddingId = currentRow.embedding_id;
174
+ // Calculate semantic delta if both have embeddings
175
+ if (embeddingId && parentEmbeddingId) {
176
+ const newEmbedding = this.getEmbedding(mcard.hash);
177
+ const parentEmbedding = this.getEmbedding(parentHash);
178
+ if (newEmbedding && parentEmbedding) {
179
+ semanticDelta = cosineSimilarity(newEmbedding, parentEmbedding);
180
+ upgradeType = classifyUpgradeType(semanticDelta);
181
+ console.debug(`Semantic delta for ${handle}: ${semanticDelta.toFixed(4)} (${upgradeType})`);
182
+ }
183
+ }
184
+ }
185
+ // Shift existing versions down
186
+ this.db.prepare(`
187
+ UPDATE handle_version_vectors
188
+ SET version_order = version_order + 1, is_current = FALSE
189
+ WHERE handle = ?
190
+ `).run(handle);
191
+ }
192
+ // Determine version order
193
+ let versionOrder;
194
+ if (isCurrent) {
195
+ versionOrder = 0;
196
+ }
197
+ else {
198
+ const maxRow = this.db.prepare(`
199
+ SELECT COALESCE(MAX(version_order), -1) + 1 as next_order
200
+ FROM handle_version_vectors
201
+ WHERE handle = ?
202
+ `).get(handle);
203
+ versionOrder = maxRow.next_order;
204
+ }
205
+ // Insert version record
206
+ this.db.prepare(`
207
+ INSERT OR REPLACE INTO handle_version_vectors
208
+ (handle, hash, parent_hash, version_order, is_current,
209
+ embedding_id, semantic_delta_from_parent, upgrade_type, created_at)
210
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
211
+ `).run(handle, mcard.hash, parentHash, versionOrder, isCurrent ? 1 : 0, embeddingId, semanticDelta, upgradeType, now);
212
+ console.log(`Indexed MCard ${mcard.hash.slice(0, 8)} for handle '${handle}' ` +
213
+ `(v${versionOrder}, current=${isCurrent}, type=${upgradeType})`);
214
+ return indexed;
215
+ }
216
+ // ─────────────────────────────────────────────────────────────────────────
217
+ // Version Retrieval
218
+ // ─────────────────────────────────────────────────────────────────────────
219
+ /**
220
+ * Get all versions for a handle.
221
+ *
222
+ * @param handle Handle name to query
223
+ * @returns List of HandleVersion objects, ordered by version_order (0 = current)
224
+ */
225
+ getHandleVersions(handle) {
226
+ const rows = this.db.prepare(`
227
+ SELECT hash, version_order, is_current, embedding_id, created_at,
228
+ parent_hash, semantic_delta_from_parent, upgrade_type
229
+ FROM handle_version_vectors
230
+ WHERE handle = ?
231
+ ORDER BY version_order
232
+ `).all(handle);
233
+ return rows.map(row => ({
234
+ hash: row.hash,
235
+ versionOrder: row.version_order,
236
+ isCurrent: Boolean(row.is_current),
237
+ embeddingId: row.embedding_id ?? undefined,
238
+ createdAt: row.created_at,
239
+ parentHash: row.parent_hash ?? undefined,
240
+ semanticDelta: row.semantic_delta_from_parent ?? undefined,
241
+ upgradeType: row.upgrade_type ?? undefined,
242
+ }));
243
+ }
244
+ /**
245
+ * Get all version hashes for a handle.
246
+ *
247
+ * @param handle Handle name to query
248
+ * @returns List of hashes, ordered by version_order
249
+ */
250
+ getHandleVersionHashes(handle) {
251
+ const versions = this.getHandleVersions(handle);
252
+ return versions.map(v => v.hash);
253
+ }
254
+ /**
255
+ * Get the current version for a handle.
256
+ *
257
+ * @param handle Handle name to query
258
+ * @returns HandleVersion for current version, or undefined if handle not found
259
+ */
260
+ getCurrentVersion(handle) {
261
+ const row = this.db.prepare(`
262
+ SELECT hash, version_order, is_current, embedding_id, created_at,
263
+ parent_hash, semantic_delta_from_parent, upgrade_type
264
+ FROM handle_version_vectors
265
+ WHERE handle = ? AND is_current = TRUE
266
+ LIMIT 1
267
+ `).get(handle);
268
+ if (!row) {
269
+ return undefined;
270
+ }
271
+ return {
272
+ hash: row.hash,
273
+ versionOrder: row.version_order,
274
+ isCurrent: Boolean(row.is_current),
275
+ embeddingId: row.embedding_id ?? undefined,
276
+ createdAt: row.created_at,
277
+ parentHash: row.parent_hash ?? undefined,
278
+ semanticDelta: row.semantic_delta_from_parent ?? undefined,
279
+ upgradeType: row.upgrade_type ?? undefined,
280
+ };
281
+ }
282
+ // ─────────────────────────────────────────────────────────────────────────
283
+ // Semantic Similarity Operations
284
+ // ─────────────────────────────────────────────────────────────────────────
285
+ /**
286
+ * Get versions for a handle, sorted by similarity to a reference.
287
+ *
288
+ * @param handle Handle name
289
+ * @param referenceHash Hash to compare against (default: current version)
290
+ * @param metric 'cosine' (higher = more similar) or 'euclidean' (lower = more similar)
291
+ * @returns List of VersionSimilarityResult, sorted by similarity
292
+ */
293
+ getVersionsBySimilarity(handle, referenceHash, metric = 'cosine') {
294
+ const versions = this.getHandleVersions(handle);
295
+ if (versions.length === 0) {
296
+ return [];
297
+ }
298
+ // Determine reference hash
299
+ if (!referenceHash) {
300
+ const current = versions.find(v => v.isCurrent);
301
+ referenceHash = current?.hash ?? versions[0].hash;
302
+ }
303
+ // Get reference embedding
304
+ const refEmbedding = this.getEmbedding(referenceHash);
305
+ if (!refEmbedding) {
306
+ console.warn(`No embedding found for reference hash ${referenceHash.slice(0, 8)}`);
307
+ return [];
308
+ }
309
+ // Calculate similarities
310
+ const results = [];
311
+ for (const v of versions) {
312
+ let similarity;
313
+ let distance;
314
+ if (v.hash === referenceHash) {
315
+ // Self-similarity
316
+ similarity = 1.0;
317
+ distance = 0.0;
318
+ }
319
+ else {
320
+ const vEmbedding = this.getEmbedding(v.hash);
321
+ if (!vEmbedding) {
322
+ console.debug(`Skipping version ${v.hash.slice(0, 8)} - no embedding`);
323
+ continue;
324
+ }
325
+ similarity = cosineSimilarity(refEmbedding, vEmbedding);
326
+ distance = euclideanDistance(refEmbedding, vEmbedding);
327
+ }
328
+ results.push({
329
+ hash: v.hash,
330
+ versionOrder: v.versionOrder,
331
+ similarityToCurrent: similarity,
332
+ distanceToCurrent: distance,
333
+ parentHash: v.parentHash,
334
+ upgradeType: v.upgradeType,
335
+ });
336
+ }
337
+ // Sort by similarity (descending) or distance (ascending)
338
+ if (metric === 'cosine') {
339
+ results.sort((a, b) => b.similarityToCurrent - a.similarityToCurrent);
340
+ }
341
+ else {
342
+ results.sort((a, b) => a.distanceToCurrent - b.distanceToCurrent);
343
+ }
344
+ return results;
345
+ }
346
+ /**
347
+ * Search within a handle's versions by semantic query.
348
+ *
349
+ * Useful for finding which version of a document best matches
350
+ * a specific concept or topic.
351
+ *
352
+ * @param handle Handle name to filter by
353
+ * @param query Search query text
354
+ * @param k Number of results
355
+ * @returns List of VersionSimilarityResult with query similarity scores
356
+ */
357
+ async searchHandleVersions(handle, query, k) {
358
+ // Default to 10 results if not specified
359
+ const limit = k ?? 10;
360
+ // Get version hashes for this handle
361
+ const versionHashes = this.getHandleVersionHashes(handle);
362
+ if (versionHashes.length === 0) {
363
+ return [];
364
+ }
365
+ // Search for similar content (no hash filter in base class)
366
+ // We'll filter by handle versions after the search
367
+ const allResults = await this.search(query, limit * 2);
368
+ // Filter results to only include versions from this handle
369
+ const versionHashSet = new Set(versionHashes);
370
+ const results = allResults.filter(r => versionHashSet.has(r.hash)).slice(0, limit);
371
+ // Get version info for enrichment
372
+ const versions = new Map(this.getHandleVersions(handle).map(v => [v.hash, v]));
373
+ // Enrich results with version info
374
+ const enriched = [];
375
+ for (const r of results) {
376
+ const v = versions.get(r.hash);
377
+ if (v) {
378
+ enriched.push({
379
+ hash: r.hash,
380
+ versionOrder: v.versionOrder,
381
+ similarityToCurrent: 0.0, // Not computed in this method
382
+ distanceToCurrent: 0.0, // Not computed in this method
383
+ similarityToQuery: r.score,
384
+ parentHash: v.parentHash,
385
+ upgradeType: v.upgradeType,
386
+ });
387
+ }
388
+ }
389
+ return enriched;
390
+ }
391
+ /**
392
+ * Compute pairwise cosine similarities between all versions of a handle.
393
+ *
394
+ * Optionally caches results in the version_similarity_cache table.
395
+ *
396
+ * @param handle Handle name
397
+ * @param cache Whether to cache computed similarities
398
+ * @returns Map of (hash_a, hash_b) string key to cosine similarity
399
+ */
400
+ computeVersionDistances(handle, cache = true) {
401
+ const versions = this.getHandleVersions(handle);
402
+ const embeddings = new Map();
403
+ for (const v of versions) {
404
+ const emb = this.getEmbedding(v.hash);
405
+ if (emb) {
406
+ embeddings.set(v.hash, emb);
407
+ }
408
+ }
409
+ const distances = new Map();
410
+ const hashes = Array.from(embeddings.keys());
411
+ const now = new Date().toISOString();
412
+ for (let i = 0; i < hashes.length; i++) {
413
+ for (let j = i; j < hashes.length; j++) {
414
+ const h1 = hashes[i];
415
+ const h2 = hashes[j];
416
+ let sim;
417
+ if (h1 === h2) {
418
+ sim = 1.0;
419
+ }
420
+ else {
421
+ sim = cosineSimilarity(embeddings.get(h1), embeddings.get(h2));
422
+ const dist = euclideanDistance(embeddings.get(h1), embeddings.get(h2));
423
+ // Cache the result
424
+ if (cache) {
425
+ try {
426
+ this.db.prepare(`
427
+ INSERT OR REPLACE INTO version_similarity_cache
428
+ (handle, hash_a, hash_b, similarity_score, distance_euclidean, computed_at)
429
+ VALUES (?, ?, ?, ?, ?, ?)
430
+ `).run(handle, h1, h2, sim, dist, now);
431
+ }
432
+ catch (e) {
433
+ console.warn(`Failed to cache similarity for ${h1.slice(0, 8)}<->${h2.slice(0, 8)}: ${e}`);
434
+ }
435
+ }
436
+ }
437
+ // Store both directions
438
+ distances.set(`${h1}:${h2}`, sim);
439
+ distances.set(`${h2}:${h1}`, sim);
440
+ }
441
+ }
442
+ return distances;
443
+ }
444
+ // ─────────────────────────────────────────────────────────────────────────
445
+ // Embedding Retrieval (Internal)
446
+ // ─────────────────────────────────────────────────────────────────────────
447
+ /**
448
+ * Get embedding vector for a hash.
449
+ *
450
+ * @param hash MCard hash
451
+ * @param chunkIndex Chunk index (default 0 for first/whole chunk)
452
+ * @returns Embedding vector as array of floats, or undefined if not found
453
+ */
454
+ getEmbedding(hash, chunkIndex = 0) {
455
+ // Get metadata ID
456
+ const metaRow = this.db.prepare(`
457
+ SELECT id FROM mcard_vector_metadata
458
+ WHERE hash = ? AND chunk_index = ?
459
+ `).get(hash, chunkIndex);
460
+ if (!metaRow) {
461
+ return undefined;
462
+ }
463
+ const metadataId = metaRow.id;
464
+ // Get embedding from appropriate table
465
+ const embeddingRow = this.db.prepare(`
466
+ SELECT embedding FROM mcard_embeddings WHERE metadata_id = ?
467
+ `).get(metadataId);
468
+ if (embeddingRow) {
469
+ return deserializeVector(embeddingRow.embedding);
470
+ }
471
+ return undefined;
472
+ }
473
+ // ─────────────────────────────────────────────────────────────────────────
474
+ // Utility Methods
475
+ // ─────────────────────────────────────────────────────────────────────────
476
+ /**
477
+ * List all handles with indexed versions.
478
+ *
479
+ * @returns List of unique handle names
480
+ */
481
+ listHandles() {
482
+ const rows = this.db.prepare('SELECT DISTINCT handle FROM handle_version_vectors ORDER BY handle').all();
483
+ return rows.map(row => row.handle);
484
+ }
485
+ /**
486
+ * Count versions for a handle.
487
+ *
488
+ * @param handle Handle name
489
+ * @returns Number of versions
490
+ */
491
+ countVersions(handle) {
492
+ const row = this.db.prepare('SELECT COUNT(*) as count FROM handle_version_vectors WHERE handle = ?').get(handle);
493
+ return row.count;
494
+ }
495
+ /**
496
+ * Delete all version records for a handle.
497
+ *
498
+ * Note: This only removes the handle-version associations,
499
+ * not the underlying MCard embeddings.
500
+ *
501
+ * @param handle Handle name
502
+ * @returns Number of version records deleted
503
+ */
504
+ deleteHandle(handle) {
505
+ // Delete similarity cache
506
+ this.db.prepare('DELETE FROM version_similarity_cache WHERE handle = ?').run(handle);
507
+ // Delete version records
508
+ const result = this.db.prepare('DELETE FROM handle_version_vectors WHERE handle = ?').run(handle);
509
+ console.log(`Deleted ${result.changes} version records for handle '${handle}'`);
510
+ return result.changes ?? 0;
511
+ }
512
+ /**
513
+ * Get extended vector store information including handle stats.
514
+ */
515
+ getInfo() {
516
+ const info = super.getInfo();
517
+ // Add handle-specific stats
518
+ const handleCount = this.db.prepare('SELECT COUNT(DISTINCT handle) as count FROM handle_version_vectors').get();
519
+ info.handleCount = handleCount.count;
520
+ const versionCount = this.db.prepare('SELECT COUNT(*) as count FROM handle_version_vectors').get();
521
+ info.versionCount = versionCount.count;
522
+ const cachedSimilarities = this.db.prepare('SELECT COUNT(*) as count FROM version_similarity_cache').get();
523
+ info.cachedSimilarities = cachedSimilarities.count;
524
+ return info;
525
+ }
526
+ }
527
+ //# sourceMappingURL=HandleVectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandleVectorStore.js","sourceRoot":"","sources":["../../src/rag/HandleVectorStore.ts"],"names":[],"mappings":"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"}