@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,454 @@
1
+ /**
2
+ * Search Manager
3
+ *
4
+ * Orchestrates all search types (basic, ranked, boolean, fuzzy).
5
+ * Focused on search operations only (Phase 4: Consolidate God Objects).
6
+ *
7
+ * @module search/SearchManager
8
+ */
9
+ import { BasicSearch } from './BasicSearch.js';
10
+ import { RankedSearch } from './RankedSearch.js';
11
+ import { BooleanSearch } from './BooleanSearch.js';
12
+ import { FuzzySearch } from './FuzzySearch.js';
13
+ import { SearchSuggestions } from './SearchSuggestions.js';
14
+ import { SavedSearchManager } from './SavedSearchManager.js';
15
+ import { QueryCostEstimator } from './QueryCostEstimator.js';
16
+ /**
17
+ * Unified search manager providing access to all search types.
18
+ *
19
+ * Phase 4 Sprint 5: Manages search caches across all search types.
20
+ */
21
+ export class SearchManager {
22
+ basicSearch;
23
+ rankedSearch;
24
+ booleanSearcher;
25
+ fuzzySearcher;
26
+ searchSuggestions;
27
+ savedSearchManager;
28
+ storage;
29
+ queryEstimator;
30
+ constructor(storage, savedSearchesFilePath) {
31
+ this.storage = storage;
32
+ this.basicSearch = new BasicSearch(storage);
33
+ this.rankedSearch = new RankedSearch(storage);
34
+ this.booleanSearcher = new BooleanSearch(storage);
35
+ this.fuzzySearcher = new FuzzySearch(storage);
36
+ this.searchSuggestions = new SearchSuggestions(storage);
37
+ this.savedSearchManager = new SavedSearchManager(savedSearchesFilePath, this.basicSearch);
38
+ this.queryEstimator = new QueryCostEstimator();
39
+ }
40
+ // ==================== Cache Management (Phase 4 Sprint 5) ====================
41
+ /**
42
+ * Phase 4 Sprint 5: Clear all search caches.
43
+ *
44
+ * Clears caches in all search types: fuzzy, boolean, and ranked token cache.
45
+ * Call this when the graph has been modified to ensure fresh results.
46
+ */
47
+ clearAllCaches() {
48
+ this.fuzzySearcher.clearCache();
49
+ this.booleanSearcher.clearCache();
50
+ this.rankedSearch.clearTokenCache();
51
+ }
52
+ /**
53
+ * Phase 4 Sprint 5: Clear fuzzy search cache.
54
+ */
55
+ clearFuzzyCache() {
56
+ this.fuzzySearcher.clearCache();
57
+ }
58
+ /**
59
+ * Phase 4 Sprint 5: Clear boolean search cache.
60
+ */
61
+ clearBooleanCache() {
62
+ this.booleanSearcher.clearCache();
63
+ }
64
+ /**
65
+ * Phase 4 Sprint 5: Clear ranked search token cache.
66
+ */
67
+ clearRankedCache() {
68
+ this.rankedSearch.clearTokenCache();
69
+ }
70
+ // ==================== Basic Search ====================
71
+ /**
72
+ * Perform a simple text-based search across entity names and observations.
73
+ *
74
+ * This is the primary search method that searches through entity names,
75
+ * observations, and types using case-insensitive substring matching.
76
+ * Optionally filter by tags and importance range.
77
+ *
78
+ * @param query - Text to search for (case-insensitive, searches names/observations/types)
79
+ * @param tags - Optional array of tags to filter results (lowercase)
80
+ * @param minImportance - Optional minimum importance value (0-10)
81
+ * @param maxImportance - Optional maximum importance value (0-10)
82
+ * @returns KnowledgeGraph containing matching entities and their relations
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const manager = new SearchManager(storage, savedSearchesPath);
87
+ *
88
+ * // Simple text search
89
+ * const results = await manager.searchNodes('Alice');
90
+ *
91
+ * // Search with tag filter
92
+ * const engineeringResults = await manager.searchNodes('project', ['engineering']);
93
+ *
94
+ * // Search with importance range
95
+ * const importantResults = await manager.searchNodes('critical', undefined, 8, 10);
96
+ *
97
+ * // Combined filters
98
+ * const filtered = await manager.searchNodes('bug', ['backend'], 5, 10);
99
+ * ```
100
+ */
101
+ async searchNodes(query, tags, minImportance, maxImportance) {
102
+ return this.basicSearch.searchNodes(query, tags, minImportance, maxImportance);
103
+ }
104
+ /**
105
+ * Open specific nodes by name.
106
+ *
107
+ * @param names - Array of entity names
108
+ * @returns Knowledge graph with specified entities
109
+ */
110
+ async openNodes(names) {
111
+ return this.basicSearch.openNodes(names);
112
+ }
113
+ /**
114
+ * Search by date range.
115
+ *
116
+ * @param startDate - Optional start date (ISO 8601)
117
+ * @param endDate - Optional end date (ISO 8601)
118
+ * @param entityType - Optional entity type filter
119
+ * @param tags - Optional tags filter
120
+ * @returns Filtered knowledge graph
121
+ */
122
+ async searchByDateRange(startDate, endDate, entityType, tags) {
123
+ return this.basicSearch.searchByDateRange(startDate, endDate, entityType, tags);
124
+ }
125
+ // ==================== Ranked Search ====================
126
+ /**
127
+ * Perform TF-IDF ranked search with relevance scoring.
128
+ *
129
+ * Uses Term Frequency-Inverse Document Frequency algorithm to rank results
130
+ * by relevance to the query. Results are sorted by score (highest first).
131
+ * This is ideal for finding the most relevant entities for a search query.
132
+ *
133
+ * @param query - Search query (analyzed for term frequency)
134
+ * @param tags - Optional array of tags to filter results (lowercase)
135
+ * @param minImportance - Optional minimum importance value (0-10)
136
+ * @param maxImportance - Optional maximum importance value (0-10)
137
+ * @param limit - Maximum number of results to return (default: 50, max: 200)
138
+ * @returns Array of SearchResult objects sorted by relevance score (descending)
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const manager = new SearchManager(storage, savedSearchesPath);
143
+ *
144
+ * // Basic ranked search
145
+ * const results = await manager.searchNodesRanked('machine learning algorithms');
146
+ * results.forEach(r => {
147
+ * console.log(`${r.entity.name} (score: ${r.score})`);
148
+ * });
149
+ *
150
+ * // Limit to top 10 most relevant results
151
+ * const top10 = await manager.searchNodesRanked('database optimization', undefined, undefined, undefined, 10);
152
+ *
153
+ * // Ranked search with filters
154
+ * const relevantImportant = await manager.searchNodesRanked(
155
+ * 'security vulnerability',
156
+ * ['security', 'critical'],
157
+ * 8,
158
+ * 10,
159
+ * 20
160
+ * );
161
+ * ```
162
+ */
163
+ async searchNodesRanked(query, tags, minImportance, maxImportance, limit) {
164
+ return this.rankedSearch.searchNodesRanked(query, tags, minImportance, maxImportance, limit);
165
+ }
166
+ // ==================== Boolean Search ====================
167
+ /**
168
+ * Perform boolean search with AND, OR, NOT operators.
169
+ *
170
+ * Supports complex boolean logic for precise search queries.
171
+ * Use AND/OR/NOT operators (case-insensitive) to combine search terms.
172
+ * Parentheses are supported for grouping.
173
+ *
174
+ * @param query - Boolean query string (e.g., "alice AND bob", "frontend OR backend NOT legacy")
175
+ * @param tags - Optional array of tags to filter results (lowercase)
176
+ * @param minImportance - Optional minimum importance value (0-10)
177
+ * @param maxImportance - Optional maximum importance value (0-10)
178
+ * @returns KnowledgeGraph containing entities matching the boolean expression
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const manager = new SearchManager(storage, savedSearchesPath);
183
+ *
184
+ * // AND operator - entities matching all terms
185
+ * const both = await manager.booleanSearch('database AND performance');
186
+ *
187
+ * // OR operator - entities matching any term
188
+ * const either = await manager.booleanSearch('frontend OR backend');
189
+ *
190
+ * // NOT operator - exclude terms
191
+ * const excluding = await manager.booleanSearch('API NOT deprecated');
192
+ *
193
+ * // Complex queries with grouping
194
+ * const complex = await manager.booleanSearch('(react OR vue) AND (component OR hook) NOT legacy');
195
+ * ```
196
+ */
197
+ async booleanSearch(query, tags, minImportance, maxImportance) {
198
+ return this.booleanSearcher.booleanSearch(query, tags, minImportance, maxImportance);
199
+ }
200
+ // ==================== Fuzzy Search ====================
201
+ /**
202
+ * Perform fuzzy search with typo tolerance.
203
+ *
204
+ * Uses Levenshtein distance to find entities that approximately match the query,
205
+ * making it ideal for handling typos and variations in spelling.
206
+ * Higher threshold values require closer matches.
207
+ *
208
+ * @param query - Search query (will match approximate spellings)
209
+ * @param threshold - Similarity threshold from 0.0 (very lenient) to 1.0 (exact match). Default: 0.7
210
+ * @param tags - Optional array of tags to filter results (lowercase)
211
+ * @param minImportance - Optional minimum importance value (0-10)
212
+ * @param maxImportance - Optional maximum importance value (0-10)
213
+ * @returns KnowledgeGraph containing entities with similar names/observations
214
+ *
215
+ * @example
216
+ * ```typescript
217
+ * const manager = new SearchManager(storage, savedSearchesPath);
218
+ *
219
+ * // Find entities even with typos
220
+ * const results = await manager.fuzzySearch('databse'); // Will match "database"
221
+ *
222
+ * // Adjust threshold for strictness
223
+ * const strict = await manager.fuzzySearch('optmization', 0.9); // Requires very close match
224
+ * const lenient = await manager.fuzzySearch('optmization', 0.6); // More tolerant of differences
225
+ *
226
+ * // Fuzzy search with filters
227
+ * const filtered = await manager.fuzzySearch('secrity', 0.7, ['important'], 7, 10);
228
+ * ```
229
+ */
230
+ async fuzzySearch(query, threshold, tags, minImportance, maxImportance) {
231
+ return this.fuzzySearcher.fuzzySearch(query, threshold, tags, minImportance, maxImportance);
232
+ }
233
+ // ==================== Search Suggestions ====================
234
+ /**
235
+ * Get search suggestions for a query.
236
+ *
237
+ * @param query - Search query
238
+ * @param maxSuggestions - Maximum suggestions to return
239
+ * @returns Array of suggested terms
240
+ */
241
+ async getSearchSuggestions(query, maxSuggestions) {
242
+ return this.searchSuggestions.getSearchSuggestions(query, maxSuggestions);
243
+ }
244
+ // ==================== Saved Searches ====================
245
+ /**
246
+ * Save a search query for later reuse.
247
+ *
248
+ * Saved searches store query parameters and can be re-executed later.
249
+ * The system tracks usage count and last used timestamp automatically.
250
+ *
251
+ * @param search - Search parameters (name, query, and optional filters)
252
+ * @returns Newly created SavedSearch object with metadata
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * const manager = new SearchManager(storage, savedSearchesPath);
257
+ *
258
+ * // Save a simple search
259
+ * const saved = await manager.saveSearch({
260
+ * name: 'High Priority Bugs',
261
+ * query: 'bug',
262
+ * tags: ['critical'],
263
+ * minImportance: 8
264
+ * });
265
+ *
266
+ * // Save a complex search
267
+ * await manager.saveSearch({
268
+ * name: 'Recent Frontend Work',
269
+ * query: 'component OR hook',
270
+ * tags: ['frontend', 'react'],
271
+ * searchType: 'boolean'
272
+ * });
273
+ * ```
274
+ */
275
+ async saveSearch(search) {
276
+ return this.savedSearchManager.saveSearch(search);
277
+ }
278
+ /**
279
+ * List all saved searches.
280
+ *
281
+ * @returns Array of saved searches
282
+ */
283
+ async listSavedSearches() {
284
+ return this.savedSearchManager.listSavedSearches();
285
+ }
286
+ /**
287
+ * Get a saved search by name.
288
+ *
289
+ * @param name - Search name
290
+ * @returns Saved search or null
291
+ */
292
+ async getSavedSearch(name) {
293
+ return this.savedSearchManager.getSavedSearch(name);
294
+ }
295
+ /**
296
+ * Execute a saved search by name.
297
+ *
298
+ * Runs a previously saved search with its stored parameters.
299
+ * Automatically updates the search's useCount and lastUsed timestamp.
300
+ *
301
+ * @param name - The unique name of the saved search to execute
302
+ * @returns KnowledgeGraph containing the search results
303
+ * @throws Error if saved search not found
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * const manager = new SearchManager(storage, savedSearchesPath);
308
+ *
309
+ * // Execute a saved search
310
+ * const results = await manager.executeSavedSearch('High Priority Bugs');
311
+ * console.log(`Found ${results.entities.length} high priority bugs`);
312
+ *
313
+ * // Handle missing saved search
314
+ * try {
315
+ * await manager.executeSavedSearch('NonExistent');
316
+ * } catch (error) {
317
+ * console.error('Search not found');
318
+ * }
319
+ * ```
320
+ */
321
+ async executeSavedSearch(name) {
322
+ return this.savedSearchManager.executeSavedSearch(name);
323
+ }
324
+ /**
325
+ * Delete a saved search.
326
+ *
327
+ * @param name - Search name
328
+ * @returns True if deleted
329
+ */
330
+ async deleteSavedSearch(name) {
331
+ return this.savedSearchManager.deleteSavedSearch(name);
332
+ }
333
+ /**
334
+ * Update a saved search.
335
+ *
336
+ * @param name - Search name
337
+ * @param updates - Fields to update
338
+ * @returns Updated saved search
339
+ */
340
+ async updateSavedSearch(name, updates) {
341
+ return this.savedSearchManager.updateSavedSearch(name, updates);
342
+ }
343
+ // ==================== Phase 10 Sprint 4: Automatic Search ====================
344
+ /**
345
+ * Phase 10 Sprint 4: Automatically select and execute the best search method.
346
+ *
347
+ * Analyzes the query and graph size to determine the optimal search method,
348
+ * then executes it and returns both the results and the selection reasoning.
349
+ *
350
+ * @param query - The search query
351
+ * @param limit - Maximum number of results (default: 10)
352
+ * @returns AutoSearchResult with selected method, results, and estimates
353
+ *
354
+ * @example
355
+ * ```typescript
356
+ * const manager = new SearchManager(storage, savedSearchesPath);
357
+ *
358
+ * // Let the system choose the best search method
359
+ * const result = await manager.autoSearch('software engineer skills');
360
+ *
361
+ * console.log(`Used ${result.selectedMethod} because: ${result.selectionReason}`);
362
+ * console.log(`Found ${result.results.length} results in ${result.executionTimeMs}ms`);
363
+ * ```
364
+ */
365
+ async autoSearch(query, limit = 10) {
366
+ const startTime = Date.now();
367
+ // Get entity count from graph
368
+ const graph = await this.storage.loadGraph();
369
+ const entityCount = graph.entities.length;
370
+ // Get cost estimates for all methods
371
+ const estimates = this.queryEstimator.estimateAllMethods(query, entityCount);
372
+ // Get the recommended method
373
+ const recommendation = this.queryEstimator.recommendMethod(query, entityCount);
374
+ const selectedMethod = recommendation.method;
375
+ const selectionReason = recommendation.reason;
376
+ // Execute the selected search method
377
+ let results;
378
+ switch (selectedMethod) {
379
+ case 'basic': {
380
+ const basicResult = await this.basicSearch.searchNodes(query);
381
+ results = basicResult.entities.map((e, idx) => ({
382
+ entity: e,
383
+ score: 1.0 - idx * 0.01, // Rank by position
384
+ matchedFields: { name: true, observations: e.observations },
385
+ }));
386
+ break;
387
+ }
388
+ case 'ranked': {
389
+ results = await this.rankedSearch.searchNodesRanked(query, undefined, undefined, undefined, limit);
390
+ break;
391
+ }
392
+ case 'boolean': {
393
+ const booleanResult = await this.booleanSearcher.booleanSearch(query);
394
+ results = booleanResult.entities.map((e, idx) => ({
395
+ entity: e,
396
+ score: 1.0 - idx * 0.01, // Rank by position
397
+ matchedFields: { name: true, observations: e.observations },
398
+ }));
399
+ break;
400
+ }
401
+ case 'fuzzy': {
402
+ const fuzzyResult = await this.fuzzySearcher.fuzzySearch(query);
403
+ results = fuzzyResult.entities.map((e, idx) => ({
404
+ entity: e,
405
+ score: 1.0 - idx * 0.01, // Rank by position
406
+ matchedFields: { name: true, observations: e.observations },
407
+ }));
408
+ break;
409
+ }
410
+ case 'semantic': {
411
+ // Semantic search not available through SearchManager
412
+ // Fall back to ranked search
413
+ results = await this.rankedSearch.searchNodesRanked(query, undefined, undefined, undefined, limit);
414
+ break;
415
+ }
416
+ default: {
417
+ const _exhaustiveCheck = selectedMethod;
418
+ throw new Error(`Unknown search method: ${_exhaustiveCheck}`);
419
+ }
420
+ }
421
+ // Limit results
422
+ const limitedResults = results.slice(0, limit);
423
+ return {
424
+ selectedMethod,
425
+ selectionReason,
426
+ estimates,
427
+ results: limitedResults,
428
+ executionTimeMs: Date.now() - startTime,
429
+ };
430
+ }
431
+ /**
432
+ * Phase 10 Sprint 4: Get cost estimates for all search methods.
433
+ *
434
+ * Useful for clients that want to display cost information or
435
+ * make their own method selection decisions.
436
+ *
437
+ * @param query - The search query
438
+ * @returns Array of cost estimates for all methods
439
+ */
440
+ async getSearchCostEstimates(query) {
441
+ const graph = await this.storage.loadGraph();
442
+ const entityCount = graph.entities.length;
443
+ return this.queryEstimator.estimateAllMethods(query, entityCount);
444
+ }
445
+ /**
446
+ * Phase 10 Sprint 4: Get the query cost estimator instance.
447
+ *
448
+ * @returns The QueryCostEstimator instance
449
+ */
450
+ getQueryEstimator() {
451
+ return this.queryEstimator;
452
+ }
453
+ }
454
+ //# sourceMappingURL=SearchManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchManager.js","sourceRoot":"","sources":["../../src/search/SearchManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Search Suggestions
3
+ *
4
+ * Provides "did you mean?" suggestions using Levenshtein distance.
5
+ *
6
+ * @module search/SearchSuggestions
7
+ */
8
+ import type { GraphStorage } from '../core/GraphStorage.js';
9
+ /**
10
+ * Generates search suggestions based on entity names and types.
11
+ */
12
+ export declare class SearchSuggestions {
13
+ private storage;
14
+ constructor(storage: GraphStorage);
15
+ /**
16
+ * Get "did you mean?" suggestions for a query.
17
+ *
18
+ * Returns similar entity names and types that might be what the user intended.
19
+ * Excludes exact matches (similarity < 1.0) and very dissimilar strings (similarity > 0.5).
20
+ *
21
+ * @param query - The search query
22
+ * @param maxSuggestions - Maximum number of suggestions to return (default 5)
23
+ * @returns Array of suggested entity/type names sorted by similarity
24
+ */
25
+ getSearchSuggestions(query: string, maxSuggestions?: number): Promise<string[]>;
26
+ }
27
+ //# sourceMappingURL=SearchSuggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchSuggestions.d.ts","sourceRoot":"","sources":["../../src/search/SearchSuggestions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAW5D;;GAEG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAEzC;;;;;;;;;OASG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAoCzF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Search Suggestions
3
+ *
4
+ * Provides "did you mean?" suggestions using Levenshtein distance.
5
+ *
6
+ * @module search/SearchSuggestions
7
+ */
8
+ import { levenshteinDistance } from '../utils/index.js';
9
+ /**
10
+ * Generates search suggestions based on entity names and types.
11
+ */
12
+ export class SearchSuggestions {
13
+ storage;
14
+ constructor(storage) {
15
+ this.storage = storage;
16
+ }
17
+ /**
18
+ * Get "did you mean?" suggestions for a query.
19
+ *
20
+ * Returns similar entity names and types that might be what the user intended.
21
+ * Excludes exact matches (similarity < 1.0) and very dissimilar strings (similarity > 0.5).
22
+ *
23
+ * @param query - The search query
24
+ * @param maxSuggestions - Maximum number of suggestions to return (default 5)
25
+ * @returns Array of suggested entity/type names sorted by similarity
26
+ */
27
+ async getSearchSuggestions(query, maxSuggestions = 5) {
28
+ const graph = await this.storage.loadGraph();
29
+ const queryLower = query.toLowerCase();
30
+ const suggestions = [];
31
+ // Check entity names
32
+ for (const entity of graph.entities) {
33
+ const distance = levenshteinDistance(queryLower, entity.name.toLowerCase());
34
+ const maxLength = Math.max(queryLower.length, entity.name.length);
35
+ const similarity = 1 - distance / maxLength;
36
+ if (similarity > 0.5 && similarity < 1.0) {
37
+ // Not exact match but similar
38
+ suggestions.push({ text: entity.name, similarity });
39
+ }
40
+ }
41
+ // Check entity types
42
+ const uniqueTypes = [...new Set(graph.entities.map(e => e.entityType))];
43
+ for (const type of uniqueTypes) {
44
+ const distance = levenshteinDistance(queryLower, type.toLowerCase());
45
+ const maxLength = Math.max(queryLower.length, type.length);
46
+ const similarity = 1 - distance / maxLength;
47
+ if (similarity > 0.5 && similarity < 1.0) {
48
+ suggestions.push({ text: type, similarity });
49
+ }
50
+ }
51
+ // Sort by similarity and return top suggestions
52
+ return suggestions
53
+ .sort((a, b) => b.similarity - a.similarity)
54
+ .slice(0, maxSuggestions)
55
+ .map(s => s.text);
56
+ }
57
+ }
58
+ //# sourceMappingURL=SearchSuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchSuggestions.js","sourceRoot":"","sources":["../../src/search/SearchSuggestions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAUxD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;IAAG,CAAC;IAE7C;;;;;;;;;OASG;IACH,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,iBAAyB,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,qBAAqB;QACrB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;YAE5C,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;gBACzC,8BAA8B;gBAC9B,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;YAE5C,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;gBACzC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,OAAO,WAAW;aACf,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;CACF"}