@juspay/neurolink 9.54.6 → 9.54.8

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 (408) hide show
  1. package/CHANGELOG.md +8 -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 -0
  23. package/dist/auth/tokenStore.js +45 -4
  24. package/dist/autoresearch/tools.d.ts +1 -16
  25. package/dist/browser/neurolink.min.js +358 -358
  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 +1 -0
  54. package/dist/client/httpClient.js +13 -0
  55. package/dist/client/sseClient.d.ts +1 -0
  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 +6 -0
  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/evaluation/BatchEvaluator.d.ts +1 -97
  72. package/dist/evaluation/EvaluationAggregator.d.ts +1 -118
  73. package/dist/evaluation/EvaluatorFactory.d.ts +1 -13
  74. package/dist/evaluation/EvaluatorRegistry.d.ts +1 -50
  75. package/dist/evaluation/errors/EvaluationError.d.ts +2 -27
  76. package/dist/evaluation/hooks/langfuseAdapter.d.ts +1 -39
  77. package/dist/evaluation/hooks/observabilityHooks.d.ts +3 -55
  78. package/dist/evaluation/hooks/observabilityHooks.js +3 -0
  79. package/dist/evaluation/pipeline/strategies/batchStrategy.d.ts +7 -61
  80. package/dist/evaluation/pipeline/strategies/batchStrategy.js +7 -7
  81. package/dist/evaluation/ragasEvaluator.js +54 -37
  82. package/dist/evaluation/reporting/metricsCollector.d.ts +1 -60
  83. package/dist/evaluation/reporting/reportGenerator.d.ts +1 -17
  84. package/dist/evaluation/scorers/rule/contentSimilarityScorer.d.ts +1 -29
  85. package/dist/evaluation/scorers/rule/formatScorer.d.ts +1 -42
  86. package/dist/evaluation/scorers/rule/keywordCoverageScorer.d.ts +1 -19
  87. package/dist/evaluation/scorers/rule/lengthScorer.d.ts +1 -33
  88. package/dist/factories/providerFactory.d.ts +1 -16
  89. package/dist/factories/providerFactory.js +2 -0
  90. package/dist/image-gen/ImageGenService.d.ts +3 -0
  91. package/dist/image-gen/ImageGenService.js +3 -0
  92. package/dist/lib/action/actionInputs.d.ts +1 -1
  93. package/dist/lib/adapters/video/directorPipeline.js +6 -0
  94. package/dist/lib/adapters/video/vertexVideoHandler.js +6 -0
  95. package/dist/lib/agent/directTools.d.ts +3 -23
  96. package/dist/lib/auth/AuthProviderFactory.d.ts +1 -3
  97. package/dist/lib/auth/anthropicOAuth.d.ts +4 -7
  98. package/dist/lib/auth/anthropicOAuth.js +23 -0
  99. package/dist/lib/auth/errors.d.ts +1 -1
  100. package/dist/lib/auth/index.d.ts +11 -0
  101. package/dist/lib/auth/index.js +14 -0
  102. package/dist/lib/auth/middleware/AuthMiddleware.d.ts +5 -60
  103. package/dist/lib/auth/middleware/AuthMiddleware.js +3 -0
  104. package/dist/lib/auth/middleware/rateLimitByUser.d.ts +4 -93
  105. package/dist/lib/auth/middleware/rateLimitByUser.js +4 -0
  106. package/dist/lib/auth/providers/BaseAuthProvider.d.ts +1 -1
  107. package/dist/lib/auth/providers/CognitoProvider.js +3 -0
  108. package/dist/lib/auth/providers/KeycloakProvider.js +3 -0
  109. package/dist/lib/auth/providers/auth0.d.ts +1 -1
  110. package/dist/lib/auth/sessionManager.d.ts +2 -0
  111. package/dist/lib/auth/sessionManager.js +53 -11
  112. package/dist/lib/auth/tokenStore.d.ts +2 -0
  113. package/dist/lib/auth/tokenStore.js +45 -4
  114. package/dist/lib/autoresearch/tools.d.ts +1 -16
  115. package/dist/lib/client/aiSdkAdapter.d.ts +1 -1
  116. package/dist/lib/client/aiSdkAdapter.js +1 -0
  117. package/dist/lib/client/httpClient.d.ts +1 -0
  118. package/dist/lib/client/httpClient.js +13 -0
  119. package/dist/lib/client/sseClient.d.ts +1 -0
  120. package/dist/lib/client/sseClient.js +29 -0
  121. package/dist/lib/client/streamingClient.d.ts +2 -0
  122. package/dist/lib/client/streamingClient.js +19 -0
  123. package/dist/lib/client/wsClient.d.ts +6 -0
  124. package/dist/lib/client/wsClient.js +90 -10
  125. package/dist/lib/context/budgetChecker.js +3 -1
  126. package/dist/lib/context/contextCompactor.js +163 -143
  127. package/dist/lib/context/fileSummarizationService.d.ts +1 -9
  128. package/dist/lib/context/summarizationEngine.js +29 -16
  129. package/dist/lib/core/baseProvider.js +124 -153
  130. package/dist/lib/core/infrastructure/baseRegistry.d.ts +1 -7
  131. package/dist/lib/core/modules/GenerationHandler.d.ts +3 -2
  132. package/dist/lib/core/modules/GenerationHandler.js +9 -1
  133. package/dist/lib/core/modules/StreamHandler.js +9 -0
  134. package/dist/lib/core/modules/ToolsManager.js +18 -2
  135. package/dist/lib/evaluation/BatchEvaluator.d.ts +1 -97
  136. package/dist/lib/evaluation/EvaluationAggregator.d.ts +1 -118
  137. package/dist/lib/evaluation/EvaluatorFactory.d.ts +1 -13
  138. package/dist/lib/evaluation/EvaluatorRegistry.d.ts +1 -50
  139. package/dist/lib/evaluation/errors/EvaluationError.d.ts +2 -27
  140. package/dist/lib/evaluation/hooks/langfuseAdapter.d.ts +1 -39
  141. package/dist/lib/evaluation/hooks/observabilityHooks.d.ts +3 -55
  142. package/dist/lib/evaluation/hooks/observabilityHooks.js +3 -0
  143. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.d.ts +7 -61
  144. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +7 -7
  145. package/dist/lib/evaluation/ragasEvaluator.js +54 -37
  146. package/dist/lib/evaluation/reporting/metricsCollector.d.ts +1 -60
  147. package/dist/lib/evaluation/reporting/reportGenerator.d.ts +1 -17
  148. package/dist/lib/evaluation/scorers/rule/contentSimilarityScorer.d.ts +1 -29
  149. package/dist/lib/evaluation/scorers/rule/formatScorer.d.ts +1 -42
  150. package/dist/lib/evaluation/scorers/rule/keywordCoverageScorer.d.ts +1 -19
  151. package/dist/lib/evaluation/scorers/rule/lengthScorer.d.ts +1 -33
  152. package/dist/lib/factories/providerFactory.d.ts +1 -16
  153. package/dist/lib/factories/providerFactory.js +2 -0
  154. package/dist/lib/image-gen/ImageGenService.d.ts +3 -0
  155. package/dist/lib/image-gen/ImageGenService.js +3 -0
  156. package/dist/lib/mcp/batching/requestBatcher.js +99 -73
  157. package/dist/lib/mcp/httpRateLimiter.js +3 -1
  158. package/dist/lib/mcp/httpRetryHandler.js +3 -1
  159. package/dist/lib/mcp/mcpClientFactory.js +3 -1
  160. package/dist/lib/mcp/multiServerManager.d.ts +1 -14
  161. package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +5 -1
  162. package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  163. package/dist/lib/mcp/toolDiscoveryService.js +70 -57
  164. package/dist/lib/mcp/toolRegistry.js +11 -1
  165. package/dist/lib/memory/memoryRetrievalTools.js +182 -141
  166. package/dist/lib/neurolink.js +236 -40
  167. package/dist/lib/observability/exporterRegistry.d.ts +3 -21
  168. package/dist/lib/observability/exporters/sentryExporter.js +1 -0
  169. package/dist/lib/observability/metricsAggregator.d.ts +1 -31
  170. package/dist/lib/observability/tokenTracker.d.ts +7 -16
  171. package/dist/lib/observability/tokenTracker.js +6 -4
  172. package/dist/lib/observability/utils/spanSerializer.d.ts +5 -1
  173. package/dist/lib/observability/utils/spanSerializer.js +24 -4
  174. package/dist/lib/processors/base/BaseFileProcessor.js +66 -53
  175. package/dist/lib/processors/document/ExcelProcessor.d.ts +1 -1
  176. package/dist/lib/processors/errors/errorHelpers.d.ts +1 -31
  177. package/dist/lib/processors/errors/errorSerializer.d.ts +1 -45
  178. package/dist/lib/processors/registry/ProcessorRegistry.js +17 -6
  179. package/dist/lib/providers/amazonBedrock.js +189 -15
  180. package/dist/lib/providers/amazonSagemaker.js +25 -11
  181. package/dist/lib/providers/anthropic.js +13 -0
  182. package/dist/lib/providers/azureOpenai.js +2 -0
  183. package/dist/lib/providers/googleAiStudio.js +96 -26
  184. package/dist/lib/providers/googleVertex.js +66 -27
  185. package/dist/lib/providers/huggingFace.js +2 -0
  186. package/dist/lib/providers/litellm.js +2 -0
  187. package/dist/lib/providers/mistral.js +2 -0
  188. package/dist/lib/providers/ollama.js +84 -5
  189. package/dist/lib/providers/openAI.d.ts +2 -0
  190. package/dist/lib/providers/openAI.js +17 -6
  191. package/dist/lib/providers/openRouter.js +2 -0
  192. package/dist/lib/providers/openaiCompatible.js +2 -0
  193. package/dist/lib/providers/sagemaker/detection.d.ts +1 -33
  194. package/dist/lib/providers/sagemaker/diagnostics.d.ts +1 -25
  195. package/dist/lib/providers/sagemaker/language-model.d.ts +1 -1
  196. package/dist/lib/proxy/proxyConfig.js +4 -0
  197. package/dist/lib/proxy/proxyEnv.d.ts +1 -17
  198. package/dist/lib/proxy/proxyTracer.d.ts +1 -36
  199. package/dist/lib/proxy/proxyTracer.js +9 -0
  200. package/dist/lib/proxy/quietDetector.d.ts +1 -7
  201. package/dist/lib/proxy/rawStreamCapture.d.ts +1 -10
  202. package/dist/lib/proxy/requestLogger.d.ts +1 -21
  203. package/dist/lib/proxy/sseInterceptor.d.ts +1 -66
  204. package/dist/lib/proxy/sseInterceptor.js +6 -0
  205. package/dist/lib/proxy/updateChecker.d.ts +1 -6
  206. package/dist/lib/proxy/updateState.d.ts +1 -12
  207. package/dist/lib/rag/chunkers/BaseChunker.js +36 -22
  208. package/dist/lib/rag/chunking/jsonChunker.d.ts +1 -1
  209. package/dist/lib/rag/errors/RAGError.d.ts +1 -2
  210. package/dist/lib/rag/ragIntegration.js +45 -32
  211. package/dist/lib/rag/reranker/reranker.js +151 -122
  212. package/dist/lib/rag/retrieval/vectorQueryTool.js +79 -65
  213. package/dist/lib/sdk/toolRegistration.d.ts +10 -44
  214. package/dist/lib/sdk/toolRegistration.js +1 -1
  215. package/dist/lib/server/middleware/abortSignal.d.ts +1 -11
  216. package/dist/lib/server/middleware/auth.d.ts +1 -21
  217. package/dist/lib/server/middleware/auth.js +12 -0
  218. package/dist/lib/server/middleware/common.js +48 -32
  219. package/dist/lib/server/middleware/deprecation.d.ts +1 -20
  220. package/dist/lib/server/middleware/rateLimit.d.ts +1 -75
  221. package/dist/lib/server/middleware/validation.d.ts +3 -81
  222. package/dist/lib/server/middleware/validation.js +3 -0
  223. package/dist/lib/server/openapi/generator.d.ts +1 -47
  224. package/dist/lib/server/routes/agentRoutes.js +112 -57
  225. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +1 -6
  226. package/dist/lib/server/routes/claudeProxyRoutes.js +127 -13
  227. package/dist/lib/server/routes/healthRoutes.js +58 -12
  228. package/dist/lib/server/routes/index.d.ts +1 -26
  229. package/dist/lib/server/routes/mcpRoutes.js +40 -7
  230. package/dist/lib/server/routes/memoryRoutes.js +22 -7
  231. package/dist/lib/server/routes/openApiRoutes.js +30 -6
  232. package/dist/lib/server/routes/toolRoutes.js +140 -68
  233. package/dist/lib/server/streaming/dataStream.d.ts +1 -35
  234. package/dist/lib/server/streaming/dataStream.js +15 -0
  235. package/dist/lib/services/server/ai/observability/instrumentation.js +114 -14
  236. package/dist/lib/session/globalSessionState.d.ts +1 -10
  237. package/dist/lib/tasks/tools/taskTools.d.ts +2 -2
  238. package/dist/lib/telemetry/traceContext.d.ts +9 -0
  239. package/dist/lib/telemetry/traceContext.js +19 -0
  240. package/dist/lib/telemetry/tracers.d.ts +2 -0
  241. package/dist/lib/telemetry/tracers.js +2 -0
  242. package/dist/lib/types/action.d.ts +2 -0
  243. package/dist/lib/types/artifact.d.ts +7 -0
  244. package/dist/lib/types/auth.d.ts +125 -18
  245. package/dist/lib/types/autoresearch.d.ts +12 -0
  246. package/dist/lib/types/cli.d.ts +415 -0
  247. package/dist/lib/types/client.d.ts +34 -0
  248. package/dist/lib/types/common.d.ts +12 -41
  249. package/dist/lib/types/context.d.ts +5 -0
  250. package/dist/lib/types/evaluation.d.ts +332 -1
  251. package/dist/lib/types/file.d.ts +4 -0
  252. package/dist/lib/types/mcp.d.ts +102 -2
  253. package/dist/lib/types/middleware.d.ts +116 -0
  254. package/dist/lib/types/multimodal.d.ts +65 -0
  255. package/dist/lib/types/observability.d.ts +81 -0
  256. package/dist/lib/types/processor.d.ts +47 -0
  257. package/dist/lib/types/providers.d.ts +120 -16
  258. package/dist/lib/types/proxy.d.ts +321 -1
  259. package/dist/lib/types/rag.d.ts +22 -0
  260. package/dist/lib/types/scorer.d.ts +141 -0
  261. package/dist/lib/types/server.d.ts +99 -0
  262. package/dist/lib/types/span.d.ts +2 -1
  263. package/dist/lib/types/span.js +1 -0
  264. package/dist/lib/types/tools.d.ts +44 -0
  265. package/dist/lib/types/tts.d.ts +6 -0
  266. package/dist/lib/types/utilities.d.ts +22 -0
  267. package/dist/lib/types/workflow.d.ts +18 -0
  268. package/dist/lib/utils/async/retry.d.ts +2 -8
  269. package/dist/lib/utils/async/retry.js +9 -9
  270. package/dist/lib/utils/imageCompressor.d.ts +1 -21
  271. package/dist/lib/utils/imageCompressor.js +5 -1
  272. package/dist/lib/utils/messageBuilder.d.ts +1 -1
  273. package/dist/lib/utils/redis.d.ts +1 -4
  274. package/dist/lib/utils/toolEndEmitter.d.ts +25 -0
  275. package/dist/lib/utils/toolEndEmitter.js +65 -0
  276. package/dist/lib/workflow/config.d.ts +7 -32
  277. package/dist/lib/workflow/core/ensembleExecutor.js +28 -0
  278. package/dist/lib/workflow/core/judgeScorer.js +23 -0
  279. package/dist/lib/workflow/core/responseConditioner.js +17 -0
  280. package/dist/lib/workflow/core/workflowRunner.d.ts +1 -19
  281. package/dist/lib/workflow/core/workflowRunner.js +202 -147
  282. package/dist/mcp/batching/requestBatcher.js +99 -73
  283. package/dist/mcp/httpRateLimiter.js +3 -1
  284. package/dist/mcp/httpRetryHandler.js +3 -1
  285. package/dist/mcp/mcpClientFactory.js +3 -1
  286. package/dist/mcp/multiServerManager.d.ts +1 -14
  287. package/dist/mcp/servers/aiProviders/aiAnalysisTools.js +5 -1
  288. package/dist/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  289. package/dist/mcp/toolDiscoveryService.js +70 -57
  290. package/dist/mcp/toolRegistry.js +11 -1
  291. package/dist/memory/memoryRetrievalTools.js +182 -141
  292. package/dist/neurolink.js +236 -40
  293. package/dist/observability/exporterRegistry.d.ts +3 -21
  294. package/dist/observability/exporters/sentryExporter.js +1 -0
  295. package/dist/observability/metricsAggregator.d.ts +1 -31
  296. package/dist/observability/tokenTracker.d.ts +7 -16
  297. package/dist/observability/tokenTracker.js +6 -4
  298. package/dist/observability/utils/spanSerializer.d.ts +5 -1
  299. package/dist/observability/utils/spanSerializer.js +24 -4
  300. package/dist/processors/base/BaseFileProcessor.js +66 -53
  301. package/dist/processors/document/ExcelProcessor.d.ts +1 -1
  302. package/dist/processors/errors/errorHelpers.d.ts +1 -31
  303. package/dist/processors/errors/errorSerializer.d.ts +1 -45
  304. package/dist/processors/registry/ProcessorRegistry.js +17 -6
  305. package/dist/providers/amazonBedrock.js +189 -15
  306. package/dist/providers/amazonSagemaker.js +25 -11
  307. package/dist/providers/anthropic.js +13 -0
  308. package/dist/providers/azureOpenai.js +2 -0
  309. package/dist/providers/googleAiStudio.js +96 -26
  310. package/dist/providers/googleVertex.js +66 -27
  311. package/dist/providers/huggingFace.js +2 -0
  312. package/dist/providers/litellm.js +2 -0
  313. package/dist/providers/mistral.js +2 -0
  314. package/dist/providers/ollama.js +84 -5
  315. package/dist/providers/openAI.d.ts +2 -0
  316. package/dist/providers/openAI.js +17 -6
  317. package/dist/providers/openRouter.js +2 -0
  318. package/dist/providers/openaiCompatible.js +2 -0
  319. package/dist/providers/sagemaker/detection.d.ts +1 -33
  320. package/dist/providers/sagemaker/diagnostics.d.ts +1 -25
  321. package/dist/providers/sagemaker/language-model.d.ts +1 -1
  322. package/dist/proxy/proxyConfig.js +4 -0
  323. package/dist/proxy/proxyEnv.d.ts +1 -17
  324. package/dist/proxy/proxyTracer.d.ts +1 -36
  325. package/dist/proxy/proxyTracer.js +9 -0
  326. package/dist/proxy/quietDetector.d.ts +1 -7
  327. package/dist/proxy/rawStreamCapture.d.ts +1 -10
  328. package/dist/proxy/requestLogger.d.ts +1 -21
  329. package/dist/proxy/sseInterceptor.d.ts +1 -66
  330. package/dist/proxy/sseInterceptor.js +6 -0
  331. package/dist/proxy/updateChecker.d.ts +1 -6
  332. package/dist/proxy/updateState.d.ts +1 -12
  333. package/dist/rag/chunkers/BaseChunker.js +36 -22
  334. package/dist/rag/chunking/jsonChunker.d.ts +1 -1
  335. package/dist/rag/errors/RAGError.d.ts +1 -2
  336. package/dist/rag/ragIntegration.js +45 -32
  337. package/dist/rag/reranker/reranker.js +151 -122
  338. package/dist/rag/retrieval/vectorQueryTool.js +79 -65
  339. package/dist/sdk/toolRegistration.d.ts +10 -44
  340. package/dist/sdk/toolRegistration.js +1 -1
  341. package/dist/server/middleware/abortSignal.d.ts +1 -11
  342. package/dist/server/middleware/auth.d.ts +1 -21
  343. package/dist/server/middleware/auth.js +12 -0
  344. package/dist/server/middleware/common.js +48 -32
  345. package/dist/server/middleware/deprecation.d.ts +1 -20
  346. package/dist/server/middleware/rateLimit.d.ts +1 -75
  347. package/dist/server/middleware/validation.d.ts +3 -81
  348. package/dist/server/middleware/validation.js +3 -0
  349. package/dist/server/openapi/generator.d.ts +1 -47
  350. package/dist/server/routes/agentRoutes.js +112 -57
  351. package/dist/server/routes/claudeProxyRoutes.d.ts +1 -6
  352. package/dist/server/routes/claudeProxyRoutes.js +127 -13
  353. package/dist/server/routes/healthRoutes.js +58 -12
  354. package/dist/server/routes/index.d.ts +1 -26
  355. package/dist/server/routes/mcpRoutes.js +40 -7
  356. package/dist/server/routes/memoryRoutes.js +22 -7
  357. package/dist/server/routes/openApiRoutes.js +30 -6
  358. package/dist/server/routes/toolRoutes.js +140 -68
  359. package/dist/server/streaming/dataStream.d.ts +1 -35
  360. package/dist/server/streaming/dataStream.js +15 -0
  361. package/dist/services/server/ai/observability/instrumentation.js +114 -14
  362. package/dist/session/globalSessionState.d.ts +1 -10
  363. package/dist/tasks/tools/taskTools.d.ts +2 -2
  364. package/dist/telemetry/traceContext.d.ts +9 -0
  365. package/dist/telemetry/traceContext.js +18 -0
  366. package/dist/telemetry/tracers.d.ts +2 -0
  367. package/dist/telemetry/tracers.js +2 -0
  368. package/dist/types/action.d.ts +2 -0
  369. package/dist/types/artifact.d.ts +7 -0
  370. package/dist/types/auth.d.ts +125 -18
  371. package/dist/types/autoresearch.d.ts +12 -0
  372. package/dist/types/cli.d.ts +415 -0
  373. package/dist/types/client.d.ts +34 -0
  374. package/dist/types/common.d.ts +12 -41
  375. package/dist/types/context.d.ts +5 -0
  376. package/dist/types/evaluation.d.ts +332 -1
  377. package/dist/types/file.d.ts +4 -0
  378. package/dist/types/mcp.d.ts +102 -2
  379. package/dist/types/middleware.d.ts +116 -0
  380. package/dist/types/multimodal.d.ts +65 -0
  381. package/dist/types/observability.d.ts +81 -0
  382. package/dist/types/processor.d.ts +47 -0
  383. package/dist/types/providers.d.ts +120 -16
  384. package/dist/types/proxy.d.ts +321 -1
  385. package/dist/types/rag.d.ts +22 -0
  386. package/dist/types/scorer.d.ts +141 -0
  387. package/dist/types/server.d.ts +99 -0
  388. package/dist/types/span.d.ts +2 -1
  389. package/dist/types/span.js +1 -0
  390. package/dist/types/tools.d.ts +44 -0
  391. package/dist/types/tts.d.ts +6 -0
  392. package/dist/types/utilities.d.ts +22 -0
  393. package/dist/types/workflow.d.ts +18 -0
  394. package/dist/utils/async/retry.d.ts +2 -8
  395. package/dist/utils/async/retry.js +9 -9
  396. package/dist/utils/imageCompressor.d.ts +1 -21
  397. package/dist/utils/imageCompressor.js +5 -1
  398. package/dist/utils/messageBuilder.d.ts +1 -1
  399. package/dist/utils/redis.d.ts +1 -4
  400. package/dist/utils/toolEndEmitter.d.ts +25 -0
  401. package/dist/utils/toolEndEmitter.js +64 -0
  402. package/dist/workflow/config.d.ts +4 -29
  403. package/dist/workflow/core/ensembleExecutor.js +28 -0
  404. package/dist/workflow/core/judgeScorer.js +23 -0
  405. package/dist/workflow/core/responseConditioner.js +17 -0
  406. package/dist/workflow/core/workflowRunner.d.ts +1 -19
  407. package/dist/workflow/core/workflowRunner.js +202 -147
  408. package/package.json +2 -8
@@ -11,8 +11,11 @@
11
11
  *
12
12
  * @module workflow/core/workflowRunner
13
13
  */
14
+ import { SpanStatusCode } from "@opentelemetry/api";
14
15
  import { logger } from "../../utils/logger.js";
15
16
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../../observability/index.js";
17
+ import { withSpan } from "../../telemetry/withSpan.js";
18
+ import { tracers } from "../../telemetry/tracers.js";
16
19
  import { getModelGroups, PLACEHOLDER_MODEL, PLACEHOLDER_PROVIDER, usesModelGroups, } from "../config.js";
17
20
  import { validateWorkflow } from "../utils/workflowValidation.js";
18
21
  import { executeEnsemble, executeModelGroups } from "./ensembleExecutor.js";
@@ -45,156 +48,172 @@ import { conditionResponse } from "./responseConditioner.js";
45
48
  * ```
46
49
  */
47
50
  export async function runWorkflow(config, options) {
48
- const startTime = Date.now();
49
- const span = SpanSerializer.createSpan(SpanType.WORKFLOW, "workflow.run", {
50
- "workflow.operation": "run",
51
- "workflow.name": config.name,
52
- "workflow.type": config.type,
53
- "workflow.id": config.id,
54
- });
55
- // Validate configuration
56
- const validation = validateWorkflow(config);
57
- if (!validation.valid) {
58
- span.durationMs = Date.now() - startTime;
59
- const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, `Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
60
- getMetricsAggregator().recordSpan(endedSpan);
61
- throw new Error(`Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
62
- }
63
- if (options.verbose) {
64
- logger.debug(`[WorkflowRunner] Starting workflow: ${config.name}`);
65
- logger.debug(`[WorkflowRunner] Type: ${config.type}`);
66
- logger.debug(`[WorkflowRunner] Uses layer-based execution: ${usesModelGroups(config)}`);
67
- }
68
- try {
69
- // Step 1: Execute models (layer-based or flat)
70
- const ensembleResult = await executeModels(config, options);
71
- if (options.verbose) {
72
- logger.debug(`[WorkflowRunner] Received ${ensembleResult.responses.length} model responses`);
73
- logger.debug(`[WorkflowRunner] Successful: ${ensembleResult.successCount}`);
74
- }
75
- // Step 2: Score responses with judge(s)
76
- const scoreResult = await scoreResponses(config, ensembleResult.responses, options);
77
- if (options.verbose) {
78
- logger.debug(`[WorkflowRunner] Scoring complete`);
79
- logger.debug(`[WorkflowRunner] Scores:`, scoreResult.scores);
51
+ return withSpan({
52
+ name: "neurolink.workflow.run",
53
+ tracer: tracers.sdk,
54
+ attributes: {
55
+ "workflow.name": config.name,
56
+ "workflow.type": config.type,
57
+ "workflow.id": config.id ?? "unknown",
58
+ },
59
+ }, async (otelSpan) => {
60
+ const startTime = Date.now();
61
+ const span = SpanSerializer.createSpan(SpanType.WORKFLOW, "workflow.run", {
62
+ "workflow.operation": "run",
63
+ "workflow.name": config.name,
64
+ "workflow.type": config.type,
65
+ "workflow.id": config.id,
66
+ });
67
+ // Validate configuration
68
+ const validation = validateWorkflow(config);
69
+ if (!validation.valid) {
70
+ span.durationMs = Date.now() - startTime;
71
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, `Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
72
+ getMetricsAggregator().recordSpan(endedSpan);
73
+ throw new Error(`Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
80
74
  }
81
- // Step 3: Select best response
82
- const bestResponse = selectBestResponse(ensembleResult.responses, scoreResult.scores);
83
75
  if (options.verbose) {
84
- logger.debug(`[WorkflowRunner] Best response: ${bestResponse.model}`);
85
- const bestScore = extractScore(scoreResult.scores, bestResponse, ensembleResult.responses);
86
- logger.debug(`[WorkflowRunner] Best score: ${bestScore}`);
87
- }
88
- // CRITICAL: Store original content BEFORE any processing
89
- const originalContent = bestResponse.content;
90
- // Step 4: Get processed content
91
- // Priority: Judge-synthesized > Separate conditioning > Original
92
- let processedContent;
93
- let conditioningTime = 0;
94
- const judgeScores = isJudgeScores(scoreResult.scores)
95
- ? scoreResult.scores
96
- : convertToJudgeScores(scoreResult.scores);
97
- if (judgeScores.synthesizedResponse) {
98
- // Judge already synthesized improved response
99
- processedContent = judgeScores.synthesizedResponse;
100
- logger.debug(`[WorkflowRunner] Using judge-synthesized response`);
76
+ logger.debug(`[WorkflowRunner] Starting workflow: ${config.name}`);
77
+ logger.debug(`[WorkflowRunner] Type: ${config.type}`);
78
+ logger.debug(`[WorkflowRunner] Uses layer-based execution: ${usesModelGroups(config)}`);
101
79
  }
102
- else if (config.conditioning) {
103
- // Fall back to separate conditioning if configured
104
- const conditionedContent = await conditionFinalResponse(bestResponse, scoreResult.scores, config, options, ensembleResult.responses);
105
- processedContent = conditionedContent.content;
106
- conditioningTime = conditionedContent.conditioningTime;
107
- logger.debug(`[WorkflowRunner] Using separate conditioning`);
108
- }
109
- else {
110
- // No processing, use original
111
- processedContent = originalContent;
112
- logger.debug(`[WorkflowRunner] No conditioning applied`);
113
- }
114
- // Step 5: Calculate execution metrics
115
- const executionTime = Date.now() - startTime;
116
- const ensembleTime = ensembleResult.totalTime;
117
- const judgeTime = scoreResult.judgeTime;
118
- // Step 6: Assemble complete result
119
- const result = {
120
- // Primary output (processed version)
121
- content: processedContent,
122
- // IMPORTANT: Store original unmodified response separately
123
- originalContent: originalContent,
124
- // Evaluation metrics (0-100 scale)
125
- score: extractScore(scoreResult.scores, bestResponse, ensembleResult.responses),
126
- reasoning: extractReasoning(scoreResult.scores),
127
- // Ensemble data
128
- ensembleResponses: ensembleResult.responses,
129
- // Judge data
130
- judgeScores: judgeScores,
131
- selectedResponse: bestResponse,
132
- // Quality metrics
133
- confidence: extractConfidence(scoreResult.scores),
134
- consensus: extractConsensus(scoreResult.scores),
135
- // Performance metrics
136
- totalTime: executionTime,
137
- ensembleTime,
138
- judgeTime,
139
- conditioningTime: conditioningTime,
140
- // Workflow metadata
141
- workflow: config.id,
142
- workflowName: config.name,
143
- workflowVersion: config.version,
144
- // Resource usage
145
- usage: {
146
- totalInputTokens: calculateInputTokens(ensembleResult.responses),
147
- totalOutputTokens: calculateOutputTokens(ensembleResult.responses),
148
- totalTokens: calculateTotalTokens(ensembleResult.responses),
149
- byModel: [], // TODO: Populate per-model breakdown
150
- },
151
- // Additional metadata
152
- metadata: options.metadata,
153
- timestamp: new Date().toISOString(),
154
- };
155
- if (options.verbose) {
156
- logger.debug(`[WorkflowRunner] Workflow complete in ${executionTime}ms`);
157
- logger.debug(`[WorkflowRunner] Total tokens: ${result.usage?.totalTokens || 0}`);
80
+ try {
81
+ // Step 1: Execute models (layer-based or flat)
82
+ const ensembleResult = await executeModels(config, options);
83
+ if (options.verbose) {
84
+ logger.debug(`[WorkflowRunner] Received ${ensembleResult.responses.length} model responses`);
85
+ logger.debug(`[WorkflowRunner] Successful: ${ensembleResult.successCount}`);
86
+ }
87
+ // Step 2: Score responses with judge(s)
88
+ const scoreResult = await scoreResponses(config, ensembleResult.responses, options);
89
+ if (options.verbose) {
90
+ logger.debug(`[WorkflowRunner] Scoring complete`);
91
+ logger.debug(`[WorkflowRunner] Scores:`, scoreResult.scores);
92
+ }
93
+ // Step 3: Select best response
94
+ const bestResponse = selectBestResponse(ensembleResult.responses, scoreResult.scores);
95
+ if (options.verbose) {
96
+ logger.debug(`[WorkflowRunner] Best response: ${bestResponse.model}`);
97
+ const bestScore = extractScore(scoreResult.scores, bestResponse, ensembleResult.responses);
98
+ logger.debug(`[WorkflowRunner] Best score: ${bestScore}`);
99
+ }
100
+ // CRITICAL: Store original content BEFORE any processing
101
+ const originalContent = bestResponse.content;
102
+ // Step 4: Get processed content
103
+ // Priority: Judge-synthesized > Separate conditioning > Original
104
+ let processedContent;
105
+ let conditioningTime = 0;
106
+ const judgeScores = isJudgeScores(scoreResult.scores)
107
+ ? scoreResult.scores
108
+ : convertToJudgeScores(scoreResult.scores);
109
+ if (judgeScores.synthesizedResponse) {
110
+ // Judge already synthesized improved response
111
+ processedContent = judgeScores.synthesizedResponse;
112
+ logger.debug(`[WorkflowRunner] Using judge-synthesized response`);
113
+ }
114
+ else if (config.conditioning) {
115
+ // Fall back to separate conditioning if configured
116
+ const conditionedContent = await conditionFinalResponse(bestResponse, scoreResult.scores, config, options, ensembleResult.responses);
117
+ processedContent = conditionedContent.content;
118
+ conditioningTime = conditionedContent.conditioningTime;
119
+ logger.debug(`[WorkflowRunner] Using separate conditioning`);
120
+ }
121
+ else {
122
+ // No processing, use original
123
+ processedContent = originalContent;
124
+ logger.debug(`[WorkflowRunner] No conditioning applied`);
125
+ }
126
+ // Step 5: Calculate execution metrics
127
+ const executionTime = Date.now() - startTime;
128
+ const ensembleTime = ensembleResult.totalTime;
129
+ const judgeTime = scoreResult.judgeTime;
130
+ // Step 6: Assemble complete result
131
+ const result = {
132
+ // Primary output (processed version)
133
+ content: processedContent,
134
+ // IMPORTANT: Store original unmodified response separately
135
+ originalContent: originalContent,
136
+ // Evaluation metrics (0-100 scale)
137
+ score: extractScore(scoreResult.scores, bestResponse, ensembleResult.responses),
138
+ reasoning: extractReasoning(scoreResult.scores),
139
+ // Ensemble data
140
+ ensembleResponses: ensembleResult.responses,
141
+ // Judge data
142
+ judgeScores: judgeScores,
143
+ selectedResponse: bestResponse,
144
+ // Quality metrics
145
+ confidence: extractConfidence(scoreResult.scores),
146
+ consensus: extractConsensus(scoreResult.scores),
147
+ // Performance metrics
148
+ totalTime: executionTime,
149
+ ensembleTime,
150
+ judgeTime,
151
+ conditioningTime: conditioningTime,
152
+ // Workflow metadata
153
+ workflow: config.id,
154
+ workflowName: config.name,
155
+ workflowVersion: config.version,
156
+ // Resource usage
157
+ usage: {
158
+ totalInputTokens: calculateInputTokens(ensembleResult.responses),
159
+ totalOutputTokens: calculateOutputTokens(ensembleResult.responses),
160
+ totalTokens: calculateTotalTokens(ensembleResult.responses),
161
+ byModel: [], // TODO: Populate per-model breakdown
162
+ },
163
+ // Additional metadata
164
+ metadata: options.metadata,
165
+ timestamp: new Date().toISOString(),
166
+ };
167
+ if (options.verbose) {
168
+ logger.debug(`[WorkflowRunner] Workflow complete in ${executionTime}ms`);
169
+ logger.debug(`[WorkflowRunner] Total tokens: ${result.usage?.totalTokens || 0}`);
170
+ }
171
+ span.durationMs = executionTime;
172
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
173
+ getMetricsAggregator().recordSpan(endedSpan);
174
+ return result;
158
175
  }
159
- span.durationMs = executionTime;
160
- const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
161
- getMetricsAggregator().recordSpan(endedSpan);
162
- return result;
163
- }
164
- catch (error) {
165
- const executionTime = Date.now() - startTime;
166
- const errorMessage = error instanceof Error ? error.message : String(error);
167
- if (options.verbose) {
168
- logger.error(`[WorkflowRunner] Workflow failed:`, errorMessage);
176
+ catch (error) {
177
+ const executionTime = Date.now() - startTime;
178
+ const errorMessage = error instanceof Error ? error.message : String(error);
179
+ if (options.verbose) {
180
+ logger.error(`[WorkflowRunner] Workflow failed:`, errorMessage);
181
+ }
182
+ span.durationMs = executionTime;
183
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, errorMessage);
184
+ getMetricsAggregator().recordSpan(endedSpan);
185
+ // Mark outer OTel span as ERROR since we return instead of rethrowing
186
+ otelSpan.recordException(error instanceof Error ? error : new Error(errorMessage));
187
+ otelSpan.setStatus({
188
+ code: SpanStatusCode.ERROR,
189
+ message: errorMessage,
190
+ });
191
+ // Return error result with dummy data
192
+ const dummyResponse = {
193
+ provider: PLACEHOLDER_PROVIDER,
194
+ model: PLACEHOLDER_MODEL,
195
+ content: "",
196
+ responseTime: 0,
197
+ status: "failure",
198
+ error: errorMessage,
199
+ timestamp: new Date().toISOString(),
200
+ };
201
+ return {
202
+ content: "",
203
+ score: 0,
204
+ reasoning: `Workflow execution failed: ${errorMessage}`,
205
+ ensembleResponses: [dummyResponse],
206
+ confidence: 0,
207
+ totalTime: executionTime,
208
+ ensembleTime: 0,
209
+ workflow: config.id,
210
+ workflowName: config.name,
211
+ workflowVersion: config.version,
212
+ metadata: options.metadata,
213
+ timestamp: new Date().toISOString(),
214
+ };
169
215
  }
170
- span.durationMs = executionTime;
171
- const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, errorMessage);
172
- getMetricsAggregator().recordSpan(endedSpan);
173
- // Return error result with dummy data
174
- const dummyResponse = {
175
- provider: PLACEHOLDER_PROVIDER,
176
- model: PLACEHOLDER_MODEL,
177
- content: "",
178
- responseTime: 0,
179
- status: "failure",
180
- error: errorMessage,
181
- timestamp: new Date().toISOString(),
182
- };
183
- return {
184
- content: "",
185
- score: 0,
186
- reasoning: `Workflow execution failed: ${errorMessage}`,
187
- ensembleResponses: [dummyResponse],
188
- confidence: 0,
189
- totalTime: executionTime,
190
- ensembleTime: 0,
191
- workflow: config.id,
192
- workflowName: config.name,
193
- workflowVersion: config.version,
194
- metadata: options.metadata,
195
- timestamp: new Date().toISOString(),
196
- };
197
- }
216
+ }); // end withSpan
198
217
  }
199
218
  /**
200
219
  * Execute models using layer-based or flat execution
@@ -459,6 +478,18 @@ function calculateTotalTokens(responses) {
459
478
  * ```
460
479
  */
461
480
  export async function* runWorkflowWithStreaming(config, options) {
481
+ // Wrap the generator in an active OTel span so Pipeline A captures the
482
+ // streaming workflow end-to-end and Pipeline B (below) inherits its traceId.
483
+ const generator = tracers.workflow.startActiveSpan("neurolink.workflow.run.streaming", {
484
+ attributes: {
485
+ "workflow.name": config.name,
486
+ "workflow.type": config.type,
487
+ "workflow.id": config.id ?? "unknown",
488
+ },
489
+ }, (otelSpan) => runWorkflowStreamingInner(config, options, otelSpan));
490
+ yield* generator;
491
+ }
492
+ async function* runWorkflowStreamingInner(config, options, otelSpan) {
462
493
  const startTime = Date.now();
463
494
  const span = SpanSerializer.createSpan(SpanType.WORKFLOW, "workflow.run.streaming", {
464
495
  "workflow.operation": "run.streaming",
@@ -469,14 +500,21 @@ export async function* runWorkflowWithStreaming(config, options) {
469
500
  // Validate configuration
470
501
  const validation = validateWorkflow(config);
471
502
  if (!validation.valid) {
503
+ const errMsg = `Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`;
472
504
  span.durationMs = Date.now() - startTime;
473
- const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, `Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
505
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, errMsg);
474
506
  getMetricsAggregator().recordSpan(endedSpan);
475
- throw new Error(`Invalid workflow configuration: ${validation.errors.map((err) => err.message).join(", ")}`);
507
+ const err = new Error(errMsg);
508
+ otelSpan.recordException(err);
509
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: errMsg });
510
+ otelSpan.end();
511
+ throw err;
476
512
  }
477
513
  if (options.verbose) {
478
514
  logger.debug(`[WorkflowRunner] Starting streaming workflow: ${config.name}`);
479
515
  }
516
+ // eslint-disable-next-line no-useless-assignment -- read in finally block
517
+ let spanEnded = false;
480
518
  try {
481
519
  // Step 1: Execute models
482
520
  const ensembleResult = await executeModels(config, options);
@@ -571,17 +609,34 @@ export async function* runWorkflowWithStreaming(config, options) {
571
609
  span.durationMs = executionTime;
572
610
  const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
573
611
  getMetricsAggregator().recordSpan(endedSpan);
612
+ spanEnded = true;
613
+ otelSpan.setStatus({ code: SpanStatusCode.OK });
614
+ otelSpan.end();
574
615
  }
575
616
  catch (error) {
617
+ spanEnded = true;
576
618
  const executionTime = Date.now() - startTime;
577
619
  const errorMessage = error instanceof Error ? error.message : String(error);
578
620
  span.durationMs = executionTime;
579
621
  const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR, errorMessage);
580
622
  getMetricsAggregator().recordSpan(endedSpan);
623
+ if (error instanceof Error) {
624
+ otelSpan.recordException(error);
625
+ }
626
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
627
+ otelSpan.end();
581
628
  logger.error(`[WorkflowRunner] Streaming workflow failed`, {
582
629
  error: errorMessage,
583
630
  });
584
631
  throw error;
585
632
  }
633
+ finally {
634
+ // Guard against span leak when the consumer breaks out of the async
635
+ // generator early (neither try-success nor catch fires in that case).
636
+ if (!spanEnded) {
637
+ otelSpan.setStatus({ code: SpanStatusCode.OK });
638
+ otelSpan.end();
639
+ }
640
+ }
586
641
  }
587
642
  //# sourceMappingURL=workflowRunner.js.map
@@ -10,6 +10,8 @@
10
10
  import { EventEmitter } from "events";
11
11
  import { logger } from "../../utils/logger.js";
12
12
  import { ErrorFactory } from "../../utils/errorHandling.js";
13
+ import { withSpan } from "../../telemetry/withSpan.js";
14
+ import { tracers } from "../../telemetry/tracers.js";
13
15
  /**
14
16
  * Request Batcher - Efficient batch processing for MCP tool calls
15
17
  *
@@ -217,85 +219,109 @@ export class RequestBatcher extends EventEmitter {
217
219
  const startTime = Date.now();
218
220
  this.activeBatches++;
219
221
  this.emit("batchStarted", { batchId, size: batchRequests.length });
220
- try {
221
- // Guard against missing executor
222
- if (!this.executor) {
223
- throw ErrorFactory.missingConfiguration("batchExecutor", {
224
- hint: "Call setExecutor() before executing batches",
225
- });
226
- }
227
- // Execute the batch with a timeout to prevent indefinite hangs
228
- const executorPromise = this.executor(batchRequests.map((r) => ({
229
- tool: r.tool,
230
- args: r.args,
231
- serverId: r.serverId,
232
- })));
233
- const timeoutMs = Math.max(5000, Number(process.env.MCP_TOOL_TIMEOUT) || 60000);
234
- let timeoutHandle;
235
- const timeoutPromise = new Promise((_, reject) => {
236
- timeoutHandle = setTimeout(() => reject(ErrorFactory.toolTimeout("batchExecution", timeoutMs)), timeoutMs);
237
- });
238
- const results = await Promise.race([
239
- executorPromise,
240
- timeoutPromise,
241
- ]).finally(() => {
242
- if (timeoutHandle) {
243
- clearTimeout(timeoutHandle);
244
- }
245
- });
246
- // Process results
247
- const batchResults = [];
248
- for (let i = 0; i < batchRequests.length; i++) {
249
- const request = batchRequests[i];
250
- const result = results[i];
251
- const executionTime = Date.now() - startTime;
252
- if (!result) {
253
- const noResultError = ErrorFactory.toolExecutionFailed(request.tool, new Error(`Batch executor returned no result for request ${i}`));
254
- request.reject(noResultError);
255
- batchResults.push({
256
- id: request.id,
257
- success: false,
258
- error: noResultError,
259
- executionTime,
222
+ await withSpan({
223
+ name: "neurolink.mcp.batch.execute",
224
+ tracer: tracers.mcp,
225
+ attributes: {
226
+ "mcp.batch.id": batchId,
227
+ "mcp.batch.size": batchRequests.length,
228
+ "mcp.batch.active_batches": this.activeBatches,
229
+ },
230
+ }, async (span) => {
231
+ let successCount = 0;
232
+ let errorCount = 0;
233
+ try {
234
+ // Guard against missing executor
235
+ if (!this.executor) {
236
+ throw ErrorFactory.missingConfiguration("batchExecutor", {
237
+ hint: "Call setExecutor() before executing batches",
260
238
  });
261
- continue;
262
239
  }
263
- if (result.success) {
264
- request.resolve(result.result);
265
- batchResults.push({
266
- id: request.id,
267
- success: true,
268
- result: result.result,
269
- executionTime,
270
- });
240
+ // Execute the batch with a timeout to prevent indefinite hangs
241
+ const executorPromise = this.executor(batchRequests.map((r) => ({
242
+ tool: r.tool,
243
+ args: r.args,
244
+ serverId: r.serverId,
245
+ })));
246
+ const timeoutMs = Math.max(5000, Number(process.env.MCP_TOOL_TIMEOUT) || 60000);
247
+ let timeoutHandle;
248
+ const timeoutPromise = new Promise((_, reject) => {
249
+ timeoutHandle = setTimeout(() => reject(ErrorFactory.toolTimeout("batchExecution", timeoutMs)), timeoutMs);
250
+ });
251
+ // Suppress unhandled rejection if executorPromise rejects after timeout wins
252
+ void executorPromise.catch((_e) => {
253
+ // Intentionally swallowed — timeout already handled the failure
254
+ });
255
+ const results = await Promise.race([
256
+ executorPromise,
257
+ timeoutPromise,
258
+ ]).finally(() => {
259
+ if (timeoutHandle) {
260
+ clearTimeout(timeoutHandle);
261
+ }
262
+ });
263
+ // Process results
264
+ const batchResults = [];
265
+ for (let i = 0; i < batchRequests.length; i++) {
266
+ const request = batchRequests[i];
267
+ const result = results[i];
268
+ const executionTime = Date.now() - startTime;
269
+ if (!result) {
270
+ const noResultError = ErrorFactory.toolExecutionFailed(request.tool, new Error(`Batch executor returned no result for request ${i}`));
271
+ request.reject(noResultError);
272
+ batchResults.push({
273
+ id: request.id,
274
+ success: false,
275
+ error: noResultError,
276
+ executionTime,
277
+ });
278
+ errorCount++;
279
+ continue;
280
+ }
281
+ if (result.success) {
282
+ request.resolve(result.result);
283
+ batchResults.push({
284
+ id: request.id,
285
+ success: true,
286
+ result: result.result,
287
+ executionTime,
288
+ });
289
+ successCount++;
290
+ }
291
+ else {
292
+ const error = result.error ??
293
+ ErrorFactory.toolExecutionFailed(request.tool, new Error("Unknown batch execution error"));
294
+ request.reject(error);
295
+ batchResults.push({
296
+ id: request.id,
297
+ success: false,
298
+ error,
299
+ executionTime,
300
+ });
301
+ errorCount++;
302
+ }
271
303
  }
272
- else {
273
- const error = result.error ??
274
- ErrorFactory.toolExecutionFailed(request.tool, new Error("Unknown batch execution error"));
275
- request.reject(error);
276
- batchResults.push({
277
- id: request.id,
278
- success: false,
279
- error,
280
- executionTime,
281
- });
304
+ span.setAttribute("mcp.batch.success_count", successCount);
305
+ span.setAttribute("mcp.batch.error_count", errorCount);
306
+ this.emit("batchCompleted", { batchId, results: batchResults });
307
+ }
308
+ catch (error) {
309
+ // Batch-level failure - reject all requests
310
+ const batchError = error instanceof Error
311
+ ? error
312
+ : ErrorFactory.toolExecutionFailed("batch", new Error(String(error)));
313
+ for (const request of batchRequests) {
314
+ request.reject(batchError);
282
315
  }
316
+ this.emit("batchFailed", { batchId, error: batchError });
317
+ throw batchError;
283
318
  }
284
- this.emit("batchCompleted", { batchId, results: batchResults });
285
- }
286
- catch (error) {
287
- // Batch-level failure - reject all requests
288
- const batchError = error instanceof Error
289
- ? error
290
- : ErrorFactory.toolExecutionFailed("batch", new Error(String(error)));
291
- for (const request of batchRequests) {
292
- request.reject(batchError);
319
+ finally {
320
+ this.activeBatches--;
293
321
  }
294
- this.emit("batchFailed", { batchId, error: batchError });
295
- }
296
- finally {
297
- this.activeBatches--;
298
- }
322
+ }).catch((error) => {
323
+ logger.error("Batch span execution failed:", error);
324
+ });
299
325
  // Schedule next batch if there are more pending requests
300
326
  if (this.pending.size > 0) {
301
327
  this.clearFlushTimer();
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { mcpLogger } from "../utils/logger.js";
7
7
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
8
+ import { getActiveTraceContext } from "../telemetry/traceContext.js";
8
9
  /**
9
10
  * Default rate limit configuration
10
11
  * Provides sensible defaults for most MCP HTTP transport use cases
@@ -72,12 +73,13 @@ export class HTTPRateLimiter {
72
73
  * @throws Error if the wait queue is too long
73
74
  */
74
75
  async acquire() {
76
+ const { traceId, parentSpanId } = getActiveTraceContext();
75
77
  const span = SpanSerializer.createSpan(SpanType.MCP_TRANSPORT, "mcp.rateLimit", {
76
78
  "mcp.transport": "http",
77
79
  "mcp.operation": "rateLimit",
78
80
  "mcp.rateLimit.tokensAvailable": this.tokens,
79
81
  "mcp.rateLimit.maxBurst": this.config.maxBurst,
80
- });
82
+ }, parentSpanId, traceId);
81
83
  const startTime = Date.now();
82
84
  try {
83
85
  // First, try to acquire without waiting
@@ -8,6 +8,7 @@ import { isAbortError } from "../utils/errorHandling.js";
8
8
  import { calculateBackoffDelay } from "../utils/retryHandler.js";
9
9
  import { logger } from "../utils/logger.js";
10
10
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
11
+ import { getActiveTraceContext } from "../telemetry/traceContext.js";
11
12
  /**
12
13
  * Default HTTP retry configuration
13
14
  */
@@ -130,11 +131,12 @@ export async function withHTTPRetry(operation, config = {}) {
130
131
  ...DEFAULT_HTTP_RETRY_CONFIG,
131
132
  ...config,
132
133
  };
134
+ const { traceId, parentSpanId } = getActiveTraceContext();
133
135
  const span = SpanSerializer.createSpan(SpanType.MCP_TRANSPORT, "mcp.retry", {
134
136
  "mcp.transport": "http",
135
137
  "mcp.operation": "retry",
136
138
  "mcp.maxAttempts": mergedConfig.maxAttempts,
137
- });
139
+ }, parentSpanId, traceId);
138
140
  const startTime = Date.now();
139
141
  let lastError;
140
142
  let actualAttempts = 0;