@juspay/neurolink 1.5.3 → 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 +241 -1
  2. package/README.md +113 -20
  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 +76 -9
  8. package/dist/cli/commands/config.js +358 -233
  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 +8 -0
  12. package/dist/cli/commands/ollama.js +333 -0
  13. package/dist/cli/index.js +591 -327
  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 +180 -50
  24. package/dist/core/types.d.ts +8 -3
  25. package/dist/core/types.js +7 -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 +180 -50
  34. package/dist/lib/core/types.d.ts +8 -3
  35. package/dist/lib/core/types.js +7 -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 +205 -66
  68. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +143 -99
  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 +404 -251
  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 +314 -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 +31 -0
  94. package/dist/lib/providers/huggingFace.js +362 -0
  95. package/dist/lib/providers/index.d.ts +14 -8
  96. package/dist/lib/providers/index.js +18 -12
  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 +32 -0
  100. package/dist/lib/providers/mistralAI.js +223 -0
  101. package/dist/lib/providers/ollama.d.ts +51 -0
  102. package/dist/lib/providers/ollama.js +508 -0
  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 +59 -22
  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 +205 -66
  137. package/dist/mcp/servers/ai-providers/ai-core-server.js +143 -99
  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 +404 -253
  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 +314 -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 +31 -0
  163. package/dist/providers/huggingFace.js +362 -0
  164. package/dist/providers/index.d.ts +14 -8
  165. package/dist/providers/index.js +18 -12
  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 +32 -0
  169. package/dist/providers/mistralAI.js +223 -0
  170. package/dist/providers/ollama.d.ts +51 -0
  171. package/dist/providers/ollama.js +508 -0
  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 +59 -22
  176. package/package.json +28 -4
@@ -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' | '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' | '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
  }
@@ -1,56 +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 } 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'];
19
- const requestedProvider = options.provider === 'auto' ? undefined : options.provider;
20
- // If specific provider requested, try that first, then fallback to priority order
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;
197
+ // Local providers that should not fall back when explicitly requested
198
+ const localProviders = ["ollama"];
199
+ // If specific provider requested, check if we should allow fallback
21
200
  const tryProviders = requestedProvider
22
- ? [requestedProvider, ...providerPriority.filter(p => p !== requestedProvider)]
201
+ ? localProviders.includes(requestedProvider)
202
+ ? [requestedProvider] // No fallback for local providers
203
+ : [
204
+ requestedProvider,
205
+ ...providerPriority.filter((p) => p !== requestedProvider),
206
+ ]
23
207
  : providerPriority;
24
- logger.debug(`[${functionTag}] Starting text generation with fallback`, {
25
- requestedProvider: requestedProvider || 'auto',
208
+ logger.debug(`[${functionTag}] Starting text generation`, {
209
+ requestedProvider: requestedProvider || "auto",
26
210
  tryProviders,
27
- promptLength: options.prompt.length
211
+ allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
212
+ promptLength: options.prompt.length,
28
213
  });
29
214
  let lastError = null;
30
215
  for (const providerName of tryProviders) {
31
216
  try {
32
- logger.debug(`[${functionTag}] Attempting provider`, { provider: providerName });
33
- const provider = AIProviderFactory.createProvider(providerName);
217
+ logger.debug(`[${functionTag}] Attempting provider`, {
218
+ provider: providerName,
219
+ });
220
+ const provider = await AIProviderFactory.createProvider(providerName);
34
221
  const result = await provider.generateText({
35
222
  prompt: options.prompt,
36
223
  temperature: options.temperature,
37
224
  maxTokens: options.maxTokens,
38
- systemPrompt: options.systemPrompt
225
+ systemPrompt: options.systemPrompt,
39
226
  }, options.schema);
40
227
  if (!result) {
41
- 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}`);
42
239
  }
43
240
  const responseTime = Date.now() - startTime;
44
241
  logger.debug(`[${functionTag}] Provider succeeded`, {
45
242
  provider: providerName,
46
243
  responseTime,
47
- usage: result.usage
244
+ usage: result.usage,
48
245
  });
49
246
  return {
50
- content: result.text || '',
247
+ content: result.text,
51
248
  provider: providerName,
52
249
  usage: result.usage,
53
- responseTime
250
+ responseTime,
54
251
  };
55
252
  }
56
253
  catch (error) {
@@ -59,7 +256,7 @@ export class NeuroLink {
59
256
  logger.debug(`[${functionTag}] Provider failed, trying next`, {
60
257
  provider: providerName,
61
258
  error: errorMessage,
62
- remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
259
+ remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
63
260
  });
64
261
  // Continue to next provider
65
262
  continue;
@@ -68,42 +265,87 @@ export class NeuroLink {
68
265
  // All providers failed
69
266
  logger.debug(`[${functionTag}] All providers failed`, {
70
267
  triedProviders: tryProviders,
71
- lastError: lastError?.message
268
+ lastError: lastError?.message,
72
269
  });
73
- 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.`;
74
295
  }
75
296
  /**
76
297
  * Generate streaming text using the best available AI provider with automatic fallback
77
298
  */
78
299
  async generateTextStream(options) {
79
- const functionTag = 'NeuroLink.generateTextStream';
300
+ const functionTag = "NeuroLink.generateTextStream";
80
301
  // Define fallback provider priority order
81
- const providerPriority = ['openai', 'vertex', 'bedrock', 'anthropic', 'azure', 'google-ai'];
82
- const requestedProvider = options.provider === 'auto' ? undefined : options.provider;
83
- // If specific provider requested, try that first, then fallback to priority order
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;
313
+ // Local providers that should not fall back when explicitly requested
314
+ const localProviders = ["ollama"];
315
+ // If specific provider requested, check if we should allow fallback
84
316
  const tryProviders = requestedProvider
85
- ? [requestedProvider, ...providerPriority.filter(p => p !== requestedProvider)]
317
+ ? localProviders.includes(requestedProvider)
318
+ ? [requestedProvider] // No fallback for local providers
319
+ : [
320
+ requestedProvider,
321
+ ...providerPriority.filter((p) => p !== requestedProvider),
322
+ ]
86
323
  : providerPriority;
87
- logger.debug(`[${functionTag}] Starting stream generation with fallback`, {
88
- requestedProvider: requestedProvider || 'auto',
324
+ logger.debug(`[${functionTag}] Starting stream generation`, {
325
+ requestedProvider: requestedProvider || "auto",
89
326
  tryProviders,
90
- promptLength: options.prompt.length
327
+ allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
328
+ promptLength: options.prompt.length,
91
329
  });
92
330
  let lastError = null;
93
331
  for (const providerName of tryProviders) {
94
332
  try {
95
- logger.debug(`[${functionTag}] Attempting provider`, { provider: providerName });
96
- const provider = AIProviderFactory.createProvider(providerName);
333
+ logger.debug(`[${functionTag}] Attempting provider`, {
334
+ provider: providerName,
335
+ });
336
+ const provider = await AIProviderFactory.createProvider(providerName);
97
337
  const result = await provider.streamText({
98
338
  prompt: options.prompt,
99
339
  temperature: options.temperature,
100
340
  maxTokens: options.maxTokens,
101
- systemPrompt: options.systemPrompt
341
+ systemPrompt: options.systemPrompt,
102
342
  });
103
343
  if (!result) {
104
- throw new Error('No stream response received from AI provider');
344
+ throw new Error("No stream response received from AI provider");
105
345
  }
106
- logger.debug(`[${functionTag}] Provider succeeded`, { provider: providerName });
346
+ logger.debug(`[${functionTag}] Provider succeeded`, {
347
+ provider: providerName,
348
+ });
107
349
  // Convert the AI SDK stream to our expected format
108
350
  async function* convertStream() {
109
351
  if (result && result.textStream) {
@@ -120,7 +362,7 @@ export class NeuroLink {
120
362
  logger.debug(`[${functionTag}] Provider failed, trying next`, {
121
363
  provider: providerName,
122
364
  error: errorMessage,
123
- remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
365
+ remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
124
366
  });
125
367
  // Continue to next provider
126
368
  continue;
@@ -129,9 +371,9 @@ export class NeuroLink {
129
371
  // All providers failed
130
372
  logger.debug(`[${functionTag}] All providers failed`, {
131
373
  triedProviders: tryProviders,
132
- lastError: lastError?.message
374
+ lastError: lastError?.message,
133
375
  });
134
- 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"}`);
135
377
  }
136
378
  /**
137
379
  * Get the best available AI provider
@@ -142,9 +384,9 @@ export class NeuroLink {
142
384
  /**
143
385
  * Test a specific provider
144
386
  */
145
- async testProvider(providerName, testPrompt = 'test') {
387
+ async testProvider(providerName, testPrompt = "test") {
146
388
  try {
147
- const provider = AIProviderFactory.createProvider(providerName);
389
+ const provider = await AIProviderFactory.createProvider(providerName);
148
390
  await provider.generateText(testPrompt);
149
391
  return true;
150
392
  }
@@ -152,4 +394,34 @@ export class NeuroLink {
152
394
  return false;
153
395
  }
154
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
+ }
155
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 {};