@danielsimonjr/memoryjs 1.0.0 → 1.2.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 +385 -113
- package/README.md.backup-1768084780988 +266 -0
- package/dist/index.cjs +24156 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16967 -0
- package/dist/index.d.ts +16963 -11
- package/dist/index.js +23887 -19
- package/dist/index.js.map +1 -1
- package/dist/workers/levenshteinWorker.cjs +102 -0
- package/dist/workers/levenshteinWorker.cjs.map +1 -0
- package/dist/workers/levenshteinWorker.js +57 -91
- package/dist/workers/levenshteinWorker.js.map +1 -1
- package/package.json +75 -69
- package/dist/core/EntityManager.d.ts +0 -268
- package/dist/core/EntityManager.d.ts.map +0 -1
- package/dist/core/EntityManager.js +0 -512
- package/dist/core/EntityManager.js.map +0 -1
- package/dist/core/GraphEventEmitter.d.ts +0 -202
- package/dist/core/GraphEventEmitter.d.ts.map +0 -1
- package/dist/core/GraphEventEmitter.js +0 -347
- package/dist/core/GraphEventEmitter.js.map +0 -1
- package/dist/core/GraphStorage.d.ts +0 -395
- package/dist/core/GraphStorage.d.ts.map +0 -1
- package/dist/core/GraphStorage.js +0 -786
- package/dist/core/GraphStorage.js.map +0 -1
- package/dist/core/GraphTraversal.d.ts +0 -141
- package/dist/core/GraphTraversal.d.ts.map +0 -1
- package/dist/core/GraphTraversal.js +0 -574
- package/dist/core/GraphTraversal.js.map +0 -1
- package/dist/core/HierarchyManager.d.ts +0 -111
- package/dist/core/HierarchyManager.d.ts.map +0 -1
- package/dist/core/HierarchyManager.js +0 -225
- package/dist/core/HierarchyManager.js.map +0 -1
- package/dist/core/ManagerContext.d.ts +0 -76
- package/dist/core/ManagerContext.d.ts.map +0 -1
- package/dist/core/ManagerContext.js +0 -129
- package/dist/core/ManagerContext.js.map +0 -1
- package/dist/core/ObservationManager.d.ts +0 -85
- package/dist/core/ObservationManager.d.ts.map +0 -1
- package/dist/core/ObservationManager.js +0 -124
- package/dist/core/ObservationManager.js.map +0 -1
- package/dist/core/RelationManager.d.ts +0 -131
- package/dist/core/RelationManager.d.ts.map +0 -1
- package/dist/core/RelationManager.js +0 -212
- package/dist/core/RelationManager.js.map +0 -1
- package/dist/core/SQLiteStorage.d.ts +0 -354
- package/dist/core/SQLiteStorage.d.ts.map +0 -1
- package/dist/core/SQLiteStorage.js +0 -919
- package/dist/core/SQLiteStorage.js.map +0 -1
- package/dist/core/StorageFactory.d.ts +0 -45
- package/dist/core/StorageFactory.d.ts.map +0 -1
- package/dist/core/StorageFactory.js +0 -65
- package/dist/core/StorageFactory.js.map +0 -1
- package/dist/core/TransactionManager.d.ts +0 -464
- package/dist/core/TransactionManager.d.ts.map +0 -1
- package/dist/core/TransactionManager.js +0 -869
- package/dist/core/TransactionManager.js.map +0 -1
- package/dist/core/index.d.ts +0 -17
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -20
- package/dist/core/index.js.map +0 -1
- package/dist/features/AnalyticsManager.d.ts +0 -44
- package/dist/features/AnalyticsManager.d.ts.map +0 -1
- package/dist/features/AnalyticsManager.js +0 -224
- package/dist/features/AnalyticsManager.js.map +0 -1
- package/dist/features/ArchiveManager.d.ts +0 -133
- package/dist/features/ArchiveManager.d.ts.map +0 -1
- package/dist/features/ArchiveManager.js +0 -282
- package/dist/features/ArchiveManager.js.map +0 -1
- package/dist/features/CompressionManager.d.ts +0 -119
- package/dist/features/CompressionManager.d.ts.map +0 -1
- package/dist/features/CompressionManager.js +0 -470
- package/dist/features/CompressionManager.js.map +0 -1
- package/dist/features/IOManager.d.ts +0 -225
- package/dist/features/IOManager.d.ts.map +0 -1
- package/dist/features/IOManager.js +0 -1093
- package/dist/features/IOManager.js.map +0 -1
- package/dist/features/KeywordExtractor.d.ts +0 -61
- package/dist/features/KeywordExtractor.d.ts.map +0 -1
- package/dist/features/KeywordExtractor.js +0 -127
- package/dist/features/KeywordExtractor.js.map +0 -1
- package/dist/features/ObservationNormalizer.d.ts +0 -90
- package/dist/features/ObservationNormalizer.d.ts.map +0 -1
- package/dist/features/ObservationNormalizer.js +0 -194
- package/dist/features/ObservationNormalizer.js.map +0 -1
- package/dist/features/StreamingExporter.d.ts +0 -128
- package/dist/features/StreamingExporter.d.ts.map +0 -1
- package/dist/features/StreamingExporter.js +0 -212
- package/dist/features/StreamingExporter.js.map +0 -1
- package/dist/features/TagManager.d.ts +0 -147
- package/dist/features/TagManager.d.ts.map +0 -1
- package/dist/features/TagManager.js +0 -211
- package/dist/features/TagManager.js.map +0 -1
- package/dist/features/index.d.ts +0 -14
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/index.js +0 -15
- package/dist/features/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/search/BM25Search.d.ts +0 -148
- package/dist/search/BM25Search.d.ts.map +0 -1
- package/dist/search/BM25Search.js +0 -340
- package/dist/search/BM25Search.js.map +0 -1
- package/dist/search/BasicSearch.d.ts +0 -51
- package/dist/search/BasicSearch.d.ts.map +0 -1
- package/dist/search/BasicSearch.js +0 -138
- package/dist/search/BasicSearch.js.map +0 -1
- package/dist/search/BooleanSearch.d.ts +0 -98
- package/dist/search/BooleanSearch.d.ts.map +0 -1
- package/dist/search/BooleanSearch.js +0 -431
- package/dist/search/BooleanSearch.js.map +0 -1
- package/dist/search/EarlyTerminationManager.d.ts +0 -140
- package/dist/search/EarlyTerminationManager.d.ts.map +0 -1
- package/dist/search/EarlyTerminationManager.js +0 -280
- package/dist/search/EarlyTerminationManager.js.map +0 -1
- package/dist/search/EmbeddingCache.d.ts +0 -175
- package/dist/search/EmbeddingCache.d.ts.map +0 -1
- package/dist/search/EmbeddingCache.js +0 -247
- package/dist/search/EmbeddingCache.js.map +0 -1
- package/dist/search/EmbeddingService.d.ts +0 -277
- package/dist/search/EmbeddingService.d.ts.map +0 -1
- package/dist/search/EmbeddingService.js +0 -531
- package/dist/search/EmbeddingService.js.map +0 -1
- package/dist/search/FuzzySearch.d.ts +0 -118
- package/dist/search/FuzzySearch.d.ts.map +0 -1
- package/dist/search/FuzzySearch.js +0 -313
- package/dist/search/FuzzySearch.js.map +0 -1
- package/dist/search/HybridScorer.d.ts +0 -181
- package/dist/search/HybridScorer.d.ts.map +0 -1
- package/dist/search/HybridScorer.js +0 -258
- package/dist/search/HybridScorer.js.map +0 -1
- package/dist/search/HybridSearchManager.d.ts +0 -80
- package/dist/search/HybridSearchManager.d.ts.map +0 -1
- package/dist/search/HybridSearchManager.js +0 -188
- package/dist/search/HybridSearchManager.js.map +0 -1
- package/dist/search/IncrementalIndexer.d.ts +0 -201
- package/dist/search/IncrementalIndexer.d.ts.map +0 -1
- package/dist/search/IncrementalIndexer.js +0 -343
- package/dist/search/IncrementalIndexer.js.map +0 -1
- package/dist/search/OptimizedInvertedIndex.d.ts +0 -163
- package/dist/search/OptimizedInvertedIndex.d.ts.map +0 -1
- package/dist/search/OptimizedInvertedIndex.js +0 -359
- package/dist/search/OptimizedInvertedIndex.js.map +0 -1
- package/dist/search/ParallelSearchExecutor.d.ts +0 -172
- package/dist/search/ParallelSearchExecutor.d.ts.map +0 -1
- package/dist/search/ParallelSearchExecutor.js +0 -310
- package/dist/search/ParallelSearchExecutor.js.map +0 -1
- package/dist/search/QuantizedVectorStore.d.ts +0 -171
- package/dist/search/QuantizedVectorStore.d.ts.map +0 -1
- package/dist/search/QuantizedVectorStore.js +0 -308
- package/dist/search/QuantizedVectorStore.js.map +0 -1
- package/dist/search/QueryAnalyzer.d.ts +0 -76
- package/dist/search/QueryAnalyzer.d.ts.map +0 -1
- package/dist/search/QueryAnalyzer.js +0 -228
- package/dist/search/QueryAnalyzer.js.map +0 -1
- package/dist/search/QueryCostEstimator.d.ts +0 -244
- package/dist/search/QueryCostEstimator.d.ts.map +0 -1
- package/dist/search/QueryCostEstimator.js +0 -653
- package/dist/search/QueryCostEstimator.js.map +0 -1
- package/dist/search/QueryPlanCache.d.ts +0 -220
- package/dist/search/QueryPlanCache.d.ts.map +0 -1
- package/dist/search/QueryPlanCache.js +0 -380
- package/dist/search/QueryPlanCache.js.map +0 -1
- package/dist/search/QueryPlanner.d.ts +0 -58
- package/dist/search/QueryPlanner.d.ts.map +0 -1
- package/dist/search/QueryPlanner.js +0 -138
- package/dist/search/QueryPlanner.js.map +0 -1
- package/dist/search/RankedSearch.d.ts +0 -71
- package/dist/search/RankedSearch.d.ts.map +0 -1
- package/dist/search/RankedSearch.js +0 -239
- package/dist/search/RankedSearch.js.map +0 -1
- package/dist/search/ReflectionManager.d.ts +0 -120
- package/dist/search/ReflectionManager.d.ts.map +0 -1
- package/dist/search/ReflectionManager.js +0 -232
- package/dist/search/ReflectionManager.js.map +0 -1
- package/dist/search/SavedSearchManager.d.ts +0 -79
- package/dist/search/SavedSearchManager.d.ts.map +0 -1
- package/dist/search/SavedSearchManager.js +0 -147
- package/dist/search/SavedSearchManager.js.map +0 -1
- package/dist/search/SearchFilterChain.d.ts +0 -120
- package/dist/search/SearchFilterChain.d.ts.map +0 -1
- package/dist/search/SearchFilterChain.js +0 -186
- package/dist/search/SearchFilterChain.js.map +0 -1
- package/dist/search/SearchManager.d.ts +0 -326
- package/dist/search/SearchManager.d.ts.map +0 -1
- package/dist/search/SearchManager.js +0 -454
- package/dist/search/SearchManager.js.map +0 -1
- package/dist/search/SearchSuggestions.d.ts +0 -27
- package/dist/search/SearchSuggestions.d.ts.map +0 -1
- package/dist/search/SearchSuggestions.js +0 -58
- package/dist/search/SearchSuggestions.js.map +0 -1
- package/dist/search/SemanticSearch.d.ts +0 -149
- package/dist/search/SemanticSearch.d.ts.map +0 -1
- package/dist/search/SemanticSearch.js +0 -324
- package/dist/search/SemanticSearch.js.map +0 -1
- package/dist/search/SymbolicSearch.d.ts +0 -61
- package/dist/search/SymbolicSearch.d.ts.map +0 -1
- package/dist/search/SymbolicSearch.js +0 -164
- package/dist/search/SymbolicSearch.js.map +0 -1
- package/dist/search/TFIDFEventSync.d.ts +0 -85
- package/dist/search/TFIDFEventSync.d.ts.map +0 -1
- package/dist/search/TFIDFEventSync.js +0 -134
- package/dist/search/TFIDFEventSync.js.map +0 -1
- package/dist/search/TFIDFIndexManager.d.ts +0 -151
- package/dist/search/TFIDFIndexManager.d.ts.map +0 -1
- package/dist/search/TFIDFIndexManager.js +0 -433
- package/dist/search/TFIDFIndexManager.js.map +0 -1
- package/dist/search/VectorStore.d.ts +0 -235
- package/dist/search/VectorStore.d.ts.map +0 -1
- package/dist/search/VectorStore.js +0 -312
- package/dist/search/VectorStore.js.map +0 -1
- package/dist/search/index.d.ts +0 -35
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js +0 -53
- package/dist/search/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -13
- package/dist/types/index.js.map +0 -1
- package/dist/types/types.d.ts +0 -1811
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/types.js +0 -10
- package/dist/types/types.js.map +0 -1
- package/dist/utils/BatchProcessor.d.ts +0 -271
- package/dist/utils/BatchProcessor.d.ts.map +0 -1
- package/dist/utils/BatchProcessor.js +0 -377
- package/dist/utils/BatchProcessor.js.map +0 -1
- package/dist/utils/MemoryMonitor.d.ts +0 -176
- package/dist/utils/MemoryMonitor.d.ts.map +0 -1
- package/dist/utils/MemoryMonitor.js +0 -306
- package/dist/utils/MemoryMonitor.js.map +0 -1
- package/dist/utils/WorkerPoolManager.d.ts +0 -233
- package/dist/utils/WorkerPoolManager.d.ts.map +0 -1
- package/dist/utils/WorkerPoolManager.js +0 -421
- package/dist/utils/WorkerPoolManager.js.map +0 -1
- package/dist/utils/compressedCache.d.ts +0 -221
- package/dist/utils/compressedCache.d.ts.map +0 -1
- package/dist/utils/compressedCache.js +0 -349
- package/dist/utils/compressedCache.js.map +0 -1
- package/dist/utils/compressionUtil.d.ts +0 -214
- package/dist/utils/compressionUtil.d.ts.map +0 -1
- package/dist/utils/compressionUtil.js +0 -248
- package/dist/utils/compressionUtil.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -245
- package/dist/utils/constants.d.ts.map +0 -1
- package/dist/utils/constants.js +0 -253
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/entityUtils.d.ts +0 -379
- package/dist/utils/entityUtils.d.ts.map +0 -1
- package/dist/utils/entityUtils.js +0 -649
- package/dist/utils/entityUtils.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -95
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -146
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/formatters.d.ts +0 -145
- package/dist/utils/formatters.d.ts.map +0 -1
- package/dist/utils/formatters.js +0 -133
- package/dist/utils/formatters.js.map +0 -1
- package/dist/utils/index.d.ts +0 -26
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -88
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/indexes.d.ts +0 -270
- package/dist/utils/indexes.d.ts.map +0 -1
- package/dist/utils/indexes.js +0 -527
- package/dist/utils/indexes.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -31
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -41
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/operationUtils.d.ts +0 -124
- package/dist/utils/operationUtils.d.ts.map +0 -1
- package/dist/utils/operationUtils.js +0 -176
- package/dist/utils/operationUtils.js.map +0 -1
- package/dist/utils/parallelUtils.d.ts +0 -76
- package/dist/utils/parallelUtils.d.ts.map +0 -1
- package/dist/utils/parallelUtils.js +0 -192
- package/dist/utils/parallelUtils.js.map +0 -1
- package/dist/utils/schemas.d.ts +0 -556
- package/dist/utils/schemas.d.ts.map +0 -1
- package/dist/utils/schemas.js +0 -485
- package/dist/utils/schemas.js.map +0 -1
- package/dist/utils/searchAlgorithms.d.ts +0 -99
- package/dist/utils/searchAlgorithms.d.ts.map +0 -1
- package/dist/utils/searchAlgorithms.js +0 -168
- package/dist/utils/searchAlgorithms.js.map +0 -1
- package/dist/utils/searchCache.d.ts +0 -108
- package/dist/utils/searchCache.d.ts.map +0 -1
- package/dist/utils/searchCache.js +0 -210
- package/dist/utils/searchCache.js.map +0 -1
- package/dist/utils/taskScheduler.d.ts +0 -294
- package/dist/utils/taskScheduler.d.ts.map +0 -1
- package/dist/utils/taskScheduler.js +0 -487
- package/dist/utils/taskScheduler.js.map +0 -1
- package/dist/workers/index.d.ts +0 -12
- package/dist/workers/index.d.ts.map +0 -1
- package/dist/workers/index.js +0 -10
- package/dist/workers/index.js.map +0 -1
- package/dist/workers/levenshteinWorker.d.ts +0 -60
- package/dist/workers/levenshteinWorker.d.ts.map +0 -1
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compression Manager
|
|
3
|
-
*
|
|
4
|
-
* Handles duplicate detection, entity merging, and graph compression.
|
|
5
|
-
* Extracted from SearchManager (Phase 4: Consolidate God Objects).
|
|
6
|
-
*
|
|
7
|
-
* @module features/CompressionManager
|
|
8
|
-
*/
|
|
9
|
-
import { levenshteinDistance, checkCancellation, createProgressReporter, createProgress, fnv1aHash, } from '../utils/index.js';
|
|
10
|
-
import { EntityNotFoundError, InsufficientEntitiesError } from '../utils/errors.js';
|
|
11
|
-
import { SIMILARITY_WEIGHTS, DEFAULT_DUPLICATE_THRESHOLD } from '../utils/constants.js';
|
|
12
|
-
/**
|
|
13
|
-
* Manages compression operations for the knowledge graph.
|
|
14
|
-
*/
|
|
15
|
-
export class CompressionManager {
|
|
16
|
-
storage;
|
|
17
|
-
constructor(storage) {
|
|
18
|
-
this.storage = storage;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Prepare an entity for efficient similarity comparisons.
|
|
22
|
-
* Pre-computes all normalized data to avoid repeated computation.
|
|
23
|
-
*
|
|
24
|
-
* Phase 12 Sprint 1: Added nameHash for fast bucketing.
|
|
25
|
-
*
|
|
26
|
-
* @param entity - The entity to prepare
|
|
27
|
-
* @returns PreparedEntity with pre-computed data including hash
|
|
28
|
-
*/
|
|
29
|
-
prepareEntity(entity) {
|
|
30
|
-
const nameLower = entity.name.toLowerCase();
|
|
31
|
-
return {
|
|
32
|
-
entity,
|
|
33
|
-
nameLower,
|
|
34
|
-
typeLower: entity.entityType.toLowerCase(),
|
|
35
|
-
observationSet: new Set(entity.observations.map(o => o.toLowerCase())),
|
|
36
|
-
tagSet: new Set((entity.tags ?? []).map(t => t.toLowerCase())),
|
|
37
|
-
nameHash: fnv1aHash(nameLower),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Prepare multiple entities for efficient similarity comparisons.
|
|
42
|
-
* Use this before batch comparison operations.
|
|
43
|
-
*
|
|
44
|
-
* @param entities - Entities to prepare
|
|
45
|
-
* @returns Map of entity name to PreparedEntity
|
|
46
|
-
*/
|
|
47
|
-
prepareEntities(entities) {
|
|
48
|
-
const prepared = new Map();
|
|
49
|
-
for (const entity of entities) {
|
|
50
|
-
prepared.set(entity.name, this.prepareEntity(entity));
|
|
51
|
-
}
|
|
52
|
-
return prepared;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Calculate similarity between two entities using multiple heuristics.
|
|
56
|
-
*
|
|
57
|
-
* Uses configurable weights defined in SIMILARITY_WEIGHTS constant.
|
|
58
|
-
* See SIMILARITY_WEIGHTS for the breakdown of scoring factors.
|
|
59
|
-
*
|
|
60
|
-
* NOTE: For batch comparisons, use prepareEntities() + calculatePreparedSimilarity() for better performance.
|
|
61
|
-
*
|
|
62
|
-
* @param e1 - First entity
|
|
63
|
-
* @param e2 - Second entity
|
|
64
|
-
* @returns Similarity score from 0 (completely different) to 1 (identical)
|
|
65
|
-
*/
|
|
66
|
-
calculateEntitySimilarity(e1, e2) {
|
|
67
|
-
let score = 0;
|
|
68
|
-
let factors = 0;
|
|
69
|
-
// Name similarity (Levenshtein-based)
|
|
70
|
-
const nameDistance = levenshteinDistance(e1.name.toLowerCase(), e2.name.toLowerCase());
|
|
71
|
-
const maxNameLength = Math.max(e1.name.length, e2.name.length);
|
|
72
|
-
const nameSimilarity = 1 - nameDistance / maxNameLength;
|
|
73
|
-
score += nameSimilarity * SIMILARITY_WEIGHTS.NAME;
|
|
74
|
-
factors += SIMILARITY_WEIGHTS.NAME;
|
|
75
|
-
// Type similarity (exact match)
|
|
76
|
-
if (e1.entityType.toLowerCase() === e2.entityType.toLowerCase()) {
|
|
77
|
-
score += SIMILARITY_WEIGHTS.TYPE;
|
|
78
|
-
}
|
|
79
|
-
factors += SIMILARITY_WEIGHTS.TYPE;
|
|
80
|
-
// Observation overlap (Jaccard similarity)
|
|
81
|
-
const obs1Set = new Set(e1.observations.map(o => o.toLowerCase()));
|
|
82
|
-
const obs2Set = new Set(e2.observations.map(o => o.toLowerCase()));
|
|
83
|
-
const intersection = new Set([...obs1Set].filter(x => obs2Set.has(x)));
|
|
84
|
-
const union = new Set([...obs1Set, ...obs2Set]);
|
|
85
|
-
const observationSimilarity = union.size > 0 ? intersection.size / union.size : 0;
|
|
86
|
-
score += observationSimilarity * SIMILARITY_WEIGHTS.OBSERVATIONS;
|
|
87
|
-
factors += SIMILARITY_WEIGHTS.OBSERVATIONS;
|
|
88
|
-
// Tag overlap (Jaccard similarity)
|
|
89
|
-
if (e1.tags && e2.tags && (e1.tags.length > 0 || e2.tags.length > 0)) {
|
|
90
|
-
const tags1Set = new Set(e1.tags.map(t => t.toLowerCase()));
|
|
91
|
-
const tags2Set = new Set(e2.tags.map(t => t.toLowerCase()));
|
|
92
|
-
const tagIntersection = new Set([...tags1Set].filter(x => tags2Set.has(x)));
|
|
93
|
-
const tagUnion = new Set([...tags1Set, ...tags2Set]);
|
|
94
|
-
const tagSimilarity = tagUnion.size > 0 ? tagIntersection.size / tagUnion.size : 0;
|
|
95
|
-
score += tagSimilarity * SIMILARITY_WEIGHTS.TAGS;
|
|
96
|
-
factors += SIMILARITY_WEIGHTS.TAGS;
|
|
97
|
-
}
|
|
98
|
-
return factors > 0 ? score / factors : 0;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Efficiently calculate intersection size of two Sets without creating a new Set.
|
|
102
|
-
* Iterates over the smaller set for O(min(m,n)) complexity.
|
|
103
|
-
*/
|
|
104
|
-
setIntersectionSize(a, b) {
|
|
105
|
-
// Always iterate over smaller set
|
|
106
|
-
const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a];
|
|
107
|
-
let count = 0;
|
|
108
|
-
for (const item of smaller) {
|
|
109
|
-
if (larger.has(item))
|
|
110
|
-
count++;
|
|
111
|
-
}
|
|
112
|
-
return count;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Calculate similarity between two prepared entities.
|
|
116
|
-
* OPTIMIZED: Uses pre-computed Sets to avoid O(n) set creation per comparison.
|
|
117
|
-
*
|
|
118
|
-
* @param p1 - First prepared entity
|
|
119
|
-
* @param p2 - Second prepared entity
|
|
120
|
-
* @returns Similarity score from 0 (completely different) to 1 (identical)
|
|
121
|
-
*/
|
|
122
|
-
calculatePreparedSimilarity(p1, p2) {
|
|
123
|
-
let score = 0;
|
|
124
|
-
let factors = 0;
|
|
125
|
-
// Name similarity (Levenshtein-based) - use pre-computed lowercase
|
|
126
|
-
const nameDistance = levenshteinDistance(p1.nameLower, p2.nameLower);
|
|
127
|
-
const maxNameLength = Math.max(p1.nameLower.length, p2.nameLower.length);
|
|
128
|
-
const nameSimilarity = 1 - nameDistance / maxNameLength;
|
|
129
|
-
score += nameSimilarity * SIMILARITY_WEIGHTS.NAME;
|
|
130
|
-
factors += SIMILARITY_WEIGHTS.NAME;
|
|
131
|
-
// Type similarity (exact match) - use pre-computed lowercase
|
|
132
|
-
if (p1.typeLower === p2.typeLower) {
|
|
133
|
-
score += SIMILARITY_WEIGHTS.TYPE;
|
|
134
|
-
}
|
|
135
|
-
factors += SIMILARITY_WEIGHTS.TYPE;
|
|
136
|
-
// Observation overlap (Jaccard similarity) - use pre-computed Sets
|
|
137
|
-
const obsIntersectionSize = this.setIntersectionSize(p1.observationSet, p2.observationSet);
|
|
138
|
-
const obsUnionSize = p1.observationSet.size + p2.observationSet.size - obsIntersectionSize;
|
|
139
|
-
const observationSimilarity = obsUnionSize > 0 ? obsIntersectionSize / obsUnionSize : 0;
|
|
140
|
-
score += observationSimilarity * SIMILARITY_WEIGHTS.OBSERVATIONS;
|
|
141
|
-
factors += SIMILARITY_WEIGHTS.OBSERVATIONS;
|
|
142
|
-
// Tag overlap (Jaccard similarity) - use pre-computed Sets
|
|
143
|
-
if (p1.tagSet.size > 0 || p2.tagSet.size > 0) {
|
|
144
|
-
const tagIntersectionSize = this.setIntersectionSize(p1.tagSet, p2.tagSet);
|
|
145
|
-
const tagUnionSize = p1.tagSet.size + p2.tagSet.size - tagIntersectionSize;
|
|
146
|
-
const tagSimilarity = tagUnionSize > 0 ? tagIntersectionSize / tagUnionSize : 0;
|
|
147
|
-
score += tagSimilarity * SIMILARITY_WEIGHTS.TAGS;
|
|
148
|
-
factors += SIMILARITY_WEIGHTS.TAGS;
|
|
149
|
-
}
|
|
150
|
-
return factors > 0 ? score / factors : 0;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Find duplicate entities in the graph based on similarity threshold.
|
|
154
|
-
*
|
|
155
|
-
* OPTIMIZED: Uses bucketing strategies to reduce O(n²) comparisons:
|
|
156
|
-
* 1. Buckets entities by entityType (only compare same types)
|
|
157
|
-
* 2. Within each type, buckets by name prefix (first 2 chars normalized)
|
|
158
|
-
* 3. Only compares entities within same or adjacent buckets
|
|
159
|
-
*
|
|
160
|
-
* Phase 9B: Supports progress tracking and cancellation via LongRunningOperationOptions.
|
|
161
|
-
*
|
|
162
|
-
* Complexity: O(n·k) where k is average bucket size (typically << n)
|
|
163
|
-
*
|
|
164
|
-
* @param threshold - Similarity threshold (0.0 to 1.0), default DEFAULT_DUPLICATE_THRESHOLD
|
|
165
|
-
* @param options - Optional progress/cancellation options (Phase 9B)
|
|
166
|
-
* @returns Array of duplicate groups (each group has similar entities)
|
|
167
|
-
* @throws {OperationCancelledError} If operation is cancelled via signal (Phase 9B)
|
|
168
|
-
*/
|
|
169
|
-
async findDuplicates(threshold = DEFAULT_DUPLICATE_THRESHOLD, options) {
|
|
170
|
-
// Check for early cancellation
|
|
171
|
-
checkCancellation(options?.signal, 'findDuplicates');
|
|
172
|
-
const graph = await this.storage.loadGraph();
|
|
173
|
-
const duplicateGroups = [];
|
|
174
|
-
const processed = new Set();
|
|
175
|
-
// Setup progress reporter
|
|
176
|
-
const reportProgress = createProgressReporter(options?.onProgress);
|
|
177
|
-
const totalEntities = graph.entities.length;
|
|
178
|
-
let processedCount = 0;
|
|
179
|
-
reportProgress?.(createProgress(0, totalEntities, 'findDuplicates'));
|
|
180
|
-
// OPTIMIZATION: Pre-prepare all entities once before comparisons
|
|
181
|
-
const preparedEntities = this.prepareEntities(graph.entities);
|
|
182
|
-
// Step 1: Bucket entities by type (reduces comparisons drastically)
|
|
183
|
-
const typeMap = new Map();
|
|
184
|
-
for (const entity of graph.entities) {
|
|
185
|
-
const normalizedType = entity.entityType.toLowerCase();
|
|
186
|
-
if (!typeMap.has(normalizedType)) {
|
|
187
|
-
typeMap.set(normalizedType, []);
|
|
188
|
-
}
|
|
189
|
-
typeMap.get(normalizedType).push(entity);
|
|
190
|
-
}
|
|
191
|
-
// Step 2: For each type bucket, sub-bucket by name prefix
|
|
192
|
-
for (const entities of typeMap.values()) {
|
|
193
|
-
// Check for cancellation between type buckets
|
|
194
|
-
checkCancellation(options?.signal, 'findDuplicates');
|
|
195
|
-
// Skip single-entity types (no duplicates possible)
|
|
196
|
-
if (entities.length < 2) {
|
|
197
|
-
processedCount += entities.length;
|
|
198
|
-
reportProgress?.(createProgress(processedCount, totalEntities, 'findDuplicates'));
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
// Create name prefix buckets (first 2 chars, normalized)
|
|
202
|
-
const prefixMap = new Map();
|
|
203
|
-
for (const entity of entities) {
|
|
204
|
-
const prefix = entity.name.toLowerCase().slice(0, 2);
|
|
205
|
-
if (!prefixMap.has(prefix)) {
|
|
206
|
-
prefixMap.set(prefix, []);
|
|
207
|
-
}
|
|
208
|
-
prefixMap.get(prefix).push(entity);
|
|
209
|
-
}
|
|
210
|
-
// Step 3: Compare only within buckets (or adjacent buckets for fuzzy matching)
|
|
211
|
-
const prefixKeys = Array.from(prefixMap.keys()).sort();
|
|
212
|
-
for (let bucketIdx = 0; bucketIdx < prefixKeys.length; bucketIdx++) {
|
|
213
|
-
// Check for cancellation between prefix buckets
|
|
214
|
-
checkCancellation(options?.signal, 'findDuplicates');
|
|
215
|
-
const currentPrefix = prefixKeys[bucketIdx];
|
|
216
|
-
const currentBucket = prefixMap.get(currentPrefix);
|
|
217
|
-
// Collect entities to compare: current bucket + adjacent buckets
|
|
218
|
-
const candidateEntities = [...currentBucket];
|
|
219
|
-
// Add next bucket if exists (handles fuzzy prefix matching)
|
|
220
|
-
if (bucketIdx + 1 < prefixKeys.length) {
|
|
221
|
-
candidateEntities.push(...prefixMap.get(prefixKeys[bucketIdx + 1]));
|
|
222
|
-
}
|
|
223
|
-
// Compare entities within candidate pool
|
|
224
|
-
for (let i = 0; i < currentBucket.length; i++) {
|
|
225
|
-
const entity1 = currentBucket[i];
|
|
226
|
-
if (processed.has(entity1.name))
|
|
227
|
-
continue;
|
|
228
|
-
// OPTIMIZATION: Use prepared entity for comparison
|
|
229
|
-
const prepared1 = preparedEntities.get(entity1.name);
|
|
230
|
-
const group = [entity1.name];
|
|
231
|
-
for (let j = 0; j < candidateEntities.length; j++) {
|
|
232
|
-
const entity2 = candidateEntities[j];
|
|
233
|
-
if (entity1.name === entity2.name || processed.has(entity2.name))
|
|
234
|
-
continue;
|
|
235
|
-
// OPTIMIZATION: Use prepared entity and optimized similarity
|
|
236
|
-
const prepared2 = preparedEntities.get(entity2.name);
|
|
237
|
-
const similarity = this.calculatePreparedSimilarity(prepared1, prepared2);
|
|
238
|
-
if (similarity >= threshold) {
|
|
239
|
-
group.push(entity2.name);
|
|
240
|
-
processed.add(entity2.name);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (group.length > 1) {
|
|
244
|
-
duplicateGroups.push(group);
|
|
245
|
-
processed.add(entity1.name);
|
|
246
|
-
}
|
|
247
|
-
processedCount++;
|
|
248
|
-
reportProgress?.(createProgress(processedCount, totalEntities, 'findDuplicates'));
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// Report completion
|
|
253
|
-
reportProgress?.(createProgress(totalEntities, totalEntities, 'findDuplicates'));
|
|
254
|
-
return duplicateGroups;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Merge a group of entities into a single entity.
|
|
258
|
-
*
|
|
259
|
-
* Merging strategy:
|
|
260
|
-
* - First entity is kept (or renamed to targetName)
|
|
261
|
-
* - Observations: Union of all observations
|
|
262
|
-
* - Tags: Union of all tags
|
|
263
|
-
* - Importance: Maximum importance value
|
|
264
|
-
* - createdAt: Earliest date
|
|
265
|
-
* - lastModified: Current timestamp
|
|
266
|
-
* - Relations: Redirected to kept entity, duplicates removed
|
|
267
|
-
*
|
|
268
|
-
* @param entityNames - Names of entities to merge (first one is kept)
|
|
269
|
-
* @param targetName - Optional new name for merged entity (default: first entity name)
|
|
270
|
-
* @param options - Optional configuration
|
|
271
|
-
* @param options.graph - Pre-loaded graph to use (avoids reload)
|
|
272
|
-
* @param options.skipSave - If true, don't save (caller will save)
|
|
273
|
-
* @returns The merged entity
|
|
274
|
-
* @throws {InsufficientEntitiesError} If less than 2 entities provided
|
|
275
|
-
* @throws {EntityNotFoundError} If any entity not found
|
|
276
|
-
*/
|
|
277
|
-
async mergeEntities(entityNames, targetName, options = {}) {
|
|
278
|
-
if (entityNames.length < 2) {
|
|
279
|
-
throw new InsufficientEntitiesError('merging', 2, entityNames.length);
|
|
280
|
-
}
|
|
281
|
-
// Use provided graph or load fresh
|
|
282
|
-
const graph = options.graph ?? await this.storage.getGraphForMutation();
|
|
283
|
-
const entitiesToMerge = entityNames.map(name => {
|
|
284
|
-
const entity = graph.entities.find(e => e.name === name);
|
|
285
|
-
if (!entity) {
|
|
286
|
-
throw new EntityNotFoundError(name);
|
|
287
|
-
}
|
|
288
|
-
return entity;
|
|
289
|
-
});
|
|
290
|
-
const keepEntity = entitiesToMerge[0];
|
|
291
|
-
const mergeEntities = entitiesToMerge.slice(1);
|
|
292
|
-
// Merge observations (unique)
|
|
293
|
-
const allObservations = new Set();
|
|
294
|
-
for (const entity of entitiesToMerge) {
|
|
295
|
-
entity.observations.forEach(obs => allObservations.add(obs));
|
|
296
|
-
}
|
|
297
|
-
keepEntity.observations = Array.from(allObservations);
|
|
298
|
-
// Merge tags (unique)
|
|
299
|
-
const allTags = new Set();
|
|
300
|
-
for (const entity of entitiesToMerge) {
|
|
301
|
-
if (entity.tags) {
|
|
302
|
-
entity.tags.forEach(tag => allTags.add(tag));
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
if (allTags.size > 0) {
|
|
306
|
-
keepEntity.tags = Array.from(allTags);
|
|
307
|
-
}
|
|
308
|
-
// Use highest importance
|
|
309
|
-
const importances = entitiesToMerge
|
|
310
|
-
.map(e => e.importance)
|
|
311
|
-
.filter(imp => imp !== undefined);
|
|
312
|
-
if (importances.length > 0) {
|
|
313
|
-
keepEntity.importance = Math.max(...importances);
|
|
314
|
-
}
|
|
315
|
-
// Use earliest createdAt
|
|
316
|
-
const createdDates = entitiesToMerge
|
|
317
|
-
.map(e => e.createdAt)
|
|
318
|
-
.filter(date => date !== undefined);
|
|
319
|
-
if (createdDates.length > 0) {
|
|
320
|
-
keepEntity.createdAt = createdDates.sort()[0];
|
|
321
|
-
}
|
|
322
|
-
// Update lastModified
|
|
323
|
-
keepEntity.lastModified = new Date().toISOString();
|
|
324
|
-
// Rename if requested
|
|
325
|
-
if (targetName && targetName !== keepEntity.name) {
|
|
326
|
-
// Update all relations pointing to old name
|
|
327
|
-
graph.relations.forEach(rel => {
|
|
328
|
-
if (rel.from === keepEntity.name)
|
|
329
|
-
rel.from = targetName;
|
|
330
|
-
if (rel.to === keepEntity.name)
|
|
331
|
-
rel.to = targetName;
|
|
332
|
-
});
|
|
333
|
-
keepEntity.name = targetName;
|
|
334
|
-
}
|
|
335
|
-
// Update relations from merged entities to point to kept entity
|
|
336
|
-
for (const mergeEntity of mergeEntities) {
|
|
337
|
-
graph.relations.forEach(rel => {
|
|
338
|
-
if (rel.from === mergeEntity.name)
|
|
339
|
-
rel.from = keepEntity.name;
|
|
340
|
-
if (rel.to === mergeEntity.name)
|
|
341
|
-
rel.to = keepEntity.name;
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
// Remove duplicate relations
|
|
345
|
-
const uniqueRelations = new Map();
|
|
346
|
-
for (const relation of graph.relations) {
|
|
347
|
-
const key = `${relation.from}|${relation.to}|${relation.relationType}`;
|
|
348
|
-
if (!uniqueRelations.has(key)) {
|
|
349
|
-
uniqueRelations.set(key, relation);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
graph.relations = Array.from(uniqueRelations.values());
|
|
353
|
-
// Remove merged entities
|
|
354
|
-
const mergeNames = new Set(mergeEntities.map(e => e.name));
|
|
355
|
-
graph.entities = graph.entities.filter(e => !mergeNames.has(e.name));
|
|
356
|
-
// Save unless caller said to skip
|
|
357
|
-
if (!options.skipSave) {
|
|
358
|
-
await this.storage.saveGraph(graph);
|
|
359
|
-
}
|
|
360
|
-
return keepEntity;
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Compress the knowledge graph by finding and merging duplicates.
|
|
364
|
-
* OPTIMIZED: Loads graph once, performs all merges, saves once.
|
|
365
|
-
*
|
|
366
|
-
* Phase 9B: Supports progress tracking and cancellation via LongRunningOperationOptions.
|
|
367
|
-
*
|
|
368
|
-
* @param threshold - Similarity threshold for duplicate detection (0.0 to 1.0), default DEFAULT_DUPLICATE_THRESHOLD
|
|
369
|
-
* @param dryRun - If true, only report what would be compressed without applying changes
|
|
370
|
-
* @param options - Optional progress/cancellation options (Phase 9B)
|
|
371
|
-
* @returns Compression result with statistics
|
|
372
|
-
* @throws {OperationCancelledError} If operation is cancelled via signal (Phase 9B)
|
|
373
|
-
*/
|
|
374
|
-
async compressGraph(threshold = DEFAULT_DUPLICATE_THRESHOLD, dryRun = false, options) {
|
|
375
|
-
// Check for early cancellation
|
|
376
|
-
checkCancellation(options?.signal, 'compressGraph');
|
|
377
|
-
// Setup progress reporter (we'll use phases: 50% finding duplicates, 50% merging)
|
|
378
|
-
const reportProgress = createProgressReporter(options?.onProgress);
|
|
379
|
-
reportProgress?.(createProgress(0, 100, 'compressGraph'));
|
|
380
|
-
// Phase 1: Find duplicates (0-50% progress)
|
|
381
|
-
const duplicateGroups = await this.findDuplicates(threshold, {
|
|
382
|
-
signal: options?.signal,
|
|
383
|
-
onProgress: (p) => {
|
|
384
|
-
// Map findDuplicates progress (0-100%) to compressGraph progress (0-50%)
|
|
385
|
-
const compressProgress = Math.round(p.percentage * 0.5);
|
|
386
|
-
reportProgress?.(createProgress(compressProgress, 100, 'finding duplicates'));
|
|
387
|
-
},
|
|
388
|
-
});
|
|
389
|
-
// Check for cancellation after finding duplicates
|
|
390
|
-
checkCancellation(options?.signal, 'compressGraph');
|
|
391
|
-
reportProgress?.(createProgress(50, 100, 'compressGraph'));
|
|
392
|
-
// OPTIMIZATION: Load graph once for all operations
|
|
393
|
-
const graph = await this.storage.getGraphForMutation();
|
|
394
|
-
const initialSize = JSON.stringify(graph).length;
|
|
395
|
-
const result = {
|
|
396
|
-
duplicatesFound: duplicateGroups.reduce((sum, group) => sum + group.length, 0),
|
|
397
|
-
entitiesMerged: 0,
|
|
398
|
-
observationsCompressed: 0,
|
|
399
|
-
relationsConsolidated: 0,
|
|
400
|
-
spaceFreed: 0,
|
|
401
|
-
mergedEntities: [],
|
|
402
|
-
};
|
|
403
|
-
if (dryRun) {
|
|
404
|
-
// Just report what would happen
|
|
405
|
-
for (const group of duplicateGroups) {
|
|
406
|
-
result.mergedEntities.push({
|
|
407
|
-
kept: group[0],
|
|
408
|
-
merged: group.slice(1),
|
|
409
|
-
});
|
|
410
|
-
result.entitiesMerged += group.length - 1;
|
|
411
|
-
}
|
|
412
|
-
reportProgress?.(createProgress(100, 100, 'compressGraph'));
|
|
413
|
-
return result;
|
|
414
|
-
}
|
|
415
|
-
// Phase 2: Merge duplicates (50-100% progress)
|
|
416
|
-
const totalGroups = duplicateGroups.length;
|
|
417
|
-
let mergedGroups = 0;
|
|
418
|
-
// OPTIMIZATION: Build entity lookup map for O(1) access during merges
|
|
419
|
-
const entityMap = new Map();
|
|
420
|
-
for (const entity of graph.entities) {
|
|
421
|
-
entityMap.set(entity.name, entity);
|
|
422
|
-
}
|
|
423
|
-
// Merge all duplicates using the same graph instance
|
|
424
|
-
for (const group of duplicateGroups) {
|
|
425
|
-
// Check for cancellation between merges
|
|
426
|
-
checkCancellation(options?.signal, 'compressGraph');
|
|
427
|
-
try {
|
|
428
|
-
// Count observations before merge using O(1) lookup
|
|
429
|
-
let totalObservationsBefore = 0;
|
|
430
|
-
for (const name of group) {
|
|
431
|
-
const entity = entityMap.get(name);
|
|
432
|
-
if (entity) {
|
|
433
|
-
totalObservationsBefore += entity.observations.length;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
// OPTIMIZATION: Pass graph and skip individual saves
|
|
437
|
-
const mergedEntity = await this.mergeEntities(group, undefined, {
|
|
438
|
-
graph,
|
|
439
|
-
skipSave: true,
|
|
440
|
-
});
|
|
441
|
-
const observationsAfter = mergedEntity.observations.length;
|
|
442
|
-
result.observationsCompressed += totalObservationsBefore - observationsAfter;
|
|
443
|
-
result.mergedEntities.push({
|
|
444
|
-
kept: group[0],
|
|
445
|
-
merged: group.slice(1),
|
|
446
|
-
});
|
|
447
|
-
result.entitiesMerged += group.length - 1;
|
|
448
|
-
}
|
|
449
|
-
catch (error) {
|
|
450
|
-
// Skip groups that fail to merge
|
|
451
|
-
console.error(`Failed to merge group ${group}:`, error);
|
|
452
|
-
}
|
|
453
|
-
mergedGroups++;
|
|
454
|
-
// Map merge progress (0-100%) to compressGraph progress (50-100%)
|
|
455
|
-
const mergeProgress = totalGroups > 0 ? Math.round(50 + (mergedGroups / totalGroups) * 50) : 100;
|
|
456
|
-
reportProgress?.(createProgress(mergeProgress, 100, 'merging entities'));
|
|
457
|
-
}
|
|
458
|
-
// Check for cancellation before final save
|
|
459
|
-
checkCancellation(options?.signal, 'compressGraph');
|
|
460
|
-
// OPTIMIZATION: Save once after all merges complete
|
|
461
|
-
await this.storage.saveGraph(graph);
|
|
462
|
-
const finalSize = JSON.stringify(graph).length;
|
|
463
|
-
result.spaceFreed = initialSize - finalSize;
|
|
464
|
-
result.relationsConsolidated = result.entitiesMerged;
|
|
465
|
-
// Report completion
|
|
466
|
-
reportProgress?.(createProgress(100, 100, 'compressGraph'));
|
|
467
|
-
return result;
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
//# sourceMappingURL=CompressionManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CompressionManager.js","sourceRoot":"","sources":["../../src/features/CompressionManager.ts"],"names":[],"mappings":"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"}
|