@danielsimonjr/memoryjs 1.0.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 (295) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +266 -0
  3. package/dist/core/EntityManager.d.ts +268 -0
  4. package/dist/core/EntityManager.d.ts.map +1 -0
  5. package/dist/core/EntityManager.js +512 -0
  6. package/dist/core/EntityManager.js.map +1 -0
  7. package/dist/core/GraphEventEmitter.d.ts +202 -0
  8. package/dist/core/GraphEventEmitter.d.ts.map +1 -0
  9. package/dist/core/GraphEventEmitter.js +347 -0
  10. package/dist/core/GraphEventEmitter.js.map +1 -0
  11. package/dist/core/GraphStorage.d.ts +395 -0
  12. package/dist/core/GraphStorage.d.ts.map +1 -0
  13. package/dist/core/GraphStorage.js +786 -0
  14. package/dist/core/GraphStorage.js.map +1 -0
  15. package/dist/core/GraphTraversal.d.ts +141 -0
  16. package/dist/core/GraphTraversal.d.ts.map +1 -0
  17. package/dist/core/GraphTraversal.js +574 -0
  18. package/dist/core/GraphTraversal.js.map +1 -0
  19. package/dist/core/HierarchyManager.d.ts +111 -0
  20. package/dist/core/HierarchyManager.d.ts.map +1 -0
  21. package/dist/core/HierarchyManager.js +225 -0
  22. package/dist/core/HierarchyManager.js.map +1 -0
  23. package/dist/core/ManagerContext.d.ts +76 -0
  24. package/dist/core/ManagerContext.d.ts.map +1 -0
  25. package/dist/core/ManagerContext.js +129 -0
  26. package/dist/core/ManagerContext.js.map +1 -0
  27. package/dist/core/ObservationManager.d.ts +85 -0
  28. package/dist/core/ObservationManager.d.ts.map +1 -0
  29. package/dist/core/ObservationManager.js +124 -0
  30. package/dist/core/ObservationManager.js.map +1 -0
  31. package/dist/core/RelationManager.d.ts +131 -0
  32. package/dist/core/RelationManager.d.ts.map +1 -0
  33. package/dist/core/RelationManager.js +212 -0
  34. package/dist/core/RelationManager.js.map +1 -0
  35. package/dist/core/SQLiteStorage.d.ts +354 -0
  36. package/dist/core/SQLiteStorage.d.ts.map +1 -0
  37. package/dist/core/SQLiteStorage.js +919 -0
  38. package/dist/core/SQLiteStorage.js.map +1 -0
  39. package/dist/core/StorageFactory.d.ts +45 -0
  40. package/dist/core/StorageFactory.d.ts.map +1 -0
  41. package/dist/core/StorageFactory.js +65 -0
  42. package/dist/core/StorageFactory.js.map +1 -0
  43. package/dist/core/TransactionManager.d.ts +464 -0
  44. package/dist/core/TransactionManager.d.ts.map +1 -0
  45. package/dist/core/TransactionManager.js +869 -0
  46. package/dist/core/TransactionManager.js.map +1 -0
  47. package/dist/core/index.d.ts +17 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +20 -0
  50. package/dist/core/index.js.map +1 -0
  51. package/dist/features/AnalyticsManager.d.ts +44 -0
  52. package/dist/features/AnalyticsManager.d.ts.map +1 -0
  53. package/dist/features/AnalyticsManager.js +224 -0
  54. package/dist/features/AnalyticsManager.js.map +1 -0
  55. package/dist/features/ArchiveManager.d.ts +133 -0
  56. package/dist/features/ArchiveManager.d.ts.map +1 -0
  57. package/dist/features/ArchiveManager.js +282 -0
  58. package/dist/features/ArchiveManager.js.map +1 -0
  59. package/dist/features/CompressionManager.d.ts +119 -0
  60. package/dist/features/CompressionManager.d.ts.map +1 -0
  61. package/dist/features/CompressionManager.js +470 -0
  62. package/dist/features/CompressionManager.js.map +1 -0
  63. package/dist/features/IOManager.d.ts +225 -0
  64. package/dist/features/IOManager.d.ts.map +1 -0
  65. package/dist/features/IOManager.js +1093 -0
  66. package/dist/features/IOManager.js.map +1 -0
  67. package/dist/features/KeywordExtractor.d.ts +61 -0
  68. package/dist/features/KeywordExtractor.d.ts.map +1 -0
  69. package/dist/features/KeywordExtractor.js +127 -0
  70. package/dist/features/KeywordExtractor.js.map +1 -0
  71. package/dist/features/ObservationNormalizer.d.ts +90 -0
  72. package/dist/features/ObservationNormalizer.d.ts.map +1 -0
  73. package/dist/features/ObservationNormalizer.js +194 -0
  74. package/dist/features/ObservationNormalizer.js.map +1 -0
  75. package/dist/features/StreamingExporter.d.ts +128 -0
  76. package/dist/features/StreamingExporter.d.ts.map +1 -0
  77. package/dist/features/StreamingExporter.js +212 -0
  78. package/dist/features/StreamingExporter.js.map +1 -0
  79. package/dist/features/TagManager.d.ts +147 -0
  80. package/dist/features/TagManager.d.ts.map +1 -0
  81. package/dist/features/TagManager.js +211 -0
  82. package/dist/features/TagManager.js.map +1 -0
  83. package/dist/features/index.d.ts +14 -0
  84. package/dist/features/index.d.ts.map +1 -0
  85. package/dist/features/index.js +15 -0
  86. package/dist/features/index.js.map +1 -0
  87. package/dist/index.d.ts +15 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +20 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/search/BM25Search.d.ts +148 -0
  92. package/dist/search/BM25Search.d.ts.map +1 -0
  93. package/dist/search/BM25Search.js +340 -0
  94. package/dist/search/BM25Search.js.map +1 -0
  95. package/dist/search/BasicSearch.d.ts +51 -0
  96. package/dist/search/BasicSearch.d.ts.map +1 -0
  97. package/dist/search/BasicSearch.js +138 -0
  98. package/dist/search/BasicSearch.js.map +1 -0
  99. package/dist/search/BooleanSearch.d.ts +98 -0
  100. package/dist/search/BooleanSearch.d.ts.map +1 -0
  101. package/dist/search/BooleanSearch.js +431 -0
  102. package/dist/search/BooleanSearch.js.map +1 -0
  103. package/dist/search/EarlyTerminationManager.d.ts +140 -0
  104. package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
  105. package/dist/search/EarlyTerminationManager.js +280 -0
  106. package/dist/search/EarlyTerminationManager.js.map +1 -0
  107. package/dist/search/EmbeddingCache.d.ts +175 -0
  108. package/dist/search/EmbeddingCache.d.ts.map +1 -0
  109. package/dist/search/EmbeddingCache.js +247 -0
  110. package/dist/search/EmbeddingCache.js.map +1 -0
  111. package/dist/search/EmbeddingService.d.ts +277 -0
  112. package/dist/search/EmbeddingService.d.ts.map +1 -0
  113. package/dist/search/EmbeddingService.js +531 -0
  114. package/dist/search/EmbeddingService.js.map +1 -0
  115. package/dist/search/FuzzySearch.d.ts +118 -0
  116. package/dist/search/FuzzySearch.d.ts.map +1 -0
  117. package/dist/search/FuzzySearch.js +313 -0
  118. package/dist/search/FuzzySearch.js.map +1 -0
  119. package/dist/search/HybridScorer.d.ts +181 -0
  120. package/dist/search/HybridScorer.d.ts.map +1 -0
  121. package/dist/search/HybridScorer.js +258 -0
  122. package/dist/search/HybridScorer.js.map +1 -0
  123. package/dist/search/HybridSearchManager.d.ts +80 -0
  124. package/dist/search/HybridSearchManager.d.ts.map +1 -0
  125. package/dist/search/HybridSearchManager.js +188 -0
  126. package/dist/search/HybridSearchManager.js.map +1 -0
  127. package/dist/search/IncrementalIndexer.d.ts +201 -0
  128. package/dist/search/IncrementalIndexer.d.ts.map +1 -0
  129. package/dist/search/IncrementalIndexer.js +343 -0
  130. package/dist/search/IncrementalIndexer.js.map +1 -0
  131. package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
  132. package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
  133. package/dist/search/OptimizedInvertedIndex.js +359 -0
  134. package/dist/search/OptimizedInvertedIndex.js.map +1 -0
  135. package/dist/search/ParallelSearchExecutor.d.ts +172 -0
  136. package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
  137. package/dist/search/ParallelSearchExecutor.js +310 -0
  138. package/dist/search/ParallelSearchExecutor.js.map +1 -0
  139. package/dist/search/QuantizedVectorStore.d.ts +171 -0
  140. package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
  141. package/dist/search/QuantizedVectorStore.js +308 -0
  142. package/dist/search/QuantizedVectorStore.js.map +1 -0
  143. package/dist/search/QueryAnalyzer.d.ts +76 -0
  144. package/dist/search/QueryAnalyzer.d.ts.map +1 -0
  145. package/dist/search/QueryAnalyzer.js +228 -0
  146. package/dist/search/QueryAnalyzer.js.map +1 -0
  147. package/dist/search/QueryCostEstimator.d.ts +244 -0
  148. package/dist/search/QueryCostEstimator.d.ts.map +1 -0
  149. package/dist/search/QueryCostEstimator.js +653 -0
  150. package/dist/search/QueryCostEstimator.js.map +1 -0
  151. package/dist/search/QueryPlanCache.d.ts +220 -0
  152. package/dist/search/QueryPlanCache.d.ts.map +1 -0
  153. package/dist/search/QueryPlanCache.js +380 -0
  154. package/dist/search/QueryPlanCache.js.map +1 -0
  155. package/dist/search/QueryPlanner.d.ts +58 -0
  156. package/dist/search/QueryPlanner.d.ts.map +1 -0
  157. package/dist/search/QueryPlanner.js +138 -0
  158. package/dist/search/QueryPlanner.js.map +1 -0
  159. package/dist/search/RankedSearch.d.ts +71 -0
  160. package/dist/search/RankedSearch.d.ts.map +1 -0
  161. package/dist/search/RankedSearch.js +239 -0
  162. package/dist/search/RankedSearch.js.map +1 -0
  163. package/dist/search/ReflectionManager.d.ts +120 -0
  164. package/dist/search/ReflectionManager.d.ts.map +1 -0
  165. package/dist/search/ReflectionManager.js +232 -0
  166. package/dist/search/ReflectionManager.js.map +1 -0
  167. package/dist/search/SavedSearchManager.d.ts +79 -0
  168. package/dist/search/SavedSearchManager.d.ts.map +1 -0
  169. package/dist/search/SavedSearchManager.js +147 -0
  170. package/dist/search/SavedSearchManager.js.map +1 -0
  171. package/dist/search/SearchFilterChain.d.ts +120 -0
  172. package/dist/search/SearchFilterChain.d.ts.map +1 -0
  173. package/dist/search/SearchFilterChain.js +186 -0
  174. package/dist/search/SearchFilterChain.js.map +1 -0
  175. package/dist/search/SearchManager.d.ts +326 -0
  176. package/dist/search/SearchManager.d.ts.map +1 -0
  177. package/dist/search/SearchManager.js +454 -0
  178. package/dist/search/SearchManager.js.map +1 -0
  179. package/dist/search/SearchSuggestions.d.ts +27 -0
  180. package/dist/search/SearchSuggestions.d.ts.map +1 -0
  181. package/dist/search/SearchSuggestions.js +58 -0
  182. package/dist/search/SearchSuggestions.js.map +1 -0
  183. package/dist/search/SemanticSearch.d.ts +149 -0
  184. package/dist/search/SemanticSearch.d.ts.map +1 -0
  185. package/dist/search/SemanticSearch.js +324 -0
  186. package/dist/search/SemanticSearch.js.map +1 -0
  187. package/dist/search/SymbolicSearch.d.ts +61 -0
  188. package/dist/search/SymbolicSearch.d.ts.map +1 -0
  189. package/dist/search/SymbolicSearch.js +164 -0
  190. package/dist/search/SymbolicSearch.js.map +1 -0
  191. package/dist/search/TFIDFEventSync.d.ts +85 -0
  192. package/dist/search/TFIDFEventSync.d.ts.map +1 -0
  193. package/dist/search/TFIDFEventSync.js +134 -0
  194. package/dist/search/TFIDFEventSync.js.map +1 -0
  195. package/dist/search/TFIDFIndexManager.d.ts +151 -0
  196. package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
  197. package/dist/search/TFIDFIndexManager.js +433 -0
  198. package/dist/search/TFIDFIndexManager.js.map +1 -0
  199. package/dist/search/VectorStore.d.ts +235 -0
  200. package/dist/search/VectorStore.d.ts.map +1 -0
  201. package/dist/search/VectorStore.js +312 -0
  202. package/dist/search/VectorStore.js.map +1 -0
  203. package/dist/search/index.d.ts +35 -0
  204. package/dist/search/index.d.ts.map +1 -0
  205. package/dist/search/index.js +53 -0
  206. package/dist/search/index.js.map +1 -0
  207. package/dist/types/index.d.ts +13 -0
  208. package/dist/types/index.d.ts.map +1 -0
  209. package/dist/types/index.js +13 -0
  210. package/dist/types/index.js.map +1 -0
  211. package/dist/types/types.d.ts +1811 -0
  212. package/dist/types/types.d.ts.map +1 -0
  213. package/dist/types/types.js +10 -0
  214. package/dist/types/types.js.map +1 -0
  215. package/dist/utils/BatchProcessor.d.ts +271 -0
  216. package/dist/utils/BatchProcessor.d.ts.map +1 -0
  217. package/dist/utils/BatchProcessor.js +377 -0
  218. package/dist/utils/BatchProcessor.js.map +1 -0
  219. package/dist/utils/MemoryMonitor.d.ts +176 -0
  220. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  221. package/dist/utils/MemoryMonitor.js +306 -0
  222. package/dist/utils/MemoryMonitor.js.map +1 -0
  223. package/dist/utils/WorkerPoolManager.d.ts +233 -0
  224. package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
  225. package/dist/utils/WorkerPoolManager.js +421 -0
  226. package/dist/utils/WorkerPoolManager.js.map +1 -0
  227. package/dist/utils/compressedCache.d.ts +221 -0
  228. package/dist/utils/compressedCache.d.ts.map +1 -0
  229. package/dist/utils/compressedCache.js +349 -0
  230. package/dist/utils/compressedCache.js.map +1 -0
  231. package/dist/utils/compressionUtil.d.ts +214 -0
  232. package/dist/utils/compressionUtil.d.ts.map +1 -0
  233. package/dist/utils/compressionUtil.js +248 -0
  234. package/dist/utils/compressionUtil.js.map +1 -0
  235. package/dist/utils/constants.d.ts +245 -0
  236. package/dist/utils/constants.d.ts.map +1 -0
  237. package/dist/utils/constants.js +253 -0
  238. package/dist/utils/constants.js.map +1 -0
  239. package/dist/utils/entityUtils.d.ts +379 -0
  240. package/dist/utils/entityUtils.d.ts.map +1 -0
  241. package/dist/utils/entityUtils.js +649 -0
  242. package/dist/utils/entityUtils.js.map +1 -0
  243. package/dist/utils/errors.d.ts +95 -0
  244. package/dist/utils/errors.d.ts.map +1 -0
  245. package/dist/utils/errors.js +146 -0
  246. package/dist/utils/errors.js.map +1 -0
  247. package/dist/utils/formatters.d.ts +145 -0
  248. package/dist/utils/formatters.d.ts.map +1 -0
  249. package/dist/utils/formatters.js +133 -0
  250. package/dist/utils/formatters.js.map +1 -0
  251. package/dist/utils/index.d.ts +26 -0
  252. package/dist/utils/index.d.ts.map +1 -0
  253. package/dist/utils/index.js +88 -0
  254. package/dist/utils/index.js.map +1 -0
  255. package/dist/utils/indexes.d.ts +270 -0
  256. package/dist/utils/indexes.d.ts.map +1 -0
  257. package/dist/utils/indexes.js +527 -0
  258. package/dist/utils/indexes.js.map +1 -0
  259. package/dist/utils/logger.d.ts +31 -0
  260. package/dist/utils/logger.d.ts.map +1 -0
  261. package/dist/utils/logger.js +41 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/utils/operationUtils.d.ts +124 -0
  264. package/dist/utils/operationUtils.d.ts.map +1 -0
  265. package/dist/utils/operationUtils.js +176 -0
  266. package/dist/utils/operationUtils.js.map +1 -0
  267. package/dist/utils/parallelUtils.d.ts +76 -0
  268. package/dist/utils/parallelUtils.d.ts.map +1 -0
  269. package/dist/utils/parallelUtils.js +192 -0
  270. package/dist/utils/parallelUtils.js.map +1 -0
  271. package/dist/utils/schemas.d.ts +556 -0
  272. package/dist/utils/schemas.d.ts.map +1 -0
  273. package/dist/utils/schemas.js +485 -0
  274. package/dist/utils/schemas.js.map +1 -0
  275. package/dist/utils/searchAlgorithms.d.ts +99 -0
  276. package/dist/utils/searchAlgorithms.d.ts.map +1 -0
  277. package/dist/utils/searchAlgorithms.js +168 -0
  278. package/dist/utils/searchAlgorithms.js.map +1 -0
  279. package/dist/utils/searchCache.d.ts +108 -0
  280. package/dist/utils/searchCache.d.ts.map +1 -0
  281. package/dist/utils/searchCache.js +210 -0
  282. package/dist/utils/searchCache.js.map +1 -0
  283. package/dist/utils/taskScheduler.d.ts +294 -0
  284. package/dist/utils/taskScheduler.d.ts.map +1 -0
  285. package/dist/utils/taskScheduler.js +487 -0
  286. package/dist/utils/taskScheduler.js.map +1 -0
  287. package/dist/workers/index.d.ts +12 -0
  288. package/dist/workers/index.d.ts.map +1 -0
  289. package/dist/workers/index.js +10 -0
  290. package/dist/workers/index.js.map +1 -0
  291. package/dist/workers/levenshteinWorker.d.ts +60 -0
  292. package/dist/workers/levenshteinWorker.d.ts.map +1 -0
  293. package/dist/workers/levenshteinWorker.js +99 -0
  294. package/dist/workers/levenshteinWorker.js.map +1 -0
  295. package/package.json +69 -0
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Early Termination Manager
3
+ *
4
+ * Phase 12 Sprint 4: Manages early termination of hybrid search when
5
+ * results are adequate, executing layers in cost-order for efficiency.
6
+ *
7
+ * @module search/EarlyTerminationManager
8
+ */
9
+ import { QueryCostEstimator } from './QueryCostEstimator.js';
10
+ /**
11
+ * Default options for early termination.
12
+ */
13
+ const DEFAULT_OPTIONS = {
14
+ adequacyThreshold: 0.7,
15
+ minResults: 3,
16
+ maxResults: 20,
17
+ semanticAvailable: true,
18
+ minDiversity: 0.3,
19
+ minRelevance: 0.4,
20
+ };
21
+ /**
22
+ * Early Termination Manager
23
+ *
24
+ * Executes search layers in cost-order (fastest first) and terminates
25
+ * early when results are adequate, saving computation time.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const manager = new EarlyTerminationManager(hybridSearch);
30
+ * const result = await manager.searchWithEarlyTermination(
31
+ * graph,
32
+ * 'machine learning',
33
+ * { adequacyThreshold: 0.8, minResults: 5 }
34
+ * );
35
+ *
36
+ * if (result.earlyTerminated) {
37
+ * console.log(`Terminated after ${result.executedLayers.length} layers`);
38
+ * }
39
+ * ```
40
+ */
41
+ export class EarlyTerminationManager {
42
+ hybridSearch;
43
+ costEstimator;
44
+ constructor(hybridSearch, costEstimator) {
45
+ this.hybridSearch = hybridSearch;
46
+ this.costEstimator = costEstimator ?? new QueryCostEstimator();
47
+ }
48
+ /**
49
+ * Execute search with early termination support.
50
+ *
51
+ * Executes layers in cost-order and terminates early when results
52
+ * meet the adequacy threshold.
53
+ *
54
+ * @param graph - Knowledge graph to search
55
+ * @param query - Search query
56
+ * @param options - Early termination options
57
+ * @returns Search results with termination details
58
+ */
59
+ async searchWithEarlyTermination(graph, query, options = {}) {
60
+ const startTime = Date.now();
61
+ const opts = { ...DEFAULT_OPTIONS, ...options };
62
+ const { semanticAvailable, maxResults } = opts;
63
+ // Get layers sorted by cost (fastest first)
64
+ const orderedLayers = this.costEstimator.getLayersByCost(query, graph.entities.length, semanticAvailable);
65
+ const allResults = [];
66
+ const executedLayers = [];
67
+ let earlyTerminated = false;
68
+ // Execute layers in cost order
69
+ for (const { layer } of orderedLayers) {
70
+ executedLayers.push(layer);
71
+ // Execute single layer search
72
+ const layerResults = await this.executeLayerSearch(graph, query, layer, maxResults);
73
+ // Merge results (deduplicate by entity name)
74
+ for (const result of layerResults) {
75
+ const existing = allResults.find(r => r.entity.name === result.entity.name);
76
+ if (existing) {
77
+ // Update scores if this layer has higher score
78
+ if (result.scores.combined > existing.scores.combined) {
79
+ Object.assign(existing, result);
80
+ }
81
+ // Add to matched layers
82
+ if (!existing.matchedLayers.includes(layer)) {
83
+ existing.matchedLayers.push(layer);
84
+ }
85
+ }
86
+ else {
87
+ // Ensure matchedLayers includes current layer
88
+ if (!result.matchedLayers.includes(layer)) {
89
+ result.matchedLayers = [...result.matchedLayers, layer];
90
+ }
91
+ allResults.push(result);
92
+ }
93
+ }
94
+ // Check adequacy
95
+ const adequacy = this.checkAdequacy(allResults, opts, executedLayers);
96
+ if (adequacy.adequate) {
97
+ earlyTerminated = executedLayers.length < orderedLayers.length;
98
+ break;
99
+ }
100
+ }
101
+ // Final sort by combined score
102
+ const sortedResults = allResults
103
+ .sort((a, b) => b.scores.combined - a.scores.combined)
104
+ .slice(0, maxResults);
105
+ const finalAdequacy = this.checkAdequacy(sortedResults, opts, executedLayers);
106
+ return {
107
+ results: sortedResults,
108
+ executedLayers,
109
+ adequacy: finalAdequacy,
110
+ earlyTerminated,
111
+ executionTimeMs: Date.now() - startTime,
112
+ };
113
+ }
114
+ /**
115
+ * Execute a single layer search.
116
+ * @private
117
+ */
118
+ async executeLayerSearch(graph, query, layer, limit) {
119
+ // Configure weights to emphasize the current layer
120
+ const weights = this.getLayerWeights(layer);
121
+ try {
122
+ return await this.hybridSearch.search(graph, query, {
123
+ ...weights,
124
+ limit: limit * 2, // Over-fetch for better merging
125
+ });
126
+ }
127
+ catch {
128
+ // Layer failed, return empty results
129
+ return [];
130
+ }
131
+ }
132
+ /**
133
+ * Get weight configuration for a specific layer.
134
+ * @private
135
+ */
136
+ getLayerWeights(layer) {
137
+ switch (layer) {
138
+ case 'semantic':
139
+ return { semanticWeight: 1.0, lexicalWeight: 0.0, symbolicWeight: 0.0 };
140
+ case 'lexical':
141
+ return { semanticWeight: 0.0, lexicalWeight: 1.0, symbolicWeight: 0.0 };
142
+ case 'symbolic':
143
+ return { semanticWeight: 0.0, lexicalWeight: 0.0, symbolicWeight: 1.0 };
144
+ }
145
+ }
146
+ /**
147
+ * Check if results are adequate based on configured thresholds.
148
+ *
149
+ * @param results - Current search results
150
+ * @param options - Adequacy options
151
+ * @param executedLayers - Layers that have been executed
152
+ * @returns Adequacy check result
153
+ */
154
+ checkAdequacy(results, options, executedLayers) {
155
+ const opts = { ...DEFAULT_OPTIONS, ...options };
156
+ const { adequacyThreshold, minResults, minDiversity, minRelevance, analysis, } = opts;
157
+ const reasons = [];
158
+ let score = 0;
159
+ // Weight components
160
+ const weights = {
161
+ quantity: 0.35,
162
+ diversity: 0.25,
163
+ relevance: 0.25,
164
+ coverage: 0.15,
165
+ };
166
+ // 1. Quantity score (do we have enough results?)
167
+ const quantityScore = Math.min(results.length / minResults, 1);
168
+ score += quantityScore * weights.quantity;
169
+ if (quantityScore < 1) {
170
+ reasons.push(`Insufficient results: ${results.length}/${minResults}`);
171
+ }
172
+ else {
173
+ reasons.push(`Sufficient results: ${results.length}`);
174
+ }
175
+ // 2. Diversity score (variety of entity types and layers)
176
+ const diversityScore = this.calculateDiversityScore(results);
177
+ score += Math.min(diversityScore / minDiversity, 1) * weights.diversity;
178
+ if (diversityScore < minDiversity) {
179
+ reasons.push(`Low diversity: ${diversityScore.toFixed(2)}/${minDiversity}`);
180
+ }
181
+ else {
182
+ reasons.push(`Good diversity: ${diversityScore.toFixed(2)}`);
183
+ }
184
+ // 3. Relevance score (average combined score)
185
+ const avgRelevance = results.length > 0
186
+ ? results.reduce((sum, r) => sum + r.scores.combined, 0) / results.length
187
+ : 0;
188
+ const relevanceScore = Math.min(avgRelevance / minRelevance, 1);
189
+ score += relevanceScore * weights.relevance;
190
+ if (avgRelevance < minRelevance) {
191
+ reasons.push(`Low relevance: ${avgRelevance.toFixed(2)}/${minRelevance}`);
192
+ }
193
+ else {
194
+ reasons.push(`Good relevance: ${avgRelevance.toFixed(2)}`);
195
+ }
196
+ // 4. Coverage score (how many layers contributed)
197
+ const contributingLayers = this.getContributingLayers(results);
198
+ const coverageScore = contributingLayers.length / executedLayers.length;
199
+ score += coverageScore * weights.coverage;
200
+ if (coverageScore < 0.5) {
201
+ reasons.push(`Low layer coverage: ${contributingLayers.length}/${executedLayers.length}`);
202
+ }
203
+ else {
204
+ reasons.push(`Good layer coverage: ${contributingLayers.length}/${executedLayers.length}`);
205
+ }
206
+ // Bonus for matching required info types (if analysis provided)
207
+ if (analysis && analysis.requiredInfoTypes.length > 0) {
208
+ const entityTypes = new Set(results.map(r => r.entity.entityType.toLowerCase()));
209
+ const matchedTypes = analysis.requiredInfoTypes.filter(t => entityTypes.has(t) ||
210
+ (t === 'person' && entityTypes.has('person')) ||
211
+ (t === 'entity' && entityTypes.size > 0));
212
+ const typeMatchScore = matchedTypes.length / analysis.requiredInfoTypes.length;
213
+ score += typeMatchScore * 0.1; // Bonus weight
214
+ reasons.push(`Info type coverage: ${matchedTypes.length}/${analysis.requiredInfoTypes.length}`);
215
+ }
216
+ // Normalize score
217
+ score = Math.min(score, 1);
218
+ return {
219
+ adequate: score >= adequacyThreshold,
220
+ score,
221
+ reasons,
222
+ contributingLayers,
223
+ };
224
+ }
225
+ /**
226
+ * Calculate diversity score from results.
227
+ * @private
228
+ */
229
+ calculateDiversityScore(results) {
230
+ if (results.length === 0)
231
+ return 0;
232
+ // Type diversity
233
+ const entityTypes = new Set(results.map(r => r.entity.entityType));
234
+ const typeDiversity = Math.min(entityTypes.size / 3, 1);
235
+ // Layer diversity
236
+ const layerCounts = { semantic: 0, lexical: 0, symbolic: 0 };
237
+ for (const result of results) {
238
+ for (const layer of result.matchedLayers) {
239
+ layerCounts[layer]++;
240
+ }
241
+ }
242
+ const activeLayers = Object.values(layerCounts).filter(c => c > 0).length;
243
+ const layerDiversity = activeLayers / 3;
244
+ // Combined diversity
245
+ return (typeDiversity + layerDiversity) / 2;
246
+ }
247
+ /**
248
+ * Get layers that contributed to results.
249
+ * @private
250
+ */
251
+ getContributingLayers(results) {
252
+ const layers = new Set();
253
+ for (const result of results) {
254
+ for (const layer of result.matchedLayers) {
255
+ layers.add(layer);
256
+ }
257
+ }
258
+ return Array.from(layers);
259
+ }
260
+ /**
261
+ * Calculate adequacy score for a set of results.
262
+ *
263
+ * Standalone method for checking result adequacy without full search.
264
+ *
265
+ * @param results - Results to evaluate
266
+ * @param options - Adequacy options
267
+ * @returns Adequacy score (0-1)
268
+ */
269
+ calculateAdequacyScore(results, options = {}) {
270
+ const allLayers = ['semantic', 'lexical', 'symbolic'];
271
+ return this.checkAdequacy(results, options, allLayers).score;
272
+ }
273
+ /**
274
+ * Get the cost estimator for external use.
275
+ */
276
+ getCostEstimator() {
277
+ return this.costEstimator;
278
+ }
279
+ }
280
+ //# sourceMappingURL=EarlyTerminationManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EarlyTerminationManager.js","sourceRoot":"","sources":["../../src/search/EarlyTerminationManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Embedding Cache
3
+ *
4
+ * Phase 12 Sprint 5: LRU cache for embedding vectors with hit/miss tracking,
5
+ * auto-invalidation on text hash changes, and TTL support.
6
+ *
7
+ * @module search/EmbeddingCache
8
+ */
9
+ /**
10
+ * Statistics for the embedding cache.
11
+ */
12
+ export interface EmbeddingCacheStats {
13
+ /** Number of entries in the cache */
14
+ size: number;
15
+ /** Estimated memory usage in bytes */
16
+ memoryBytes: number;
17
+ /** Cache hit rate (0-1) */
18
+ hitRate: number;
19
+ /** Total cache hits */
20
+ hits: number;
21
+ /** Total cache misses */
22
+ misses: number;
23
+ }
24
+ /**
25
+ * Options for EmbeddingCache.
26
+ */
27
+ export interface EmbeddingCacheOptions {
28
+ /** Maximum number of entries in the cache (default: 1000) */
29
+ maxSize?: number;
30
+ /** Time-to-live in milliseconds (default: 3600000 = 1 hour) */
31
+ ttlMs?: number;
32
+ /** Dimensions of embedding vectors for memory estimation (default: 384) */
33
+ dimensions?: number;
34
+ }
35
+ /**
36
+ * Default cache options.
37
+ */
38
+ export declare const DEFAULT_EMBEDDING_CACHE_OPTIONS: Required<EmbeddingCacheOptions>;
39
+ /**
40
+ * LRU cache for embedding vectors with hit/miss tracking.
41
+ *
42
+ * Features:
43
+ * - LRU eviction when max size is reached
44
+ * - Text hash-based invalidation (detects stale entries)
45
+ * - TTL support for automatic expiration
46
+ * - Hit/miss statistics tracking
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const cache = new EmbeddingCache({ maxSize: 500, ttlMs: 60000 });
51
+ *
52
+ * // Cache an embedding
53
+ * cache.set('entity1', 'Original text content', [0.1, 0.2, ...]);
54
+ *
55
+ * // Retrieve from cache
56
+ * const result = cache.get('entity1', 'Original text content');
57
+ * if (result) {
58
+ * console.log('Cache hit!', result);
59
+ * }
60
+ *
61
+ * // Check stats
62
+ * console.log(cache.getStats()); // { size, memoryBytes, hitRate, hits, misses }
63
+ * ```
64
+ */
65
+ export declare class EmbeddingCache {
66
+ private cache;
67
+ private options;
68
+ private hits;
69
+ private misses;
70
+ /**
71
+ * Create a new embedding cache.
72
+ *
73
+ * @param options - Cache configuration options
74
+ */
75
+ constructor(options?: EmbeddingCacheOptions);
76
+ /**
77
+ * Hash a text string for cache invalidation.
78
+ *
79
+ * @param text - Text to hash
80
+ * @returns MD5 hash of the text
81
+ */
82
+ private hashText;
83
+ /**
84
+ * Check if an entry is expired based on TTL.
85
+ *
86
+ * @param entry - Cache entry to check
87
+ * @returns True if expired
88
+ */
89
+ private isExpired;
90
+ /**
91
+ * Evict the least recently used entry.
92
+ */
93
+ private evictLRU;
94
+ /**
95
+ * Get an embedding from the cache.
96
+ *
97
+ * Returns null if:
98
+ * - Key not found
99
+ * - Entry is expired (TTL)
100
+ * - Text hash doesn't match (content changed)
101
+ *
102
+ * @param key - Cache key (typically entity name)
103
+ * @param text - Current text content (for hash validation)
104
+ * @returns Embedding vector if found and valid, null otherwise
105
+ */
106
+ get(key: string, text: string): number[] | null;
107
+ /**
108
+ * Set an embedding in the cache.
109
+ *
110
+ * Automatically evicts LRU entries if max size is reached.
111
+ *
112
+ * @param key - Cache key (typically entity name)
113
+ * @param text - Text content (used for hash-based invalidation)
114
+ * @param vector - Embedding vector to cache
115
+ */
116
+ set(key: string, text: string, vector: number[]): void;
117
+ /**
118
+ * Check if a key exists in the cache (without affecting hit/miss stats).
119
+ *
120
+ * @param key - Cache key to check
121
+ * @returns True if key exists (may be expired or stale)
122
+ */
123
+ has(key: string): boolean;
124
+ /**
125
+ * Delete an entry from the cache.
126
+ *
127
+ * @param key - Cache key to delete
128
+ * @returns True if entry was deleted
129
+ */
130
+ delete(key: string): boolean;
131
+ /**
132
+ * Clear all entries from the cache.
133
+ */
134
+ clear(): void;
135
+ /**
136
+ * Get cache statistics.
137
+ *
138
+ * @returns Cache statistics including size, memory usage, and hit rate
139
+ */
140
+ getStats(): EmbeddingCacheStats;
141
+ /**
142
+ * Reset hit/miss statistics (useful for benchmarks).
143
+ */
144
+ resetStats(): void;
145
+ /**
146
+ * Remove expired entries from the cache.
147
+ *
148
+ * Called automatically during get operations, but can be
149
+ * manually triggered for maintenance.
150
+ *
151
+ * @returns Number of entries removed
152
+ */
153
+ pruneExpired(): number;
154
+ /**
155
+ * Get the current cache size.
156
+ *
157
+ * @returns Number of entries in the cache
158
+ */
159
+ size(): number;
160
+ /**
161
+ * Get all cached keys.
162
+ *
163
+ * @returns Array of cache keys
164
+ */
165
+ keys(): string[];
166
+ /**
167
+ * Update options dynamically.
168
+ *
169
+ * Note: Reducing maxSize will not immediately evict entries.
170
+ *
171
+ * @param options - New options to apply
172
+ */
173
+ updateOptions(options: Partial<EmbeddingCacheOptions>): void;
174
+ }
175
+ //# sourceMappingURL=EmbeddingCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingCache.d.ts","sourceRoot":"","sources":["../../src/search/EmbeddingCache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CAAC,qBAAqB,CAI3E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAE3B;;;;OAIG;gBACS,OAAO,CAAC,EAAE,qBAAqB;IAK3C;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAgBhB;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IA8B/C;;;;;;;;OAQG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAetD;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,QAAQ,IAAI,mBAAmB;IAmB/B;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;;;;OAOG;IACH,YAAY,IAAI,MAAM;IAWtB;;;;OAIG;IACH,IAAI,IAAI,MAAM;IAId;;;;OAIG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;;;;;OAMG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;CAG7D"}