@juspay/neurolink 7.49.0 → 7.51.0

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 (258) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +12 -9
  3. package/dist/adapters/providerImageAdapter.js +82 -10
  4. package/dist/agent/directTools.d.ts +10 -10
  5. package/dist/agent/directTools.js +5 -3
  6. package/dist/cli/commands/config.js +1 -0
  7. package/dist/cli/commands/mcp.js +1 -0
  8. package/dist/cli/commands/models.js +1 -0
  9. package/dist/cli/commands/ollama.js +1 -0
  10. package/dist/cli/commands/setup-anthropic.js +1 -0
  11. package/dist/cli/commands/setup-azure.js +1 -0
  12. package/dist/cli/commands/setup-bedrock.js +1 -0
  13. package/dist/cli/commands/setup-gcp.js +1 -0
  14. package/dist/cli/commands/setup-google-ai.js +1 -0
  15. package/dist/cli/commands/setup-huggingface.js +1 -0
  16. package/dist/cli/commands/setup-mistral.js +1 -0
  17. package/dist/cli/commands/setup-openai.js +1 -0
  18. package/dist/cli/commands/setup.js +1 -0
  19. package/dist/cli/errorHandler.js +1 -0
  20. package/dist/cli/factories/commandFactory.d.ts +5 -0
  21. package/dist/cli/factories/commandFactory.js +42 -6
  22. package/dist/cli/factories/ollamaCommandFactory.js +1 -0
  23. package/dist/cli/factories/sagemakerCommandFactory.js +1 -0
  24. package/dist/cli/factories/setupCommandFactory.js +1 -0
  25. package/dist/cli/index.js +14 -2
  26. package/dist/cli/loop/conversationSelector.js +1 -0
  27. package/dist/cli/loop/optionsSchema.js +1 -0
  28. package/dist/cli/loop/session.js +1 -0
  29. package/dist/cli/parser.js +1 -0
  30. package/dist/cli/utils/completeSetup.js +1 -0
  31. package/dist/cli/utils/envManager.js +1 -0
  32. package/dist/cli/utils/interactiveSetup.js +1 -0
  33. package/dist/cli/utils/ollamaUtils.js +1 -0
  34. package/dist/constants/index.js +1 -1
  35. package/dist/core/baseProvider.d.ts +14 -0
  36. package/dist/core/baseProvider.js +106 -23
  37. package/dist/index.d.ts +11 -5
  38. package/dist/index.js +11 -10
  39. package/dist/lib/adapters/providerImageAdapter.js +83 -10
  40. package/dist/lib/agent/directTools.d.ts +10 -10
  41. package/dist/lib/agent/directTools.js +6 -3
  42. package/dist/lib/config/configManager.js +1 -0
  43. package/dist/lib/config/conversationMemory.js +1 -0
  44. package/dist/lib/config/taskClassificationConfig.js +1 -0
  45. package/dist/lib/constants/index.js +2 -1
  46. package/dist/lib/constants/performance.js +1 -0
  47. package/dist/lib/constants/retry.js +1 -0
  48. package/dist/lib/constants/timeouts.js +1 -0
  49. package/dist/lib/constants/tokens.js +1 -0
  50. package/dist/lib/core/analytics.js +1 -0
  51. package/dist/lib/core/baseProvider.d.ts +14 -0
  52. package/dist/lib/core/baseProvider.js +107 -23
  53. package/dist/lib/core/constants.js +1 -0
  54. package/dist/lib/core/conversationMemoryFactory.js +1 -0
  55. package/dist/lib/core/conversationMemoryInitializer.js +1 -0
  56. package/dist/lib/core/conversationMemoryManager.js +1 -0
  57. package/dist/lib/core/dynamicModels.js +1 -0
  58. package/dist/lib/core/evaluation.js +1 -0
  59. package/dist/lib/core/evaluationProviders.js +1 -0
  60. package/dist/lib/core/factory.js +1 -0
  61. package/dist/lib/core/modelConfiguration.js +1 -0
  62. package/dist/lib/core/redisConversationMemoryManager.js +1 -0
  63. package/dist/lib/core/serviceRegistry.js +1 -0
  64. package/dist/lib/core/streamAnalytics.js +1 -0
  65. package/dist/lib/evaluation/contextBuilder.js +1 -0
  66. package/dist/lib/evaluation/index.js +1 -0
  67. package/dist/lib/evaluation/prompts.js +1 -0
  68. package/dist/lib/evaluation/ragasEvaluator.js +1 -0
  69. package/dist/lib/evaluation/retryManager.js +1 -0
  70. package/dist/lib/evaluation/scoring.js +1 -0
  71. package/dist/lib/factories/providerFactory.js +1 -0
  72. package/dist/lib/factories/providerRegistry.js +1 -0
  73. package/dist/lib/hitl/hitlErrors.js +1 -0
  74. package/dist/lib/hitl/hitlManager.js +1 -0
  75. package/dist/lib/hitl/index.js +1 -0
  76. package/dist/lib/hitl/types.js +1 -0
  77. package/dist/lib/index.d.ts +11 -5
  78. package/dist/lib/index.js +12 -10
  79. package/dist/lib/mcp/externalServerManager.js +1 -0
  80. package/dist/lib/mcp/factory.js +1 -0
  81. package/dist/lib/mcp/flexibleToolValidator.js +1 -0
  82. package/dist/lib/mcp/index.js +1 -0
  83. package/dist/lib/mcp/mcpCircuitBreaker.js +1 -0
  84. package/dist/lib/mcp/mcpClientFactory.js +2 -1
  85. package/dist/lib/mcp/registry.js +1 -0
  86. package/dist/lib/mcp/servers/agent/directToolsServer.js +2 -0
  87. package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +1 -0
  88. package/dist/lib/mcp/servers/aiProviders/aiCoreServer.js +1 -0
  89. package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  90. package/dist/lib/mcp/servers/utilities/utilityServer.js +1 -0
  91. package/dist/lib/mcp/toolDiscoveryService.js +1 -0
  92. package/dist/lib/mcp/toolRegistry.js +1 -0
  93. package/dist/lib/memory/mem0Initializer.js +1 -0
  94. package/dist/lib/middleware/builtin/analytics.js +1 -0
  95. package/dist/lib/middleware/builtin/autoEvaluation.js +1 -0
  96. package/dist/lib/middleware/builtin/guardrails.js +1 -0
  97. package/dist/lib/middleware/factory.js +1 -0
  98. package/dist/lib/middleware/index.js +1 -0
  99. package/dist/lib/middleware/registry.js +1 -0
  100. package/dist/lib/middleware/utils/guardrailsUtils.js +1 -0
  101. package/dist/lib/models/modelRegistry.js +1 -0
  102. package/dist/lib/models/modelResolver.js +2 -0
  103. package/dist/lib/neurolink.d.ts +41 -6
  104. package/dist/lib/neurolink.js +276 -5
  105. package/dist/lib/providers/amazonBedrock.d.ts +1 -0
  106. package/dist/lib/providers/amazonBedrock.js +166 -14
  107. package/dist/lib/providers/amazonSagemaker.js +1 -0
  108. package/dist/lib/providers/anthropic.js +8 -21
  109. package/dist/lib/providers/anthropicBaseProvider.js +1 -0
  110. package/dist/lib/providers/azureOpenai.js +6 -21
  111. package/dist/lib/providers/googleAiStudio.js +6 -21
  112. package/dist/lib/providers/googleVertex.js +9 -1
  113. package/dist/lib/providers/huggingFace.js +34 -3
  114. package/dist/lib/providers/index.js +1 -0
  115. package/dist/lib/providers/litellm.js +34 -3
  116. package/dist/lib/providers/mistral.js +32 -2
  117. package/dist/lib/providers/ollama.d.ts +37 -1
  118. package/dist/lib/providers/ollama.js +544 -58
  119. package/dist/lib/providers/openAI.js +6 -21
  120. package/dist/lib/providers/openaiCompatible.js +41 -4
  121. package/dist/lib/providers/sagemaker/adaptive-semaphore.js +1 -0
  122. package/dist/lib/providers/sagemaker/client.js +1 -0
  123. package/dist/lib/providers/sagemaker/config.js +1 -0
  124. package/dist/lib/providers/sagemaker/detection.js +1 -0
  125. package/dist/lib/providers/sagemaker/diagnostics.js +1 -0
  126. package/dist/lib/providers/sagemaker/error-constants.js +1 -0
  127. package/dist/lib/providers/sagemaker/errors.js +1 -0
  128. package/dist/lib/providers/sagemaker/index.js +1 -0
  129. package/dist/lib/providers/sagemaker/language-model.js +1 -0
  130. package/dist/lib/providers/sagemaker/parsers.js +1 -0
  131. package/dist/lib/providers/sagemaker/streaming.js +1 -0
  132. package/dist/lib/providers/sagemaker/structured-parser.js +1 -0
  133. package/dist/lib/proxy/awsProxyIntegration.js +1 -0
  134. package/dist/lib/proxy/proxyFetch.js +1 -0
  135. package/dist/lib/proxy/utils/noProxyUtils.js +1 -0
  136. package/dist/lib/sdk/toolRegistration.js +2 -0
  137. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +57 -0
  138. package/dist/lib/services/server/ai/observability/instrumentation.js +171 -0
  139. package/dist/lib/session/globalSessionState.js +38 -1
  140. package/dist/lib/telemetry/index.d.ts +1 -0
  141. package/dist/lib/telemetry/index.js +1 -0
  142. package/dist/lib/telemetry/telemetryService.d.ts +2 -0
  143. package/dist/lib/telemetry/telemetryService.js +8 -7
  144. package/dist/lib/types/analytics.js +1 -0
  145. package/dist/lib/types/cli.js +1 -0
  146. package/dist/lib/types/common.js +1 -0
  147. package/dist/lib/types/configTypes.js +1 -0
  148. package/dist/lib/types/content.d.ts +14 -1
  149. package/dist/lib/types/content.js +1 -0
  150. package/dist/lib/types/contextTypes.js +1 -0
  151. package/dist/lib/types/conversation.d.ts +2 -0
  152. package/dist/lib/types/conversation.js +1 -0
  153. package/dist/lib/types/domainTypes.js +1 -0
  154. package/dist/lib/types/errors.js +1 -0
  155. package/dist/lib/types/evaluation.js +1 -0
  156. package/dist/lib/types/evaluationProviders.js +1 -0
  157. package/dist/lib/types/evaluationTypes.js +1 -0
  158. package/dist/lib/types/externalMcp.js +1 -0
  159. package/dist/lib/types/fileTypes.d.ts +44 -0
  160. package/dist/lib/types/fileTypes.js +1 -0
  161. package/dist/lib/types/generateTypes.d.ts +1 -0
  162. package/dist/lib/types/generateTypes.js +1 -0
  163. package/dist/lib/types/guardrails.js +1 -0
  164. package/dist/lib/types/index.js +1 -0
  165. package/dist/lib/types/mcpTypes.js +1 -0
  166. package/dist/lib/types/middlewareTypes.js +1 -0
  167. package/dist/lib/types/modelTypes.d.ts +6 -6
  168. package/dist/lib/types/modelTypes.js +1 -0
  169. package/dist/lib/types/observability.d.ts +49 -0
  170. package/dist/lib/types/observability.js +7 -0
  171. package/dist/lib/types/providers.d.ts +44 -0
  172. package/dist/lib/types/providers.js +1 -0
  173. package/dist/lib/types/sdkTypes.js +1 -0
  174. package/dist/lib/types/serviceTypes.js +1 -0
  175. package/dist/lib/types/streamTypes.d.ts +1 -0
  176. package/dist/lib/types/streamTypes.js +1 -0
  177. package/dist/lib/types/taskClassificationTypes.js +1 -0
  178. package/dist/lib/types/tools.js +2 -0
  179. package/dist/lib/types/typeAliases.js +1 -0
  180. package/dist/lib/types/universalProviderOptions.js +1 -0
  181. package/dist/lib/utils/analyticsUtils.js +1 -0
  182. package/dist/lib/utils/conversationMemory.js +1 -0
  183. package/dist/lib/utils/conversationMemoryUtils.js +1 -0
  184. package/dist/lib/utils/csvProcessor.js +1 -0
  185. package/dist/lib/utils/errorHandling.js +1 -0
  186. package/dist/lib/utils/evaluationUtils.js +1 -0
  187. package/dist/lib/utils/factoryProcessing.js +1 -0
  188. package/dist/lib/utils/fileDetector.js +7 -3
  189. package/dist/lib/utils/imageProcessor.js +1 -0
  190. package/dist/lib/utils/logger.js +1 -0
  191. package/dist/lib/utils/loopUtils.js +1 -0
  192. package/dist/lib/utils/mcpDefaults.js +1 -0
  193. package/dist/lib/utils/messageBuilder.js +96 -9
  194. package/dist/lib/utils/modelRouter.js +1 -0
  195. package/dist/lib/utils/multimodalOptionsBuilder.d.ts +67 -0
  196. package/dist/lib/utils/multimodalOptionsBuilder.js +65 -0
  197. package/dist/lib/utils/optionsConversion.js +1 -0
  198. package/dist/lib/utils/optionsUtils.js +1 -0
  199. package/dist/lib/utils/parameterValidation.js +1 -0
  200. package/dist/lib/utils/pdfProcessor.d.ts +10 -0
  201. package/dist/lib/utils/pdfProcessor.js +199 -0
  202. package/dist/lib/utils/performance.js +1 -0
  203. package/dist/lib/utils/promptRedaction.js +1 -0
  204. package/dist/lib/utils/providerConfig.js +1 -0
  205. package/dist/lib/utils/providerHealth.js +1 -0
  206. package/dist/lib/utils/providerSetupMessages.js +1 -0
  207. package/dist/lib/utils/providerUtils.js +1 -0
  208. package/dist/lib/utils/redis.js +1 -0
  209. package/dist/lib/utils/retryHandler.js +1 -0
  210. package/dist/lib/utils/schemaConversion.js +1 -0
  211. package/dist/lib/utils/taskClassificationUtils.js +1 -0
  212. package/dist/lib/utils/taskClassifier.js +1 -0
  213. package/dist/lib/utils/timeout.js +1 -0
  214. package/dist/lib/utils/tokenLimits.js +1 -0
  215. package/dist/lib/utils/toolUtils.js +1 -0
  216. package/dist/lib/utils/transformationUtils.js +1 -0
  217. package/dist/lib/utils/typeUtils.js +1 -0
  218. package/dist/mcp/mcpClientFactory.js +1 -1
  219. package/dist/mcp/servers/agent/directToolsServer.js +1 -0
  220. package/dist/models/modelResolver.js +1 -0
  221. package/dist/neurolink.d.ts +41 -6
  222. package/dist/neurolink.js +275 -5
  223. package/dist/providers/amazonBedrock.d.ts +1 -0
  224. package/dist/providers/amazonBedrock.js +165 -14
  225. package/dist/providers/anthropic.js +7 -21
  226. package/dist/providers/azureOpenai.js +5 -21
  227. package/dist/providers/googleAiStudio.js +5 -21
  228. package/dist/providers/googleVertex.js +8 -1
  229. package/dist/providers/huggingFace.js +33 -3
  230. package/dist/providers/litellm.js +33 -3
  231. package/dist/providers/mistral.js +31 -2
  232. package/dist/providers/ollama.d.ts +37 -1
  233. package/dist/providers/ollama.js +543 -58
  234. package/dist/providers/openAI.js +5 -21
  235. package/dist/providers/openaiCompatible.js +40 -4
  236. package/dist/sdk/toolRegistration.js +1 -0
  237. package/dist/services/server/ai/observability/instrumentation.d.ts +57 -0
  238. package/dist/services/server/ai/observability/instrumentation.js +170 -0
  239. package/dist/session/globalSessionState.js +37 -1
  240. package/dist/telemetry/index.d.ts +1 -0
  241. package/dist/telemetry/telemetryService.d.ts +2 -0
  242. package/dist/telemetry/telemetryService.js +7 -7
  243. package/dist/types/content.d.ts +14 -1
  244. package/dist/types/conversation.d.ts +2 -0
  245. package/dist/types/fileTypes.d.ts +44 -0
  246. package/dist/types/generateTypes.d.ts +1 -0
  247. package/dist/types/observability.d.ts +49 -0
  248. package/dist/types/observability.js +6 -0
  249. package/dist/types/providers.d.ts +44 -0
  250. package/dist/types/streamTypes.d.ts +1 -0
  251. package/dist/types/tools.js +1 -0
  252. package/dist/utils/fileDetector.js +6 -3
  253. package/dist/utils/messageBuilder.js +95 -9
  254. package/dist/utils/multimodalOptionsBuilder.d.ts +67 -0
  255. package/dist/utils/multimodalOptionsBuilder.js +64 -0
  256. package/dist/utils/pdfProcessor.d.ts +10 -0
  257. package/dist/utils/pdfProcessor.js +198 -0
  258. package/package.json +12 -16
@@ -2,6 +2,7 @@
2
2
  * NeuroLink Direct Tools Server
3
3
  * Wraps the agent direct tools as an MCP server for proper registration
4
4
  */
5
+ import { z } from "zod";
5
6
  import { createMCPServer } from "../../factory.js";
6
7
  import { directAgentTools } from "../../../agent/directTools.js";
7
8
  import { logger } from "../../../utils/logger.js";
@@ -3,6 +3,7 @@
3
3
  * Provides model resolution, search, and recommendation functionality
4
4
  * Part of Phase 4.1 - Models Command System
5
5
  */
6
+ import { AIProviderName } from "../types/index.js";
6
7
  import { MODEL_REGISTRY, MODEL_ALIASES, USE_CASE_RECOMMENDATIONS, getAllModels, getModelById, getModelsByProvider, getAvailableProviders, calculateCost, formatModelForDisplay, } from "./modelRegistry.js";
7
8
  import { isNonNullObject } from "../utils/typeUtils.js";
8
9
  /**
@@ -19,6 +19,17 @@ import { ConversationMemoryManager } from "./core/conversationMemoryManager.js";
19
19
  import { RedisConversationMemoryManager } from "./core/redisConversationMemoryManager.js";
20
20
  import type { HITLConfig } from "./hitl/types.js";
21
21
  import type { ExternalMCPServerInstance, ExternalMCPOperationResult, ExternalMCPToolInfo } from "./types/externalMcp.js";
22
+ import type { ObservabilityConfig } from "./types/observability.js";
23
+ /**
24
+ * Configuration object for NeuroLink constructor.
25
+ */
26
+ export interface NeurolinkConstructorConfig {
27
+ conversationMemory?: Partial<ConversationMemoryConfig>;
28
+ enableOrchestration?: boolean;
29
+ hitl?: HITLConfig;
30
+ toolRegistry?: MCPToolRegistry;
31
+ observability?: ObservabilityConfig;
32
+ }
22
33
  export interface ProviderStatus {
23
34
  provider: string;
24
35
  status: "working" | "failed" | "not-configured";
@@ -138,12 +149,8 @@ export declare class NeuroLink {
138
149
  * @throws {Error} When external server manager initialization fails
139
150
  * @throws {Error} When HITL configuration is invalid (if enabled)
140
151
  */
141
- constructor(config?: {
142
- conversationMemory?: Partial<ConversationMemoryConfig>;
143
- enableOrchestration?: boolean;
144
- hitl?: HITLConfig;
145
- toolRegistry?: MCPToolRegistry;
146
- });
152
+ private observabilityConfig?;
153
+ constructor(config?: NeurolinkConstructorConfig);
147
154
  /**
148
155
  * Initialize provider registry with security settings
149
156
  */
@@ -170,6 +177,10 @@ export declare class NeuroLink {
170
177
  * Setup event handlers for external server manager
171
178
  */
172
179
  private setupExternalServerEventHandlers;
180
+ /**
181
+ * Initialize Langfuse observability for AI operations tracking
182
+ */
183
+ private initializeLangfuse;
173
184
  /**
174
185
  * Log constructor completion with final state summary
175
186
  */
@@ -279,6 +290,24 @@ export declare class NeuroLink {
279
290
  * @throws {Error} When all providers fail to generate content
280
291
  * @throws {Error} When conversation memory operations fail (if enabled)
281
292
  */
293
+ /**
294
+ * Get observability configuration
295
+ */
296
+ getObservabilityConfig(): ObservabilityConfig | undefined;
297
+ /**
298
+ * Check if Langfuse telemetry is enabled
299
+ * Centralized utility to avoid duplication across providers
300
+ */
301
+ isTelemetryEnabled(): boolean;
302
+ /**
303
+ * Public method to initialize Langfuse observability
304
+ * This method can be called externally to ensure Langfuse is properly initialized
305
+ */
306
+ initializeLangfuseObservability(): Promise<void>;
307
+ /**
308
+ * Gracefully shutdown NeuroLink and all MCP connections
309
+ */
310
+ shutdown(): Promise<void>;
282
311
  generate(optionsOrPrompt: GenerateOptions | string): Promise<GenerateResult>;
283
312
  /**
284
313
  * BACKWARD COMPATIBILITY: Legacy generateText method
@@ -1047,6 +1076,12 @@ export declare class NeuroLink {
1047
1076
  * Unregister all external MCP tools from the main registry
1048
1077
  */
1049
1078
  private unregisterAllExternalMCPToolsFromRegistry;
1079
+ /**
1080
+ * Dispose of all resources and cleanup connections
1081
+ * Call this method when done using the NeuroLink instance to prevent resource leaks
1082
+ * Especially important in test environments where multiple instances are created
1083
+ */
1084
+ dispose(): Promise<void>;
1050
1085
  }
1051
1086
  export declare const neurolink: NeuroLink;
1052
1087
  export default neurolink;
package/dist/neurolink.js CHANGED
@@ -31,6 +31,8 @@ import { transformToolExecutions, transformToolExecutionsForMCP, transformAvaila
31
31
  // Enhanced error handling imports
32
32
  import { ErrorFactory, NeuroLinkError, withTimeout, withRetry, isRetriableError, logStructuredError, CircuitBreaker, } from "./utils/errorHandling.js";
33
33
  import { EventEmitter } from "events";
34
+ import { ConversationMemoryManager } from "./core/conversationMemoryManager.js";
35
+ import { RedisConversationMemoryManager } from "./core/redisConversationMemoryManager.js";
34
36
  import { getConversationMessages, storeConversationTurn, } from "./utils/conversationMemory.js";
35
37
  import { ExternalServerManager } from "./mcp/externalServerManager.js";
36
38
  import { HITLManager } from "./hitl/hitlManager.js";
@@ -39,6 +41,7 @@ import { directToolsServer } from "./mcp/servers/agent/directToolsServer.js";
39
41
  // Import orchestration components
40
42
  import { ModelRouter } from "./utils/modelRouter.js";
41
43
  import { BinaryTaskClassifier } from "./utils/taskClassifier.js";
44
+ import { initializeOpenTelemetry, shutdownOpenTelemetry, flushOpenTelemetry, getLangfuseHealthStatus, } from "./services/server/ai/observability/instrumentation.js";
42
45
  import { isNonNullObject } from "./utils/typeUtils.js";
43
46
  import { isZodSchema } from "./utils/schemaConversion.js";
44
47
  // Core types imported from "./types/index.js"
@@ -178,8 +181,10 @@ export class NeuroLink {
178
181
  * @throws {Error} When external server manager initialization fails
179
182
  * @throws {Error} When HITL configuration is invalid (if enabled)
180
183
  */
184
+ observabilityConfig;
181
185
  constructor(config) {
182
186
  this.toolRegistry = config?.toolRegistry || new MCPToolRegistry();
187
+ this.observabilityConfig = config?.observability;
183
188
  // Initialize orchestration setting
184
189
  this.enableOrchestration = config?.enableOrchestration ?? false;
185
190
  // Read tool cache duration from environment variables, with a default
@@ -194,6 +199,7 @@ export class NeuroLink {
194
199
  this.initializeConversationMemory(config, constructorId, constructorStartTime, constructorHrTimeStart);
195
200
  this.initializeExternalServerManager(constructorId, constructorStartTime, constructorHrTimeStart);
196
201
  this.initializeHITL(config, constructorId, constructorStartTime, constructorHrTimeStart);
202
+ this.initializeLangfuse(constructorId, constructorStartTime, constructorHrTimeStart);
197
203
  this.logConstructorComplete(constructorId, constructorStartTime, constructorHrTimeStart);
198
204
  }
199
205
  /**
@@ -494,6 +500,81 @@ export class NeuroLink {
494
500
  this.unregisterExternalMCPToolFromRegistry(event.toolName);
495
501
  });
496
502
  }
503
+ /**
504
+ * Initialize Langfuse observability for AI operations tracking
505
+ */
506
+ initializeLangfuse(constructorId, constructorStartTime, constructorHrTimeStart) {
507
+ const langfuseInitStartTime = process.hrtime.bigint();
508
+ try {
509
+ const langfuseConfig = this.observabilityConfig?.langfuse;
510
+ if (langfuseConfig?.enabled) {
511
+ logger.debug(`[NeuroLink] 📊 LOG_POINT_C019_LANGFUSE_INIT_START`, {
512
+ logPoint: "C019_LANGFUSE_INIT_START",
513
+ constructorId,
514
+ timestamp: new Date().toISOString(),
515
+ elapsedMs: Date.now() - constructorStartTime,
516
+ elapsedNs: (process.hrtime.bigint() - constructorHrTimeStart).toString(),
517
+ langfuseInitStartTimeNs: langfuseInitStartTime.toString(),
518
+ message: "Starting Langfuse observability initialization",
519
+ });
520
+ // Initialize OpenTelemetry FIRST (required for Langfuse v4)
521
+ initializeOpenTelemetry(langfuseConfig);
522
+ const healthStatus = getLangfuseHealthStatus();
523
+ const langfuseInitDurationNs = process.hrtime.bigint() - langfuseInitStartTime;
524
+ if (healthStatus.initialized &&
525
+ healthStatus.hasProcessor &&
526
+ healthStatus.isHealthy) {
527
+ logger.debug(`[NeuroLink] ✅ LOG_POINT_C020_LANGFUSE_INIT_SUCCESS`, {
528
+ logPoint: "C020_LANGFUSE_INIT_SUCCESS",
529
+ constructorId,
530
+ timestamp: new Date().toISOString(),
531
+ elapsedMs: Date.now() - constructorStartTime,
532
+ elapsedNs: (process.hrtime.bigint() - constructorHrTimeStart).toString(),
533
+ langfuseInitDurationNs: langfuseInitDurationNs.toString(),
534
+ langfuseInitDurationMs: Number(langfuseInitDurationNs) / 1_000_000,
535
+ healthStatus,
536
+ message: "Langfuse observability initialized successfully",
537
+ });
538
+ }
539
+ else {
540
+ logger.warn(`[NeuroLink] ⚠️ LOG_POINT_C021_LANGFUSE_INIT_WARNING`, {
541
+ logPoint: "C021_LANGFUSE_INIT_WARNING",
542
+ constructorId,
543
+ timestamp: new Date().toISOString(),
544
+ elapsedMs: Date.now() - constructorStartTime,
545
+ elapsedNs: (process.hrtime.bigint() - constructorHrTimeStart).toString(),
546
+ langfuseInitDurationNs: langfuseInitDurationNs.toString(),
547
+ healthStatus,
548
+ message: "Langfuse initialized but not healthy",
549
+ });
550
+ }
551
+ }
552
+ else {
553
+ logger.debug(`[NeuroLink] 🚫 LOG_POINT_C022_LANGFUSE_DISABLED`, {
554
+ logPoint: "C022_LANGFUSE_DISABLED",
555
+ constructorId,
556
+ timestamp: new Date().toISOString(),
557
+ elapsedMs: Date.now() - constructorStartTime,
558
+ elapsedNs: (process.hrtime.bigint() - constructorHrTimeStart).toString(),
559
+ message: "Langfuse observability not enabled - skipping initialization",
560
+ });
561
+ }
562
+ }
563
+ catch (error) {
564
+ const langfuseInitErrorDurationNs = process.hrtime.bigint() - langfuseInitStartTime;
565
+ logger.error(`[NeuroLink] ❌ LOG_POINT_C023_LANGFUSE_INIT_ERROR`, {
566
+ logPoint: "C023_LANGFUSE_INIT_ERROR",
567
+ constructorId,
568
+ timestamp: new Date().toISOString(),
569
+ elapsedMs: Date.now() - constructorStartTime,
570
+ elapsedNs: (process.hrtime.bigint() - constructorHrTimeStart).toString(),
571
+ langfuseInitDurationNs: langfuseInitErrorDurationNs.toString(),
572
+ errorMessage: error instanceof Error ? error.message : String(error),
573
+ errorStack: error instanceof Error ? error.stack : undefined,
574
+ message: "Langfuse observability initialization failed",
575
+ });
576
+ }
577
+ }
497
578
  /**
498
579
  * Log constructor completion with final state summary
499
580
  */
@@ -992,6 +1073,68 @@ export class NeuroLink {
992
1073
  * @throws {Error} When all providers fail to generate content
993
1074
  * @throws {Error} When conversation memory operations fail (if enabled)
994
1075
  */
1076
+ /**
1077
+ * Get observability configuration
1078
+ */
1079
+ getObservabilityConfig() {
1080
+ return this.observabilityConfig;
1081
+ }
1082
+ /**
1083
+ * Check if Langfuse telemetry is enabled
1084
+ * Centralized utility to avoid duplication across providers
1085
+ */
1086
+ isTelemetryEnabled() {
1087
+ return this.observabilityConfig?.langfuse?.enabled || false;
1088
+ }
1089
+ /**
1090
+ * Public method to initialize Langfuse observability
1091
+ * This method can be called externally to ensure Langfuse is properly initialized
1092
+ */
1093
+ async initializeLangfuseObservability() {
1094
+ try {
1095
+ const langfuseConfig = this.observabilityConfig?.langfuse;
1096
+ if (langfuseConfig?.enabled) {
1097
+ initializeOpenTelemetry(langfuseConfig);
1098
+ logger.debug("[NeuroLink] Langfuse observability initialized via public method");
1099
+ }
1100
+ else {
1101
+ logger.debug("[NeuroLink] Langfuse not enabled, skipping initialization");
1102
+ }
1103
+ }
1104
+ catch (error) {
1105
+ logger.warn("[NeuroLink] Failed to initialize Langfuse observability:", error);
1106
+ }
1107
+ }
1108
+ /**
1109
+ * Gracefully shutdown NeuroLink and all MCP connections
1110
+ */
1111
+ async shutdown() {
1112
+ try {
1113
+ logger.debug("[NeuroLink] Starting graceful shutdown");
1114
+ try {
1115
+ await flushOpenTelemetry();
1116
+ await shutdownOpenTelemetry();
1117
+ logger.debug("[NeuroLink] OpenTelemetry shutdown completed");
1118
+ }
1119
+ catch (error) {
1120
+ logger.warn("[NeuroLink] OpenTelemetry shutdown failed:", error);
1121
+ }
1122
+ if (this.externalServerManager) {
1123
+ try {
1124
+ await this.externalServerManager.shutdown();
1125
+ logger.debug("[NeuroLink] MCP servers shutdown completed");
1126
+ }
1127
+ catch (error) {
1128
+ logger.warn("[NeuroLink] MCP servers shutdown failed:", error);
1129
+ }
1130
+ }
1131
+ logger.debug("[NeuroLink] Graceful shutdown completed");
1132
+ }
1133
+ catch (error) {
1134
+ logger.error("[NeuroLink] Shutdown failed:", error);
1135
+ throw error;
1136
+ }
1137
+ }
995
1138
  async generate(optionsOrPrompt) {
996
1139
  const originalPrompt = this._extractOriginalPrompt(optionsOrPrompt);
997
1140
  // Convert string prompt to full options
@@ -1910,15 +2053,16 @@ export class NeuroLink {
1910
2053
  customTools: this.getCustomTools(),
1911
2054
  executeTool: this.executeTool.bind(this),
1912
2055
  }, "NeuroLink.createMCPStream");
1913
- // Get conversation messages for context by creating a minimal TextGenerationOptions object
2056
+ // Get conversation messages for context
1914
2057
  const conversationMessages = await getConversationMessages(this.conversationMemory, {
1915
2058
  prompt: options.input.text,
1916
2059
  context: options.context,
1917
2060
  });
1918
- // Pass conversation history to stream just like in generate method
2061
+ // Let provider handle tools and system prompt automatically via Vercel AI SDK
2062
+ // This ensures proper tool integration in stream mode
1919
2063
  const streamResult = await provider.stream({
1920
2064
  ...options,
1921
- conversationMessages, // Inject conversation history
2065
+ conversationMessages,
1922
2066
  });
1923
2067
  return { stream: streamResult.stream, provider: providerName };
1924
2068
  }
@@ -1979,7 +2123,7 @@ export class NeuroLink {
1979
2123
  const originalPrompt = options.input.text;
1980
2124
  const responseTime = Date.now() - startTime;
1981
2125
  const providerName = await getBestProvider(options.provider);
1982
- const provider = await AIProviderFactory.createProvider(providerName, options.model, false);
2126
+ const provider = await AIProviderFactory.createProvider(providerName, options.model);
1983
2127
  const fallbackStreamResult = await provider.stream({
1984
2128
  input: { text: options.input.text },
1985
2129
  model: options.model,
@@ -3189,7 +3333,7 @@ export class NeuroLink {
3189
3333
  */
3190
3334
  async testProviderConnection(providerName) {
3191
3335
  const { AIProviderFactory } = await import("./core/factory.js");
3192
- const provider = await AIProviderFactory.createProvider(providerName, null, false);
3336
+ const provider = await AIProviderFactory.createProvider(providerName, null);
3193
3337
  await provider.generate({
3194
3338
  prompt: "test",
3195
3339
  maxTokens: 1,
@@ -3991,6 +4135,132 @@ export class NeuroLink {
3991
4135
  mcpLogger.error("[NeuroLink] Failed to unregister all external MCP tools from registry:", error);
3992
4136
  }
3993
4137
  }
4138
+ /**
4139
+ * Dispose of all resources and cleanup connections
4140
+ * Call this method when done using the NeuroLink instance to prevent resource leaks
4141
+ * Especially important in test environments where multiple instances are created
4142
+ */
4143
+ async dispose() {
4144
+ logger.debug("[NeuroLink] Starting disposal of resources...");
4145
+ const cleanupErrors = [];
4146
+ try {
4147
+ // 1. Flush and shutdown OpenTelemetry
4148
+ try {
4149
+ logger.debug("[NeuroLink] Flushing and shutting down OpenTelemetry...");
4150
+ await flushOpenTelemetry();
4151
+ await shutdownOpenTelemetry();
4152
+ logger.debug("[NeuroLink] OpenTelemetry shutdown successfully");
4153
+ }
4154
+ catch (error) {
4155
+ const err = error instanceof Error
4156
+ ? error
4157
+ : new Error(`OpenTelemetry shutdown error: ${String(error)}`);
4158
+ cleanupErrors.push(err);
4159
+ logger.warn("[NeuroLink] Error shutting down OpenTelemetry:", error);
4160
+ }
4161
+ // 2. Shutdown external MCP server connections
4162
+ if (this.externalServerManager) {
4163
+ try {
4164
+ logger.debug("[NeuroLink] Shutting down external MCP servers...");
4165
+ await this.externalServerManager.shutdown();
4166
+ logger.debug("[NeuroLink] External MCP servers shutdown successfully");
4167
+ }
4168
+ catch (error) {
4169
+ const err = error instanceof Error
4170
+ ? error
4171
+ : new Error(`External server shutdown error: ${String(error)}`);
4172
+ cleanupErrors.push(err);
4173
+ logger.warn("[NeuroLink] Error shutting down external MCP servers:", error);
4174
+ }
4175
+ }
4176
+ // 3. Clear all event listeners to prevent memory leaks
4177
+ if (this.emitter) {
4178
+ try {
4179
+ logger.debug("[NeuroLink] Removing all event listeners...");
4180
+ this.emitter.removeAllListeners();
4181
+ logger.debug("[NeuroLink] Event listeners removed successfully");
4182
+ }
4183
+ catch (error) {
4184
+ const err = error instanceof Error
4185
+ ? error
4186
+ : new Error(`Event emitter cleanup error: ${String(error)}`);
4187
+ cleanupErrors.push(err);
4188
+ logger.warn("[NeuroLink] Error removing event listeners:", error);
4189
+ }
4190
+ }
4191
+ // 4. Clear all circuit breakers
4192
+ if (this.toolCircuitBreakers && this.toolCircuitBreakers.size > 0) {
4193
+ try {
4194
+ logger.debug(`[NeuroLink] Clearing ${this.toolCircuitBreakers.size} circuit breakers...`);
4195
+ this.toolCircuitBreakers.clear();
4196
+ logger.debug("[NeuroLink] Circuit breakers cleared successfully");
4197
+ }
4198
+ catch (error) {
4199
+ const err = error instanceof Error
4200
+ ? error
4201
+ : new Error(`Circuit breaker cleanup error: ${String(error)}`);
4202
+ cleanupErrors.push(err);
4203
+ logger.warn("[NeuroLink] Error clearing circuit breakers:", error);
4204
+ }
4205
+ }
4206
+ // 5. Clear all Maps and caches
4207
+ try {
4208
+ logger.debug("[NeuroLink] Clearing maps and caches...");
4209
+ if (this.toolExecutionMetrics) {
4210
+ this.toolExecutionMetrics.clear();
4211
+ }
4212
+ if (this.activeToolExecutions) {
4213
+ this.activeToolExecutions.clear();
4214
+ }
4215
+ if (this.currentStreamToolExecutions) {
4216
+ this.currentStreamToolExecutions.length = 0;
4217
+ }
4218
+ if (this.toolExecutionHistory) {
4219
+ this.toolExecutionHistory.length = 0;
4220
+ }
4221
+ // Clear tool cache
4222
+ if (this.toolCache) {
4223
+ this.toolCache.tools = [];
4224
+ this.toolCache.timestamp = 0;
4225
+ }
4226
+ logger.debug("[NeuroLink] Maps and caches cleared successfully");
4227
+ }
4228
+ catch (error) {
4229
+ const err = error instanceof Error
4230
+ ? error
4231
+ : new Error(`Cache cleanup error: ${String(error)}`);
4232
+ cleanupErrors.push(err);
4233
+ logger.warn("[NeuroLink] Error clearing caches:", error);
4234
+ }
4235
+ // 6. Reset initialization flags
4236
+ try {
4237
+ logger.debug("[NeuroLink] Resetting initialization state...");
4238
+ this.mcpInitialized = false;
4239
+ this.conversationMemoryNeedsInit = false;
4240
+ logger.debug("[NeuroLink] Initialization state reset successfully");
4241
+ }
4242
+ catch (error) {
4243
+ const err = error instanceof Error
4244
+ ? error
4245
+ : new Error(`State reset error: ${String(error)}`);
4246
+ cleanupErrors.push(err);
4247
+ logger.warn("[NeuroLink] Error resetting state:", error);
4248
+ }
4249
+ // 6. Log completion
4250
+ if (cleanupErrors.length === 0) {
4251
+ logger.debug("[NeuroLink] ✅ Resource disposal completed successfully");
4252
+ }
4253
+ else {
4254
+ logger.warn(`[NeuroLink] ⚠️ Resource disposal completed with ${cleanupErrors.length} errors`, {
4255
+ errors: cleanupErrors.map((e) => e.message),
4256
+ });
4257
+ }
4258
+ }
4259
+ catch (error) {
4260
+ logger.error("[NeuroLink] Critical error during disposal:", error);
4261
+ throw error;
4262
+ }
4263
+ }
3994
4264
  }
3995
4265
  // Create default instance
3996
4266
  export const neurolink = new NeuroLink();
@@ -24,6 +24,7 @@ export declare class AmazonBedrockProvider extends BaseProvider {
24
24
  private executeSingleTool;
25
25
  private convertAISDKToolsToToolDefinitions;
26
26
  private formatToolsForBedrock;
27
+ private convertToBedrockMessages;
27
28
  getBedrockClient(): BedrockRuntimeClient;
28
29
  protected executeStream(options: StreamOptions): Promise<StreamResult>;
29
30
  private streamingConversationLoop;