@juspay/neurolink 1.6.0 → 1.9.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 (176) hide show
  1. package/CHANGELOG.md +193 -7
  2. package/README.md +100 -17
  3. package/dist/agent/direct-tools.d.ts +1203 -0
  4. package/dist/agent/direct-tools.js +387 -0
  5. package/dist/cli/commands/agent-generate.d.ts +2 -0
  6. package/dist/cli/commands/agent-generate.js +70 -0
  7. package/dist/cli/commands/config.d.ts +6 -6
  8. package/dist/cli/commands/config.js +326 -273
  9. package/dist/cli/commands/mcp.d.ts +2 -1
  10. package/dist/cli/commands/mcp.js +874 -146
  11. package/dist/cli/commands/ollama.d.ts +1 -1
  12. package/dist/cli/commands/ollama.js +153 -143
  13. package/dist/cli/index.js +589 -323
  14. package/dist/cli/utils/complete-setup.d.ts +19 -0
  15. package/dist/cli/utils/complete-setup.js +81 -0
  16. package/dist/cli/utils/env-manager.d.ts +44 -0
  17. package/dist/cli/utils/env-manager.js +226 -0
  18. package/dist/cli/utils/interactive-setup.d.ts +48 -0
  19. package/dist/cli/utils/interactive-setup.js +302 -0
  20. package/dist/core/dynamic-models.d.ts +208 -0
  21. package/dist/core/dynamic-models.js +250 -0
  22. package/dist/core/factory.d.ts +13 -6
  23. package/dist/core/factory.js +176 -61
  24. package/dist/core/types.d.ts +4 -2
  25. package/dist/core/types.js +4 -4
  26. package/dist/index.d.ts +16 -16
  27. package/dist/index.js +16 -16
  28. package/dist/lib/agent/direct-tools.d.ts +1203 -0
  29. package/dist/lib/agent/direct-tools.js +387 -0
  30. package/dist/lib/core/dynamic-models.d.ts +208 -0
  31. package/dist/lib/core/dynamic-models.js +250 -0
  32. package/dist/lib/core/factory.d.ts +13 -6
  33. package/dist/lib/core/factory.js +176 -61
  34. package/dist/lib/core/types.d.ts +4 -2
  35. package/dist/lib/core/types.js +4 -4
  36. package/dist/lib/index.d.ts +16 -16
  37. package/dist/lib/index.js +16 -16
  38. package/dist/lib/mcp/auto-discovery.d.ts +120 -0
  39. package/dist/lib/mcp/auto-discovery.js +793 -0
  40. package/dist/lib/mcp/client.d.ts +66 -0
  41. package/dist/lib/mcp/client.js +245 -0
  42. package/dist/lib/mcp/config.d.ts +31 -0
  43. package/dist/lib/mcp/config.js +74 -0
  44. package/dist/lib/mcp/context-manager.d.ts +4 -4
  45. package/dist/lib/mcp/context-manager.js +24 -18
  46. package/dist/lib/mcp/factory.d.ts +28 -11
  47. package/dist/lib/mcp/factory.js +36 -29
  48. package/dist/lib/mcp/function-calling.d.ts +51 -0
  49. package/dist/lib/mcp/function-calling.js +510 -0
  50. package/dist/lib/mcp/index.d.ts +190 -0
  51. package/dist/lib/mcp/index.js +156 -0
  52. package/dist/lib/mcp/initialize-tools.d.ts +28 -0
  53. package/dist/lib/mcp/initialize-tools.js +209 -0
  54. package/dist/lib/mcp/initialize.d.ts +17 -0
  55. package/dist/lib/mcp/initialize.js +51 -0
  56. package/dist/lib/mcp/logging.d.ts +71 -0
  57. package/dist/lib/mcp/logging.js +183 -0
  58. package/dist/lib/mcp/manager.d.ts +67 -0
  59. package/dist/lib/mcp/manager.js +176 -0
  60. package/dist/lib/mcp/neurolink-mcp-client.d.ts +96 -0
  61. package/dist/lib/mcp/neurolink-mcp-client.js +417 -0
  62. package/dist/lib/mcp/orchestrator.d.ts +3 -3
  63. package/dist/lib/mcp/orchestrator.js +46 -43
  64. package/dist/lib/mcp/registry.d.ts +2 -2
  65. package/dist/lib/mcp/registry.js +42 -33
  66. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
  67. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +204 -65
  68. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +142 -102
  69. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
  70. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +197 -142
  71. package/dist/lib/mcp/servers/utilities/utility-server.d.ts +8 -0
  72. package/dist/lib/mcp/servers/utilities/utility-server.js +326 -0
  73. package/dist/lib/mcp/tool-integration.d.ts +67 -0
  74. package/dist/lib/mcp/tool-integration.js +179 -0
  75. package/dist/lib/mcp/unified-registry.d.ts +269 -0
  76. package/dist/lib/mcp/unified-registry.js +1411 -0
  77. package/dist/lib/neurolink.d.ts +68 -6
  78. package/dist/lib/neurolink.js +304 -42
  79. package/dist/lib/providers/agent-enhanced-provider.d.ts +59 -0
  80. package/dist/lib/providers/agent-enhanced-provider.js +242 -0
  81. package/dist/lib/providers/amazonBedrock.d.ts +3 -3
  82. package/dist/lib/providers/amazonBedrock.js +54 -50
  83. package/dist/lib/providers/anthropic.d.ts +2 -2
  84. package/dist/lib/providers/anthropic.js +92 -84
  85. package/dist/lib/providers/azureOpenAI.d.ts +2 -2
  86. package/dist/lib/providers/azureOpenAI.js +97 -86
  87. package/dist/lib/providers/function-calling-provider.d.ts +70 -0
  88. package/dist/lib/providers/function-calling-provider.js +359 -0
  89. package/dist/lib/providers/googleAIStudio.d.ts +10 -5
  90. package/dist/lib/providers/googleAIStudio.js +60 -38
  91. package/dist/lib/providers/googleVertexAI.d.ts +3 -3
  92. package/dist/lib/providers/googleVertexAI.js +96 -86
  93. package/dist/lib/providers/huggingFace.d.ts +3 -3
  94. package/dist/lib/providers/huggingFace.js +70 -63
  95. package/dist/lib/providers/index.d.ts +11 -11
  96. package/dist/lib/providers/index.js +18 -18
  97. package/dist/lib/providers/mcp-provider.d.ts +62 -0
  98. package/dist/lib/providers/mcp-provider.js +183 -0
  99. package/dist/lib/providers/mistralAI.d.ts +3 -3
  100. package/dist/lib/providers/mistralAI.js +42 -36
  101. package/dist/lib/providers/ollama.d.ts +4 -4
  102. package/dist/lib/providers/ollama.js +113 -98
  103. package/dist/lib/providers/openAI.d.ts +7 -3
  104. package/dist/lib/providers/openAI.js +45 -33
  105. package/dist/lib/utils/logger.js +2 -2
  106. package/dist/lib/utils/providerUtils.js +53 -31
  107. package/dist/mcp/auto-discovery.d.ts +120 -0
  108. package/dist/mcp/auto-discovery.js +794 -0
  109. package/dist/mcp/client.d.ts +66 -0
  110. package/dist/mcp/client.js +245 -0
  111. package/dist/mcp/config.d.ts +31 -0
  112. package/dist/mcp/config.js +74 -0
  113. package/dist/mcp/context-manager.d.ts +4 -4
  114. package/dist/mcp/context-manager.js +24 -18
  115. package/dist/mcp/factory.d.ts +28 -11
  116. package/dist/mcp/factory.js +36 -29
  117. package/dist/mcp/function-calling.d.ts +51 -0
  118. package/dist/mcp/function-calling.js +510 -0
  119. package/dist/mcp/index.d.ts +190 -0
  120. package/dist/mcp/index.js +156 -0
  121. package/dist/mcp/initialize-tools.d.ts +28 -0
  122. package/dist/mcp/initialize-tools.js +210 -0
  123. package/dist/mcp/initialize.d.ts +17 -0
  124. package/dist/mcp/initialize.js +51 -0
  125. package/dist/mcp/logging.d.ts +71 -0
  126. package/dist/mcp/logging.js +183 -0
  127. package/dist/mcp/manager.d.ts +67 -0
  128. package/dist/mcp/manager.js +176 -0
  129. package/dist/mcp/neurolink-mcp-client.d.ts +96 -0
  130. package/dist/mcp/neurolink-mcp-client.js +417 -0
  131. package/dist/mcp/orchestrator.d.ts +3 -3
  132. package/dist/mcp/orchestrator.js +46 -43
  133. package/dist/mcp/registry.d.ts +2 -2
  134. package/dist/mcp/registry.js +42 -33
  135. package/dist/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
  136. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +204 -65
  137. package/dist/mcp/servers/ai-providers/ai-core-server.js +142 -102
  138. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
  139. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +197 -142
  140. package/dist/mcp/servers/utilities/utility-server.d.ts +8 -0
  141. package/dist/mcp/servers/utilities/utility-server.js +326 -0
  142. package/dist/mcp/tool-integration.d.ts +67 -0
  143. package/dist/mcp/tool-integration.js +179 -0
  144. package/dist/mcp/unified-registry.d.ts +269 -0
  145. package/dist/mcp/unified-registry.js +1411 -0
  146. package/dist/neurolink.d.ts +68 -6
  147. package/dist/neurolink.js +304 -42
  148. package/dist/providers/agent-enhanced-provider.d.ts +59 -0
  149. package/dist/providers/agent-enhanced-provider.js +242 -0
  150. package/dist/providers/amazonBedrock.d.ts +3 -3
  151. package/dist/providers/amazonBedrock.js +54 -50
  152. package/dist/providers/anthropic.d.ts +2 -2
  153. package/dist/providers/anthropic.js +92 -84
  154. package/dist/providers/azureOpenAI.d.ts +2 -2
  155. package/dist/providers/azureOpenAI.js +97 -86
  156. package/dist/providers/function-calling-provider.d.ts +70 -0
  157. package/dist/providers/function-calling-provider.js +359 -0
  158. package/dist/providers/googleAIStudio.d.ts +10 -5
  159. package/dist/providers/googleAIStudio.js +60 -38
  160. package/dist/providers/googleVertexAI.d.ts +3 -3
  161. package/dist/providers/googleVertexAI.js +96 -86
  162. package/dist/providers/huggingFace.d.ts +3 -3
  163. package/dist/providers/huggingFace.js +70 -63
  164. package/dist/providers/index.d.ts +11 -11
  165. package/dist/providers/index.js +18 -18
  166. package/dist/providers/mcp-provider.d.ts +62 -0
  167. package/dist/providers/mcp-provider.js +183 -0
  168. package/dist/providers/mistralAI.d.ts +3 -3
  169. package/dist/providers/mistralAI.js +42 -36
  170. package/dist/providers/ollama.d.ts +4 -4
  171. package/dist/providers/ollama.js +113 -98
  172. package/dist/providers/openAI.d.ts +7 -3
  173. package/dist/providers/openAI.js +45 -33
  174. package/dist/utils/logger.js +2 -2
  175. package/dist/utils/providerUtils.js +53 -31
  176. package/package.json +175 -161
@@ -1,21 +1,23 @@
1
1
  /**
2
- * NeuroLink - Unified AI Interface
2
+ * NeuroLink - Unified AI Interface with Real MCP Tool Integration
3
3
  *
4
- * Simple wrapper around the AI provider system to provide a clean API
5
- * for CLI and other consumers.
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.
6
7
  */
7
- import type { AIProviderName } from './core/types.js';
8
+ import type { AIProviderName } from "./core/types.js";
8
9
  export interface TextGenerationOptions {
9
10
  prompt: string;
10
- provider?: 'openai' | 'bedrock' | 'vertex' | 'anthropic' | 'azure' | 'google-ai' | 'huggingface' | 'ollama' | 'mistral' | 'auto';
11
+ provider?: "openai" | "bedrock" | "vertex" | "anthropic" | "azure" | "google-ai" | "huggingface" | "ollama" | "mistral" | "auto";
11
12
  temperature?: number;
12
13
  maxTokens?: number;
13
14
  systemPrompt?: string;
14
15
  schema?: any;
16
+ disableTools?: boolean;
15
17
  }
16
18
  export interface StreamTextOptions {
17
19
  prompt: string;
18
- provider?: 'openai' | 'bedrock' | 'vertex' | 'anthropic' | 'azure' | 'google-ai' | 'huggingface' | 'ollama' | 'mistral' | 'auto';
20
+ provider?: "openai" | "bedrock" | "vertex" | "anthropic" | "azure" | "google-ai" | "huggingface" | "ollama" | "mistral" | "auto";
19
21
  temperature?: number;
20
22
  maxTokens?: number;
21
23
  systemPrompt?: string;
@@ -30,12 +32,51 @@ export interface TextGenerationResult {
30
32
  totalTokens?: number;
31
33
  };
32
34
  responseTime?: number;
35
+ toolsUsed?: string[];
36
+ toolExecutions?: Array<{
37
+ toolName: string;
38
+ executionTime: number;
39
+ success: boolean;
40
+ serverId?: string;
41
+ }>;
42
+ enhancedWithTools?: boolean;
43
+ availableTools?: Array<{
44
+ name: string;
45
+ description: string;
46
+ server: string;
47
+ category?: string;
48
+ }>;
33
49
  }
34
50
  export declare class NeuroLink {
51
+ private mcpInitialized;
52
+ private contextManager;
53
+ constructor();
54
+ /**
55
+ * Initialize MCP registry with enhanced error handling and resource cleanup
56
+ * Uses isolated async context to prevent hanging
57
+ */
58
+ private initializeMCP;
59
+ /**
60
+ * Isolated MCP initialization to prevent context-dependent hanging
61
+ */
62
+ private doIsolatedMCPInitialization;
35
63
  /**
36
64
  * Generate text using the best available AI provider with automatic fallback
65
+ * Tools are ENABLED BY DEFAULT for natural AI behavior
37
66
  */
38
67
  generateText(options: TextGenerationOptions): Promise<TextGenerationResult>;
68
+ /**
69
+ * Generate text with real MCP tool integration using automatic detection
70
+ */
71
+ private generateTextWithTools;
72
+ /**
73
+ * Regular text generation (existing logic)
74
+ */
75
+ private generateTextRegular;
76
+ /**
77
+ * Create tool-aware system prompt that informs AI about available tools
78
+ */
79
+ private createToolAwareSystemPrompt;
39
80
  /**
40
81
  * Generate streaming text using the best available AI provider with automatic fallback
41
82
  */
@@ -50,4 +91,25 @@ export declare class NeuroLink {
50
91
  * Test a specific provider
51
92
  */
52
93
  testProvider(providerName: AIProviderName, testPrompt?: string): Promise<boolean>;
94
+ /**
95
+ * Get access to the unified MCP registry for tool inspection and management
96
+ */
97
+ getUnifiedRegistry(): import("./mcp/unified-registry.js").UnifiedMCPRegistry;
98
+ /**
99
+ * Initialize MCP and return discovery statistics
100
+ */
101
+ getMCPStatus(): Promise<{
102
+ mcpInitialized: boolean;
103
+ totalServers: number;
104
+ availableServers: number;
105
+ autoDiscoveredCount: number;
106
+ totalTools: number;
107
+ autoDiscoveredServers: {
108
+ id: string;
109
+ name: string;
110
+ source: import("./mcp/unified-registry.js").ServerSource;
111
+ status: "unknown" | "available" | "unavailable" | "activated";
112
+ hasServer: boolean;
113
+ }[];
114
+ }>;
53
115
  }
package/dist/neurolink.js CHANGED
@@ -1,61 +1,253 @@
1
1
  /**
2
- * NeuroLink - Unified AI Interface
2
+ * NeuroLink - Unified AI Interface with Real MCP Tool Integration
3
3
  *
4
- * Simple wrapper around the AI provider system to provide a clean API
5
- * for CLI and other consumers.
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.
6
7
  */
7
- import { AIProviderFactory, createBestAIProvider } from './index.js';
8
- import { getBestProvider } from './utils/providerUtils.js';
9
- import { logger } from './utils/logger.js';
8
+ import { AIProviderFactory } from "./index.js";
9
+ import { ContextManager } from "./mcp/context-manager.js";
10
+ import { mcpLogger } from "./mcp/logging.js";
11
+ import { defaultToolRegistry } from "./mcp/registry.js";
12
+ import { defaultUnifiedRegistry } from "./mcp/unified-registry.js";
13
+ import { logger } from "./utils/logger.js";
14
+ import { getBestProvider } from "./utils/providerUtils.js";
10
15
  export class NeuroLink {
16
+ mcpInitialized = false;
17
+ contextManager;
18
+ constructor() {
19
+ this.contextManager = new ContextManager();
20
+ }
21
+ /**
22
+ * Initialize MCP registry with enhanced error handling and resource cleanup
23
+ * Uses isolated async context to prevent hanging
24
+ */
25
+ async initializeMCP() {
26
+ if (this.mcpInitialized) {
27
+ return;
28
+ }
29
+ try {
30
+ mcpLogger.debug("[NeuroLink] Starting isolated MCP initialization...");
31
+ // Use Promise.race with aggressive timeout and isolated context
32
+ const initTimeout = 3000; // 3 seconds max (reduced from 5)
33
+ const mcpInitPromise = Promise.race([
34
+ this.doIsolatedMCPInitialization(),
35
+ new Promise((_, reject) => {
36
+ const timer = setTimeout(() => {
37
+ reject(new Error("MCP initialization timeout after 3s"));
38
+ }, initTimeout);
39
+ timer.unref(); // Don't keep process alive
40
+ }),
41
+ ]);
42
+ await mcpInitPromise;
43
+ this.mcpInitialized = true;
44
+ mcpLogger.debug("[NeuroLink] MCP tool integration initialized successfully");
45
+ }
46
+ catch (error) {
47
+ mcpLogger.warn("[NeuroLink] MCP initialization failed, continuing without tools:", error);
48
+ // Mark as initialized to prevent infinite retries
49
+ this.mcpInitialized = true;
50
+ }
51
+ }
52
+ /**
53
+ * Isolated MCP initialization to prevent context-dependent hanging
54
+ */
55
+ async doIsolatedMCPInitialization() {
56
+ try {
57
+ // Initialize only the essential built-in tools without complex registry
58
+ mcpLogger.debug("[NeuroLink] Initializing essential MCP tools...");
59
+ // Use dynamic import in isolated context to avoid circular dependencies
60
+ const { initializeNeuroLinkMCP, isNeuroLinkMCPInitialized } = await import("./mcp/initialize.js");
61
+ // Only initialize if not already done
62
+ if (!isNeuroLinkMCPInitialized()) {
63
+ await initializeNeuroLinkMCP();
64
+ }
65
+ mcpLogger.debug("[NeuroLink] Essential MCP tools initialized successfully");
66
+ }
67
+ catch (error) {
68
+ mcpLogger.warn("[NeuroLink] Isolated MCP initialization failed:", error);
69
+ throw error;
70
+ }
71
+ }
11
72
  /**
12
73
  * Generate text using the best available AI provider with automatic fallback
74
+ * Tools are ENABLED BY DEFAULT for natural AI behavior
13
75
  */
14
76
  async generateText(options) {
77
+ // Tools are DEFAULT behavior unless explicitly disabled
78
+ if (options.disableTools === true) {
79
+ return this.generateTextRegular(options);
80
+ }
81
+ // Default: Generate with tools (natural AI behavior)
82
+ return this.generateTextWithTools(options);
83
+ }
84
+ /**
85
+ * Generate text with real MCP tool integration using automatic detection
86
+ */
87
+ async generateTextWithTools(options) {
88
+ const startTime = Date.now();
89
+ const functionTag = "NeuroLink.generateTextWithTools";
90
+ // Initialize MCP if needed
91
+ await this.initializeMCP();
92
+ // Create execution context for tool operations
93
+ const context = this.contextManager.createContext({
94
+ sessionId: `neurolink-${Date.now()}`,
95
+ userId: "neurolink-user",
96
+ aiProvider: options.provider || "auto",
97
+ });
98
+ // Determine provider to use
99
+ const providerName = options.provider === "auto" || !options.provider
100
+ ? await getBestProvider()
101
+ : options.provider;
102
+ try {
103
+ mcpLogger.debug(`[${functionTag}] Starting MCP-enabled generation`, {
104
+ provider: providerName,
105
+ prompt: options.prompt.substring(0, 100) + "...",
106
+ contextId: context.sessionId,
107
+ });
108
+ // Get available tools from default registry (simplified approach)
109
+ let availableTools = [];
110
+ try {
111
+ // Use defaultToolRegistry directly instead of unified registry to avoid hanging
112
+ const allTools = defaultToolRegistry.listTools();
113
+ availableTools = allTools.map((tool) => ({
114
+ name: tool.name,
115
+ description: tool.description || "No description available",
116
+ server: tool.server,
117
+ category: tool.category,
118
+ }));
119
+ mcpLogger.debug(`[${functionTag}] Found ${availableTools.length} available tools from default registry`, {
120
+ tools: availableTools.map((t) => t.name),
121
+ });
122
+ }
123
+ catch (error) {
124
+ mcpLogger.warn(`[${functionTag}] Failed to get available tools`, {
125
+ error,
126
+ });
127
+ }
128
+ // Create tool-aware system prompt
129
+ const enhancedSystemPrompt = this.createToolAwareSystemPrompt(options.systemPrompt, availableTools);
130
+ // Create provider with MCP enabled using best provider function
131
+ const provider = await AIProviderFactory.createBestProvider(providerName, undefined, true);
132
+ // Generate text with automatic tool detection
133
+ const result = await provider.generateText({
134
+ prompt: options.prompt,
135
+ temperature: options.temperature,
136
+ maxTokens: options.maxTokens,
137
+ systemPrompt: enhancedSystemPrompt,
138
+ }, options.schema);
139
+ if (!result) {
140
+ throw new Error("No response received from AI provider");
141
+ }
142
+ const responseTime = Date.now() - startTime;
143
+ // Extract MCP metadata if available
144
+ const metadata = result.metadata || {};
145
+ mcpLogger.debug(`[${functionTag}] MCP-enabled generation completed`, {
146
+ responseTime,
147
+ toolsUsed: metadata.toolsUsed || [],
148
+ enhancedWithTools: metadata.enhancedWithTools || false,
149
+ availableToolsCount: availableTools.length,
150
+ });
151
+ // Check if we actually got content
152
+ if (!result.text || result.text.trim() === "") {
153
+ mcpLogger.warn(`[${functionTag}] Empty response from provider, attempting fallback`, {
154
+ provider: providerName,
155
+ hasText: !!result.text,
156
+ textLength: result.text?.length || 0,
157
+ });
158
+ // Fall back to regular generation if MCP generation returns empty
159
+ return this.generateTextRegular(options);
160
+ }
161
+ return {
162
+ content: result.text,
163
+ provider: providerName,
164
+ usage: result.usage,
165
+ responseTime,
166
+ toolsUsed: metadata.toolsUsed || [],
167
+ enhancedWithTools: metadata.enhancedWithTools || false,
168
+ availableTools: availableTools.length > 0 ? availableTools : undefined,
169
+ };
170
+ }
171
+ catch (error) {
172
+ // Fall back to regular generation if MCP fails
173
+ mcpLogger.warn(`[${functionTag}] MCP generation failed, falling back to regular`, {
174
+ error: error instanceof Error ? error.message : String(error),
175
+ });
176
+ return this.generateTextRegular(options);
177
+ }
178
+ }
179
+ /**
180
+ * Regular text generation (existing logic)
181
+ */
182
+ async generateTextRegular(options) {
15
183
  const startTime = Date.now();
16
- const functionTag = 'NeuroLink.generateText';
184
+ const functionTag = "NeuroLink.generateTextRegular";
17
185
  // Define fallback provider priority order
18
- const providerPriority = ['openai', 'vertex', 'bedrock', 'anthropic', 'azure', 'google-ai', 'huggingface', 'ollama'];
19
- const requestedProvider = options.provider === 'auto' ? undefined : options.provider;
186
+ const providerPriority = [
187
+ "openai",
188
+ "vertex",
189
+ "bedrock",
190
+ "anthropic",
191
+ "azure",
192
+ "google-ai",
193
+ "huggingface",
194
+ "ollama",
195
+ ];
196
+ const requestedProvider = options.provider === "auto" ? undefined : options.provider;
20
197
  // Local providers that should not fall back when explicitly requested
21
- const localProviders = ['ollama'];
198
+ const localProviders = ["ollama"];
22
199
  // If specific provider requested, check if we should allow fallback
23
200
  const tryProviders = requestedProvider
24
- ? (localProviders.includes(requestedProvider)
201
+ ? localProviders.includes(requestedProvider)
25
202
  ? [requestedProvider] // No fallback for local providers
26
- : [requestedProvider, ...providerPriority.filter(p => p !== requestedProvider)])
203
+ : [
204
+ requestedProvider,
205
+ ...providerPriority.filter((p) => p !== requestedProvider),
206
+ ]
27
207
  : providerPriority;
28
208
  logger.debug(`[${functionTag}] Starting text generation`, {
29
- requestedProvider: requestedProvider || 'auto',
209
+ requestedProvider: requestedProvider || "auto",
30
210
  tryProviders,
31
211
  allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
32
- promptLength: options.prompt.length
212
+ promptLength: options.prompt.length,
33
213
  });
34
214
  let lastError = null;
35
215
  for (const providerName of tryProviders) {
36
216
  try {
37
- logger.debug(`[${functionTag}] Attempting provider`, { provider: providerName });
38
- const provider = AIProviderFactory.createProvider(providerName);
217
+ logger.debug(`[${functionTag}] Attempting provider`, {
218
+ provider: providerName,
219
+ });
220
+ const provider = await AIProviderFactory.createProvider(providerName);
39
221
  const result = await provider.generateText({
40
222
  prompt: options.prompt,
41
223
  temperature: options.temperature,
42
224
  maxTokens: options.maxTokens,
43
- systemPrompt: options.systemPrompt
225
+ systemPrompt: options.systemPrompt,
44
226
  }, options.schema);
45
227
  if (!result) {
46
- throw new Error('No response received from AI provider');
228
+ throw new Error("No response received from AI provider");
229
+ }
230
+ // Check if we actually got content
231
+ if (!result.text || result.text.trim() === "") {
232
+ logger.warn(`[${functionTag}] Empty response from provider`, {
233
+ provider: providerName,
234
+ hasText: !!result.text,
235
+ textLength: result.text?.length || 0,
236
+ });
237
+ // Continue to next provider if available
238
+ throw new Error(`Empty response from ${providerName}`);
47
239
  }
48
240
  const responseTime = Date.now() - startTime;
49
241
  logger.debug(`[${functionTag}] Provider succeeded`, {
50
242
  provider: providerName,
51
243
  responseTime,
52
- usage: result.usage
244
+ usage: result.usage,
53
245
  });
54
246
  return {
55
- content: result.text || '',
247
+ content: result.text,
56
248
  provider: providerName,
57
249
  usage: result.usage,
58
- responseTime
250
+ responseTime,
59
251
  };
60
252
  }
61
253
  catch (error) {
@@ -64,7 +256,7 @@ export class NeuroLink {
64
256
  logger.debug(`[${functionTag}] Provider failed, trying next`, {
65
257
  provider: providerName,
66
258
  error: errorMessage,
67
- remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
259
+ remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
68
260
  });
69
261
  // Continue to next provider
70
262
  continue;
@@ -73,47 +265,87 @@ export class NeuroLink {
73
265
  // All providers failed
74
266
  logger.debug(`[${functionTag}] All providers failed`, {
75
267
  triedProviders: tryProviders,
76
- lastError: lastError?.message
268
+ lastError: lastError?.message,
77
269
  });
78
- throw new Error(`Failed to generate text with all providers. Last error: ${lastError?.message || 'Unknown error'}`);
270
+ throw new Error(`Failed to generate text with all providers. Last error: ${lastError?.message || "Unknown error"}`);
271
+ }
272
+ /**
273
+ * Create tool-aware system prompt that informs AI about available tools
274
+ */
275
+ createToolAwareSystemPrompt(originalSystemPrompt, availableTools) {
276
+ const basePrompt = originalSystemPrompt || "You are a helpful AI assistant.";
277
+ if (availableTools.length === 0) {
278
+ return basePrompt;
279
+ }
280
+ const toolDescriptions = availableTools
281
+ .map((tool) => `- ${tool.name}: ${tool.description}`)
282
+ .join("\n");
283
+ return `${basePrompt}
284
+
285
+ Available tools that can be used when relevant:
286
+
287
+ ${toolDescriptions}
288
+
289
+ You can mention these capabilities when they're relevant to user questions. For example:
290
+ - For time questions: "I can get the current time"
291
+ - For provider questions: "I can check AI provider status"
292
+ - For tool questions: "I can list available tools"
293
+
294
+ Note: Tool integration is currently in development. Please provide helpful responses based on your knowledge while mentioning tool capabilities when relevant.`;
79
295
  }
80
296
  /**
81
297
  * Generate streaming text using the best available AI provider with automatic fallback
82
298
  */
83
299
  async generateTextStream(options) {
84
- const functionTag = 'NeuroLink.generateTextStream';
300
+ const functionTag = "NeuroLink.generateTextStream";
85
301
  // Define fallback provider priority order
86
- const providerPriority = ['openai', 'vertex', 'bedrock', 'anthropic', 'azure', 'google-ai', 'huggingface', 'ollama'];
87
- const requestedProvider = options.provider === 'auto' ? undefined : options.provider;
302
+ const providerPriority = [
303
+ "openai",
304
+ "vertex",
305
+ "bedrock",
306
+ "anthropic",
307
+ "azure",
308
+ "google-ai",
309
+ "huggingface",
310
+ "ollama",
311
+ ];
312
+ const requestedProvider = options.provider === "auto" ? undefined : options.provider;
88
313
  // Local providers that should not fall back when explicitly requested
89
- const localProviders = ['ollama'];
314
+ const localProviders = ["ollama"];
90
315
  // If specific provider requested, check if we should allow fallback
91
316
  const tryProviders = requestedProvider
92
- ? (localProviders.includes(requestedProvider)
317
+ ? localProviders.includes(requestedProvider)
93
318
  ? [requestedProvider] // No fallback for local providers
94
- : [requestedProvider, ...providerPriority.filter(p => p !== requestedProvider)])
319
+ : [
320
+ requestedProvider,
321
+ ...providerPriority.filter((p) => p !== requestedProvider),
322
+ ]
95
323
  : providerPriority;
96
324
  logger.debug(`[${functionTag}] Starting stream generation`, {
97
- requestedProvider: requestedProvider || 'auto',
325
+ requestedProvider: requestedProvider || "auto",
98
326
  tryProviders,
99
327
  allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
100
- promptLength: options.prompt.length
328
+ promptLength: options.prompt.length,
101
329
  });
102
330
  let lastError = null;
103
331
  for (const providerName of tryProviders) {
104
332
  try {
105
- logger.debug(`[${functionTag}] Attempting provider`, { provider: providerName });
106
- const provider = AIProviderFactory.createProvider(providerName);
333
+ logger.debug(`[${functionTag}] Attempting provider`, {
334
+ provider: providerName,
335
+ });
336
+ const provider = await AIProviderFactory.createProvider(providerName);
107
337
  const result = await provider.streamText({
108
338
  prompt: options.prompt,
109
339
  temperature: options.temperature,
110
340
  maxTokens: options.maxTokens,
111
- systemPrompt: options.systemPrompt
341
+ systemPrompt: options.systemPrompt,
112
342
  });
113
343
  if (!result) {
114
- throw new Error('No stream response received from AI provider');
344
+ throw new Error("No stream response received from AI provider");
115
345
  }
116
- logger.debug(`[${functionTag}] Provider succeeded`, { provider: providerName });
346
+ logger.debug(`[${functionTag}] Provider succeeded`, {
347
+ provider: providerName,
348
+ });
117
349
  // Convert the AI SDK stream to our expected format
118
350
  async function* convertStream() {
119
351
  if (result && result.textStream) {
@@ -130,7 +362,7 @@ export class NeuroLink {
130
362
  logger.debug(`[${functionTag}] Provider failed, trying next`, {
131
363
  provider: providerName,
132
364
  error: errorMessage,
133
- remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
365
+ remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
134
366
  });
135
367
  // Continue to next provider
136
368
  continue;
@@ -139,9 +371,9 @@ export class NeuroLink {
139
371
  // All providers failed
140
372
  logger.debug(`[${functionTag}] All providers failed`, {
141
373
  triedProviders: tryProviders,
142
- lastError: lastError?.message
374
+ lastError: lastError?.message,
143
375
  });
144
- throw new Error(`Failed to stream text with all providers. Last error: ${lastError?.message || 'Unknown error'}`);
376
+ throw new Error(`Failed to stream text with all providers. Last error: ${lastError?.message || "Unknown error"}`);
145
377
  }
146
378
  /**
147
379
  * Get the best available AI provider
@@ -152,9 +384,9 @@ export class NeuroLink {
152
384
  /**
153
385
  * Test a specific provider
154
386
  */
155
- async testProvider(providerName, testPrompt = 'test') {
387
+ async testProvider(providerName, testPrompt = "test") {
156
388
  try {
157
- const provider = AIProviderFactory.createProvider(providerName);
389
+ const provider = await AIProviderFactory.createProvider(providerName);
158
390
  await provider.generateText(testPrompt);
159
391
  return true;
160
392
  }
@@ -162,4 +394,34 @@ export class NeuroLink {
162
394
  return false;
163
395
  }
164
396
  }
397
+ /**
398
+ * Get access to the unified MCP registry for tool inspection and management
399
+ */
400
+ getUnifiedRegistry() {
401
+ return defaultUnifiedRegistry;
402
+ }
403
+ /**
404
+ * Initialize MCP and return discovery statistics
405
+ */
406
+ async getMCPStatus() {
407
+ await this.initializeMCP();
408
+ const totalServers = defaultUnifiedRegistry.getTotalServerCount();
409
+ const availableServers = defaultUnifiedRegistry.getAvailableServerCount();
410
+ const autoDiscoveredServers = defaultUnifiedRegistry.getAutoDiscoveredServers();
411
+ const allTools = await defaultUnifiedRegistry.listAllTools();
412
+ return {
413
+ mcpInitialized: this.mcpInitialized,
414
+ totalServers,
415
+ availableServers,
416
+ autoDiscoveredCount: autoDiscoveredServers.size,
417
+ totalTools: allTools.length,
418
+ autoDiscoveredServers: Array.from(autoDiscoveredServers.entries()).map(([id, server]) => ({
419
+ id: server.id,
420
+ name: server.config?.name || id,
421
+ source: server.source,
422
+ status: server.status,
423
+ hasServer: !!server.server,
424
+ })),
425
+ };
426
+ }
165
427
  }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Agent-Enhanced Provider for NeuroLink CLI
3
+ * Integrates direct tools with AI providers for true agent functionality
4
+ */
5
+ import { type GenerateTextResult, type StreamTextResult, type ToolSet } from "ai";
6
+ import type { AIProvider, TextGenerationOptions, StreamTextOptions } from "../core/types.js";
7
+ /**
8
+ * Agent configuration options
9
+ */
10
+ interface AgentConfig {
11
+ provider: "openai" | "google-ai" | "anthropic";
12
+ model?: string;
13
+ toolCategory?: "basic" | "filesystem" | "utility" | "all";
14
+ maxSteps?: number;
15
+ enableTools?: boolean;
16
+ }
17
+ /**
18
+ * Agent-Enhanced Provider Class
19
+ * Provides AI generation with tool calling capabilities
20
+ */
21
+ export declare class AgentEnhancedProvider implements AIProvider {
22
+ private config;
23
+ private model;
24
+ constructor(config: AgentConfig);
25
+ private createModel;
26
+ generateText(optionsOrPrompt: TextGenerationOptions | string): Promise<GenerateTextResult<ToolSet, unknown> | null>;
27
+ streamText(optionsOrPrompt: StreamTextOptions | string): Promise<StreamTextResult<ToolSet, unknown> | null>;
28
+ /**
29
+ * Determine if we should force tool usage based on prompt patterns
30
+ */
31
+ private shouldForceToolUsage;
32
+ getCapabilities(): string[];
33
+ getProviderName(): string;
34
+ getModelName(): string;
35
+ /**
36
+ * Test agent functionality
37
+ */
38
+ testAgentCapabilities(): Promise<{
39
+ success: boolean;
40
+ results: any[];
41
+ }>;
42
+ /**
43
+ * Create agent-enhanced provider factory
44
+ */
45
+ static createAgent(config: AgentConfig): AgentEnhancedProvider;
46
+ /**
47
+ * Create multiple agent providers for comparison
48
+ */
49
+ static createMultiProviderAgents(): Record<string, AgentEnhancedProvider>;
50
+ }
51
+ /**
52
+ * Helper function to create agent provider
53
+ */
54
+ export declare function createAgentProvider(provider: "openai" | "google-ai" | "anthropic", options?: Partial<AgentConfig>): AgentEnhancedProvider;
55
+ /**
56
+ * Test all available agent providers
57
+ */
58
+ export declare function testAllAgentProviders(): Promise<void>;
59
+ export {};