@juspay/neurolink 1.10.0 → 1.11.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 (144) hide show
  1. package/CHANGELOG.md +43 -33
  2. package/README.md +16 -0
  3. package/dist/agent/direct-tools.d.ts +9 -9
  4. package/dist/cli/commands/agent-generate.d.ts +1 -2
  5. package/dist/cli/commands/agent-generate.js +5 -8
  6. package/dist/cli/commands/config.d.ts +2 -2
  7. package/dist/cli/commands/config.js +1 -1
  8. package/dist/cli/commands/mcp.js +91 -100
  9. package/dist/cli/commands/ollama.d.ts +2 -7
  10. package/dist/cli/commands/ollama.js +5 -8
  11. package/dist/cli/index.js +185 -276
  12. package/dist/core/factory.js +9 -10
  13. package/dist/index.d.ts +23 -0
  14. package/dist/index.js +35 -0
  15. package/dist/lib/agent/direct-tools.d.ts +9 -9
  16. package/dist/lib/core/factory.js +9 -10
  17. package/dist/lib/index.d.ts +23 -0
  18. package/dist/lib/index.js +35 -0
  19. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +39 -0
  20. package/dist/lib/mcp/adapters/plugin-bridge.js +82 -0
  21. package/dist/lib/mcp/auto-discovery.d.ts +38 -96
  22. package/dist/lib/mcp/auto-discovery.js +100 -744
  23. package/dist/lib/mcp/client.js +4 -4
  24. package/dist/lib/mcp/context-manager.js +72 -1
  25. package/dist/lib/mcp/contracts/mcp-contract.d.ts +162 -0
  26. package/dist/lib/mcp/contracts/mcp-contract.js +58 -0
  27. package/dist/lib/mcp/core/plugin-manager.d.ts +45 -0
  28. package/dist/lib/mcp/core/plugin-manager.js +110 -0
  29. package/dist/lib/mcp/demo/plugin-demo.d.ts +20 -0
  30. package/dist/lib/mcp/demo/plugin-demo.js +116 -0
  31. package/dist/lib/mcp/ecosystem.d.ts +75 -0
  32. package/dist/lib/mcp/ecosystem.js +161 -0
  33. package/dist/lib/mcp/external-client.d.ts +88 -0
  34. package/dist/lib/mcp/external-client.js +323 -0
  35. package/dist/lib/mcp/external-manager.d.ts +112 -0
  36. package/dist/lib/mcp/external-manager.js +302 -0
  37. package/dist/lib/mcp/factory.d.ts +4 -4
  38. package/dist/lib/mcp/function-calling.js +59 -34
  39. package/dist/lib/mcp/index.d.ts +39 -184
  40. package/dist/lib/mcp/index.js +72 -150
  41. package/dist/lib/mcp/initialize.js +5 -5
  42. package/dist/lib/mcp/logging.d.ts +27 -60
  43. package/dist/lib/mcp/logging.js +77 -165
  44. package/dist/lib/mcp/neurolink-mcp-client.js +31 -3
  45. package/dist/lib/mcp/orchestrator.d.ts +1 -1
  46. package/dist/lib/mcp/orchestrator.js +13 -12
  47. package/dist/lib/mcp/plugin-manager.d.ts +98 -0
  48. package/dist/lib/mcp/plugin-manager.js +294 -0
  49. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
  50. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +139 -0
  51. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +36 -0
  52. package/dist/lib/mcp/plugins/filesystem-mcp.js +54 -0
  53. package/dist/lib/mcp/registry.d.ts +27 -176
  54. package/dist/lib/mcp/registry.js +31 -372
  55. package/dist/lib/mcp/security-manager.d.ts +85 -0
  56. package/dist/lib/mcp/security-manager.js +344 -0
  57. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  58. package/dist/lib/mcp/tool-integration.d.ts +4 -14
  59. package/dist/lib/mcp/tool-integration.js +43 -21
  60. package/dist/lib/mcp/tool-registry.d.ts +66 -0
  61. package/dist/lib/mcp/tool-registry.js +160 -0
  62. package/dist/lib/mcp/unified-mcp.d.ts +123 -0
  63. package/dist/lib/mcp/unified-mcp.js +246 -0
  64. package/dist/lib/mcp/unified-registry.d.ts +42 -229
  65. package/dist/lib/mcp/unified-registry.js +96 -1346
  66. package/dist/lib/neurolink.d.ts +3 -4
  67. package/dist/lib/neurolink.js +17 -18
  68. package/dist/lib/providers/agent-enhanced-provider.js +2 -2
  69. package/dist/lib/providers/amazonBedrock.js +2 -2
  70. package/dist/lib/providers/anthropic.js +3 -3
  71. package/dist/lib/providers/azureOpenAI.js +3 -3
  72. package/dist/lib/providers/function-calling-provider.js +34 -25
  73. package/dist/lib/providers/googleAIStudio.js +9 -3
  74. package/dist/lib/providers/googleVertexAI.js +2 -2
  75. package/dist/lib/providers/huggingFace.js +2 -2
  76. package/dist/lib/providers/mcp-provider.js +33 -5
  77. package/dist/lib/providers/mistralAI.js +2 -2
  78. package/dist/lib/providers/ollama.js +2 -2
  79. package/dist/lib/providers/openAI.js +2 -2
  80. package/dist/lib/utils/providerUtils-fixed.js +9 -9
  81. package/dist/mcp/adapters/plugin-bridge.d.ts +39 -0
  82. package/dist/mcp/adapters/plugin-bridge.js +82 -0
  83. package/dist/mcp/auto-discovery.d.ts +38 -96
  84. package/dist/mcp/auto-discovery.js +100 -745
  85. package/dist/mcp/client.js +4 -4
  86. package/dist/mcp/context-manager.js +72 -1
  87. package/dist/mcp/contracts/mcp-contract.d.ts +162 -0
  88. package/dist/mcp/contracts/mcp-contract.js +58 -0
  89. package/dist/mcp/core/plugin-manager.d.ts +45 -0
  90. package/dist/mcp/core/plugin-manager.js +110 -0
  91. package/dist/mcp/demo/plugin-demo.d.ts +20 -0
  92. package/dist/mcp/demo/plugin-demo.js +116 -0
  93. package/dist/mcp/ecosystem.d.ts +75 -0
  94. package/dist/mcp/ecosystem.js +162 -0
  95. package/dist/mcp/external-client.d.ts +88 -0
  96. package/dist/mcp/external-client.js +323 -0
  97. package/dist/mcp/external-manager.d.ts +112 -0
  98. package/dist/mcp/external-manager.js +302 -0
  99. package/dist/mcp/factory.d.ts +4 -4
  100. package/dist/mcp/function-calling.js +59 -34
  101. package/dist/mcp/index.d.ts +39 -184
  102. package/dist/mcp/index.js +72 -150
  103. package/dist/mcp/initialize.js +5 -5
  104. package/dist/mcp/logging.d.ts +27 -60
  105. package/dist/mcp/logging.js +77 -165
  106. package/dist/mcp/neurolink-mcp-client.js +31 -3
  107. package/dist/mcp/orchestrator.d.ts +1 -1
  108. package/dist/mcp/orchestrator.js +13 -12
  109. package/dist/mcp/plugin-manager.d.ts +98 -0
  110. package/dist/mcp/plugin-manager.js +295 -0
  111. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
  112. package/dist/mcp/plugins/core/filesystem-mcp.js +139 -0
  113. package/dist/mcp/plugins/core/neurolink-mcp.json +17 -0
  114. package/dist/mcp/plugins/filesystem-mcp.d.ts +36 -0
  115. package/dist/mcp/plugins/filesystem-mcp.js +54 -0
  116. package/dist/mcp/registry.d.ts +27 -176
  117. package/dist/mcp/registry.js +31 -372
  118. package/dist/mcp/security-manager.d.ts +85 -0
  119. package/dist/mcp/security-manager.js +344 -0
  120. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  121. package/dist/mcp/tool-integration.d.ts +4 -14
  122. package/dist/mcp/tool-integration.js +43 -21
  123. package/dist/mcp/tool-registry.d.ts +66 -0
  124. package/dist/mcp/tool-registry.js +160 -0
  125. package/dist/mcp/unified-mcp.d.ts +123 -0
  126. package/dist/mcp/unified-mcp.js +246 -0
  127. package/dist/mcp/unified-registry.d.ts +42 -229
  128. package/dist/mcp/unified-registry.js +96 -1345
  129. package/dist/neurolink.d.ts +3 -4
  130. package/dist/neurolink.js +17 -18
  131. package/dist/providers/agent-enhanced-provider.js +2 -2
  132. package/dist/providers/amazonBedrock.js +2 -2
  133. package/dist/providers/anthropic.js +3 -3
  134. package/dist/providers/azureOpenAI.js +3 -3
  135. package/dist/providers/function-calling-provider.js +34 -25
  136. package/dist/providers/googleAIStudio.js +9 -3
  137. package/dist/providers/googleVertexAI.js +2 -2
  138. package/dist/providers/huggingFace.js +2 -2
  139. package/dist/providers/mcp-provider.js +33 -5
  140. package/dist/providers/mistralAI.js +2 -2
  141. package/dist/providers/ollama.js +2 -2
  142. package/dist/providers/openAI.js +2 -2
  143. package/dist/utils/providerUtils-fixed.js +9 -9
  144. package/package.json +1 -1
@@ -2,8 +2,7 @@
2
2
  * NeuroLink - Unified AI Interface with Real MCP Tool Integration
3
3
  *
4
4
  * Enhanced AI provider system with natural MCP tool access.
5
- * Uses real MCP infrastructure for // Initialize MCP with enhanced error handling
6
- await this.initializeMCP();tool discovery and execution.
5
+ * Uses real MCP infrastructure for tool discovery and execution.
7
6
  */
8
7
  import type { AIProviderName } from "./core/types.js";
9
8
  export interface TextGenerationOptions {
@@ -107,8 +106,8 @@ export declare class NeuroLink {
107
106
  autoDiscoveredServers: {
108
107
  id: string;
109
108
  name: string;
110
- source: import("./mcp/unified-registry.js").ServerSource;
111
- status: "unknown" | "available" | "unavailable" | "activated";
109
+ source: "core" | "project" | "installed";
110
+ status: string;
112
111
  hasServer: boolean;
113
112
  }[];
114
113
  }>;
package/dist/neurolink.js CHANGED
@@ -2,14 +2,13 @@
2
2
  * NeuroLink - Unified AI Interface with Real MCP Tool Integration
3
3
  *
4
4
  * Enhanced AI provider system with natural MCP tool access.
5
- * Uses real MCP infrastructure for // Initialize MCP with enhanced error handling
6
- await this.initializeMCP();tool discovery and execution.
5
+ * Uses real MCP infrastructure for tool discovery and execution.
7
6
  */
8
7
  import { AIProviderFactory } from "./index.js";
9
8
  import { ContextManager } from "./mcp/context-manager.js";
10
9
  import { mcpLogger } from "./mcp/logging.js";
11
- import { getDefaultToolRegistry } from "./mcp/registry.js";
12
- import { defaultUnifiedRegistry } from "./mcp/unified-registry.js";
10
+ import { toolRegistry } from "./mcp/tool-registry.js";
11
+ import { unifiedRegistry } from "./mcp/unified-registry.js";
13
12
  import { logger } from "./utils/logger.js";
14
13
  import { getBestProvider } from "./utils/providerUtils-fixed.js";
15
14
  export class NeuroLink {
@@ -105,11 +104,11 @@ export class NeuroLink {
105
104
  prompt: options.prompt.substring(0, 100) + "...",
106
105
  contextId: context.sessionId,
107
106
  });
108
- // Get available tools from default registry (simplified approach)
107
+ // Get available tools from tool registry (simplified approach)
109
108
  let availableTools = [];
110
109
  try {
111
- // Use getDefaultToolRegistry() to avoid circular dependencies
112
- const allTools = getDefaultToolRegistry().listTools();
110
+ // Use toolRegistry directly instead of unified registry to avoid hanging
111
+ const allTools = await toolRegistry.listTools();
113
112
  availableTools = allTools.map((tool) => ({
114
113
  name: tool.name,
115
114
  description: tool.description || "No description available",
@@ -398,29 +397,29 @@ Note: Tool integration is currently in development. Please provide helpful respo
398
397
  * Get access to the unified MCP registry for tool inspection and management
399
398
  */
400
399
  getUnifiedRegistry() {
401
- return defaultUnifiedRegistry;
400
+ return unifiedRegistry;
402
401
  }
403
402
  /**
404
403
  * Initialize MCP and return discovery statistics
405
404
  */
406
405
  async getMCPStatus() {
407
406
  await this.initializeMCP();
408
- const totalServers = defaultUnifiedRegistry.getTotalServerCount();
409
- const availableServers = defaultUnifiedRegistry.getAvailableServerCount();
410
- const autoDiscoveredServers = defaultUnifiedRegistry.getAutoDiscoveredServers();
411
- const allTools = await defaultUnifiedRegistry.listAllTools();
407
+ const totalServers = unifiedRegistry.getTotalServerCount();
408
+ const availableServers = unifiedRegistry.getAvailableServerCount();
409
+ const autoDiscoveredServers = unifiedRegistry.getAutoDiscoveredServers();
410
+ const allTools = await unifiedRegistry.listAllTools();
412
411
  return {
413
412
  mcpInitialized: this.mcpInitialized,
414
413
  totalServers,
415
414
  availableServers,
416
- autoDiscoveredCount: autoDiscoveredServers.size,
415
+ autoDiscoveredCount: autoDiscoveredServers.length,
417
416
  totalTools: allTools.length,
418
- autoDiscoveredServers: Array.from(autoDiscoveredServers.entries()).map(([id, server]) => ({
419
- id: server.id,
420
- name: server.config?.name || id,
417
+ autoDiscoveredServers: autoDiscoveredServers.map((server) => ({
418
+ id: server.metadata.name,
419
+ name: server.metadata.name,
421
420
  source: server.source,
422
- status: server.status,
423
- hasServer: !!server.server,
421
+ status: "discovered",
422
+ hasServer: true,
424
423
  })),
425
424
  };
426
425
  }
@@ -41,7 +41,7 @@ export class AgentEnhancedProvider {
41
41
  const options = typeof optionsOrPrompt === "string"
42
42
  ? { prompt: optionsOrPrompt }
43
43
  : optionsOrPrompt;
44
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt, schema, } = options;
44
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, schema, } = options;
45
45
  // Get tools if enabled
46
46
  const tools = this.config.enableTools
47
47
  ? getToolsForCategory(this.config.toolCategory)
@@ -70,7 +70,7 @@ export class AgentEnhancedProvider {
70
70
  const options = typeof optionsOrPrompt === "string"
71
71
  ? { prompt: optionsOrPrompt }
72
72
  : optionsOrPrompt;
73
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt, } = options;
73
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, } = options;
74
74
  // Get tools if enabled
75
75
  const tools = this.config.enableTools
76
76
  ? getToolsForCategory(this.config.toolCategory)
@@ -128,7 +128,7 @@ export class AmazonBedrock {
128
128
  const options = typeof optionsOrPrompt === "string"
129
129
  ? { prompt: optionsOrPrompt }
130
130
  : optionsOrPrompt;
131
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
131
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
132
132
  // Use schema from options or fallback parameter
133
133
  const finalSchema = schema || analysisSchema;
134
134
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -214,7 +214,7 @@ export class AmazonBedrock {
214
214
  const options = typeof optionsOrPrompt === "string"
215
215
  ? { prompt: optionsOrPrompt }
216
216
  : optionsOrPrompt;
217
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
217
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
218
218
  // Use schema from options or fallback parameter
219
219
  const finalSchema = schema || analysisSchema;
220
220
  logger.debug(`[${functionTag}] Generate text started`, {
@@ -57,7 +57,7 @@ export class AnthropicProvider {
57
57
  const options = typeof optionsOrPrompt === "string"
58
58
  ? { prompt: optionsOrPrompt }
59
59
  : optionsOrPrompt;
60
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
60
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
61
61
  logger.debug(`[AnthropicProvider.generateText] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}`);
62
62
  const requestBody = {
63
63
  model: this.getModel(),
@@ -99,7 +99,7 @@ export class AnthropicProvider {
99
99
  const options = typeof optionsOrPrompt === "string"
100
100
  ? { prompt: optionsOrPrompt }
101
101
  : optionsOrPrompt;
102
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
102
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
103
103
  logger.debug(`[AnthropicProvider.streamText] Streaming prompt: "${prompt.substring(0, 100)}..."`);
104
104
  const requestBody = {
105
105
  model: this.getModel(),
@@ -179,7 +179,7 @@ export class AnthropicProvider {
179
179
  const options = typeof optionsOrPrompt === "string"
180
180
  ? { prompt: optionsOrPrompt }
181
181
  : optionsOrPrompt;
182
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
182
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
183
183
  logger.debug(`[AnthropicProvider.generateTextStream] Streaming prompt: "${prompt.substring(0, 100)}..."`);
184
184
  const requestBody = {
185
185
  model: this.getModel(),
@@ -70,7 +70,7 @@ export class AzureOpenAIProvider {
70
70
  const options = typeof optionsOrPrompt === "string"
71
71
  ? { prompt: optionsOrPrompt }
72
72
  : optionsOrPrompt;
73
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are a helpful AI assistant.", } = options;
73
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
74
74
  logger.debug(`[AzureOpenAIProvider.generateText] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}`);
75
75
  const messages = [];
76
76
  if (systemPrompt) {
@@ -116,7 +116,7 @@ export class AzureOpenAIProvider {
116
116
  const options = typeof optionsOrPrompt === "string"
117
117
  ? { prompt: optionsOrPrompt }
118
118
  : optionsOrPrompt;
119
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are a helpful AI assistant.", } = options;
119
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
120
120
  logger.debug(`[AzureOpenAIProvider.streamText] Streaming prompt: "${prompt.substring(0, 100)}..."`);
121
121
  const messages = [];
122
122
  if (systemPrompt) {
@@ -200,7 +200,7 @@ export class AzureOpenAIProvider {
200
200
  const options = typeof optionsOrPrompt === "string"
201
201
  ? { prompt: optionsOrPrompt }
202
202
  : optionsOrPrompt;
203
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = "You are a helpful AI assistant.", } = options;
203
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
204
204
  logger.debug(`[AzureOpenAIProvider.generateTextStream] Streaming prompt: "${prompt.substring(0, 100)}..."`);
205
205
  const messages = [];
206
206
  if (systemPrompt) {
@@ -200,28 +200,32 @@ export class FunctionCallingProvider {
200
200
  description: tool.description,
201
201
  parameters: tool.parameters,
202
202
  execute: async (args) => {
203
- // Enhanced debug logging for Gemini debugging
204
- const providerName = this.baseProvider.constructor.name;
205
- console.log(`[GEMINI DEBUG] Provider: ${providerName}`);
206
- console.log(`[GEMINI DEBUG] Tool: ${sanitizedToolName} (original: ${originalToolName})`);
207
- console.log(`[GEMINI DEBUG] Args received:`, JSON.stringify(args, null, 2));
208
- console.log(`[GEMINI DEBUG] Args type:`, typeof args);
209
- console.log(`[GEMINI DEBUG] Args keys:`, Object.keys(args));
203
+ // Debug logging only in debug mode
204
+ if (process.env.NEUROLINK_DEBUG === "true") {
205
+ const providerName = this.baseProvider.constructor.name;
206
+ mcpLogger.debug(`Tool execution - Provider: ${providerName}`);
207
+ mcpLogger.debug(`Tool: ${sanitizedToolName} (original: ${originalToolName})`);
208
+ mcpLogger.debug("Args received:", args);
209
+ }
210
210
  mcpLogger.debug(`[${functionTag}] Executing MCP tool: ${sanitizedToolName} (original: ${originalToolName}, ${toolInfo?.serverId}.${toolInfo?.toolName})`, args);
211
211
  try {
212
212
  if (toolInfo) {
213
213
  const mcpToolName = `${toolInfo.serverId}.${toolInfo.toolName}`;
214
- // Log exactly what we're sending to executeFunctionCall
215
- console.log(`[GEMINI DEBUG] Calling executeFunctionCall with:`);
216
- console.log(`[GEMINI DEBUG] - mcpToolName:`, mcpToolName);
217
- console.log(`[GEMINI DEBUG] - args:`, args);
214
+ // Log execution details in debug mode only
215
+ if (process.env.NEUROLINK_DEBUG === "true") {
216
+ mcpLogger.debug("Calling executeFunctionCall with:", {
217
+ mcpToolName,
218
+ args,
219
+ });
220
+ }
218
221
  const result = await executeFunctionCall(mcpToolName, args, context);
219
- console.log(`[GEMINI DEBUG] Tool execution result:`, {
220
- success: result.success,
221
- hasData: !!result.data,
222
- error: result.error,
223
- data: result.data,
224
- });
222
+ if (process.env.NEUROLINK_DEBUG === "true") {
223
+ mcpLogger.debug("Tool execution result:", {
224
+ success: result.success,
225
+ hasData: !!result.data,
226
+ error: result.error,
227
+ });
228
+ }
225
229
  mcpLogger.debug(`[${functionTag}] Tool execution result for ${sanitizedToolName}:`, {
226
230
  success: result.success,
227
231
  hasData: !!result.data,
@@ -242,7 +246,9 @@ export class FunctionCallingProvider {
242
246
  return { success: false, error: "Tool mapping not found" };
243
247
  }
244
248
  catch (error) {
245
- console.log(`[GEMINI DEBUG] Tool execution error:`, error);
249
+ if (process.env.NEUROLINK_DEBUG === "true") {
250
+ mcpLogger.debug("Tool execution error:", error);
251
+ }
246
252
  mcpLogger.error(`[${functionTag}] Tool execution failed for ${sanitizedToolName}:`, error);
247
253
  return {
248
254
  error: error instanceof Error ? error.message : String(error),
@@ -252,13 +258,16 @@ export class FunctionCallingProvider {
252
258
  };
253
259
  });
254
260
  mcpLogger.debug(`[${functionTag}] Converted ${Object.keys(convertedTools).length} tools for AI SDK:`, Object.keys(convertedTools));
255
- // Log first tool details for debugging
256
- const firstToolName = Object.keys(convertedTools)[0];
257
- if (firstToolName) {
258
- console.log(`[GEMINI DEBUG] First tool details:`);
259
- console.log(`[GEMINI DEBUG] - Name:`, firstToolName);
260
- console.log(`[GEMINI DEBUG] - Description:`, convertedTools[firstToolName].description);
261
- console.log(`[GEMINI DEBUG] - Parameters:`, convertedTools[firstToolName].parameters);
261
+ // Log first tool details for debugging in debug mode only
262
+ if (process.env.NEUROLINK_DEBUG === "true") {
263
+ const firstToolName = Object.keys(convertedTools)[0];
264
+ if (firstToolName) {
265
+ mcpLogger.debug("First tool details:", {
266
+ name: firstToolName,
267
+ description: convertedTools[firstToolName].description,
268
+ parameters: convertedTools[firstToolName].parameters,
269
+ });
270
+ }
262
271
  }
263
272
  return convertedTools;
264
273
  }
@@ -7,9 +7,15 @@ const DEFAULT_SYSTEM_CONTEXT = {
7
7
  };
8
8
  // Configuration helpers
9
9
  const getGoogleAIApiKey = () => {
10
+ // Check for both possible environment variables
10
11
  const apiKey = process.env.GOOGLE_AI_API_KEY || process.env.GOOGLE_GENERATIVE_AI_API_KEY;
11
12
  if (!apiKey) {
12
- throw new Error("GOOGLE_AI_API_KEY environment variable is not set");
13
+ throw new Error("GOOGLE_AI_API_KEY or GOOGLE_GENERATIVE_AI_API_KEY environment variable is not set");
14
+ }
15
+ // Ensure GOOGLE_GENERATIVE_AI_API_KEY is set for @ai-sdk/google compatibility
16
+ // The AI SDK specifically looks for this variable name
17
+ if (!process.env.GOOGLE_GENERATIVE_AI_API_KEY && process.env.GOOGLE_AI_API_KEY) {
18
+ process.env.GOOGLE_GENERATIVE_AI_API_KEY = process.env.GOOGLE_AI_API_KEY;
13
19
  }
14
20
  return apiKey;
15
21
  };
@@ -95,7 +101,7 @@ export class GoogleAIStudio {
95
101
  const options = typeof optionsOrPrompt === "string"
96
102
  ? { prompt: optionsOrPrompt }
97
103
  : optionsOrPrompt;
98
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
104
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
99
105
  // Use schema from options or fallback parameter
100
106
  const finalSchema = schema || analysisSchema;
101
107
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -186,7 +192,7 @@ export class GoogleAIStudio {
186
192
  const options = typeof optionsOrPrompt === "string"
187
193
  ? { prompt: optionsOrPrompt }
188
194
  : optionsOrPrompt;
189
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
195
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
190
196
  // Use schema from options or fallback parameter
191
197
  const finalSchema = schema || analysisSchema;
192
198
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -285,7 +285,7 @@ export class GoogleVertexAI {
285
285
  const options = typeof optionsOrPrompt === "string"
286
286
  ? { prompt: optionsOrPrompt }
287
287
  : optionsOrPrompt;
288
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
288
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
289
289
  // Use schema from options or fallback parameter
290
290
  const finalSchema = schema || analysisSchema;
291
291
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -372,7 +372,7 @@ export class GoogleVertexAI {
372
372
  const options = typeof optionsOrPrompt === "string"
373
373
  ? { prompt: optionsOrPrompt }
374
374
  : optionsOrPrompt;
375
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
375
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
376
376
  // Use schema from options or fallback parameter
377
377
  const finalSchema = schema || analysisSchema;
378
378
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -228,7 +228,7 @@ export class HuggingFace {
228
228
  const options = typeof optionsOrPrompt === "string"
229
229
  ? { prompt: optionsOrPrompt }
230
230
  : optionsOrPrompt;
231
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
231
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
232
232
  // Use schema from options or fallback parameter
233
233
  const finalSchema = schema || analysisSchema;
234
234
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -316,7 +316,7 @@ export class HuggingFace {
316
316
  const options = typeof optionsOrPrompt === "string"
317
317
  ? { prompt: optionsOrPrompt }
318
318
  : optionsOrPrompt;
319
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
319
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
320
320
  // Use schema from options or fallback parameter
321
321
  const finalSchema = schema || analysisSchema;
322
322
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -30,18 +30,46 @@ export class MCPAwareProvider {
30
30
  try {
31
31
  // Get or create MCP client for this session
32
32
  const mcpClient = getMCPManager(this.sessionId, {
33
- userId: this.config.userId,
34
- aiProvider: this.config.providerName,
33
+ userId: this.config.userId || "anonymous",
34
+ aiProvider: this.config.providerName || "unknown",
35
35
  modelId: this.config.modelName,
36
36
  });
37
37
  // Create execution context
38
38
  const context = {
39
39
  sessionId: this.sessionId,
40
- userId: this.config.userId,
41
- organizationId: this.config.organizationId,
42
- aiProvider: this.config.providerName,
40
+ userId: this.config.userId || "anonymous",
41
+ organizationId: this.config.organizationId || "default",
42
+ aiProvider: this.config.providerName || "unknown",
43
43
  modelId: this.config.modelName,
44
44
  timestamp: Date.now(),
45
+ // Required properties
46
+ secureFS: {
47
+ readFile: async () => {
48
+ throw new Error("secureFS not configured");
49
+ },
50
+ writeFile: async () => {
51
+ throw new Error("secureFS not configured");
52
+ },
53
+ readdir: async () => {
54
+ throw new Error("secureFS not configured");
55
+ },
56
+ stat: async () => {
57
+ throw new Error("secureFS not configured");
58
+ },
59
+ mkdir: async () => {
60
+ throw new Error("secureFS not configured");
61
+ },
62
+ exists: async () => false,
63
+ },
64
+ path: {
65
+ join: (...paths) => require("path").join(...paths),
66
+ resolve: (...paths) => require("path").resolve(...paths),
67
+ relative: (from, to) => require("path").relative(from, to),
68
+ dirname: (path) => require("path").dirname(path),
69
+ basename: (path, ext) => require("path").basename(path, ext),
70
+ },
71
+ grantedPermissions: [],
72
+ log: console.log,
45
73
  };
46
74
  // Initialize all MCP tools
47
75
  initializeMCPTools(this.sessionId, mcpClient, context);
@@ -88,7 +88,7 @@ export class MistralAI {
88
88
  const options = typeof optionsOrPrompt === "string"
89
89
  ? { prompt: optionsOrPrompt }
90
90
  : optionsOrPrompt;
91
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
91
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
92
92
  // Use schema from options or fallback parameter
93
93
  const finalSchema = schema || analysisSchema;
94
94
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -176,7 +176,7 @@ export class MistralAI {
176
176
  const options = typeof optionsOrPrompt === "string"
177
177
  ? { prompt: optionsOrPrompt }
178
178
  : optionsOrPrompt;
179
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
179
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
180
180
  // Use schema from options or fallback parameter
181
181
  const finalSchema = schema || analysisSchema;
182
182
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -388,7 +388,7 @@ export class Ollama {
388
388
  const options = typeof optionsOrPrompt === "string"
389
389
  ? { prompt: optionsOrPrompt }
390
390
  : optionsOrPrompt;
391
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
391
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
392
392
  // Use schema from options or fallback parameter
393
393
  const finalSchema = schema || analysisSchema;
394
394
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -446,7 +446,7 @@ export class Ollama {
446
446
  const options = typeof optionsOrPrompt === "string"
447
447
  ? { prompt: optionsOrPrompt }
448
448
  : optionsOrPrompt;
449
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
449
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
450
450
  // Use schema from options or fallback parameter
451
451
  const finalSchema = schema || analysisSchema;
452
452
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -59,7 +59,7 @@ export class OpenAI {
59
59
  const options = typeof optionsOrPrompt === "string"
60
60
  ? { prompt: optionsOrPrompt }
61
61
  : optionsOrPrompt;
62
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
62
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
63
63
  // Use schema from options or fallback parameter
64
64
  const finalSchema = schema || analysisSchema;
65
65
  logger.debug(`[${functionTag}] Stream text started`, {
@@ -136,7 +136,7 @@ export class OpenAI {
136
136
  const options = typeof optionsOrPrompt === "string"
137
137
  ? { prompt: optionsOrPrompt }
138
138
  : optionsOrPrompt;
139
- const { prompt, temperature = 0.7, maxTokens = 500, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
139
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
140
140
  // Use schema from options or fallback parameter
141
141
  const finalSchema = schema || analysisSchema;
142
142
  logger.debug(`[${functionTag}] Generate text started`, {
@@ -1,6 +1,6 @@
1
- import { AIProviderFactory } from '../core/factory.js';
2
- import { logger } from './logger.js';
3
- import { hasProviderEnvVars } from './providerUtils.js';
1
+ import { AIProviderFactory } from "../core/factory.js";
2
+ import { logger } from "./logger.js";
3
+ import { hasProviderEnvVars } from "./providerUtils.js";
4
4
  /**
5
5
  * Asynchronously get the best available provider based on real-time checks.
6
6
  * This function performs actual authentication and availability tests.
@@ -20,7 +20,7 @@ export async function getBestProvider(requestedProvider) {
20
20
  "bedrock",
21
21
  "ollama",
22
22
  ];
23
- if (requestedProvider && requestedProvider !== 'auto') {
23
+ if (requestedProvider && requestedProvider !== "auto") {
24
24
  if (await isProviderAvailable(requestedProvider)) {
25
25
  logger.debug(`[getBestProvider] Using requested provider: ${requestedProvider}`);
26
26
  return requestedProvider;
@@ -44,14 +44,14 @@ export async function getBestProvider(requestedProvider) {
44
44
  * @returns True if the provider is available and authenticated.
45
45
  */
46
46
  async function isProviderAvailable(providerName) {
47
- if (!hasProviderEnvVars(providerName) && providerName !== 'ollama') {
47
+ if (!hasProviderEnvVars(providerName) && providerName !== "ollama") {
48
48
  return false;
49
49
  }
50
- if (providerName === 'ollama') {
50
+ if (providerName === "ollama") {
51
51
  try {
52
- const response = await fetch('http://localhost:11434/api/tags', {
53
- method: 'GET',
54
- signal: AbortSignal.timeout(2000)
52
+ const response = await fetch("http://localhost:11434/api/tags", {
53
+ method: "GET",
54
+ signal: AbortSignal.timeout(2000),
55
55
  });
56
56
  if (response.ok) {
57
57
  const { models } = await response.json();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "Universal AI Development Platform with working MCP integration, multi-provider support, and professional CLI. Built-in tools operational, 58+ external MCP servers discoverable. Connect to filesystem, GitHub, database operations, and more. Build, test, and deploy AI applications with 9 major providers: OpenAI, Anthropic, Google AI, AWS Bedrock, Azure, Hugging Face, Ollama, and Mistral AI.",
5
5
  "author": {
6
6
  "name": "Juspay Technologies",