@juspay/neurolink 12.59.0 → 13.0.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 (146) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/dist/auth/anthropicOAuth.js +3 -3
  3. package/dist/auth/middleware/AuthMiddleware.d.ts +1 -1
  4. package/dist/auth/sessionManager.js +4 -4
  5. package/dist/auth/tokenStore.js +4 -4
  6. package/dist/browser/neurolink.min.js +474 -473
  7. package/dist/cli/commands/observability.d.ts +1 -6
  8. package/dist/cli/commands/observability.js +0 -106
  9. package/dist/cli/commands/proxy.js +9 -18
  10. package/dist/cli/commands/telemetry.d.ts +3 -13
  11. package/dist/cli/commands/telemetry.js +7 -354
  12. package/dist/cli/loop/session.js +1 -1
  13. package/dist/client/httpClient.js +1 -1
  14. package/dist/client/sseClient.js +1 -1
  15. package/dist/client/streamingClient.js +2 -2
  16. package/dist/client/wsClient.js +1 -1
  17. package/dist/constants/langfuse.d.ts +25 -0
  18. package/dist/constants/langfuse.js +38 -0
  19. package/dist/constants/telemetry.d.ts +20 -0
  20. package/dist/constants/telemetry.js +34 -0
  21. package/dist/core/baseProvider.d.ts +2 -1
  22. package/dist/core/baseProvider.js +4 -11
  23. package/dist/core/conversationMemoryManager.js +5 -8
  24. package/dist/core/factory.js +1 -1
  25. package/dist/core/geminiLoopAdapter.d.ts +8 -1
  26. package/dist/core/geminiLoopAdapter.js +25 -1
  27. package/dist/core/loopEngine.js +69 -40
  28. package/dist/core/modules/MessageBuilder.js +2 -2
  29. package/dist/core/modules/StreamHandler.js +2 -2
  30. package/dist/core/modules/TelemetryHandler.d.ts +2 -18
  31. package/dist/core/modules/TelemetryHandler.js +1 -66
  32. package/dist/core/modules/ToolsManager.js +40 -31
  33. package/dist/core/nativeGenerateLoop.js +78 -8
  34. package/dist/core/redisConversationMemoryManager.js +8 -15
  35. package/dist/core/toolExecutionGuards.js +1 -13
  36. package/dist/index.d.ts +5 -12
  37. package/dist/index.js +5 -37
  38. package/dist/mcp/batching/requestBatcher.js +1 -1
  39. package/dist/mcp/externalServerManager.js +3 -21
  40. package/dist/mcp/toolDiscoveryService.js +4 -16
  41. package/dist/mcp/toolRegistry.js +2 -5
  42. package/dist/memory/memoryRetrievalTools.js +1 -1
  43. package/dist/neurolink.d.ts +16 -27
  44. package/dist/neurolink.js +788 -792
  45. package/dist/observability/exporterSpanProcessor.d.ts +50 -0
  46. package/dist/observability/exporterSpanProcessor.js +181 -0
  47. package/dist/observability/exporters/langfuseExporter.d.ts +13 -34
  48. package/dist/observability/exporters/langfuseExporter.js +101 -154
  49. package/dist/observability/index.d.ts +1 -0
  50. package/dist/observability/index.js +1 -0
  51. package/dist/observability/langfuseMasking.d.ts +8 -0
  52. package/dist/observability/langfuseMasking.js +47 -0
  53. package/dist/observability/otlpEncoding.d.ts +20 -0
  54. package/dist/observability/otlpEncoding.js +85 -0
  55. package/dist/providers/amazonBedrock/client.js +142 -176
  56. package/dist/providers/amazonBedrock/loopAdapter.js +14 -1
  57. package/dist/providers/amazonSagemaker.js +118 -80
  58. package/dist/providers/anthropic/client.js +3 -52
  59. package/dist/providers/anthropic/loopAdapter.js +24 -1
  60. package/dist/providers/anthropic/rateLimitCapture.js +9 -12
  61. package/dist/providers/googleAiStudio/client.d.ts +4 -5
  62. package/dist/providers/googleAiStudio/client.js +38 -40
  63. package/dist/providers/googleVertex/client.d.ts +2 -7
  64. package/dist/providers/googleVertex/client.js +282 -378
  65. package/dist/providers/googleVertex/constants.js +2 -2
  66. package/dist/providers/litellm/client.d.ts +2 -9
  67. package/dist/providers/litellm/client.js +1 -63
  68. package/dist/providers/openAI/client.d.ts +1 -8
  69. package/dist/providers/openAI/client.js +0 -65
  70. package/dist/providers/openaiChatCompletionsBase.d.ts +1 -0
  71. package/dist/providers/openaiChatCompletionsBase.js +61 -4
  72. package/dist/providers/replicate.js +22 -4
  73. package/dist/proxy/codexUsage.js +7 -0
  74. package/dist/proxy/proxyFetch.js +19 -25
  75. package/dist/proxy/proxyTracer.d.ts +14 -7
  76. package/dist/proxy/proxyTracer.js +129 -83
  77. package/dist/proxy/proxyTranslationEngine.js +0 -1
  78. package/dist/proxy/requestLogger.d.ts +1 -1
  79. package/dist/proxy/requestLogger.js +39 -45
  80. package/dist/server/middleware/auth.d.ts +5 -1
  81. package/dist/server/middleware/auth.js +10 -3
  82. package/dist/server/middleware/common.js +1 -1
  83. package/dist/server/routes/agentRoutes.js +4 -4
  84. package/dist/server/routes/claudeProxyRoutes.js +99 -196
  85. package/dist/server/routes/codexProxyRoutes.js +621 -591
  86. package/dist/server/routes/healthRoutes.js +6 -6
  87. package/dist/server/routes/mcpRoutes.js +7 -7
  88. package/dist/server/routes/memoryRoutes.js +7 -7
  89. package/dist/server/routes/openApiRoutes.js +3 -3
  90. package/dist/server/routes/toolRoutes.js +5 -5
  91. package/dist/server/routes/transcribeRoutes.js +1 -1
  92. package/dist/server/utils/validation.d.ts +3 -3
  93. package/dist/services/server/ai/observability/instrumentation.d.ts +34 -201
  94. package/dist/services/server/ai/observability/instrumentation.js +220 -1267
  95. package/dist/services/server/ai/observability/langfuseSetup.d.ts +14 -0
  96. package/dist/services/server/ai/observability/langfuseSetup.js +55 -0
  97. package/dist/services/server/ai/observability/otlpSetup.d.ts +16 -0
  98. package/dist/services/server/ai/observability/otlpSetup.js +58 -0
  99. package/dist/session/globalSessionState.js +0 -11
  100. package/dist/telemetry/attributes.d.ts +23 -46
  101. package/dist/telemetry/attributes.js +76 -162
  102. package/dist/telemetry/chatMessages.d.ts +13 -0
  103. package/dist/telemetry/chatMessages.js +59 -0
  104. package/dist/telemetry/index.d.ts +5 -19
  105. package/dist/telemetry/index.js +5 -26
  106. package/dist/telemetry/observation.d.ts +37 -0
  107. package/dist/telemetry/observation.js +112 -0
  108. package/dist/telemetry/observationNames.d.ts +18 -0
  109. package/dist/telemetry/observationNames.js +24 -0
  110. package/dist/telemetry/spanSanitizer.d.ts +39 -0
  111. package/dist/telemetry/spanSanitizer.js +92 -0
  112. package/dist/telemetry/spanSerialization.d.ts +13 -0
  113. package/dist/telemetry/spanSerialization.js +46 -0
  114. package/dist/telemetry/tracers.d.ts +37 -18
  115. package/dist/telemetry/tracers.js +97 -19
  116. package/dist/telemetry/withSpan.d.ts +47 -25
  117. package/dist/telemetry/withSpan.js +158 -71
  118. package/dist/types/cli.d.ts +0 -11
  119. package/dist/types/decision.d.ts +3 -0
  120. package/dist/types/exporter.d.ts +54 -0
  121. package/dist/types/exporter.js +0 -4
  122. package/dist/types/generate.d.ts +4 -1
  123. package/dist/types/isolatedAgent.d.ts +5 -4
  124. package/dist/types/loopEngine.d.ts +18 -28
  125. package/dist/types/observability.d.ts +127 -160
  126. package/dist/types/providers.d.ts +15 -0
  127. package/dist/types/proxy.d.ts +41 -2
  128. package/dist/types/server.d.ts +9 -5
  129. package/dist/utils/anthropicTraceSanitizer.d.ts +2 -2
  130. package/dist/utils/anthropicTraceSanitizer.js +3 -1
  131. package/dist/utils/conversationMemory.js +4 -4
  132. package/dist/utils/fileDetector.js +1 -1
  133. package/dist/utils/messageBuilder.js +1 -1
  134. package/dist/utils/noOutputSentinel.d.ts +4 -16
  135. package/dist/utils/noOutputSentinel.js +12 -28
  136. package/dist/utils/providerRetry.js +4 -4
  137. package/dist/voice/livekit/brain.js +1 -1
  138. package/dist/voice/livekit/realtimeMemory.d.ts +1 -1
  139. package/dist/voice/livekit/realtimeMemory.js +66 -1
  140. package/dist/voice/livekit/realtimeVoiceAgent.js +1 -1
  141. package/docs-site/static/search-index.json +42 -64
  142. package/package.json +5 -4
  143. package/dist/telemetry/telemetryService.d.ts +0 -79
  144. package/dist/telemetry/telemetryService.js +0 -572
  145. package/dist/utils/observabilityHelpers.d.ts +0 -27
  146. package/dist/utils/observabilityHelpers.js +0 -47
@@ -14,7 +14,6 @@ import { toolRegistry } from "./toolRegistry.js";
14
14
  import { HITLUserRejectedError, HITLTimeoutError } from "../hitl/hitlErrors.js";
15
15
  import { detectCategory } from "../utils/mcpDefaults.js";
16
16
  import { isObject, isNonNullObject } from "../utils/typeUtils.js";
17
- import { TelemetryService } from "../telemetry/telemetryService.js";
18
17
  import { tracers } from "../telemetry/tracers.js";
19
18
  import { SpanStatusCode } from "@opentelemetry/api";
20
19
  // `@modelcontextprotocol/sdk`'s stdio transport (imported above) does
@@ -1085,7 +1084,7 @@ export class ExternalServerManager extends EventEmitter {
1085
1084
  throw new Error(`Server '${serverId}' not found`);
1086
1085
  }
1087
1086
  const config = instance.config;
1088
- const span = tracers.mcp.startSpan("neurolink.mcp.server.start", {
1087
+ const span = tracers.mcp.startSpan("mcp.server.start", {
1089
1088
  attributes: {
1090
1089
  "mcp.server_id": serverId,
1091
1090
  "mcp.transport": config.transport,
@@ -1281,7 +1280,7 @@ export class ExternalServerManager extends EventEmitter {
1281
1280
  if (!instance) {
1282
1281
  return;
1283
1282
  }
1284
- const span = tracers.mcp.startSpan("neurolink.mcp.server.stop", {
1283
+ const span = tracers.mcp.startSpan("mcp.server.stop", {
1285
1284
  attributes: {
1286
1285
  "mcp.server_id": serverId,
1287
1286
  },
@@ -1503,7 +1502,7 @@ export class ExternalServerManager extends EventEmitter {
1503
1502
  }
1504
1503
  instance.restartTimer = setTimeout(async () => {
1505
1504
  this.retryDeadlines.delete(serverId);
1506
- const restartSpan = tracers.mcp.startSpan("neurolink.mcp.server.restart", {
1505
+ const restartSpan = tracers.mcp.startSpan("mcp.server.restart", {
1507
1506
  attributes: {
1508
1507
  "mcp.server_id": serverId,
1509
1508
  "mcp.restart_attempt": instance.reconnectAttempts,
@@ -2050,10 +2049,6 @@ export class ExternalServerManager extends EventEmitter {
2050
2049
  // of counting every resolved error as a success.
2051
2050
  const resolvedError = result.isErrorResult === true;
2052
2051
  if (resolvedError) {
2053
- // Keep this instance's totalErrors (and the getStatistics() /
2054
- // getExternalMCPStatistics() it feeds) consistent with the breaker,
2055
- // TelemetryService and ToolDiscoveryService's failedCalls, all of
2056
- // which already count a resolved isError result as a failure.
2057
2052
  instance.metrics.totalErrors++;
2058
2053
  }
2059
2054
  mcpLogger.debug(resolvedError
@@ -2061,12 +2056,6 @@ export class ExternalServerManager extends EventEmitter {
2061
2056
  : `[ExternalServerManager] Tool executed successfully: ${toolName} on ${serverId}`, {
2062
2057
  duration,
2063
2058
  });
2064
- try {
2065
- TelemetryService.getInstance()?.recordMCPToolCall(toolName, duration, !resolvedError);
2066
- }
2067
- catch {
2068
- /* telemetry should not break execution */
2069
- }
2070
2059
  return result.data;
2071
2060
  }
2072
2061
  else {
@@ -2075,13 +2064,6 @@ export class ExternalServerManager extends EventEmitter {
2075
2064
  }
2076
2065
  catch (error) {
2077
2066
  instance.metrics.totalErrors++;
2078
- try {
2079
- const errorDuration = Date.now() - startTime;
2080
- TelemetryService.getInstance()?.recordMCPToolCall(toolName, errorDuration, false);
2081
- }
2082
- catch {
2083
- /* telemetry should not break execution */
2084
- }
2085
2067
  mcpLogger.error(`[ExternalServerManager] Tool execution failed: ${toolName} on ${serverId}`, error);
2086
2068
  // The SDK rejects with its connection-closed error when the server is
2087
2069
  // gone. Without this transition the instance stayed "connected" and
@@ -111,7 +111,7 @@ export class ToolDiscoveryService extends EventEmitter {
111
111
  */
112
112
  async discoverTools(serverId, client, timeout = DEFAULT_TOOL_TIMEOUT, isCurrentDiscovery = () => true, startupDiscovery = false) {
113
113
  return withSpan({
114
- name: "neurolink.mcp.discoverTools",
114
+ name: "mcp.discoverTools",
115
115
  tracer: tracers.mcp,
116
116
  attributes: { "mcp.server_id": serverId },
117
117
  }, async (span) => {
@@ -461,21 +461,14 @@ export class ToolDiscoveryService extends EventEmitter {
461
461
  // clean resolve and could never open for a tool that fails this way.
462
462
  let isErrorResultDetected = false;
463
463
  const result = await circuitBreaker.execute(async (recordResolvedFailure) => {
464
- return mcpTracer.startActiveSpan("neurolink.mcp.callTool", {
464
+ return mcpTracer.startActiveSpan("mcp.callTool", {
465
465
  kind: SpanKind.CLIENT,
466
466
  attributes: {
467
467
  "mcp.server_id": serverId,
468
468
  "mcp.tool_name": toolName,
469
469
  "mcp.timeout_ms": effectiveTimeout,
470
- // Curator P1-4: Langfuse observations rely on ai.*/gen_ai.*
471
- // attributes for tool name and I/O previews. Provide them so
472
- // the SPAN observation in Langfuse is legible without
473
- // timestamp-joining against the parent ai.toolCall. Redact
474
- // parameters via the existing secret-stripping helper so
475
- // tokens/credentials/paths don't leave the process.
476
470
  "ai.tool.name": toolName,
477
- "gen_ai.tool.name": toolName,
478
- "gen_ai.request": safeJsonStringify({
471
+ "mcp.request": safeJsonStringify({
479
472
  name: toolName,
480
473
  arguments: redactForPreview(effectiveParameters),
481
474
  }, 2048),
@@ -535,12 +528,7 @@ export class ToolDiscoveryService extends EventEmitter {
535
528
  }
536
529
  }
537
530
  // ── end normalization ─────────────────────────────────────────
538
- // Curator P1-4: build gen_ai.response AFTER normalization so
539
- // large payloads use the compact surrogate instead of the raw
540
- // result (avoids redundant stringify + memory hit on payloads
541
- // that were specifically externalized to Redis). Redact via the
542
- // same secret-stripping path used for request parameters.
543
- callSpan.setAttribute("gen_ai.response", safeJsonStringify(redactForPreview(resultForPreview), 2048));
531
+ callSpan.setAttribute("mcp.response", safeJsonStringify(redactForPreview(resultForPreview), 2048));
544
532
  return resultForReturn;
545
533
  }
546
534
  catch (err) {
@@ -288,14 +288,11 @@ export class MCPToolRegistry extends MCPRegistry {
288
288
  }
289
289
  }
290
290
  return withSpan({
291
- name: "neurolink.tool.registry.execute",
291
+ name: "tool.registry.execute",
292
292
  tracer: tracers.mcp,
293
293
  attributes: {
294
- [ATTR.GEN_AI_TOOL_NAME]: toolName,
294
+ "tool.name": toolName,
295
295
  [ATTR.MCP_SERVER_ID]: preResolvedServerId || "builtin",
296
- // Curator P1-3: registry-level wrapper — duplicates ai.toolCall in
297
- // Langfuse. Retained for OTel/metrics; skipped for Langfuse export.
298
- "langfuse.internal": true,
299
296
  },
300
297
  }, async (span) => {
301
298
  try {
@@ -91,7 +91,7 @@ export function createMemoryRetrievalTools(memoryManager, artifactStore) {
91
91
  "search starts there; use `nextSearchOffset` to continue."),
92
92
  }),
93
93
  execute: async (args) => withSpan({
94
- name: "neurolink.memory.retrieve_context",
94
+ name: "memory.retrieve_context",
95
95
  tracer: tracers.memory,
96
96
  attributes: {
97
97
  "memory.operation": args.artifactId
@@ -229,9 +229,6 @@ export declare class NeuroLink {
229
229
  private decisionHookTimeoutMs?;
230
230
  private skillsManagerInstance?;
231
231
  private skillsConfig?;
232
- /**
233
- * Extract and set Langfuse context from options with proper async scoping
234
- */
235
232
  private setLangfuseContextFromOptions;
236
233
  private createMetricsTraceContext;
237
234
  private enforceSessionBudget;
@@ -369,6 +366,7 @@ export declare class NeuroLink {
369
366
  * @throws {Error} When HITL configuration is invalid (if enabled)
370
367
  */
371
368
  private observabilityConfig?;
369
+ private telemetryHeld;
372
370
  private metricsAggregator;
373
371
  private analyticsService;
374
372
  /**
@@ -547,10 +545,8 @@ export declare class NeuroLink {
547
545
  * Setup event handlers for external server manager
548
546
  */
549
547
  private setupExternalServerEventHandlers;
550
- /**
551
- * Initialize Langfuse observability for AI operations tracking
552
- */
553
- private initializeLangfuse;
548
+ private holdTelemetry;
549
+ private releaseTelemetryHold;
554
550
  /**
555
551
  * Log constructor completion with final state summary
556
552
  */
@@ -676,12 +672,12 @@ export declare class NeuroLink {
676
672
  */
677
673
  getObservabilityConfig(): ObservabilityConfig | undefined;
678
674
  /**
679
- * Check if Langfuse telemetry is enabled
680
- * Centralized utility to avoid duplication across providers
675
+ * @description Reports whether any tracing backend is active.
676
+ * @returns {boolean} `true` when OpenTelemetry is initialized or a Langfuse exporter is running.
681
677
  */
682
678
  isTelemetryEnabled(): boolean;
683
679
  /**
684
- * Get comprehensive telemetry status including Langfuse, OTel, and exporter health
680
+ * Get comprehensive telemetry status including Langfuse and OpenTelemetry state
685
681
  */
686
682
  getTelemetryStatus(): {
687
683
  enabled: boolean;
@@ -695,15 +691,6 @@ export declare class NeuroLink {
695
691
  endpoint?: string;
696
692
  serviceName?: string;
697
693
  };
698
- exporters?: Array<{
699
- name: string;
700
- enabled: boolean;
701
- healthy: boolean;
702
- pendingSpans: number;
703
- lastExportTime?: string;
704
- latencyMs?: number;
705
- errors?: string[];
706
- }>;
707
694
  };
708
695
  /**
709
696
  * Get aggregated observability metrics (latency, tokens, cost, success rate)
@@ -773,10 +760,9 @@ export declare class NeuroLink {
773
760
  */
774
761
  private estimateCostFromUsage;
775
762
  /**
776
- * Handle generation:end for Pipeline B spans + advanced analytics.
777
- * When pipelineAHandled is set, skips Pipeline B spans but still tracks
778
- * analytics so successful AI-SDK generate/stream calls are recorded.
779
- * Stream analytics are owned here (not stream:complete) to avoid duplicates.
763
+ * Handle generation:end: records advanced analytics for every generation
764
+ * and the metrics span for a non-streamed one. A streamed generation gets
765
+ * its span from stream:complete / stream:error instead.
780
766
  */
781
767
  private handleGenerationEndMetrics;
782
768
  /**
@@ -903,6 +889,7 @@ export declare class NeuroLink {
903
889
  * so every log call beneath it is attributable to this instance.
904
890
  */
905
891
  private generateInInstanceScope;
892
+ private runGenerateTurn;
906
893
  private fireConsumerOnErrorIfNotFired;
907
894
  /**
908
895
  * Curator P2-3: wraps a generate/stream call with the fallback
@@ -1213,6 +1200,7 @@ export declare class NeuroLink {
1213
1200
  * are covered.
1214
1201
  */
1215
1202
  private streamInInstanceScope;
1203
+ private runStreamTurn;
1216
1204
  /**
1217
1205
  * Curator P2-3 / Reviewer Finding #2: stream-fallback that also covers
1218
1206
  * errors thrown during async iteration (e.g. LiteLLM throwing inside
@@ -1288,6 +1276,9 @@ export declare class NeuroLink {
1288
1276
  private validateStreamRequestOptions;
1289
1277
  private maybeHandleWorkflowStreamRequest;
1290
1278
  private runStandardStreamRequest;
1279
+ private drainStandardStreamOnce;
1280
+ private drainStandardStream;
1281
+ private settleStandardStreamDrain;
1291
1282
  /** Wrap one provider stream with incremental TTS synthesis. */
1292
1283
  private createIncrementalTTSStream;
1293
1284
  /** Prevent provider fallback streams from duplicating outer streaming TTS. */
@@ -3085,10 +3076,8 @@ export declare class NeuroLink {
3085
3076
  *
3086
3077
  * Worker mode is the framework-provided version of the config block every
3087
3078
  * consumer used to copy by hand: conversation memory OFF, orchestration
3088
- * OFF, observability inherited from this instance with
3089
- * `autoDetectExternalProvider: true` + `skipLangfuseSpanProcessor: true`
3090
- * (worker spans join the host's tracer without duplicate Langfuse
3091
- * exports), credentials inherited, the host's tool registry shared (so
3079
+ * OFF, observability inherited from this instance (worker spans join the
3080
+ * host's tracer provider), credentials inherited, the host's tool registry shared (so
3092
3081
  * worker tool calls reuse the host's connections), and an internal log
3093
3082
  * bridge attached with a caller-supplied tag.
3094
3083
  *