@juspay/neurolink 9.54.6 → 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 (408) hide show
  1. package/CHANGELOG.md +2 -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 +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 +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 +82 -0
  184. package/dist/lib/providers/googleVertex.js +52 -0
  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 +82 -0
  310. package/dist/providers/googleVertex.js +52 -0
  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 -1
@@ -7,6 +7,8 @@
7
7
  import { TokenUtils } from "../constants/tokens.js";
8
8
  import { buildContextFromPointer, generateSummary, } from "../utils/conversationMemory.js";
9
9
  import { RECENT_MESSAGES_RATIO } from "../config/conversationMemory.js";
10
+ import { withSpan } from "../telemetry/withSpan.js";
11
+ import { tracers } from "../telemetry/tracers.js";
10
12
  import { logger } from "../utils/logger.js";
11
13
  /**
12
14
  * Centralized summarization engine for conversation memory.
@@ -22,22 +24,33 @@ export class SummarizationEngine {
22
24
  * @returns True if summarization was performed
23
25
  */
24
26
  async checkAndSummarize(session, threshold, config, logPrefix = "[SummarizationEngine]", requestId) {
25
- const contextMessages = buildContextFromPointer(session, requestId);
26
- const tokenCount = this.estimateTokens(contextMessages);
27
- session.lastTokenCount = tokenCount;
28
- session.lastCountedAt = Date.now();
29
- logger.info("[Summarization] Check", {
30
- requestId,
31
- sessionId: session.sessionId,
32
- tokenCount,
33
- threshold,
34
- willSummarize: tokenCount >= threshold,
35
- });
36
- if (tokenCount >= threshold) {
37
- await this.summarizeSession(session, threshold, config, logPrefix, requestId);
38
- return true;
39
- }
40
- return false;
27
+ return withSpan({
28
+ name: "neurolink.memory.summarize",
29
+ tracer: tracers.memory,
30
+ attributes: {
31
+ "memory.session_id": session.sessionId ?? "unknown",
32
+ "memory.threshold": threshold,
33
+ },
34
+ }, async (span) => {
35
+ const contextMessages = buildContextFromPointer(session, requestId);
36
+ const tokenCount = this.estimateTokens(contextMessages);
37
+ session.lastTokenCount = tokenCount;
38
+ session.lastCountedAt = Date.now();
39
+ logger.info("[Summarization] Check", {
40
+ requestId,
41
+ sessionId: session.sessionId,
42
+ tokenCount,
43
+ threshold,
44
+ willSummarize: tokenCount >= threshold,
45
+ });
46
+ if (tokenCount >= threshold) {
47
+ await this.summarizeSession(session, threshold, config, logPrefix, requestId);
48
+ span.setAttribute("memory.summarized", true);
49
+ return true;
50
+ }
51
+ span.setAttribute("memory.summarized", false);
52
+ return false;
53
+ }); // end withSpan
41
54
  }
42
55
  /**
43
56
  * Perform token-based summarization on a session.
@@ -3,12 +3,9 @@ import { generateText } from "ai";
3
3
  import { directAgentTools } from "../agent/directTools.js";
4
4
  import { IMAGE_GENERATION_MODELS } from "../core/constants.js";
5
5
  import { MiddlewareFactory } from "../middleware/factory.js";
6
- import { SpanStatus, SpanType } from "../types/index.js";
7
- import { SpanSerializer } from "../observability/utils/spanSerializer.js";
8
6
  import { ATTR, tracers } from "../telemetry/index.js";
9
7
  import { isAbortError } from "../utils/errorHandling.js";
10
8
  import { logger } from "../utils/logger.js";
11
- import { calculateCost } from "../utils/pricing.js";
12
9
  import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
13
10
  import { shouldDisableBuiltinTools } from "../utils/toolUtils.js";
14
11
  import { getKeyCount, getKeysAsString } from "../utils/transformationUtils.js";
@@ -61,7 +58,7 @@ export class BaseProvider {
61
58
  this.messageBuilder = new MessageBuilder(this.providerName, this.modelName);
62
59
  this.streamHandler = new StreamHandler(this.providerName, this.modelName);
63
60
  this.telemetryHandler = new TelemetryHandler(this.providerName, this.modelName, this.neurolink);
64
- this.generationHandler = new GenerationHandler(this.providerName, this.modelName, () => this.supportsTools(), (options, type) => this.telemetryHandler.getTelemetryConfig(options, type), (toolCalls, toolResults, options, timestamp) => this.handleToolExecutionStorage(toolCalls, toolResults, options, timestamp));
61
+ this.generationHandler = new GenerationHandler(this.providerName, this.modelName, () => this.supportsTools(), (options, type) => this.telemetryHandler.getTelemetryConfig(options, type), (toolCalls, toolResults, options, timestamp) => this.handleToolExecutionStorage(toolCalls, toolResults, options, timestamp), () => this.neurolink?.getEventEmitter());
65
62
  this.utilities = new Utilities(this.providerName, this.modelName, this.defaultTimeout, this.middlewareOptions);
66
63
  this.toolsManager = new ToolsManager(this.providerName, this.directTools, this.neurolink, {
67
64
  isZodSchema: (schema) => this.isZodSchema(schema),
@@ -87,135 +84,103 @@ export class BaseProvider {
87
84
  */
88
85
  async stream(optionsOrPrompt, analysisSchema) {
89
86
  let options = this.normalizeStreamOptions(optionsOrPrompt);
90
- // Observability: create metrics span for provider.stream
91
- const metricsSpan = SpanSerializer.createSpan(SpanType.MODEL_GENERATION, "provider.stream", {
92
- "ai.provider": this.providerName || "unknown",
93
- "ai.model": this.modelName || options.model || "unknown",
94
- "ai.temperature": options.temperature,
95
- "ai.max_tokens": options.maxTokens,
96
- }, this._traceContext?.parentSpanId, this._traceContext?.traceId);
97
- let metricsSpanRecorded = false;
98
- // OTEL span for provider-level stream tracing
99
- const otelStreamSpan = tracers.provider.startSpan("neurolink.provider.stream", {
100
- kind: SpanKind.CLIENT,
101
- attributes: {
102
- [ATTR.GEN_AI_SYSTEM]: this.providerName || "unknown",
103
- [ATTR.GEN_AI_MODEL]: this.modelName || options.model || "unknown",
104
- [ATTR.GEN_AI_OPERATION]: "stream",
105
- [ATTR.NL_PROVIDER]: this.providerName || "unknown",
106
- },
87
+ logger.info(`Starting stream`, {
88
+ provider: this.providerName,
89
+ hasTools: !options.disableTools && this.supportsTools(),
90
+ disableTools: !!options.disableTools,
91
+ supportsTools: this.supportsTools(),
92
+ inputLength: options.input?.text?.length || 0,
93
+ maxTokens: options.maxTokens,
94
+ temperature: options.temperature,
95
+ timestamp: Date.now(),
107
96
  });
108
- try {
109
- logger.info(`Starting stream`, {
110
- provider: this.providerName,
111
- hasTools: !options.disableTools && this.supportsTools(),
112
- disableTools: !!options.disableTools,
113
- supportsTools: this.supportsTools(),
114
- inputLength: options.input?.text?.length || 0,
115
- maxTokens: options.maxTokens,
116
- temperature: options.temperature,
117
- timestamp: Date.now(),
118
- });
119
- // ===== EARLY MULTIMODAL DETECTION =====
120
- const hasFileInput = !!options.input?.files?.length || !!options.input?.videoFiles?.length;
121
- if (hasFileInput) {
122
- // ===== VIDEO ANALYSIS DETECTION =====
123
- // Check if video frames are present and handle with fake streaming
124
- const messages = await this.buildMessagesForStream(options);
125
- if (hasVideoFrames(messages)) {
126
- logger.info(`Video frames detected in stream, using fake streaming for video analysis`, {
127
- provider: this.providerName,
128
- model: this.modelName,
129
- });
130
- return await this.executeFakeStreaming(options, analysisSchema);
131
- }
132
- }
133
- // CRITICAL: Image generation models don't support real streaming
134
- // Force fake streaming for image models to ensure image output is yielded.
135
- // Skip this path when the caller explicitly requests non-image output (e.g.
136
- // JSON analysis) so dual-mode models like gemini-3.1-flash-image-preview
137
- // can still perform text/structured generation.
138
- const isImageModel = IMAGE_GENERATION_MODELS.some((m) => this.modelName.includes(m));
139
- const requestsNonImageOutput = options.output?.format === "json" ||
140
- options.output?.format === "structured" ||
141
- options.output?.format === "text";
142
- if (isImageModel && !requestsNonImageOutput) {
143
- logger.info(`Image model detected, forcing fake streaming`, {
97
+ // ===== EARLY MULTIMODAL DETECTION =====
98
+ const hasFileInput = !!options.input?.files?.length || !!options.input?.videoFiles?.length;
99
+ if (hasFileInput) {
100
+ // ===== VIDEO ANALYSIS DETECTION =====
101
+ // Check if video frames are present and handle with fake streaming
102
+ const messages = await this.buildMessagesForStream(options);
103
+ if (hasVideoFrames(messages)) {
104
+ logger.info(`Video frames detected in stream, using fake streaming for video analysis`, {
144
105
  provider: this.providerName,
145
106
  model: this.modelName,
146
- reason: "Image generation requires fake streaming to yield image output",
147
107
  });
148
- // Skip real streaming, go directly to fake streaming
149
108
  return await this.executeFakeStreaming(options, analysisSchema);
150
109
  }
151
- // Central tool merge: Pre-merge base tools (MCP/built-in) with user-provided
152
- // tools (e.g. RAG tools) into options.tools. This way, every provider's
153
- // executeStream() can simply use options.tools (or getAllTools() + options.tools)
154
- // and get the complete tool set without needing per-provider merge logic.
155
- if (!options.disableTools && this.supportsTools()) {
156
- const mergedTools = await this.getToolsForStream(options);
157
- options = { ...options, tools: mergedTools };
158
- }
159
- else {
160
- options = { ...options, tools: {} };
161
- }
162
- // CRITICAL FIX: Always prefer real streaming over fake streaming
163
- // Try real streaming first, use fake streaming only as fallback
164
- try {
165
- logger.debug(`Attempting real streaming`, {
166
- provider: this.providerName,
167
- timestamp: Date.now(),
168
- });
169
- const realStreamResult = await this.executeStream(options, analysisSchema);
170
- logger.info(`Real streaming succeeded`, {
171
- provider: this.providerName,
172
- timestamp: Date.now(),
173
- });
174
- // If real streaming succeeds, return it (with tools support via Vercel AI SDK)
175
- return realStreamResult;
176
- }
177
- catch (realStreamError) {
178
- logger.warn(`Real streaming failed for ${this.providerName}, falling back to fake streaming:`, {
179
- error: realStreamError instanceof Error
180
- ? realStreamError.message
181
- : String(realStreamError),
182
- timestamp: Date.now(),
183
- });
184
- // Fallback to fake streaming only if real streaming fails AND tools are enabled
185
- if (!options.disableTools && this.supportsTools()) {
186
- return await this.executeFakeStreaming(options, analysisSchema);
187
- }
188
- else {
189
- // If real streaming failed and no tools are enabled, re-throw the original error
190
- logger.error(`Real streaming failed for ${this.providerName}:`, realStreamError);
191
- throw this.handleProviderError(realStreamError);
192
- }
193
- }
194
110
  }
195
- catch (error) {
196
- // Observability: record failed stream span
197
- metricsSpanRecorded = true;
198
- const _endedStreamSpan = SpanSerializer.endSpan(metricsSpan, SpanStatus.ERROR, error instanceof Error ? error.message : String(error));
199
- // Note: Do NOT record to getMetricsAggregator() here — neurolink.ts
200
- // stream:complete listener handles authoritative metrics to avoid double-counting.
201
- otelStreamSpan.setStatus({
202
- code: SpanStatusCode.ERROR,
203
- message: error instanceof Error ? error.message : String(error),
111
+ // CRITICAL: Image generation models don't support real streaming
112
+ // Force fake streaming for image models to ensure image output is yielded.
113
+ // Skip this path when the caller explicitly requests non-image output (e.g.
114
+ // JSON analysis) so dual-mode models like gemini-3.1-flash-image-preview
115
+ // can still perform text/structured generation.
116
+ const isImageModel = IMAGE_GENERATION_MODELS.some((m) => this.modelName.includes(m));
117
+ const requestsNonImageOutput = options.output?.format === "json" ||
118
+ options.output?.format === "structured" ||
119
+ options.output?.format === "text";
120
+ if (isImageModel && !requestsNonImageOutput) {
121
+ logger.info(`Image model detected, forcing fake streaming`, {
122
+ provider: this.providerName,
123
+ model: this.modelName,
124
+ reason: "Image generation requires fake streaming to yield image output",
204
125
  });
205
- otelStreamSpan.end();
206
- throw error;
126
+ // Skip real streaming, go directly to fake streaming
127
+ return await this.executeFakeStreaming(options, analysisSchema);
207
128
  }
208
- finally {
209
- // Observability: record successful stream span (only if not already ended via error path)
210
- if (!metricsSpanRecorded) {
211
- const _endedStreamSpan = SpanSerializer.endSpan(metricsSpan, SpanStatus.OK);
212
- // Note: Do NOT record to getMetricsAggregator() here — neurolink.ts
213
- // stream:complete listener handles authoritative metrics to avoid double-counting.
129
+ // Central tool merge: Pre-merge base tools (MCP/built-in) with user-provided
130
+ // tools (e.g. RAG tools) into options.tools. This way, every provider's
131
+ // executeStream() can simply use options.tools (or getAllTools() + options.tools)
132
+ // and get the complete tool set without needing per-provider merge logic.
133
+ if (!options.disableTools && this.supportsTools()) {
134
+ const mergedTools = await this.getToolsForStream(options);
135
+ options = { ...options, tools: mergedTools };
136
+ }
137
+ else {
138
+ options = { ...options, tools: {} };
139
+ }
140
+ // CRITICAL FIX: Always prefer real streaming over fake streaming
141
+ // Try real streaming first, use fake streaming only as fallback
142
+ try {
143
+ logger.debug(`Attempting real streaming`, {
144
+ provider: this.providerName,
145
+ timestamp: Date.now(),
146
+ });
147
+ const realStreamResult = await this.executeStream(options, analysisSchema);
148
+ logger.info(`Real streaming succeeded`, {
149
+ provider: this.providerName,
150
+ timestamp: Date.now(),
151
+ });
152
+ // If real streaming succeeds, return it (with tools support via Vercel AI SDK)
153
+ return realStreamResult;
154
+ }
155
+ catch (realStreamError) {
156
+ // Don't retry on terminal/abort errors — only fall back for
157
+ // "real streaming with tools is unsupported" style failures.
158
+ const errMsg = realStreamError instanceof Error
159
+ ? realStreamError.message
160
+ : String(realStreamError);
161
+ const errName = realStreamError instanceof Error ? realStreamError.name : "";
162
+ if (errName === "AbortError" ||
163
+ errMsg.includes("abort") ||
164
+ errMsg.includes("timeout") ||
165
+ errMsg.includes("401") ||
166
+ errMsg.includes("403") ||
167
+ errMsg.includes("quota") ||
168
+ errMsg.includes("rate limit") ||
169
+ errMsg.includes("authentication")) {
170
+ throw this.handleProviderError(realStreamError);
214
171
  }
215
- // End OTEL span on success (only if not already ended via error path)
216
- if (otelStreamSpan.isRecording()) {
217
- otelStreamSpan.setStatus({ code: SpanStatusCode.OK });
218
- otelStreamSpan.end();
172
+ logger.warn(`Real streaming failed for ${this.providerName}, falling back to fake streaming:`, {
173
+ error: errMsg,
174
+ timestamp: Date.now(),
175
+ });
176
+ // Fallback to fake streaming only if real streaming fails AND tools are enabled
177
+ if (!options.disableTools && this.supportsTools()) {
178
+ return await this.executeFakeStreaming(options, analysisSchema);
179
+ }
180
+ else {
181
+ // If real streaming failed and no tools are enabled, re-throw the original error
182
+ logger.error(`Real streaming failed for ${this.providerName}:`, realStreamError);
183
+ throw this.handleProviderError(realStreamError);
219
184
  }
220
185
  }
221
186
  }
@@ -508,13 +473,6 @@ export class BaseProvider {
508
473
  const options = this.normalizeTextOptions(optionsOrPrompt);
509
474
  this.validateOptions(options);
510
475
  const startTime = Date.now();
511
- // Observability: create metrics span for provider.generate
512
- const metricsSpan = SpanSerializer.createSpan(SpanType.MODEL_GENERATION, "provider.generate", {
513
- "ai.provider": this.providerName || "unknown",
514
- "ai.model": this.modelName || options.model || "unknown",
515
- "ai.temperature": options.temperature,
516
- "ai.max_tokens": options.maxTokens,
517
- }, this._traceContext?.parentSpanId, this._traceContext?.traceId);
518
476
  // OTEL span for provider-level generate tracing
519
477
  // Use startActiveSpan pattern via context.with() so child spans become descendants
520
478
  const otelSpan = tracers.provider.startSpan("neurolink.provider.generate", {
@@ -529,7 +487,7 @@ export class BaseProvider {
529
487
  // Set this span as the active context so child spans (GenerationHandler, etc.) become descendants
530
488
  const activeCtx = trace.setSpan(context.active(), otelSpan);
531
489
  const otelSpanState = { ended: false };
532
- return await context.with(activeCtx, async () => this.runGenerateInActiveContext(options, startTime, metricsSpan, otelSpan, otelSpanState));
490
+ return await context.with(activeCtx, async () => this.runGenerateInActiveContext(options, startTime, otelSpan, otelSpanState));
533
491
  }
534
492
  /**
535
493
  * Alias for generate method - implements AIProvider interface
@@ -537,7 +495,7 @@ export class BaseProvider {
537
495
  async gen(optionsOrPrompt, analysisSchema) {
538
496
  return this.generate(optionsOrPrompt, analysisSchema);
539
497
  }
540
- async runGenerateInActiveContext(options, startTime, metricsSpan, otelSpan, otelSpanState) {
498
+ async runGenerateInActiveContext(options, startTime, otelSpan, otelSpanState) {
541
499
  try {
542
500
  if (options.output?.mode === "video") {
543
501
  return await this.handleVideoGeneration(options, startTime);
@@ -563,10 +521,9 @@ export class BaseProvider {
563
521
  if (videoFrameResult) {
564
522
  return videoFrameResult;
565
523
  }
566
- return await this.executeStandardGenerateFlow(options, startTime, metricsSpan, model, messages, tools);
524
+ return await this.executeStandardGenerateFlow(options, startTime, model, messages, tools);
567
525
  }
568
526
  catch (error) {
569
- SpanSerializer.endSpan(metricsSpan, SpanStatus.ERROR, error instanceof Error ? error.message : String(error));
570
527
  otelSpan.setStatus({
571
528
  code: SpanStatusCode.ERROR,
572
529
  message: error instanceof Error ? error.message : String(error),
@@ -673,7 +630,7 @@ export class BaseProvider {
673
630
  usage,
674
631
  }, options, startTime);
675
632
  }
676
- async executeStandardGenerateFlow(options, startTime, metricsSpan, model, messages, tools) {
633
+ async executeStandardGenerateFlow(options, startTime, model, messages, tools) {
677
634
  const timeoutController = createTimeoutController(options.timeout, this.providerName, "generate");
678
635
  const composedSignal = composeAbortSignals(options.abortSignal, timeoutController?.controller.signal);
679
636
  const composedOptions = composedSignal
@@ -693,23 +650,6 @@ export class BaseProvider {
693
650
  const { toolsUsed, toolExecutions } = this.extractToolInformation(generateResult);
694
651
  let enhancedResult = this.formatEnhancedResult(generateResult, tools, toolsUsed, toolExecutions, options);
695
652
  enhancedResult = await this.synthesizeAIResponseIfNeeded(enhancedResult, options);
696
- let enrichedGenerateSpan = { ...metricsSpan };
697
- if (enhancedResult?.usage) {
698
- enrichedGenerateSpan = SpanSerializer.enrichWithTokenUsage(enrichedGenerateSpan, {
699
- promptTokens: enhancedResult.usage.input || 0,
700
- completionTokens: enhancedResult.usage.output || 0,
701
- totalTokens: enhancedResult.usage.total || 0,
702
- });
703
- const cost = calculateCost(this.providerName, this.modelName, {
704
- input: enhancedResult.usage.input || 0,
705
- output: enhancedResult.usage.output || 0,
706
- total: enhancedResult.usage.total || 0,
707
- });
708
- if (cost && cost > 0) {
709
- enrichedGenerateSpan = SpanSerializer.enrichWithCost(enrichedGenerateSpan, { totalCost: cost });
710
- }
711
- }
712
- SpanSerializer.endSpan(enrichedGenerateSpan, SpanStatus.OK);
713
653
  return this.enhanceResult(enhancedResult, options, startTime);
714
654
  }
715
655
  async synthesizeAIResponseIfNeeded(enhancedResult, options) {
@@ -1000,7 +940,38 @@ export class BaseProvider {
1000
940
  ? error
1001
941
  : new DOMException("The operation was aborted", "AbortError");
1002
942
  }
1003
- return this.formatProviderError(error);
943
+ const formatted = this.formatProviderError(error);
944
+ // P3 fix: Classify error and set error.type on the active OTel span
945
+ try {
946
+ const activeSpan = trace.getSpan(context.active());
947
+ if (activeSpan) {
948
+ let errorType = "provider_error";
949
+ const errName = formatted?.constructor?.name ?? "";
950
+ if (errName === "RateLimitError") {
951
+ errorType = "rate_limit";
952
+ }
953
+ else if (errName === "AuthenticationError") {
954
+ errorType = "auth_failure";
955
+ }
956
+ else if (errName === "NetworkError") {
957
+ errorType = "network";
958
+ }
959
+ else if (errName === "InvalidModelError") {
960
+ errorType = "invalid_model";
961
+ }
962
+ else if (errName === "TimeoutError") {
963
+ errorType = "timeout";
964
+ }
965
+ activeSpan.setAttribute("error.type", errorType);
966
+ if (formatted instanceof Error) {
967
+ activeSpan.setAttribute("error.message", formatted.message.substring(0, 500));
968
+ }
969
+ }
970
+ }
971
+ catch {
972
+ // Non-blocking — telemetry failures shouldn't mask the original error
973
+ }
974
+ return formatted;
1004
975
  }
1005
976
  /**
1006
977
  * Image generation method. Providers that support it should override this.
@@ -1,11 +1,6 @@
1
1
  import type { InfraRegistryEntry } from "../../types/index.js";
2
- /**
3
- * Local alias: the canonical type was renamed to InfraRegistryEntry to avoid
4
- * collision with other RegistryEntry types in the codebase.
5
- */
6
- type RegistryEntry<TItem, TMetadata = unknown> = InfraRegistryEntry<TItem, TMetadata>;
7
2
  export declare abstract class BaseRegistry<TItem, TMetadata = unknown> {
8
- protected items: Map<string, RegistryEntry<TItem, TMetadata>>;
3
+ protected items: Map<string, InfraRegistryEntry<TItem, TMetadata>>;
9
4
  protected initialized: boolean;
10
5
  protected initPromise: Promise<void> | null;
11
6
  protected abstract registerAll(): Promise<void>;
@@ -22,4 +17,3 @@ export declare abstract class BaseRegistry<TItem, TMetadata = unknown> {
22
17
  clear(): void;
23
18
  isInitialized(): boolean;
24
19
  }
25
- export {};
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import type { LanguageModel, ModelMessage, Tool } from "ai";
16
16
  import { generateText } from "ai";
17
- import type { AIProviderName, EnhancedGenerateResult, StandardRecord, TextGenerationOptions } from "../../types/index.js";
17
+ import type { AIProviderName, EnhancedGenerateResult, NeuroLinkEvents, StandardRecord, TextGenerationOptions, TypedEventEmitter } from "../../types/index.js";
18
18
  /**
19
19
  * GenerationHandler class - Handles text generation operations for AI providers
20
20
  */
@@ -24,11 +24,12 @@ export declare class GenerationHandler {
24
24
  private readonly supportsToolsFn;
25
25
  private readonly getTelemetryConfigFn;
26
26
  private readonly handleToolStorageFn;
27
+ private readonly getEmitterFn?;
27
28
  constructor(providerName: AIProviderName, modelName: string, supportsToolsFn: () => boolean, getTelemetryConfigFn: (options: TextGenerationOptions, type: string) => {
28
29
  isEnabled: boolean;
29
30
  functionId?: string;
30
31
  metadata?: Record<string, string | number | boolean>;
31
- } | undefined, handleToolStorageFn: (toolCalls: unknown[], toolResults: unknown[], options: TextGenerationOptions, timestamp: Date) => Promise<void>);
32
+ } | undefined, handleToolStorageFn: (toolCalls: unknown[], toolResults: unknown[], options: TextGenerationOptions, timestamp: Date) => Promise<void>, getEmitterFn?: (() => TypedEventEmitter<NeuroLinkEvents> | undefined) | undefined);
32
33
  /**
33
34
  * Helper method to call generateText with optional structured output
34
35
  * @private
@@ -17,6 +17,7 @@ import { generateText, NoObjectGeneratedError, Output, stepCountIs } from "ai";
17
17
  import { getModelId } from "../../providers/providerTypeUtils.js";
18
18
  import { tracers } from "../../telemetry/tracers.js";
19
19
  import { logger } from "../../utils/logger.js";
20
+ import { emitToolEndFromStepFinish } from "../../utils/toolEndEmitter.js";
20
21
  import { calculateCost } from "../../utils/pricing.js";
21
22
  import { withProviderRetry } from "../../utils/providerRetry.js";
22
23
  import { calculateCacheSavingsPercent, extractCacheCreationTokens, extractCacheReadTokens, extractTokenUsage, } from "../../utils/tokenUtils.js";
@@ -47,12 +48,14 @@ export class GenerationHandler {
47
48
  supportsToolsFn;
48
49
  getTelemetryConfigFn;
49
50
  handleToolStorageFn;
50
- constructor(providerName, modelName, supportsToolsFn, getTelemetryConfigFn, handleToolStorageFn) {
51
+ getEmitterFn;
52
+ constructor(providerName, modelName, supportsToolsFn, getTelemetryConfigFn, handleToolStorageFn, getEmitterFn) {
51
53
  this.providerName = providerName;
52
54
  this.modelName = modelName;
53
55
  this.supportsToolsFn = supportsToolsFn;
54
56
  this.getTelemetryConfigFn = getTelemetryConfigFn;
55
57
  this.handleToolStorageFn = handleToolStorageFn;
58
+ this.getEmitterFn = getEmitterFn;
56
59
  }
57
60
  /**
58
61
  * Helper method to call generateText with optional structured output
@@ -154,6 +157,11 @@ export class GenerationHandler {
154
157
  experimental_telemetry: this.getTelemetryConfigFn(options, "generate"),
155
158
  onStepFinish: ({ toolCalls, toolResults }) => {
156
159
  logger.info("Tool execution completed", { toolResults, toolCalls });
160
+ // Emit tool:end events for Pipeline B (metrics aggregator).
161
+ // This surfaces AI-SDK-driven tool completions as telemetry events
162
+ // so that tool spans are created even when the SDK runs tools
163
+ // internally (gaps G5 / S2).
164
+ emitToolEndFromStepFinish(this.getEmitterFn?.(), toolResults);
157
165
  // Handle tool execution storage
158
166
  this.handleToolStorageFn(toolCalls, toolResults, options, new Date()).catch((error) => {
159
167
  logger.warn("[GenerationHandler] Failed to store tool executions", {
@@ -113,6 +113,15 @@ export class StreamHandler {
113
113
  // rather than crashing the process with an unhandled rejection.
114
114
  if (NoOutputGeneratedError.isInstance(error)) {
115
115
  logger.warn(`${providerName}: Stream produced no output (NoOutputGeneratedError), returning empty stream`);
116
+ // S4 fix: yield a sentinel chunk so Pipeline B can detect the empty stream
117
+ // and set the span to WARNING status instead of OK
118
+ yield {
119
+ content: "",
120
+ metadata: {
121
+ noOutput: true,
122
+ errorType: "NoOutputGeneratedError",
123
+ },
124
+ };
116
125
  }
117
126
  else {
118
127
  throw error;
@@ -442,7 +442,15 @@ export class ToolsManager {
442
442
  }
443
443
  }
444
444
  customToolSpan.setAttribute("tool.result.status", errorResult ? "error" : "success");
445
- customToolSpan.setStatus({ code: SpanStatusCode.OK });
445
+ if (errorResult) {
446
+ customToolSpan.setStatus({
447
+ code: SpanStatusCode.ERROR,
448
+ message: `Tool ${toolName} returned isError: true`,
449
+ });
450
+ }
451
+ else {
452
+ customToolSpan.setStatus({ code: SpanStatusCode.OK });
453
+ }
446
454
  return convertedResult;
447
455
  }
448
456
  // Fallback: direct execution (standalone usage without NeuroLink SDK)
@@ -472,7 +480,15 @@ export class ToolsManager {
472
480
  }
473
481
  customToolSpan.setAttribute("tool.duration_ms", endTime - startTime);
474
482
  customToolSpan.setAttribute("tool.result.status", errorResult ? "error" : "success");
475
- customToolSpan.setStatus({ code: SpanStatusCode.OK });
483
+ if (errorResult) {
484
+ customToolSpan.setStatus({
485
+ code: SpanStatusCode.ERROR,
486
+ message: `Tool ${toolName} returned isError: true`,
487
+ });
488
+ }
489
+ else {
490
+ customToolSpan.setStatus({ code: SpanStatusCode.OK });
491
+ }
476
492
  return convertedResult;
477
493
  }
478
494
  catch (error) {