@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
@@ -1,6 +1,25 @@
1
1
  import type { ZodType, ZodTypeDef } from "zod";
2
2
  import type { Tool, Schema } from "ai";
3
3
  import type { AIProviderName, AnalyticsData, EvaluationData } from "../core/types.js";
4
+ /**
5
+ * Interface for tool execution calls
6
+ */
7
+ export interface ToolCall {
8
+ toolName: string;
9
+ parameters: Record<string, any>;
10
+ id?: string;
11
+ }
12
+ /**
13
+ * Interface for tool execution results
14
+ */
15
+ export interface ToolResult {
16
+ toolName: string;
17
+ status: "success" | "failure";
18
+ output?: any;
19
+ error?: string;
20
+ id?: string;
21
+ executionTime?: number;
22
+ }
4
23
  /**
5
24
  * Stream function options interface - Primary method for streaming content
6
25
  * Future-ready for multi-modal capabilities while maintaining text focus
@@ -26,6 +45,7 @@ export interface StreamOptions {
26
45
  tools?: Record<string, Tool>;
27
46
  timeout?: number | string;
28
47
  disableTools?: boolean;
48
+ maxSteps?: number;
29
49
  enableEvaluation?: boolean;
30
50
  enableAnalytics?: boolean;
31
51
  context?: Record<string, any>;
@@ -46,30 +66,22 @@ export interface StreamResult {
46
66
  }>;
47
67
  provider?: string;
48
68
  model?: string;
69
+ usage?: {
70
+ inputTokens?: number;
71
+ outputTokens?: number;
72
+ totalTokens?: number;
73
+ };
74
+ finishReason?: string;
75
+ toolCalls?: ToolCall[];
76
+ toolResults?: ToolResult[];
49
77
  metadata?: {
50
78
  streamId?: string;
51
79
  startTime?: number;
52
80
  totalChunks?: number;
53
81
  estimatedDuration?: number;
82
+ responseTime?: number;
83
+ fallback?: boolean;
54
84
  };
55
- toolCalls?: Array<{
56
- toolCallId: string;
57
- toolName: string;
58
- args: Record<string, any>;
59
- }>;
60
- toolsUsed?: string[];
61
- toolExecutions?: Array<{
62
- name: string;
63
- input: Record<string, any>;
64
- output: any;
65
- duration: number;
66
- }>;
67
- enhancedWithTools?: boolean;
68
- availableTools?: Array<{
69
- name: string;
70
- description: string;
71
- parameters: Record<string, any>;
72
- }>;
73
85
  analytics?: AnalyticsData;
74
86
  evaluation?: EvaluationData;
75
87
  }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Universal Provider Options Interface (Phase 1: Factory Pattern)
3
+ * Based on TypeScript factory pattern best practices for AI provider abstraction
4
+ */
5
+ /**
6
+ * Base configuration interface for all AI providers
7
+ * Uses Parameter Object Pattern for flexible, extensible configuration
8
+ */
9
+ export interface UniversalProviderOptions {
10
+ prompt?: string;
11
+ model?: string;
12
+ temperature?: number;
13
+ maxTokens?: number;
14
+ systemPrompt?: string;
15
+ enableAnalytics?: boolean;
16
+ enableEvaluation?: boolean;
17
+ context?: Record<string, unknown>;
18
+ metadata?: Record<string, unknown>;
19
+ extensionOptions?: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Generic provider options (without providerType)
23
+ */
24
+ export type GenericProviderOptions = Omit<UniversalProviderOptions, "providerType">;
25
+ /**
26
+ * Provider-specific configuration extensions
27
+ * Discriminated union pattern for type-safe provider configs
28
+ */
29
+ export interface OpenAIProviderOptions extends UniversalProviderOptions {
30
+ providerType: "openai";
31
+ organization?: string;
32
+ seed?: number;
33
+ topP?: number;
34
+ }
35
+ export interface GoogleAIProviderOptions extends UniversalProviderOptions {
36
+ providerType: "google-ai";
37
+ topK?: number;
38
+ candidateCount?: number;
39
+ stopSequences?: string[];
40
+ }
41
+ export interface AnthropicProviderOptions extends UniversalProviderOptions {
42
+ providerType: "anthropic";
43
+ topK?: number;
44
+ stopSequences?: string[];
45
+ }
46
+ export interface BedrockProviderOptions extends UniversalProviderOptions {
47
+ providerType: "bedrock";
48
+ inferenceProfileArn?: string;
49
+ region?: string;
50
+ }
51
+ /**
52
+ * Discriminated union for type-safe provider configuration
53
+ * Enables compile-time type checking for provider-specific options
54
+ */
55
+ export type ProviderSpecificOptions = OpenAIProviderOptions | GoogleAIProviderOptions | AnthropicProviderOptions | BedrockProviderOptions;
56
+ /**
57
+ * Factory configuration interface
58
+ * Supports both universal and provider-specific parameters
59
+ */
60
+ export interface ProviderFactoryConfig {
61
+ providerName: string;
62
+ modelName?: string;
63
+ options?: UniversalProviderOptions | ProviderSpecificOptions;
64
+ enableMCP?: boolean;
65
+ }
66
+ /**
67
+ * Parameter normalization utilities
68
+ * Converts between different parameter formats for backward compatibility
69
+ */
70
+ export declare class ParameterNormalizer {
71
+ /**
72
+ * Normalize legacy parameter formats to universal format
73
+ */
74
+ static normalizeToUniversal(optionsOrPrompt: UniversalProviderOptions | string): UniversalProviderOptions;
75
+ /**
76
+ * Retrieve the provider type if it exists, otherwise return null
77
+ */
78
+ private static getProviderType;
79
+ /**
80
+ * Extract provider-specific parameters safely
81
+ */
82
+ static extractProviderOptions<T extends ProviderSpecificOptions>(options: UniversalProviderOptions | ProviderSpecificOptions, providerType: T["providerType"]): T | GenericProviderOptions;
83
+ /**
84
+ * Merge default values with user-provided options
85
+ */
86
+ static mergeWithDefaults(options: UniversalProviderOptions, defaults: Partial<UniversalProviderOptions>): UniversalProviderOptions;
87
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Universal Provider Options Interface (Phase 1: Factory Pattern)
3
+ * Based on TypeScript factory pattern best practices for AI provider abstraction
4
+ */
5
+ /**
6
+ * Parameter normalization utilities
7
+ * Converts between different parameter formats for backward compatibility
8
+ */
9
+ export class ParameterNormalizer {
10
+ /**
11
+ * Normalize legacy parameter formats to universal format
12
+ */
13
+ static normalizeToUniversal(optionsOrPrompt) {
14
+ if (typeof optionsOrPrompt === "string") {
15
+ return { prompt: optionsOrPrompt };
16
+ }
17
+ return optionsOrPrompt;
18
+ }
19
+ /**
20
+ * Retrieve the provider type if it exists, otherwise return null
21
+ */
22
+ static getProviderType(options) {
23
+ return "providerType" in options ? options.providerType : null;
24
+ }
25
+ /**
26
+ * Extract provider-specific parameters safely
27
+ */
28
+ static extractProviderOptions(options, providerType) {
29
+ const currentProviderType = ParameterNormalizer.getProviderType(options);
30
+ if (currentProviderType === providerType) {
31
+ return options;
32
+ }
33
+ // Handle case where options has providerType but doesn't match
34
+ if (currentProviderType !== null) {
35
+ const { providerType: _providerType, ...genericOptions } = options;
36
+ return genericOptions;
37
+ }
38
+ // Options don't have providerType, return as generic
39
+ return options;
40
+ }
41
+ /**
42
+ * Merge default values with user-provided options
43
+ */
44
+ static mergeWithDefaults(options, defaults) {
45
+ return {
46
+ ...defaults,
47
+ ...options,
48
+ // Merge nested objects
49
+ context: { ...defaults.context, ...options.context },
50
+ metadata: { ...defaults.metadata, ...options.metadata },
51
+ };
52
+ }
53
+ }
@@ -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;
@@ -140,8 +140,52 @@ export const initializeMCPTools = async (sessionId, client, context) => {
140
140
  * Get all available tools across all servers
141
141
  * Useful for documentation and discovery
142
142
  */
143
- export async function getAllAvailableTools() {
143
+ export async function getAllAvailableTools(inMemoryServers) {
144
144
  const tools = [];
145
+ // Add in-memory server tools first
146
+ if (inMemoryServers) {
147
+ for (const [serverId, serverConfig] of inMemoryServers) {
148
+ const server = serverConfig.server;
149
+ if (server && server.tools) {
150
+ // Handle both Map and object formats
151
+ const toolEntries = server.tools instanceof Map
152
+ ? Array.from(server.tools.entries())
153
+ : Object.entries(server.tools || {});
154
+ for (const [toolName, toolInfo] of toolEntries) {
155
+ const prefix = `${serverId}_`;
156
+ const finalToolName = toolName.length > 64 - prefix.length
157
+ ? toolName.substring(0, 64 - prefix.length)
158
+ : toolName;
159
+ const namespacedName = sanitizeToolName(`${prefix}${finalToolName}`);
160
+ // Handle different tool info structures
161
+ let description = `Tool from ${serverId}`;
162
+ let isImplemented = true;
163
+ if (toolInfo) {
164
+ // Check if it's a tool info object with description
165
+ if (typeof toolInfo.description === "string") {
166
+ description = toolInfo.description;
167
+ }
168
+ else if (typeof toolInfo === "function") {
169
+ // It's a raw function, no description available
170
+ description = `${toolName} from ${serverId}`;
171
+ }
172
+ // Check implementation status
173
+ if (typeof toolInfo.isImplemented === "boolean") {
174
+ isImplemented = toolInfo.isImplemented;
175
+ }
176
+ }
177
+ tools.push({
178
+ serverId,
179
+ serverTitle: server.title || serverId,
180
+ toolName,
181
+ namespacedName,
182
+ description,
183
+ isImplemented,
184
+ });
185
+ }
186
+ }
187
+ }
188
+ }
145
189
  const servers = await mcpConfig.getServers();
146
190
  servers.forEach((server) => {
147
191
  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
  */
@@ -4,7 +4,7 @@
4
4
  import { MCPRegistry } from "./registry.js";
5
5
  import { discoverMCPServers, autoRegisterMCPServers, } from "./auto-discovery.js";
6
6
  import { unifiedRegistryLogger } from "./logging.js";
7
- import { MCPToolRegistry, } from "./tool-registry.js";
7
+ import { MCPToolRegistry, defaultToolRegistry, } from "./tool-registry.js";
8
8
  import { TransportManager, TransportConfigSchema, } from "./transport-manager.js";
9
9
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
10
  import { ErrorManager } from "./error-manager.js";
@@ -31,8 +31,18 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
31
31
  */
32
32
  async initialize(options = {}) {
33
33
  unifiedRegistryLogger.info("Initializing unified MCP registry...");
34
- // Load manual configuration first
35
- await this.loadManualConfig();
34
+ // Import ProviderRegistry to check options
35
+ const { ProviderRegistry } = await import("../factories/provider-registry.js");
36
+ const registryOptions = ProviderRegistry.getOptions();
37
+ // Only load manual config if explicitly enabled (CLI mode)
38
+ if (registryOptions.enableManualMCP) {
39
+ unifiedRegistryLogger.info("Manual MCP config enabled - loading .mcp-config.json");
40
+ await this.loadManualConfig();
41
+ await this.connectManualServers();
42
+ }
43
+ else {
44
+ unifiedRegistryLogger.debug("Manual MCP config disabled - skipping .mcp-config.json");
45
+ }
36
46
  if (this.autoDiscoveryEnabled) {
37
47
  const result = await autoRegisterMCPServers(options);
38
48
  unifiedRegistryLogger.info(`Auto-discovery complete: ${result.registered} registered, ${result.failed} failed`);
@@ -96,6 +106,29 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
96
106
  unifiedRegistryLogger.error("Failed to load manual config:", error instanceof Error ? error.message : String(error));
97
107
  }
98
108
  }
109
+ /**
110
+ * Connect to manually configured servers
111
+ */
112
+ async connectManualServers() {
113
+ for (const [serverId, serverConfig] of this.manualServers.entries()) {
114
+ try {
115
+ unifiedRegistryLogger.info(`Connecting to manual server: ${serverId}`);
116
+ // Use addExternalServer method which properly establishes connections
117
+ await this.addExternalServer(serverId, {
118
+ type: "stdio",
119
+ command: serverConfig.command || "npx",
120
+ args: serverConfig.args || [],
121
+ env: serverConfig.env,
122
+ });
123
+ unifiedRegistryLogger.info(`Successfully connected manual server: ${serverId}`);
124
+ }
125
+ catch (error) {
126
+ unifiedRegistryLogger.error(`Failed to connect manual server ${serverId}:`, error instanceof Error ? error.message : String(error));
127
+ // Remove from available servers if connection fails
128
+ this.availableServers.delete(serverId);
129
+ }
130
+ }
131
+ }
99
132
  /**
100
133
  * Enable or disable auto-discovery
101
134
  */
@@ -142,8 +175,8 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
142
175
  async listAllTools() {
143
176
  const allTools = [];
144
177
  try {
145
- // FIXED: Get built-in tools from base registry
146
- const builtInTools = await super.listTools();
178
+ // FIXED: Get built-in tools from defaultToolRegistry where they are actually registered
179
+ const builtInTools = await defaultToolRegistry.listTools();
147
180
  allTools.push(...builtInTools.map((tool) => ({
148
181
  ...tool,
149
182
  id: tool.name,
@@ -151,7 +184,7 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
151
184
  source: "built-in",
152
185
  isExternal: false,
153
186
  })));
154
- unifiedRegistryLogger.debug(`Found ${builtInTools.length} built-in tools`);
187
+ unifiedRegistryLogger.debug(`Found ${builtInTools.length} built-in tools from defaultToolRegistry`);
155
188
  }
156
189
  catch (error) {
157
190
  unifiedRegistryLogger.warn("Failed to get built-in tools:", error);
@@ -195,10 +228,10 @@ export class UnifiedMCPRegistry extends MCPToolRegistry {
195
228
  */
196
229
  async executeTool(toolName, args, context) {
197
230
  unifiedRegistryLogger.info(`Executing tool: ${toolName}`);
198
- // STEP 1: Try built-in tools first
231
+ // STEP 1: Try built-in tools first from defaultToolRegistry
199
232
  try {
200
- const result = await super.executeTool(toolName, args, context);
201
- unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via built-in registry`);
233
+ const result = await defaultToolRegistry.executeTool(toolName, args, context);
234
+ unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via defaultToolRegistry`);
202
235
  return result;
203
236
  }
204
237
  catch (builtInError) {