@juspay/neurolink 9.5.3 → 9.7.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 (423) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +29 -25
  3. package/dist/adapters/video/vertexVideoHandler.js +3 -3
  4. package/dist/agent/directTools.d.ts +5 -5
  5. package/dist/cli/commands/config.d.ts +9 -9
  6. package/dist/cli/commands/serve.d.ts +37 -0
  7. package/dist/cli/commands/serve.js +302 -229
  8. package/dist/cli/commands/setup-anthropic.d.ts +2 -2
  9. package/dist/cli/commands/setup-azure.d.ts +2 -2
  10. package/dist/cli/commands/setup-bedrock.d.ts +2 -2
  11. package/dist/cli/commands/setup-gcp.d.ts +2 -2
  12. package/dist/cli/commands/setup-google-ai.d.ts +2 -2
  13. package/dist/cli/commands/setup-huggingface.d.ts +2 -2
  14. package/dist/cli/commands/setup-mistral.d.ts +2 -2
  15. package/dist/cli/commands/setup-openai.d.ts +2 -2
  16. package/dist/cli/commands/setup.d.ts +2 -2
  17. package/dist/cli/factories/commandFactory.js +16 -2
  18. package/dist/cli/loop/optionsSchema.d.ts +2 -2
  19. package/dist/cli/loop/optionsSchema.js +4 -0
  20. package/dist/cli/loop/session.d.ts +4 -0
  21. package/dist/cli/loop/session.js +49 -4
  22. package/dist/cli/utils/interactiveSetup.d.ts +4 -4
  23. package/dist/config/conversationMemory.d.ts +2 -0
  24. package/dist/config/conversationMemory.js +5 -5
  25. package/dist/constants/contextWindows.d.ts +46 -0
  26. package/dist/constants/contextWindows.js +156 -0
  27. package/dist/context/budgetChecker.d.ts +18 -0
  28. package/dist/context/budgetChecker.js +71 -0
  29. package/dist/context/contextCompactor.d.ts +22 -0
  30. package/dist/context/contextCompactor.js +106 -0
  31. package/dist/context/effectiveHistory.d.ts +52 -0
  32. package/dist/context/effectiveHistory.js +105 -0
  33. package/dist/context/errorDetection.d.ts +14 -0
  34. package/dist/context/errorDetection.js +124 -0
  35. package/dist/context/fileSummarizationService.d.ts +54 -0
  36. package/dist/context/fileSummarizationService.js +255 -0
  37. package/dist/context/fileSummarizer.d.ts +56 -0
  38. package/dist/context/fileSummarizer.js +145 -0
  39. package/dist/context/fileTokenBudget.d.ts +53 -0
  40. package/dist/context/fileTokenBudget.js +127 -0
  41. package/dist/context/prompts/summarizationPrompt.d.ts +17 -0
  42. package/dist/context/prompts/summarizationPrompt.js +110 -0
  43. package/dist/context/stages/fileReadDeduplicator.d.ts +10 -0
  44. package/dist/context/stages/fileReadDeduplicator.js +66 -0
  45. package/dist/context/stages/slidingWindowTruncator.d.ts +11 -0
  46. package/dist/context/stages/slidingWindowTruncator.js +42 -0
  47. package/dist/context/stages/structuredSummarizer.d.ts +10 -0
  48. package/dist/context/stages/structuredSummarizer.js +49 -0
  49. package/dist/context/stages/toolOutputPruner.d.ts +10 -0
  50. package/dist/context/stages/toolOutputPruner.js +52 -0
  51. package/dist/context/summarizationEngine.d.ts +45 -0
  52. package/dist/context/summarizationEngine.js +110 -0
  53. package/dist/context/toolOutputLimits.d.ts +17 -0
  54. package/dist/context/toolOutputLimits.js +84 -0
  55. package/dist/context/toolPairRepair.d.ts +16 -0
  56. package/dist/context/toolPairRepair.js +66 -0
  57. package/dist/core/analytics.js +11 -4
  58. package/dist/core/baseProvider.d.ts +6 -0
  59. package/dist/core/baseProvider.js +83 -14
  60. package/dist/core/conversationMemoryManager.d.ts +14 -11
  61. package/dist/core/conversationMemoryManager.js +36 -68
  62. package/dist/core/dynamicModels.js +3 -2
  63. package/dist/core/modules/GenerationHandler.js +2 -0
  64. package/dist/core/modules/MessageBuilder.d.ts +1 -1
  65. package/dist/core/modules/MessageBuilder.js +2 -0
  66. package/dist/core/modules/TelemetryHandler.d.ts +2 -3
  67. package/dist/core/modules/TelemetryHandler.js +3 -3
  68. package/dist/core/modules/ToolsManager.d.ts +2 -2
  69. package/dist/core/redisConversationMemoryManager.d.ts +19 -14
  70. package/dist/core/redisConversationMemoryManager.js +94 -86
  71. package/dist/factories/providerFactory.d.ts +2 -2
  72. package/dist/files/fileReferenceRegistry.d.ts +276 -0
  73. package/dist/files/fileReferenceRegistry.js +1543 -0
  74. package/dist/files/fileTools.d.ts +423 -0
  75. package/dist/files/fileTools.js +449 -0
  76. package/dist/files/index.d.ts +14 -0
  77. package/dist/files/index.js +13 -0
  78. package/dist/files/streamingReader.d.ts +93 -0
  79. package/dist/files/streamingReader.js +321 -0
  80. package/dist/files/types.d.ts +23 -0
  81. package/dist/files/types.js +23 -0
  82. package/dist/image-gen/imageGenTools.d.ts +2 -2
  83. package/dist/image-gen/types.d.ts +12 -12
  84. package/dist/index.d.ts +4 -0
  85. package/dist/index.js +5 -0
  86. package/dist/lib/adapters/video/vertexVideoHandler.js +3 -3
  87. package/dist/lib/agent/directTools.d.ts +7 -7
  88. package/dist/lib/config/conversationMemory.d.ts +2 -0
  89. package/dist/lib/config/conversationMemory.js +5 -5
  90. package/dist/lib/constants/contextWindows.d.ts +46 -0
  91. package/dist/lib/constants/contextWindows.js +157 -0
  92. package/dist/lib/context/budgetChecker.d.ts +18 -0
  93. package/dist/lib/context/budgetChecker.js +72 -0
  94. package/dist/lib/context/contextCompactor.d.ts +22 -0
  95. package/dist/lib/context/contextCompactor.js +107 -0
  96. package/dist/lib/context/effectiveHistory.d.ts +52 -0
  97. package/dist/lib/context/effectiveHistory.js +106 -0
  98. package/dist/lib/context/errorDetection.d.ts +14 -0
  99. package/dist/lib/context/errorDetection.js +125 -0
  100. package/dist/lib/context/fileSummarizationService.d.ts +54 -0
  101. package/dist/lib/context/fileSummarizationService.js +256 -0
  102. package/dist/lib/context/fileSummarizer.d.ts +56 -0
  103. package/dist/lib/context/fileSummarizer.js +146 -0
  104. package/dist/lib/context/fileTokenBudget.d.ts +53 -0
  105. package/dist/lib/context/fileTokenBudget.js +128 -0
  106. package/dist/lib/context/prompts/summarizationPrompt.d.ts +17 -0
  107. package/dist/lib/context/prompts/summarizationPrompt.js +111 -0
  108. package/dist/lib/context/stages/fileReadDeduplicator.d.ts +10 -0
  109. package/dist/lib/context/stages/fileReadDeduplicator.js +67 -0
  110. package/dist/lib/context/stages/slidingWindowTruncator.d.ts +11 -0
  111. package/dist/lib/context/stages/slidingWindowTruncator.js +43 -0
  112. package/dist/lib/context/stages/structuredSummarizer.d.ts +10 -0
  113. package/dist/lib/context/stages/structuredSummarizer.js +50 -0
  114. package/dist/lib/context/stages/toolOutputPruner.d.ts +10 -0
  115. package/dist/lib/context/stages/toolOutputPruner.js +53 -0
  116. package/dist/lib/context/summarizationEngine.d.ts +45 -0
  117. package/dist/lib/context/summarizationEngine.js +111 -0
  118. package/dist/lib/context/toolOutputLimits.d.ts +17 -0
  119. package/dist/lib/context/toolOutputLimits.js +85 -0
  120. package/dist/lib/context/toolPairRepair.d.ts +16 -0
  121. package/dist/lib/context/toolPairRepair.js +67 -0
  122. package/dist/lib/core/analytics.js +11 -4
  123. package/dist/lib/core/baseProvider.d.ts +6 -0
  124. package/dist/lib/core/baseProvider.js +83 -14
  125. package/dist/lib/core/conversationMemoryManager.d.ts +14 -11
  126. package/dist/lib/core/conversationMemoryManager.js +36 -68
  127. package/dist/lib/core/dynamicModels.js +3 -2
  128. package/dist/lib/core/modules/GenerationHandler.js +2 -0
  129. package/dist/lib/core/modules/MessageBuilder.d.ts +1 -1
  130. package/dist/lib/core/modules/MessageBuilder.js +2 -0
  131. package/dist/lib/core/modules/TelemetryHandler.d.ts +2 -3
  132. package/dist/lib/core/modules/TelemetryHandler.js +3 -3
  133. package/dist/lib/core/modules/ToolsManager.d.ts +2 -2
  134. package/dist/lib/core/redisConversationMemoryManager.d.ts +19 -14
  135. package/dist/lib/core/redisConversationMemoryManager.js +94 -86
  136. package/dist/lib/factories/providerFactory.d.ts +2 -2
  137. package/dist/lib/files/fileReferenceRegistry.d.ts +276 -0
  138. package/dist/lib/files/fileReferenceRegistry.js +1544 -0
  139. package/dist/lib/files/fileTools.d.ts +423 -0
  140. package/dist/lib/files/fileTools.js +450 -0
  141. package/dist/lib/files/index.d.ts +14 -0
  142. package/dist/lib/files/index.js +14 -0
  143. package/dist/lib/files/streamingReader.d.ts +93 -0
  144. package/dist/lib/files/streamingReader.js +322 -0
  145. package/dist/lib/files/types.d.ts +23 -0
  146. package/dist/lib/files/types.js +24 -0
  147. package/dist/lib/image-gen/imageGenTools.d.ts +2 -2
  148. package/dist/lib/image-gen/types.d.ts +12 -12
  149. package/dist/lib/index.d.ts +4 -0
  150. package/dist/lib/index.js +5 -0
  151. package/dist/lib/mcp/httpRetryHandler.js +6 -2
  152. package/dist/lib/memory/mem0Initializer.d.ts +2 -2
  153. package/dist/lib/neurolink.d.ts +66 -2
  154. package/dist/lib/neurolink.js +777 -315
  155. package/dist/lib/processors/archive/ArchiveProcessor.d.ts +327 -0
  156. package/dist/lib/processors/archive/ArchiveProcessor.js +1309 -0
  157. package/dist/lib/processors/archive/index.d.ts +33 -0
  158. package/dist/lib/processors/archive/index.js +43 -0
  159. package/dist/lib/processors/base/BaseFileProcessor.js +2 -1
  160. package/dist/lib/processors/base/types.d.ts +70 -64
  161. package/dist/lib/processors/base/types.js +6 -0
  162. package/dist/lib/processors/cli/fileProcessorCli.d.ts +8 -8
  163. package/dist/lib/processors/cli/fileProcessorCli.js +5 -5
  164. package/dist/lib/processors/config/mimeTypes.js +25 -0
  165. package/dist/lib/processors/config/sizeLimits.d.ts +52 -40
  166. package/dist/lib/processors/config/sizeLimits.js +56 -44
  167. package/dist/lib/processors/document/ExcelProcessor.d.ts +14 -0
  168. package/dist/lib/processors/document/ExcelProcessor.js +72 -1
  169. package/dist/lib/processors/document/PptxProcessor.d.ts +63 -0
  170. package/dist/lib/processors/document/PptxProcessor.js +158 -0
  171. package/dist/lib/processors/document/index.d.ts +1 -0
  172. package/dist/lib/processors/document/index.js +6 -0
  173. package/dist/lib/processors/errors/FileErrorCode.d.ts +2 -2
  174. package/dist/lib/processors/errors/errorHelpers.d.ts +2 -2
  175. package/dist/lib/processors/errors/errorHelpers.js +12 -4
  176. package/dist/lib/processors/errors/errorSerializer.d.ts +4 -4
  177. package/dist/lib/processors/index.d.ts +8 -2
  178. package/dist/lib/processors/index.js +5 -2
  179. package/dist/lib/processors/integration/FileProcessorIntegration.d.ts +8 -8
  180. package/dist/lib/processors/integration/FileProcessorIntegration.js +7 -7
  181. package/dist/lib/processors/media/AudioProcessor.d.ts +328 -0
  182. package/dist/lib/processors/media/AudioProcessor.js +708 -0
  183. package/dist/lib/processors/media/VideoProcessor.d.ts +350 -0
  184. package/dist/lib/processors/media/VideoProcessor.js +992 -0
  185. package/dist/lib/processors/media/index.d.ts +27 -0
  186. package/dist/lib/processors/media/index.js +37 -0
  187. package/dist/lib/processors/registry/ProcessorRegistry.d.ts +19 -5
  188. package/dist/lib/processors/registry/ProcessorRegistry.js +103 -8
  189. package/dist/lib/processors/registry/index.d.ts +1 -1
  190. package/dist/lib/processors/registry/index.js +1 -1
  191. package/dist/lib/processors/registry/types.d.ts +2 -2
  192. package/dist/lib/providers/amazonBedrock.js +2 -1
  193. package/dist/lib/providers/anthropic.js +2 -2
  194. package/dist/lib/providers/anthropicBaseProvider.js +10 -4
  195. package/dist/lib/providers/azureOpenai.js +14 -25
  196. package/dist/lib/providers/googleAiStudio.js +136 -457
  197. package/dist/lib/providers/googleNativeGemini3.d.ts +119 -0
  198. package/dist/lib/providers/googleNativeGemini3.js +264 -0
  199. package/dist/lib/providers/googleVertex.d.ts +15 -1
  200. package/dist/lib/providers/googleVertex.js +341 -775
  201. package/dist/lib/providers/huggingFace.js +20 -5
  202. package/dist/lib/providers/litellm.js +6 -4
  203. package/dist/lib/providers/mistral.js +3 -2
  204. package/dist/lib/providers/openAI.js +2 -2
  205. package/dist/lib/providers/openRouter.js +8 -7
  206. package/dist/lib/providers/openaiCompatible.js +10 -4
  207. package/dist/lib/providers/sagemaker/detection.d.ts +6 -6
  208. package/dist/lib/providers/sagemaker/diagnostics.d.ts +4 -4
  209. package/dist/lib/providers/sagemaker/parsers.d.ts +4 -4
  210. package/dist/lib/rag/chunkers/RecursiveChunker.js +2 -2
  211. package/dist/lib/rag/document/loaders.d.ts +6 -71
  212. package/dist/lib/rag/document/loaders.js +5 -5
  213. package/dist/lib/rag/graphRag/graphRAG.js +26 -9
  214. package/dist/lib/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
  215. package/dist/lib/rag/metadata/metadataExtractor.js +6 -3
  216. package/dist/lib/rag/pipeline/RAGPipeline.d.ts +8 -126
  217. package/dist/lib/rag/pipeline/RAGPipeline.js +11 -11
  218. package/dist/lib/rag/pipeline/contextAssembly.d.ts +3 -42
  219. package/dist/lib/rag/pipeline/contextAssembly.js +6 -3
  220. package/dist/lib/rag/reranker/RerankerFactory.d.ts +5 -60
  221. package/dist/lib/rag/resilience/CircuitBreaker.d.ts +3 -33
  222. package/dist/lib/rag/resilience/RetryHandler.d.ts +2 -21
  223. package/dist/lib/rag/resilience/RetryHandler.js +6 -2
  224. package/dist/lib/rag/retrieval/hybridSearch.d.ts +3 -41
  225. package/dist/lib/rag/retrieval/vectorQueryTool.d.ts +2 -13
  226. package/dist/lib/rag/retrieval/vectorQueryTool.js +4 -3
  227. package/dist/lib/rag/types.d.ts +3 -3
  228. package/dist/lib/sdk/toolRegistration.d.ts +2 -2
  229. package/dist/lib/server/middleware/cache.d.ts +2 -2
  230. package/dist/lib/server/middleware/rateLimit.d.ts +2 -2
  231. package/dist/lib/server/routes/mcpRoutes.js +277 -249
  232. package/dist/lib/server/routes/memoryRoutes.js +287 -281
  233. package/dist/lib/server/utils/validation.d.ts +10 -10
  234. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +24 -2
  235. package/dist/lib/services/server/ai/observability/instrumentation.js +12 -1
  236. package/dist/lib/session/globalSessionState.d.ts +2 -2
  237. package/dist/lib/telemetry/telemetryService.d.ts +2 -2
  238. package/dist/lib/types/common.d.ts +39 -0
  239. package/dist/lib/types/contextTypes.d.ts +255 -0
  240. package/dist/lib/types/contextTypes.js +0 -2
  241. package/dist/lib/types/conversation.d.ts +62 -0
  242. package/dist/lib/types/conversationMemoryInterface.d.ts +27 -0
  243. package/dist/lib/types/conversationMemoryInterface.js +7 -0
  244. package/dist/lib/types/fileReferenceTypes.d.ts +222 -0
  245. package/dist/lib/types/fileReferenceTypes.js +9 -0
  246. package/dist/lib/types/fileTypes.d.ts +26 -3
  247. package/dist/lib/types/generateTypes.d.ts +50 -1
  248. package/dist/lib/types/index.d.ts +4 -5
  249. package/dist/lib/types/index.js +8 -10
  250. package/dist/lib/types/modelTypes.d.ts +2 -2
  251. package/dist/lib/types/processorTypes.d.ts +597 -0
  252. package/dist/lib/types/processorTypes.js +91 -0
  253. package/dist/lib/types/ragTypes.d.ts +489 -0
  254. package/dist/lib/types/ragTypes.js +8 -0
  255. package/dist/lib/types/sdkTypes.d.ts +17 -18
  256. package/dist/lib/types/streamTypes.d.ts +24 -1
  257. package/dist/lib/utils/async/retry.d.ts +2 -2
  258. package/dist/lib/utils/async/withTimeout.js +3 -1
  259. package/dist/lib/utils/conversationMemory.d.ts +12 -6
  260. package/dist/lib/utils/conversationMemory.js +91 -36
  261. package/dist/lib/utils/errorHandling.d.ts +5 -0
  262. package/dist/lib/utils/errorHandling.js +19 -0
  263. package/dist/lib/utils/fileDetector.d.ts +62 -0
  264. package/dist/lib/utils/fileDetector.js +1014 -14
  265. package/dist/lib/utils/json/safeParse.d.ts +2 -2
  266. package/dist/lib/utils/messageBuilder.js +806 -153
  267. package/dist/lib/utils/modelChoices.d.ts +2 -2
  268. package/dist/lib/utils/multimodalOptionsBuilder.d.ts +2 -1
  269. package/dist/lib/utils/multimodalOptionsBuilder.js +1 -0
  270. package/dist/lib/utils/pricing.d.ts +12 -0
  271. package/dist/lib/utils/pricing.js +134 -0
  272. package/dist/lib/utils/rateLimiter.d.ts +2 -2
  273. package/dist/lib/utils/redis.d.ts +17 -0
  274. package/dist/lib/utils/redis.js +105 -0
  275. package/dist/lib/utils/sanitizers/filename.d.ts +4 -4
  276. package/dist/lib/utils/sanitizers/svg.d.ts +2 -2
  277. package/dist/lib/utils/thinkingConfig.d.ts +6 -6
  278. package/dist/lib/utils/timeout.d.ts +10 -0
  279. package/dist/lib/utils/timeout.js +15 -0
  280. package/dist/lib/utils/tokenEstimation.d.ts +68 -0
  281. package/dist/lib/utils/tokenEstimation.js +113 -0
  282. package/dist/lib/utils/tokenUtils.d.ts +4 -4
  283. package/dist/lib/utils/ttsProcessor.d.ts +2 -2
  284. package/dist/lib/workflow/config.d.ts +150 -150
  285. package/dist/mcp/httpRetryHandler.js +6 -2
  286. package/dist/memory/mem0Initializer.d.ts +2 -2
  287. package/dist/neurolink.d.ts +66 -2
  288. package/dist/neurolink.js +777 -315
  289. package/dist/processors/archive/ArchiveProcessor.d.ts +327 -0
  290. package/dist/processors/archive/ArchiveProcessor.js +1308 -0
  291. package/dist/processors/archive/index.d.ts +33 -0
  292. package/dist/processors/archive/index.js +42 -0
  293. package/dist/processors/base/BaseFileProcessor.js +2 -1
  294. package/dist/processors/base/types.d.ts +70 -64
  295. package/dist/processors/base/types.js +6 -0
  296. package/dist/processors/cli/fileProcessorCli.d.ts +8 -8
  297. package/dist/processors/cli/fileProcessorCli.js +5 -5
  298. package/dist/processors/config/mimeTypes.js +25 -0
  299. package/dist/processors/config/sizeLimits.d.ts +52 -40
  300. package/dist/processors/config/sizeLimits.js +56 -44
  301. package/dist/processors/document/ExcelProcessor.d.ts +14 -0
  302. package/dist/processors/document/ExcelProcessor.js +72 -1
  303. package/dist/processors/document/PptxProcessor.d.ts +63 -0
  304. package/dist/processors/document/PptxProcessor.js +157 -0
  305. package/dist/processors/document/index.d.ts +1 -0
  306. package/dist/processors/document/index.js +6 -0
  307. package/dist/processors/errors/FileErrorCode.d.ts +2 -2
  308. package/dist/processors/errors/errorHelpers.d.ts +2 -2
  309. package/dist/processors/errors/errorHelpers.js +12 -4
  310. package/dist/processors/errors/errorSerializer.d.ts +4 -4
  311. package/dist/processors/index.d.ts +8 -2
  312. package/dist/processors/index.js +5 -2
  313. package/dist/processors/integration/FileProcessorIntegration.d.ts +8 -8
  314. package/dist/processors/integration/FileProcessorIntegration.js +7 -7
  315. package/dist/processors/media/AudioProcessor.d.ts +328 -0
  316. package/dist/processors/media/AudioProcessor.js +707 -0
  317. package/dist/processors/media/VideoProcessor.d.ts +350 -0
  318. package/dist/processors/media/VideoProcessor.js +991 -0
  319. package/dist/processors/media/ffprobe-static.d.ts +4 -0
  320. package/dist/processors/media/index.d.ts +27 -0
  321. package/dist/processors/media/index.js +36 -0
  322. package/dist/processors/registry/ProcessorRegistry.d.ts +19 -5
  323. package/dist/processors/registry/ProcessorRegistry.js +103 -8
  324. package/dist/processors/registry/index.d.ts +1 -1
  325. package/dist/processors/registry/index.js +1 -1
  326. package/dist/processors/registry/types.d.ts +2 -2
  327. package/dist/providers/amazonBedrock.js +2 -1
  328. package/dist/providers/anthropic.js +2 -2
  329. package/dist/providers/anthropicBaseProvider.js +10 -4
  330. package/dist/providers/azureOpenai.js +14 -25
  331. package/dist/providers/googleAiStudio.js +136 -457
  332. package/dist/providers/googleNativeGemini3.d.ts +119 -0
  333. package/dist/providers/googleNativeGemini3.js +263 -0
  334. package/dist/providers/googleVertex.d.ts +15 -1
  335. package/dist/providers/googleVertex.js +341 -775
  336. package/dist/providers/huggingFace.js +20 -5
  337. package/dist/providers/litellm.js +6 -4
  338. package/dist/providers/mistral.js +3 -2
  339. package/dist/providers/openAI.js +2 -2
  340. package/dist/providers/openRouter.js +8 -7
  341. package/dist/providers/openaiCompatible.js +10 -4
  342. package/dist/providers/sagemaker/detection.d.ts +6 -6
  343. package/dist/providers/sagemaker/diagnostics.d.ts +4 -4
  344. package/dist/providers/sagemaker/parsers.d.ts +4 -4
  345. package/dist/rag/chunkers/RecursiveChunker.js +2 -2
  346. package/dist/rag/document/loaders.d.ts +6 -71
  347. package/dist/rag/document/loaders.js +5 -5
  348. package/dist/rag/graphRag/graphRAG.js +26 -9
  349. package/dist/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
  350. package/dist/rag/metadata/metadataExtractor.js +6 -3
  351. package/dist/rag/pipeline/RAGPipeline.d.ts +8 -126
  352. package/dist/rag/pipeline/RAGPipeline.js +11 -11
  353. package/dist/rag/pipeline/contextAssembly.d.ts +3 -42
  354. package/dist/rag/pipeline/contextAssembly.js +6 -3
  355. package/dist/rag/reranker/RerankerFactory.d.ts +5 -60
  356. package/dist/rag/resilience/CircuitBreaker.d.ts +3 -33
  357. package/dist/rag/resilience/RetryHandler.d.ts +2 -21
  358. package/dist/rag/resilience/RetryHandler.js +6 -2
  359. package/dist/rag/retrieval/hybridSearch.d.ts +3 -41
  360. package/dist/rag/retrieval/vectorQueryTool.d.ts +2 -13
  361. package/dist/rag/retrieval/vectorQueryTool.js +4 -3
  362. package/dist/rag/types.d.ts +3 -3
  363. package/dist/sdk/toolRegistration.d.ts +2 -2
  364. package/dist/server/middleware/cache.d.ts +2 -2
  365. package/dist/server/middleware/rateLimit.d.ts +2 -2
  366. package/dist/server/routes/mcpRoutes.js +277 -249
  367. package/dist/server/routes/memoryRoutes.js +287 -281
  368. package/dist/server/utils/validation.d.ts +4 -4
  369. package/dist/services/server/ai/observability/instrumentation.d.ts +24 -2
  370. package/dist/services/server/ai/observability/instrumentation.js +12 -1
  371. package/dist/session/globalSessionState.d.ts +2 -2
  372. package/dist/telemetry/telemetryService.d.ts +2 -2
  373. package/dist/types/common.d.ts +39 -0
  374. package/dist/types/contextTypes.d.ts +255 -0
  375. package/dist/types/contextTypes.js +0 -2
  376. package/dist/types/conversation.d.ts +62 -0
  377. package/dist/types/conversationMemoryInterface.d.ts +27 -0
  378. package/dist/types/conversationMemoryInterface.js +6 -0
  379. package/dist/types/fileReferenceTypes.d.ts +222 -0
  380. package/dist/types/fileReferenceTypes.js +8 -0
  381. package/dist/types/fileTypes.d.ts +26 -3
  382. package/dist/types/generateTypes.d.ts +50 -1
  383. package/dist/types/index.d.ts +4 -5
  384. package/dist/types/index.js +8 -10
  385. package/dist/types/processorTypes.d.ts +597 -0
  386. package/dist/types/processorTypes.js +90 -0
  387. package/dist/types/ragTypes.d.ts +489 -0
  388. package/dist/types/ragTypes.js +7 -0
  389. package/dist/types/sdkTypes.d.ts +17 -18
  390. package/dist/types/streamTypes.d.ts +24 -1
  391. package/dist/utils/async/retry.d.ts +2 -2
  392. package/dist/utils/async/withTimeout.js +3 -1
  393. package/dist/utils/conversationMemory.d.ts +12 -6
  394. package/dist/utils/conversationMemory.js +91 -36
  395. package/dist/utils/errorHandling.d.ts +5 -0
  396. package/dist/utils/errorHandling.js +19 -0
  397. package/dist/utils/fileDetector.d.ts +62 -0
  398. package/dist/utils/fileDetector.js +1014 -14
  399. package/dist/utils/json/safeParse.d.ts +2 -2
  400. package/dist/utils/messageBuilder.js +806 -153
  401. package/dist/utils/modelChoices.d.ts +2 -2
  402. package/dist/utils/multimodalOptionsBuilder.d.ts +2 -1
  403. package/dist/utils/multimodalOptionsBuilder.js +1 -0
  404. package/dist/utils/pricing.d.ts +12 -0
  405. package/dist/utils/pricing.js +133 -0
  406. package/dist/utils/rateLimiter.d.ts +2 -2
  407. package/dist/utils/redis.d.ts +17 -0
  408. package/dist/utils/redis.js +105 -0
  409. package/dist/utils/sanitizers/filename.d.ts +4 -4
  410. package/dist/utils/sanitizers/svg.d.ts +2 -2
  411. package/dist/utils/thinkingConfig.d.ts +6 -6
  412. package/dist/utils/timeout.d.ts +10 -0
  413. package/dist/utils/timeout.js +15 -0
  414. package/dist/utils/tokenEstimation.d.ts +68 -0
  415. package/dist/utils/tokenEstimation.js +112 -0
  416. package/dist/utils/tokenUtils.d.ts +4 -4
  417. package/dist/utils/ttsProcessor.d.ts +2 -2
  418. package/dist/workflow/config.d.ts +104 -104
  419. package/package.json +18 -6
  420. package/dist/lib/utils/conversationMemoryUtils.d.ts +0 -25
  421. package/dist/lib/utils/conversationMemoryUtils.js +0 -138
  422. package/dist/utils/conversationMemoryUtils.d.ts +0 -25
  423. package/dist/utils/conversationMemoryUtils.js +0 -137
@@ -2,16 +2,18 @@
2
2
  * Conversation Memory Manager for NeuroLink
3
3
  * Handles in-memory conversation storage, session management, and context injection
4
4
  */
5
- import { ConversationMemoryError } from "../types/conversation.js";
6
- import { DEFAULT_MAX_SESSIONS, MEMORY_THRESHOLD_PERCENTAGE, RECENT_MESSAGES_RATIO, MESSAGES_PER_TURN, } from "../config/conversationMemory.js";
7
- import { logger } from "../utils/logger.js";
8
5
  import { randomUUID } from "crypto";
6
+ import { DEFAULT_MAX_SESSIONS, MEMORY_THRESHOLD_PERCENTAGE, MESSAGES_PER_TURN, } from "../config/conversationMemory.js";
9
7
  import { TokenUtils } from "../constants/tokens.js";
10
- import { buildContextFromPointer, getEffectiveTokenThreshold, generateSummary, } from "../utils/conversationMemory.js";
8
+ import { SummarizationEngine } from "../context/summarizationEngine.js";
9
+ import { ConversationMemoryError } from "../types/conversation.js";
10
+ import { buildContextFromPointer, getEffectiveTokenThreshold, } from "../utils/conversationMemory.js";
11
+ import { logger } from "../utils/logger.js";
11
12
  export class ConversationMemoryManager {
12
13
  sessions = new Map();
13
14
  config;
14
15
  isInitialized = false;
16
+ summarizationEngine = new SummarizationEngine();
15
17
  /**
16
18
  * Track sessions currently being summarized to prevent race conditions
17
19
  */
@@ -35,9 +37,26 @@ export class ConversationMemoryManager {
35
37
  });
36
38
  }
37
39
  catch (error) {
38
- throw new ConversationMemoryError("Failed to initialize conversation memory", "CONFIG_ERROR", { error: error instanceof Error ? error.message : String(error) });
40
+ throw new ConversationMemoryError("Failed to initialize conversation memory", "CONFIG_ERROR", {
41
+ error: error instanceof Error ? error.message : String(error),
42
+ });
39
43
  }
40
44
  }
45
+ /** Whether this memory manager can persist data (always true for in-memory within process) */
46
+ get canPersist() {
47
+ return true;
48
+ }
49
+ /** Whether Redis client is configured (always false for in-memory) */
50
+ get isRedisConfigured() {
51
+ return false;
52
+ }
53
+ /** Get health status for monitoring */
54
+ getHealthStatus() {
55
+ return {
56
+ initialized: this.isInitialized,
57
+ connected: false,
58
+ };
59
+ }
41
60
  /**
42
61
  * Store a conversation turn for a session
43
62
  * TOKEN-BASED: Validates message size and triggers summarization based on tokens
@@ -61,6 +80,10 @@ export class ConversationMemoryManager {
61
80
  }
62
81
  session.messages.push(userMsg, assistantMsg);
63
82
  session.lastActivity = Date.now();
83
+ // Store API-reported token counts if available
84
+ if (options.tokenUsage) {
85
+ session.lastApiTokenCount = options.tokenUsage;
86
+ }
64
87
  const shouldSummarize = options.enableSummarization !== undefined
65
88
  ? options.enableSummarization
66
89
  : this.config.enableSummarization;
@@ -141,19 +164,7 @@ export class ConversationMemoryManager {
141
164
  }
142
165
  this.summarizationInProgress.add(session.sessionId);
143
166
  try {
144
- const contextMessages = buildContextFromPointer(session);
145
- const tokenCount = this.estimateTokens(contextMessages);
146
- session.lastTokenCount = tokenCount;
147
- session.lastCountedAt = Date.now();
148
- logger.debug("Token count check", {
149
- sessionId: session.sessionId,
150
- tokenCount,
151
- threshold,
152
- needsSummarization: tokenCount >= threshold,
153
- });
154
- if (tokenCount >= threshold) {
155
- await this.summarizeSessionTokenBased(session, threshold);
156
- }
167
+ await this.summarizationEngine.checkAndSummarize(session, threshold, this.config, "[ConversationMemory]");
157
168
  }
158
169
  catch (error) {
159
170
  logger.error("Token counting or summarization failed", {
@@ -171,7 +182,12 @@ export class ConversationMemoryManager {
171
182
  */
172
183
  estimateTokens(messages) {
173
184
  return messages.reduce((total, msg) => {
174
- return total + TokenUtils.estimateTokenCount(msg.content);
185
+ let msgTokens = TokenUtils.estimateTokenCount(msg.content);
186
+ if (msg.events && Array.isArray(msg.events) && msg.events.length > 0) {
187
+ const eventsJson = JSON.stringify(msg.events);
188
+ msgTokens += TokenUtils.estimateTokenCount(eventsJson);
189
+ }
190
+ return total + msgTokens;
175
191
  }, 0);
176
192
  }
177
193
  /**
@@ -183,7 +199,7 @@ export class ConversationMemoryManager {
183
199
  const session = this.sessions.get(sessionId);
184
200
  return session ? buildContextFromPointer(session) : [];
185
201
  }
186
- getSession(sessionId) {
202
+ getSession(sessionId, _userId) {
187
203
  return this.sessions.get(sessionId);
188
204
  }
189
205
  createSummarySystemMessage(content, summarizesFrom, summarizesTo) {
@@ -199,54 +215,6 @@ export class ConversationMemoryManager {
199
215
  },
200
216
  };
201
217
  }
202
- /**
203
- * Token-based summarization (pointer-based, non-destructive)
204
- */
205
- async summarizeSessionTokenBased(session, threshold) {
206
- const startIndex = session.summarizedUpToMessageId
207
- ? session.messages.findIndex((m) => m.id === session.summarizedUpToMessageId) + 1
208
- : 0;
209
- const recentMessages = session.messages.slice(startIndex);
210
- if (recentMessages.length === 0) {
211
- return;
212
- }
213
- const targetRecentTokens = threshold * RECENT_MESSAGES_RATIO;
214
- const splitIndex = await this.findSplitIndexByTokens(recentMessages, targetRecentTokens);
215
- const messagesToSummarize = recentMessages.slice(0, splitIndex);
216
- if (messagesToSummarize.length === 0) {
217
- return;
218
- }
219
- const summary = await generateSummary(messagesToSummarize, this.config, "[ConversationMemory]", session.summarizedMessage);
220
- if (!summary) {
221
- logger.warn(`[ConversationMemory] Summary generation failed for session ${session.sessionId}`);
222
- return;
223
- }
224
- const lastSummarized = messagesToSummarize[messagesToSummarize.length - 1];
225
- session.summarizedUpToMessageId = lastSummarized.id;
226
- session.summarizedMessage = summary; // Store summary separately
227
- logger.info(`[ConversationMemory] Summarization complete for session ${session.sessionId}`, {
228
- summarizedCount: messagesToSummarize.length,
229
- totalMessages: session.messages.length,
230
- pointer: session.summarizedUpToMessageId,
231
- });
232
- }
233
- /**
234
- * Find split index to keep recent messages within target token count
235
- */
236
- async findSplitIndexByTokens(messages, targetRecentTokens) {
237
- let recentTokens = 0;
238
- let splitIndex = messages.length;
239
- for (let i = messages.length - 1; i >= 0; i--) {
240
- const msgTokens = TokenUtils.estimateTokenCount(messages[i].content);
241
- if (recentTokens + msgTokens > targetRecentTokens) {
242
- splitIndex = i + 1;
243
- break;
244
- }
245
- recentTokens += msgTokens;
246
- }
247
- // To ensure at least one message is summarized
248
- return Math.max(1, splitIndex);
249
- }
250
218
  async ensureInitialized() {
251
219
  if (!this.isInitialized) {
252
220
  await this.initialize();
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { isAbortError } from "../utils/errorHandling.js";
2
3
  import { logger } from "../utils/logger.js";
3
4
  /**
4
5
  * Model configuration schema for validation
@@ -122,7 +123,7 @@ export class DynamicModelProvider {
122
123
  }
123
124
  catch (error) {
124
125
  clearTimeout(timeoutId);
125
- if (error instanceof Error && error.name === "AbortError") {
126
+ if (isAbortError(error)) {
126
127
  throw new Error(`Request timeout after ${timeoutMs}ms`);
127
128
  }
128
129
  throw error;
@@ -177,7 +178,7 @@ export class DynamicModelProvider {
177
178
  }
178
179
  catch (error) {
179
180
  clearTimeout(timeoutId);
180
- if (error instanceof Error && error.name === "AbortError") {
181
+ if (isAbortError(error)) {
181
182
  throw new Error(`Localhost health check timeout - server may not be running`);
182
183
  }
183
184
  // For connection refused, throw a more specific error
@@ -53,6 +53,7 @@ export class GenerationHandler {
53
53
  ...(shouldUseTools && { toolChoice: "auto" }),
54
54
  temperature: options.temperature,
55
55
  maxTokens: options.maxTokens,
56
+ abortSignal: options.abortSignal,
56
57
  ...(useStructuredOutput &&
57
58
  options.schema && {
58
59
  experimental_output: Output.object({ schema: options.schema }),
@@ -272,6 +273,7 @@ export class GenerationHandler {
272
273
  return {
273
274
  content,
274
275
  usage,
276
+ finishReason: generateResult.finishReason,
275
277
  provider: this.providerName,
276
278
  model: this.modelName,
277
279
  toolCalls: generateResult.toolCalls
@@ -13,7 +13,7 @@
13
13
  * @module core/modules/MessageBuilder
14
14
  */
15
15
  import type { CoreMessage } from "ai";
16
- import type { TextGenerationOptions, AIProviderName } from "../../types/index.js";
16
+ import type { AIProviderName, TextGenerationOptions } from "../../types/index.js";
17
17
  import type { StreamOptions } from "../../types/streamTypes.js";
18
18
  /**
19
19
  * MessageBuilder class - Handles message construction for AI providers
@@ -65,6 +65,7 @@ export class MessageBuilder {
65
65
  conversationHistory: options.conversationMessages,
66
66
  schema: options.schema,
67
67
  output: options.output,
68
+ fileRegistry: options.fileRegistry,
68
69
  };
69
70
  messages = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
70
71
  }
@@ -147,6 +148,7 @@ export class MessageBuilder {
147
148
  .conversationMessages,
148
149
  schema: options.schema,
149
150
  output: options.output,
151
+ fileRegistry: options.fileRegistry,
150
152
  };
151
153
  messages = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
152
154
  }
@@ -13,10 +13,9 @@
13
13
  *
14
14
  * @module core/modules/TelemetryHandler
15
15
  */
16
- import type { AIProviderName, EnhancedGenerateResult, TextGenerationOptions, AnalyticsData } from "../../types/index.js";
17
- import type { EvaluationData } from "../../types/index.js";
18
- import type { StreamOptions } from "../../types/streamTypes.js";
19
16
  import type { NeuroLink } from "../../neurolink.js";
17
+ import type { AIProviderName, AnalyticsData, EnhancedGenerateResult, EvaluationData, TextGenerationOptions } from "../../types/index.js";
18
+ import type { StreamOptions } from "../../types/streamTypes.js";
20
19
  /**
21
20
  * TelemetryHandler class - Handles analytics and telemetry for AI providers
22
21
  */
@@ -13,10 +13,10 @@
13
13
  *
14
14
  * @module core/modules/TelemetryHandler
15
15
  */
16
- import { logger } from "../../utils/logger.js";
17
16
  import { nanoid } from "nanoid";
17
+ import { logger } from "../../utils/logger.js";
18
+ import { getPerformanceOptimizedProvider, recordProviderPerformanceFromMetrics, } from "../evaluationProviders.js";
18
19
  import { modelConfig } from "../modelConfiguration.js";
19
- import { recordProviderPerformanceFromMetrics, getPerformanceOptimizedProvider, } from "../evaluationProviders.js";
20
20
  /**
21
21
  * TelemetryHandler class - Handles analytics and telemetry for AI providers
22
22
  */
@@ -147,7 +147,7 @@ export class TelemetryHandler {
147
147
  isEnabled: true,
148
148
  functionId,
149
149
  metadata,
150
- recordInputs: true,
150
+ recordInputs: false,
151
151
  recordOutputs: true,
152
152
  };
153
153
  }
@@ -21,12 +21,12 @@ import type { NeuroLink } from "../../neurolink.js";
21
21
  /**
22
22
  * Utility functions interface for ToolsManager
23
23
  */
24
- export interface ToolUtilities {
24
+ export type ToolUtilities = {
25
25
  isZodSchema?: (schema: unknown) => boolean;
26
26
  convertToolResult?: (result: unknown) => Promise<unknown>;
27
27
  createPermissiveZodSchema?: () => z.ZodSchema;
28
28
  fixSchemaForOpenAIStrictMode?: (schema: Record<string, unknown>) => Record<string, unknown>;
29
- }
29
+ };
30
30
  /**
31
31
  * ToolsManager class - Handles all tool management operations
32
32
  */
@@ -2,14 +2,16 @@
2
2
  * Redis Conversation Memory Manager for NeuroLink
3
3
  * Redis-based implementation of conversation storage with same interface as ConversationMemoryManager
4
4
  */
5
- import type { ConversationMemoryConfig, ConversationMemoryStats, ChatMessage, RedisStorageConfig, SessionMetadata, RedisConversationObject, StoreConversationTurnOptions } from "../types/conversation.js";
5
+ import type { ChatMessage, ConversationMemoryConfig, ConversationMemoryStats, RedisConversationObject, RedisStorageConfig, SessionMemory, SessionMetadata, StoreConversationTurnOptions } from "../types/conversation.js";
6
+ import type { IConversationMemoryManager } from "../types/conversationMemoryInterface.js";
6
7
  /**
7
8
  * Redis-based implementation of the ConversationMemoryManager
8
9
  * Uses the same interface but stores data in Redis
9
10
  */
10
- export declare class RedisConversationMemoryManager {
11
+ export declare class RedisConversationMemoryManager implements IConversationMemoryManager {
11
12
  config: ConversationMemoryConfig;
12
13
  private isInitialized;
14
+ private summarizationEngine;
13
15
  private redisConfig;
14
16
  private redisClient;
15
17
  /**
@@ -32,6 +34,21 @@ export declare class RedisConversationMemoryManager {
32
34
  * Initialize the memory manager with Redis connection
33
35
  */
34
36
  initialize(): Promise<void>;
37
+ /** Whether this memory manager can persist data (Redis connected and initialized) */
38
+ get canPersist(): boolean;
39
+ /** Whether Redis client is configured and connected */
40
+ get isRedisConfigured(): boolean;
41
+ /** Get health status for monitoring */
42
+ getHealthStatus(): {
43
+ initialized: boolean;
44
+ connected: boolean;
45
+ host: string;
46
+ keyPrefix: string;
47
+ };
48
+ /**
49
+ * Get session by ID, reconstructing a SessionMemory from Redis storage.
50
+ */
51
+ getSession(sessionId: string, userId?: string): Promise<SessionMemory | undefined>;
35
52
  /**
36
53
  * Get all sessions for a specific user
37
54
  */
@@ -70,18 +87,6 @@ export declare class RedisConversationMemoryManager {
70
87
  * Check if summarization is needed based on token count
71
88
  */
72
89
  private checkAndSummarize;
73
- /**
74
- * Estimate total tokens for a list of messages
75
- */
76
- private estimateTokens;
77
- /**
78
- * Token-based summarization (pointer-based, non-destructive)
79
- */
80
- private summarizeSessionTokenBased;
81
- /**
82
- * Find split index to keep recent messages within target token count
83
- */
84
- private findSplitIndexByTokens;
85
90
  /**
86
91
  * Build context messages for AI prompt injection (TOKEN-BASED)
87
92
  * Returns messages from pointer onwards (or all if no pointer)
@@ -3,13 +3,13 @@
3
3
  * Redis-based implementation of conversation storage with same interface as ConversationMemoryManager
4
4
  */
5
5
  import { randomUUID } from "crypto";
6
+ import { MESSAGES_PER_TURN } from "../config/conversationMemory.js";
7
+ import { SummarizationEngine } from "../context/summarizationEngine.js";
8
+ import { NeuroLink } from "../neurolink.js";
6
9
  import { ConversationMemoryError } from "../types/conversation.js";
7
- import { MESSAGES_PER_TURN, RECENT_MESSAGES_RATIO, } from "../config/conversationMemory.js";
10
+ import { buildContextFromPointer, getEffectiveTokenThreshold, } from "../utils/conversationMemory.js";
8
11
  import { logger } from "../utils/logger.js";
9
- import { NeuroLink } from "../neurolink.js";
10
- import { createRedisClient, getSessionKey, getUserSessionsKey, getNormalizedConfig, serializeConversation, deserializeConversation, scanKeys, } from "../utils/redis.js";
11
- import { TokenUtils } from "../constants/tokens.js";
12
- import { buildContextFromPointer, getEffectiveTokenThreshold, generateSummary, } from "../utils/conversationMemory.js";
12
+ import { createRedisClient, deserializeConversation, getNormalizedConfig, getPooledRedisClient, getSessionKey, getUserSessionsKey, releasePooledRedisClient, scanKeys, serializeConversation, } from "../utils/redis.js";
13
13
  /**
14
14
  * Redis-based implementation of the ConversationMemoryManager
15
15
  * Uses the same interface but stores data in Redis
@@ -17,6 +17,7 @@ import { buildContextFromPointer, getEffectiveTokenThreshold, generateSummary, }
17
17
  export class RedisConversationMemoryManager {
18
18
  config;
19
19
  isInitialized = false;
20
+ summarizationEngine = new SummarizationEngine();
20
21
  redisConfig;
21
22
  redisClient = null;
22
23
  /**
@@ -53,7 +54,7 @@ export class RedisConversationMemoryManager {
53
54
  keyPrefix: this.redisConfig.keyPrefix,
54
55
  ttl: this.redisConfig.ttl,
55
56
  });
56
- this.redisClient = await createRedisClient(this.redisConfig);
57
+ this.redisClient = await getPooledRedisClient(this.redisConfig);
57
58
  this.isInitialized = true;
58
59
  logger.info("RedisConversationMemoryManager initialized", {
59
60
  storage: "redis",
@@ -76,7 +77,64 @@ export class RedisConversationMemoryManager {
76
77
  port: this.redisConfig.port,
77
78
  },
78
79
  });
79
- throw new ConversationMemoryError("Failed to initialize Redis conversation memory", "CONFIG_ERROR", { error: error instanceof Error ? error.message : String(error) });
80
+ throw new ConversationMemoryError("Failed to initialize Redis conversation memory", "CONFIG_ERROR", {
81
+ error: error instanceof Error ? error.message : String(error),
82
+ });
83
+ }
84
+ }
85
+ /** Whether this memory manager can persist data (Redis connected and initialized) */
86
+ get canPersist() {
87
+ return (this.isInitialized && this.redisClient !== null && this.redisClient.isOpen);
88
+ }
89
+ /** Whether Redis client is configured and connected */
90
+ get isRedisConfigured() {
91
+ return this.redisClient !== null && this.redisClient.isOpen;
92
+ }
93
+ /** Get health status for monitoring */
94
+ getHealthStatus() {
95
+ return {
96
+ initialized: this.isInitialized,
97
+ connected: this.redisClient?.isOpen ?? false,
98
+ host: this.redisConfig.host,
99
+ keyPrefix: this.redisConfig.keyPrefix,
100
+ };
101
+ }
102
+ /**
103
+ * Get session by ID, reconstructing a SessionMemory from Redis storage.
104
+ */
105
+ async getSession(sessionId, userId) {
106
+ await this.ensureInitialized();
107
+ if (!this.redisClient) {
108
+ return undefined;
109
+ }
110
+ try {
111
+ const redisKey = getSessionKey(this.redisConfig, sessionId, userId);
112
+ const conversationData = await this.redisClient.get(redisKey);
113
+ const conversation = deserializeConversation(conversationData || null);
114
+ if (!conversation) {
115
+ return undefined;
116
+ }
117
+ return {
118
+ sessionId: conversation.sessionId,
119
+ userId: conversation.userId,
120
+ messages: conversation.messages,
121
+ summarizedUpToMessageId: conversation.summarizedUpToMessageId,
122
+ summarizedMessage: conversation.summarizedMessage,
123
+ tokenThreshold: conversation.tokenThreshold,
124
+ lastTokenCount: conversation.lastTokenCount,
125
+ lastCountedAt: conversation.lastCountedAt,
126
+ lastApiTokenCount: conversation.lastApiTokenCount,
127
+ createdAt: new Date(conversation.createdAt).getTime(),
128
+ lastActivity: new Date(conversation.updatedAt).getTime(),
129
+ };
130
+ }
131
+ catch (error) {
132
+ logger.error("[RedisConversationMemoryManager] Failed to get session", {
133
+ sessionId,
134
+ userId,
135
+ error: error instanceof Error ? error.message : String(error),
136
+ });
137
+ return undefined;
80
138
  }
81
139
  }
82
140
  /**
@@ -300,6 +358,10 @@ export class RedisConversationMemoryManager {
300
358
  events: options.events || undefined,
301
359
  };
302
360
  conversation.messages.push(assistantMsg);
361
+ // Store API-reported token counts if available
362
+ if (options.tokenUsage) {
363
+ conversation.lastApiTokenCount = options.tokenUsage;
364
+ }
303
365
  logger.info("[RedisConversationMemoryManager] Added new messages", {
304
366
  sessionId: conversation.sessionId,
305
367
  userId: conversation.userId,
@@ -359,7 +421,6 @@ export class RedisConversationMemoryManager {
359
421
  async checkAndSummarize(conversation, threshold, sessionId, userId) {
360
422
  const normalizedUserId = userId || "randomUser";
361
423
  const summarizationKey = `${sessionId}:${normalizedUserId}`;
362
- // Acquire lock - if already in progress, skip
363
424
  if (this.summarizationInProgress.has(summarizationKey)) {
364
425
  logger.debug("[RedisConversationMemoryManager] Summarization already in progress, skipping", {
365
426
  sessionId,
@@ -381,12 +442,20 @@ export class RedisConversationMemoryManager {
381
442
  createdAt: new Date(conversation.createdAt).getTime(),
382
443
  lastActivity: new Date(conversation.updatedAt).getTime(),
383
444
  };
384
- const contextMessages = buildContextFromPointer(session);
385
- const tokenCount = this.estimateTokens(contextMessages);
386
- conversation.lastTokenCount = tokenCount;
387
- conversation.lastCountedAt = Date.now();
388
- if (tokenCount >= threshold) {
389
- await this.summarizeSessionTokenBased(conversation, threshold, sessionId, userId);
445
+ const summarized = await this.summarizationEngine.checkAndSummarize(session, threshold, this.config, "[RedisConversationMemoryManager]");
446
+ conversation.lastTokenCount = session.lastTokenCount;
447
+ conversation.lastCountedAt = session.lastCountedAt;
448
+ if (summarized) {
449
+ conversation.summarizedUpToMessageId = session.summarizedUpToMessageId;
450
+ conversation.summarizedMessage = session.summarizedMessage;
451
+ if (this.redisClient) {
452
+ const redisKey = getSessionKey(this.redisConfig, sessionId, userId);
453
+ const serializedData = serializeConversation(conversation);
454
+ await this.redisClient.set(redisKey, serializedData);
455
+ if (this.redisConfig.ttl > 0) {
456
+ await this.redisClient.expire(redisKey, this.redisConfig.ttl);
457
+ }
458
+ }
390
459
  }
391
460
  }
392
461
  catch (error) {
@@ -396,71 +465,9 @@ export class RedisConversationMemoryManager {
396
465
  });
397
466
  }
398
467
  finally {
399
- // Release lock when done
400
468
  this.summarizationInProgress.delete(summarizationKey);
401
469
  }
402
470
  }
403
- /**
404
- * Estimate total tokens for a list of messages
405
- */
406
- estimateTokens(messages) {
407
- return messages.reduce((total, msg) => {
408
- return total + TokenUtils.estimateTokenCount(msg.content);
409
- }, 0);
410
- }
411
- /**
412
- * Token-based summarization (pointer-based, non-destructive)
413
- */
414
- async summarizeSessionTokenBased(conversation, threshold, sessionId, userId) {
415
- const startIndex = conversation.summarizedUpToMessageId
416
- ? conversation.messages.findIndex((m) => m.id === conversation.summarizedUpToMessageId) + 1
417
- : 0;
418
- const recentMessages = conversation.messages.slice(startIndex);
419
- if (recentMessages.length === 0) {
420
- return;
421
- }
422
- // We only want to include user, assistant, and system messages in summarization
423
- const filteredRecentMessages = recentMessages.filter((msg) => msg.role !== "tool_call" && msg.role !== "tool_result");
424
- const targetRecentTokens = threshold * RECENT_MESSAGES_RATIO;
425
- const splitIndex = await this.findSplitIndexByTokens(filteredRecentMessages, targetRecentTokens);
426
- const messagesToSummarize = filteredRecentMessages.slice(0, splitIndex);
427
- if (messagesToSummarize.length === 0) {
428
- return;
429
- }
430
- const summary = await generateSummary(messagesToSummarize, this.config, "[RedisConversationMemoryManager]", conversation.summarizedMessage);
431
- if (!summary) {
432
- logger.warn(`[RedisConversationMemoryManager] Summary generation failed for session ${conversation.sessionId}`);
433
- return;
434
- }
435
- const lastSummarized = messagesToSummarize[messagesToSummarize.length - 1];
436
- conversation.summarizedUpToMessageId = lastSummarized.id;
437
- conversation.summarizedMessage = summary;
438
- if (this.redisClient) {
439
- const redisKey = getSessionKey(this.redisConfig, sessionId, userId);
440
- const serializedData = serializeConversation(conversation);
441
- await this.redisClient.set(redisKey, serializedData);
442
- if (this.redisConfig.ttl > 0) {
443
- await this.redisClient.expire(redisKey, this.redisConfig.ttl);
444
- }
445
- }
446
- }
447
- /**
448
- * Find split index to keep recent messages within target token count
449
- */
450
- async findSplitIndexByTokens(messages, targetRecentTokens) {
451
- let recentTokens = 0;
452
- let splitIndex = messages.length;
453
- for (let i = messages.length - 1; i >= 0; i--) {
454
- const msgTokens = TokenUtils.estimateTokenCount(messages[i].content);
455
- if (recentTokens + msgTokens > targetRecentTokens) {
456
- splitIndex = i + 1;
457
- break;
458
- }
459
- recentTokens += msgTokens;
460
- }
461
- // Ensure we're summarizing at least something
462
- return Math.max(1, splitIndex);
463
- }
464
471
  /**
465
472
  * Build context messages for AI prompt injection (TOKEN-BASED)
466
473
  * Returns messages from pointer onwards (or all if no pointer)
@@ -625,7 +632,10 @@ export class RedisConversationMemoryManager {
625
632
  }
626
633
  await this.ensureInitialized();
627
634
  if (!this.redisClient) {
628
- logger.warn("[RedisConversationMemoryManager] Redis client not available for getUserSessionObject", { userId, sessionId });
635
+ logger.warn("[RedisConversationMemoryManager] Redis client not available for getUserSessionObject", {
636
+ userId,
637
+ sessionId,
638
+ });
629
639
  return null;
630
640
  }
631
641
  try {
@@ -678,7 +688,7 @@ export class RedisConversationMemoryManager {
678
688
  * Uses AI to create a concise, descriptive title (5-8 words)
679
689
  */
680
690
  async generateConversationTitle(userMessage) {
681
- logger.debug("[RedisConversationMemoryManager] Generating conversation title", {
691
+ logger.info("[RedisConversationMemoryManager] Generating conversation title", {
682
692
  userMessageLength: userMessage.length,
683
693
  userMessagePreview: userMessage.substring(0, 100),
684
694
  });
@@ -687,12 +697,12 @@ export class RedisConversationMemoryManager {
687
697
  const titleGenerator = new NeuroLink({
688
698
  conversationMemory: { enabled: false },
689
699
  });
690
- const titlePrompt = `Generate a clear, concise, and descriptive title (5–8 words maximum) for a conversation based on the following user message.
691
- The title must meaningfully reflect the topic or intent of the message.
692
- Do not output anything unrelated, vague, or generic.
700
+ const titlePrompt = `Generate a clear, concise, and descriptive title (5–8 words maximum) for a conversation based on the following user message.
701
+ The title must meaningfully reflect the topic or intent of the message.
702
+ Do not output anything unrelated, vague, or generic.
693
703
  Do not say you cannot create a title. Always return a valid title.
694
704
 
695
- User message: "${userMessage}`;
705
+ User message: "${userMessage}"`;
696
706
  const result = await titleGenerator.generate({
697
707
  input: { text: titlePrompt },
698
708
  provider: this.config.summarizationProvider || "vertex",
@@ -711,7 +721,7 @@ User message: "${userMessage}`;
711
721
  if (title.length < 3) {
712
722
  title = "New Conversation";
713
723
  }
714
- logger.debug("[RedisConversationMemoryManager] Generated conversation title", {
724
+ logger.info("[RedisConversationMemoryManager] Generated conversation title", {
715
725
  originalLength: result.content?.length || 0,
716
726
  cleanedTitle: title,
717
727
  titleLength: title.length,
@@ -751,7 +761,7 @@ User message: "${userMessage}`;
751
761
  */
752
762
  async close() {
753
763
  if (this.redisClient) {
754
- await this.redisClient.quit();
764
+ await releasePooledRedisClient(this.redisConfig);
755
765
  this.redisClient = null;
756
766
  this.isInitialized = false;
757
767
  logger.info("Redis connection closed");
@@ -903,8 +913,6 @@ User message: "${userMessage}`;
903
913
  ? sessionError.message
904
914
  : String(sessionError),
905
915
  });
906
- // Continue with other sessions even if one fails
907
- continue;
908
916
  }
909
917
  }
910
918
  return results;
@@ -10,11 +10,11 @@ type ProviderConstructor = {
10
10
  /**
11
11
  * Provider registration entry
12
12
  */
13
- interface ProviderRegistration {
13
+ type ProviderRegistration = {
14
14
  constructor: ProviderConstructor;
15
15
  defaultModel?: string;
16
16
  aliases?: string[];
17
- }
17
+ };
18
18
  /**
19
19
  * True Factory Pattern implementation for AI Providers
20
20
  * Uses registration-based approach to eliminate switch statements