@danielsimonjr/memoryjs 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/README.md +385 -113
  2. package/README.md.backup-1768084780988 +266 -0
  3. package/dist/index.cjs +17364 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +12371 -0
  6. package/dist/index.d.ts +12367 -11
  7. package/dist/index.js +17102 -19
  8. package/dist/index.js.map +1 -1
  9. package/dist/workers/levenshteinWorker.cjs +102 -0
  10. package/dist/workers/levenshteinWorker.cjs.map +1 -0
  11. package/dist/workers/levenshteinWorker.js +57 -91
  12. package/dist/workers/levenshteinWorker.js.map +1 -1
  13. package/package.json +12 -6
  14. package/dist/core/EntityManager.d.ts +0 -268
  15. package/dist/core/EntityManager.d.ts.map +0 -1
  16. package/dist/core/EntityManager.js +0 -512
  17. package/dist/core/EntityManager.js.map +0 -1
  18. package/dist/core/GraphEventEmitter.d.ts +0 -202
  19. package/dist/core/GraphEventEmitter.d.ts.map +0 -1
  20. package/dist/core/GraphEventEmitter.js +0 -347
  21. package/dist/core/GraphEventEmitter.js.map +0 -1
  22. package/dist/core/GraphStorage.d.ts +0 -395
  23. package/dist/core/GraphStorage.d.ts.map +0 -1
  24. package/dist/core/GraphStorage.js +0 -786
  25. package/dist/core/GraphStorage.js.map +0 -1
  26. package/dist/core/GraphTraversal.d.ts +0 -141
  27. package/dist/core/GraphTraversal.d.ts.map +0 -1
  28. package/dist/core/GraphTraversal.js +0 -574
  29. package/dist/core/GraphTraversal.js.map +0 -1
  30. package/dist/core/HierarchyManager.d.ts +0 -111
  31. package/dist/core/HierarchyManager.d.ts.map +0 -1
  32. package/dist/core/HierarchyManager.js +0 -225
  33. package/dist/core/HierarchyManager.js.map +0 -1
  34. package/dist/core/ManagerContext.d.ts +0 -76
  35. package/dist/core/ManagerContext.d.ts.map +0 -1
  36. package/dist/core/ManagerContext.js +0 -129
  37. package/dist/core/ManagerContext.js.map +0 -1
  38. package/dist/core/ObservationManager.d.ts +0 -85
  39. package/dist/core/ObservationManager.d.ts.map +0 -1
  40. package/dist/core/ObservationManager.js +0 -124
  41. package/dist/core/ObservationManager.js.map +0 -1
  42. package/dist/core/RelationManager.d.ts +0 -131
  43. package/dist/core/RelationManager.d.ts.map +0 -1
  44. package/dist/core/RelationManager.js +0 -212
  45. package/dist/core/RelationManager.js.map +0 -1
  46. package/dist/core/SQLiteStorage.d.ts +0 -354
  47. package/dist/core/SQLiteStorage.d.ts.map +0 -1
  48. package/dist/core/SQLiteStorage.js +0 -919
  49. package/dist/core/SQLiteStorage.js.map +0 -1
  50. package/dist/core/StorageFactory.d.ts +0 -45
  51. package/dist/core/StorageFactory.d.ts.map +0 -1
  52. package/dist/core/StorageFactory.js +0 -65
  53. package/dist/core/StorageFactory.js.map +0 -1
  54. package/dist/core/TransactionManager.d.ts +0 -464
  55. package/dist/core/TransactionManager.d.ts.map +0 -1
  56. package/dist/core/TransactionManager.js +0 -869
  57. package/dist/core/TransactionManager.js.map +0 -1
  58. package/dist/core/index.d.ts +0 -17
  59. package/dist/core/index.d.ts.map +0 -1
  60. package/dist/core/index.js +0 -20
  61. package/dist/core/index.js.map +0 -1
  62. package/dist/features/AnalyticsManager.d.ts +0 -44
  63. package/dist/features/AnalyticsManager.d.ts.map +0 -1
  64. package/dist/features/AnalyticsManager.js +0 -224
  65. package/dist/features/AnalyticsManager.js.map +0 -1
  66. package/dist/features/ArchiveManager.d.ts +0 -133
  67. package/dist/features/ArchiveManager.d.ts.map +0 -1
  68. package/dist/features/ArchiveManager.js +0 -282
  69. package/dist/features/ArchiveManager.js.map +0 -1
  70. package/dist/features/CompressionManager.d.ts +0 -119
  71. package/dist/features/CompressionManager.d.ts.map +0 -1
  72. package/dist/features/CompressionManager.js +0 -470
  73. package/dist/features/CompressionManager.js.map +0 -1
  74. package/dist/features/IOManager.d.ts +0 -225
  75. package/dist/features/IOManager.d.ts.map +0 -1
  76. package/dist/features/IOManager.js +0 -1093
  77. package/dist/features/IOManager.js.map +0 -1
  78. package/dist/features/KeywordExtractor.d.ts +0 -61
  79. package/dist/features/KeywordExtractor.d.ts.map +0 -1
  80. package/dist/features/KeywordExtractor.js +0 -127
  81. package/dist/features/KeywordExtractor.js.map +0 -1
  82. package/dist/features/ObservationNormalizer.d.ts +0 -90
  83. package/dist/features/ObservationNormalizer.d.ts.map +0 -1
  84. package/dist/features/ObservationNormalizer.js +0 -194
  85. package/dist/features/ObservationNormalizer.js.map +0 -1
  86. package/dist/features/StreamingExporter.d.ts +0 -128
  87. package/dist/features/StreamingExporter.d.ts.map +0 -1
  88. package/dist/features/StreamingExporter.js +0 -212
  89. package/dist/features/StreamingExporter.js.map +0 -1
  90. package/dist/features/TagManager.d.ts +0 -147
  91. package/dist/features/TagManager.d.ts.map +0 -1
  92. package/dist/features/TagManager.js +0 -211
  93. package/dist/features/TagManager.js.map +0 -1
  94. package/dist/features/index.d.ts +0 -14
  95. package/dist/features/index.d.ts.map +0 -1
  96. package/dist/features/index.js +0 -15
  97. package/dist/features/index.js.map +0 -1
  98. package/dist/index.d.ts.map +0 -1
  99. package/dist/search/BM25Search.d.ts +0 -148
  100. package/dist/search/BM25Search.d.ts.map +0 -1
  101. package/dist/search/BM25Search.js +0 -340
  102. package/dist/search/BM25Search.js.map +0 -1
  103. package/dist/search/BasicSearch.d.ts +0 -51
  104. package/dist/search/BasicSearch.d.ts.map +0 -1
  105. package/dist/search/BasicSearch.js +0 -138
  106. package/dist/search/BasicSearch.js.map +0 -1
  107. package/dist/search/BooleanSearch.d.ts +0 -98
  108. package/dist/search/BooleanSearch.d.ts.map +0 -1
  109. package/dist/search/BooleanSearch.js +0 -431
  110. package/dist/search/BooleanSearch.js.map +0 -1
  111. package/dist/search/EarlyTerminationManager.d.ts +0 -140
  112. package/dist/search/EarlyTerminationManager.d.ts.map +0 -1
  113. package/dist/search/EarlyTerminationManager.js +0 -280
  114. package/dist/search/EarlyTerminationManager.js.map +0 -1
  115. package/dist/search/EmbeddingCache.d.ts +0 -175
  116. package/dist/search/EmbeddingCache.d.ts.map +0 -1
  117. package/dist/search/EmbeddingCache.js +0 -247
  118. package/dist/search/EmbeddingCache.js.map +0 -1
  119. package/dist/search/EmbeddingService.d.ts +0 -277
  120. package/dist/search/EmbeddingService.d.ts.map +0 -1
  121. package/dist/search/EmbeddingService.js +0 -531
  122. package/dist/search/EmbeddingService.js.map +0 -1
  123. package/dist/search/FuzzySearch.d.ts +0 -118
  124. package/dist/search/FuzzySearch.d.ts.map +0 -1
  125. package/dist/search/FuzzySearch.js +0 -313
  126. package/dist/search/FuzzySearch.js.map +0 -1
  127. package/dist/search/HybridScorer.d.ts +0 -181
  128. package/dist/search/HybridScorer.d.ts.map +0 -1
  129. package/dist/search/HybridScorer.js +0 -258
  130. package/dist/search/HybridScorer.js.map +0 -1
  131. package/dist/search/HybridSearchManager.d.ts +0 -80
  132. package/dist/search/HybridSearchManager.d.ts.map +0 -1
  133. package/dist/search/HybridSearchManager.js +0 -188
  134. package/dist/search/HybridSearchManager.js.map +0 -1
  135. package/dist/search/IncrementalIndexer.d.ts +0 -201
  136. package/dist/search/IncrementalIndexer.d.ts.map +0 -1
  137. package/dist/search/IncrementalIndexer.js +0 -343
  138. package/dist/search/IncrementalIndexer.js.map +0 -1
  139. package/dist/search/OptimizedInvertedIndex.d.ts +0 -163
  140. package/dist/search/OptimizedInvertedIndex.d.ts.map +0 -1
  141. package/dist/search/OptimizedInvertedIndex.js +0 -359
  142. package/dist/search/OptimizedInvertedIndex.js.map +0 -1
  143. package/dist/search/ParallelSearchExecutor.d.ts +0 -172
  144. package/dist/search/ParallelSearchExecutor.d.ts.map +0 -1
  145. package/dist/search/ParallelSearchExecutor.js +0 -310
  146. package/dist/search/ParallelSearchExecutor.js.map +0 -1
  147. package/dist/search/QuantizedVectorStore.d.ts +0 -171
  148. package/dist/search/QuantizedVectorStore.d.ts.map +0 -1
  149. package/dist/search/QuantizedVectorStore.js +0 -308
  150. package/dist/search/QuantizedVectorStore.js.map +0 -1
  151. package/dist/search/QueryAnalyzer.d.ts +0 -76
  152. package/dist/search/QueryAnalyzer.d.ts.map +0 -1
  153. package/dist/search/QueryAnalyzer.js +0 -228
  154. package/dist/search/QueryAnalyzer.js.map +0 -1
  155. package/dist/search/QueryCostEstimator.d.ts +0 -244
  156. package/dist/search/QueryCostEstimator.d.ts.map +0 -1
  157. package/dist/search/QueryCostEstimator.js +0 -653
  158. package/dist/search/QueryCostEstimator.js.map +0 -1
  159. package/dist/search/QueryPlanCache.d.ts +0 -220
  160. package/dist/search/QueryPlanCache.d.ts.map +0 -1
  161. package/dist/search/QueryPlanCache.js +0 -380
  162. package/dist/search/QueryPlanCache.js.map +0 -1
  163. package/dist/search/QueryPlanner.d.ts +0 -58
  164. package/dist/search/QueryPlanner.d.ts.map +0 -1
  165. package/dist/search/QueryPlanner.js +0 -138
  166. package/dist/search/QueryPlanner.js.map +0 -1
  167. package/dist/search/RankedSearch.d.ts +0 -71
  168. package/dist/search/RankedSearch.d.ts.map +0 -1
  169. package/dist/search/RankedSearch.js +0 -239
  170. package/dist/search/RankedSearch.js.map +0 -1
  171. package/dist/search/ReflectionManager.d.ts +0 -120
  172. package/dist/search/ReflectionManager.d.ts.map +0 -1
  173. package/dist/search/ReflectionManager.js +0 -232
  174. package/dist/search/ReflectionManager.js.map +0 -1
  175. package/dist/search/SavedSearchManager.d.ts +0 -79
  176. package/dist/search/SavedSearchManager.d.ts.map +0 -1
  177. package/dist/search/SavedSearchManager.js +0 -147
  178. package/dist/search/SavedSearchManager.js.map +0 -1
  179. package/dist/search/SearchFilterChain.d.ts +0 -120
  180. package/dist/search/SearchFilterChain.d.ts.map +0 -1
  181. package/dist/search/SearchFilterChain.js +0 -186
  182. package/dist/search/SearchFilterChain.js.map +0 -1
  183. package/dist/search/SearchManager.d.ts +0 -326
  184. package/dist/search/SearchManager.d.ts.map +0 -1
  185. package/dist/search/SearchManager.js +0 -454
  186. package/dist/search/SearchManager.js.map +0 -1
  187. package/dist/search/SearchSuggestions.d.ts +0 -27
  188. package/dist/search/SearchSuggestions.d.ts.map +0 -1
  189. package/dist/search/SearchSuggestions.js +0 -58
  190. package/dist/search/SearchSuggestions.js.map +0 -1
  191. package/dist/search/SemanticSearch.d.ts +0 -149
  192. package/dist/search/SemanticSearch.d.ts.map +0 -1
  193. package/dist/search/SemanticSearch.js +0 -324
  194. package/dist/search/SemanticSearch.js.map +0 -1
  195. package/dist/search/SymbolicSearch.d.ts +0 -61
  196. package/dist/search/SymbolicSearch.d.ts.map +0 -1
  197. package/dist/search/SymbolicSearch.js +0 -164
  198. package/dist/search/SymbolicSearch.js.map +0 -1
  199. package/dist/search/TFIDFEventSync.d.ts +0 -85
  200. package/dist/search/TFIDFEventSync.d.ts.map +0 -1
  201. package/dist/search/TFIDFEventSync.js +0 -134
  202. package/dist/search/TFIDFEventSync.js.map +0 -1
  203. package/dist/search/TFIDFIndexManager.d.ts +0 -151
  204. package/dist/search/TFIDFIndexManager.d.ts.map +0 -1
  205. package/dist/search/TFIDFIndexManager.js +0 -433
  206. package/dist/search/TFIDFIndexManager.js.map +0 -1
  207. package/dist/search/VectorStore.d.ts +0 -235
  208. package/dist/search/VectorStore.d.ts.map +0 -1
  209. package/dist/search/VectorStore.js +0 -312
  210. package/dist/search/VectorStore.js.map +0 -1
  211. package/dist/search/index.d.ts +0 -35
  212. package/dist/search/index.d.ts.map +0 -1
  213. package/dist/search/index.js +0 -53
  214. package/dist/search/index.js.map +0 -1
  215. package/dist/types/index.d.ts +0 -13
  216. package/dist/types/index.d.ts.map +0 -1
  217. package/dist/types/index.js +0 -13
  218. package/dist/types/index.js.map +0 -1
  219. package/dist/types/types.d.ts +0 -1811
  220. package/dist/types/types.d.ts.map +0 -1
  221. package/dist/types/types.js +0 -10
  222. package/dist/types/types.js.map +0 -1
  223. package/dist/utils/BatchProcessor.d.ts +0 -271
  224. package/dist/utils/BatchProcessor.d.ts.map +0 -1
  225. package/dist/utils/BatchProcessor.js +0 -377
  226. package/dist/utils/BatchProcessor.js.map +0 -1
  227. package/dist/utils/MemoryMonitor.d.ts +0 -176
  228. package/dist/utils/MemoryMonitor.d.ts.map +0 -1
  229. package/dist/utils/MemoryMonitor.js +0 -306
  230. package/dist/utils/MemoryMonitor.js.map +0 -1
  231. package/dist/utils/WorkerPoolManager.d.ts +0 -233
  232. package/dist/utils/WorkerPoolManager.d.ts.map +0 -1
  233. package/dist/utils/WorkerPoolManager.js +0 -421
  234. package/dist/utils/WorkerPoolManager.js.map +0 -1
  235. package/dist/utils/compressedCache.d.ts +0 -221
  236. package/dist/utils/compressedCache.d.ts.map +0 -1
  237. package/dist/utils/compressedCache.js +0 -349
  238. package/dist/utils/compressedCache.js.map +0 -1
  239. package/dist/utils/compressionUtil.d.ts +0 -214
  240. package/dist/utils/compressionUtil.d.ts.map +0 -1
  241. package/dist/utils/compressionUtil.js +0 -248
  242. package/dist/utils/compressionUtil.js.map +0 -1
  243. package/dist/utils/constants.d.ts +0 -245
  244. package/dist/utils/constants.d.ts.map +0 -1
  245. package/dist/utils/constants.js +0 -253
  246. package/dist/utils/constants.js.map +0 -1
  247. package/dist/utils/entityUtils.d.ts +0 -379
  248. package/dist/utils/entityUtils.d.ts.map +0 -1
  249. package/dist/utils/entityUtils.js +0 -649
  250. package/dist/utils/entityUtils.js.map +0 -1
  251. package/dist/utils/errors.d.ts +0 -95
  252. package/dist/utils/errors.d.ts.map +0 -1
  253. package/dist/utils/errors.js +0 -146
  254. package/dist/utils/errors.js.map +0 -1
  255. package/dist/utils/formatters.d.ts +0 -145
  256. package/dist/utils/formatters.d.ts.map +0 -1
  257. package/dist/utils/formatters.js +0 -133
  258. package/dist/utils/formatters.js.map +0 -1
  259. package/dist/utils/index.d.ts +0 -26
  260. package/dist/utils/index.d.ts.map +0 -1
  261. package/dist/utils/index.js +0 -88
  262. package/dist/utils/index.js.map +0 -1
  263. package/dist/utils/indexes.d.ts +0 -270
  264. package/dist/utils/indexes.d.ts.map +0 -1
  265. package/dist/utils/indexes.js +0 -527
  266. package/dist/utils/indexes.js.map +0 -1
  267. package/dist/utils/logger.d.ts +0 -31
  268. package/dist/utils/logger.d.ts.map +0 -1
  269. package/dist/utils/logger.js +0 -41
  270. package/dist/utils/logger.js.map +0 -1
  271. package/dist/utils/operationUtils.d.ts +0 -124
  272. package/dist/utils/operationUtils.d.ts.map +0 -1
  273. package/dist/utils/operationUtils.js +0 -176
  274. package/dist/utils/operationUtils.js.map +0 -1
  275. package/dist/utils/parallelUtils.d.ts +0 -76
  276. package/dist/utils/parallelUtils.d.ts.map +0 -1
  277. package/dist/utils/parallelUtils.js +0 -192
  278. package/dist/utils/parallelUtils.js.map +0 -1
  279. package/dist/utils/schemas.d.ts +0 -556
  280. package/dist/utils/schemas.d.ts.map +0 -1
  281. package/dist/utils/schemas.js +0 -485
  282. package/dist/utils/schemas.js.map +0 -1
  283. package/dist/utils/searchAlgorithms.d.ts +0 -99
  284. package/dist/utils/searchAlgorithms.d.ts.map +0 -1
  285. package/dist/utils/searchAlgorithms.js +0 -168
  286. package/dist/utils/searchAlgorithms.js.map +0 -1
  287. package/dist/utils/searchCache.d.ts +0 -108
  288. package/dist/utils/searchCache.d.ts.map +0 -1
  289. package/dist/utils/searchCache.js +0 -210
  290. package/dist/utils/searchCache.js.map +0 -1
  291. package/dist/utils/taskScheduler.d.ts +0 -294
  292. package/dist/utils/taskScheduler.d.ts.map +0 -1
  293. package/dist/utils/taskScheduler.js +0 -487
  294. package/dist/utils/taskScheduler.js.map +0 -1
  295. package/dist/workers/index.d.ts +0 -12
  296. package/dist/workers/index.d.ts.map +0 -1
  297. package/dist/workers/index.js +0 -10
  298. package/dist/workers/index.js.map +0 -1
  299. package/dist/workers/levenshteinWorker.d.ts +0 -60
  300. 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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"}