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.
- package/README.md +91 -3
- package/dist/model/ContentTypeInterpreter.d.ts +16 -0
- package/dist/model/ContentTypeInterpreter.d.ts.map +1 -0
- package/dist/model/ContentTypeInterpreter.js +78 -0
- package/dist/model/ContentTypeInterpreter.js.map +1 -0
- package/dist/model/GTime.d.ts +15 -0
- package/dist/model/GTime.d.ts.map +1 -1
- package/dist/model/GTime.js +44 -2
- package/dist/model/GTime.js.map +1 -1
- package/dist/model/detectors/BaseDetector.d.ts +26 -0
- package/dist/model/detectors/BaseDetector.d.ts.map +1 -0
- package/dist/model/detectors/BaseDetector.js +5 -0
- package/dist/model/detectors/BaseDetector.js.map +1 -0
- package/dist/model/detectors/BinaryDetector.d.ts +12 -0
- package/dist/model/detectors/BinaryDetector.d.ts.map +1 -0
- package/dist/model/detectors/BinaryDetector.js +82 -0
- package/dist/model/detectors/BinaryDetector.js.map +1 -0
- package/dist/model/detectors/DataFormatDetectors.d.ts +29 -0
- package/dist/model/detectors/DataFormatDetectors.d.ts.map +1 -0
- package/dist/model/detectors/DataFormatDetectors.js +223 -0
- package/dist/model/detectors/DataFormatDetectors.js.map +1 -0
- package/dist/model/detectors/LanguageDetector.d.ts +11 -0
- package/dist/model/detectors/LanguageDetector.d.ts.map +1 -0
- package/dist/model/detectors/LanguageDetector.js +148 -0
- package/dist/model/detectors/LanguageDetector.js.map +1 -0
- package/dist/model/detectors/MarkupDetectors.d.ts +22 -0
- package/dist/model/detectors/MarkupDetectors.d.ts.map +1 -0
- package/dist/model/detectors/MarkupDetectors.js +132 -0
- package/dist/model/detectors/MarkupDetectors.js.map +1 -0
- package/dist/model/detectors/OBJDetector.d.ts +8 -0
- package/dist/model/detectors/OBJDetector.d.ts.map +1 -0
- package/dist/model/detectors/OBJDetector.js +48 -0
- package/dist/model/detectors/OBJDetector.js.map +1 -0
- package/dist/model/detectors/registry.d.ts +13 -0
- package/dist/model/detectors/registry.d.ts.map +1 -0
- package/dist/model/detectors/registry.js +67 -0
- package/dist/model/detectors/registry.js.map +1 -0
- package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts +20 -0
- package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts.map +1 -0
- package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js +42 -0
- package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js.map +1 -0
- package/dist/ptr/node/CLMLoader.d.ts.map +1 -1
- package/dist/ptr/node/CLMLoader.js +8 -0
- package/dist/ptr/node/CLMLoader.js.map +1 -1
- package/dist/ptr/node/CLMRunner.d.ts.map +1 -1
- package/dist/ptr/node/CLMRunner.js +4 -3
- package/dist/ptr/node/CLMRunner.js.map +1 -1
- package/dist/ptr/node/Runtimes.d.ts +7 -0
- package/dist/ptr/node/Runtimes.d.ts.map +1 -1
- package/dist/ptr/node/Runtimes.js +94 -3
- package/dist/ptr/node/Runtimes.js.map +1 -1
- package/dist/rag/HandleVectorStore.d.ts +201 -0
- package/dist/rag/HandleVectorStore.d.ts.map +1 -0
- package/dist/rag/HandleVectorStore.js +527 -0
- package/dist/rag/HandleVectorStore.js.map +1 -0
- package/dist/rag/PersistentIndexer.d.ts +144 -0
- package/dist/rag/PersistentIndexer.d.ts.map +1 -0
- package/dist/rag/PersistentIndexer.js +275 -0
- package/dist/rag/PersistentIndexer.js.map +1 -0
- package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts +87 -0
- package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts.map +1 -0
- package/dist/rag/embeddings/VisionEmbeddingProvider.js +164 -0
- package/dist/rag/embeddings/VisionEmbeddingProvider.js.map +1 -0
- package/dist/rag/graph/community.d.ts +56 -0
- package/dist/rag/graph/community.d.ts.map +1 -0
- package/dist/rag/graph/community.js +247 -0
- package/dist/rag/graph/community.js.map +1 -0
- package/dist/rag/graph/extractor.d.ts +99 -0
- package/dist/rag/graph/extractor.d.ts.map +1 -0
- package/dist/rag/graph/extractor.js +210 -0
- package/dist/rag/graph/extractor.js.map +1 -0
- package/dist/rag/graph/store.d.ts +176 -0
- package/dist/rag/graph/store.d.ts.map +1 -0
- package/dist/rag/graph/store.js +504 -0
- package/dist/rag/graph/store.js.map +1 -0
- package/dist/rag/index.d.ts +19 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +24 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/semanticVersioning.d.ts +187 -0
- package/dist/rag/semanticVersioning.d.ts.map +1 -0
- package/dist/rag/semanticVersioning.js +253 -0
- package/dist/rag/semanticVersioning.js.map +1 -0
- package/dist/storage/IndexedDBEngine.d.ts.map +1 -1
- package/dist/storage/IndexedDBEngine.js +9 -1
- package/dist/storage/IndexedDBEngine.js.map +1 -1
- package/dist/storage/SqliteNodeEngine.d.ts.map +1 -1
- package/dist/storage/SqliteNodeEngine.js +26 -4
- package/dist/storage/SqliteNodeEngine.js.map +1 -1
- package/dist/storage/SqliteWasmEngine.d.ts.map +1 -1
- package/dist/storage/SqliteWasmEngine.js +9 -1
- package/dist/storage/SqliteWasmEngine.js.map +1 -1
- package/dist/storage/StorageAdapter.d.ts +2 -0
- package/dist/storage/StorageAdapter.d.ts.map +1 -1
- package/dist/storage/VectorStore.d.ts +28 -5
- package/dist/storage/VectorStore.d.ts.map +1 -1
- package/dist/storage/VectorStore.js +110 -50
- package/dist/storage/VectorStore.js.map +1 -1
- package/dist/storage/schema.d.ts +123 -80
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +305 -217
- package/dist/storage/schema.js.map +1 -1
- 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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"}
|