@juspay/neurolink 9.24.0 → 9.25.1

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 (219) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/adapters/tts/googleTTSHandler.js +26 -1
  3. package/dist/adapters/video/vertexVideoHandler.js +23 -17
  4. package/dist/cli/commands/config.d.ts +3 -3
  5. package/dist/cli/commands/observability.d.ts +53 -0
  6. package/dist/cli/commands/observability.js +453 -0
  7. package/dist/cli/commands/telemetry.d.ts +63 -0
  8. package/dist/cli/commands/telemetry.js +689 -0
  9. package/dist/cli/factories/commandFactory.js +29 -15
  10. package/dist/cli/parser.js +6 -9
  11. package/dist/cli/utils/formatters.d.ts +13 -0
  12. package/dist/cli/utils/formatters.js +23 -0
  13. package/dist/constants/contextWindows.js +6 -0
  14. package/dist/constants/enums.d.ts +6 -0
  15. package/dist/constants/enums.js +8 -2
  16. package/dist/context/budgetChecker.js +75 -48
  17. package/dist/context/contextCompactor.js +135 -127
  18. package/dist/core/baseProvider.d.ts +5 -0
  19. package/dist/core/baseProvider.js +117 -110
  20. package/dist/core/conversationMemoryInitializer.js +7 -4
  21. package/dist/core/conversationMemoryManager.d.ts +2 -0
  22. package/dist/core/conversationMemoryManager.js +6 -2
  23. package/dist/core/modules/GenerationHandler.d.ts +2 -2
  24. package/dist/core/modules/GenerationHandler.js +12 -12
  25. package/dist/evaluation/ragasEvaluator.js +39 -19
  26. package/dist/evaluation/scoring.js +46 -20
  27. package/dist/features/ppt/presentationOrchestrator.js +23 -0
  28. package/dist/features/ppt/slideGenerator.js +13 -0
  29. package/dist/features/ppt/slideRenderers.d.ts +1 -1
  30. package/dist/features/ppt/slideRenderers.js +6 -4
  31. package/dist/features/ppt/slideTypeInference.d.ts +1 -1
  32. package/dist/features/ppt/slideTypeInference.js +75 -73
  33. package/dist/files/fileTools.d.ts +6 -6
  34. package/dist/index.d.ts +46 -12
  35. package/dist/index.js +79 -17
  36. package/dist/lib/adapters/tts/googleTTSHandler.js +26 -1
  37. package/dist/lib/adapters/video/vertexVideoHandler.js +23 -17
  38. package/dist/lib/constants/contextWindows.js +6 -0
  39. package/dist/lib/constants/enums.d.ts +6 -0
  40. package/dist/lib/constants/enums.js +8 -2
  41. package/dist/lib/context/budgetChecker.js +75 -48
  42. package/dist/lib/context/contextCompactor.js +135 -127
  43. package/dist/lib/core/baseProvider.d.ts +5 -0
  44. package/dist/lib/core/baseProvider.js +117 -110
  45. package/dist/lib/core/conversationMemoryInitializer.js +7 -4
  46. package/dist/lib/core/conversationMemoryManager.d.ts +2 -0
  47. package/dist/lib/core/conversationMemoryManager.js +6 -2
  48. package/dist/lib/core/modules/GenerationHandler.d.ts +2 -2
  49. package/dist/lib/core/modules/GenerationHandler.js +12 -12
  50. package/dist/lib/evaluation/ragasEvaluator.js +39 -19
  51. package/dist/lib/evaluation/scoring.js +46 -20
  52. package/dist/lib/features/ppt/presentationOrchestrator.js +23 -0
  53. package/dist/lib/features/ppt/slideGenerator.js +13 -0
  54. package/dist/lib/features/ppt/slideRenderers.d.ts +1 -1
  55. package/dist/lib/features/ppt/slideRenderers.js +6 -4
  56. package/dist/lib/features/ppt/slideTypeInference.d.ts +1 -1
  57. package/dist/lib/features/ppt/slideTypeInference.js +75 -73
  58. package/dist/lib/files/fileTools.d.ts +6 -6
  59. package/dist/lib/index.d.ts +46 -12
  60. package/dist/lib/index.js +79 -17
  61. package/dist/lib/mcp/httpRateLimiter.js +39 -12
  62. package/dist/lib/mcp/httpRetryHandler.js +22 -1
  63. package/dist/lib/mcp/mcpClientFactory.js +13 -15
  64. package/dist/lib/memory/memoryRetrievalTools.js +22 -0
  65. package/dist/lib/neurolink.d.ts +64 -72
  66. package/dist/lib/neurolink.js +1007 -564
  67. package/dist/lib/observability/exporterRegistry.d.ts +152 -0
  68. package/dist/lib/observability/exporterRegistry.js +414 -0
  69. package/dist/lib/observability/exporters/arizeExporter.d.ts +32 -0
  70. package/dist/lib/observability/exporters/arizeExporter.js +139 -0
  71. package/dist/lib/observability/exporters/baseExporter.d.ts +117 -0
  72. package/dist/lib/observability/exporters/baseExporter.js +191 -0
  73. package/dist/lib/observability/exporters/braintrustExporter.d.ts +30 -0
  74. package/dist/lib/observability/exporters/braintrustExporter.js +155 -0
  75. package/dist/lib/observability/exporters/datadogExporter.d.ts +37 -0
  76. package/dist/lib/observability/exporters/datadogExporter.js +197 -0
  77. package/dist/lib/observability/exporters/index.d.ts +13 -0
  78. package/dist/lib/observability/exporters/index.js +14 -0
  79. package/dist/lib/observability/exporters/laminarExporter.d.ts +48 -0
  80. package/dist/lib/observability/exporters/laminarExporter.js +303 -0
  81. package/dist/lib/observability/exporters/langfuseExporter.d.ts +47 -0
  82. package/dist/lib/observability/exporters/langfuseExporter.js +204 -0
  83. package/dist/lib/observability/exporters/langsmithExporter.d.ts +26 -0
  84. package/dist/lib/observability/exporters/langsmithExporter.js +124 -0
  85. package/dist/lib/observability/exporters/otelExporter.d.ts +39 -0
  86. package/dist/lib/observability/exporters/otelExporter.js +165 -0
  87. package/dist/lib/observability/exporters/posthogExporter.d.ts +48 -0
  88. package/dist/lib/observability/exporters/posthogExporter.js +288 -0
  89. package/dist/lib/observability/exporters/sentryExporter.d.ts +32 -0
  90. package/dist/lib/observability/exporters/sentryExporter.js +166 -0
  91. package/dist/lib/observability/index.d.ts +25 -0
  92. package/dist/lib/observability/index.js +32 -0
  93. package/dist/lib/observability/metricsAggregator.d.ts +260 -0
  94. package/dist/lib/observability/metricsAggregator.js +557 -0
  95. package/dist/lib/observability/otelBridge.d.ts +49 -0
  96. package/dist/lib/observability/otelBridge.js +132 -0
  97. package/dist/lib/observability/retryPolicy.d.ts +192 -0
  98. package/dist/lib/observability/retryPolicy.js +384 -0
  99. package/dist/lib/observability/sampling/index.d.ts +4 -0
  100. package/dist/lib/observability/sampling/index.js +5 -0
  101. package/dist/lib/observability/sampling/samplers.d.ts +116 -0
  102. package/dist/lib/observability/sampling/samplers.js +217 -0
  103. package/dist/lib/observability/spanProcessor.d.ts +129 -0
  104. package/dist/lib/observability/spanProcessor.js +304 -0
  105. package/dist/lib/observability/tokenTracker.d.ts +156 -0
  106. package/dist/lib/observability/tokenTracker.js +414 -0
  107. package/dist/lib/observability/types/exporterTypes.d.ts +250 -0
  108. package/dist/lib/observability/types/exporterTypes.js +6 -0
  109. package/dist/lib/observability/types/index.d.ts +6 -0
  110. package/dist/lib/observability/types/index.js +5 -0
  111. package/dist/lib/observability/types/spanTypes.d.ts +244 -0
  112. package/dist/lib/observability/types/spanTypes.js +93 -0
  113. package/dist/lib/observability/utils/index.d.ts +4 -0
  114. package/dist/lib/observability/utils/index.js +5 -0
  115. package/dist/lib/observability/utils/safeMetadata.d.ts +10 -0
  116. package/dist/lib/observability/utils/safeMetadata.js +26 -0
  117. package/dist/lib/observability/utils/spanSerializer.d.ts +115 -0
  118. package/dist/lib/observability/utils/spanSerializer.js +291 -0
  119. package/dist/lib/providers/amazonSagemaker.d.ts +5 -4
  120. package/dist/lib/providers/amazonSagemaker.js +3 -4
  121. package/dist/lib/providers/googleVertex.d.ts +7 -0
  122. package/dist/lib/providers/googleVertex.js +76 -2
  123. package/dist/lib/rag/pipeline/RAGPipeline.d.ts +0 -5
  124. package/dist/lib/rag/pipeline/RAGPipeline.js +122 -87
  125. package/dist/lib/rag/ragIntegration.js +30 -0
  126. package/dist/lib/rag/retrieval/hybridSearch.js +22 -0
  127. package/dist/lib/server/abstract/baseServerAdapter.js +51 -19
  128. package/dist/lib/server/middleware/common.js +44 -12
  129. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +2 -2
  130. package/dist/lib/services/server/ai/observability/instrumentation.js +10 -5
  131. package/dist/lib/types/conversationMemoryInterface.d.ts +2 -0
  132. package/dist/lib/types/modelTypes.d.ts +18 -18
  133. package/dist/lib/types/providers.d.ts +5 -0
  134. package/dist/lib/utils/pricing.js +25 -1
  135. package/dist/lib/utils/ttsProcessor.js +74 -59
  136. package/dist/lib/workflow/config.d.ts +36 -36
  137. package/dist/lib/workflow/core/ensembleExecutor.js +10 -0
  138. package/dist/lib/workflow/core/judgeScorer.js +20 -2
  139. package/dist/lib/workflow/core/workflowRunner.js +34 -1
  140. package/dist/mcp/httpRateLimiter.js +39 -12
  141. package/dist/mcp/httpRetryHandler.js +22 -1
  142. package/dist/mcp/mcpClientFactory.js +13 -15
  143. package/dist/memory/memoryRetrievalTools.js +22 -0
  144. package/dist/neurolink.d.ts +64 -72
  145. package/dist/neurolink.js +1007 -564
  146. package/dist/observability/FEATURE-STATUS.md +269 -0
  147. package/dist/observability/exporterRegistry.d.ts +152 -0
  148. package/dist/observability/exporterRegistry.js +413 -0
  149. package/dist/observability/exporters/arizeExporter.d.ts +32 -0
  150. package/dist/observability/exporters/arizeExporter.js +138 -0
  151. package/dist/observability/exporters/baseExporter.d.ts +117 -0
  152. package/dist/observability/exporters/baseExporter.js +190 -0
  153. package/dist/observability/exporters/braintrustExporter.d.ts +30 -0
  154. package/dist/observability/exporters/braintrustExporter.js +154 -0
  155. package/dist/observability/exporters/datadogExporter.d.ts +37 -0
  156. package/dist/observability/exporters/datadogExporter.js +196 -0
  157. package/dist/observability/exporters/index.d.ts +13 -0
  158. package/dist/observability/exporters/index.js +13 -0
  159. package/dist/observability/exporters/laminarExporter.d.ts +48 -0
  160. package/dist/observability/exporters/laminarExporter.js +302 -0
  161. package/dist/observability/exporters/langfuseExporter.d.ts +47 -0
  162. package/dist/observability/exporters/langfuseExporter.js +203 -0
  163. package/dist/observability/exporters/langsmithExporter.d.ts +26 -0
  164. package/dist/observability/exporters/langsmithExporter.js +123 -0
  165. package/dist/observability/exporters/otelExporter.d.ts +39 -0
  166. package/dist/observability/exporters/otelExporter.js +164 -0
  167. package/dist/observability/exporters/posthogExporter.d.ts +48 -0
  168. package/dist/observability/exporters/posthogExporter.js +287 -0
  169. package/dist/observability/exporters/sentryExporter.d.ts +32 -0
  170. package/dist/observability/exporters/sentryExporter.js +165 -0
  171. package/dist/observability/index.d.ts +25 -0
  172. package/dist/observability/index.js +31 -0
  173. package/dist/observability/metricsAggregator.d.ts +260 -0
  174. package/dist/observability/metricsAggregator.js +556 -0
  175. package/dist/observability/otelBridge.d.ts +49 -0
  176. package/dist/observability/otelBridge.js +131 -0
  177. package/dist/observability/retryPolicy.d.ts +192 -0
  178. package/dist/observability/retryPolicy.js +383 -0
  179. package/dist/observability/sampling/index.d.ts +4 -0
  180. package/dist/observability/sampling/index.js +4 -0
  181. package/dist/observability/sampling/samplers.d.ts +116 -0
  182. package/dist/observability/sampling/samplers.js +216 -0
  183. package/dist/observability/spanProcessor.d.ts +129 -0
  184. package/dist/observability/spanProcessor.js +303 -0
  185. package/dist/observability/tokenTracker.d.ts +156 -0
  186. package/dist/observability/tokenTracker.js +413 -0
  187. package/dist/observability/types/exporterTypes.d.ts +250 -0
  188. package/dist/observability/types/exporterTypes.js +5 -0
  189. package/dist/observability/types/index.d.ts +6 -0
  190. package/dist/observability/types/index.js +4 -0
  191. package/dist/observability/types/spanTypes.d.ts +244 -0
  192. package/dist/observability/types/spanTypes.js +92 -0
  193. package/dist/observability/utils/index.d.ts +4 -0
  194. package/dist/observability/utils/index.js +4 -0
  195. package/dist/observability/utils/safeMetadata.d.ts +10 -0
  196. package/dist/observability/utils/safeMetadata.js +25 -0
  197. package/dist/observability/utils/spanSerializer.d.ts +115 -0
  198. package/dist/observability/utils/spanSerializer.js +290 -0
  199. package/dist/providers/amazonSagemaker.d.ts +5 -4
  200. package/dist/providers/amazonSagemaker.js +3 -4
  201. package/dist/providers/googleVertex.d.ts +7 -0
  202. package/dist/providers/googleVertex.js +76 -2
  203. package/dist/rag/pipeline/RAGPipeline.d.ts +0 -5
  204. package/dist/rag/pipeline/RAGPipeline.js +122 -87
  205. package/dist/rag/ragIntegration.js +30 -0
  206. package/dist/rag/retrieval/hybridSearch.js +22 -0
  207. package/dist/server/abstract/baseServerAdapter.js +51 -19
  208. package/dist/server/middleware/common.js +44 -12
  209. package/dist/services/server/ai/observability/instrumentation.d.ts +2 -2
  210. package/dist/services/server/ai/observability/instrumentation.js +10 -5
  211. package/dist/types/conversationMemoryInterface.d.ts +2 -0
  212. package/dist/types/providers.d.ts +5 -0
  213. package/dist/utils/pricing.js +25 -1
  214. package/dist/utils/ttsProcessor.js +74 -59
  215. package/dist/workflow/config.d.ts +52 -52
  216. package/dist/workflow/core/ensembleExecutor.js +10 -0
  217. package/dist/workflow/core/judgeScorer.js +20 -2
  218. package/dist/workflow/core/workflowRunner.js +34 -1
  219. package/package.json +1 -1
@@ -337,11 +337,11 @@ export declare function createFileTools(registry: FileReferenceRegistry): {
337
337
  format: z.ZodOptional<z.ZodEnum<["text", "detailed", "summary"]>>;
338
338
  }, "strip", z.ZodTypeAny, {
339
339
  file_id: string;
340
+ end_time?: number | undefined;
341
+ start_time?: number | undefined;
340
342
  format?: "text" | "summary" | "detailed" | undefined;
341
343
  sheet?: string | undefined;
342
344
  columns?: string[] | undefined;
343
- start_time?: number | undefined;
344
- end_time?: number | undefined;
345
345
  frame_count?: number | undefined;
346
346
  pages?: number[] | undefined;
347
347
  page_range?: {
@@ -355,11 +355,11 @@ export declare function createFileTools(registry: FileReferenceRegistry): {
355
355
  entry_path?: string | undefined;
356
356
  }, {
357
357
  file_id: string;
358
+ end_time?: number | undefined;
359
+ start_time?: number | undefined;
358
360
  format?: "text" | "summary" | "detailed" | undefined;
359
361
  sheet?: string | undefined;
360
362
  columns?: string[] | undefined;
361
- start_time?: number | undefined;
362
- end_time?: number | undefined;
363
363
  frame_count?: number | undefined;
364
364
  pages?: number[] | undefined;
365
365
  page_range?: {
@@ -388,11 +388,11 @@ export declare function createFileTools(registry: FileReferenceRegistry): {
388
388
  }> & {
389
389
  execute: (args: {
390
390
  file_id: string;
391
+ end_time?: number | undefined;
392
+ start_time?: number | undefined;
391
393
  format?: "text" | "summary" | "detailed" | undefined;
392
394
  sheet?: string | undefined;
393
395
  columns?: string[] | undefined;
394
- start_time?: number | undefined;
395
- end_time?: number | undefined;
396
396
  frame_count?: number | undefined;
397
397
  pages?: number[] | undefined;
398
398
  page_range?: {
@@ -33,17 +33,17 @@
33
33
  */
34
34
  import { AIProviderFactory } from "./core/factory.js";
35
35
  export { AIProviderFactory };
36
+ export { GoogleTTSHandler } from "./adapters/tts/googleTTSHandler.js";
36
37
  export { NeuroLinkConfigManager as ConfigManager } from "./config/configManager.js";
37
38
  export { AIProviderName, BedrockModels, OpenAIModels, VertexModels, } from "./constants/enums.js";
38
39
  export { dynamicModelProvider } from "./core/dynamicModels.js";
39
40
  export { validateTool } from "./sdk/toolRegistration.js";
40
41
  export * from "./types/index.js";
41
42
  export type { DynamicModelConfig, ModelRegistry } from "./types/modelTypes.js";
42
- export { getAvailableProviders, getBestProvider, isValidProvider, } from "./utils/providerUtils.js";
43
- export { calculateCost, hasPricing } from "./utils/pricing.js";
44
43
  export { isAbortError } from "./utils/errorHandling.js";
44
+ export { calculateCost, hasPricing } from "./utils/pricing.js";
45
+ export { getAvailableProviders, getBestProvider, isValidProvider, } from "./utils/providerUtils.js";
45
46
  export { TTSProcessor } from "./utils/ttsProcessor.js";
46
- export { GoogleTTSHandler } from "./adapters/tts/googleTTSHandler.js";
47
47
  import { NeuroLink } from "./neurolink.js";
48
48
  export { NeuroLink };
49
49
  export type { MCPServerInfo } from "./types/mcpTypes.js";
@@ -54,6 +54,15 @@ export type { LangfuseContext } from "./services/server/ai/observability/instrum
54
54
  export { initializeOpenTelemetry, shutdownOpenTelemetry, flushOpenTelemetry, getLangfuseHealthStatus, setLangfuseContext, getLangfuseSpanProcessor, getTracerProvider, isOpenTelemetryInitialized, getSpanProcessors, createContextEnricher, isUsingExternalTracerProvider, getLangfuseContext, getTracer, runWithCurrentLangfuseContext, };
55
55
  export { clearAnalyticsMetrics, createAnalyticsMiddleware, getAnalyticsMetrics, } from "./middleware/builtin/analytics.js";
56
56
  export { MiddlewareFactory } from "./middleware/factory.js";
57
+ export { ExporterRegistry } from "./observability/exporterRegistry.js";
58
+ export { NoOpExporter } from "./observability/exporters/baseExporter.js";
59
+ export type { LatencyStats, MetricsSummary, ModelCostStats, ProviderCostStats, TraceView, } from "./observability/metricsAggregator.js";
60
+ export { getMetricsAggregator, MetricsAggregator, resetMetricsAggregator, } from "./observability/metricsAggregator.js";
61
+ export { AlwaysSampler, NeverSampler, } from "./observability/sampling/samplers.js";
62
+ export { TokenTracker } from "./observability/tokenTracker.js";
63
+ export type { SpanAttributes, SpanData, SpanEvent, } from "./observability/types/spanTypes.js";
64
+ export { GENAI_ATTRIBUTES, SpanStatus, SpanType, } from "./observability/types/spanTypes.js";
65
+ export { SpanSerializer } from "./observability/utils/spanSerializer.js";
57
66
  export type { MiddlewareConfig, MiddlewareContext, MiddlewareFactoryOptions, MiddlewarePreset, NeuroLinkMiddleware, } from "./types/middlewareTypes.js";
58
67
  export declare const VERSION = "1.0.0";
59
68
  /**
@@ -274,17 +283,17 @@ export declare function generateText(options: import("./types/index.js").TextGen
274
283
  * console.log('Total time:', result.workflow?.metrics?.totalTime);
275
284
  * ```
276
285
  */
277
- export type { WorkflowConfig, WorkflowResult, ModelConfig, JudgeConfig, ModelGroup, EnsembleResponse, JudgeScores, MultiJudgeScores, WorkflowType, ExecutionStrategy, WorkflowValidationResult, } from "./workflow/types.js";
278
- export { runWorkflow } from "./workflow/core/workflowRunner.js";
286
+ export { clearRegistry as clearWorkflowRegistry, getWorkflow, listWorkflows, registerWorkflow, } from "./workflow/core/workflowRegistry.js";
279
287
  export type { RunWorkflowOptions } from "./workflow/core/workflowRunner.js";
280
- export { registerWorkflow, getWorkflow, listWorkflows, clearRegistry as clearWorkflowRegistry, } from "./workflow/core/workflowRegistry.js";
281
- export { CONSENSUS_3_WORKFLOW, CONSENSUS_3_FAST_WORKFLOW, createConsensus3WithPrompt, } from "./workflow/workflows/consensusWorkflow.js";
282
- export { FAST_FALLBACK_WORKFLOW, AGGRESSIVE_FALLBACK_WORKFLOW, } from "./workflow/workflows/fallbackWorkflow.js";
283
- export { MULTI_JUDGE_5_WORKFLOW, MULTI_JUDGE_3_WORKFLOW, createMultiJudgeWorkflow, } from "./workflow/workflows/multiJudgeWorkflow.js";
284
- export { QUALITY_MAX_WORKFLOW, SPEED_FIRST_WORKFLOW, BALANCED_ADAPTIVE_WORKFLOW, createAdaptiveWorkflow, } from "./workflow/workflows/adaptiveWorkflow.js";
285
- export { validateWorkflow } from "./workflow/utils/workflowValidation.js";
288
+ export { runWorkflow } from "./workflow/core/workflowRunner.js";
289
+ export { DEFAULT_SCORE_SCALE, WORKFLOW_ENGINE_VERSION, } from "./workflow/index.js";
290
+ export type { EnsembleResponse, ExecutionStrategy, JudgeConfig, JudgeScores, ModelConfig, ModelGroup, MultiJudgeScores, WorkflowConfig, WorkflowResult, WorkflowType, WorkflowValidationResult, } from "./workflow/types.js";
286
291
  export { calculateModelMetrics, compareWorkflows, generateSummaryStats, } from "./workflow/utils/workflowMetrics.js";
287
- export { WORKFLOW_ENGINE_VERSION, DEFAULT_SCORE_SCALE, } from "./workflow/index.js";
292
+ export { validateWorkflow } from "./workflow/utils/workflowValidation.js";
293
+ export { BALANCED_ADAPTIVE_WORKFLOW, createAdaptiveWorkflow, QUALITY_MAX_WORKFLOW, SPEED_FIRST_WORKFLOW, } from "./workflow/workflows/adaptiveWorkflow.js";
294
+ export { CONSENSUS_3_FAST_WORKFLOW, CONSENSUS_3_WORKFLOW, createConsensus3WithPrompt, } from "./workflow/workflows/consensusWorkflow.js";
295
+ export { AGGRESSIVE_FALLBACK_WORKFLOW, FAST_FALLBACK_WORKFLOW, } from "./workflow/workflows/fallbackWorkflow.js";
296
+ export { createMultiJudgeWorkflow, MULTI_JUDGE_3_WORKFLOW, MULTI_JUDGE_5_WORKFLOW, } from "./workflow/workflows/multiJudgeWorkflow.js";
288
297
  export type { AgentExecuteRequest, AgentExecuteResponse, AuthConfig, AuthenticatedUser, AuthResult, AuthStrategy, BodyParserConfig, CacheConfig, CacheEntry, CacheStore, CORSConfig, CreateRoutesOptions, DataEvent, DataStreamEvent, DataStreamEventType, DataStreamResponseConfig, DataStreamWriter, DataStreamWriterConfig, ErrorCategoryType, ErrorEvent, ErrorResponse, ErrorSeverityType, FinishEvent, HealthResponse, HttpMethod, LoggingConfig, MCPServerStatusResponse, MiddlewareDefinition, MiddlewareHandler, OpenAPIGeneratorConfig, OpenAPISpec, PropertySchema, RateLimitConfig as ServerRateLimitConfig, RateLimitMiddlewareConfig, RateLimitStore, ReadyResponse, RequiredServerAdapterConfig, RouteDefinition, RouteGroup, RouteHandler, ServerAdapterConfig, ServerAdapterErrorCodeType, ServerAdapterErrorContext, ServerAdapterEvents, ServerAdapterFactoryOptions, ServerContext, ServerFramework, ServerResponse, ServerStatus, SSEWriteOptions, StreamingConfig, TextDeltaEvent, TextEndEvent, TextStartEvent, ToolCallEvent, ToolExecuteRequest, ToolExecuteResponse, ToolResultEvent, ValidationConfig, ValidationResult, ValidationSchema, WebSocketAuthConfig, WebSocketConfig, WebSocketConnection, WebSocketHandler, WebSocketMessage, WebSocketMessageType, } from "./server/index.js";
289
298
  /**
290
299
  * Server Adapters for exposing NeuroLink as HTTP APIs
@@ -336,3 +345,28 @@ export type { BaseChunkerConfig, BM25Result, CharacterChunkerConfig, Chunk, Chun
336
345
  * ```
337
346
  */
338
347
  export { assembleContext, batchRerank, CharacterChunker, ChunkerRegistry, CohereRelevanceScorer, CrossEncoderReranker, CSVLoader, chunkText, createChunker, createContextWindow, createHybridSearch, createRAGPipeline, createVectorQueryTool, executeWithCircuitBreaker, extractMetadata, formatContextWithCitations, GraphRAG, getAvailableStrategies, getCircuitBreaker, getDefaultChunkerConfig, getRecommendedStrategy, HTMLChunker, HTMLLoader, InMemoryBM25Index, InMemoryVectorStore, JSONChunker as RAGJSONChunker, JSONLoader, LaTeXChunker, LLMMetadataExtractor, linearCombination, loadDocument, loadDocuments, MarkdownChunker, MarkdownLoader, MDocument, PDFLoader, prepareRAGTool, processDocument, RAGCircuitBreaker, type RAGCircuitBreakerConfig, type RAGCircuitBreakerEvents, RAGCircuitBreakerManager, type RAGCircuitBreakerStats, RAGPipeline, RAGRetryHandler, RecursiveChunker, ragCircuitBreakerManager, reciprocalRankFusion, rerank, SemanticChunker, SentenceChunker, simpleRerank, summarizeContext, TextLoader, TokenChunker, WebLoader, } from "./rag/index.js";
348
+ export { ContextBuilder } from "./evaluation/contextBuilder.js";
349
+ /**
350
+ * Evaluation system for AI response quality assessment.
351
+ *
352
+ * Uses RAGAS-style model-based evaluation with a "judge" LLM to score
353
+ * responses on relevance, accuracy, completeness, and overall quality.
354
+ * Supports retry logic with progressive prompt improvement.
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * import { Evaluator, RAGASEvaluator, ContextBuilder, RetryManager } from '@juspay/neurolink';
359
+ *
360
+ * const evaluator = new Evaluator({
361
+ * evaluationModel: 'gemini-1.5-flash',
362
+ * provider: 'vertex',
363
+ * threshold: 7,
364
+ * });
365
+ * ```
366
+ */
367
+ export { Evaluator } from "./evaluation/index.js";
368
+ export { PromptBuilder } from "./evaluation/prompts.js";
369
+ export { RAGASEvaluator } from "./evaluation/ragasEvaluator.js";
370
+ export { RetryManager } from "./evaluation/retryManager.js";
371
+ export { mapToEvaluationData } from "./evaluation/scoring.js";
372
+ export type { EnhancedConversationTurn, EnhancedEvaluationContext, EvaluationConfig, EvaluationResult, GetPromptFunction, QualityErrorDetails, QueryIntentAnalysis, } from "./types/evaluationTypes.js";
package/dist/lib/index.js CHANGED
@@ -34,6 +34,7 @@
34
34
  // Core exports
35
35
  import { AIProviderFactory } from "./core/factory.js";
36
36
  export { AIProviderFactory };
37
+ export { GoogleTTSHandler } from "./adapters/tts/googleTTSHandler.js";
37
38
  // Config Manager export
38
39
  export { NeuroLinkConfigManager as ConfigManager } from "./config/configManager.js";
39
40
  export { AIProviderName, BedrockModels, OpenAIModels, VertexModels, } from "./constants/enums.js";
@@ -43,15 +44,14 @@ export { dynamicModelProvider } from "./core/dynamicModels.js";
43
44
  export { validateTool } from "./sdk/toolRegistration.js";
44
45
  // Export ALL types from the centralized type barrel
45
46
  export * from "./types/index.js";
46
- // Utility exports
47
- export { getAvailableProviders, getBestProvider, isValidProvider, } from "./utils/providerUtils.js";
48
- // Pricing utilities
49
- export { calculateCost, hasPricing } from "./utils/pricing.js";
50
47
  // Error utilities
51
48
  export { isAbortError } from "./utils/errorHandling.js";
49
+ // Pricing utilities
50
+ export { calculateCost, hasPricing } from "./utils/pricing.js";
51
+ // Utility exports
52
+ export { getAvailableProviders, getBestProvider, isValidProvider, } from "./utils/providerUtils.js";
52
53
  // TTS utilities
53
54
  export { TTSProcessor } from "./utils/ttsProcessor.js";
54
- export { GoogleTTSHandler } from "./adapters/tts/googleTTSHandler.js";
55
55
  // Main NeuroLink wrapper class and diagnostic types
56
56
  import { NeuroLink } from "./neurolink.js";
57
57
  export { NeuroLink };
@@ -72,6 +72,14 @@ runWithCurrentLangfuseContext, };
72
72
  // Analytics Middleware exports
73
73
  export { clearAnalyticsMetrics, createAnalyticsMiddleware, getAnalyticsMetrics, } from "./middleware/builtin/analytics.js";
74
74
  export { MiddlewareFactory } from "./middleware/factory.js";
75
+ export { ExporterRegistry } from "./observability/exporterRegistry.js";
76
+ export { NoOpExporter } from "./observability/exporters/baseExporter.js";
77
+ // Observability modules and types
78
+ export { getMetricsAggregator, MetricsAggregator, resetMetricsAggregator, } from "./observability/metricsAggregator.js";
79
+ export { AlwaysSampler, NeverSampler, } from "./observability/sampling/samplers.js";
80
+ export { TokenTracker } from "./observability/tokenTracker.js";
81
+ export { GENAI_ATTRIBUTES, SpanStatus, SpanType, } from "./observability/types/spanTypes.js";
82
+ export { SpanSerializer } from "./observability/utils/spanSerializer.js";
75
83
  // Version
76
84
  export const VERSION = "1.0.0";
77
85
  /**
@@ -299,23 +307,50 @@ export async function generateText(options) {
299
307
  const neurolink = new NeuroLink();
300
308
  return await neurolink.generateText(options);
301
309
  }
310
+ // ============================================================================
311
+ // WORKFLOW ENGINE - Multi-Model Orchestration with Judge Scoring
312
+ // ============================================================================
313
+ /**
314
+ * Workflow Engine for multi-model ensembles with judge-based evaluation
315
+ *
316
+ * Enables sophisticated AI orchestration patterns:
317
+ * - Ensemble execution (parallel multi-model)
318
+ * - Chain execution (sequential fallback)
319
+ * - Adaptive execution (tier-based quality/cost optimization)
320
+ * - Multi-judge voting for consensus
321
+ *
322
+ * @example
323
+ * ```typescript
324
+ * import { neurolink, CONSENSUS_3_WORKFLOW } from '@juspay/neurolink';
325
+ *
326
+ * // Use workflow via generate() with workflowConfig option
327
+ * const result = await neurolink.generate({
328
+ * input: { text: 'Explain quantum computing' },
329
+ * workflowConfig: CONSENSUS_3_WORKFLOW,
330
+ * });
331
+ *
332
+ * console.log('Best response:', result.content);
333
+ * console.log('Selected model:', result.workflow?.selectedModel);
334
+ * console.log('Total time:', result.workflow?.metrics?.totalTime);
335
+ * ```
336
+ */
337
+ // Workflow registry
338
+ export { clearRegistry as clearWorkflowRegistry, getWorkflow, listWorkflows, registerWorkflow, } from "./workflow/core/workflowRegistry.js";
302
339
  // Workflow execution
303
340
  export { runWorkflow } from "./workflow/core/workflowRunner.js";
304
- // Workflow registry
305
- export { registerWorkflow, getWorkflow, listWorkflows, clearRegistry as clearWorkflowRegistry, } from "./workflow/core/workflowRegistry.js";
341
+ // Workflow constants
342
+ export { DEFAULT_SCORE_SCALE, WORKFLOW_ENGINE_VERSION, } from "./workflow/index.js";
343
+ export { calculateModelMetrics, compareWorkflows, generateSummaryStats, } from "./workflow/utils/workflowMetrics.js";
344
+ // Validation and metrics
345
+ export { validateWorkflow } from "./workflow/utils/workflowValidation.js";
346
+ // Pre-built workflows - Adaptive
347
+ export { BALANCED_ADAPTIVE_WORKFLOW, createAdaptiveWorkflow, QUALITY_MAX_WORKFLOW, SPEED_FIRST_WORKFLOW, } from "./workflow/workflows/adaptiveWorkflow.js";
306
348
  // Pre-built workflows - Consensus
307
- export { CONSENSUS_3_WORKFLOW, CONSENSUS_3_FAST_WORKFLOW, createConsensus3WithPrompt, } from "./workflow/workflows/consensusWorkflow.js";
349
+ export { CONSENSUS_3_FAST_WORKFLOW, CONSENSUS_3_WORKFLOW, createConsensus3WithPrompt, } from "./workflow/workflows/consensusWorkflow.js";
308
350
  // Pre-built workflows - Fallback
309
- export { FAST_FALLBACK_WORKFLOW, AGGRESSIVE_FALLBACK_WORKFLOW, } from "./workflow/workflows/fallbackWorkflow.js";
351
+ export { AGGRESSIVE_FALLBACK_WORKFLOW, FAST_FALLBACK_WORKFLOW, } from "./workflow/workflows/fallbackWorkflow.js";
310
352
  // Pre-built workflows - Multi-judge
311
- export { MULTI_JUDGE_5_WORKFLOW, MULTI_JUDGE_3_WORKFLOW, createMultiJudgeWorkflow, } from "./workflow/workflows/multiJudgeWorkflow.js";
312
- // Pre-built workflows - Adaptive
313
- export { QUALITY_MAX_WORKFLOW, SPEED_FIRST_WORKFLOW, BALANCED_ADAPTIVE_WORKFLOW, createAdaptiveWorkflow, } from "./workflow/workflows/adaptiveWorkflow.js";
314
- // Validation and metrics
315
- export { validateWorkflow } from "./workflow/utils/workflowValidation.js";
316
- export { calculateModelMetrics, compareWorkflows, generateSummaryStats, } from "./workflow/utils/workflowMetrics.js";
317
- // Workflow constants
318
- export { WORKFLOW_ENGINE_VERSION, DEFAULT_SCORE_SCALE, } from "./workflow/index.js";
353
+ export { createMultiJudgeWorkflow, MULTI_JUDGE_3_WORKFLOW, MULTI_JUDGE_5_WORKFLOW, } from "./workflow/workflows/multiJudgeWorkflow.js";
319
354
  /**
320
355
  * Server Adapters for exposing NeuroLink as HTTP APIs
321
356
  *
@@ -403,4 +438,31 @@ extractMetadata, formatContextWithCitations,
403
438
  GraphRAG, getAvailableStrategies, getCircuitBreaker, getDefaultChunkerConfig, getRecommendedStrategy, HTMLChunker, HTMLLoader, InMemoryBM25Index, InMemoryVectorStore, JSONChunker as RAGJSONChunker, JSONLoader, LaTeXChunker, LLMMetadataExtractor, linearCombination, loadDocument, loadDocuments, MarkdownChunker, MarkdownLoader, MDocument, PDFLoader,
404
439
  // RAG Integration for generate/stream
405
440
  prepareRAGTool, processDocument, RAGCircuitBreaker, RAGCircuitBreakerManager, RAGPipeline, RAGRetryHandler, RecursiveChunker, ragCircuitBreakerManager, reciprocalRankFusion, rerank, SemanticChunker, SentenceChunker, simpleRerank, summarizeContext, TextLoader, TokenChunker, WebLoader, } from "./rag/index.js";
441
+ // ============================================================================
442
+ // EVALUATION / SCORING - RAGAS-style Response Quality Evaluation
443
+ // ============================================================================
444
+ export { ContextBuilder } from "./evaluation/contextBuilder.js";
445
+ /**
446
+ * Evaluation system for AI response quality assessment.
447
+ *
448
+ * Uses RAGAS-style model-based evaluation with a "judge" LLM to score
449
+ * responses on relevance, accuracy, completeness, and overall quality.
450
+ * Supports retry logic with progressive prompt improvement.
451
+ *
452
+ * @example
453
+ * ```typescript
454
+ * import { Evaluator, RAGASEvaluator, ContextBuilder, RetryManager } from '@juspay/neurolink';
455
+ *
456
+ * const evaluator = new Evaluator({
457
+ * evaluationModel: 'gemini-1.5-flash',
458
+ * provider: 'vertex',
459
+ * threshold: 7,
460
+ * });
461
+ * ```
462
+ */
463
+ export { Evaluator } from "./evaluation/index.js";
464
+ export { PromptBuilder } from "./evaluation/prompts.js";
465
+ export { RAGASEvaluator } from "./evaluation/ragasEvaluator.js";
466
+ export { RetryManager } from "./evaluation/retryManager.js";
467
+ export { mapToEvaluationData } from "./evaluation/scoring.js";
406
468
  //# sourceMappingURL=index.js.map
@@ -4,6 +4,8 @@
4
4
  * Provides fault tolerance and prevents server overload
5
5
  */
6
6
  import { mcpLogger } from "../utils/logger.js";
7
+ import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
8
+ import { getMetricsAggregator } from "../observability/index.js";
7
9
  /**
8
10
  * Default rate limit configuration
9
11
  * Provides sensible defaults for most MCP HTTP transport use cases
@@ -71,19 +73,44 @@ export class HTTPRateLimiter {
71
73
  * @throws Error if the wait queue is too long
72
74
  */
73
75
  async acquire() {
74
- // First, try to acquire without waiting
75
- if (this.tryAcquire()) {
76
- return;
77
- }
78
- // Add to wait queue
79
- return new Promise((resolve, reject) => {
80
- this.waitQueue.push({ resolve, reject });
81
- mcpLogger.debug(`[HTTPRateLimiter] Request queued, queue length: ${this.waitQueue.length}`);
82
- // Start processing the queue if not already processing
83
- if (!this.processingQueue) {
84
- this.processQueue();
85
- }
76
+ const span = SpanSerializer.createSpan(SpanType.MCP_TRANSPORT, "mcp.rateLimit", {
77
+ "mcp.transport": "http",
78
+ "mcp.operation": "rateLimit",
79
+ "mcp.rateLimit.tokensAvailable": this.tokens,
80
+ "mcp.rateLimit.maxBurst": this.config.maxBurst,
86
81
  });
82
+ const startTime = Date.now();
83
+ try {
84
+ // First, try to acquire without waiting
85
+ if (this.tryAcquire()) {
86
+ span.durationMs = Date.now() - startTime;
87
+ span.attributes["mcp.rateLimit.waited"] = false;
88
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
89
+ getMetricsAggregator().recordSpan(endedSpan);
90
+ return;
91
+ }
92
+ // Add to wait queue
93
+ await new Promise((resolve, reject) => {
94
+ this.waitQueue.push({ resolve, reject });
95
+ mcpLogger.debug(`[HTTPRateLimiter] Request queued, queue length: ${this.waitQueue.length}`);
96
+ // Start processing the queue if not already processing
97
+ if (!this.processingQueue) {
98
+ this.processQueue();
99
+ }
100
+ });
101
+ span.durationMs = Date.now() - startTime;
102
+ span.attributes["mcp.rateLimit.waited"] = true;
103
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
104
+ getMetricsAggregator().recordSpan(endedSpan);
105
+ }
106
+ catch (error) {
107
+ span.durationMs = Date.now() - startTime;
108
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
109
+ endedSpan.statusMessage =
110
+ error instanceof Error ? error.message : String(error);
111
+ getMetricsAggregator().recordSpan(endedSpan);
112
+ throw error;
113
+ }
87
114
  }
88
115
  /**
89
116
  * Process the wait queue, granting tokens as they become available
@@ -7,6 +7,8 @@
7
7
  import { isAbortError } from "../utils/errorHandling.js";
8
8
  import { calculateBackoffDelay } from "../utils/retryHandler.js";
9
9
  import { logger } from "../utils/logger.js";
10
+ import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
11
+ import { getMetricsAggregator } from "../observability/index.js";
10
12
  /**
11
13
  * Default HTTP retry configuration
12
14
  */
@@ -129,10 +131,23 @@ export async function withHTTPRetry(operation, config = {}) {
129
131
  ...DEFAULT_HTTP_RETRY_CONFIG,
130
132
  ...config,
131
133
  };
134
+ const span = SpanSerializer.createSpan(SpanType.MCP_TRANSPORT, "mcp.retry", {
135
+ "mcp.transport": "http",
136
+ "mcp.operation": "retry",
137
+ "mcp.maxAttempts": mergedConfig.maxAttempts,
138
+ });
139
+ const startTime = Date.now();
132
140
  let lastError;
141
+ let actualAttempts = 0;
133
142
  for (let attempt = 1; attempt <= mergedConfig.maxAttempts; attempt++) {
143
+ actualAttempts = attempt;
134
144
  try {
135
- return await operation();
145
+ const result = await operation();
146
+ span.durationMs = Date.now() - startTime;
147
+ span.attributes["mcp.retryAttempt"] = attempt;
148
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
149
+ getMetricsAggregator().recordSpan(endedSpan);
150
+ return result;
136
151
  }
137
152
  catch (error) {
138
153
  lastError = error;
@@ -153,6 +168,12 @@ export async function withHTTPRetry(operation, config = {}) {
153
168
  await sleep(delay);
154
169
  }
155
170
  }
171
+ span.durationMs = Date.now() - startTime;
172
+ span.attributes["mcp.retryAttempt"] = actualAttempts;
173
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
174
+ endedSpan.statusMessage =
175
+ lastError instanceof Error ? lastError.message : String(lastError);
176
+ getMetricsAggregator().recordSpan(endedSpan);
156
177
  throw lastError;
157
178
  }
158
179
  //# sourceMappingURL=httpRetryHandler.js.map
@@ -15,8 +15,8 @@ import { globalCircuitBreakerManager } from "./mcpCircuitBreaker.js";
15
15
  import { withHTTPRetry, DEFAULT_HTTP_RETRY_CONFIG, } from "./httpRetryHandler.js";
16
16
  import { globalRateLimiterManager } from "./httpRateLimiter.js";
17
17
  import { NeuroLinkOAuthProvider, InMemoryTokenStorage } from "./auth/index.js";
18
- import { tracers } from "../telemetry/tracers.js";
19
- import { SpanStatusCode } from "@opentelemetry/api";
18
+ import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
19
+ import { getMetricsAggregator } from "../observability/index.js";
20
20
  /**
21
21
  * MCPClientFactory
22
22
  * Factory class for creating MCP clients with different transports
@@ -38,12 +38,10 @@ export class MCPClientFactory {
38
38
  */
39
39
  static async createClient(config, timeout = 10000) {
40
40
  const startTime = Date.now();
41
- const span = tracers.mcp.startSpan("neurolink.mcp.client.create", {
42
- attributes: {
43
- "mcp.server_id": config.id,
44
- "mcp.transport": config.transport,
45
- "mcp.timeout_ms": timeout,
46
- },
41
+ const obsSpan = SpanSerializer.createSpan(SpanType.MCP_TRANSPORT, "mcp.connect", {
42
+ "mcp.transport": config.transport,
43
+ "mcp.operation": "connect",
44
+ "mcp.server_id": config.id,
47
45
  });
48
46
  try {
49
47
  mcpLogger.info(`[MCPClientFactory] Creating client for ${config.id}`, {
@@ -103,7 +101,9 @@ export class MCPClientFactory {
103
101
  duration: Date.now() - startTime,
104
102
  capabilities: result.capabilities,
105
103
  });
106
- span.setStatus({ code: SpanStatusCode.OK });
104
+ obsSpan.durationMs = Date.now() - startTime;
105
+ const endedObsSpan = SpanSerializer.endSpan(obsSpan, SpanStatus.OK);
106
+ getMetricsAggregator().recordSpan(endedObsSpan);
107
107
  return {
108
108
  ...result,
109
109
  success: true,
@@ -113,18 +113,16 @@ export class MCPClientFactory {
113
113
  catch (error) {
114
114
  const errorMessage = error instanceof Error ? error.message : String(error);
115
115
  mcpLogger.error(`[MCPClientFactory] Failed to create client for ${config.id}:`, error);
116
- // NLK-GAP-004 fix: Record both exception AND error status on span
117
- span.recordException(error instanceof Error ? error : new Error(errorMessage));
118
- span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
116
+ obsSpan.durationMs = Date.now() - startTime;
117
+ const endedObsSpan = SpanSerializer.endSpan(obsSpan, SpanStatus.ERROR);
118
+ endedObsSpan.statusMessage = errorMessage;
119
+ getMetricsAggregator().recordSpan(endedObsSpan);
119
120
  return {
120
121
  success: false,
121
122
  error: errorMessage,
122
123
  duration: Date.now() - startTime,
123
124
  };
124
125
  }
125
- finally {
126
- span.end();
127
- }
128
126
  }
129
127
  /**
130
128
  * Internal client creation logic
@@ -9,6 +9,8 @@
9
9
  import { tool } from "ai";
10
10
  import { z } from "zod";
11
11
  import { logger } from "../utils/logger.js";
12
+ import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
13
+ import { getMetricsAggregator } from "../observability/index.js";
12
14
  /** Maximum characters returned per retrieval request */
13
15
  const DEFAULT_RETRIEVAL_LIMIT = 50_000;
14
16
  /** Hard maximum for user/LLM-supplied limit to prevent massive tool outputs */
@@ -62,9 +64,18 @@ export function createMemoryRetrievalTools(memoryManager) {
62
64
  "Returns matching lines with line numbers."),
63
65
  }),
64
66
  execute: async (args) => {
67
+ const span = SpanSerializer.createSpan(SpanType.MEMORY, "memory.retrieve", {
68
+ "memory.operation": "retrieve",
69
+ "memory.store": "redis",
70
+ "memory.query": args.search || args.messageId || `lastN:${args.lastN ?? "all"}`,
71
+ });
72
+ const startTime = Date.now();
65
73
  try {
66
74
  const conversation = await memoryManager.getSessionRaw(args.sessionId);
67
75
  if (!conversation) {
76
+ span.durationMs = Date.now() - startTime;
77
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
78
+ getMetricsAggregator().recordSpan(endedSpan);
68
79
  return { error: "Session not found", sessionId: args.sessionId };
69
80
  }
70
81
  let messages = conversation.messages;
@@ -72,6 +83,9 @@ export function createMemoryRetrievalTools(memoryManager) {
72
83
  if (args.messageId) {
73
84
  const msg = messages.find((m) => m.id === args.messageId);
74
85
  if (!msg) {
86
+ span.durationMs = Date.now() - startTime;
87
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
88
+ getMetricsAggregator().recordSpan(endedSpan);
75
89
  return { error: "Message not found", messageId: args.messageId };
76
90
  }
77
91
  messages = [msg];
@@ -130,9 +144,17 @@ export function createMemoryRetrievalTools(memoryManager) {
130
144
  hasMore: end < content.length,
131
145
  };
132
146
  });
147
+ span.durationMs = Date.now() - startTime;
148
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
149
+ getMetricsAggregator().recordSpan(endedSpan);
133
150
  return { messages: results, totalMessages: results.length };
134
151
  }
135
152
  catch (error) {
153
+ span.durationMs = Date.now() - startTime;
154
+ const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
155
+ endedSpan.statusMessage =
156
+ error instanceof Error ? error.message : String(error);
157
+ getMetricsAggregator().recordSpan(endedSpan);
136
158
  logger.error("[MemoryRetrievalTools] Error retrieving context", {
137
159
  error: error instanceof Error ? error.message : String(error),
138
160
  });