@juspay/neurolink 5.1.0 → 5.2.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 (166) hide show
  1. package/CHANGELOG.md +15 -9
  2. package/README.md +123 -126
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/cli/commands/config.d.ts +3 -3
  5. package/dist/cli/commands/mcp.js +8 -7
  6. package/dist/cli/factories/command-factory.d.ts +4 -0
  7. package/dist/cli/factories/command-factory.js +57 -3
  8. package/dist/cli/index.js +87 -140
  9. package/dist/core/base-provider.d.ts +423 -0
  10. package/dist/core/base-provider.js +365 -0
  11. package/dist/core/constants.d.ts +1 -1
  12. package/dist/core/constants.js +1 -1
  13. package/dist/core/dynamic-models.d.ts +6 -6
  14. package/dist/core/evaluation.d.ts +19 -80
  15. package/dist/core/evaluation.js +185 -484
  16. package/dist/core/factory.d.ts +3 -3
  17. package/dist/core/factory.js +31 -91
  18. package/dist/core/service-registry.d.ts +47 -0
  19. package/dist/core/service-registry.js +112 -0
  20. package/dist/core/types.d.ts +8 -1
  21. package/dist/factories/compatibility-factory.js +1 -1
  22. package/dist/factories/provider-factory.d.ts +72 -0
  23. package/dist/factories/provider-factory.js +144 -0
  24. package/dist/factories/provider-registry.d.ts +38 -0
  25. package/dist/factories/provider-registry.js +107 -0
  26. package/dist/index.d.ts +4 -3
  27. package/dist/index.js +2 -4
  28. package/dist/lib/agent/direct-tools.d.ts +6 -6
  29. package/dist/lib/core/base-provider.d.ts +423 -0
  30. package/dist/lib/core/base-provider.js +365 -0
  31. package/dist/lib/core/constants.d.ts +1 -1
  32. package/dist/lib/core/constants.js +1 -1
  33. package/dist/lib/core/dynamic-models.d.ts +6 -6
  34. package/dist/lib/core/evaluation.d.ts +19 -80
  35. package/dist/lib/core/evaluation.js +185 -484
  36. package/dist/lib/core/factory.d.ts +3 -3
  37. package/dist/lib/core/factory.js +30 -91
  38. package/dist/lib/core/service-registry.d.ts +47 -0
  39. package/dist/lib/core/service-registry.js +112 -0
  40. package/dist/lib/core/types.d.ts +8 -1
  41. package/dist/lib/factories/compatibility-factory.js +1 -1
  42. package/dist/lib/factories/provider-factory.d.ts +72 -0
  43. package/dist/lib/factories/provider-factory.js +144 -0
  44. package/dist/lib/factories/provider-registry.d.ts +38 -0
  45. package/dist/lib/factories/provider-registry.js +107 -0
  46. package/dist/lib/index.d.ts +4 -3
  47. package/dist/lib/index.js +2 -4
  48. package/dist/lib/mcp/config.js +28 -3
  49. package/dist/lib/mcp/function-calling.js +1 -1
  50. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  51. package/dist/lib/mcp/initialize-tools.js +45 -1
  52. package/dist/lib/mcp/initialize.js +16 -6
  53. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  54. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  55. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
  56. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  57. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  58. package/dist/lib/mcp/unified-registry.js +42 -9
  59. package/dist/lib/neurolink.d.ts +156 -117
  60. package/dist/lib/neurolink.js +619 -404
  61. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  62. package/dist/lib/providers/amazon-bedrock.js +143 -0
  63. package/dist/lib/providers/analytics-helper.js +7 -4
  64. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  65. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  66. package/dist/lib/providers/anthropic.d.ts +19 -43
  67. package/dist/lib/providers/anthropic.js +82 -306
  68. package/dist/lib/providers/azure-openai.d.ts +20 -0
  69. package/dist/lib/providers/azure-openai.js +89 -0
  70. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  71. package/dist/lib/providers/google-ai-studio.js +107 -0
  72. package/dist/lib/providers/google-vertex.d.ts +47 -0
  73. package/dist/lib/providers/google-vertex.js +205 -0
  74. package/dist/lib/providers/huggingFace.d.ts +32 -25
  75. package/dist/lib/providers/huggingFace.js +97 -431
  76. package/dist/lib/providers/index.d.ts +9 -9
  77. package/dist/lib/providers/index.js +9 -9
  78. package/dist/lib/providers/mcp-provider.js +4 -0
  79. package/dist/lib/providers/mistral.d.ts +42 -0
  80. package/dist/lib/providers/mistral.js +160 -0
  81. package/dist/lib/providers/ollama.d.ts +52 -36
  82. package/dist/lib/providers/ollama.js +297 -520
  83. package/dist/lib/providers/openAI.d.ts +19 -18
  84. package/dist/lib/providers/openAI.js +76 -275
  85. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  86. package/dist/lib/sdk/tool-extension.js +283 -0
  87. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  88. package/dist/lib/sdk/tool-registration.js +167 -0
  89. package/dist/lib/types/generate-types.d.ts +1 -0
  90. package/dist/lib/types/mcp-types.d.ts +116 -0
  91. package/dist/lib/types/mcp-types.js +5 -0
  92. package/dist/lib/types/stream-types.d.ts +30 -18
  93. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  94. package/dist/lib/types/universal-provider-options.js +53 -0
  95. package/dist/mcp/config.js +28 -3
  96. package/dist/mcp/function-calling.js +1 -1
  97. package/dist/mcp/initialize-tools.d.ts +1 -1
  98. package/dist/mcp/initialize-tools.js +45 -1
  99. package/dist/mcp/initialize.js +16 -6
  100. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  101. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  102. package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
  103. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  104. package/dist/mcp/unified-registry.d.ts +4 -0
  105. package/dist/mcp/unified-registry.js +42 -9
  106. package/dist/neurolink.d.ts +156 -117
  107. package/dist/neurolink.js +619 -404
  108. package/dist/providers/amazon-bedrock.d.ts +32 -0
  109. package/dist/providers/amazon-bedrock.js +143 -0
  110. package/dist/providers/analytics-helper.js +7 -4
  111. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  112. package/dist/providers/anthropic-baseprovider.js +114 -0
  113. package/dist/providers/anthropic.d.ts +19 -43
  114. package/dist/providers/anthropic.js +81 -305
  115. package/dist/providers/azure-openai.d.ts +20 -0
  116. package/dist/providers/azure-openai.js +89 -0
  117. package/dist/providers/google-ai-studio.d.ts +23 -0
  118. package/dist/providers/google-ai-studio.js +108 -0
  119. package/dist/providers/google-vertex.d.ts +47 -0
  120. package/dist/providers/google-vertex.js +205 -0
  121. package/dist/providers/huggingFace.d.ts +32 -25
  122. package/dist/providers/huggingFace.js +96 -430
  123. package/dist/providers/index.d.ts +9 -9
  124. package/dist/providers/index.js +9 -9
  125. package/dist/providers/mcp-provider.js +4 -0
  126. package/dist/providers/mistral.d.ts +42 -0
  127. package/dist/providers/mistral.js +160 -0
  128. package/dist/providers/ollama.d.ts +52 -36
  129. package/dist/providers/ollama.js +297 -519
  130. package/dist/providers/openAI.d.ts +19 -18
  131. package/dist/providers/openAI.js +76 -276
  132. package/dist/sdk/tool-extension.d.ts +181 -0
  133. package/dist/sdk/tool-extension.js +283 -0
  134. package/dist/sdk/tool-registration.d.ts +95 -0
  135. package/dist/sdk/tool-registration.js +168 -0
  136. package/dist/types/generate-types.d.ts +1 -0
  137. package/dist/types/mcp-types.d.ts +116 -0
  138. package/dist/types/mcp-types.js +5 -0
  139. package/dist/types/stream-types.d.ts +30 -18
  140. package/dist/types/universal-provider-options.d.ts +87 -0
  141. package/dist/types/universal-provider-options.js +53 -0
  142. package/package.json +15 -10
  143. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
  144. package/dist/lib/providers/agent-enhanced-provider.js +0 -605
  145. package/dist/lib/providers/amazonBedrock.d.ts +0 -28
  146. package/dist/lib/providers/amazonBedrock.js +0 -364
  147. package/dist/lib/providers/azureOpenAI.d.ts +0 -42
  148. package/dist/lib/providers/azureOpenAI.js +0 -347
  149. package/dist/lib/providers/googleAIStudio.d.ts +0 -42
  150. package/dist/lib/providers/googleAIStudio.js +0 -364
  151. package/dist/lib/providers/googleVertexAI.d.ts +0 -34
  152. package/dist/lib/providers/googleVertexAI.js +0 -547
  153. package/dist/lib/providers/mistralAI.d.ts +0 -37
  154. package/dist/lib/providers/mistralAI.js +0 -325
  155. package/dist/providers/agent-enhanced-provider.d.ts +0 -93
  156. package/dist/providers/agent-enhanced-provider.js +0 -606
  157. package/dist/providers/amazonBedrock.d.ts +0 -28
  158. package/dist/providers/amazonBedrock.js +0 -364
  159. package/dist/providers/azureOpenAI.d.ts +0 -42
  160. package/dist/providers/azureOpenAI.js +0 -348
  161. package/dist/providers/googleAIStudio.d.ts +0 -42
  162. package/dist/providers/googleAIStudio.js +0 -364
  163. package/dist/providers/googleVertexAI.d.ts +0 -34
  164. package/dist/providers/googleVertexAI.js +0 -547
  165. package/dist/providers/mistralAI.d.ts +0 -37
  166. package/dist/providers/mistralAI.js +0 -325
@@ -0,0 +1,107 @@
1
+ import { ProviderFactory } from "./provider-factory.js";
2
+ // ✅ FINAL CIRCULAR DEPENDENCY FIX: Lazy loading all providers
3
+ // Removed all static imports - providers loaded dynamically when needed
4
+ // This breaks the circular dependency chain completely
5
+ import { AIProviderName, GoogleAIModels, OpenAIModels } from "../core/types.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /**
8
+ * Provider Registry - registers all providers with the factory
9
+ * This is where we migrate providers one by one to the new pattern
10
+ */
11
+ export class ProviderRegistry {
12
+ static registered = false;
13
+ static options = {
14
+ enableManualMCP: false, // Default to disabled for safety
15
+ };
16
+ /**
17
+ * Register all providers with the factory
18
+ */
19
+ static async registerAllProviders() {
20
+ if (this.registered) {
21
+ return;
22
+ }
23
+ try {
24
+ // ✅ LAZY LOADING: Register providers with dynamic import factory functions
25
+ const { ProviderFactory } = await import("./provider-factory.js");
26
+ // Register Google AI Studio Provider (our validated baseline)
27
+ ProviderFactory.registerProvider(AIProviderName.GOOGLE_AI, async (modelName, providerName, sdk) => {
28
+ const { GoogleAIStudioProvider } = await import("../providers/google-ai-studio.js");
29
+ return new GoogleAIStudioProvider(modelName, sdk);
30
+ }, GoogleAIModels.GEMINI_2_5_FLASH, ["google-ai-studio", "google", "gemini", "google-ai"]);
31
+ // Register OpenAI provider
32
+ ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, providerName, sdk) => {
33
+ const { OpenAIProvider } = await import("../providers/openAI.js");
34
+ return new OpenAIProvider(modelName);
35
+ }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"]);
36
+ // Register Anthropic provider
37
+ ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, providerName, sdk) => {
38
+ const { AnthropicProvider } = await import("../providers/anthropic.js");
39
+ return new AnthropicProvider(modelName, sdk);
40
+ }, "claude-3-5-sonnet-20241022", ["claude", "anthropic"]);
41
+ // Register Amazon Bedrock provider
42
+ ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName) => {
43
+ const { AmazonBedrockProvider } = await import("../providers/amazon-bedrock.js");
44
+ return new AmazonBedrockProvider(modelName);
45
+ }, undefined, // Let provider read BEDROCK_MODEL from .env
46
+ ["bedrock", "aws"]);
47
+ // Register Azure OpenAI provider
48
+ ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName) => {
49
+ const { AzureOpenAIProvider } = await import("../providers/azure-openai.js");
50
+ return new AzureOpenAIProvider(modelName);
51
+ }, "gpt-4o-mini", ["azure", "azure-openai"]);
52
+ // Register Google Vertex AI provider
53
+ ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName) => {
54
+ const { GoogleVertexProvider } = await import("../providers/google-vertex.js");
55
+ return new GoogleVertexProvider(modelName);
56
+ }, "gemini-2.5-pro", ["vertex", "google-vertex"]);
57
+ // Register Hugging Face provider (Unified Router implementation)
58
+ ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
59
+ const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
60
+ return new HuggingFaceProvider(modelName);
61
+ }, process.env.HUGGINGFACE_MODEL || "microsoft/DialoGPT-medium", ["huggingface", "hf"]);
62
+ // Register Mistral AI provider
63
+ ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, providerName, sdk) => {
64
+ const { MistralProvider } = await import("../providers/mistral.js");
65
+ return new MistralProvider(modelName, sdk);
66
+ }, "mistral-large-latest", ["mistral"]);
67
+ // Register Ollama provider
68
+ ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName) => {
69
+ const { OllamaProvider } = await import("../providers/ollama.js");
70
+ return new OllamaProvider(modelName);
71
+ }, process.env.OLLAMA_MODEL || "llama3.1:8b", ["ollama", "local"]);
72
+ logger.debug("All providers registered successfully");
73
+ this.registered = true;
74
+ }
75
+ catch (error) {
76
+ logger.error("Failed to register providers:", error);
77
+ throw error;
78
+ }
79
+ }
80
+ /**
81
+ * Check if providers are registered
82
+ */
83
+ static isRegistered() {
84
+ return this.registered;
85
+ }
86
+ /**
87
+ * Clear registrations (for testing)
88
+ */
89
+ static clearRegistrations() {
90
+ ProviderFactory.clearRegistrations();
91
+ this.registered = false;
92
+ }
93
+ /**
94
+ * Set registry options (should be called before initialization)
95
+ */
96
+ static setOptions(options) {
97
+ this.options = { ...this.options, ...options };
98
+ logger.debug("Provider registry options updated:", this.options);
99
+ }
100
+ /**
101
+ * Get current registry options
102
+ */
103
+ static getOptions() {
104
+ return { ...this.options };
105
+ }
106
+ }
107
+ // Note: Providers are registered explicitly when needed to avoid circular dependencies
@@ -12,12 +12,13 @@ export type { AIProvider, AIProviderName, ProviderConfig, StreamingOptions, Prov
12
12
  export type { GenerateOptions, GenerateResult, EnhancedProvider, } from "./types/generate-types.js";
13
13
  export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
14
14
  export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
15
+ export type { SimpleTool, ToolContext } from "./sdk/tool-registration.js";
16
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
17
+ export type { InMemoryMCPServerConfig, InMemoryToolInfo, InMemoryToolResult, } from "./types/mcp-types.js";
15
18
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
16
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
17
- export type { ProviderName } from "./providers/index.js";
18
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
19
19
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
20
20
  export { NeuroLink } from "./neurolink.js";
21
+ export type { ProviderStatus, MCPStatus, MCPServerInfo } from "./neurolink.js";
21
22
  export declare const VERSION = "1.0.0";
22
23
  /**
23
24
  * Quick start factory function
package/dist/lib/index.js CHANGED
@@ -11,14 +11,12 @@ import { AIProviderFactory } from "./core/factory.js";
11
11
  export { AIProviderFactory };
12
12
  export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
13
13
  export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
14
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
14
15
  // Model enums
15
16
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
16
- // Provider exports
17
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
18
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
19
17
  // Utility exports
20
18
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
21
- // Main NeuroLink wrapper class
19
+ // Main NeuroLink wrapper class and diagnostic types
22
20
  export { NeuroLink } from "./neurolink.js";
23
21
  // Version
24
22
  export const VERSION = "1.0.0";
@@ -3,15 +3,36 @@
3
3
  * Central registry for all MCP servers following Lighthouse patterns
4
4
  * Handles built-in servers only - auto-discovery handled by unified registry
5
5
  */
6
- import { aiCoreServer } from "./servers/ai-providers/ai-core-server.js";
7
6
  import { utilityServer } from "./servers/utilities/utility-server.js";
8
7
  import { logger } from "../utils/logger.js";
8
+ /**
9
+ * Lazy-loaded AI Core Server to avoid circular dependencies
10
+ */
11
+ let aiCoreServerCache = null;
12
+ async function getAICoreServer() {
13
+ if (!aiCoreServerCache) {
14
+ const { aiCoreServer } = await import("./servers/ai-providers/ai-core-server.js");
15
+ aiCoreServerCache = aiCoreServer;
16
+ }
17
+ return aiCoreServerCache;
18
+ }
19
+ /**
20
+ * Lazy-loaded Direct Tools Server to avoid circular dependencies
21
+ */
22
+ let directToolsServerCache = null;
23
+ async function getDirectToolsServer() {
24
+ if (!directToolsServerCache) {
25
+ const { directToolsServer } = await import("./servers/agent/direct-tools-server.js");
26
+ directToolsServerCache = directToolsServer;
27
+ }
28
+ return directToolsServerCache;
29
+ }
9
30
  /**
10
31
  * Built-in MCP servers (kept for backward compatibility)
11
32
  * Add new servers here as they are created
12
33
  */
13
34
  export const allServers = [
14
- aiCoreServer,
35
+ // aiCoreServer will be added dynamically in getServers()
15
36
  utilityServer,
16
37
  // Add more servers as they are created
17
38
  ];
@@ -25,8 +46,12 @@ export const mcpConfig = {
25
46
  */
26
47
  getServers: async () => {
27
48
  const activeServers = [];
49
+ // Get all servers including dynamically loaded ones
50
+ const aiCoreServer = await getAICoreServer();
51
+ const directToolsServer = await getDirectToolsServer();
52
+ const servers = [aiCoreServer, directToolsServer, ...allServers];
28
53
  // Include built-in servers with filtering
29
- for (const server of allServers) {
54
+ for (const server of servers) {
30
55
  const implementedTools = {};
31
56
  let hasImplementedTools = false;
32
57
  for (const toolName in server.tools) {
@@ -58,7 +58,7 @@ export async function getAvailableFunctionTools() {
58
58
  const toolMap = new Map();
59
59
  try {
60
60
  // Add overall timeout for the entire function
61
- const overallTimeoutMs = 5000; // 5 seconds max for everything
61
+ const overallTimeoutMs = process.env.NODE_ENV === "test" ? 30000 : 15000; // 30s for tests, 15s for production
62
62
  let overallTimeoutId;
63
63
  const overallTimeoutPromise = new Promise((_, reject) => {
64
64
  overallTimeoutId = setTimeout(() => {
@@ -13,7 +13,7 @@ export declare const initializeMCPTools: (sessionId: string, client: NeuroLinkMC
13
13
  * Get all available tools across all servers
14
14
  * Useful for documentation and discovery
15
15
  */
16
- export declare function getAllAvailableTools(): Promise<Array<{
16
+ export declare function getAllAvailableTools(inMemoryServers?: Map<string, any>): Promise<Array<{
17
17
  serverId: string;
18
18
  serverTitle: string;
19
19
  toolName: string;
@@ -139,8 +139,52 @@ export const initializeMCPTools = async (sessionId, client, context) => {
139
139
  * Get all available tools across all servers
140
140
  * Useful for documentation and discovery
141
141
  */
142
- export async function getAllAvailableTools() {
142
+ export async function getAllAvailableTools(inMemoryServers) {
143
143
  const tools = [];
144
+ // Add in-memory server tools first
145
+ if (inMemoryServers) {
146
+ for (const [serverId, serverConfig] of inMemoryServers) {
147
+ const server = serverConfig.server;
148
+ if (server && server.tools) {
149
+ // Handle both Map and object formats
150
+ const toolEntries = server.tools instanceof Map
151
+ ? Array.from(server.tools.entries())
152
+ : Object.entries(server.tools || {});
153
+ for (const [toolName, toolInfo] of toolEntries) {
154
+ const prefix = `${serverId}_`;
155
+ const finalToolName = toolName.length > 64 - prefix.length
156
+ ? toolName.substring(0, 64 - prefix.length)
157
+ : toolName;
158
+ const namespacedName = sanitizeToolName(`${prefix}${finalToolName}`);
159
+ // Handle different tool info structures
160
+ let description = `Tool from ${serverId}`;
161
+ let isImplemented = true;
162
+ if (toolInfo) {
163
+ // Check if it's a tool info object with description
164
+ if (typeof toolInfo.description === "string") {
165
+ description = toolInfo.description;
166
+ }
167
+ else if (typeof toolInfo === "function") {
168
+ // It's a raw function, no description available
169
+ description = `${toolName} from ${serverId}`;
170
+ }
171
+ // Check implementation status
172
+ if (typeof toolInfo.isImplemented === "boolean") {
173
+ isImplemented = toolInfo.isImplemented;
174
+ }
175
+ }
176
+ tools.push({
177
+ serverId,
178
+ serverTitle: server.title || serverId,
179
+ toolName,
180
+ namespacedName,
181
+ description,
182
+ isImplemented,
183
+ });
184
+ }
185
+ }
186
+ }
187
+ }
144
188
  const servers = await mcpConfig.getServers();
145
189
  servers.forEach((server) => {
146
190
  Object.entries(server.tools).forEach(([toolName, tool]) => {
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { toolRegistry, defaultToolRegistry, } from "./tool-registry.js";
7
7
  import { mcpLogger } from "./logging.js";
8
+ import { ServiceRegistry } from "../core/service-registry.js";
8
9
  let isInitialized = false;
9
10
  /**
10
11
  * Initialize NeuroLink MCP system by registering built-in servers
@@ -15,19 +16,28 @@ export async function initializeNeuroLinkMCP(targetRegistry) {
15
16
  }
16
17
  mcpLogger.debug("Initializing built-in MCP servers...");
17
18
  try {
19
+ // First, register AIProviderFactory in ServiceRegistry to break circular dependencies
20
+ ServiceRegistry.register("AIProviderFactory", async () => {
21
+ const { AIProviderFactory } = await import("../core/factory.js");
22
+ return AIProviderFactory;
23
+ });
24
+ mcpLogger.debug("Registered AIProviderFactory in ServiceRegistry");
18
25
  // Import utility server dynamically to avoid circular dependencies
19
- // Note: AI core server temporarily disabled due to circular dependency issues
20
26
  const { utilityServer } = await import("./servers/utilities/utility-server.js");
21
27
  // Register built-in NeuroLink servers with specified registry (or default)
22
28
  const registry = targetRegistry || toolRegistry;
23
29
  await registry.registerServer(utilityServer.id, utilityServer);
24
30
  mcpLogger.debug(`Registered neurolink-utility server with built-in tools in ${targetRegistry ? "target" : "default"} registry`);
25
- // TODO: Re-enable AI core server once circular dependencies are resolved
26
- // const { aiCoreServer } = await import('./servers/ai-providers/ai-core-server.js');
27
- // await registry.registerServer(aiCoreServer.id, aiCoreServer);
28
- // mcpLogger.debug('Registered neurolink-ai-core server with AI tools');
31
+ // Now safe to import and register AI core server
32
+ const { aiCoreServer } = await import("./servers/ai-providers/ai-core-server.js");
33
+ await registry.registerServer(aiCoreServer.id, aiCoreServer);
34
+ mcpLogger.debug("Registered neurolink-ai-core server with AI tools");
35
+ // Register direct tools server
36
+ const { directToolsServer } = await import("./servers/agent/direct-tools-server.js");
37
+ await registry.registerServer(directToolsServer.id, directToolsServer);
38
+ mcpLogger.debug("Registered neurolink-direct server with direct tools");
29
39
  const stats = await registry.getStats();
30
- mcpLogger.info(`Initialization complete: ${stats.totalServers} server, ${stats.totalTools} tools available`);
40
+ mcpLogger.info(`Initialization complete: ${stats.totalServers} servers, ${stats.totalTools} tools available`);
31
41
  isInitialized = true;
32
42
  }
33
43
  catch (error) {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * NeuroLink Direct Tools Server
3
+ * Wraps the agent direct tools as an MCP server for proper registration
4
+ */
5
+ /**
6
+ * Direct Tools Server - Agent direct tools for immediate use
7
+ */
8
+ export declare const directToolsServer: import("../../factory.js").NeuroLinkMCPServer;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * NeuroLink Direct Tools Server
3
+ * Wraps the agent direct tools as an MCP server for proper registration
4
+ */
5
+ import { createMCPServer } from "../../factory.js";
6
+ import { directAgentTools } from "../../../agent/direct-tools.js";
7
+ import { logger } from "../../../utils/logger.js";
8
+ /**
9
+ * Direct Tools Server - Agent direct tools for immediate use
10
+ */
11
+ export const directToolsServer = createMCPServer({
12
+ id: "neurolink-direct",
13
+ title: "NeuroLink Direct Tools Server",
14
+ description: "Provides direct agent tools for immediate execution",
15
+ category: "integrations",
16
+ version: "1.0.0",
17
+ });
18
+ /**
19
+ * Wrap each direct tool and register it with the server
20
+ */
21
+ Object.entries(directAgentTools).forEach(([toolName, toolDef]) => {
22
+ // The toolDef is a Vercel AI SDK Tool object
23
+ // Extract properties from the Tool object
24
+ const toolSpec = toolDef._spec || toolDef;
25
+ const description = toolSpec.description || `Direct tool: ${toolName}`;
26
+ const inputSchema = toolSpec.parameters;
27
+ const execute = toolSpec.execute;
28
+ directToolsServer.registerTool({
29
+ name: toolName,
30
+ description: description,
31
+ category: getToolCategory(toolName),
32
+ inputSchema: inputSchema,
33
+ isImplemented: true,
34
+ execute: async (params, context) => {
35
+ const startTime = Date.now();
36
+ try {
37
+ logger.debug(`[Direct Tools] Executing ${toolName} with params:`, params);
38
+ // Execute the direct tool
39
+ const result = await execute(params);
40
+ // Convert direct tool result to ToolResult format
41
+ if (result.success) {
42
+ return {
43
+ success: true,
44
+ data: result,
45
+ usage: {
46
+ executionTime: Date.now() - startTime,
47
+ },
48
+ metadata: {
49
+ toolName,
50
+ serverId: "neurolink-direct",
51
+ sessionId: context.sessionId,
52
+ },
53
+ };
54
+ }
55
+ else {
56
+ return {
57
+ success: false,
58
+ data: null,
59
+ error: result.error || "Unknown error",
60
+ usage: {
61
+ executionTime: Date.now() - startTime,
62
+ },
63
+ metadata: {
64
+ toolName,
65
+ serverId: "neurolink-direct",
66
+ sessionId: context.sessionId,
67
+ },
68
+ };
69
+ }
70
+ }
71
+ catch (error) {
72
+ logger.error(`[Direct Tools] Error executing ${toolName}:`, error);
73
+ return {
74
+ success: false,
75
+ data: null,
76
+ error: error instanceof Error ? error.message : String(error),
77
+ usage: {
78
+ executionTime: Date.now() - startTime,
79
+ },
80
+ metadata: {
81
+ toolName,
82
+ serverId: "neurolink-direct",
83
+ sessionId: context.sessionId,
84
+ },
85
+ };
86
+ }
87
+ },
88
+ });
89
+ });
90
+ /**
91
+ * Get tool category based on tool name
92
+ */
93
+ function getToolCategory(toolName) {
94
+ switch (toolName) {
95
+ case "getCurrentTime":
96
+ return "time";
97
+ case "calculateMath":
98
+ return "math";
99
+ case "readFile":
100
+ case "writeFile":
101
+ case "listDirectory":
102
+ case "searchFiles":
103
+ return "filesystem";
104
+ default:
105
+ return "utility";
106
+ }
107
+ }
108
+ // Log successful registration
109
+ logger.info(`[Direct Tools] Registered ${Object.keys(directAgentTools).length} direct tools`);
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { z } from "zod";
7
7
  import { createMCPServer } from "../../factory.js";
8
- import { AIProviderFactory } from "../../../core/factory.js";
8
+ import { ServiceRegistry } from "../../../core/service-registry.js";
9
9
  import { getBestProvider, getAvailableProviders, } from "../../../utils/providerUtils.js";
10
10
  import { logger } from "../../../utils/logger.js";
11
11
  import { analyzeAIUsageTool, benchmarkProviderPerformanceTool, optimizePromptParametersTool, } from "./ai-analysis-tools.js";
@@ -86,6 +86,8 @@ aiCoreServer.registerTool({
86
86
  logger.debug(`[AI-Core] Starting text generation: "${params.prompt.substring(0, 50)}..."`);
87
87
  // Use existing AIProviderFactory with best provider selection
88
88
  const selectedProvider = params.provider || (await getBestProvider(params.provider));
89
+ // Get AIProviderFactory from ServiceRegistry to avoid circular dependency
90
+ const AIProviderFactory = await ServiceRegistry.get("AIProviderFactory");
89
91
  const provider = await AIProviderFactory.createBestProvider(selectedProvider);
90
92
  // Generate text using existing NeuroLink patterns
91
93
  const result = await provider.generate({
@@ -88,14 +88,14 @@ export declare const workflowToolSchemas: {
88
88
  }, "strip", z.ZodTypeAny, {
89
89
  aiOutput: string;
90
90
  expectedBehavior: string;
91
- outputType: "text" | "code" | "conversation" | "structured-data";
91
+ outputType: "text" | "code" | "structured-data" | "conversation";
92
92
  includeFixSuggestions: boolean;
93
93
  context?: string | undefined;
94
94
  }, {
95
95
  aiOutput: string;
96
96
  expectedBehavior: string;
97
97
  context?: string | undefined;
98
- outputType?: "text" | "code" | "conversation" | "structured-data" | undefined;
98
+ outputType?: "text" | "code" | "structured-data" | "conversation" | undefined;
99
99
  includeFixSuggestions?: boolean | undefined;
100
100
  }>;
101
101
  };
@@ -26,6 +26,10 @@ export declare class UnifiedMCPRegistry extends MCPToolRegistry {
26
26
  * Load servers from .mcp-config.json
27
27
  */
28
28
  private loadManualConfig;
29
+ /**
30
+ * Connect to manually configured servers
31
+ */
32
+ private connectManualServers;
29
33
  /**
30
34
  * Enable or disable auto-discovery
31
35
  */
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { autoRegisterMCPServers, } from "./auto-discovery.js";
5
5
  import { unifiedRegistryLogger } from "./logging.js";
6
- import { MCPToolRegistry, } from "./tool-registry.js";
6
+ import { MCPToolRegistry, defaultToolRegistry, } from "./tool-registry.js";
7
7
  import { TransportManager, TransportConfigSchema, } from "./transport-manager.js";
8
8
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
9
9
  import { ErrorManager } from "./error-manager.js";
@@ -30,8 +30,18 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
30
30
  */
31
31
  async initialize(options = {}) {
32
32
  unifiedRegistryLogger.info("Initializing unified MCP registry...");
33
- // Load manual configuration first
34
- await this.loadManualConfig();
33
+ // Import ProviderRegistry to check options
34
+ const { ProviderRegistry } = await import("../factories/provider-registry.js");
35
+ const registryOptions = ProviderRegistry.getOptions();
36
+ // Only load manual config if explicitly enabled (CLI mode)
37
+ if (registryOptions.enableManualMCP) {
38
+ unifiedRegistryLogger.info("Manual MCP config enabled - loading .mcp-config.json");
39
+ await this.loadManualConfig();
40
+ await this.connectManualServers();
41
+ }
42
+ else {
43
+ unifiedRegistryLogger.debug("Manual MCP config disabled - skipping .mcp-config.json");
44
+ }
35
45
  if (this.autoDiscoveryEnabled) {
36
46
  const result = await autoRegisterMCPServers(options);
37
47
  unifiedRegistryLogger.info(`Auto-discovery complete: ${result.registered} registered, ${result.failed} failed`);
@@ -95,6 +105,29 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
95
105
  unifiedRegistryLogger.error("Failed to load manual config:", error instanceof Error ? error.message : String(error));
96
106
  }
97
107
  }
108
+ /**
109
+ * Connect to manually configured servers
110
+ */
111
+ async connectManualServers() {
112
+ for (const [serverId, serverConfig] of this.manualServers.entries()) {
113
+ try {
114
+ unifiedRegistryLogger.info(`Connecting to manual server: ${serverId}`);
115
+ // Use addExternalServer method which properly establishes connections
116
+ await this.addExternalServer(serverId, {
117
+ type: "stdio",
118
+ command: serverConfig.command || "npx",
119
+ args: serverConfig.args || [],
120
+ env: serverConfig.env,
121
+ });
122
+ unifiedRegistryLogger.info(`Successfully connected manual server: ${serverId}`);
123
+ }
124
+ catch (error) {
125
+ unifiedRegistryLogger.error(`Failed to connect manual server ${serverId}:`, error instanceof Error ? error.message : String(error));
126
+ // Remove from available servers if connection fails
127
+ this.availableServers.delete(serverId);
128
+ }
129
+ }
130
+ }
98
131
  /**
99
132
  * Enable or disable auto-discovery
100
133
  */
@@ -141,8 +174,8 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
141
174
  async listAllTools() {
142
175
  const allTools = [];
143
176
  try {
144
- // FIXED: Get built-in tools from base registry
145
- const builtInTools = await super.listTools();
177
+ // FIXED: Get built-in tools from defaultToolRegistry where they are actually registered
178
+ const builtInTools = await defaultToolRegistry.listTools();
146
179
  allTools.push(...builtInTools.map((tool) => ({
147
180
  ...tool,
148
181
  id: tool.name,
@@ -150,7 +183,7 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
150
183
  source: "built-in",
151
184
  isExternal: false,
152
185
  })));
153
- unifiedRegistryLogger.debug(`Found ${builtInTools.length} built-in tools`);
186
+ unifiedRegistryLogger.debug(`Found ${builtInTools.length} built-in tools from defaultToolRegistry`);
154
187
  }
155
188
  catch (error) {
156
189
  unifiedRegistryLogger.warn("Failed to get built-in tools:", error);
@@ -194,10 +227,10 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
194
227
  */
195
228
  async executeTool(toolName, args, context) {
196
229
  unifiedRegistryLogger.info(`Executing tool: ${toolName}`);
197
- // STEP 1: Try built-in tools first
230
+ // STEP 1: Try built-in tools first from defaultToolRegistry
198
231
  try {
199
- const result = await super.executeTool(toolName, args, context);
200
- unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via built-in registry`);
232
+ const result = await defaultToolRegistry.executeTool(toolName, args, context);
233
+ unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via defaultToolRegistry`);
201
234
  return result;
202
235
  }
203
236
  catch (builtInError) {