@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,138 @@
1
+ /**
2
+ * Query Planner
3
+ *
4
+ * Phase 11: Generates execution plans for queries based on analysis.
5
+ *
6
+ * @module search/QueryPlanner
7
+ */
8
+ /**
9
+ * Query Planner generates execution plans from query analysis.
10
+ *
11
+ * Creates optimized plans that:
12
+ * - Select appropriate search layers
13
+ * - Determine execution strategy (parallel/sequential)
14
+ * - Set up query dependencies
15
+ * - Configure merge strategies
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const analyzer = new QueryAnalyzer();
20
+ * const planner = new QueryPlanner();
21
+ *
22
+ * const analysis = analyzer.analyze('Find projects by Alice');
23
+ * const plan = planner.createPlan('Find projects by Alice', analysis);
24
+ * // { originalQuery: '...', subQueries: [...], executionStrategy: 'iterative', ... }
25
+ * ```
26
+ */
27
+ export class QueryPlanner {
28
+ /**
29
+ * Create an execution plan from query analysis.
30
+ */
31
+ createPlan(query, analysis) {
32
+ const subQueries = this.createSubQueries(query, analysis);
33
+ const executionStrategy = this.selectExecutionStrategy(subQueries);
34
+ const mergeStrategy = this.selectMergeStrategy(analysis);
35
+ return {
36
+ originalQuery: query,
37
+ subQueries,
38
+ executionStrategy,
39
+ mergeStrategy,
40
+ estimatedComplexity: this.calculateComplexity(subQueries),
41
+ };
42
+ }
43
+ /**
44
+ * Create sub-queries from analysis.
45
+ */
46
+ createSubQueries(query, analysis) {
47
+ const subQueries = [];
48
+ let id = 0;
49
+ // If query was decomposed, create sub-query for each part
50
+ if (analysis.subQueries && analysis.subQueries.length > 1) {
51
+ for (const sq of analysis.subQueries) {
52
+ subQueries.push({
53
+ id: `sq_${id++}`,
54
+ query: sq,
55
+ targetLayer: this.selectLayer(analysis),
56
+ priority: id === 1 ? 1 : 2,
57
+ dependsOn: id > 1 ? [`sq_${id - 2}`] : undefined,
58
+ });
59
+ }
60
+ }
61
+ else {
62
+ // Single query
63
+ subQueries.push({
64
+ id: `sq_${id}`,
65
+ query,
66
+ targetLayer: this.selectLayer(analysis),
67
+ priority: 1,
68
+ filters: this.buildFilters(analysis),
69
+ });
70
+ }
71
+ return subQueries;
72
+ }
73
+ /**
74
+ * Select the most appropriate search layer.
75
+ */
76
+ selectLayer(analysis) {
77
+ // Use symbolic for tag/type/date filtered queries
78
+ if (analysis.temporalRange || analysis.requiredInfoTypes.includes('temporal')) {
79
+ return 'symbolic';
80
+ }
81
+ // Use semantic for complex concept queries
82
+ if (analysis.complexity === 'high' || analysis.questionType === 'comparative') {
83
+ return 'semantic';
84
+ }
85
+ // Use hybrid for balanced approach
86
+ return 'hybrid';
87
+ }
88
+ /**
89
+ * Select execution strategy based on sub-queries.
90
+ */
91
+ selectExecutionStrategy(subQueries) {
92
+ const hasDependencies = subQueries.some(sq => sq.dependsOn && sq.dependsOn.length > 0);
93
+ if (hasDependencies)
94
+ return 'sequential';
95
+ if (subQueries.length > 1)
96
+ return 'parallel';
97
+ return 'iterative';
98
+ }
99
+ /**
100
+ * Select merge strategy based on question type.
101
+ */
102
+ selectMergeStrategy(analysis) {
103
+ switch (analysis.questionType) {
104
+ case 'aggregation': return 'union';
105
+ case 'comparative': return 'intersection';
106
+ default: return 'weighted';
107
+ }
108
+ }
109
+ /**
110
+ * Build symbolic filters from analysis.
111
+ */
112
+ buildFilters(analysis) {
113
+ const filters = {};
114
+ let hasFilters = false;
115
+ if (analysis.temporalRange) {
116
+ filters.dateRange = {
117
+ start: analysis.temporalRange.start || '',
118
+ end: analysis.temporalRange.end || '',
119
+ };
120
+ hasFilters = true;
121
+ }
122
+ return hasFilters ? filters : undefined;
123
+ }
124
+ /**
125
+ * Calculate plan complexity score.
126
+ */
127
+ calculateComplexity(subQueries) {
128
+ let complexity = subQueries.length;
129
+ for (const sq of subQueries) {
130
+ if (sq.dependsOn)
131
+ complexity += sq.dependsOn.length * 0.5;
132
+ if (sq.filters)
133
+ complexity += 0.5;
134
+ }
135
+ return Math.min(complexity, 10);
136
+ }
137
+ }
138
+ //# sourceMappingURL=QueryPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryPlanner.js","sourceRoot":"","sources":["../../src/search/QueryPlanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Ranked Search
3
+ *
4
+ * TF-IDF relevance-based search with scoring and pre-calculated indexes.
5
+ *
6
+ * @module search/RankedSearch
7
+ */
8
+ import type { SearchResult } from '../types/index.js';
9
+ import type { GraphStorage } from '../core/GraphStorage.js';
10
+ /**
11
+ * Performs TF-IDF ranked search with optional pre-calculated indexes.
12
+ */
13
+ export declare class RankedSearch {
14
+ private storage;
15
+ private indexManager;
16
+ /**
17
+ * Phase 4 Sprint 2: Fallback token cache for entities.
18
+ * Maps entity name -> pre-tokenized entity data.
19
+ * Invalidated when graph changes (detected by entity count mismatch).
20
+ */
21
+ private fallbackTokenCache;
22
+ private cachedEntityCount;
23
+ constructor(storage: GraphStorage, storageDir?: string);
24
+ /**
25
+ * Phase 4 Sprint 2: Clear the fallback token cache.
26
+ * Called when graph changes are detected or explicitly by external code.
27
+ */
28
+ clearTokenCache(): void;
29
+ /**
30
+ * Initialize and build the TF-IDF index for fast searches.
31
+ *
32
+ * Should be called after graph changes to keep index up-to-date.
33
+ */
34
+ buildIndex(): Promise<void>;
35
+ /**
36
+ * Update the index incrementally after entity changes.
37
+ *
38
+ * @param changedEntityNames - Names of entities that were created, updated, or deleted
39
+ */
40
+ updateIndex(changedEntityNames: Set<string>): Promise<void>;
41
+ /**
42
+ * Load the TF-IDF index from disk if available.
43
+ */
44
+ private ensureIndexLoaded;
45
+ /**
46
+ * Search with TF-IDF relevance ranking.
47
+ *
48
+ * Uses pre-calculated index if available, falls back to on-the-fly calculation.
49
+ *
50
+ * @param query - Search query
51
+ * @param tags - Optional tags filter
52
+ * @param minImportance - Optional minimum importance
53
+ * @param maxImportance - Optional maximum importance
54
+ * @param limit - Maximum results to return (default 50, max 200)
55
+ * @returns Array of search results sorted by relevance
56
+ */
57
+ searchNodesRanked(query: string, tags?: string[], minImportance?: number, maxImportance?: number, limit?: number): Promise<SearchResult[]>;
58
+ /**
59
+ * Search using pre-calculated TF-IDF index (fast path).
60
+ */
61
+ private searchWithIndex;
62
+ /**
63
+ * Search without index (on-the-fly calculation, slow path).
64
+ *
65
+ * OPTIMIZED: Phase 4 Sprint 2 - Uses fallback token cache to avoid
66
+ * repeated tokenization of entities. Pre-tokenizes all documents once
67
+ * and caches for subsequent searches.
68
+ */
69
+ private searchWithoutIndex;
70
+ }
71
+ //# sourceMappingURL=RankedSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RankedSearch.d.ts","sourceRoot":"","sources":["../../src/search/RankedSearch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAU,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAM5D;;GAEG;AACH,qBAAa,YAAY;IAYrB,OAAO,CAAC,OAAO;IAXjB,OAAO,CAAC,YAAY,CAAkC;IAEtD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAA2C;IACrE,OAAO,CAAC,iBAAiB,CAAa;gBAG5B,OAAO,EAAE,YAAY,EAC7B,UAAU,CAAC,EAAE,MAAM;IAQrB;;;OAGG;IACH,eAAe,IAAI,IAAI;IAKvB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;;OAIG;IACG,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;YACW,iBAAiB;IAe/B;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,KAAK,GAAE,MAA8B,GACpC,OAAO,CAAC,YAAY,EAAE,CAAC;IAsB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgEvB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAqF3B"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Ranked Search
3
+ *
4
+ * TF-IDF relevance-based search with scoring and pre-calculated indexes.
5
+ *
6
+ * @module search/RankedSearch
7
+ */
8
+ import { calculateTF, calculateIDFFromTokenSets, tokenize } from '../utils/index.js';
9
+ import { SEARCH_LIMITS } from '../utils/constants.js';
10
+ import { TFIDFIndexManager } from './TFIDFIndexManager.js';
11
+ import { SearchFilterChain } from './SearchFilterChain.js';
12
+ /**
13
+ * Performs TF-IDF ranked search with optional pre-calculated indexes.
14
+ */
15
+ export class RankedSearch {
16
+ storage;
17
+ indexManager = null;
18
+ /**
19
+ * Phase 4 Sprint 2: Fallback token cache for entities.
20
+ * Maps entity name -> pre-tokenized entity data.
21
+ * Invalidated when graph changes (detected by entity count mismatch).
22
+ */
23
+ fallbackTokenCache = new Map();
24
+ cachedEntityCount = 0;
25
+ constructor(storage, storageDir) {
26
+ this.storage = storage;
27
+ // Initialize index manager if storage directory is provided
28
+ if (storageDir) {
29
+ this.indexManager = new TFIDFIndexManager(storageDir);
30
+ }
31
+ }
32
+ /**
33
+ * Phase 4 Sprint 2: Clear the fallback token cache.
34
+ * Called when graph changes are detected or explicitly by external code.
35
+ */
36
+ clearTokenCache() {
37
+ this.fallbackTokenCache.clear();
38
+ this.cachedEntityCount = 0;
39
+ }
40
+ /**
41
+ * Initialize and build the TF-IDF index for fast searches.
42
+ *
43
+ * Should be called after graph changes to keep index up-to-date.
44
+ */
45
+ async buildIndex() {
46
+ if (!this.indexManager) {
47
+ throw new Error('Index manager not initialized. Provide storageDir to constructor.');
48
+ }
49
+ const graph = await this.storage.loadGraph();
50
+ await this.indexManager.buildIndex(graph);
51
+ await this.indexManager.saveIndex();
52
+ }
53
+ /**
54
+ * Update the index incrementally after entity changes.
55
+ *
56
+ * @param changedEntityNames - Names of entities that were created, updated, or deleted
57
+ */
58
+ async updateIndex(changedEntityNames) {
59
+ if (!this.indexManager) {
60
+ return; // No index manager, skip
61
+ }
62
+ const graph = await this.storage.loadGraph();
63
+ await this.indexManager.updateIndex(graph, changedEntityNames);
64
+ await this.indexManager.saveIndex();
65
+ }
66
+ /**
67
+ * Load the TF-IDF index from disk if available.
68
+ */
69
+ async ensureIndexLoaded() {
70
+ if (!this.indexManager) {
71
+ return null;
72
+ }
73
+ // Return cached index if already loaded
74
+ const cached = this.indexManager.getIndex();
75
+ if (cached) {
76
+ return cached;
77
+ }
78
+ // Try to load from disk
79
+ return await this.indexManager.loadIndex();
80
+ }
81
+ /**
82
+ * Search with TF-IDF relevance ranking.
83
+ *
84
+ * Uses pre-calculated index if available, falls back to on-the-fly calculation.
85
+ *
86
+ * @param query - Search query
87
+ * @param tags - Optional tags filter
88
+ * @param minImportance - Optional minimum importance
89
+ * @param maxImportance - Optional maximum importance
90
+ * @param limit - Maximum results to return (default 50, max 200)
91
+ * @returns Array of search results sorted by relevance
92
+ */
93
+ async searchNodesRanked(query, tags, minImportance, maxImportance, limit = SEARCH_LIMITS.DEFAULT) {
94
+ // Enforce maximum search limit
95
+ const effectiveLimit = Math.min(limit, SEARCH_LIMITS.MAX);
96
+ const graph = await this.storage.loadGraph();
97
+ // Apply tag and importance filters using SearchFilterChain
98
+ const filters = { tags, minImportance, maxImportance };
99
+ const filteredEntities = SearchFilterChain.applyFilters(graph.entities, filters);
100
+ // Try to use pre-calculated index
101
+ const index = await this.ensureIndexLoaded();
102
+ const queryTerms = tokenize(query);
103
+ if (index) {
104
+ // Use pre-calculated index for fast search
105
+ return this.searchWithIndex(filteredEntities, queryTerms, index, effectiveLimit);
106
+ }
107
+ else {
108
+ // Fall back to on-the-fly calculation
109
+ return this.searchWithoutIndex(filteredEntities, queryTerms, effectiveLimit);
110
+ }
111
+ }
112
+ /**
113
+ * Search using pre-calculated TF-IDF index (fast path).
114
+ */
115
+ searchWithIndex(entities, queryTerms, index, limit) {
116
+ const results = [];
117
+ for (const entity of entities) {
118
+ const docVector = index.documents.get(entity.name);
119
+ if (!docVector) {
120
+ continue; // Entity not in index
121
+ }
122
+ // Calculate total terms in document (sum of all term frequencies)
123
+ const totalTerms = Object.values(docVector.terms).reduce((sum, count) => sum + count, 0);
124
+ if (totalTerms === 0)
125
+ continue;
126
+ // Calculate score using pre-calculated term frequencies and IDF
127
+ let totalScore = 0;
128
+ const matchedFields = {};
129
+ for (const term of queryTerms) {
130
+ const termCount = docVector.terms[term] || 0;
131
+ const idf = index.idf.get(term) || 0;
132
+ // Calculate TF-IDF: (termCount / totalTerms) * IDF
133
+ const tf = termCount / totalTerms;
134
+ const tfidf = tf * idf;
135
+ totalScore += tfidf;
136
+ // Track which fields matched
137
+ if (termCount > 0) {
138
+ if (entity.name.toLowerCase().includes(term)) {
139
+ matchedFields.name = true;
140
+ }
141
+ if (entity.entityType.toLowerCase().includes(term)) {
142
+ matchedFields.entityType = true;
143
+ }
144
+ const matchedObs = entity.observations.filter(o => o.toLowerCase().includes(term));
145
+ if (matchedObs.length > 0) {
146
+ matchedFields.observations = matchedObs;
147
+ }
148
+ }
149
+ }
150
+ // Only include entities with non-zero scores
151
+ if (totalScore > 0) {
152
+ results.push({
153
+ entity,
154
+ score: totalScore,
155
+ matchedFields,
156
+ });
157
+ }
158
+ }
159
+ // Sort by score descending and apply limit
160
+ return results
161
+ .sort((a, b) => b.score - a.score)
162
+ .slice(0, limit);
163
+ }
164
+ /**
165
+ * Search without index (on-the-fly calculation, slow path).
166
+ *
167
+ * OPTIMIZED: Phase 4 Sprint 2 - Uses fallback token cache to avoid
168
+ * repeated tokenization of entities. Pre-tokenizes all documents once
169
+ * and caches for subsequent searches.
170
+ */
171
+ searchWithoutIndex(entities, queryTerms, limit) {
172
+ const results = [];
173
+ // Phase 4 Sprint 2: Check if cache needs invalidation
174
+ if (entities.length !== this.cachedEntityCount) {
175
+ this.clearTokenCache();
176
+ this.cachedEntityCount = entities.length;
177
+ }
178
+ // Phase 4 Sprint 2: Get or compute tokenized data for each entity
179
+ const documentData = entities.map(e => {
180
+ // Check cache first
181
+ const cached = this.fallbackTokenCache.get(e.name);
182
+ if (cached) {
183
+ return cached;
184
+ }
185
+ // Compute and cache tokenized data
186
+ const text = [e.name, e.entityType, ...e.observations].join(' ');
187
+ const tokens = tokenize(text);
188
+ const tokenized = {
189
+ entity: e,
190
+ text,
191
+ tokens,
192
+ tokenSet: new Set(tokens),
193
+ };
194
+ this.fallbackTokenCache.set(e.name, tokenized);
195
+ return tokenized;
196
+ });
197
+ // Pre-compute token sets for IDF calculation (O(1) lookup per document)
198
+ const tokenSets = documentData.map(d => d.tokenSet);
199
+ for (const docData of documentData) {
200
+ const { entity, text } = docData;
201
+ // Calculate score for each query term
202
+ let totalScore = 0;
203
+ const matchedFields = {};
204
+ for (const term of queryTerms) {
205
+ // Calculate TF using pre-tokenized tokens
206
+ const tf = calculateTF(term, text);
207
+ // Calculate IDF using pre-computed token sets (O(1) per document)
208
+ const idf = calculateIDFFromTokenSets(term, tokenSets);
209
+ // TF-IDF score
210
+ const score = tf * idf;
211
+ totalScore += score;
212
+ // Track which fields matched
213
+ if (entity.name.toLowerCase().includes(term)) {
214
+ matchedFields.name = true;
215
+ }
216
+ if (entity.entityType.toLowerCase().includes(term)) {
217
+ matchedFields.entityType = true;
218
+ }
219
+ const matchedObs = entity.observations.filter(o => o.toLowerCase().includes(term));
220
+ if (matchedObs.length > 0) {
221
+ matchedFields.observations = matchedObs;
222
+ }
223
+ }
224
+ // Only include entities with non-zero scores
225
+ if (totalScore > 0) {
226
+ results.push({
227
+ entity,
228
+ score: totalScore,
229
+ matchedFields,
230
+ });
231
+ }
232
+ }
233
+ // Sort by score descending and apply limit
234
+ return results
235
+ .sort((a, b) => b.score - a.score)
236
+ .slice(0, limit);
237
+ }
238
+ }
239
+ //# sourceMappingURL=RankedSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RankedSearch.js","sourceRoot":"","sources":["../../src/search/RankedSearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Reflection Manager
3
+ *
4
+ * Phase 11: Implements reflection-based iterative retrieval
5
+ * that refines results until adequate.
6
+ *
7
+ * @module search/ReflectionManager
8
+ */
9
+ import type { ReadonlyKnowledgeGraph, HybridSearchResult, HybridSearchOptions } from '../types/index.js';
10
+ import type { HybridSearchManager } from './HybridSearchManager.js';
11
+ import type { QueryAnalyzer } from './QueryAnalyzer.js';
12
+ /**
13
+ * Options for reflection-based retrieval.
14
+ */
15
+ export interface ReflectionOptions {
16
+ /** Maximum number of reflection iterations (default: 3) */
17
+ maxIterations?: number;
18
+ /** Adequacy threshold 0-1 (default: 0.7) */
19
+ adequacyThreshold?: number;
20
+ /** Minimum results required (default: 3) */
21
+ minResults?: number;
22
+ /** Hybrid search options */
23
+ searchOptions?: Partial<HybridSearchOptions>;
24
+ /** Phase 12 Sprint 4: Progressive limit increase factor (default: 1.5) */
25
+ limitIncreaseFactor?: number;
26
+ /** Phase 12 Sprint 4: Initial search limit (default: 10) */
27
+ initialLimit?: number;
28
+ /** Phase 12 Sprint 4: Focus on specific missing info types */
29
+ focusMissingTypes?: boolean;
30
+ }
31
+ /**
32
+ * Phase 12 Sprint 4: Refinement history entry.
33
+ */
34
+ export interface RefinementHistoryEntry {
35
+ /** Iteration number (1-based) */
36
+ iteration: number;
37
+ /** Query used in this iteration */
38
+ query: string;
39
+ /** Search limit used */
40
+ limit: number;
41
+ /** Results found in this iteration */
42
+ resultsFound: number;
43
+ /** Adequacy score after this iteration */
44
+ adequacyScore: number;
45
+ /** Reason for refinement (if not final) */
46
+ refinementReason?: string;
47
+ /** Missing info types that triggered refinement */
48
+ missingInfoTypes?: string[];
49
+ }
50
+ /**
51
+ * Result of reflection-based retrieval.
52
+ */
53
+ export interface ReflectionResult {
54
+ results: HybridSearchResult[];
55
+ iterations: number;
56
+ adequate: boolean;
57
+ refinements: string[];
58
+ adequacyScore: number;
59
+ /** Phase 12 Sprint 4: Detailed refinement history */
60
+ refinementHistory: RefinementHistoryEntry[];
61
+ /** Phase 12 Sprint 4: Final search limit used */
62
+ finalLimit: number;
63
+ }
64
+ /**
65
+ * Reflection Manager for iterative retrieval refinement.
66
+ *
67
+ * Implements the SimpleMem-inspired reflection loop:
68
+ * 1. Execute initial search
69
+ * 2. Check result adequacy
70
+ * 3. If inadequate, refine query and repeat
71
+ * 4. Combine results from all iterations
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const reflection = new ReflectionManager(hybridSearch, analyzer);
76
+ * const result = await reflection.retrieveWithReflection(
77
+ * graph,
78
+ * 'What projects did Alice work on?',
79
+ * { maxIterations: 3 }
80
+ * );
81
+ * ```
82
+ */
83
+ export declare class ReflectionManager {
84
+ private hybridSearch;
85
+ private analyzer;
86
+ constructor(hybridSearch: HybridSearchManager, analyzer: QueryAnalyzer);
87
+ /**
88
+ * Perform retrieval with reflection-based refinement.
89
+ *
90
+ * Phase 12 Sprint 4 enhancements:
91
+ * - Progressive limit increase per round
92
+ * - Focused query refinement based on missing information
93
+ * - Detailed refinement history tracking
94
+ */
95
+ retrieveWithReflection(graph: ReadonlyKnowledgeGraph, query: string, options?: ReflectionOptions): Promise<ReflectionResult>;
96
+ /**
97
+ * Find missing information types based on analysis requirements.
98
+ * @private
99
+ */
100
+ private findMissingInfoTypes;
101
+ /**
102
+ * Refine query with focus on missing information types.
103
+ * @private
104
+ */
105
+ private refineQueryFocused;
106
+ /**
107
+ * Get human-readable reason for refinement.
108
+ * @private
109
+ */
110
+ private getRefinementReason;
111
+ /**
112
+ * Calculate result adequacy score.
113
+ */
114
+ private calculateAdequacy;
115
+ /**
116
+ * Refine query based on current results and analysis.
117
+ */
118
+ private refineQuery;
119
+ }
120
+ //# sourceMappingURL=ReflectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReflectionManager.d.ts","sourceRoot":"","sources":["../../src/search/ReflectionManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAEtB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;gBADR,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,aAAa;IAGjC;;;;;;;OAOG;IACG,sBAAsB,CAC1B,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAwG5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,WAAW;CA6BpB"}