@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.
- package/CHANGELOG.md +15 -9
- package/README.md +123 -126
- package/dist/agent/direct-tools.d.ts +6 -6
- package/dist/cli/commands/config.d.ts +3 -3
- package/dist/cli/commands/mcp.js +8 -7
- package/dist/cli/factories/command-factory.d.ts +4 -0
- package/dist/cli/factories/command-factory.js +57 -3
- package/dist/cli/index.js +87 -140
- package/dist/core/base-provider.d.ts +423 -0
- package/dist/core/base-provider.js +365 -0
- package/dist/core/constants.d.ts +1 -1
- package/dist/core/constants.js +1 -1
- package/dist/core/dynamic-models.d.ts +6 -6
- package/dist/core/evaluation.d.ts +19 -80
- package/dist/core/evaluation.js +185 -484
- package/dist/core/factory.d.ts +3 -3
- package/dist/core/factory.js +31 -91
- package/dist/core/service-registry.d.ts +47 -0
- package/dist/core/service-registry.js +112 -0
- package/dist/core/types.d.ts +8 -1
- package/dist/factories/compatibility-factory.js +1 -1
- package/dist/factories/provider-factory.d.ts +72 -0
- package/dist/factories/provider-factory.js +144 -0
- package/dist/factories/provider-registry.d.ts +38 -0
- package/dist/factories/provider-registry.js +107 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -4
- package/dist/lib/agent/direct-tools.d.ts +6 -6
- package/dist/lib/core/base-provider.d.ts +423 -0
- package/dist/lib/core/base-provider.js +365 -0
- package/dist/lib/core/constants.d.ts +1 -1
- package/dist/lib/core/constants.js +1 -1
- package/dist/lib/core/dynamic-models.d.ts +6 -6
- package/dist/lib/core/evaluation.d.ts +19 -80
- package/dist/lib/core/evaluation.js +185 -484
- package/dist/lib/core/factory.d.ts +3 -3
- package/dist/lib/core/factory.js +30 -91
- package/dist/lib/core/service-registry.d.ts +47 -0
- package/dist/lib/core/service-registry.js +112 -0
- package/dist/lib/core/types.d.ts +8 -1
- package/dist/lib/factories/compatibility-factory.js +1 -1
- package/dist/lib/factories/provider-factory.d.ts +72 -0
- package/dist/lib/factories/provider-factory.js +144 -0
- package/dist/lib/factories/provider-registry.d.ts +38 -0
- package/dist/lib/factories/provider-registry.js +107 -0
- package/dist/lib/index.d.ts +4 -3
- package/dist/lib/index.js +2 -4
- package/dist/lib/mcp/config.js +28 -3
- package/dist/lib/mcp/function-calling.js +1 -1
- package/dist/lib/mcp/initialize-tools.d.ts +1 -1
- package/dist/lib/mcp/initialize-tools.js +45 -1
- package/dist/lib/mcp/initialize.js +16 -6
- package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
- package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
- package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/lib/mcp/unified-registry.d.ts +4 -0
- package/dist/lib/mcp/unified-registry.js +42 -9
- package/dist/lib/neurolink.d.ts +156 -117
- package/dist/lib/neurolink.js +619 -404
- package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
- package/dist/lib/providers/amazon-bedrock.js +143 -0
- package/dist/lib/providers/analytics-helper.js +7 -4
- package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
- package/dist/lib/providers/anthropic-baseprovider.js +114 -0
- package/dist/lib/providers/anthropic.d.ts +19 -43
- package/dist/lib/providers/anthropic.js +82 -306
- package/dist/lib/providers/azure-openai.d.ts +20 -0
- package/dist/lib/providers/azure-openai.js +89 -0
- package/dist/lib/providers/google-ai-studio.d.ts +23 -0
- package/dist/lib/providers/google-ai-studio.js +107 -0
- package/dist/lib/providers/google-vertex.d.ts +47 -0
- package/dist/lib/providers/google-vertex.js +205 -0
- package/dist/lib/providers/huggingFace.d.ts +32 -25
- package/dist/lib/providers/huggingFace.js +97 -431
- package/dist/lib/providers/index.d.ts +9 -9
- package/dist/lib/providers/index.js +9 -9
- package/dist/lib/providers/mcp-provider.js +4 -0
- package/dist/lib/providers/mistral.d.ts +42 -0
- package/dist/lib/providers/mistral.js +160 -0
- package/dist/lib/providers/ollama.d.ts +52 -36
- package/dist/lib/providers/ollama.js +297 -520
- package/dist/lib/providers/openAI.d.ts +19 -18
- package/dist/lib/providers/openAI.js +76 -275
- package/dist/lib/sdk/tool-extension.d.ts +181 -0
- package/dist/lib/sdk/tool-extension.js +283 -0
- package/dist/lib/sdk/tool-registration.d.ts +95 -0
- package/dist/lib/sdk/tool-registration.js +167 -0
- package/dist/lib/types/generate-types.d.ts +1 -0
- package/dist/lib/types/mcp-types.d.ts +116 -0
- package/dist/lib/types/mcp-types.js +5 -0
- package/dist/lib/types/stream-types.d.ts +30 -18
- package/dist/lib/types/universal-provider-options.d.ts +87 -0
- package/dist/lib/types/universal-provider-options.js +53 -0
- package/dist/mcp/config.js +28 -3
- package/dist/mcp/function-calling.js +1 -1
- package/dist/mcp/initialize-tools.d.ts +1 -1
- package/dist/mcp/initialize-tools.js +45 -1
- package/dist/mcp/initialize.js +16 -6
- package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
- package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
- package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/mcp/unified-registry.d.ts +4 -0
- package/dist/mcp/unified-registry.js +42 -9
- package/dist/neurolink.d.ts +156 -117
- package/dist/neurolink.js +619 -404
- package/dist/providers/amazon-bedrock.d.ts +32 -0
- package/dist/providers/amazon-bedrock.js +143 -0
- package/dist/providers/analytics-helper.js +7 -4
- package/dist/providers/anthropic-baseprovider.d.ts +23 -0
- package/dist/providers/anthropic-baseprovider.js +114 -0
- package/dist/providers/anthropic.d.ts +19 -43
- package/dist/providers/anthropic.js +81 -305
- package/dist/providers/azure-openai.d.ts +20 -0
- package/dist/providers/azure-openai.js +89 -0
- package/dist/providers/google-ai-studio.d.ts +23 -0
- package/dist/providers/google-ai-studio.js +108 -0
- package/dist/providers/google-vertex.d.ts +47 -0
- package/dist/providers/google-vertex.js +205 -0
- package/dist/providers/huggingFace.d.ts +32 -25
- package/dist/providers/huggingFace.js +96 -430
- package/dist/providers/index.d.ts +9 -9
- package/dist/providers/index.js +9 -9
- package/dist/providers/mcp-provider.js +4 -0
- package/dist/providers/mistral.d.ts +42 -0
- package/dist/providers/mistral.js +160 -0
- package/dist/providers/ollama.d.ts +52 -36
- package/dist/providers/ollama.js +297 -519
- package/dist/providers/openAI.d.ts +19 -18
- package/dist/providers/openAI.js +76 -276
- package/dist/sdk/tool-extension.d.ts +181 -0
- package/dist/sdk/tool-extension.js +283 -0
- package/dist/sdk/tool-registration.d.ts +95 -0
- package/dist/sdk/tool-registration.js +168 -0
- package/dist/types/generate-types.d.ts +1 -0
- package/dist/types/mcp-types.d.ts +116 -0
- package/dist/types/mcp-types.js +5 -0
- package/dist/types/stream-types.d.ts +30 -18
- package/dist/types/universal-provider-options.d.ts +87 -0
- package/dist/types/universal-provider-options.js +53 -0
- package/package.json +15 -10
- package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
- package/dist/lib/providers/agent-enhanced-provider.js +0 -605
- package/dist/lib/providers/amazonBedrock.d.ts +0 -28
- package/dist/lib/providers/amazonBedrock.js +0 -364
- package/dist/lib/providers/azureOpenAI.d.ts +0 -42
- package/dist/lib/providers/azureOpenAI.js +0 -347
- package/dist/lib/providers/googleAIStudio.d.ts +0 -42
- package/dist/lib/providers/googleAIStudio.js +0 -364
- package/dist/lib/providers/googleVertexAI.d.ts +0 -34
- package/dist/lib/providers/googleVertexAI.js +0 -547
- package/dist/lib/providers/mistralAI.d.ts +0 -37
- package/dist/lib/providers/mistralAI.js +0 -325
- package/dist/providers/agent-enhanced-provider.d.ts +0 -93
- package/dist/providers/agent-enhanced-provider.js +0 -606
- package/dist/providers/amazonBedrock.d.ts +0 -28
- package/dist/providers/amazonBedrock.js +0 -364
- package/dist/providers/azureOpenAI.d.ts +0 -42
- package/dist/providers/azureOpenAI.js +0 -348
- package/dist/providers/googleAIStudio.d.ts +0 -42
- package/dist/providers/googleAIStudio.js +0 -364
- package/dist/providers/googleVertexAI.d.ts +0 -34
- package/dist/providers/googleVertexAI.js +0 -547
- package/dist/providers/mistralAI.d.ts +0 -37
- 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
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/lib/mcp/config.js
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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}
|
|
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 {
|
|
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" | "
|
|
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" | "
|
|
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
|
-
//
|
|
34
|
-
await
|
|
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
|
|
145
|
-
const builtInTools = await
|
|
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
|
|
200
|
-
unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via
|
|
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) {
|