agentdb 2.0.0-alpha.2 → 2.0.0-alpha.2.1
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/dist/agentdb.min.js +4 -4
- package/dist/simulation/cli.js +0 -0
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +78 -0
- package/dist/src/cli/agentdb-cli.js.map +1 -1
- package/package.json +3 -3
- package/src/cli/agentdb-cli.ts +78 -0
- package/dist/agentdb-advanced.js +0 -2110
- package/dist/agentdb-advanced.min.js +0 -1
- package/dist/backends/GraphBackend.d.ts +0 -196
- package/dist/backends/GraphBackend.d.ts.map +0 -1
- package/dist/backends/GraphBackend.js +0 -33
- package/dist/backends/GraphBackend.js.map +0 -1
- package/dist/backends/LearningBackend.d.ts +0 -148
- package/dist/backends/LearningBackend.d.ts.map +0 -1
- package/dist/backends/LearningBackend.js +0 -27
- package/dist/backends/LearningBackend.js.map +0 -1
- package/dist/backends/VectorBackend.d.ts +0 -119
- package/dist/backends/VectorBackend.d.ts.map +0 -1
- package/dist/backends/VectorBackend.js +0 -14
- package/dist/backends/VectorBackend.js.map +0 -1
- package/dist/backends/detector.d.ts +0 -81
- package/dist/backends/detector.d.ts.map +0 -1
- package/dist/backends/detector.js +0 -192
- package/dist/backends/detector.js.map +0 -1
- package/dist/backends/factory.d.ts +0 -50
- package/dist/backends/factory.d.ts.map +0 -1
- package/dist/backends/factory.js +0 -161
- package/dist/backends/factory.js.map +0 -1
- package/dist/backends/graph/GraphDatabaseAdapter.d.ts +0 -139
- package/dist/backends/graph/GraphDatabaseAdapter.d.ts.map +0 -1
- package/dist/backends/graph/GraphDatabaseAdapter.js +0 -194
- package/dist/backends/graph/GraphDatabaseAdapter.js.map +0 -1
- package/dist/backends/hnswlib/HNSWLibBackend.d.ts +0 -92
- package/dist/backends/hnswlib/HNSWLibBackend.d.ts.map +0 -1
- package/dist/backends/hnswlib/HNSWLibBackend.js +0 -316
- package/dist/backends/hnswlib/HNSWLibBackend.js.map +0 -1
- package/dist/backends/hnswlib/index.d.ts +0 -7
- package/dist/backends/hnswlib/index.d.ts.map +0 -1
- package/dist/backends/hnswlib/index.js +0 -7
- package/dist/backends/hnswlib/index.js.map +0 -1
- package/dist/backends/index.d.ts +0 -14
- package/dist/backends/index.d.ts.map +0 -1
- package/dist/backends/index.js +0 -13
- package/dist/backends/index.js.map +0 -1
- package/dist/backends/ruvector/RuVectorBackend.d.ts +0 -75
- package/dist/backends/ruvector/RuVectorBackend.d.ts.map +0 -1
- package/dist/backends/ruvector/RuVectorBackend.js +0 -198
- package/dist/backends/ruvector/RuVectorBackend.js.map +0 -1
- package/dist/backends/ruvector/RuVectorLearning.d.ts +0 -104
- package/dist/backends/ruvector/RuVectorLearning.d.ts.map +0 -1
- package/dist/backends/ruvector/RuVectorLearning.js +0 -177
- package/dist/backends/ruvector/RuVectorLearning.js.map +0 -1
- package/dist/backends/ruvector/index.d.ts +0 -9
- package/dist/backends/ruvector/index.d.ts.map +0 -1
- package/dist/backends/ruvector/index.js +0 -8
- package/dist/backends/ruvector/index.js.map +0 -1
- package/dist/benchmarks/wasm-vector-benchmark.d.ts +0 -10
- package/dist/benchmarks/wasm-vector-benchmark.d.ts.map +0 -1
- package/dist/benchmarks/wasm-vector-benchmark.js +0 -196
- package/dist/benchmarks/wasm-vector-benchmark.js.map +0 -1
- package/dist/browser/AdvancedFeatures.d.ts +0 -144
- package/dist/browser/AdvancedFeatures.d.ts.map +0 -1
- package/dist/browser/AdvancedFeatures.js +0 -430
- package/dist/browser/AdvancedFeatures.js.map +0 -1
- package/dist/browser/HNSWIndex.d.ts +0 -117
- package/dist/browser/HNSWIndex.d.ts.map +0 -1
- package/dist/browser/HNSWIndex.js +0 -402
- package/dist/browser/HNSWIndex.js.map +0 -1
- package/dist/browser/ProductQuantization.d.ts +0 -107
- package/dist/browser/ProductQuantization.d.ts.map +0 -1
- package/dist/browser/ProductQuantization.js +0 -337
- package/dist/browser/ProductQuantization.js.map +0 -1
- package/dist/browser/browser/AdvancedFeatures.d.ts +0 -144
- package/dist/browser/browser/AdvancedFeatures.d.ts.map +0 -1
- package/dist/browser/browser/AdvancedFeatures.js +0 -427
- package/dist/browser/browser/HNSWIndex.d.ts +0 -117
- package/dist/browser/browser/HNSWIndex.d.ts.map +0 -1
- package/dist/browser/browser/HNSWIndex.js +0 -402
- package/dist/browser/browser/ProductQuantization.d.ts +0 -107
- package/dist/browser/browser/ProductQuantization.d.ts.map +0 -1
- package/dist/browser/browser/ProductQuantization.js +0 -348
- package/dist/browser/browser/index.d.ts +0 -223
- package/dist/browser/browser/index.d.ts.map +0 -1
- package/dist/browser/browser/index.js +0 -233
- package/dist/browser/index.d.ts +0 -223
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -225
- package/dist/browser/index.js.map +0 -1
- package/dist/cli/agentdb-cli.d.ts +0 -154
- package/dist/cli/agentdb-cli.d.ts.map +0 -1
- package/dist/cli/agentdb-cli.js +0 -2273
- package/dist/cli/agentdb-cli.js.map +0 -1
- package/dist/cli/agentdb.db +0 -0
- package/dist/cli/commands/init.d.ts +0 -12
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -115
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/install-embeddings.d.ts +0 -10
- package/dist/cli/commands/install-embeddings.d.ts.map +0 -1
- package/dist/cli/commands/install-embeddings.js +0 -68
- package/dist/cli/commands/install-embeddings.js.map +0 -1
- package/dist/cli/commands/migrate.d.ts +0 -15
- package/dist/cli/commands/migrate.d.ts.map +0 -1
- package/dist/cli/commands/migrate.js +0 -425
- package/dist/cli/commands/migrate.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -10
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -129
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/controllers/CausalMemoryGraph.d.ts +0 -126
- package/dist/controllers/CausalMemoryGraph.d.ts.map +0 -1
- package/dist/controllers/CausalMemoryGraph.js +0 -323
- package/dist/controllers/CausalMemoryGraph.js.map +0 -1
- package/dist/controllers/CausalRecall.d.ts +0 -139
- package/dist/controllers/CausalRecall.d.ts.map +0 -1
- package/dist/controllers/CausalRecall.js +0 -356
- package/dist/controllers/CausalRecall.js.map +0 -1
- package/dist/controllers/ContextSynthesizer.d.ts +0 -65
- package/dist/controllers/ContextSynthesizer.d.ts.map +0 -1
- package/dist/controllers/ContextSynthesizer.js +0 -208
- package/dist/controllers/ContextSynthesizer.js.map +0 -1
- package/dist/controllers/EmbeddingService.d.ts +0 -37
- package/dist/controllers/EmbeddingService.d.ts.map +0 -1
- package/dist/controllers/EmbeddingService.js +0 -136
- package/dist/controllers/EmbeddingService.js.map +0 -1
- package/dist/controllers/EnhancedEmbeddingService.d.ts +0 -50
- package/dist/controllers/EnhancedEmbeddingService.d.ts.map +0 -1
- package/dist/controllers/EnhancedEmbeddingService.js +0 -119
- package/dist/controllers/EnhancedEmbeddingService.js.map +0 -1
- package/dist/controllers/ExplainableRecall.d.ts +0 -163
- package/dist/controllers/ExplainableRecall.d.ts.map +0 -1
- package/dist/controllers/ExplainableRecall.js +0 -485
- package/dist/controllers/ExplainableRecall.js.map +0 -1
- package/dist/controllers/HNSWIndex.d.ts +0 -128
- package/dist/controllers/HNSWIndex.d.ts.map +0 -1
- package/dist/controllers/HNSWIndex.js +0 -361
- package/dist/controllers/HNSWIndex.js.map +0 -1
- package/dist/controllers/LearningSystem.d.ts +0 -195
- package/dist/controllers/LearningSystem.d.ts.map +0 -1
- package/dist/controllers/LearningSystem.js +0 -929
- package/dist/controllers/LearningSystem.js.map +0 -1
- package/dist/controllers/MMRDiversityRanker.d.ts +0 -50
- package/dist/controllers/MMRDiversityRanker.d.ts.map +0 -1
- package/dist/controllers/MMRDiversityRanker.js +0 -130
- package/dist/controllers/MMRDiversityRanker.js.map +0 -1
- package/dist/controllers/MetadataFilter.d.ts +0 -70
- package/dist/controllers/MetadataFilter.d.ts.map +0 -1
- package/dist/controllers/MetadataFilter.js +0 -243
- package/dist/controllers/MetadataFilter.js.map +0 -1
- package/dist/controllers/NightlyLearner.d.ts +0 -114
- package/dist/controllers/NightlyLearner.d.ts.map +0 -1
- package/dist/controllers/NightlyLearner.js +0 -394
- package/dist/controllers/NightlyLearner.js.map +0 -1
- package/dist/controllers/QUICClient.d.ts +0 -109
- package/dist/controllers/QUICClient.d.ts.map +0 -1
- package/dist/controllers/QUICClient.js +0 -299
- package/dist/controllers/QUICClient.js.map +0 -1
- package/dist/controllers/QUICServer.d.ts +0 -121
- package/dist/controllers/QUICServer.d.ts.map +0 -1
- package/dist/controllers/QUICServer.js +0 -383
- package/dist/controllers/QUICServer.js.map +0 -1
- package/dist/controllers/ReasoningBank.d.ts +0 -196
- package/dist/controllers/ReasoningBank.d.ts.map +0 -1
- package/dist/controllers/ReasoningBank.js +0 -494
- package/dist/controllers/ReasoningBank.js.map +0 -1
- package/dist/controllers/ReflexionMemory.d.ts +0 -125
- package/dist/controllers/ReflexionMemory.d.ts.map +0 -1
- package/dist/controllers/ReflexionMemory.js +0 -521
- package/dist/controllers/ReflexionMemory.js.map +0 -1
- package/dist/controllers/SkillLibrary.d.ts +0 -149
- package/dist/controllers/SkillLibrary.d.ts.map +0 -1
- package/dist/controllers/SkillLibrary.js +0 -547
- package/dist/controllers/SkillLibrary.js.map +0 -1
- package/dist/controllers/SyncCoordinator.d.ts +0 -120
- package/dist/controllers/SyncCoordinator.d.ts.map +0 -1
- package/dist/controllers/SyncCoordinator.js +0 -441
- package/dist/controllers/SyncCoordinator.js.map +0 -1
- package/dist/controllers/WASMVectorSearch.d.ts +0 -89
- package/dist/controllers/WASMVectorSearch.d.ts.map +0 -1
- package/dist/controllers/WASMVectorSearch.js +0 -234
- package/dist/controllers/WASMVectorSearch.js.map +0 -1
- package/dist/controllers/frontier-index.d.ts +0 -14
- package/dist/controllers/frontier-index.d.ts.map +0 -1
- package/dist/controllers/frontier-index.js +0 -10
- package/dist/controllers/frontier-index.js.map +0 -1
- package/dist/controllers/index.d.ts +0 -30
- package/dist/controllers/index.d.ts.map +0 -1
- package/dist/controllers/index.js +0 -18
- package/dist/controllers/index.js.map +0 -1
- package/dist/db-fallback.d.ts +0 -26
- package/dist/db-fallback.d.ts.map +0 -1
- package/dist/db-fallback.js +0 -264
- package/dist/db-fallback.js.map +0 -1
- package/dist/db-test.d.ts +0 -13
- package/dist/db-test.d.ts.map +0 -1
- package/dist/db-test.js +0 -55
- package/dist/db-test.js.map +0 -1
- package/dist/db-unified.d.ts +0 -76
- package/dist/db-unified.d.ts.map +0 -1
- package/dist/db-unified.js +0 -278
- package/dist/db-unified.js.map +0 -1
- package/dist/examples/quic-sync-example.d.ts +0 -9
- package/dist/examples/quic-sync-example.d.ts.map +0 -1
- package/dist/examples/quic-sync-example.js +0 -169
- package/dist/examples/quic-sync-example.js.map +0 -1
- package/dist/examples/wasm-vector-usage.d.ts +0 -12
- package/dist/examples/wasm-vector-usage.d.ts.map +0 -1
- package/dist/examples/wasm-vector-usage.js +0 -190
- package/dist/examples/wasm-vector-usage.js.map +0 -1
- package/dist/index.d.ts +0 -28
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -35
- package/dist/index.js.map +0 -1
- package/dist/malp/core/ccc.d.ts +0 -99
- package/dist/malp/core/ccc.d.ts.map +0 -1
- package/dist/malp/core/ccc.js +0 -181
- package/dist/malp/core/ccc.js.map +0 -1
- package/dist/malp/core/index.d.ts +0 -9
- package/dist/malp/core/index.d.ts.map +0 -1
- package/dist/malp/core/index.js +0 -9
- package/dist/malp/core/index.js.map +0 -1
- package/dist/malp/core/linalg.d.ts +0 -101
- package/dist/malp/core/linalg.d.ts.map +0 -1
- package/dist/malp/core/linalg.js +0 -278
- package/dist/malp/core/linalg.js.map +0 -1
- package/dist/malp/core/optimizer.d.ts +0 -68
- package/dist/malp/core/optimizer.d.ts.map +0 -1
- package/dist/malp/core/optimizer.js +0 -160
- package/dist/malp/core/optimizer.js.map +0 -1
- package/dist/malp/index.d.ts +0 -33
- package/dist/malp/index.d.ts.map +0 -1
- package/dist/malp/index.js +0 -37
- package/dist/malp/index.js.map +0 -1
- package/dist/malp/metrics/agreement.d.ts +0 -106
- package/dist/malp/metrics/agreement.d.ts.map +0 -1
- package/dist/malp/metrics/agreement.js +0 -199
- package/dist/malp/metrics/agreement.js.map +0 -1
- package/dist/malp/metrics/comparison.d.ts +0 -93
- package/dist/malp/metrics/comparison.d.ts.map +0 -1
- package/dist/malp/metrics/comparison.js +0 -256
- package/dist/malp/metrics/comparison.js.map +0 -1
- package/dist/malp/metrics/index.d.ts +0 -8
- package/dist/malp/metrics/index.d.ts.map +0 -1
- package/dist/malp/metrics/index.js +0 -8
- package/dist/malp/metrics/index.js.map +0 -1
- package/dist/malp/metrics/performance.d.ts +0 -61
- package/dist/malp/metrics/performance.d.ts.map +0 -1
- package/dist/malp/metrics/performance.js +0 -190
- package/dist/malp/metrics/performance.js.map +0 -1
- package/dist/malp/models/index.d.ts +0 -7
- package/dist/malp/models/index.d.ts.map +0 -1
- package/dist/malp/models/index.js +0 -7
- package/dist/malp/models/index.js.map +0 -1
- package/dist/malp/models/malp.d.ts +0 -116
- package/dist/malp/models/malp.d.ts.map +0 -1
- package/dist/malp/models/malp.js +0 -206
- package/dist/malp/models/malp.js.map +0 -1
- package/dist/malp/models/regressor.d.ts +0 -80
- package/dist/malp/models/regressor.d.ts.map +0 -1
- package/dist/malp/models/regressor.js +0 -229
- package/dist/malp/models/regressor.js.map +0 -1
- package/dist/malp/reasoningbank_validator.d.ts +0 -187
- package/dist/malp/reasoningbank_validator.d.ts.map +0 -1
- package/dist/malp/reasoningbank_validator.js +0 -246
- package/dist/malp/reasoningbank_validator.js.map +0 -1
- package/dist/malp/wasm_bindings.d.ts +0 -344
- package/dist/malp/wasm_bindings.d.ts.map +0 -1
- package/dist/malp/wasm_bindings.js +0 -9
- package/dist/malp/wasm_bindings.js.map +0 -1
- package/dist/mcp/agentdb-mcp-server.d.ts +0 -8
- package/dist/mcp/agentdb-mcp-server.d.ts.map +0 -1
- package/dist/mcp/agentdb-mcp-server.js +0 -2116
- package/dist/mcp/agentdb-mcp-server.js.map +0 -1
- package/dist/mcp/learning-tools-handlers.d.ts +0 -16
- package/dist/mcp/learning-tools-handlers.d.ts.map +0 -1
- package/dist/mcp/learning-tools-handlers.js +0 -105
- package/dist/mcp/learning-tools-handlers.js.map +0 -1
- package/dist/optimizations/BatchOperations.d.ts +0 -109
- package/dist/optimizations/BatchOperations.d.ts.map +0 -1
- package/dist/optimizations/BatchOperations.js +0 -407
- package/dist/optimizations/BatchOperations.js.map +0 -1
- package/dist/optimizations/QueryOptimizer.d.ts +0 -83
- package/dist/optimizations/QueryOptimizer.d.ts.map +0 -1
- package/dist/optimizations/QueryOptimizer.js +0 -228
- package/dist/optimizations/QueryOptimizer.js.map +0 -1
- package/dist/optimizations/ToolCache.d.ts +0 -137
- package/dist/optimizations/ToolCache.d.ts.map +0 -1
- package/dist/optimizations/ToolCache.js +0 -281
- package/dist/optimizations/ToolCache.js.map +0 -1
- package/dist/optimizations/index.d.ts +0 -10
- package/dist/optimizations/index.d.ts.map +0 -1
- package/dist/optimizations/index.js +0 -8
- package/dist/optimizations/index.js.map +0 -1
- package/dist/security/input-validation.d.ts +0 -109
- package/dist/security/input-validation.d.ts.map +0 -1
- package/dist/security/input-validation.js +0 -398
- package/dist/security/input-validation.js.map +0 -1
- package/dist/security/limits.d.ts +0 -150
- package/dist/security/limits.d.ts.map +0 -1
- package/dist/security/limits.js +0 -288
- package/dist/security/limits.js.map +0 -1
- package/dist/security/path-security.d.ts +0 -100
- package/dist/security/path-security.d.ts.map +0 -1
- package/dist/security/path-security.js +0 -337
- package/dist/security/path-security.js.map +0 -1
- package/dist/security/validation.d.ts +0 -95
- package/dist/security/validation.d.ts.map +0 -1
- package/dist/security/validation.js +0 -315
- package/dist/security/validation.js.map +0 -1
- package/dist/types/quic.d.ts +0 -518
- package/dist/types/quic.d.ts.map +0 -1
- package/dist/types/quic.js +0 -272
- package/dist/types/quic.js.map +0 -1
|
@@ -1,485 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ExplainableRecall - Provenance and Justification for Memory Retrieval
|
|
3
|
-
*
|
|
4
|
-
* Every retrieval returns:
|
|
5
|
-
* - Minimal hitting set of facts that justify the answer
|
|
6
|
-
* - Merkle proof chain for provenance
|
|
7
|
-
* - Policy compliance certificates
|
|
8
|
-
*
|
|
9
|
-
* Based on:
|
|
10
|
-
* - Minimal hitting set algorithms
|
|
11
|
-
* - Merkle tree provenance
|
|
12
|
-
* - Explainable AI techniques
|
|
13
|
-
*/
|
|
14
|
-
import * as crypto from 'crypto';
|
|
15
|
-
export class ExplainableRecall {
|
|
16
|
-
db;
|
|
17
|
-
constructor(db) {
|
|
18
|
-
this.db = db;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Create a recall certificate for a retrieval operation
|
|
22
|
-
*/
|
|
23
|
-
createCertificate(params) {
|
|
24
|
-
const { queryId, queryText, chunks, requirements, accessLevel = 'internal' } = params;
|
|
25
|
-
const startTime = Date.now();
|
|
26
|
-
// 1. Compute minimal hitting set
|
|
27
|
-
const minimalWhy = this.computeMinimalHittingSet(chunks, requirements);
|
|
28
|
-
// 2. Calculate metrics
|
|
29
|
-
const redundancyRatio = chunks.length / minimalWhy.length;
|
|
30
|
-
const completenessScore = this.calculateCompleteness(minimalWhy, requirements);
|
|
31
|
-
// 3. Build provenance chain
|
|
32
|
-
const sourceHashes = chunks.map(chunk => this.getOrCreateProvenance(chunk.type, parseInt(chunk.id)));
|
|
33
|
-
const merkleTree = this.buildMerkleTree(sourceHashes);
|
|
34
|
-
const merkleRoot = merkleTree.root;
|
|
35
|
-
// 4. Generate chunk metadata first (needed for certificate ID)
|
|
36
|
-
const chunkIds = chunks.map(c => c.id);
|
|
37
|
-
const chunkTypes = chunks.map(c => c.type);
|
|
38
|
-
// 5. Create certificate ID
|
|
39
|
-
const certificateId = this.generateCertificateId(queryId, chunkIds);
|
|
40
|
-
// 6. Generate proof chain for each chunk
|
|
41
|
-
const proofChain = chunks.map((chunk, idx) => this.getMerkleProof(merkleTree, idx)).flat();
|
|
42
|
-
// 7. Store certificate
|
|
43
|
-
this.db.prepare(`
|
|
44
|
-
INSERT INTO recall_certificates (
|
|
45
|
-
id, query_id, query_text, chunk_ids, chunk_types,
|
|
46
|
-
minimal_why, redundancy_ratio, completeness_score,
|
|
47
|
-
merkle_root, source_hashes, proof_chain,
|
|
48
|
-
access_level, latency_ms
|
|
49
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
50
|
-
`).run(certificateId, queryId, queryText, JSON.stringify(chunkIds), JSON.stringify(chunkTypes), JSON.stringify(minimalWhy), redundancyRatio, completenessScore, merkleRoot, JSON.stringify(sourceHashes), JSON.stringify(proofChain), accessLevel, Date.now() - startTime);
|
|
51
|
-
// 7. Store justification paths
|
|
52
|
-
this.storeJustificationPaths(certificateId, chunks, minimalWhy, requirements);
|
|
53
|
-
const certificate = {
|
|
54
|
-
id: certificateId,
|
|
55
|
-
queryId,
|
|
56
|
-
queryText,
|
|
57
|
-
chunkIds,
|
|
58
|
-
chunkTypes,
|
|
59
|
-
minimalWhy,
|
|
60
|
-
redundancyRatio,
|
|
61
|
-
completenessScore,
|
|
62
|
-
merkleRoot,
|
|
63
|
-
sourceHashes,
|
|
64
|
-
proofChain,
|
|
65
|
-
accessLevel: accessLevel,
|
|
66
|
-
latencyMs: Date.now() - startTime
|
|
67
|
-
};
|
|
68
|
-
return certificate;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Verify a recall certificate
|
|
72
|
-
*/
|
|
73
|
-
verifyCertificate(certificateId) {
|
|
74
|
-
const cert = this.db.prepare('SELECT * FROM recall_certificates WHERE id = ?').get(certificateId);
|
|
75
|
-
if (!cert) {
|
|
76
|
-
return { valid: false, issues: ['Certificate not found'] };
|
|
77
|
-
}
|
|
78
|
-
const issues = [];
|
|
79
|
-
// 1. Verify Merkle root
|
|
80
|
-
const sourceHashes = JSON.parse(cert.source_hashes);
|
|
81
|
-
const merkleTree = this.buildMerkleTree(sourceHashes);
|
|
82
|
-
if (merkleTree.root !== cert.merkle_root) {
|
|
83
|
-
issues.push('Merkle root mismatch');
|
|
84
|
-
}
|
|
85
|
-
// 2. Verify chunk hashes still match
|
|
86
|
-
const chunkIds = JSON.parse(cert.chunk_ids);
|
|
87
|
-
const chunkTypes = JSON.parse(cert.chunk_types);
|
|
88
|
-
for (let i = 0; i < chunkIds.length; i++) {
|
|
89
|
-
const currentHash = this.getContentHash(chunkTypes[i], parseInt(chunkIds[i]));
|
|
90
|
-
if (currentHash !== sourceHashes[i]) {
|
|
91
|
-
issues.push(`Chunk ${chunkIds[i]} hash changed`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// 3. Verify completeness
|
|
95
|
-
const minimalWhy = JSON.parse(cert.minimal_why);
|
|
96
|
-
if (minimalWhy.length === 0) {
|
|
97
|
-
issues.push('Empty justification set');
|
|
98
|
-
}
|
|
99
|
-
// 4. Verify redundancy ratio
|
|
100
|
-
if (cert.redundancy_ratio < 1.0) {
|
|
101
|
-
issues.push('Invalid redundancy ratio');
|
|
102
|
-
}
|
|
103
|
-
return {
|
|
104
|
-
valid: issues.length === 0,
|
|
105
|
-
issues
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Get justification for why a chunk was included
|
|
110
|
-
*/
|
|
111
|
-
getJustification(certificateId, chunkId) {
|
|
112
|
-
const row = this.db.prepare(`
|
|
113
|
-
SELECT * FROM justification_paths
|
|
114
|
-
WHERE certificate_id = ? AND chunk_id = ?
|
|
115
|
-
`).get(certificateId, chunkId);
|
|
116
|
-
if (!row)
|
|
117
|
-
return null;
|
|
118
|
-
return {
|
|
119
|
-
chunkId: row.chunk_id,
|
|
120
|
-
chunkType: row.chunk_type,
|
|
121
|
-
reason: row.reason,
|
|
122
|
-
necessityScore: row.necessity_score,
|
|
123
|
-
pathElements: JSON.parse(row.path_elements)
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Get provenance lineage for a source
|
|
128
|
-
*/
|
|
129
|
-
getProvenanceLineage(contentHash) {
|
|
130
|
-
const lineage = [];
|
|
131
|
-
let currentHash = contentHash;
|
|
132
|
-
while (currentHash) {
|
|
133
|
-
const source = this.db.prepare(`
|
|
134
|
-
SELECT * FROM provenance_sources WHERE content_hash = ?
|
|
135
|
-
`).get(currentHash);
|
|
136
|
-
if (!source)
|
|
137
|
-
break;
|
|
138
|
-
lineage.push({
|
|
139
|
-
id: source.id,
|
|
140
|
-
sourceType: source.source_type,
|
|
141
|
-
sourceId: source.source_id,
|
|
142
|
-
contentHash: source.content_hash,
|
|
143
|
-
parentHash: source.parent_hash,
|
|
144
|
-
derivedFrom: source.derived_from ? JSON.parse(source.derived_from) : undefined,
|
|
145
|
-
creator: source.creator,
|
|
146
|
-
metadata: source.metadata ? JSON.parse(source.metadata) : undefined
|
|
147
|
-
});
|
|
148
|
-
currentHash = source.parent_hash;
|
|
149
|
-
}
|
|
150
|
-
return lineage;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Trace provenance lineage for a certificate
|
|
154
|
-
* Returns full provenance chain from certificate to original sources
|
|
155
|
-
*/
|
|
156
|
-
traceProvenance(certificateId) {
|
|
157
|
-
const certRow = this.db.prepare('SELECT * FROM recall_certificates WHERE id = ?').get(certificateId);
|
|
158
|
-
if (!certRow) {
|
|
159
|
-
throw new Error(`Certificate ${certificateId} not found`);
|
|
160
|
-
}
|
|
161
|
-
const certificate = {
|
|
162
|
-
id: certRow.id,
|
|
163
|
-
queryId: certRow.query_id,
|
|
164
|
-
queryText: certRow.query_text,
|
|
165
|
-
chunkIds: JSON.parse(certRow.chunk_ids),
|
|
166
|
-
chunkTypes: JSON.parse(certRow.chunk_types),
|
|
167
|
-
minimalWhy: JSON.parse(certRow.minimal_why),
|
|
168
|
-
redundancyRatio: certRow.redundancy_ratio,
|
|
169
|
-
completenessScore: certRow.completeness_score,
|
|
170
|
-
merkleRoot: certRow.merkle_root,
|
|
171
|
-
sourceHashes: JSON.parse(certRow.source_hashes),
|
|
172
|
-
proofChain: JSON.parse(certRow.proof_chain),
|
|
173
|
-
policyProof: certRow.policy_proof,
|
|
174
|
-
policyVersion: certRow.policy_version,
|
|
175
|
-
accessLevel: certRow.access_level,
|
|
176
|
-
latencyMs: certRow.latency_ms
|
|
177
|
-
};
|
|
178
|
-
// Build provenance map for all sources
|
|
179
|
-
const sources = new Map();
|
|
180
|
-
for (const hash of certificate.sourceHashes) {
|
|
181
|
-
sources.set(hash, this.getProvenanceLineage(hash));
|
|
182
|
-
}
|
|
183
|
-
// Build provenance graph
|
|
184
|
-
const nodes = [];
|
|
185
|
-
const edges = [];
|
|
186
|
-
// Add certificate node
|
|
187
|
-
nodes.push({
|
|
188
|
-
id: certificateId,
|
|
189
|
-
type: 'certificate',
|
|
190
|
-
label: `Certificate: ${certificate.queryText.substring(0, 30)}...`
|
|
191
|
-
});
|
|
192
|
-
// Add source nodes and edges
|
|
193
|
-
for (const [hash, lineage] of sources.entries()) {
|
|
194
|
-
for (let i = 0; i < lineage.length; i++) {
|
|
195
|
-
const source = lineage[i];
|
|
196
|
-
const nodeId = `${source.sourceType}-${source.sourceId}`;
|
|
197
|
-
// Add node if not exists
|
|
198
|
-
if (!nodes.find(n => n.id === nodeId)) {
|
|
199
|
-
nodes.push({
|
|
200
|
-
id: nodeId,
|
|
201
|
-
type: source.sourceType,
|
|
202
|
-
label: `${source.sourceType} #${source.sourceId}`
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
// Add edge from certificate to first source
|
|
206
|
-
if (i === 0) {
|
|
207
|
-
edges.push({
|
|
208
|
-
from: certificateId,
|
|
209
|
-
to: nodeId,
|
|
210
|
-
type: 'includes'
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
// Add edge to parent if exists
|
|
214
|
-
if (i < lineage.length - 1) {
|
|
215
|
-
const parentNodeId = `${lineage[i + 1].sourceType}-${lineage[i + 1].sourceId}`;
|
|
216
|
-
edges.push({
|
|
217
|
-
from: nodeId,
|
|
218
|
-
to: parentNodeId,
|
|
219
|
-
type: 'derived_from'
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return {
|
|
225
|
-
certificate,
|
|
226
|
-
sources,
|
|
227
|
-
graph: { nodes, edges }
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Audit certificate access
|
|
232
|
-
*/
|
|
233
|
-
auditCertificate(certificateId) {
|
|
234
|
-
const certRow = this.db.prepare('SELECT * FROM recall_certificates WHERE id = ?').get(certificateId);
|
|
235
|
-
if (!certRow) {
|
|
236
|
-
throw new Error(`Certificate ${certificateId} not found`);
|
|
237
|
-
}
|
|
238
|
-
const certificate = {
|
|
239
|
-
id: certRow.id,
|
|
240
|
-
queryId: certRow.query_id,
|
|
241
|
-
queryText: certRow.query_text,
|
|
242
|
-
chunkIds: JSON.parse(certRow.chunk_ids),
|
|
243
|
-
chunkTypes: JSON.parse(certRow.chunk_types),
|
|
244
|
-
minimalWhy: JSON.parse(certRow.minimal_why),
|
|
245
|
-
redundancyRatio: certRow.redundancy_ratio,
|
|
246
|
-
completenessScore: certRow.completeness_score,
|
|
247
|
-
merkleRoot: certRow.merkle_root,
|
|
248
|
-
sourceHashes: JSON.parse(certRow.source_hashes),
|
|
249
|
-
proofChain: JSON.parse(certRow.proof_chain),
|
|
250
|
-
policyProof: certRow.policy_proof,
|
|
251
|
-
policyVersion: certRow.policy_version,
|
|
252
|
-
accessLevel: certRow.access_level,
|
|
253
|
-
latencyMs: certRow.latency_ms
|
|
254
|
-
};
|
|
255
|
-
// Get justifications
|
|
256
|
-
const justRows = this.db.prepare(`
|
|
257
|
-
SELECT * FROM justification_paths WHERE certificate_id = ?
|
|
258
|
-
`).all(certificateId);
|
|
259
|
-
const justifications = justRows.map(row => ({
|
|
260
|
-
chunkId: row.chunk_id,
|
|
261
|
-
chunkType: row.chunk_type,
|
|
262
|
-
reason: row.reason,
|
|
263
|
-
necessityScore: row.necessity_score,
|
|
264
|
-
pathElements: JSON.parse(row.path_elements)
|
|
265
|
-
}));
|
|
266
|
-
// Get provenance for each source
|
|
267
|
-
const provenance = new Map();
|
|
268
|
-
for (const hash of certificate.sourceHashes) {
|
|
269
|
-
provenance.set(hash, this.getProvenanceLineage(hash));
|
|
270
|
-
}
|
|
271
|
-
// Calculate quality metrics
|
|
272
|
-
const avgNecessity = justifications.reduce((sum, j) => sum + j.necessityScore, 0) / justifications.length;
|
|
273
|
-
return {
|
|
274
|
-
certificate,
|
|
275
|
-
justifications,
|
|
276
|
-
provenance,
|
|
277
|
-
quality: {
|
|
278
|
-
completeness: certificate.completenessScore,
|
|
279
|
-
redundancy: certificate.redundancyRatio,
|
|
280
|
-
avgNecessity
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
// ========================================================================
|
|
285
|
-
// Private Helper Methods
|
|
286
|
-
// ========================================================================
|
|
287
|
-
/**
|
|
288
|
-
* Compute minimal hitting set using greedy algorithm
|
|
289
|
-
* A hitting set contains at least one element from each requirement
|
|
290
|
-
*/
|
|
291
|
-
computeMinimalHittingSet(chunks, requirements) {
|
|
292
|
-
if (requirements.length === 0) {
|
|
293
|
-
return chunks.slice(0, Math.min(3, chunks.length)).map(c => c.id);
|
|
294
|
-
}
|
|
295
|
-
const uncovered = new Set(requirements);
|
|
296
|
-
const selected = [];
|
|
297
|
-
// Greedy: select chunk that covers most uncovered requirements
|
|
298
|
-
while (uncovered.size > 0 && chunks.length > 0) {
|
|
299
|
-
let bestChunk = null;
|
|
300
|
-
let bestCoverage = 0;
|
|
301
|
-
for (const chunk of chunks) {
|
|
302
|
-
const coverage = Array.from(uncovered).filter(req => chunk.content.toLowerCase().includes(req.toLowerCase())).length;
|
|
303
|
-
if (coverage > bestCoverage) {
|
|
304
|
-
bestCoverage = coverage;
|
|
305
|
-
bestChunk = chunk;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
if (!bestChunk)
|
|
309
|
-
break;
|
|
310
|
-
selected.push(bestChunk.id);
|
|
311
|
-
// Remove covered requirements
|
|
312
|
-
for (const req of Array.from(uncovered)) {
|
|
313
|
-
if (bestChunk.content.toLowerCase().includes(req.toLowerCase())) {
|
|
314
|
-
uncovered.delete(req);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
// Remove selected chunk
|
|
318
|
-
chunks = chunks.filter(c => c.id !== bestChunk.id);
|
|
319
|
-
}
|
|
320
|
-
return selected;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Calculate completeness score
|
|
324
|
-
*/
|
|
325
|
-
calculateCompleteness(minimalWhy, requirements) {
|
|
326
|
-
if (requirements.length === 0)
|
|
327
|
-
return 1.0;
|
|
328
|
-
// Prepare statement ONCE outside loop (better-sqlite3 best practice)
|
|
329
|
-
const stmt = this.db.prepare('SELECT output FROM episodes WHERE id = ?');
|
|
330
|
-
const chunks = minimalWhy.map(id => {
|
|
331
|
-
// Get chunk content
|
|
332
|
-
const episode = stmt.get(parseInt(id));
|
|
333
|
-
return episode ? episode.output : '';
|
|
334
|
-
});
|
|
335
|
-
const satisfied = requirements.filter(req => chunks.some(content => content && content.toLowerCase().includes(req.toLowerCase())));
|
|
336
|
-
return satisfied.length / requirements.length;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Get or create provenance record
|
|
340
|
-
*/
|
|
341
|
-
getOrCreateProvenance(sourceType, sourceId) {
|
|
342
|
-
// Check if provenance exists
|
|
343
|
-
const existing = this.db.prepare(`
|
|
344
|
-
SELECT content_hash FROM provenance_sources
|
|
345
|
-
WHERE source_type = ? AND source_id = ?
|
|
346
|
-
`).get(sourceType, sourceId);
|
|
347
|
-
if (existing) {
|
|
348
|
-
return existing.content_hash;
|
|
349
|
-
}
|
|
350
|
-
// Create new provenance
|
|
351
|
-
const contentHash = this.getContentHash(sourceType, sourceId);
|
|
352
|
-
this.db.prepare(`
|
|
353
|
-
INSERT OR IGNORE INTO provenance_sources (source_type, source_id, content_hash, creator)
|
|
354
|
-
VALUES (?, ?, ?, ?)
|
|
355
|
-
`).run(sourceType, sourceId, contentHash, 'system');
|
|
356
|
-
return contentHash;
|
|
357
|
-
}
|
|
358
|
-
// Prepare statement ONCE outside loop (better-sqlite3 best practice)
|
|
359
|
-
_episodeStmt;
|
|
360
|
-
_skillStmt;
|
|
361
|
-
_noteStmt;
|
|
362
|
-
_factStmt;
|
|
363
|
-
/**
|
|
364
|
-
* Get content hash for a memory
|
|
365
|
-
*/
|
|
366
|
-
getContentHash(sourceType, sourceId) {
|
|
367
|
-
let content = '';
|
|
368
|
-
switch (sourceType) {
|
|
369
|
-
case 'episode':
|
|
370
|
-
if (!this._episodeStmt) {
|
|
371
|
-
this._episodeStmt = this.db.prepare('SELECT task, output FROM episodes WHERE id = ?');
|
|
372
|
-
}
|
|
373
|
-
const episode = this._episodeStmt.get(sourceId);
|
|
374
|
-
content = episode ? `${episode.task}:${episode.output}` : '';
|
|
375
|
-
break;
|
|
376
|
-
case 'skill':
|
|
377
|
-
if (!this._skillStmt) {
|
|
378
|
-
this._skillStmt = this.db.prepare('SELECT name, code FROM skills WHERE id = ?');
|
|
379
|
-
}
|
|
380
|
-
const skill = this._skillStmt.get(sourceId);
|
|
381
|
-
content = skill ? `${skill.name}:${skill.code}` : '';
|
|
382
|
-
break;
|
|
383
|
-
case 'note':
|
|
384
|
-
if (!this._noteStmt) {
|
|
385
|
-
this._noteStmt = this.db.prepare('SELECT text FROM notes WHERE id = ?');
|
|
386
|
-
}
|
|
387
|
-
const note = this._noteStmt.get(sourceId);
|
|
388
|
-
content = note ? note.text : '';
|
|
389
|
-
break;
|
|
390
|
-
case 'fact':
|
|
391
|
-
if (!this._factStmt) {
|
|
392
|
-
this._factStmt = this.db.prepare('SELECT subject, predicate, object FROM facts WHERE id = ?');
|
|
393
|
-
}
|
|
394
|
-
const fact = this._factStmt.get(sourceId);
|
|
395
|
-
content = fact ? `${fact.subject}:${fact.predicate}:${fact.object}` : '';
|
|
396
|
-
break;
|
|
397
|
-
}
|
|
398
|
-
return crypto.createHash('sha256').update(content).digest('hex');
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* Build Merkle tree from hashes
|
|
402
|
-
*/
|
|
403
|
-
buildMerkleTree(hashes) {
|
|
404
|
-
if (hashes.length === 0) {
|
|
405
|
-
return { root: '', tree: [[]] };
|
|
406
|
-
}
|
|
407
|
-
const tree = [hashes];
|
|
408
|
-
while (tree[tree.length - 1].length > 1) {
|
|
409
|
-
const level = tree[tree.length - 1];
|
|
410
|
-
const nextLevel = [];
|
|
411
|
-
for (let i = 0; i < level.length; i += 2) {
|
|
412
|
-
if (i + 1 < level.length) {
|
|
413
|
-
const combined = level[i] + level[i + 1];
|
|
414
|
-
nextLevel.push(crypto.createHash('sha256').update(combined).digest('hex'));
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
nextLevel.push(level[i]);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
tree.push(nextLevel);
|
|
421
|
-
}
|
|
422
|
-
return { root: tree[tree.length - 1][0], tree };
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Get Merkle proof for a leaf
|
|
426
|
-
*/
|
|
427
|
-
getMerkleProof(merkleTree, leafIndex) {
|
|
428
|
-
const proof = [];
|
|
429
|
-
let index = leafIndex;
|
|
430
|
-
for (let level = 0; level < merkleTree.tree.length - 1; level++) {
|
|
431
|
-
const currentLevel = merkleTree.tree[level];
|
|
432
|
-
const isLeftNode = index % 2 === 0;
|
|
433
|
-
const siblingIndex = isLeftNode ? index + 1 : index - 1;
|
|
434
|
-
if (siblingIndex < currentLevel.length) {
|
|
435
|
-
proof.push({
|
|
436
|
-
hash: currentLevel[siblingIndex],
|
|
437
|
-
position: isLeftNode ? 'right' : 'left'
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
index = Math.floor(index / 2);
|
|
441
|
-
}
|
|
442
|
-
return proof;
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Generate certificate ID
|
|
446
|
-
*/
|
|
447
|
-
generateCertificateId(queryId, chunkIds) {
|
|
448
|
-
const data = `${queryId}:${chunkIds.join(',')}:${Date.now()}`;
|
|
449
|
-
return crypto.createHash('sha256').update(data).digest('hex');
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* Store justification paths
|
|
453
|
-
*/
|
|
454
|
-
storeJustificationPaths(certificateId, chunks, minimalWhy, requirements) {
|
|
455
|
-
const stmt = this.db.prepare(`
|
|
456
|
-
INSERT INTO justification_paths (
|
|
457
|
-
certificate_id, chunk_id, chunk_type, reason, necessity_score, path_elements
|
|
458
|
-
) VALUES (?, ?, ?, ?, ?, ?)
|
|
459
|
-
`);
|
|
460
|
-
for (const chunk of chunks) {
|
|
461
|
-
const isNecessary = minimalWhy.includes(chunk.id);
|
|
462
|
-
const reason = this.determineReason(chunk, requirements);
|
|
463
|
-
const necessityScore = isNecessary ? chunk.relevance : chunk.relevance * 0.5;
|
|
464
|
-
const pathElements = [
|
|
465
|
-
`Retrieved for query`,
|
|
466
|
-
isNecessary ? `Essential for justification` : `Supporting evidence`,
|
|
467
|
-
`Relevance: ${(chunk.relevance * 100).toFixed(1)}%`
|
|
468
|
-
];
|
|
469
|
-
stmt.run(certificateId, chunk.id, chunk.type, reason, necessityScore, JSON.stringify(pathElements));
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Determine reason for inclusion
|
|
474
|
-
*/
|
|
475
|
-
determineReason(chunk, requirements) {
|
|
476
|
-
if (chunk.relevance > 0.9)
|
|
477
|
-
return 'semantic_match';
|
|
478
|
-
if (chunk.relevance > 0.7)
|
|
479
|
-
return 'causal_link';
|
|
480
|
-
if (chunk.relevance > 0.5)
|
|
481
|
-
return 'prerequisite';
|
|
482
|
-
return 'constraint';
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
//# sourceMappingURL=ExplainableRecall.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExplainableRecall.js","sourceRoot":"","sources":["../../src/controllers/ExplainableRecall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HNSWIndex - Hierarchical Navigable Small World Index
|
|
3
|
-
*
|
|
4
|
-
* High-performance approximate nearest neighbor (ANN) search using HNSW algorithm.
|
|
5
|
-
* Provides 10-100x speedup over brute-force search for large vector datasets.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - HNSW indexing for sub-millisecond search
|
|
9
|
-
* - Automatic index building and management
|
|
10
|
-
* - Configurable M and efConstruction parameters
|
|
11
|
-
* - Persistent index storage
|
|
12
|
-
* - Graceful fallback to brute-force
|
|
13
|
-
* - Multi-distance metric support (cosine, euclidean, ip)
|
|
14
|
-
*/
|
|
15
|
-
type Database = any;
|
|
16
|
-
export interface HNSWConfig {
|
|
17
|
-
/** Maximum number of connections per layer (default: 16) */
|
|
18
|
-
M: number;
|
|
19
|
-
/** Size of dynamic candidate list during construction (default: 200) */
|
|
20
|
-
efConstruction: number;
|
|
21
|
-
/** Size of dynamic candidate list during search (default: 100) */
|
|
22
|
-
efSearch: number;
|
|
23
|
-
/** Distance metric: 'cosine', 'euclidean', 'ip' (inner product) */
|
|
24
|
-
metric: 'cosine' | 'l2' | 'ip';
|
|
25
|
-
/** Vector dimension */
|
|
26
|
-
dimension: number;
|
|
27
|
-
/** Maximum number of elements in index */
|
|
28
|
-
maxElements: number;
|
|
29
|
-
/** Enable persistent index storage */
|
|
30
|
-
persistIndex: boolean;
|
|
31
|
-
/** Path to store index file */
|
|
32
|
-
indexPath?: string;
|
|
33
|
-
/** Rebuild index threshold (rebuild when updates exceed this percentage) */
|
|
34
|
-
rebuildThreshold: number;
|
|
35
|
-
}
|
|
36
|
-
export interface HNSWSearchResult {
|
|
37
|
-
id: number;
|
|
38
|
-
distance: number;
|
|
39
|
-
similarity: number;
|
|
40
|
-
metadata?: any;
|
|
41
|
-
}
|
|
42
|
-
export interface HNSWStats {
|
|
43
|
-
enabled: boolean;
|
|
44
|
-
indexBuilt: boolean;
|
|
45
|
-
numElements: number;
|
|
46
|
-
dimension: number;
|
|
47
|
-
metric: string;
|
|
48
|
-
M: number;
|
|
49
|
-
efConstruction: number;
|
|
50
|
-
efSearch: number;
|
|
51
|
-
lastBuildTime: number | null;
|
|
52
|
-
lastSearchTime: number | null;
|
|
53
|
-
totalSearches: number;
|
|
54
|
-
avgSearchTimeMs: number;
|
|
55
|
-
}
|
|
56
|
-
export declare class HNSWIndex {
|
|
57
|
-
private db;
|
|
58
|
-
private config;
|
|
59
|
-
private index;
|
|
60
|
-
private vectorCache;
|
|
61
|
-
private idToLabel;
|
|
62
|
-
private labelToId;
|
|
63
|
-
private nextLabel;
|
|
64
|
-
private indexBuilt;
|
|
65
|
-
private updatesSinceLastBuild;
|
|
66
|
-
private totalSearches;
|
|
67
|
-
private totalSearchTime;
|
|
68
|
-
private lastBuildTime;
|
|
69
|
-
private lastSearchTime;
|
|
70
|
-
constructor(db: Database, config?: Partial<HNSWConfig>);
|
|
71
|
-
/**
|
|
72
|
-
* Build HNSW index from database vectors
|
|
73
|
-
*/
|
|
74
|
-
buildIndex(tableName?: string): Promise<void>;
|
|
75
|
-
/**
|
|
76
|
-
* Search HNSW index for k-nearest neighbors
|
|
77
|
-
*/
|
|
78
|
-
search(query: Float32Array, k: number, options?: {
|
|
79
|
-
threshold?: number;
|
|
80
|
-
filters?: Record<string, any>;
|
|
81
|
-
}): Promise<HNSWSearchResult[]>;
|
|
82
|
-
/**
|
|
83
|
-
* Add a single vector to the index
|
|
84
|
-
*/
|
|
85
|
-
addVector(id: number, embedding: Float32Array): void;
|
|
86
|
-
/**
|
|
87
|
-
* Remove a vector from the index
|
|
88
|
-
*/
|
|
89
|
-
removeVector(id: number): void;
|
|
90
|
-
/**
|
|
91
|
-
* Check if index needs rebuilding
|
|
92
|
-
*/
|
|
93
|
-
needsRebuild(): boolean;
|
|
94
|
-
/**
|
|
95
|
-
* Save index to disk
|
|
96
|
-
*/
|
|
97
|
-
private saveIndex;
|
|
98
|
-
/**
|
|
99
|
-
* Load index from disk
|
|
100
|
-
*/
|
|
101
|
-
private loadIndex;
|
|
102
|
-
/**
|
|
103
|
-
* Convert distance to similarity based on metric
|
|
104
|
-
*/
|
|
105
|
-
private distanceToSimilarity;
|
|
106
|
-
/**
|
|
107
|
-
* Apply post-filtering to search results
|
|
108
|
-
*/
|
|
109
|
-
private applyFilters;
|
|
110
|
-
/**
|
|
111
|
-
* Get index statistics
|
|
112
|
-
*/
|
|
113
|
-
getStats(): HNSWStats;
|
|
114
|
-
/**
|
|
115
|
-
* Update efSearch parameter for search quality/speed tradeoff
|
|
116
|
-
*/
|
|
117
|
-
setEfSearch(ef: number): void;
|
|
118
|
-
/**
|
|
119
|
-
* Clear index and free memory
|
|
120
|
-
*/
|
|
121
|
-
clear(): void;
|
|
122
|
-
/**
|
|
123
|
-
* Check if index is built and ready
|
|
124
|
-
*/
|
|
125
|
-
isReady(): boolean;
|
|
126
|
-
}
|
|
127
|
-
export {};
|
|
128
|
-
//# sourceMappingURL=HNSWIndex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HNSWIndex.d.ts","sourceRoot":"","sources":["../../src/controllers/HNSWIndex.ts"],"names":[],"mappings":"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"}
|