@juspay/neurolink 9.54.5 → 9.54.7

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 (432) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/action/actionInputs.d.ts +1 -1
  3. package/dist/adapters/video/directorPipeline.js +6 -0
  4. package/dist/adapters/video/vertexVideoHandler.js +6 -0
  5. package/dist/agent/directTools.d.ts +3 -23
  6. package/dist/auth/AuthProviderFactory.d.ts +1 -3
  7. package/dist/auth/anthropicOAuth.d.ts +4 -7
  8. package/dist/auth/anthropicOAuth.js +23 -0
  9. package/dist/auth/errors.d.ts +1 -1
  10. package/dist/auth/index.d.ts +11 -0
  11. package/dist/auth/index.js +14 -0
  12. package/dist/auth/middleware/AuthMiddleware.d.ts +5 -60
  13. package/dist/auth/middleware/AuthMiddleware.js +3 -0
  14. package/dist/auth/middleware/rateLimitByUser.d.ts +4 -93
  15. package/dist/auth/middleware/rateLimitByUser.js +4 -0
  16. package/dist/auth/providers/BaseAuthProvider.d.ts +1 -1
  17. package/dist/auth/providers/CognitoProvider.js +3 -0
  18. package/dist/auth/providers/KeycloakProvider.js +3 -0
  19. package/dist/auth/providers/auth0.d.ts +1 -1
  20. package/dist/auth/sessionManager.d.ts +2 -0
  21. package/dist/auth/sessionManager.js +53 -11
  22. package/dist/auth/tokenStore.d.ts +2 -1
  23. package/dist/auth/tokenStore.js +45 -4
  24. package/dist/autoresearch/tools.d.ts +1 -16
  25. package/dist/browser/neurolink.min.js +353 -353
  26. package/dist/cli/commands/config.d.ts +3 -123
  27. package/dist/cli/commands/config.js +4 -2
  28. package/dist/cli/commands/evaluate.d.ts +1 -19
  29. package/dist/cli/commands/proxy.d.ts +1 -1
  30. package/dist/cli/commands/proxy.js +3 -0
  31. package/dist/cli/commands/rag.js +3 -0
  32. package/dist/cli/commands/setup-anthropic.d.ts +2 -6
  33. package/dist/cli/commands/setup-anthropic.js +1 -1
  34. package/dist/cli/commands/setup-azure.d.ts +2 -6
  35. package/dist/cli/commands/setup-azure.js +1 -1
  36. package/dist/cli/commands/setup-bedrock.d.ts +2 -6
  37. package/dist/cli/commands/setup-bedrock.js +1 -1
  38. package/dist/cli/commands/setup-gcp.d.ts +2 -6
  39. package/dist/cli/commands/setup-google-ai.d.ts +2 -6
  40. package/dist/cli/commands/setup-google-ai.js +1 -1
  41. package/dist/cli/commands/setup-huggingface.d.ts +1 -5
  42. package/dist/cli/commands/setup-mistral.d.ts +1 -5
  43. package/dist/cli/commands/setup-openai.d.ts +2 -6
  44. package/dist/cli/commands/setup-openai.js +1 -1
  45. package/dist/cli/commands/setup.d.ts +1 -8
  46. package/dist/cli/commands/task.js +1 -0
  47. package/dist/cli/commands/voiceServer.d.ts +1 -4
  48. package/dist/cli/loop/session.js +31 -10
  49. package/dist/cli/utils/interactiveSetup.d.ts +2 -15
  50. package/dist/cli/utils/videoFileUtils.d.ts +1 -15
  51. package/dist/client/aiSdkAdapter.d.ts +1 -1
  52. package/dist/client/aiSdkAdapter.js +1 -0
  53. package/dist/client/httpClient.d.ts +2 -2
  54. package/dist/client/httpClient.js +13 -0
  55. package/dist/client/sseClient.d.ts +2 -2
  56. package/dist/client/sseClient.js +29 -0
  57. package/dist/client/streamingClient.d.ts +2 -0
  58. package/dist/client/streamingClient.js +19 -0
  59. package/dist/client/wsClient.d.ts +7 -2
  60. package/dist/client/wsClient.js +90 -10
  61. package/dist/context/budgetChecker.js +3 -1
  62. package/dist/context/contextCompactor.js +163 -143
  63. package/dist/context/fileSummarizationService.d.ts +1 -9
  64. package/dist/context/summarizationEngine.js +29 -16
  65. package/dist/core/baseProvider.js +124 -153
  66. package/dist/core/infrastructure/baseRegistry.d.ts +1 -7
  67. package/dist/core/modules/GenerationHandler.d.ts +3 -2
  68. package/dist/core/modules/GenerationHandler.js +9 -1
  69. package/dist/core/modules/StreamHandler.js +9 -0
  70. package/dist/core/modules/ToolsManager.js +18 -2
  71. package/dist/core/toolEvents.d.ts +0 -1
  72. package/dist/evaluation/BatchEvaluator.d.ts +1 -97
  73. package/dist/evaluation/EvaluationAggregator.d.ts +1 -118
  74. package/dist/evaluation/EvaluatorFactory.d.ts +1 -13
  75. package/dist/evaluation/EvaluatorRegistry.d.ts +1 -50
  76. package/dist/evaluation/errors/EvaluationError.d.ts +2 -27
  77. package/dist/evaluation/hooks/langfuseAdapter.d.ts +1 -39
  78. package/dist/evaluation/hooks/observabilityHooks.d.ts +3 -55
  79. package/dist/evaluation/hooks/observabilityHooks.js +3 -0
  80. package/dist/evaluation/pipeline/strategies/batchStrategy.d.ts +7 -61
  81. package/dist/evaluation/pipeline/strategies/batchStrategy.js +7 -7
  82. package/dist/evaluation/ragasEvaluator.js +54 -37
  83. package/dist/evaluation/reporting/metricsCollector.d.ts +1 -60
  84. package/dist/evaluation/reporting/reportGenerator.d.ts +1 -17
  85. package/dist/evaluation/scorers/rule/contentSimilarityScorer.d.ts +1 -29
  86. package/dist/evaluation/scorers/rule/formatScorer.d.ts +1 -42
  87. package/dist/evaluation/scorers/rule/keywordCoverageScorer.d.ts +1 -19
  88. package/dist/evaluation/scorers/rule/lengthScorer.d.ts +1 -33
  89. package/dist/factories/providerFactory.d.ts +1 -16
  90. package/dist/factories/providerFactory.js +2 -0
  91. package/dist/image-gen/ImageGenService.d.ts +3 -0
  92. package/dist/image-gen/ImageGenService.js +3 -0
  93. package/dist/lib/action/actionInputs.d.ts +1 -1
  94. package/dist/lib/adapters/video/directorPipeline.js +6 -0
  95. package/dist/lib/adapters/video/vertexVideoHandler.js +6 -0
  96. package/dist/lib/agent/directTools.d.ts +3 -23
  97. package/dist/lib/auth/AuthProviderFactory.d.ts +1 -3
  98. package/dist/lib/auth/anthropicOAuth.d.ts +4 -7
  99. package/dist/lib/auth/anthropicOAuth.js +23 -0
  100. package/dist/lib/auth/errors.d.ts +1 -1
  101. package/dist/lib/auth/index.d.ts +11 -0
  102. package/dist/lib/auth/index.js +14 -0
  103. package/dist/lib/auth/middleware/AuthMiddleware.d.ts +5 -60
  104. package/dist/lib/auth/middleware/AuthMiddleware.js +3 -0
  105. package/dist/lib/auth/middleware/rateLimitByUser.d.ts +4 -93
  106. package/dist/lib/auth/middleware/rateLimitByUser.js +4 -0
  107. package/dist/lib/auth/providers/BaseAuthProvider.d.ts +1 -1
  108. package/dist/lib/auth/providers/CognitoProvider.js +3 -0
  109. package/dist/lib/auth/providers/KeycloakProvider.js +3 -0
  110. package/dist/lib/auth/providers/auth0.d.ts +1 -1
  111. package/dist/lib/auth/sessionManager.d.ts +2 -0
  112. package/dist/lib/auth/sessionManager.js +53 -11
  113. package/dist/lib/auth/tokenStore.d.ts +2 -1
  114. package/dist/lib/auth/tokenStore.js +45 -4
  115. package/dist/lib/autoresearch/tools.d.ts +1 -16
  116. package/dist/lib/client/aiSdkAdapter.d.ts +1 -1
  117. package/dist/lib/client/aiSdkAdapter.js +1 -0
  118. package/dist/lib/client/httpClient.d.ts +2 -2
  119. package/dist/lib/client/httpClient.js +13 -0
  120. package/dist/lib/client/sseClient.d.ts +2 -2
  121. package/dist/lib/client/sseClient.js +29 -0
  122. package/dist/lib/client/streamingClient.d.ts +2 -0
  123. package/dist/lib/client/streamingClient.js +19 -0
  124. package/dist/lib/client/wsClient.d.ts +7 -2
  125. package/dist/lib/client/wsClient.js +90 -10
  126. package/dist/lib/context/budgetChecker.js +3 -1
  127. package/dist/lib/context/contextCompactor.js +163 -143
  128. package/dist/lib/context/fileSummarizationService.d.ts +1 -9
  129. package/dist/lib/context/summarizationEngine.js +29 -16
  130. package/dist/lib/core/baseProvider.js +124 -153
  131. package/dist/lib/core/infrastructure/baseRegistry.d.ts +1 -7
  132. package/dist/lib/core/modules/GenerationHandler.d.ts +3 -2
  133. package/dist/lib/core/modules/GenerationHandler.js +9 -1
  134. package/dist/lib/core/modules/StreamHandler.js +9 -0
  135. package/dist/lib/core/modules/ToolsManager.js +18 -2
  136. package/dist/lib/core/toolEvents.d.ts +0 -1
  137. package/dist/lib/evaluation/BatchEvaluator.d.ts +1 -97
  138. package/dist/lib/evaluation/EvaluationAggregator.d.ts +1 -118
  139. package/dist/lib/evaluation/EvaluatorFactory.d.ts +1 -13
  140. package/dist/lib/evaluation/EvaluatorRegistry.d.ts +1 -50
  141. package/dist/lib/evaluation/errors/EvaluationError.d.ts +2 -27
  142. package/dist/lib/evaluation/hooks/langfuseAdapter.d.ts +1 -39
  143. package/dist/lib/evaluation/hooks/observabilityHooks.d.ts +3 -55
  144. package/dist/lib/evaluation/hooks/observabilityHooks.js +3 -0
  145. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.d.ts +7 -61
  146. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +7 -7
  147. package/dist/lib/evaluation/ragasEvaluator.js +54 -37
  148. package/dist/lib/evaluation/reporting/metricsCollector.d.ts +1 -60
  149. package/dist/lib/evaluation/reporting/reportGenerator.d.ts +1 -17
  150. package/dist/lib/evaluation/scorers/rule/contentSimilarityScorer.d.ts +1 -29
  151. package/dist/lib/evaluation/scorers/rule/formatScorer.d.ts +1 -42
  152. package/dist/lib/evaluation/scorers/rule/keywordCoverageScorer.d.ts +1 -19
  153. package/dist/lib/evaluation/scorers/rule/lengthScorer.d.ts +1 -33
  154. package/dist/lib/factories/providerFactory.d.ts +1 -16
  155. package/dist/lib/factories/providerFactory.js +2 -0
  156. package/dist/lib/image-gen/ImageGenService.d.ts +3 -0
  157. package/dist/lib/image-gen/ImageGenService.js +3 -0
  158. package/dist/lib/mcp/batching/requestBatcher.js +99 -73
  159. package/dist/lib/mcp/httpRateLimiter.js +3 -1
  160. package/dist/lib/mcp/httpRetryHandler.js +3 -1
  161. package/dist/lib/mcp/mcpClientFactory.js +3 -1
  162. package/dist/lib/mcp/multiServerManager.d.ts +1 -14
  163. package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +5 -1
  164. package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  165. package/dist/lib/mcp/toolDiscoveryService.js +70 -57
  166. package/dist/lib/mcp/toolRegistry.js +11 -1
  167. package/dist/lib/memory/hippocampusInitializer.d.ts +1 -2
  168. package/dist/lib/memory/hippocampusInitializer.js +1 -1
  169. package/dist/lib/memory/memoryRetrievalTools.js +182 -141
  170. package/dist/lib/models/anthropicModels.d.ts +0 -1
  171. package/dist/lib/models/anthropicModels.js +1 -0
  172. package/dist/lib/neurolink.js +237 -41
  173. package/dist/lib/observability/exporterRegistry.d.ts +3 -22
  174. package/dist/lib/observability/exporters/sentryExporter.js +1 -0
  175. package/dist/lib/observability/metricsAggregator.d.ts +1 -31
  176. package/dist/lib/observability/retryPolicy.d.ts +0 -1
  177. package/dist/lib/observability/sampling/samplers.d.ts +0 -1
  178. package/dist/lib/observability/spanProcessor.d.ts +0 -1
  179. package/dist/lib/observability/tokenTracker.d.ts +7 -16
  180. package/dist/lib/observability/tokenTracker.js +6 -4
  181. package/dist/lib/observability/utils/spanSerializer.d.ts +5 -1
  182. package/dist/lib/observability/utils/spanSerializer.js +24 -4
  183. package/dist/lib/processors/base/BaseFileProcessor.js +66 -53
  184. package/dist/lib/processors/document/ExcelProcessor.d.ts +1 -1
  185. package/dist/lib/processors/errors/errorHelpers.d.ts +1 -31
  186. package/dist/lib/processors/errors/errorSerializer.d.ts +1 -45
  187. package/dist/lib/processors/registry/ProcessorRegistry.js +17 -6
  188. package/dist/lib/providers/amazonBedrock.js +189 -15
  189. package/dist/lib/providers/amazonSagemaker.js +25 -11
  190. package/dist/lib/providers/anthropic.js +13 -0
  191. package/dist/lib/providers/azureOpenai.js +2 -0
  192. package/dist/lib/providers/googleAiStudio.js +82 -0
  193. package/dist/lib/providers/googleNativeGemini3.d.ts +1 -2
  194. package/dist/lib/providers/googleVertex.js +52 -0
  195. package/dist/lib/providers/huggingFace.js +2 -0
  196. package/dist/lib/providers/litellm.js +2 -0
  197. package/dist/lib/providers/mistral.js +2 -0
  198. package/dist/lib/providers/ollama.js +84 -5
  199. package/dist/lib/providers/openAI.d.ts +2 -0
  200. package/dist/lib/providers/openAI.js +17 -6
  201. package/dist/lib/providers/openRouter.js +2 -0
  202. package/dist/lib/providers/openaiCompatible.js +2 -0
  203. package/dist/lib/providers/sagemaker/detection.d.ts +1 -33
  204. package/dist/lib/providers/sagemaker/diagnostics.d.ts +1 -25
  205. package/dist/lib/providers/sagemaker/language-model.d.ts +1 -1
  206. package/dist/lib/proxy/proxyConfig.js +4 -0
  207. package/dist/lib/proxy/proxyEnv.d.ts +1 -17
  208. package/dist/lib/proxy/proxyHealth.d.ts +0 -1
  209. package/dist/lib/proxy/proxyTracer.d.ts +1 -36
  210. package/dist/lib/proxy/proxyTracer.js +9 -0
  211. package/dist/lib/proxy/quietDetector.d.ts +1 -7
  212. package/dist/lib/proxy/rawStreamCapture.d.ts +1 -10
  213. package/dist/lib/proxy/requestLogger.d.ts +1 -21
  214. package/dist/lib/proxy/routingPolicy.d.ts +1 -2
  215. package/dist/lib/proxy/sseInterceptor.d.ts +1 -66
  216. package/dist/lib/proxy/sseInterceptor.js +6 -0
  217. package/dist/lib/proxy/updateChecker.d.ts +1 -6
  218. package/dist/lib/proxy/updateState.d.ts +1 -12
  219. package/dist/lib/rag/chunkers/BaseChunker.js +36 -22
  220. package/dist/lib/rag/chunking/jsonChunker.d.ts +1 -1
  221. package/dist/lib/rag/errors/RAGError.d.ts +1 -2
  222. package/dist/lib/rag/ragIntegration.js +45 -32
  223. package/dist/lib/rag/reranker/reranker.js +151 -122
  224. package/dist/lib/rag/retrieval/vectorQueryTool.js +79 -65
  225. package/dist/lib/sdk/toolRegistration.d.ts +10 -44
  226. package/dist/lib/sdk/toolRegistration.js +1 -1
  227. package/dist/lib/server/middleware/abortSignal.d.ts +1 -11
  228. package/dist/lib/server/middleware/auth.d.ts +1 -21
  229. package/dist/lib/server/middleware/auth.js +12 -0
  230. package/dist/lib/server/middleware/common.js +48 -32
  231. package/dist/lib/server/middleware/deprecation.d.ts +1 -20
  232. package/dist/lib/server/middleware/rateLimit.d.ts +1 -75
  233. package/dist/lib/server/middleware/validation.d.ts +3 -81
  234. package/dist/lib/server/middleware/validation.js +3 -0
  235. package/dist/lib/server/openapi/generator.d.ts +1 -47
  236. package/dist/lib/server/routes/agentRoutes.js +112 -57
  237. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +1 -6
  238. package/dist/lib/server/routes/claudeProxyRoutes.js +127 -13
  239. package/dist/lib/server/routes/healthRoutes.js +58 -12
  240. package/dist/lib/server/routes/index.d.ts +1 -26
  241. package/dist/lib/server/routes/mcpRoutes.js +40 -7
  242. package/dist/lib/server/routes/memoryRoutes.js +22 -7
  243. package/dist/lib/server/routes/openApiRoutes.js +30 -6
  244. package/dist/lib/server/routes/toolRoutes.js +140 -68
  245. package/dist/lib/server/streaming/dataStream.d.ts +1 -35
  246. package/dist/lib/server/streaming/dataStream.js +15 -0
  247. package/dist/lib/services/server/ai/observability/instrumentation.js +114 -14
  248. package/dist/lib/session/globalSessionState.d.ts +1 -10
  249. package/dist/lib/tasks/tools/taskTools.d.ts +2 -2
  250. package/dist/lib/telemetry/traceContext.d.ts +9 -0
  251. package/dist/lib/telemetry/traceContext.js +19 -0
  252. package/dist/lib/telemetry/tracers.d.ts +2 -0
  253. package/dist/lib/telemetry/tracers.js +2 -0
  254. package/dist/lib/types/action.d.ts +2 -0
  255. package/dist/lib/types/artifact.d.ts +7 -0
  256. package/dist/lib/types/auth.d.ts +125 -18
  257. package/dist/lib/types/autoresearch.d.ts +12 -0
  258. package/dist/lib/types/cli.d.ts +415 -0
  259. package/dist/lib/types/client.d.ts +34 -0
  260. package/dist/lib/types/common.d.ts +12 -41
  261. package/dist/lib/types/context.d.ts +5 -0
  262. package/dist/lib/types/evaluation.d.ts +332 -1
  263. package/dist/lib/types/file.d.ts +4 -0
  264. package/dist/lib/types/mcp.d.ts +102 -2
  265. package/dist/lib/types/middleware.d.ts +116 -0
  266. package/dist/lib/types/multimodal.d.ts +65 -0
  267. package/dist/lib/types/observability.d.ts +81 -0
  268. package/dist/lib/types/processor.d.ts +47 -0
  269. package/dist/lib/types/providers.d.ts +120 -16
  270. package/dist/lib/types/proxy.d.ts +321 -1
  271. package/dist/lib/types/rag.d.ts +22 -0
  272. package/dist/lib/types/scorer.d.ts +141 -0
  273. package/dist/lib/types/server.d.ts +99 -0
  274. package/dist/lib/types/span.d.ts +2 -1
  275. package/dist/lib/types/span.js +1 -0
  276. package/dist/lib/types/tools.d.ts +44 -0
  277. package/dist/lib/types/tts.d.ts +6 -0
  278. package/dist/lib/types/utilities.d.ts +22 -0
  279. package/dist/lib/types/workflow.d.ts +18 -0
  280. package/dist/lib/utils/async/retry.d.ts +2 -8
  281. package/dist/lib/utils/async/retry.js +9 -9
  282. package/dist/lib/utils/imageCompressor.d.ts +1 -21
  283. package/dist/lib/utils/imageCompressor.js +5 -1
  284. package/dist/lib/utils/messageBuilder.d.ts +1 -1
  285. package/dist/lib/utils/redis.d.ts +1 -4
  286. package/dist/lib/utils/sanitizers/filename.d.ts +0 -1
  287. package/dist/lib/utils/toolEndEmitter.d.ts +25 -0
  288. package/dist/lib/utils/toolEndEmitter.js +65 -0
  289. package/dist/lib/workflow/config.d.ts +7 -32
  290. package/dist/lib/workflow/core/ensembleExecutor.js +28 -0
  291. package/dist/lib/workflow/core/judgeScorer.js +23 -0
  292. package/dist/lib/workflow/core/responseConditioner.js +17 -0
  293. package/dist/lib/workflow/core/workflowRunner.d.ts +1 -19
  294. package/dist/lib/workflow/core/workflowRunner.js +202 -147
  295. package/dist/mcp/batching/requestBatcher.js +99 -73
  296. package/dist/mcp/httpRateLimiter.js +3 -1
  297. package/dist/mcp/httpRetryHandler.js +3 -1
  298. package/dist/mcp/mcpClientFactory.js +3 -1
  299. package/dist/mcp/multiServerManager.d.ts +1 -14
  300. package/dist/mcp/servers/aiProviders/aiAnalysisTools.js +5 -1
  301. package/dist/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  302. package/dist/mcp/toolDiscoveryService.js +70 -57
  303. package/dist/mcp/toolRegistry.js +11 -1
  304. package/dist/memory/hippocampusInitializer.d.ts +1 -2
  305. package/dist/memory/hippocampusInitializer.js +1 -1
  306. package/dist/memory/memoryRetrievalTools.js +182 -141
  307. package/dist/models/anthropicModels.d.ts +0 -1
  308. package/dist/models/anthropicModels.js +1 -0
  309. package/dist/neurolink.js +237 -41
  310. package/dist/observability/exporterRegistry.d.ts +3 -22
  311. package/dist/observability/exporters/sentryExporter.js +1 -0
  312. package/dist/observability/metricsAggregator.d.ts +1 -31
  313. package/dist/observability/retryPolicy.d.ts +0 -1
  314. package/dist/observability/sampling/samplers.d.ts +0 -1
  315. package/dist/observability/spanProcessor.d.ts +0 -1
  316. package/dist/observability/tokenTracker.d.ts +7 -16
  317. package/dist/observability/tokenTracker.js +6 -4
  318. package/dist/observability/utils/spanSerializer.d.ts +5 -1
  319. package/dist/observability/utils/spanSerializer.js +24 -4
  320. package/dist/processors/base/BaseFileProcessor.js +66 -53
  321. package/dist/processors/document/ExcelProcessor.d.ts +1 -1
  322. package/dist/processors/errors/errorHelpers.d.ts +1 -31
  323. package/dist/processors/errors/errorSerializer.d.ts +1 -45
  324. package/dist/processors/registry/ProcessorRegistry.js +17 -6
  325. package/dist/providers/amazonBedrock.js +189 -15
  326. package/dist/providers/amazonSagemaker.js +25 -11
  327. package/dist/providers/anthropic.js +13 -0
  328. package/dist/providers/azureOpenai.js +2 -0
  329. package/dist/providers/googleAiStudio.js +82 -0
  330. package/dist/providers/googleNativeGemini3.d.ts +1 -2
  331. package/dist/providers/googleVertex.js +52 -0
  332. package/dist/providers/huggingFace.js +2 -0
  333. package/dist/providers/litellm.js +2 -0
  334. package/dist/providers/mistral.js +2 -0
  335. package/dist/providers/ollama.js +84 -5
  336. package/dist/providers/openAI.d.ts +2 -0
  337. package/dist/providers/openAI.js +17 -6
  338. package/dist/providers/openRouter.js +2 -0
  339. package/dist/providers/openaiCompatible.js +2 -0
  340. package/dist/providers/sagemaker/detection.d.ts +1 -33
  341. package/dist/providers/sagemaker/diagnostics.d.ts +1 -25
  342. package/dist/providers/sagemaker/language-model.d.ts +1 -1
  343. package/dist/proxy/proxyConfig.js +4 -0
  344. package/dist/proxy/proxyEnv.d.ts +1 -17
  345. package/dist/proxy/proxyHealth.d.ts +0 -1
  346. package/dist/proxy/proxyTracer.d.ts +1 -36
  347. package/dist/proxy/proxyTracer.js +9 -0
  348. package/dist/proxy/quietDetector.d.ts +1 -7
  349. package/dist/proxy/rawStreamCapture.d.ts +1 -10
  350. package/dist/proxy/requestLogger.d.ts +1 -21
  351. package/dist/proxy/routingPolicy.d.ts +1 -2
  352. package/dist/proxy/sseInterceptor.d.ts +1 -66
  353. package/dist/proxy/sseInterceptor.js +6 -0
  354. package/dist/proxy/updateChecker.d.ts +1 -6
  355. package/dist/proxy/updateState.d.ts +1 -12
  356. package/dist/rag/chunkers/BaseChunker.js +36 -22
  357. package/dist/rag/chunking/jsonChunker.d.ts +1 -1
  358. package/dist/rag/errors/RAGError.d.ts +1 -2
  359. package/dist/rag/ragIntegration.js +45 -32
  360. package/dist/rag/reranker/reranker.js +151 -122
  361. package/dist/rag/retrieval/vectorQueryTool.js +79 -65
  362. package/dist/sdk/toolRegistration.d.ts +10 -44
  363. package/dist/sdk/toolRegistration.js +1 -1
  364. package/dist/server/middleware/abortSignal.d.ts +1 -11
  365. package/dist/server/middleware/auth.d.ts +1 -21
  366. package/dist/server/middleware/auth.js +12 -0
  367. package/dist/server/middleware/common.js +48 -32
  368. package/dist/server/middleware/deprecation.d.ts +1 -20
  369. package/dist/server/middleware/rateLimit.d.ts +1 -75
  370. package/dist/server/middleware/validation.d.ts +3 -81
  371. package/dist/server/middleware/validation.js +3 -0
  372. package/dist/server/openapi/generator.d.ts +1 -47
  373. package/dist/server/routes/agentRoutes.js +112 -57
  374. package/dist/server/routes/claudeProxyRoutes.d.ts +1 -6
  375. package/dist/server/routes/claudeProxyRoutes.js +127 -13
  376. package/dist/server/routes/healthRoutes.js +58 -12
  377. package/dist/server/routes/index.d.ts +1 -26
  378. package/dist/server/routes/mcpRoutes.js +40 -7
  379. package/dist/server/routes/memoryRoutes.js +22 -7
  380. package/dist/server/routes/openApiRoutes.js +30 -6
  381. package/dist/server/routes/toolRoutes.js +140 -68
  382. package/dist/server/streaming/dataStream.d.ts +1 -35
  383. package/dist/server/streaming/dataStream.js +15 -0
  384. package/dist/services/server/ai/observability/instrumentation.js +114 -14
  385. package/dist/session/globalSessionState.d.ts +1 -10
  386. package/dist/tasks/tools/taskTools.d.ts +2 -2
  387. package/dist/telemetry/traceContext.d.ts +9 -0
  388. package/dist/telemetry/traceContext.js +18 -0
  389. package/dist/telemetry/tracers.d.ts +2 -0
  390. package/dist/telemetry/tracers.js +2 -0
  391. package/dist/types/action.d.ts +2 -0
  392. package/dist/types/artifact.d.ts +7 -0
  393. package/dist/types/auth.d.ts +125 -18
  394. package/dist/types/autoresearch.d.ts +12 -0
  395. package/dist/types/cli.d.ts +415 -0
  396. package/dist/types/client.d.ts +34 -0
  397. package/dist/types/common.d.ts +12 -41
  398. package/dist/types/context.d.ts +5 -0
  399. package/dist/types/evaluation.d.ts +332 -1
  400. package/dist/types/file.d.ts +4 -0
  401. package/dist/types/mcp.d.ts +102 -2
  402. package/dist/types/middleware.d.ts +116 -0
  403. package/dist/types/multimodal.d.ts +65 -0
  404. package/dist/types/observability.d.ts +81 -0
  405. package/dist/types/processor.d.ts +47 -0
  406. package/dist/types/providers.d.ts +120 -16
  407. package/dist/types/proxy.d.ts +321 -1
  408. package/dist/types/rag.d.ts +22 -0
  409. package/dist/types/scorer.d.ts +141 -0
  410. package/dist/types/server.d.ts +99 -0
  411. package/dist/types/span.d.ts +2 -1
  412. package/dist/types/span.js +1 -0
  413. package/dist/types/tools.d.ts +44 -0
  414. package/dist/types/tts.d.ts +6 -0
  415. package/dist/types/utilities.d.ts +22 -0
  416. package/dist/types/workflow.d.ts +18 -0
  417. package/dist/utils/async/retry.d.ts +2 -8
  418. package/dist/utils/async/retry.js +9 -9
  419. package/dist/utils/imageCompressor.d.ts +1 -21
  420. package/dist/utils/imageCompressor.js +5 -1
  421. package/dist/utils/messageBuilder.d.ts +1 -1
  422. package/dist/utils/redis.d.ts +1 -4
  423. package/dist/utils/sanitizers/filename.d.ts +0 -1
  424. package/dist/utils/toolEndEmitter.d.ts +25 -0
  425. package/dist/utils/toolEndEmitter.js +64 -0
  426. package/dist/workflow/config.d.ts +4 -29
  427. package/dist/workflow/core/ensembleExecutor.js +28 -0
  428. package/dist/workflow/core/judgeScorer.js +23 -0
  429. package/dist/workflow/core/responseConditioner.js +17 -0
  430. package/dist/workflow/core/workflowRunner.d.ts +1 -19
  431. package/dist/workflow/core/workflowRunner.js +202 -147
  432. package/package.json +2 -1
@@ -7,7 +7,10 @@
7
7
  *
8
8
  * @module @neurolink/client/sseClient
9
9
  */
10
+ import { SpanStatusCode } from "@opentelemetry/api";
10
11
  import { logger } from "../utils/logger.js";
12
+ import { withClientSpan } from "../telemetry/withSpan.js";
13
+ import { tracers } from "../telemetry/tracers.js";
11
14
  // =============================================================================
12
15
  // SSE Client Implementation
13
16
  // =============================================================================
@@ -69,6 +72,32 @@ export class NeuroLinkSSE {
69
72
  * Stream from an endpoint using SSE
70
73
  */
71
74
  async stream(path, options = {}, callbacks = {}) {
75
+ return withClientSpan({
76
+ name: "neurolink.client.sse.stream",
77
+ tracer: tracers.http,
78
+ attributes: {
79
+ "http.method": options.body ? "POST" : "GET",
80
+ "http.route": path,
81
+ "http.url": this.buildUrl(path),
82
+ "sse.auto_reconnect": this.config.autoReconnect,
83
+ "sse.native_event_source": this.config.useNativeEventSource,
84
+ },
85
+ }, async (span) => {
86
+ // Wrap onError callback so the span is marked failed on stream errors
87
+ const wrappedCallbacks = {
88
+ ...callbacks,
89
+ onError: (error) => {
90
+ span.setStatus({
91
+ code: SpanStatusCode.ERROR,
92
+ message: error?.message ?? "SSE stream error",
93
+ });
94
+ callbacks.onError?.(error);
95
+ },
96
+ };
97
+ return this._streamInternal(path, options, wrappedCallbacks);
98
+ });
99
+ }
100
+ async _streamInternal(path, options = {}, callbacks = {}) {
72
101
  const url = this.buildUrl(path);
73
102
  const isGetRequest = !options.body;
74
103
  // Use native EventSource for GET requests when configured and available
@@ -49,6 +49,7 @@ export declare class SSEClient {
49
49
  body?: unknown;
50
50
  headers?: Record<string, string>;
51
51
  }): Promise<void>;
52
+ private _connectSSE;
52
53
  /**
53
54
  * Disconnect from SSE endpoint
54
55
  */
@@ -131,6 +132,7 @@ export declare class WebSocketStreamingClient {
131
132
  * Connect to WebSocket server
132
133
  */
133
134
  connect(): Promise<void>;
135
+ private _connectWS;
134
136
  /**
135
137
  * Disconnect from WebSocket server
136
138
  */
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { logger } from "../utils/logger.js";
10
10
  import { combineSignals, sleep } from "./httpClient.js";
11
+ import { withClientSpan } from "../telemetry/withSpan.js";
12
+ import { tracers } from "../telemetry/tracers.js";
11
13
  // =============================================================================
12
14
  // Types
13
15
  // =============================================================================
@@ -61,6 +63,16 @@ export class SSEClient {
61
63
  * Connect to SSE endpoint
62
64
  */
63
65
  async connect(requestOptions = {}) {
66
+ return withClientSpan({
67
+ name: "neurolink.client.streaming.sse.connect",
68
+ tracer: tracers.http,
69
+ attributes: {
70
+ "http.url": this.url,
71
+ "http.method": requestOptions.body ? "POST" : "GET",
72
+ },
73
+ }, async () => this._connectSSE(requestOptions));
74
+ }
75
+ async _connectSSE(requestOptions = {}) {
64
76
  if (this.state === "connected" || this.state === "connecting") {
65
77
  return;
66
78
  }
@@ -393,6 +405,13 @@ export class WebSocketStreamingClient {
393
405
  * Connect to WebSocket server
394
406
  */
395
407
  async connect() {
408
+ return withClientSpan({
409
+ name: "neurolink.client.streaming.ws.connect",
410
+ tracer: tracers.http,
411
+ attributes: { "http.url": this.options.url },
412
+ }, async () => this._connectWS());
413
+ }
414
+ async _connectWS() {
396
415
  if (typeof WebSocket === "undefined") {
397
416
  throw new Error("WebSocket is not available. Please use a polyfill for non-browser environments.");
398
417
  }
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module @neurolink/client/wsClient
9
9
  */
10
- import type { ClientStreamCallbacks, ClientStreamEvent as StreamEvent, ClientStreamResult as StreamResult, ClientApiError, WebSocketEventHandlers, ClientClientWebSocketState, ClientWebSocketMessage, ClientWebSocketConfig } from "../types/index.js";
10
+ import type { ClientStreamCallbacks, WebSocketEventHandlers, ClientClientWebSocketState, ClientWebSocketMessage, ClientWebSocketConfig } from "../types/index.js";
11
11
  /**
12
12
  * WebSocket streaming client for NeuroLink
13
13
  *
@@ -43,6 +43,12 @@ export declare class NeuroLinkWebSocket {
43
43
  private eventHandlers;
44
44
  private subscriptions;
45
45
  private pendingAuth;
46
+ /**
47
+ * Active OTel span for the current WebSocket connection lifecycle.
48
+ * Created at connect() and ended on close/error so we capture connection
49
+ * lifetime, reconnect counts, and error attribution in Langfuse.
50
+ */
51
+ private connectionSpan;
46
52
  /**
47
53
  * Local flag to suppress reconnection during an explicit disconnect().
48
54
  * Unlike mutating config.autoReconnect, this preserves the user's
@@ -119,4 +125,3 @@ export declare class NeuroLinkWebSocket {
119
125
  * ```
120
126
  */
121
127
  export declare function createWebSocketClient(config: ClientWebSocketConfig): NeuroLinkWebSocket;
122
- export type { ClientStreamCallbacks, StreamEvent, StreamResult, ClientApiError, };
@@ -7,6 +7,8 @@
7
7
  *
8
8
  * @module @neurolink/client/wsClient
9
9
  */
10
+ import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
11
+ import { tracers } from "../telemetry/tracers.js";
10
12
  // =============================================================================
11
13
  // WebSocket Client
12
14
  // =============================================================================
@@ -45,6 +47,12 @@ export class NeuroLinkWebSocket {
45
47
  eventHandlers = {};
46
48
  subscriptions = new Map();
47
49
  pendingAuth = false;
50
+ /**
51
+ * Active OTel span for the current WebSocket connection lifecycle.
52
+ * Created at connect() and ended on close/error so we capture connection
53
+ * lifetime, reconnect counts, and error attribution in Langfuse.
54
+ */
55
+ connectionSpan = null;
48
56
  /**
49
57
  * Local flag to suppress reconnection during an explicit disconnect().
50
58
  * Unlike mutating config.autoReconnect, this preserves the user's
@@ -89,6 +97,28 @@ export class NeuroLinkWebSocket {
89
97
  this.disconnectRequested = false;
90
98
  this.eventHandlers = handlers ?? {};
91
99
  this.setState("connecting");
100
+ // End any orphaned span from a prior connect() attempt (e.g., re-entrant call
101
+ // while a previous attempt was still connecting).
102
+ if (this.connectionSpan) {
103
+ this.connectionSpan.setAttribute("ws.superseded", true);
104
+ this.connectionSpan.setStatus({
105
+ code: SpanStatusCode.ERROR,
106
+ message: "Connection attempt superseded by new connect() call",
107
+ });
108
+ this.connectionSpan.end();
109
+ this.connectionSpan = null;
110
+ }
111
+ // Start an OTel span that tracks the lifetime of this connection attempt.
112
+ // Ended in onclose/onerror/disconnect so metrics capture connection
113
+ // duration and error attribution.
114
+ this.connectionSpan = tracers.http.startSpan("neurolink.client.ws.connect", {
115
+ kind: SpanKind.CLIENT,
116
+ attributes: {
117
+ "http.url": this.config.baseUrl,
118
+ "ws.auto_reconnect": this.config.autoReconnect,
119
+ "ws.reconnect_attempt": this.reconnectAttempts,
120
+ },
121
+ });
92
122
  // Build WebSocket URL (credentials are sent via headers, not query params,
93
123
  // to avoid leaking secrets in server logs, browser history, and HTTP referers)
94
124
  const url = new URL(this.config.baseUrl);
@@ -107,15 +137,25 @@ export class NeuroLinkWebSocket {
107
137
  // credentials are sent as the first message after the connection opens.
108
138
  const isNode = typeof globalThis.process !== "undefined" &&
109
139
  typeof globalThis.process.versions?.node === "string";
110
- if (isNode && Object.keys(authHeaders).length > 0) {
111
- // The `ws` npm package accepts a second `options` object with a `headers`
112
- // property. The DOM WebSocket type does not model this, so we cast
113
- // through `unknown` to satisfy TypeScript while remaining correct at
114
- // runtime under Node.js.
115
- this.ws = new WebSocket(url.toString(), { headers: authHeaders });
140
+ try {
141
+ if (isNode && Object.keys(authHeaders).length > 0) {
142
+ this.ws = new WebSocket(url.toString(), { headers: authHeaders });
143
+ }
144
+ else {
145
+ this.ws = new WebSocket(url.toString());
146
+ }
116
147
  }
117
- else {
118
- this.ws = new WebSocket(url.toString());
148
+ catch (error) {
149
+ if (this.connectionSpan) {
150
+ this.connectionSpan.recordException(error instanceof Error ? error : new Error(String(error)));
151
+ this.connectionSpan.setStatus({
152
+ code: SpanStatusCode.ERROR,
153
+ message: error instanceof Error ? error.message : String(error),
154
+ });
155
+ this.connectionSpan.end();
156
+ this.connectionSpan = null;
157
+ }
158
+ throw error;
119
159
  }
120
160
  this.pendingAuth = !isNode && (!!this.config.apiKey || !!this.config.token);
121
161
  this.setupEventListeners();
@@ -134,6 +174,15 @@ export class NeuroLinkWebSocket {
134
174
  this.ws = null;
135
175
  }
136
176
  this.setState("disconnected");
177
+ // Let onclose finalize the span — it fires from ws.close(1000,...) and
178
+ // has the close code context. We only end here if ws is already null
179
+ // (e.g. connect was never called) to avoid leaking.
180
+ if (this.connectionSpan && !this.ws) {
181
+ this.connectionSpan.setAttribute("ws.close_reason", "client_disconnect");
182
+ this.connectionSpan.setStatus({ code: SpanStatusCode.OK });
183
+ this.connectionSpan.end();
184
+ this.connectionSpan = null;
185
+ }
137
186
  }
138
187
  /**
139
188
  * Send a message through WebSocket
@@ -144,7 +193,7 @@ export class NeuroLinkWebSocket {
144
193
  }
145
194
  else {
146
195
  // Queue message for when connected
147
- if (this.messageQueue.length < this.config.queueSize) {
196
+ if (this.messageQueue.length < (this.config.queueSize ?? 100)) {
148
197
  this.messageQueue.push(message);
149
198
  }
150
199
  }
@@ -199,6 +248,9 @@ export class NeuroLinkWebSocket {
199
248
  this.ws.onopen = () => {
200
249
  this.setState("connected");
201
250
  this.reconnectAttempts = 0;
251
+ if (this.connectionSpan) {
252
+ this.connectionSpan.setAttribute("ws.connected", true);
253
+ }
202
254
  // In browser environments, send credentials as the first message
203
255
  // since the browser WebSocket API does not support custom headers.
204
256
  if (this.pendingAuth && this.ws) {
@@ -223,6 +275,24 @@ export class NeuroLinkWebSocket {
223
275
  this.setState("disconnected");
224
276
  this.stopHeartbeat();
225
277
  this.eventHandlers.onClose?.(event.code, event.reason);
278
+ if (this.connectionSpan) {
279
+ this.connectionSpan.setAttribute("ws.close_code", event.code);
280
+ if (event.reason) {
281
+ this.connectionSpan.setAttribute("ws.close_reason", event.reason);
282
+ }
283
+ // 1000 = normal closure; other codes are abnormal.
284
+ if (event.code === 1000) {
285
+ this.connectionSpan.setStatus({ code: SpanStatusCode.OK });
286
+ }
287
+ else {
288
+ this.connectionSpan.setStatus({
289
+ code: SpanStatusCode.ERROR,
290
+ message: `WebSocket closed with code ${event.code}${event.reason ? `: ${event.reason}` : ""}`,
291
+ });
292
+ }
293
+ this.connectionSpan.end();
294
+ this.connectionSpan = null;
295
+ }
226
296
  // Only attempt reconnection when auto-reconnect is enabled AND this
227
297
  // was not an intentional disconnect (code 1000 or explicit call).
228
298
  if (this.config.autoReconnect &&
@@ -235,6 +305,16 @@ export class NeuroLinkWebSocket {
235
305
  this.setState("error");
236
306
  const error = new Error("WebSocket connection error");
237
307
  this.eventHandlers.onError?.(error);
308
+ if (this.connectionSpan) {
309
+ this.connectionSpan.recordException(error);
310
+ this.connectionSpan.setStatus({
311
+ code: SpanStatusCode.ERROR,
312
+ message: error.message,
313
+ });
314
+ // Do not end here — onclose will fire next and end the span with
315
+ // the precise close code. Keeping the span open until close gives
316
+ // us the full connection lifetime on Langfuse.
317
+ }
238
318
  };
239
319
  this.ws.onmessage = (event) => {
240
320
  try {
@@ -303,7 +383,7 @@ export class NeuroLinkWebSocket {
303
383
  if (this.isConnected()) {
304
384
  this.send({ type: "ping" });
305
385
  }
306
- }, this.config.heartbeatInterval);
386
+ }, this.config.heartbeatInterval ?? 30000);
307
387
  }
308
388
  stopHeartbeat() {
309
389
  if (this.heartbeatTimer) {
@@ -9,6 +9,7 @@
9
9
  import { getAvailableInputTokens } from "../constants/contextWindows.js";
10
10
  import { estimateMessagesTokens, estimateTokens, TOKENS_PER_MESSAGE, } from "../utils/tokenEstimation.js";
11
11
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
12
+ import { getActiveTraceContext } from "../telemetry/traceContext.js";
12
13
  /** Default compaction threshold (80% of available input) */
13
14
  const DEFAULT_COMPACTION_THRESHOLD = 0.8;
14
15
  /** Estimated tokens per tool definition */
@@ -21,9 +22,10 @@ const TOKENS_PER_TOOL_DEFINITION = 200;
21
22
  * against available input space.
22
23
  */
23
24
  export function checkContextBudget(params) {
25
+ const { traceId, parentSpanId } = getActiveTraceContext();
24
26
  const span = SpanSerializer.createSpan(SpanType.CONTEXT_COMPACTION, "context.budgetCheck", {
25
27
  "context.operation": "budgetCheck",
26
- });
28
+ }, parentSpanId, traceId);
27
29
  const startTime = Date.now();
28
30
  try {
29
31
  const { provider, model, maxTokens, systemPrompt, conversationMessages, currentPrompt, toolDefinitions, fileAttachments, compactionThreshold = DEFAULT_COMPACTION_THRESHOLD, } = params;
@@ -12,6 +12,9 @@ import { estimateMessagesTokens } from "../utils/tokenEstimation.js";
12
12
  import { logger } from "../utils/logger.js";
13
13
  import { withTimeout } from "../utils/async/withTimeout.js";
14
14
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
15
+ import { getActiveTraceContext } from "../telemetry/traceContext.js";
16
+ import { withSpan } from "../telemetry/withSpan.js";
17
+ import { tracers } from "../telemetry/tracers.js";
15
18
  import { pruneToolOutputs } from "./stages/toolOutputPruner.js";
16
19
  import { deduplicateFileReads } from "./stages/fileReadDeduplicator.js";
17
20
  import { truncateWithSlidingWindow } from "./stages/slidingWindowTruncator.js";
@@ -39,166 +42,183 @@ export class ContextCompactor {
39
42
  * Run the multi-stage compaction pipeline until messages fit within budget.
40
43
  */
41
44
  async compact(messages, targetTokens, memoryConfig, requestId) {
42
- let span = SpanSerializer.createSpan(SpanType.CONTEXT_COMPACTION, "context.compact", {
43
- "context.operation": "compact",
44
- "context.targetTokens": targetTokens,
45
- });
46
- const spanStartTime = Date.now();
47
- try {
48
- const provider = this.config.provider || undefined;
49
- const tokensBefore = estimateMessagesTokens(messages, provider);
50
- const stagesUsed = [];
51
- let currentMessages = [...messages];
52
- logger.info("[Compaction] Starting", {
53
- requestId,
54
- estimatedTokens: tokensBefore,
55
- budgetTokens: targetTokens,
56
- });
57
- // Stage 1: Tool Output Pruning
58
- if (this.config.enablePrune &&
59
- estimateMessagesTokens(currentMessages, provider) > targetTokens) {
60
- const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
61
- const pruneResult = pruneToolOutputs(currentMessages, {
62
- protectTokens: this.config.pruneProtectTokens,
63
- minimumSavings: this.config.pruneMinimumSavings,
64
- protectedTools: this.config.pruneProtectedTools,
65
- provider,
66
- });
67
- if (pruneResult.pruned) {
68
- currentMessages = pruneResult.messages;
69
- stagesUsed.push("prune");
70
- }
71
- const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
72
- logger.info("[Compaction] Stage 1 (prune)", {
45
+ return withSpan({
46
+ name: "neurolink.context.compact",
47
+ tracer: tracers.context,
48
+ attributes: {
49
+ "context.target_tokens": targetTokens,
50
+ "context.message_count": messages.length,
51
+ },
52
+ }, async () => {
53
+ const { traceId, parentSpanId } = getActiveTraceContext();
54
+ let span = SpanSerializer.createSpan(SpanType.CONTEXT_COMPACTION, "context.compact", {
55
+ "context.operation": "compact",
56
+ "context.targetTokens": targetTokens,
57
+ }, parentSpanId, traceId);
58
+ const spanStartTime = Date.now();
59
+ try {
60
+ const provider = this.config.provider || undefined;
61
+ const tokensBefore = estimateMessagesTokens(messages, provider);
62
+ const stagesUsed = [];
63
+ let currentMessages = [...messages];
64
+ logger.info("[Compaction] Starting", {
73
65
  requestId,
74
- ran: pruneResult.pruned,
75
- tokensBefore: stageTokensBefore,
76
- tokensAfter: stageTokensAfter,
77
- saved: stageTokensBefore - stageTokensAfter,
66
+ estimatedTokens: tokensBefore,
67
+ budgetTokens: targetTokens,
78
68
  });
79
- }
80
- // Stage 2: File Read Deduplication
81
- if (this.config.enableDeduplicate &&
82
- estimateMessagesTokens(currentMessages, provider) > targetTokens) {
83
- const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
84
- const dedupResult = deduplicateFileReads(currentMessages);
85
- if (dedupResult.deduplicated) {
86
- currentMessages = dedupResult.messages;
87
- stagesUsed.push("deduplicate");
88
- }
89
- const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
90
- logger.info("[Compaction] Stage 2 (deduplicate)", {
91
- requestId,
92
- ran: dedupResult.deduplicated,
93
- tokensBefore: stageTokensBefore,
94
- tokensAfter: stageTokensAfter,
95
- saved: stageTokensBefore - stageTokensAfter,
96
- });
97
- }
98
- // Stage 3: LLM Summarization
99
- if (this.config.enableSummarize &&
100
- estimateMessagesTokens(currentMessages, provider) > targetTokens) {
101
- const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
102
- try {
103
- const summarizeResult = await withTimeout(summarizeMessages(currentMessages, {
104
- provider: this.config.summarizationProvider,
105
- model: this.config.summarizationModel,
106
- keepRecentRatio: this.config.keepRecentRatio,
107
- memoryConfig,
108
- targetTokens,
109
- }), 120_000, "LLM summarization timed out after 120s");
110
- if (summarizeResult.summarized) {
111
- currentMessages = summarizeResult.messages;
112
- stagesUsed.push("summarize");
69
+ // Stage 1: Tool Output Pruning
70
+ if (this.config.enablePrune &&
71
+ estimateMessagesTokens(currentMessages, provider) > targetTokens) {
72
+ const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
73
+ const pruneResult = pruneToolOutputs(currentMessages, {
74
+ protectTokens: this.config.pruneProtectTokens,
75
+ minimumSavings: this.config.pruneMinimumSavings,
76
+ protectedTools: this.config.pruneProtectedTools,
77
+ provider,
78
+ });
79
+ if (pruneResult.pruned) {
80
+ currentMessages = pruneResult.messages;
81
+ stagesUsed.push("prune");
113
82
  }
114
83
  const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
115
- logger.info("[Compaction] Stage 3 (summarize)", {
84
+ logger.info("[Compaction] Stage 1 (prune)", {
116
85
  requestId,
117
- ran: summarizeResult.summarized,
86
+ ran: pruneResult.pruned,
118
87
  tokensBefore: stageTokensBefore,
119
88
  tokensAfter: stageTokensAfter,
120
89
  saved: stageTokensBefore - stageTokensAfter,
121
90
  });
122
91
  }
123
- catch (error) {
124
- const err = error instanceof Error ? error : new Error(String(error));
125
- logger.warn("[Compaction] Stage 3 (summarize) FAILED", {
92
+ // Stage 2: File Read Deduplication
93
+ if (this.config.enableDeduplicate &&
94
+ estimateMessagesTokens(currentMessages, provider) > targetTokens) {
95
+ const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
96
+ const dedupResult = deduplicateFileReads(currentMessages);
97
+ if (dedupResult.deduplicated) {
98
+ currentMessages = dedupResult.messages;
99
+ stagesUsed.push("deduplicate");
100
+ }
101
+ const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
102
+ logger.info("[Compaction] Stage 2 (deduplicate)", {
126
103
  requestId,
127
- error: err.message,
128
- errorName: err.name,
104
+ ran: dedupResult.deduplicated,
129
105
  tokensBefore: stageTokensBefore,
130
- tokensAfter: stageTokensBefore,
131
- saved: 0,
132
- });
133
- // Record failure on the compaction span for trace visibility
134
- span = SpanSerializer.updateAttributes(span, {
135
- "compaction.stage3.error": err.message,
136
- "compaction.stage3.errorName": err.name,
137
- "compaction.stage3.tokensBefore": stageTokensBefore,
138
- "compaction.stage3_failed": true,
106
+ tokensAfter: stageTokensAfter,
107
+ saved: stageTokensBefore - stageTokensAfter,
139
108
  });
140
- // Fall through to Stage 4 truncation as before
141
109
  }
142
- }
143
- // Stage 4: Sliding Window Truncation (fallback)
144
- if (this.config.enableTruncate &&
145
- estimateMessagesTokens(currentMessages, provider) > targetTokens) {
146
- const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
147
- const truncResult = truncateWithSlidingWindow(currentMessages, {
148
- fraction: this.config.truncationFraction,
149
- currentTokens: stageTokensBefore,
150
- targetTokens: targetTokens,
151
- provider: provider,
152
- adaptiveBuffer: 0.15,
153
- maxIterations: 6,
154
- });
155
- if (truncResult.truncated) {
156
- currentMessages = truncResult.messages;
157
- stagesUsed.push("truncate");
110
+ // Stage 3: LLM Summarization
111
+ if (this.config.enableSummarize &&
112
+ estimateMessagesTokens(currentMessages, provider) > targetTokens) {
113
+ const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
114
+ try {
115
+ const summarizeResult = await withTimeout(summarizeMessages(currentMessages, {
116
+ provider: this.config.summarizationProvider,
117
+ model: this.config.summarizationModel,
118
+ keepRecentRatio: this.config.keepRecentRatio,
119
+ memoryConfig,
120
+ targetTokens,
121
+ }), 120_000, "LLM summarization timed out after 120s");
122
+ if (summarizeResult.summarized) {
123
+ currentMessages = summarizeResult.messages;
124
+ stagesUsed.push("summarize");
125
+ }
126
+ const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
127
+ logger.info("[Compaction] Stage 3 (summarize)", {
128
+ requestId,
129
+ ran: summarizeResult.summarized,
130
+ tokensBefore: stageTokensBefore,
131
+ tokensAfter: stageTokensAfter,
132
+ saved: stageTokensBefore - stageTokensAfter,
133
+ });
134
+ }
135
+ catch (error) {
136
+ const err = error instanceof Error ? error : new Error(String(error));
137
+ logger.warn("[Compaction] Stage 3 (summarize) FAILED", {
138
+ requestId,
139
+ error: err.message,
140
+ errorName: err.name,
141
+ tokensBefore: stageTokensBefore,
142
+ tokensAfter: stageTokensBefore,
143
+ saved: 0,
144
+ });
145
+ // Record failure on the compaction span for trace visibility
146
+ span = SpanSerializer.updateAttributes(span, {
147
+ "compaction.stage3.error": err.message,
148
+ "compaction.stage3.errorName": err.name,
149
+ "compaction.stage3.tokensBefore": stageTokensBefore,
150
+ "compaction.stage3_failed": true,
151
+ });
152
+ // Fall through to Stage 4 truncation as before
153
+ }
158
154
  }
159
- const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
160
- logger.info("[Compaction] Stage 4 (truncate)", {
155
+ // Stage 4: Sliding Window Truncation (fallback)
156
+ if (this.config.enableTruncate &&
157
+ estimateMessagesTokens(currentMessages, provider) > targetTokens) {
158
+ const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
159
+ const truncResult = truncateWithSlidingWindow(currentMessages, {
160
+ fraction: this.config.truncationFraction,
161
+ currentTokens: stageTokensBefore,
162
+ targetTokens: targetTokens,
163
+ provider: provider,
164
+ adaptiveBuffer: 0.15,
165
+ maxIterations: 6,
166
+ });
167
+ if (truncResult.truncated) {
168
+ currentMessages = truncResult.messages;
169
+ stagesUsed.push("truncate");
170
+ }
171
+ const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
172
+ logger.info("[Compaction] Stage 4 (truncate)", {
173
+ requestId,
174
+ ran: truncResult.truncated,
175
+ tokensBefore: stageTokensBefore,
176
+ tokensAfter: stageTokensAfter,
177
+ saved: stageTokensBefore - stageTokensAfter,
178
+ });
179
+ }
180
+ const tokensAfter = estimateMessagesTokens(currentMessages, provider);
181
+ logger.info("[Compaction] Complete", {
161
182
  requestId,
162
- ran: truncResult.truncated,
163
- tokensBefore: stageTokensBefore,
164
- tokensAfter: stageTokensAfter,
165
- saved: stageTokensBefore - stageTokensAfter,
183
+ tokensBefore,
184
+ tokensAfter,
185
+ totalSaved: tokensBefore - tokensAfter,
186
+ stagesUsed,
187
+ durationMs: Date.now() - spanStartTime,
166
188
  });
189
+ const result = {
190
+ compacted: stagesUsed.length > 0,
191
+ stagesUsed,
192
+ tokensBefore,
193
+ tokensAfter,
194
+ tokensSaved: tokensBefore - tokensAfter,
195
+ messages: currentMessages,
196
+ };
197
+ span.durationMs = Date.now() - spanStartTime;
198
+ const compactionSucceeded = tokensAfter <= targetTokens;
199
+ const finalStatus = compactionSucceeded
200
+ ? SpanStatus.OK
201
+ : SpanStatus.WARNING;
202
+ const finalMessage = compactionSucceeded
203
+ ? undefined
204
+ : `Compaction insufficient: ${tokensAfter} tokens remain (target: ${targetTokens})`;
205
+ const endedSpan = SpanSerializer.endSpan(SpanSerializer.updateAttributes(span, {
206
+ "context.stage": stagesUsed.join(",") || "none",
207
+ "context.tokensBefore": tokensBefore,
208
+ "context.tokensAfter": tokensAfter,
209
+ "context.tokensSaved": tokensBefore - tokensAfter,
210
+ }), finalStatus, finalMessage);
211
+ getMetricsAggregator().recordSpan(endedSpan);
212
+ return result;
213
+ }
214
+ catch (error) {
215
+ span.durationMs = Date.now() - spanStartTime;
216
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
217
+ endedSpan.statusMessage =
218
+ error instanceof Error ? error.message : String(error);
219
+ getMetricsAggregator().recordSpan(endedSpan);
220
+ throw error;
167
221
  }
168
- const tokensAfter = estimateMessagesTokens(currentMessages, provider);
169
- logger.info("[Compaction] Complete", {
170
- requestId,
171
- tokensBefore,
172
- tokensAfter,
173
- totalSaved: tokensBefore - tokensAfter,
174
- stagesUsed,
175
- durationMs: Date.now() - spanStartTime,
176
- });
177
- const result = {
178
- compacted: stagesUsed.length > 0,
179
- stagesUsed,
180
- tokensBefore,
181
- tokensAfter,
182
- tokensSaved: tokensBefore - tokensAfter,
183
- messages: currentMessages,
184
- };
185
- span.durationMs = Date.now() - spanStartTime;
186
- const endedSpan = SpanSerializer.endSpan(SpanSerializer.updateAttributes(span, {
187
- "context.stage": stagesUsed.join(",") || "none",
188
- "context.tokensBefore": tokensBefore,
189
- "context.tokensAfter": tokensAfter,
190
- "context.tokensSaved": tokensBefore - tokensAfter,
191
- }), SpanStatus.OK);
192
- getMetricsAggregator().recordSpan(endedSpan);
193
- return result;
194
- }
195
- catch (error) {
196
- span.durationMs = Date.now() - spanStartTime;
197
- const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
198
- endedSpan.statusMessage =
199
- error instanceof Error ? error.message : String(error);
200
- getMetricsAggregator().recordSpan(endedSpan);
201
- throw error;
202
- }
222
+ }); // end withSpan
203
223
  }
204
224
  }