@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,308 @@
1
+ /**
2
+ * Quantized Vector Store
3
+ *
4
+ * Phase 12 Sprint 6: 8-bit scalar quantization for 4x vector memory reduction.
5
+ * Uses asymmetric similarity computation for improved accuracy.
6
+ *
7
+ * @module search/QuantizedVectorStore
8
+ */
9
+ const DEFAULT_OPTIONS = {
10
+ asymmetric: true,
11
+ minVectorsForQuantization: 100,
12
+ trackAccuracy: false,
13
+ };
14
+ /**
15
+ * Quantized Vector Store with 8-bit scalar quantization.
16
+ *
17
+ * Provides 4x memory reduction while maintaining >95% accuracy
18
+ * using asymmetric similarity computation.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const store = new QuantizedVectorStore();
23
+ *
24
+ * // Add vectors
25
+ * store.add('entity1', [0.1, 0.2, 0.3, ...]);
26
+ * store.add('entity2', [0.4, 0.5, 0.6, ...]);
27
+ *
28
+ * // Search
29
+ * const results = store.search([0.15, 0.25, 0.35, ...], 10);
30
+ *
31
+ * // Get stats
32
+ * const stats = store.getStats();
33
+ * console.log(`Memory reduction: ${stats.memoryReductionRatio}x`);
34
+ * ```
35
+ */
36
+ export class QuantizedVectorStore {
37
+ fullPrecisionVectors;
38
+ quantizedVectors;
39
+ quantizationParams = null;
40
+ options;
41
+ isQuantized = false;
42
+ quantizationErrors = [];
43
+ constructor(options) {
44
+ this.options = { ...DEFAULT_OPTIONS, ...options };
45
+ this.fullPrecisionVectors = new Map();
46
+ this.quantizedVectors = new Map();
47
+ }
48
+ /**
49
+ * Add a vector to the store.
50
+ *
51
+ * @param id - Entity identifier
52
+ * @param vector - Float vector (any dimension, must be consistent)
53
+ */
54
+ add(id, vector) {
55
+ const float32 = new Float32Array(vector);
56
+ this.fullPrecisionVectors.set(id, float32);
57
+ // Check if we should quantize
58
+ if (!this.isQuantized &&
59
+ this.fullPrecisionVectors.size >= this.options.minVectorsForQuantization) {
60
+ this.quantize();
61
+ }
62
+ else if (this.isQuantized) {
63
+ // Add to quantized store
64
+ const quantized = this.quantizeVector(float32);
65
+ this.quantizedVectors.set(id, quantized);
66
+ // Track error if enabled
67
+ if (this.options.trackAccuracy) {
68
+ const reconstructed = this.dequantizeVector(quantized);
69
+ this.quantizationErrors.push(this.computeError(float32, reconstructed));
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Remove a vector from the store.
75
+ *
76
+ * @param id - Entity identifier
77
+ * @returns True if vector was removed
78
+ */
79
+ remove(id) {
80
+ const existed = this.fullPrecisionVectors.delete(id);
81
+ this.quantizedVectors.delete(id);
82
+ return existed;
83
+ }
84
+ /**
85
+ * Check if a vector exists.
86
+ *
87
+ * @param id - Entity identifier
88
+ */
89
+ has(id) {
90
+ return this.fullPrecisionVectors.has(id);
91
+ }
92
+ /**
93
+ * Get a vector (dequantized if necessary).
94
+ *
95
+ * @param id - Entity identifier
96
+ * @returns Vector or undefined
97
+ */
98
+ get(id) {
99
+ const vector = this.fullPrecisionVectors.get(id);
100
+ return vector ? Array.from(vector) : undefined;
101
+ }
102
+ /**
103
+ * Search for similar vectors.
104
+ *
105
+ * @param query - Query vector
106
+ * @param k - Number of results to return
107
+ * @returns Top k similar vectors with scores
108
+ */
109
+ search(query, k) {
110
+ const queryVector = new Float32Array(query);
111
+ const results = [];
112
+ if (this.isQuantized && this.options.asymmetric) {
113
+ // Asymmetric search: query in full precision, stored vectors quantized
114
+ for (const [id, quantized] of this.quantizedVectors) {
115
+ const reconstructed = this.dequantizeVector(quantized);
116
+ const similarity = this.cosineSimilarity(queryVector, reconstructed);
117
+ results.push({ id, similarity, quantized: true });
118
+ }
119
+ }
120
+ else {
121
+ // Full precision search
122
+ for (const [id, vector] of this.fullPrecisionVectors) {
123
+ const similarity = this.cosineSimilarity(queryVector, vector);
124
+ results.push({ id, similarity, quantized: false });
125
+ }
126
+ }
127
+ // Sort by similarity descending and take top k
128
+ return results
129
+ .sort((a, b) => b.similarity - a.similarity)
130
+ .slice(0, k);
131
+ }
132
+ /**
133
+ * Compute similarity between a query and specific entity.
134
+ *
135
+ * @param query - Query vector
136
+ * @param id - Entity identifier
137
+ * @returns Similarity score or undefined if not found
138
+ */
139
+ computeSimilarity(query, id) {
140
+ const queryVector = new Float32Array(query);
141
+ if (this.isQuantized && this.options.asymmetric) {
142
+ const quantized = this.quantizedVectors.get(id);
143
+ if (!quantized)
144
+ return undefined;
145
+ const reconstructed = this.dequantizeVector(quantized);
146
+ return this.cosineSimilarity(queryVector, reconstructed);
147
+ }
148
+ else {
149
+ const vector = this.fullPrecisionVectors.get(id);
150
+ if (!vector)
151
+ return undefined;
152
+ return this.cosineSimilarity(queryVector, vector);
153
+ }
154
+ }
155
+ /**
156
+ * Force quantization of all vectors.
157
+ */
158
+ quantize() {
159
+ if (this.fullPrecisionVectors.size === 0)
160
+ return;
161
+ // Compute quantization parameters
162
+ this.quantizationParams = this.computeQuantizationParams();
163
+ this.isQuantized = true;
164
+ // Quantize all vectors
165
+ this.quantizedVectors.clear();
166
+ for (const [id, vector] of this.fullPrecisionVectors) {
167
+ const quantized = this.quantizeVector(vector);
168
+ this.quantizedVectors.set(id, quantized);
169
+ // Track error if enabled
170
+ if (this.options.trackAccuracy) {
171
+ const reconstructed = this.dequantizeVector(quantized);
172
+ this.quantizationErrors.push(this.computeError(vector, reconstructed));
173
+ }
174
+ }
175
+ }
176
+ /**
177
+ * Get store statistics.
178
+ */
179
+ getStats() {
180
+ const vectorCount = this.fullPrecisionVectors.size;
181
+ const dimension = this.quantizationParams?.dimension ??
182
+ (vectorCount > 0 ? this.fullPrecisionVectors.values().next().value.length : 0);
183
+ const fullPrecisionBytes = vectorCount * dimension * 4; // Float32
184
+ const quantizedBytes = vectorCount * dimension * 1; // Uint8
185
+ const avgQuantizationError = this.quantizationErrors.length > 0
186
+ ? this.quantizationErrors.reduce((a, b) => a + b, 0) / this.quantizationErrors.length
187
+ : 0;
188
+ return {
189
+ vectorCount,
190
+ dimension,
191
+ fullPrecisionBytes,
192
+ quantizedBytes,
193
+ memoryReductionRatio: fullPrecisionBytes > 0 ? fullPrecisionBytes / quantizedBytes : 1,
194
+ avgQuantizationError,
195
+ };
196
+ }
197
+ /**
198
+ * Check if store is currently using quantization.
199
+ */
200
+ isUsingQuantization() {
201
+ return this.isQuantized;
202
+ }
203
+ /**
204
+ * Get the number of stored vectors.
205
+ */
206
+ size() {
207
+ return this.fullPrecisionVectors.size;
208
+ }
209
+ /**
210
+ * Clear all vectors from the store.
211
+ */
212
+ clear() {
213
+ this.fullPrecisionVectors.clear();
214
+ this.quantizedVectors.clear();
215
+ this.quantizationParams = null;
216
+ this.isQuantized = false;
217
+ this.quantizationErrors = [];
218
+ }
219
+ /**
220
+ * Export all vectors.
221
+ */
222
+ export() {
223
+ const result = new Map();
224
+ for (const [id, vector] of this.fullPrecisionVectors) {
225
+ result.set(id, Array.from(vector));
226
+ }
227
+ return result;
228
+ }
229
+ /**
230
+ * Import vectors from a map.
231
+ *
232
+ * @param vectors - Map of id to vector
233
+ * @param quantize - Whether to quantize after import
234
+ */
235
+ import(vectors, quantize = true) {
236
+ for (const [id, vector] of vectors) {
237
+ const float32 = new Float32Array(vector);
238
+ this.fullPrecisionVectors.set(id, float32);
239
+ }
240
+ if (quantize && this.fullPrecisionVectors.size >= this.options.minVectorsForQuantization) {
241
+ this.quantize();
242
+ }
243
+ }
244
+ // Private methods
245
+ computeQuantizationParams() {
246
+ let min = Infinity;
247
+ let max = -Infinity;
248
+ let dimension = 0;
249
+ for (const vector of this.fullPrecisionVectors.values()) {
250
+ dimension = vector.length;
251
+ for (let i = 0; i < vector.length; i++) {
252
+ if (vector[i] < min)
253
+ min = vector[i];
254
+ if (vector[i] > max)
255
+ max = vector[i];
256
+ }
257
+ }
258
+ const scale = (max - min) / 255;
259
+ return { min, max, scale, dimension };
260
+ }
261
+ quantizeVector(vector) {
262
+ if (!this.quantizationParams) {
263
+ throw new Error('Quantization params not initialized');
264
+ }
265
+ const { min, scale } = this.quantizationParams;
266
+ const quantized = new Uint8Array(vector.length);
267
+ for (let i = 0; i < vector.length; i++) {
268
+ // Clamp to 0-255 range
269
+ const normalized = (vector[i] - min) / scale;
270
+ quantized[i] = Math.max(0, Math.min(255, Math.round(normalized)));
271
+ }
272
+ return quantized;
273
+ }
274
+ dequantizeVector(quantized) {
275
+ if (!this.quantizationParams) {
276
+ throw new Error('Quantization params not initialized');
277
+ }
278
+ const { min, scale } = this.quantizationParams;
279
+ const vector = new Float32Array(quantized.length);
280
+ for (let i = 0; i < quantized.length; i++) {
281
+ vector[i] = quantized[i] * scale + min;
282
+ }
283
+ return vector;
284
+ }
285
+ cosineSimilarity(a, b) {
286
+ if (a.length !== b.length)
287
+ return 0;
288
+ let dotProduct = 0;
289
+ let normA = 0;
290
+ let normB = 0;
291
+ for (let i = 0; i < a.length; i++) {
292
+ dotProduct += a[i] * b[i];
293
+ normA += a[i] * a[i];
294
+ normB += b[i] * b[i];
295
+ }
296
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
297
+ return denominator === 0 ? 0 : dotProduct / denominator;
298
+ }
299
+ computeError(original, reconstructed) {
300
+ let sumSquaredError = 0;
301
+ for (let i = 0; i < original.length; i++) {
302
+ const diff = original[i] - reconstructed[i];
303
+ sumSquaredError += diff * diff;
304
+ }
305
+ return Math.sqrt(sumSquaredError / original.length);
306
+ }
307
+ }
308
+ //# sourceMappingURL=QuantizedVectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuantizedVectorStore.js","sourceRoot":"","sources":["../../src/search/QuantizedVectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Query Analyzer
3
+ *
4
+ * Phase 11: Extracts structured information from natural language queries
5
+ * to enable intelligent search planning.
6
+ *
7
+ * @module search/QueryAnalyzer
8
+ */
9
+ import type { QueryAnalysis } from '../types/index.js';
10
+ /**
11
+ * Query Analyzer extracts structured information from queries.
12
+ *
13
+ * Uses rule-based heuristics for reliable extraction of:
14
+ * - Person names
15
+ * - Location names
16
+ * - Organization names
17
+ * - Temporal references
18
+ * - Question type
19
+ * - Query complexity
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const analyzer = new QueryAnalyzer();
24
+ * const analysis = analyzer.analyze(
25
+ * 'What projects did Alice work on last month?'
26
+ * );
27
+ * // { query: '...', entities: [...], persons: ['Alice'], temporalRange: { relative: 'last month' }, ... }
28
+ * ```
29
+ */
30
+ export declare class QueryAnalyzer {
31
+ private personIndicators;
32
+ private temporalKeywords;
33
+ private questionKeywords;
34
+ /**
35
+ * Analyze a query using rule-based heuristics.
36
+ * Main entry point - returns full QueryAnalysis.
37
+ */
38
+ analyze(query: string): QueryAnalysis;
39
+ /**
40
+ * Calculate confidence score for the analysis.
41
+ */
42
+ private calculateConfidence;
43
+ /**
44
+ * Extract person names from query.
45
+ */
46
+ private extractPersons;
47
+ /**
48
+ * Extract location names from query.
49
+ */
50
+ private extractLocations;
51
+ /**
52
+ * Extract organization names from query.
53
+ */
54
+ private extractOrganizations;
55
+ /**
56
+ * Extract temporal range from query.
57
+ */
58
+ private extractTemporalRange;
59
+ /**
60
+ * Detect the type of question.
61
+ */
62
+ private detectQuestionType;
63
+ /**
64
+ * Estimate query complexity.
65
+ */
66
+ private estimateComplexity;
67
+ /**
68
+ * Detect what types of information are being requested.
69
+ */
70
+ private detectRequiredInfoTypes;
71
+ /**
72
+ * Decompose complex queries into sub-queries.
73
+ */
74
+ private decomposeQuery;
75
+ }
76
+ //# sourceMappingURL=QueryAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryAnalyzer.d.ts","sourceRoot":"","sources":["../../src/search/QueryAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAkC,MAAM,mBAAmB,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,gBAAgB,CAKtB;IACF,OAAO,CAAC,gBAAgB,CAOtB;IAEF;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAiCrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,cAAc;CAYvB"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Query Analyzer
3
+ *
4
+ * Phase 11: Extracts structured information from natural language queries
5
+ * to enable intelligent search planning.
6
+ *
7
+ * @module search/QueryAnalyzer
8
+ */
9
+ /**
10
+ * Query Analyzer extracts structured information from queries.
11
+ *
12
+ * Uses rule-based heuristics for reliable extraction of:
13
+ * - Person names
14
+ * - Location names
15
+ * - Organization names
16
+ * - Temporal references
17
+ * - Question type
18
+ * - Query complexity
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const analyzer = new QueryAnalyzer();
23
+ * const analysis = analyzer.analyze(
24
+ * 'What projects did Alice work on last month?'
25
+ * );
26
+ * // { query: '...', entities: [...], persons: ['Alice'], temporalRange: { relative: 'last month' }, ... }
27
+ * ```
28
+ */
29
+ export class QueryAnalyzer {
30
+ personIndicators = ['Mr.', 'Mrs.', 'Ms.', 'Dr.', 'Prof.'];
31
+ temporalKeywords = [
32
+ 'yesterday', 'today', 'tomorrow',
33
+ 'last week', 'last month', 'last year',
34
+ 'this week', 'this month', 'this year',
35
+ 'next week', 'next month', 'next year',
36
+ ];
37
+ questionKeywords = {
38
+ factual: ['what', 'who', 'where', 'which'],
39
+ temporal: ['when', 'how long', 'since', 'until'],
40
+ comparative: ['compare', 'difference', 'vs', 'versus', 'better', 'worse'],
41
+ aggregation: ['how many', 'count', 'total', 'sum', 'average'],
42
+ 'multi-hop': ['and then', 'which means', 'therefore', 'related to'],
43
+ conceptual: ['explain', 'why', 'how does', 'what is the meaning', 'understand'],
44
+ };
45
+ /**
46
+ * Analyze a query using rule-based heuristics.
47
+ * Main entry point - returns full QueryAnalysis.
48
+ */
49
+ analyze(query) {
50
+ const lowerQuery = query.toLowerCase();
51
+ const persons = this.extractPersons(query);
52
+ const locations = this.extractLocations(query);
53
+ const organizations = this.extractOrganizations(query);
54
+ const questionType = this.detectQuestionType(lowerQuery);
55
+ const complexity = this.estimateComplexity(query);
56
+ // Build entities array from extracted names
57
+ const entities = [
58
+ ...persons.map(name => ({ name, type: 'person' })),
59
+ ...locations.map(name => ({ name, type: 'location' })),
60
+ ...organizations.map(name => ({ name, type: 'organization' })),
61
+ ];
62
+ // Calculate confidence based on extraction quality
63
+ const confidence = this.calculateConfidence(entities, complexity, questionType);
64
+ return {
65
+ query,
66
+ entities,
67
+ persons,
68
+ locations,
69
+ organizations,
70
+ temporalRange: this.extractTemporalRange(query) ?? null,
71
+ questionType,
72
+ complexity,
73
+ confidence,
74
+ requiredInfoTypes: this.detectRequiredInfoTypes(lowerQuery),
75
+ subQueries: this.decomposeQuery(query),
76
+ };
77
+ }
78
+ /**
79
+ * Calculate confidence score for the analysis.
80
+ */
81
+ calculateConfidence(entities, complexity, questionType) {
82
+ let confidence = 0.5;
83
+ // Higher confidence for simple queries
84
+ if (complexity === 'low')
85
+ confidence += 0.3;
86
+ else if (complexity === 'medium')
87
+ confidence += 0.1;
88
+ // Higher confidence when entities are detected
89
+ if (entities.length > 0)
90
+ confidence += 0.1;
91
+ // Lower confidence for conceptual queries (harder to satisfy)
92
+ if (questionType === 'conceptual')
93
+ confidence -= 0.2;
94
+ return Math.max(0, Math.min(1, confidence));
95
+ }
96
+ /**
97
+ * Extract person names from query.
98
+ */
99
+ extractPersons(query) {
100
+ const persons = [];
101
+ const words = query.split(/\s+/);
102
+ for (let i = 0; i < words.length; i++) {
103
+ const word = words[i];
104
+ // Check for titles followed by names
105
+ if (this.personIndicators.some(ind => word.startsWith(ind))) {
106
+ if (i + 1 < words.length) {
107
+ persons.push(words[i + 1].replace(/[^a-zA-Z]/g, ''));
108
+ }
109
+ }
110
+ // Check for capitalized words that might be names
111
+ if (/^[A-Z][a-z]+$/.test(word) && i > 0 && !/^[A-Z]/.test(words[i - 1])) {
112
+ persons.push(word);
113
+ }
114
+ }
115
+ return [...new Set(persons)];
116
+ }
117
+ /**
118
+ * Extract location names from query.
119
+ */
120
+ extractLocations(query) {
121
+ const locationIndicators = ['in', 'at', 'from', 'to', 'near'];
122
+ const locations = [];
123
+ const words = query.split(/\s+/);
124
+ for (let i = 0; i < words.length; i++) {
125
+ if (locationIndicators.includes(words[i].toLowerCase())) {
126
+ if (i + 1 < words.length && /^[A-Z]/.test(words[i + 1])) {
127
+ locations.push(words[i + 1].replace(/[^a-zA-Z]/g, ''));
128
+ }
129
+ }
130
+ }
131
+ return [...new Set(locations)];
132
+ }
133
+ /**
134
+ * Extract organization names from query.
135
+ */
136
+ extractOrganizations(query) {
137
+ const orgIndicators = ['Inc.', 'Corp.', 'LLC', 'Ltd.', 'Company', 'Co.'];
138
+ const organizations = [];
139
+ for (const indicator of orgIndicators) {
140
+ const regex = new RegExp(`([A-Z][a-zA-Z]*)\\s*${indicator.replace('.', '\\.')}`, 'g');
141
+ const matches = query.match(regex);
142
+ if (matches) {
143
+ organizations.push(...matches);
144
+ }
145
+ }
146
+ return [...new Set(organizations)];
147
+ }
148
+ /**
149
+ * Extract temporal range from query.
150
+ */
151
+ extractTemporalRange(query) {
152
+ const lowerQuery = query.toLowerCase();
153
+ for (const keyword of this.temporalKeywords) {
154
+ if (lowerQuery.includes(keyword)) {
155
+ return { relative: keyword };
156
+ }
157
+ }
158
+ // Check for date patterns
159
+ const datePattern = /\d{4}-\d{2}-\d{2}/g;
160
+ const dates = query.match(datePattern);
161
+ if (dates && dates.length >= 1) {
162
+ return {
163
+ start: dates[0],
164
+ end: dates.length > 1 ? dates[1] : undefined,
165
+ };
166
+ }
167
+ return undefined;
168
+ }
169
+ /**
170
+ * Detect the type of question.
171
+ */
172
+ detectQuestionType(query) {
173
+ for (const [type, keywords] of Object.entries(this.questionKeywords)) {
174
+ if (keywords.some(kw => query.includes(kw))) {
175
+ return type;
176
+ }
177
+ }
178
+ return 'factual';
179
+ }
180
+ /**
181
+ * Estimate query complexity.
182
+ */
183
+ estimateComplexity(query) {
184
+ const wordCount = query.split(/\s+/).length;
185
+ const hasConjunctions = /\b(and|or|but|then|therefore)\b/i.test(query);
186
+ const hasMultipleClauses = /[,;]/.test(query);
187
+ if (wordCount > 20 || (hasConjunctions && hasMultipleClauses)) {
188
+ return 'high';
189
+ }
190
+ if (wordCount > 10 || hasConjunctions || hasMultipleClauses) {
191
+ return 'medium';
192
+ }
193
+ return 'low';
194
+ }
195
+ /**
196
+ * Detect what types of information are being requested.
197
+ */
198
+ detectRequiredInfoTypes(query) {
199
+ const infoTypes = [];
200
+ if (/\b(who|person|people|name)\b/.test(query))
201
+ infoTypes.push('person');
202
+ if (/\b(where|location|place|city)\b/.test(query))
203
+ infoTypes.push('location');
204
+ if (/\b(when|date|time|year|month)\b/.test(query))
205
+ infoTypes.push('temporal');
206
+ if (/\b(how many|count|number|total)\b/.test(query))
207
+ infoTypes.push('quantity');
208
+ if (/\b(why|reason|because)\b/.test(query))
209
+ infoTypes.push('reason');
210
+ if (/\b(what|which|project|task)\b/.test(query))
211
+ infoTypes.push('entity');
212
+ return infoTypes;
213
+ }
214
+ /**
215
+ * Decompose complex queries into sub-queries.
216
+ */
217
+ decomposeQuery(query) {
218
+ // Split on conjunctions
219
+ const parts = query.split(/\b(and then|and|but|or)\b/i)
220
+ .map(p => p.trim())
221
+ .filter(p => p && !/^(and then|and|but|or)$/i.test(p));
222
+ if (parts.length > 1) {
223
+ return parts;
224
+ }
225
+ return undefined;
226
+ }
227
+ }
228
+ //# sourceMappingURL=QueryAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryAnalyzer.js","sourceRoot":"","sources":["../../src/search/QueryAnalyzer.ts"],"names":[],"mappings":"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"}