@framers/agentos 0.1.120 → 0.1.122

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 (436) hide show
  1. package/README.md +21 -0
  2. package/dist/api/agency.d.ts.map +1 -1
  3. package/dist/api/agency.js +227 -84
  4. package/dist/api/agency.js.map +1 -1
  5. package/dist/api/analyzeVideo.d.ts +127 -0
  6. package/dist/api/analyzeVideo.d.ts.map +1 -0
  7. package/dist/api/analyzeVideo.js +136 -0
  8. package/dist/api/analyzeVideo.js.map +1 -0
  9. package/dist/api/detectScenes.d.ts +82 -0
  10. package/dist/api/detectScenes.d.ts.map +1 -0
  11. package/dist/api/detectScenes.js +67 -0
  12. package/dist/api/detectScenes.js.map +1 -0
  13. package/dist/api/generateImage.d.ts +7 -0
  14. package/dist/api/generateImage.d.ts.map +1 -1
  15. package/dist/api/generateImage.js +133 -9
  16. package/dist/api/generateImage.js.map +1 -1
  17. package/dist/api/generateMusic.d.ts +98 -0
  18. package/dist/api/generateMusic.d.ts.map +1 -0
  19. package/dist/api/generateMusic.js +319 -0
  20. package/dist/api/generateMusic.js.map +1 -0
  21. package/dist/api/generateSFX.d.ts +96 -0
  22. package/dist/api/generateSFX.d.ts.map +1 -0
  23. package/dist/api/generateSFX.js +317 -0
  24. package/dist/api/generateSFX.js.map +1 -0
  25. package/dist/api/generateVideo.d.ts +113 -0
  26. package/dist/api/generateVideo.d.ts.map +1 -0
  27. package/dist/api/generateVideo.js +342 -0
  28. package/dist/api/generateVideo.js.map +1 -0
  29. package/dist/api/model.d.ts.map +1 -1
  30. package/dist/api/model.js +8 -4
  31. package/dist/api/model.js.map +1 -1
  32. package/dist/api/performOCR.d.ts +169 -0
  33. package/dist/api/performOCR.d.ts.map +1 -0
  34. package/dist/api/performOCR.js +198 -0
  35. package/dist/api/performOCR.js.map +1 -0
  36. package/dist/api/provider-defaults.d.ts +7 -5
  37. package/dist/api/provider-defaults.d.ts.map +1 -1
  38. package/dist/api/provider-defaults.js +32 -10
  39. package/dist/api/provider-defaults.js.map +1 -1
  40. package/dist/api/strategies/debate.d.ts.map +1 -1
  41. package/dist/api/strategies/debate.js +1 -0
  42. package/dist/api/strategies/debate.js.map +1 -1
  43. package/dist/api/strategies/graph.d.ts.map +1 -1
  44. package/dist/api/strategies/graph.js +69 -13
  45. package/dist/api/strategies/graph.js.map +1 -1
  46. package/dist/api/strategies/hierarchical.d.ts.map +1 -1
  47. package/dist/api/strategies/hierarchical.js +1 -0
  48. package/dist/api/strategies/hierarchical.js.map +1 -1
  49. package/dist/api/strategies/parallel.d.ts.map +1 -1
  50. package/dist/api/strategies/parallel.js +1 -0
  51. package/dist/api/strategies/parallel.js.map +1 -1
  52. package/dist/api/strategies/review-loop.d.ts.map +1 -1
  53. package/dist/api/strategies/review-loop.js +1 -0
  54. package/dist/api/strategies/review-loop.js.map +1 -1
  55. package/dist/api/strategies/sequential.d.ts.map +1 -1
  56. package/dist/api/strategies/sequential.js +54 -48
  57. package/dist/api/strategies/sequential.js.map +1 -1
  58. package/dist/api/streamBuffer.d.ts +20 -0
  59. package/dist/api/streamBuffer.d.ts.map +1 -0
  60. package/dist/api/streamBuffer.js +81 -0
  61. package/dist/api/streamBuffer.js.map +1 -0
  62. package/dist/api/types.d.ts +145 -5
  63. package/dist/api/types.d.ts.map +1 -1
  64. package/dist/api/types.js.map +1 -1
  65. package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -1
  66. package/dist/core/audio/AudioProcessor.d.ts.map +1 -1
  67. package/dist/core/audio/AudioProcessor.js +1 -0
  68. package/dist/core/audio/AudioProcessor.js.map +1 -1
  69. package/dist/core/audio/EnvironmentalCalibrator.d.ts.map +1 -1
  70. package/dist/core/audio/EnvironmentalCalibrator.js +1 -0
  71. package/dist/core/audio/EnvironmentalCalibrator.js.map +1 -1
  72. package/dist/core/audio/FallbackAudioProxy.d.ts +169 -0
  73. package/dist/core/audio/FallbackAudioProxy.d.ts.map +1 -0
  74. package/dist/core/audio/FallbackAudioProxy.js +236 -0
  75. package/dist/core/audio/FallbackAudioProxy.js.map +1 -0
  76. package/dist/core/audio/IAudioGenerator.d.ts +103 -0
  77. package/dist/core/audio/IAudioGenerator.d.ts.map +1 -0
  78. package/dist/core/audio/IAudioGenerator.js +24 -0
  79. package/dist/core/audio/IAudioGenerator.js.map +1 -0
  80. package/dist/core/audio/index.d.ts +54 -0
  81. package/dist/core/audio/index.d.ts.map +1 -1
  82. package/dist/core/audio/index.js +93 -0
  83. package/dist/core/audio/index.js.map +1 -1
  84. package/dist/core/audio/providers/AudioGenLocalProvider.d.ts +136 -0
  85. package/dist/core/audio/providers/AudioGenLocalProvider.d.ts.map +1 -0
  86. package/dist/core/audio/providers/AudioGenLocalProvider.js +235 -0
  87. package/dist/core/audio/providers/AudioGenLocalProvider.js.map +1 -0
  88. package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts +107 -0
  89. package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts.map +1 -0
  90. package/dist/core/audio/providers/ElevenLabsSFXProvider.js +154 -0
  91. package/dist/core/audio/providers/ElevenLabsSFXProvider.js.map +1 -0
  92. package/dist/core/audio/providers/FalAudioProvider.d.ts +207 -0
  93. package/dist/core/audio/providers/FalAudioProvider.d.ts.map +1 -0
  94. package/dist/core/audio/providers/FalAudioProvider.js +315 -0
  95. package/dist/core/audio/providers/FalAudioProvider.js.map +1 -0
  96. package/dist/core/audio/providers/MusicGenLocalProvider.d.ts +136 -0
  97. package/dist/core/audio/providers/MusicGenLocalProvider.d.ts.map +1 -0
  98. package/dist/core/audio/providers/MusicGenLocalProvider.js +235 -0
  99. package/dist/core/audio/providers/MusicGenLocalProvider.js.map +1 -0
  100. package/dist/core/audio/providers/ReplicateAudioProvider.d.ts +200 -0
  101. package/dist/core/audio/providers/ReplicateAudioProvider.d.ts.map +1 -0
  102. package/dist/core/audio/providers/ReplicateAudioProvider.js +346 -0
  103. package/dist/core/audio/providers/ReplicateAudioProvider.js.map +1 -0
  104. package/dist/core/audio/providers/StableAudioProvider.d.ts +138 -0
  105. package/dist/core/audio/providers/StableAudioProvider.d.ts.map +1 -0
  106. package/dist/core/audio/providers/StableAudioProvider.js +192 -0
  107. package/dist/core/audio/providers/StableAudioProvider.js.map +1 -0
  108. package/dist/core/audio/providers/SunoProvider.d.ts +182 -0
  109. package/dist/core/audio/providers/SunoProvider.d.ts.map +1 -0
  110. package/dist/core/audio/providers/SunoProvider.js +312 -0
  111. package/dist/core/audio/providers/SunoProvider.js.map +1 -0
  112. package/dist/core/audio/providers/UdioProvider.d.ts +177 -0
  113. package/dist/core/audio/providers/UdioProvider.d.ts.map +1 -0
  114. package/dist/core/audio/providers/UdioProvider.js +305 -0
  115. package/dist/core/audio/providers/UdioProvider.js.map +1 -0
  116. package/dist/core/audio/types.d.ts +257 -0
  117. package/dist/core/audio/types.d.ts.map +1 -0
  118. package/dist/core/audio/types.js +21 -0
  119. package/dist/core/audio/types.js.map +1 -0
  120. package/dist/core/images/FallbackImageProxy.d.ts +183 -0
  121. package/dist/core/images/FallbackImageProxy.d.ts.map +1 -0
  122. package/dist/core/images/FallbackImageProxy.js +283 -0
  123. package/dist/core/images/FallbackImageProxy.js.map +1 -0
  124. package/dist/core/images/IImageProvider.d.ts +1 -1
  125. package/dist/core/images/IImageProvider.d.ts.map +1 -1
  126. package/dist/core/images/index.d.ts +1 -0
  127. package/dist/core/images/index.d.ts.map +1 -1
  128. package/dist/core/images/index.js +1 -0
  129. package/dist/core/images/index.js.map +1 -1
  130. package/dist/core/llm/providers/AIModelProviderManager.d.ts +3 -1
  131. package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
  132. package/dist/core/llm/providers/AIModelProviderManager.js +8 -0
  133. package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
  134. package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts +52 -0
  135. package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts.map +1 -0
  136. package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js +36 -0
  137. package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js.map +1 -0
  138. package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts +32 -0
  139. package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts.map +1 -0
  140. package/dist/core/llm/providers/errors/GeminiCLIProviderError.js +27 -0
  141. package/dist/core/llm/providers/errors/GeminiCLIProviderError.js.map +1 -0
  142. package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts +38 -0
  143. package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts.map +1 -0
  144. package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js +128 -0
  145. package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js.map +1 -0
  146. package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts +107 -0
  147. package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts.map +1 -0
  148. package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js +504 -0
  149. package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js.map +1 -0
  150. package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts +60 -0
  151. package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts.map +1 -0
  152. package/dist/core/llm/providers/implementations/GeminiCLIBridge.js +177 -0
  153. package/dist/core/llm/providers/implementations/GeminiCLIBridge.js.map +1 -0
  154. package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts +55 -0
  155. package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts.map +1 -0
  156. package/dist/core/llm/providers/implementations/GeminiCLIProvider.js +447 -0
  157. package/dist/core/llm/providers/implementations/GeminiCLIProvider.js.map +1 -0
  158. package/dist/core/media/ProviderPreferences.d.ts +158 -0
  159. package/dist/core/media/ProviderPreferences.d.ts.map +1 -0
  160. package/dist/core/media/ProviderPreferences.js +183 -0
  161. package/dist/core/media/ProviderPreferences.js.map +1 -0
  162. package/dist/core/subprocess/CLIRegistry.d.ts +71 -0
  163. package/dist/core/subprocess/CLIRegistry.d.ts.map +1 -0
  164. package/dist/core/subprocess/CLIRegistry.js +210 -0
  165. package/dist/core/subprocess/CLIRegistry.js.map +1 -0
  166. package/dist/core/subprocess/CLISubprocessBridge.d.ts +117 -0
  167. package/dist/core/subprocess/CLISubprocessBridge.d.ts.map +1 -0
  168. package/dist/core/subprocess/CLISubprocessBridge.js +199 -0
  169. package/dist/core/subprocess/CLISubprocessBridge.js.map +1 -0
  170. package/dist/core/subprocess/errors.d.ts +76 -0
  171. package/dist/core/subprocess/errors.d.ts.map +1 -0
  172. package/dist/core/subprocess/errors.js +75 -0
  173. package/dist/core/subprocess/errors.js.map +1 -0
  174. package/dist/core/subprocess/index.d.ts +11 -0
  175. package/dist/core/subprocess/index.d.ts.map +1 -0
  176. package/dist/core/subprocess/index.js +10 -0
  177. package/dist/core/subprocess/index.js.map +1 -0
  178. package/dist/core/subprocess/types.d.ts +100 -0
  179. package/dist/core/subprocess/types.d.ts.map +1 -0
  180. package/dist/core/subprocess/types.js +9 -0
  181. package/dist/core/subprocess/types.js.map +1 -0
  182. package/dist/core/video/FallbackVideoProxy.d.ts +166 -0
  183. package/dist/core/video/FallbackVideoProxy.d.ts.map +1 -0
  184. package/dist/core/video/FallbackVideoProxy.js +228 -0
  185. package/dist/core/video/FallbackVideoProxy.js.map +1 -0
  186. package/dist/core/video/IVideoAnalyzer.d.ts +29 -0
  187. package/dist/core/video/IVideoAnalyzer.d.ts.map +1 -0
  188. package/dist/core/video/IVideoAnalyzer.js +12 -0
  189. package/dist/core/video/IVideoAnalyzer.js.map +1 -0
  190. package/dist/core/video/IVideoGenerator.d.ts +76 -0
  191. package/dist/core/video/IVideoGenerator.d.ts.map +1 -0
  192. package/dist/core/video/IVideoGenerator.js +13 -0
  193. package/dist/core/video/IVideoGenerator.js.map +1 -0
  194. package/dist/core/video/VideoAnalyzer.d.ts +278 -0
  195. package/dist/core/video/VideoAnalyzer.d.ts.map +1 -0
  196. package/dist/core/video/VideoAnalyzer.js +648 -0
  197. package/dist/core/video/VideoAnalyzer.js.map +1 -0
  198. package/dist/core/video/index.d.ts +55 -0
  199. package/dist/core/video/index.d.ts.map +1 -0
  200. package/dist/core/video/index.js +78 -0
  201. package/dist/core/video/index.js.map +1 -0
  202. package/dist/core/video/providers/FalVideoProvider.d.ts +195 -0
  203. package/dist/core/video/providers/FalVideoProvider.d.ts.map +1 -0
  204. package/dist/core/video/providers/FalVideoProvider.js +322 -0
  205. package/dist/core/video/providers/FalVideoProvider.js.map +1 -0
  206. package/dist/core/video/providers/ReplicateVideoProvider.d.ts +194 -0
  207. package/dist/core/video/providers/ReplicateVideoProvider.d.ts.map +1 -0
  208. package/dist/core/video/providers/ReplicateVideoProvider.js +356 -0
  209. package/dist/core/video/providers/ReplicateVideoProvider.js.map +1 -0
  210. package/dist/core/video/providers/RunwayVideoProvider.d.ts +175 -0
  211. package/dist/core/video/providers/RunwayVideoProvider.d.ts.map +1 -0
  212. package/dist/core/video/providers/RunwayVideoProvider.js +293 -0
  213. package/dist/core/video/providers/RunwayVideoProvider.js.map +1 -0
  214. package/dist/core/video/types.d.ts +441 -0
  215. package/dist/core/video/types.d.ts.map +1 -0
  216. package/dist/core/video/types.js +10 -0
  217. package/dist/core/video/types.js.map +1 -0
  218. package/dist/core/vision/SceneDetector.d.ts +180 -0
  219. package/dist/core/vision/SceneDetector.d.ts.map +1 -0
  220. package/dist/core/vision/SceneDetector.js +366 -0
  221. package/dist/core/vision/SceneDetector.js.map +1 -0
  222. package/dist/core/vision/index.d.ts +2 -1
  223. package/dist/core/vision/index.d.ts.map +1 -1
  224. package/dist/core/vision/index.js +1 -0
  225. package/dist/core/vision/index.js.map +1 -1
  226. package/dist/core/vision/types.d.ts +125 -0
  227. package/dist/core/vision/types.d.ts.map +1 -1
  228. package/dist/discovery/CapabilityDiscoveryEngine.d.ts +32 -0
  229. package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
  230. package/dist/discovery/CapabilityDiscoveryEngine.js +46 -0
  231. package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
  232. package/dist/emergent/AdaptPersonalityTool.d.ts +158 -0
  233. package/dist/emergent/AdaptPersonalityTool.d.ts.map +1 -0
  234. package/dist/emergent/AdaptPersonalityTool.js +190 -0
  235. package/dist/emergent/AdaptPersonalityTool.js.map +1 -0
  236. package/dist/emergent/CreateWorkflowTool.d.ts +181 -0
  237. package/dist/emergent/CreateWorkflowTool.d.ts.map +1 -0
  238. package/dist/emergent/CreateWorkflowTool.js +307 -0
  239. package/dist/emergent/CreateWorkflowTool.js.map +1 -0
  240. package/dist/emergent/ManageSkillsTool.d.ts +154 -0
  241. package/dist/emergent/ManageSkillsTool.d.ts.map +1 -0
  242. package/dist/emergent/ManageSkillsTool.js +241 -0
  243. package/dist/emergent/ManageSkillsTool.js.map +1 -0
  244. package/dist/emergent/PersonalityMutationStore.d.ts +183 -0
  245. package/dist/emergent/PersonalityMutationStore.d.ts.map +1 -0
  246. package/dist/emergent/PersonalityMutationStore.js +222 -0
  247. package/dist/emergent/PersonalityMutationStore.js.map +1 -0
  248. package/dist/emergent/SelfEvaluateTool.d.ts +189 -0
  249. package/dist/emergent/SelfEvaluateTool.d.ts.map +1 -0
  250. package/dist/emergent/SelfEvaluateTool.js +353 -0
  251. package/dist/emergent/SelfEvaluateTool.js.map +1 -0
  252. package/dist/emergent/SelfImprovementConfig.d.ts +166 -0
  253. package/dist/emergent/SelfImprovementConfig.d.ts.map +1 -0
  254. package/dist/emergent/SelfImprovementConfig.js +43 -0
  255. package/dist/emergent/SelfImprovementConfig.js.map +1 -0
  256. package/dist/emergent/index.d.ts +1 -0
  257. package/dist/emergent/index.d.ts.map +1 -1
  258. package/dist/emergent/index.js +1 -0
  259. package/dist/emergent/index.js.map +1 -1
  260. package/dist/emergent/types.d.ts +9 -0
  261. package/dist/emergent/types.d.ts.map +1 -1
  262. package/dist/emergent/types.js.map +1 -1
  263. package/dist/extensions/MultiRegistryLoader.js.map +1 -1
  264. package/dist/index.d.ts +17 -2
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +12 -0
  267. package/dist/index.js.map +1 -1
  268. package/dist/memory/CognitiveMemoryManager.d.ts +40 -0
  269. package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -1
  270. package/dist/memory/CognitiveMemoryManager.js +54 -1
  271. package/dist/memory/CognitiveMemoryManager.js.map +1 -1
  272. package/dist/memory/facade/Memory.d.ts +4 -0
  273. package/dist/memory/facade/Memory.d.ts.map +1 -1
  274. package/dist/memory/facade/Memory.js +140 -4
  275. package/dist/memory/facade/Memory.js.map +1 -1
  276. package/dist/memory/facade/types.d.ts +30 -2
  277. package/dist/memory/facade/types.d.ts.map +1 -1
  278. package/dist/memory/index.d.ts +1 -0
  279. package/dist/memory/index.d.ts.map +1 -1
  280. package/dist/memory/index.js +1 -0
  281. package/dist/memory/index.js.map +1 -1
  282. package/dist/memory/types.d.ts +15 -0
  283. package/dist/memory/types.d.ts.map +1 -1
  284. package/dist/query-router/QueryClassifier.d.ts +192 -21
  285. package/dist/query-router/QueryClassifier.d.ts.map +1 -1
  286. package/dist/query-router/QueryClassifier.js +604 -23
  287. package/dist/query-router/QueryClassifier.js.map +1 -1
  288. package/dist/query-router/QueryDispatcher.d.ts +106 -8
  289. package/dist/query-router/QueryDispatcher.d.ts.map +1 -1
  290. package/dist/query-router/QueryDispatcher.js +387 -8
  291. package/dist/query-router/QueryDispatcher.js.map +1 -1
  292. package/dist/query-router/QueryRouter.d.ts +198 -14
  293. package/dist/query-router/QueryRouter.d.ts.map +1 -1
  294. package/dist/query-router/QueryRouter.js +738 -50
  295. package/dist/query-router/QueryRouter.js.map +1 -1
  296. package/dist/query-router/index.d.ts +1 -1
  297. package/dist/query-router/index.d.ts.map +1 -1
  298. package/dist/query-router/index.js +1 -1
  299. package/dist/query-router/index.js.map +1 -1
  300. package/dist/query-router/types.d.ts +396 -3
  301. package/dist/query-router/types.d.ts.map +1 -1
  302. package/dist/query-router/types.js +35 -0
  303. package/dist/query-router/types.js.map +1 -1
  304. package/dist/rag/HydeRetriever.d.ts +108 -0
  305. package/dist/rag/HydeRetriever.d.ts.map +1 -1
  306. package/dist/rag/HydeRetriever.js +184 -0
  307. package/dist/rag/HydeRetriever.js.map +1 -1
  308. package/dist/rag/IRetrievalAugmentor.d.ts +15 -0
  309. package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -1
  310. package/dist/rag/RetrievalAugmentor.d.ts +58 -0
  311. package/dist/rag/RetrievalAugmentor.d.ts.map +1 -1
  312. package/dist/rag/RetrievalAugmentor.js +200 -32
  313. package/dist/rag/RetrievalAugmentor.js.map +1 -1
  314. package/dist/rag/VectorStoreManager.js +1 -1
  315. package/dist/rag/audit/RAGAuditCollector.d.ts +7 -0
  316. package/dist/rag/audit/RAGAuditCollector.d.ts.map +1 -1
  317. package/dist/rag/audit/RAGAuditCollector.js +10 -0
  318. package/dist/rag/audit/RAGAuditCollector.js.map +1 -1
  319. package/dist/rag/audit/RAGAuditTypes.d.ts +10 -1
  320. package/dist/rag/audit/RAGAuditTypes.d.ts.map +1 -1
  321. package/dist/rag/chunking/SemanticChunker.d.ts +210 -0
  322. package/dist/rag/chunking/SemanticChunker.d.ts.map +1 -0
  323. package/dist/rag/chunking/SemanticChunker.js +460 -0
  324. package/dist/rag/chunking/SemanticChunker.js.map +1 -0
  325. package/dist/rag/chunking/index.d.ts +10 -0
  326. package/dist/rag/chunking/index.d.ts.map +1 -0
  327. package/dist/rag/chunking/index.js +10 -0
  328. package/dist/rag/chunking/index.js.map +1 -0
  329. package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts +103 -0
  330. package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts.map +1 -0
  331. package/dist/rag/implementations/vector_stores/PineconeVectorStore.js +315 -0
  332. package/dist/rag/implementations/vector_stores/PineconeVectorStore.js.map +1 -0
  333. package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts +107 -0
  334. package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts.map +1 -0
  335. package/dist/rag/implementations/vector_stores/PostgresVectorStore.js +438 -0
  336. package/dist/rag/implementations/vector_stores/PostgresVectorStore.js.map +1 -0
  337. package/dist/rag/index.d.ts +15 -1
  338. package/dist/rag/index.d.ts.map +1 -1
  339. package/dist/rag/index.js +32 -0
  340. package/dist/rag/index.js.map +1 -1
  341. package/dist/rag/migration/MigrationEngine.d.ts +47 -0
  342. package/dist/rag/migration/MigrationEngine.d.ts.map +1 -0
  343. package/dist/rag/migration/MigrationEngine.js +168 -0
  344. package/dist/rag/migration/MigrationEngine.js.map +1 -0
  345. package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts +23 -0
  346. package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts.map +1 -0
  347. package/dist/rag/migration/adapters/PineconeSourceAdapter.js +63 -0
  348. package/dist/rag/migration/adapters/PineconeSourceAdapter.js.map +1 -0
  349. package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts +30 -0
  350. package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts.map +1 -0
  351. package/dist/rag/migration/adapters/PostgresSourceAdapter.js +71 -0
  352. package/dist/rag/migration/adapters/PostgresSourceAdapter.js.map +1 -0
  353. package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts +38 -0
  354. package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts.map +1 -0
  355. package/dist/rag/migration/adapters/PostgresTargetAdapter.js +114 -0
  356. package/dist/rag/migration/adapters/PostgresTargetAdapter.js.map +1 -0
  357. package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts +36 -0
  358. package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts.map +1 -0
  359. package/dist/rag/migration/adapters/QdrantSourceAdapter.js +109 -0
  360. package/dist/rag/migration/adapters/QdrantSourceAdapter.js.map +1 -0
  361. package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts +35 -0
  362. package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts.map +1 -0
  363. package/dist/rag/migration/adapters/QdrantTargetAdapter.js +110 -0
  364. package/dist/rag/migration/adapters/QdrantTargetAdapter.js.map +1 -0
  365. package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts +37 -0
  366. package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts.map +1 -0
  367. package/dist/rag/migration/adapters/SqliteSourceAdapter.js +72 -0
  368. package/dist/rag/migration/adapters/SqliteSourceAdapter.js.map +1 -0
  369. package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts +47 -0
  370. package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts.map +1 -0
  371. package/dist/rag/migration/adapters/SqliteTargetAdapter.js +93 -0
  372. package/dist/rag/migration/adapters/SqliteTargetAdapter.js.map +1 -0
  373. package/dist/rag/migration/types.d.ts +108 -0
  374. package/dist/rag/migration/types.d.ts.map +1 -0
  375. package/dist/rag/migration/types.js +11 -0
  376. package/dist/rag/migration/types.js.map +1 -0
  377. package/dist/rag/multimodal/MultimodalIndexer.d.ts +35 -0
  378. package/dist/rag/multimodal/MultimodalIndexer.d.ts.map +1 -1
  379. package/dist/rag/multimodal/MultimodalIndexer.js +66 -1
  380. package/dist/rag/multimodal/MultimodalIndexer.js.map +1 -1
  381. package/dist/rag/multimodal/types.d.ts +24 -0
  382. package/dist/rag/multimodal/types.d.ts.map +1 -1
  383. package/dist/rag/raptor/RaptorTree.d.ts +268 -0
  384. package/dist/rag/raptor/RaptorTree.d.ts.map +1 -0
  385. package/dist/rag/raptor/RaptorTree.js +443 -0
  386. package/dist/rag/raptor/RaptorTree.js.map +1 -0
  387. package/dist/rag/raptor/index.d.ts +11 -0
  388. package/dist/rag/raptor/index.d.ts.map +1 -0
  389. package/dist/rag/raptor/index.js +11 -0
  390. package/dist/rag/raptor/index.js.map +1 -0
  391. package/dist/rag/reranking/providers/CohereReranker.js.map +1 -1
  392. package/dist/rag/search/BM25Index.d.ts +282 -0
  393. package/dist/rag/search/BM25Index.d.ts.map +1 -0
  394. package/dist/rag/search/BM25Index.js +344 -0
  395. package/dist/rag/search/BM25Index.js.map +1 -0
  396. package/dist/rag/search/HybridSearcher.d.ts +198 -0
  397. package/dist/rag/search/HybridSearcher.d.ts.map +1 -0
  398. package/dist/rag/search/HybridSearcher.js +316 -0
  399. package/dist/rag/search/HybridSearcher.js.map +1 -0
  400. package/dist/rag/search/index.d.ts +12 -0
  401. package/dist/rag/search/index.d.ts.map +1 -0
  402. package/dist/rag/search/index.js +12 -0
  403. package/dist/rag/search/index.js.map +1 -0
  404. package/dist/rag/setup/DockerDetector.d.ts +67 -0
  405. package/dist/rag/setup/DockerDetector.d.ts.map +1 -0
  406. package/dist/rag/setup/DockerDetector.js +125 -0
  407. package/dist/rag/setup/DockerDetector.js.map +1 -0
  408. package/dist/rag/setup/PostgresSetup.d.ts +20 -0
  409. package/dist/rag/setup/PostgresSetup.d.ts.map +1 -0
  410. package/dist/rag/setup/PostgresSetup.js +133 -0
  411. package/dist/rag/setup/PostgresSetup.js.map +1 -0
  412. package/dist/rag/setup/QdrantSetup.d.ts +26 -0
  413. package/dist/rag/setup/QdrantSetup.d.ts.map +1 -0
  414. package/dist/rag/setup/QdrantSetup.js +96 -0
  415. package/dist/rag/setup/QdrantSetup.js.map +1 -0
  416. package/dist/rag/setup/types.d.ts +55 -0
  417. package/dist/rag/setup/types.d.ts.map +1 -0
  418. package/dist/rag/setup/types.js +6 -0
  419. package/dist/rag/setup/types.js.map +1 -0
  420. package/dist/rag/unified/UnifiedRetriever.d.ts +472 -0
  421. package/dist/rag/unified/UnifiedRetriever.d.ts.map +1 -0
  422. package/dist/rag/unified/UnifiedRetriever.js +887 -0
  423. package/dist/rag/unified/UnifiedRetriever.js.map +1 -0
  424. package/dist/rag/unified/index.d.ts +24 -0
  425. package/dist/rag/unified/index.d.ts.map +1 -0
  426. package/dist/rag/unified/index.js +23 -0
  427. package/dist/rag/unified/index.js.map +1 -0
  428. package/dist/rag/unified/types.d.ts +546 -0
  429. package/dist/rag/unified/types.d.ts.map +1 -0
  430. package/dist/rag/unified/types.js +177 -0
  431. package/dist/rag/unified/types.js.map +1 -0
  432. package/dist/speech/providers/AssemblyAISTTProvider.js.map +1 -1
  433. package/dist/speech/providers/AzureSpeechSTTProvider.js.map +1 -1
  434. package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +1 -1
  435. package/dist/speech/providers/DeepgramBatchSTTProvider.js.map +1 -1
  436. package/package.json +5 -2
@@ -0,0 +1,282 @@
1
+ /**
2
+ * @fileoverview BM25 sparse keyword index for hybrid retrieval.
3
+ *
4
+ * Dense embeddings excel at semantic similarity but miss exact keyword matches
5
+ * (e.g., error codes, function names, product IDs). BM25 catches these by
6
+ * scoring documents based on term frequency, inverse document frequency,
7
+ * and document length normalization.
8
+ *
9
+ * Used alongside vector search in a hybrid fusion strategy:
10
+ * - Vector search handles semantic "what does this mean?" queries
11
+ * - BM25 handles lexical "find this exact thing" queries
12
+ * - Reciprocal Rank Fusion (RRF) merges both result sets
13
+ *
14
+ * The BM25 ranking function is:
15
+ * ```
16
+ * score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
17
+ * ```
18
+ *
19
+ * Where:
20
+ * - `k1` controls term frequency saturation (default 1.2)
21
+ * - `b` controls document length normalization (default 0.75)
22
+ * - `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)` (Robertson-Walker IDF)
23
+ *
24
+ * @module agentos/rag/search/BM25Index
25
+ * @see HybridSearcher for combining BM25 with dense vector search
26
+ */
27
+ /**
28
+ * Internal document representation stored in the BM25 index.
29
+ *
30
+ * @interface BM25Document
31
+ * @property {string} id - Unique document identifier.
32
+ * @property {number} length - Number of tokens in the document after tokenization.
33
+ * @property {Record<string, unknown>} [metadata] - Optional metadata attached to the document.
34
+ */
35
+ export interface BM25Document {
36
+ /** Unique document identifier. */
37
+ id: string;
38
+ /** Number of tokens in the document after tokenization. */
39
+ length: number;
40
+ /** Optional metadata attached to the document. */
41
+ metadata?: Record<string, unknown>;
42
+ }
43
+ /**
44
+ * A single BM25 search result with relevance score.
45
+ *
46
+ * @interface BM25Result
47
+ * @property {string} id - Document identifier.
48
+ * @property {number} score - BM25 relevance score (higher = more relevant).
49
+ * @property {Record<string, unknown>} [metadata] - Document metadata if available.
50
+ */
51
+ export interface BM25Result {
52
+ /** Document identifier. */
53
+ id: string;
54
+ /** BM25 relevance score (higher = more relevant). */
55
+ score: number;
56
+ /** Document metadata if available. */
57
+ metadata?: Record<string, unknown>;
58
+ }
59
+ /**
60
+ * Configuration options for the BM25 index.
61
+ *
62
+ * @interface BM25Config
63
+ * @property {number} [k1=1.2] - Term saturation parameter. Higher values increase
64
+ * the influence of term frequency. Range: 1.2-2.0 typical.
65
+ * @property {number} [b=0.75] - Document length normalization factor.
66
+ * 0 = no normalization, 1 = full normalization. Range: 0-1.
67
+ */
68
+ export interface BM25Config {
69
+ /** Term saturation parameter. Default: 1.2. */
70
+ k1?: number;
71
+ /** Document length normalization factor. Default: 0.75. */
72
+ b?: number;
73
+ }
74
+ /**
75
+ * Index statistics for monitoring and debugging.
76
+ *
77
+ * @interface BM25Stats
78
+ * @property {number} documentCount - Total documents in the index.
79
+ * @property {number} termCount - Total unique terms across all documents.
80
+ * @property {number} avgDocLength - Average document length in tokens.
81
+ */
82
+ export interface BM25Stats {
83
+ /** Total documents in the index. */
84
+ documentCount: number;
85
+ /** Total unique terms across all documents. */
86
+ termCount: number;
87
+ /** Average document length in tokens. */
88
+ avgDocLength: number;
89
+ }
90
+ /**
91
+ * BM25 sparse keyword index for hybrid retrieval.
92
+ *
93
+ * Dense embeddings excel at semantic similarity but miss exact keyword matches
94
+ * (e.g., error codes, function names, product IDs). BM25 catches these by
95
+ * scoring documents based on term frequency, inverse document frequency,
96
+ * and document length normalization.
97
+ *
98
+ * @example Basic usage
99
+ * ```typescript
100
+ * const index = new BM25Index({ k1: 1.5, b: 0.75 });
101
+ *
102
+ * index.addDocuments([
103
+ * { id: 'doc-1', text: 'TypeScript compiler error TS2304' },
104
+ * { id: 'doc-2', text: 'JavaScript runtime TypeError explanation' },
105
+ * { id: 'doc-3', text: 'Fix error TS2304 by adding type declarations' },
106
+ * ]);
107
+ *
108
+ * const results = index.search('error TS2304', 5);
109
+ * // results[0].id === 'doc-3' (exact match on "error" + "TS2304")
110
+ * // results[1].id === 'doc-1' (exact match on "error" + "TS2304")
111
+ * ```
112
+ *
113
+ * @example Combined with HybridSearcher
114
+ * ```typescript
115
+ * const hybrid = new HybridSearcher(vectorStore, embeddingManager, bm25Index, {
116
+ * denseWeight: 0.7,
117
+ * sparseWeight: 0.3,
118
+ * });
119
+ * const results = await hybrid.search('What does error TS2304 mean?');
120
+ * ```
121
+ */
122
+ export declare class BM25Index {
123
+ /** Term saturation parameter (typical range: 1.2-2.0). */
124
+ private k1;
125
+ /** Document length normalization (0 = none, 1 = full). */
126
+ private b;
127
+ /** Map of document ID to internal document representation. */
128
+ private documents;
129
+ /**
130
+ * Inverted index mapping each term to a map of document IDs and their
131
+ * raw term frequencies: `term -> { docId -> termFrequency }`.
132
+ */
133
+ private invertedIndex;
134
+ /**
135
+ * Pre-computed IDF (Inverse Document Frequency) for each indexed term.
136
+ * Recomputed when documents are added or removed.
137
+ */
138
+ private idf;
139
+ /** Average document length across the entire corpus (in tokens). */
140
+ private avgDocLength;
141
+ /** Whether the IDF cache needs recomputation. */
142
+ private idfDirty;
143
+ /**
144
+ * Creates a new BM25 index.
145
+ *
146
+ * @param {BM25Config} [config] - Optional BM25 tuning parameters.
147
+ * @param {number} [config.k1=1.2] - Term saturation parameter.
148
+ * @param {number} [config.b=0.75] - Document length normalization.
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * // Use defaults (k1=1.2, b=0.75)
153
+ * const index = new BM25Index();
154
+ *
155
+ * // Custom parameters for short documents
156
+ * const shortDocIndex = new BM25Index({ k1: 1.5, b: 0.5 });
157
+ * ```
158
+ */
159
+ constructor(config?: BM25Config);
160
+ /**
161
+ * Tokenizes raw text into an array of normalized terms.
162
+ *
163
+ * Processing pipeline:
164
+ * 1. Convert to lowercase
165
+ * 2. Split on whitespace and punctuation boundaries
166
+ * 3. Filter out stop words and tokens shorter than 2 characters
167
+ *
168
+ * @param {string} text - Raw text to tokenize.
169
+ * @returns {string[]} Array of normalized tokens.
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * // "The Quick Brown FOX!" -> ["quick", "brown", "fox"]
174
+ * ```
175
+ */
176
+ private tokenize;
177
+ /**
178
+ * Recomputes IDF values for all terms in the index.
179
+ *
180
+ * Uses the Robertson-Walker IDF formula:
181
+ * `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)`
182
+ *
183
+ * Where:
184
+ * - N = total number of documents
185
+ * - n(t) = number of documents containing term t
186
+ *
187
+ * The `+ 1` prevents negative IDF values for extremely common terms.
188
+ */
189
+ private recomputeIdf;
190
+ /**
191
+ * Adds a single document to the BM25 index.
192
+ *
193
+ * The text is tokenized, stop words are removed, and term frequencies
194
+ * are recorded in the inverted index. IDF values are lazily recomputed
195
+ * on the next search.
196
+ *
197
+ * @param {string} id - Unique document identifier.
198
+ * @param {string} text - Document text content to index.
199
+ * @param {Record<string, unknown>} [metadata] - Optional metadata to store.
200
+ * @throws {Error} If `id` is empty or `text` is empty.
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * index.addDocument('readme', 'AgentOS is a framework for building AI agents');
205
+ * index.addDocument('changelog', 'v2.0: Added BM25 hybrid search', { version: '2.0' });
206
+ * ```
207
+ */
208
+ addDocument(id: string, text: string, metadata?: Record<string, unknown>): void;
209
+ /**
210
+ * Adds multiple documents to the index in a single batch.
211
+ *
212
+ * More efficient than calling {@link addDocument} repeatedly because
213
+ * IDF recomputation is deferred until the next search.
214
+ *
215
+ * @param {Array<{ id: string; text: string; metadata?: Record<string, unknown> }>} docs
216
+ * Array of documents to index.
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * index.addDocuments([
221
+ * { id: 'doc-1', text: 'First document content' },
222
+ * { id: 'doc-2', text: 'Second document content', metadata: { source: 'api' } },
223
+ * ]);
224
+ * ```
225
+ */
226
+ addDocuments(docs: Array<{
227
+ id: string;
228
+ text: string;
229
+ metadata?: Record<string, unknown>;
230
+ }>): void;
231
+ /**
232
+ * Searches the BM25 index for documents matching the query.
233
+ *
234
+ * Scoring formula per document D and query Q:
235
+ * ```
236
+ * score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
237
+ * ```
238
+ *
239
+ * @param {string} query - Search query text.
240
+ * @param {number} [topK=10] - Maximum number of results to return.
241
+ * @returns {BM25Result[]} Array of results sorted by BM25 score descending.
242
+ *
243
+ * @example
244
+ * ```typescript
245
+ * const results = index.search('typescript error TS2304', 5);
246
+ * for (const r of results) {
247
+ * console.log(`${r.id}: score=${r.score.toFixed(4)}`);
248
+ * }
249
+ * ```
250
+ */
251
+ search(query: string, topK?: number): BM25Result[];
252
+ /**
253
+ * Removes a document from the index by its ID.
254
+ *
255
+ * Cleans up all term frequency entries in the inverted index and
256
+ * marks IDF for recomputation.
257
+ *
258
+ * @param {string} id - Document ID to remove.
259
+ * @returns {boolean} `true` if the document existed and was removed, `false` otherwise.
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * const removed = index.removeDocument('doc-obsolete');
264
+ * console.log(removed ? 'Removed' : 'Not found');
265
+ * ```
266
+ */
267
+ removeDocument(id: string): boolean;
268
+ /**
269
+ * Returns current index statistics.
270
+ *
271
+ * @returns {BM25Stats} Object containing document count, term count,
272
+ * and average document length.
273
+ *
274
+ * @example
275
+ * ```typescript
276
+ * const stats = index.getStats();
277
+ * console.log(`${stats.documentCount} docs, ${stats.termCount} unique terms`);
278
+ * ```
279
+ */
280
+ getStats(): BM25Stats;
281
+ }
282
+ //# sourceMappingURL=BM25Index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BM25Index.d.ts","sourceRoot":"","sources":["../../../src/rag/search/BM25Index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;CACtB;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,SAAS;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAS;IAEnB,0DAA0D;IAC1D,OAAO,CAAC,CAAC,CAAS;IAElB,8DAA8D;IAC9D,OAAO,CAAC,SAAS,CAA4B;IAE7C;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAmC;IAExD;;;OAGG;IACH,OAAO,CAAC,GAAG,CAAsB;IAEjC,oEAAoE;IACpE,OAAO,CAAC,YAAY,CAAS;IAE7B,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAU;IAE1B;;;;;;;;;;;;;;;OAeG;gBACS,MAAM,CAAC,EAAE,UAAU;IAU/B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqC/E;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CACV,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAC5E,IAAI;IAMP;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,UAAU,EAAE;IAyCtD;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiBnC;;;;;;;;;;;OAWG;IACH,QAAQ,IAAI,SAAS;CAUtB"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * @fileoverview BM25 sparse keyword index for hybrid retrieval.
3
+ *
4
+ * Dense embeddings excel at semantic similarity but miss exact keyword matches
5
+ * (e.g., error codes, function names, product IDs). BM25 catches these by
6
+ * scoring documents based on term frequency, inverse document frequency,
7
+ * and document length normalization.
8
+ *
9
+ * Used alongside vector search in a hybrid fusion strategy:
10
+ * - Vector search handles semantic "what does this mean?" queries
11
+ * - BM25 handles lexical "find this exact thing" queries
12
+ * - Reciprocal Rank Fusion (RRF) merges both result sets
13
+ *
14
+ * The BM25 ranking function is:
15
+ * ```
16
+ * score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
17
+ * ```
18
+ *
19
+ * Where:
20
+ * - `k1` controls term frequency saturation (default 1.2)
21
+ * - `b` controls document length normalization (default 0.75)
22
+ * - `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)` (Robertson-Walker IDF)
23
+ *
24
+ * @module agentos/rag/search/BM25Index
25
+ * @see HybridSearcher for combining BM25 with dense vector search
26
+ */
27
+ // ── Stop Words ────────────────────────────────────────────────────────────
28
+ /**
29
+ * Common English stop words excluded from indexing and querying.
30
+ * These words occur so frequently they provide minimal discriminative value
31
+ * in BM25 scoring and only inflate index size.
32
+ */
33
+ const STOP_WORDS = new Set([
34
+ 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
35
+ 'of', 'with', 'by', 'from', 'is', 'it', 'as', 'was', 'are', 'be',
36
+ 'been', 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will',
37
+ 'would', 'could', 'should', 'may', 'might', 'shall', 'can', 'need',
38
+ 'dare', 'ought', 'used', 'not', 'no', 'nor', 'so', 'if', 'then',
39
+ 'than', 'too', 'very', 'just', 'about', 'above', 'after', 'again',
40
+ 'all', 'also', 'am', 'any', 'because', 'before', 'between', 'both',
41
+ 'each', 'few', 'further', 'get', 'got', 'he', 'her', 'here', 'him',
42
+ 'his', 'how', 'i', 'into', 'its', 'let', 'me', 'more', 'most', 'my',
43
+ 'new', 'now', 'off', 'old', 'once', 'only', 'other', 'our', 'out',
44
+ 'own', 'part', 'per', 'put', 'said', 'same', 'she', 'some', 'still',
45
+ 'such', 'take', 'that', 'their', 'them', 'these', 'they', 'this',
46
+ 'those', 'through', 'under', 'until', 'up', 'us', 'want', 'we',
47
+ 'well', 'what', 'when', 'where', 'which', 'while', 'who', 'whom',
48
+ 'why', 'you', 'your',
49
+ ]);
50
+ // ── BM25 Index ────────────────────────────────────────────────────────────
51
+ /**
52
+ * BM25 sparse keyword index for hybrid retrieval.
53
+ *
54
+ * Dense embeddings excel at semantic similarity but miss exact keyword matches
55
+ * (e.g., error codes, function names, product IDs). BM25 catches these by
56
+ * scoring documents based on term frequency, inverse document frequency,
57
+ * and document length normalization.
58
+ *
59
+ * @example Basic usage
60
+ * ```typescript
61
+ * const index = new BM25Index({ k1: 1.5, b: 0.75 });
62
+ *
63
+ * index.addDocuments([
64
+ * { id: 'doc-1', text: 'TypeScript compiler error TS2304' },
65
+ * { id: 'doc-2', text: 'JavaScript runtime TypeError explanation' },
66
+ * { id: 'doc-3', text: 'Fix error TS2304 by adding type declarations' },
67
+ * ]);
68
+ *
69
+ * const results = index.search('error TS2304', 5);
70
+ * // results[0].id === 'doc-3' (exact match on "error" + "TS2304")
71
+ * // results[1].id === 'doc-1' (exact match on "error" + "TS2304")
72
+ * ```
73
+ *
74
+ * @example Combined with HybridSearcher
75
+ * ```typescript
76
+ * const hybrid = new HybridSearcher(vectorStore, embeddingManager, bm25Index, {
77
+ * denseWeight: 0.7,
78
+ * sparseWeight: 0.3,
79
+ * });
80
+ * const results = await hybrid.search('What does error TS2304 mean?');
81
+ * ```
82
+ */
83
+ export class BM25Index {
84
+ /**
85
+ * Creates a new BM25 index.
86
+ *
87
+ * @param {BM25Config} [config] - Optional BM25 tuning parameters.
88
+ * @param {number} [config.k1=1.2] - Term saturation parameter.
89
+ * @param {number} [config.b=0.75] - Document length normalization.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * // Use defaults (k1=1.2, b=0.75)
94
+ * const index = new BM25Index();
95
+ *
96
+ * // Custom parameters for short documents
97
+ * const shortDocIndex = new BM25Index({ k1: 1.5, b: 0.5 });
98
+ * ```
99
+ */
100
+ constructor(config) {
101
+ this.k1 = config?.k1 ?? 1.2;
102
+ this.b = config?.b ?? 0.75;
103
+ this.documents = new Map();
104
+ this.invertedIndex = new Map();
105
+ this.idf = new Map();
106
+ this.avgDocLength = 0;
107
+ this.idfDirty = false;
108
+ }
109
+ /**
110
+ * Tokenizes raw text into an array of normalized terms.
111
+ *
112
+ * Processing pipeline:
113
+ * 1. Convert to lowercase
114
+ * 2. Split on whitespace and punctuation boundaries
115
+ * 3. Filter out stop words and tokens shorter than 2 characters
116
+ *
117
+ * @param {string} text - Raw text to tokenize.
118
+ * @returns {string[]} Array of normalized tokens.
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * // "The Quick Brown FOX!" -> ["quick", "brown", "fox"]
123
+ * ```
124
+ */
125
+ tokenize(text) {
126
+ return text
127
+ .toLowerCase()
128
+ .split(/[\s\-_.,;:!?'"()\[\]{}<>\/\\|@#$%^&*~`+=]+/)
129
+ .filter((token) => token.length >= 2 && !STOP_WORDS.has(token));
130
+ }
131
+ /**
132
+ * Recomputes IDF values for all terms in the index.
133
+ *
134
+ * Uses the Robertson-Walker IDF formula:
135
+ * `IDF(t) = log((N - n(t) + 0.5) / (n(t) + 0.5) + 1)`
136
+ *
137
+ * Where:
138
+ * - N = total number of documents
139
+ * - n(t) = number of documents containing term t
140
+ *
141
+ * The `+ 1` prevents negative IDF values for extremely common terms.
142
+ */
143
+ recomputeIdf() {
144
+ if (!this.idfDirty)
145
+ return;
146
+ const N = this.documents.size;
147
+ this.idf.clear();
148
+ for (const [term, docMap] of this.invertedIndex) {
149
+ const n = docMap.size;
150
+ // Robertson-Walker IDF: log((N - n + 0.5) / (n + 0.5) + 1)
151
+ this.idf.set(term, Math.log((N - n + 0.5) / (n + 0.5) + 1));
152
+ }
153
+ // Recompute average document length
154
+ if (N === 0) {
155
+ this.avgDocLength = 0;
156
+ }
157
+ else {
158
+ let totalLength = 0;
159
+ for (const doc of this.documents.values()) {
160
+ totalLength += doc.length;
161
+ }
162
+ this.avgDocLength = totalLength / N;
163
+ }
164
+ this.idfDirty = false;
165
+ }
166
+ /**
167
+ * Adds a single document to the BM25 index.
168
+ *
169
+ * The text is tokenized, stop words are removed, and term frequencies
170
+ * are recorded in the inverted index. IDF values are lazily recomputed
171
+ * on the next search.
172
+ *
173
+ * @param {string} id - Unique document identifier.
174
+ * @param {string} text - Document text content to index.
175
+ * @param {Record<string, unknown>} [metadata] - Optional metadata to store.
176
+ * @throws {Error} If `id` is empty or `text` is empty.
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * index.addDocument('readme', 'AgentOS is a framework for building AI agents');
181
+ * index.addDocument('changelog', 'v2.0: Added BM25 hybrid search', { version: '2.0' });
182
+ * ```
183
+ */
184
+ addDocument(id, text, metadata) {
185
+ if (!id)
186
+ throw new Error('BM25Index.addDocument: id must not be empty.');
187
+ if (!text)
188
+ throw new Error('BM25Index.addDocument: text must not be empty.');
189
+ // Remove previous version if exists
190
+ if (this.documents.has(id)) {
191
+ this.removeDocument(id);
192
+ }
193
+ const tokens = this.tokenize(text);
194
+ // Count term frequencies for this document
195
+ const termFreqs = new Map();
196
+ for (const token of tokens) {
197
+ termFreqs.set(token, (termFreqs.get(token) ?? 0) + 1);
198
+ }
199
+ // Store document metadata
200
+ this.documents.set(id, {
201
+ id,
202
+ length: tokens.length,
203
+ metadata,
204
+ });
205
+ // Update inverted index
206
+ for (const [term, freq] of termFreqs) {
207
+ let docMap = this.invertedIndex.get(term);
208
+ if (!docMap) {
209
+ docMap = new Map();
210
+ this.invertedIndex.set(term, docMap);
211
+ }
212
+ docMap.set(id, freq);
213
+ }
214
+ this.idfDirty = true;
215
+ }
216
+ /**
217
+ * Adds multiple documents to the index in a single batch.
218
+ *
219
+ * More efficient than calling {@link addDocument} repeatedly because
220
+ * IDF recomputation is deferred until the next search.
221
+ *
222
+ * @param {Array<{ id: string; text: string; metadata?: Record<string, unknown> }>} docs
223
+ * Array of documents to index.
224
+ *
225
+ * @example
226
+ * ```typescript
227
+ * index.addDocuments([
228
+ * { id: 'doc-1', text: 'First document content' },
229
+ * { id: 'doc-2', text: 'Second document content', metadata: { source: 'api' } },
230
+ * ]);
231
+ * ```
232
+ */
233
+ addDocuments(docs) {
234
+ for (const doc of docs) {
235
+ this.addDocument(doc.id, doc.text, doc.metadata);
236
+ }
237
+ }
238
+ /**
239
+ * Searches the BM25 index for documents matching the query.
240
+ *
241
+ * Scoring formula per document D and query Q:
242
+ * ```
243
+ * score(D, Q) = sum_{t in Q} IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D| / avgdl))
244
+ * ```
245
+ *
246
+ * @param {string} query - Search query text.
247
+ * @param {number} [topK=10] - Maximum number of results to return.
248
+ * @returns {BM25Result[]} Array of results sorted by BM25 score descending.
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * const results = index.search('typescript error TS2304', 5);
253
+ * for (const r of results) {
254
+ * console.log(`${r.id}: score=${r.score.toFixed(4)}`);
255
+ * }
256
+ * ```
257
+ */
258
+ search(query, topK = 10) {
259
+ // Ensure IDF is up-to-date
260
+ this.recomputeIdf();
261
+ const queryTokens = this.tokenize(query);
262
+ if (queryTokens.length === 0)
263
+ return [];
264
+ const scores = new Map();
265
+ for (const term of queryTokens) {
266
+ const idfValue = this.idf.get(term);
267
+ if (idfValue === undefined)
268
+ continue;
269
+ const docMap = this.invertedIndex.get(term);
270
+ if (!docMap)
271
+ continue;
272
+ for (const [docId, tf] of docMap) {
273
+ const doc = this.documents.get(docId);
274
+ const dl = doc.length;
275
+ const avgdl = this.avgDocLength || 1;
276
+ // BM25 score for this term in this document
277
+ const numerator = tf * (this.k1 + 1);
278
+ const denominator = tf + this.k1 * (1 - this.b + this.b * (dl / avgdl));
279
+ const termScore = idfValue * (numerator / denominator);
280
+ scores.set(docId, (scores.get(docId) ?? 0) + termScore);
281
+ }
282
+ }
283
+ // Sort by score descending and return top K
284
+ const results = [];
285
+ for (const [id, score] of scores) {
286
+ const doc = this.documents.get(id);
287
+ results.push({ id, score, metadata: doc.metadata });
288
+ }
289
+ results.sort((a, b) => b.score - a.score);
290
+ return results.slice(0, topK);
291
+ }
292
+ /**
293
+ * Removes a document from the index by its ID.
294
+ *
295
+ * Cleans up all term frequency entries in the inverted index and
296
+ * marks IDF for recomputation.
297
+ *
298
+ * @param {string} id - Document ID to remove.
299
+ * @returns {boolean} `true` if the document existed and was removed, `false` otherwise.
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * const removed = index.removeDocument('doc-obsolete');
304
+ * console.log(removed ? 'Removed' : 'Not found');
305
+ * ```
306
+ */
307
+ removeDocument(id) {
308
+ const doc = this.documents.get(id);
309
+ if (!doc)
310
+ return false;
311
+ // Remove all entries for this document from the inverted index
312
+ for (const [term, docMap] of this.invertedIndex) {
313
+ docMap.delete(id);
314
+ if (docMap.size === 0) {
315
+ this.invertedIndex.delete(term);
316
+ }
317
+ }
318
+ this.documents.delete(id);
319
+ this.idfDirty = true;
320
+ return true;
321
+ }
322
+ /**
323
+ * Returns current index statistics.
324
+ *
325
+ * @returns {BM25Stats} Object containing document count, term count,
326
+ * and average document length.
327
+ *
328
+ * @example
329
+ * ```typescript
330
+ * const stats = index.getStats();
331
+ * console.log(`${stats.documentCount} docs, ${stats.termCount} unique terms`);
332
+ * ```
333
+ */
334
+ getStats() {
335
+ // Ensure avgDocLength is current
336
+ this.recomputeIdf();
337
+ return {
338
+ documentCount: this.documents.size,
339
+ termCount: this.invertedIndex.size,
340
+ avgDocLength: this.avgDocLength,
341
+ };
342
+ }
343
+ }
344
+ //# sourceMappingURL=BM25Index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BM25Index.js","sourceRoot":"","sources":["../../../src/rag/search/BM25Index.ts"],"names":[],"mappings":"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"}