@juspay/neurolink 1.10.0 → 1.11.1
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 +43 -33
- package/README.md +16 -0
- package/dist/agent/direct-tools.d.ts +9 -9
- package/dist/cli/commands/agent-generate.d.ts +1 -2
- package/dist/cli/commands/agent-generate.js +5 -8
- package/dist/cli/commands/config.d.ts +2 -2
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/mcp.js +91 -100
- package/dist/cli/commands/ollama.d.ts +2 -7
- package/dist/cli/commands/ollama.js +5 -8
- package/dist/cli/index.js +185 -276
- package/dist/core/factory.js +9 -10
- package/dist/index.d.ts +23 -0
- package/dist/index.js +35 -0
- package/dist/lib/agent/direct-tools.d.ts +9 -9
- package/dist/lib/core/factory.js +9 -10
- package/dist/lib/index.d.ts +23 -0
- package/dist/lib/index.js +35 -0
- package/dist/lib/mcp/adapters/plugin-bridge.d.ts +39 -0
- package/dist/lib/mcp/adapters/plugin-bridge.js +82 -0
- package/dist/lib/mcp/auto-discovery.d.ts +38 -96
- package/dist/lib/mcp/auto-discovery.js +100 -744
- package/dist/lib/mcp/client.js +4 -4
- package/dist/lib/mcp/context-manager.js +72 -1
- package/dist/lib/mcp/contracts/mcp-contract.d.ts +162 -0
- package/dist/lib/mcp/contracts/mcp-contract.js +58 -0
- package/dist/lib/mcp/core/plugin-manager.d.ts +45 -0
- package/dist/lib/mcp/core/plugin-manager.js +110 -0
- package/dist/lib/mcp/demo/plugin-demo.d.ts +20 -0
- package/dist/lib/mcp/demo/plugin-demo.js +116 -0
- package/dist/lib/mcp/ecosystem.d.ts +75 -0
- package/dist/lib/mcp/ecosystem.js +161 -0
- package/dist/lib/mcp/external-client.d.ts +88 -0
- package/dist/lib/mcp/external-client.js +323 -0
- package/dist/lib/mcp/external-manager.d.ts +112 -0
- package/dist/lib/mcp/external-manager.js +302 -0
- package/dist/lib/mcp/factory.d.ts +4 -4
- package/dist/lib/mcp/function-calling.js +59 -34
- package/dist/lib/mcp/index.d.ts +39 -184
- package/dist/lib/mcp/index.js +72 -150
- package/dist/lib/mcp/initialize.js +5 -5
- package/dist/lib/mcp/logging.d.ts +27 -60
- package/dist/lib/mcp/logging.js +77 -165
- package/dist/lib/mcp/neurolink-mcp-client.js +31 -3
- package/dist/lib/mcp/orchestrator.d.ts +1 -1
- package/dist/lib/mcp/orchestrator.js +13 -12
- package/dist/lib/mcp/plugin-manager.d.ts +98 -0
- package/dist/lib/mcp/plugin-manager.js +294 -0
- package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
- package/dist/lib/mcp/plugins/core/filesystem-mcp.js +139 -0
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +36 -0
- package/dist/lib/mcp/plugins/filesystem-mcp.js +54 -0
- package/dist/lib/mcp/registry.d.ts +27 -176
- package/dist/lib/mcp/registry.js +31 -372
- package/dist/lib/mcp/security-manager.d.ts +85 -0
- package/dist/lib/mcp/security-manager.js +344 -0
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/lib/mcp/tool-integration.d.ts +4 -14
- package/dist/lib/mcp/tool-integration.js +43 -21
- package/dist/lib/mcp/tool-registry.d.ts +66 -0
- package/dist/lib/mcp/tool-registry.js +160 -0
- package/dist/lib/mcp/unified-mcp.d.ts +123 -0
- package/dist/lib/mcp/unified-mcp.js +246 -0
- package/dist/lib/mcp/unified-registry.d.ts +42 -229
- package/dist/lib/mcp/unified-registry.js +96 -1346
- package/dist/lib/neurolink.d.ts +3 -4
- package/dist/lib/neurolink.js +17 -18
- package/dist/lib/providers/agent-enhanced-provider.js +2 -2
- package/dist/lib/providers/amazonBedrock.js +2 -2
- package/dist/lib/providers/anthropic.js +3 -3
- package/dist/lib/providers/azureOpenAI.js +3 -3
- package/dist/lib/providers/function-calling-provider.js +34 -25
- package/dist/lib/providers/googleAIStudio.js +9 -3
- package/dist/lib/providers/googleVertexAI.js +2 -2
- package/dist/lib/providers/huggingFace.js +2 -2
- package/dist/lib/providers/mcp-provider.js +33 -5
- package/dist/lib/providers/mistralAI.js +2 -2
- package/dist/lib/providers/ollama.js +2 -2
- package/dist/lib/providers/openAI.js +2 -2
- package/dist/lib/utils/providerUtils-fixed.js +9 -9
- package/dist/mcp/adapters/plugin-bridge.d.ts +39 -0
- package/dist/mcp/adapters/plugin-bridge.js +82 -0
- package/dist/mcp/auto-discovery.d.ts +38 -96
- package/dist/mcp/auto-discovery.js +100 -745
- package/dist/mcp/client.js +4 -4
- package/dist/mcp/context-manager.js +72 -1
- package/dist/mcp/contracts/mcp-contract.d.ts +162 -0
- package/dist/mcp/contracts/mcp-contract.js +58 -0
- package/dist/mcp/core/plugin-manager.d.ts +45 -0
- package/dist/mcp/core/plugin-manager.js +110 -0
- package/dist/mcp/demo/plugin-demo.d.ts +20 -0
- package/dist/mcp/demo/plugin-demo.js +116 -0
- package/dist/mcp/ecosystem.d.ts +75 -0
- package/dist/mcp/ecosystem.js +162 -0
- package/dist/mcp/external-client.d.ts +88 -0
- package/dist/mcp/external-client.js +323 -0
- package/dist/mcp/external-manager.d.ts +112 -0
- package/dist/mcp/external-manager.js +302 -0
- package/dist/mcp/factory.d.ts +4 -4
- package/dist/mcp/function-calling.js +59 -34
- package/dist/mcp/index.d.ts +39 -184
- package/dist/mcp/index.js +72 -150
- package/dist/mcp/initialize.js +5 -5
- package/dist/mcp/logging.d.ts +27 -60
- package/dist/mcp/logging.js +77 -165
- package/dist/mcp/neurolink-mcp-client.js +31 -3
- package/dist/mcp/orchestrator.d.ts +1 -1
- package/dist/mcp/orchestrator.js +13 -12
- package/dist/mcp/plugin-manager.d.ts +98 -0
- package/dist/mcp/plugin-manager.js +295 -0
- package/dist/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
- package/dist/mcp/plugins/core/filesystem-mcp.js +139 -0
- package/dist/mcp/plugins/core/neurolink-mcp.json +17 -0
- package/dist/mcp/plugins/filesystem-mcp.d.ts +36 -0
- package/dist/mcp/plugins/filesystem-mcp.js +54 -0
- package/dist/mcp/registry.d.ts +27 -176
- package/dist/mcp/registry.js +31 -372
- package/dist/mcp/security-manager.d.ts +85 -0
- package/dist/mcp/security-manager.js +344 -0
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/mcp/tool-integration.d.ts +4 -14
- package/dist/mcp/tool-integration.js +43 -21
- package/dist/mcp/tool-registry.d.ts +66 -0
- package/dist/mcp/tool-registry.js +160 -0
- package/dist/mcp/unified-mcp.d.ts +123 -0
- package/dist/mcp/unified-mcp.js +246 -0
- package/dist/mcp/unified-registry.d.ts +42 -229
- package/dist/mcp/unified-registry.js +96 -1345
- package/dist/neurolink.d.ts +3 -4
- package/dist/neurolink.js +17 -18
- package/dist/providers/agent-enhanced-provider.js +2 -2
- package/dist/providers/amazonBedrock.js +2 -2
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/azureOpenAI.js +3 -3
- package/dist/providers/function-calling-provider.js +34 -25
- package/dist/providers/googleAIStudio.js +9 -3
- package/dist/providers/googleVertexAI.js +2 -2
- package/dist/providers/huggingFace.js +2 -2
- package/dist/providers/mcp-provider.js +33 -5
- package/dist/providers/mistralAI.js +2 -2
- package/dist/providers/ollama.js +2 -2
- package/dist/providers/openAI.js +2 -2
- package/dist/utils/providerUtils-fixed.js +9 -9
- package/package.json +1 -1
package/dist/lib/neurolink.d.ts
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* NeuroLink - Unified AI Interface with Real MCP Tool Integration
|
|
3
3
|
*
|
|
4
4
|
* Enhanced AI provider system with natural MCP tool access.
|
|
5
|
-
* Uses real MCP infrastructure for
|
|
6
|
-
await this.initializeMCP();tool discovery and execution.
|
|
5
|
+
* Uses real MCP infrastructure for tool discovery and execution.
|
|
7
6
|
*/
|
|
8
7
|
import type { AIProviderName } from "./core/types.js";
|
|
9
8
|
export interface TextGenerationOptions {
|
|
@@ -107,8 +106,8 @@ export declare class NeuroLink {
|
|
|
107
106
|
autoDiscoveredServers: {
|
|
108
107
|
id: string;
|
|
109
108
|
name: string;
|
|
110
|
-
source:
|
|
111
|
-
status:
|
|
109
|
+
source: "core" | "project" | "installed";
|
|
110
|
+
status: string;
|
|
112
111
|
hasServer: boolean;
|
|
113
112
|
}[];
|
|
114
113
|
}>;
|
package/dist/lib/neurolink.js
CHANGED
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
* NeuroLink - Unified AI Interface with Real MCP Tool Integration
|
|
3
3
|
*
|
|
4
4
|
* Enhanced AI provider system with natural MCP tool access.
|
|
5
|
-
* Uses real MCP infrastructure for
|
|
6
|
-
await this.initializeMCP();tool discovery and execution.
|
|
5
|
+
* Uses real MCP infrastructure for tool discovery and execution.
|
|
7
6
|
*/
|
|
8
7
|
import { AIProviderFactory } from "./index.js";
|
|
9
8
|
import { ContextManager } from "./mcp/context-manager.js";
|
|
10
9
|
import { mcpLogger } from "./mcp/logging.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { toolRegistry } from "./mcp/tool-registry.js";
|
|
11
|
+
import { unifiedRegistry } from "./mcp/unified-registry.js";
|
|
13
12
|
import { logger } from "./utils/logger.js";
|
|
14
13
|
import { getBestProvider } from "./utils/providerUtils-fixed.js";
|
|
15
14
|
export class NeuroLink {
|
|
@@ -105,11 +104,11 @@ export class NeuroLink {
|
|
|
105
104
|
prompt: options.prompt.substring(0, 100) + "...",
|
|
106
105
|
contextId: context.sessionId,
|
|
107
106
|
});
|
|
108
|
-
// Get available tools from
|
|
107
|
+
// Get available tools from tool registry (simplified approach)
|
|
109
108
|
let availableTools = [];
|
|
110
109
|
try {
|
|
111
|
-
// Use
|
|
112
|
-
const allTools =
|
|
110
|
+
// Use toolRegistry directly instead of unified registry to avoid hanging
|
|
111
|
+
const allTools = await toolRegistry.listTools();
|
|
113
112
|
availableTools = allTools.map((tool) => ({
|
|
114
113
|
name: tool.name,
|
|
115
114
|
description: tool.description || "No description available",
|
|
@@ -398,29 +397,29 @@ Note: Tool integration is currently in development. Please provide helpful respo
|
|
|
398
397
|
* Get access to the unified MCP registry for tool inspection and management
|
|
399
398
|
*/
|
|
400
399
|
getUnifiedRegistry() {
|
|
401
|
-
return
|
|
400
|
+
return unifiedRegistry;
|
|
402
401
|
}
|
|
403
402
|
/**
|
|
404
403
|
* Initialize MCP and return discovery statistics
|
|
405
404
|
*/
|
|
406
405
|
async getMCPStatus() {
|
|
407
406
|
await this.initializeMCP();
|
|
408
|
-
const totalServers =
|
|
409
|
-
const availableServers =
|
|
410
|
-
const autoDiscoveredServers =
|
|
411
|
-
const allTools = await
|
|
407
|
+
const totalServers = unifiedRegistry.getTotalServerCount();
|
|
408
|
+
const availableServers = unifiedRegistry.getAvailableServerCount();
|
|
409
|
+
const autoDiscoveredServers = unifiedRegistry.getAutoDiscoveredServers();
|
|
410
|
+
const allTools = await unifiedRegistry.listAllTools();
|
|
412
411
|
return {
|
|
413
412
|
mcpInitialized: this.mcpInitialized,
|
|
414
413
|
totalServers,
|
|
415
414
|
availableServers,
|
|
416
|
-
autoDiscoveredCount: autoDiscoveredServers.
|
|
415
|
+
autoDiscoveredCount: autoDiscoveredServers.length,
|
|
417
416
|
totalTools: allTools.length,
|
|
418
|
-
autoDiscoveredServers:
|
|
419
|
-
id: server.
|
|
420
|
-
name: server.
|
|
417
|
+
autoDiscoveredServers: autoDiscoveredServers.map((server) => ({
|
|
418
|
+
id: server.metadata.name,
|
|
419
|
+
name: server.metadata.name,
|
|
421
420
|
source: server.source,
|
|
422
|
-
status:
|
|
423
|
-
hasServer:
|
|
421
|
+
status: "discovered",
|
|
422
|
+
hasServer: true,
|
|
424
423
|
})),
|
|
425
424
|
};
|
|
426
425
|
}
|
|
@@ -41,7 +41,7 @@ export class AgentEnhancedProvider {
|
|
|
41
41
|
const options = typeof optionsOrPrompt === "string"
|
|
42
42
|
? { prompt: optionsOrPrompt }
|
|
43
43
|
: optionsOrPrompt;
|
|
44
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
44
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, schema, } = options;
|
|
45
45
|
// Get tools if enabled
|
|
46
46
|
const tools = this.config.enableTools
|
|
47
47
|
? getToolsForCategory(this.config.toolCategory)
|
|
@@ -70,7 +70,7 @@ export class AgentEnhancedProvider {
|
|
|
70
70
|
const options = typeof optionsOrPrompt === "string"
|
|
71
71
|
? { prompt: optionsOrPrompt }
|
|
72
72
|
: optionsOrPrompt;
|
|
73
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
73
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, } = options;
|
|
74
74
|
// Get tools if enabled
|
|
75
75
|
const tools = this.config.enableTools
|
|
76
76
|
? getToolsForCategory(this.config.toolCategory)
|
|
@@ -128,7 +128,7 @@ export class AmazonBedrock {
|
|
|
128
128
|
const options = typeof optionsOrPrompt === "string"
|
|
129
129
|
? { prompt: optionsOrPrompt }
|
|
130
130
|
: optionsOrPrompt;
|
|
131
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
131
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
132
132
|
// Use schema from options or fallback parameter
|
|
133
133
|
const finalSchema = schema || analysisSchema;
|
|
134
134
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -214,7 +214,7 @@ export class AmazonBedrock {
|
|
|
214
214
|
const options = typeof optionsOrPrompt === "string"
|
|
215
215
|
? { prompt: optionsOrPrompt }
|
|
216
216
|
: optionsOrPrompt;
|
|
217
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
217
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
218
218
|
// Use schema from options or fallback parameter
|
|
219
219
|
const finalSchema = schema || analysisSchema;
|
|
220
220
|
logger.debug(`[${functionTag}] Generate text started`, {
|
|
@@ -57,7 +57,7 @@ export class AnthropicProvider {
|
|
|
57
57
|
const options = typeof optionsOrPrompt === "string"
|
|
58
58
|
? { prompt: optionsOrPrompt }
|
|
59
59
|
: optionsOrPrompt;
|
|
60
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
60
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
|
|
61
61
|
logger.debug(`[AnthropicProvider.generateText] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}`);
|
|
62
62
|
const requestBody = {
|
|
63
63
|
model: this.getModel(),
|
|
@@ -99,7 +99,7 @@ export class AnthropicProvider {
|
|
|
99
99
|
const options = typeof optionsOrPrompt === "string"
|
|
100
100
|
? { prompt: optionsOrPrompt }
|
|
101
101
|
: optionsOrPrompt;
|
|
102
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
102
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
|
|
103
103
|
logger.debug(`[AnthropicProvider.streamText] Streaming prompt: "${prompt.substring(0, 100)}..."`);
|
|
104
104
|
const requestBody = {
|
|
105
105
|
model: this.getModel(),
|
|
@@ -179,7 +179,7 @@ export class AnthropicProvider {
|
|
|
179
179
|
const options = typeof optionsOrPrompt === "string"
|
|
180
180
|
? { prompt: optionsOrPrompt }
|
|
181
181
|
: optionsOrPrompt;
|
|
182
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
182
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", } = options;
|
|
183
183
|
logger.debug(`[AnthropicProvider.generateTextStream] Streaming prompt: "${prompt.substring(0, 100)}..."`);
|
|
184
184
|
const requestBody = {
|
|
185
185
|
model: this.getModel(),
|
|
@@ -70,7 +70,7 @@ export class AzureOpenAIProvider {
|
|
|
70
70
|
const options = typeof optionsOrPrompt === "string"
|
|
71
71
|
? { prompt: optionsOrPrompt }
|
|
72
72
|
: optionsOrPrompt;
|
|
73
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
73
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
|
|
74
74
|
logger.debug(`[AzureOpenAIProvider.generateText] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}`);
|
|
75
75
|
const messages = [];
|
|
76
76
|
if (systemPrompt) {
|
|
@@ -116,7 +116,7 @@ export class AzureOpenAIProvider {
|
|
|
116
116
|
const options = typeof optionsOrPrompt === "string"
|
|
117
117
|
? { prompt: optionsOrPrompt }
|
|
118
118
|
: optionsOrPrompt;
|
|
119
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
119
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
|
|
120
120
|
logger.debug(`[AzureOpenAIProvider.streamText] Streaming prompt: "${prompt.substring(0, 100)}..."`);
|
|
121
121
|
const messages = [];
|
|
122
122
|
if (systemPrompt) {
|
|
@@ -200,7 +200,7 @@ export class AzureOpenAIProvider {
|
|
|
200
200
|
const options = typeof optionsOrPrompt === "string"
|
|
201
201
|
? { prompt: optionsOrPrompt }
|
|
202
202
|
: optionsOrPrompt;
|
|
203
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
203
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", } = options;
|
|
204
204
|
logger.debug(`[AzureOpenAIProvider.generateTextStream] Streaming prompt: "${prompt.substring(0, 100)}..."`);
|
|
205
205
|
const messages = [];
|
|
206
206
|
if (systemPrompt) {
|
|
@@ -200,28 +200,32 @@ export class FunctionCallingProvider {
|
|
|
200
200
|
description: tool.description,
|
|
201
201
|
parameters: tool.parameters,
|
|
202
202
|
execute: async (args) => {
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
203
|
+
// Debug logging only in debug mode
|
|
204
|
+
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
205
|
+
const providerName = this.baseProvider.constructor.name;
|
|
206
|
+
mcpLogger.debug(`Tool execution - Provider: ${providerName}`);
|
|
207
|
+
mcpLogger.debug(`Tool: ${sanitizedToolName} (original: ${originalToolName})`);
|
|
208
|
+
mcpLogger.debug("Args received:", args);
|
|
209
|
+
}
|
|
210
210
|
mcpLogger.debug(`[${functionTag}] Executing MCP tool: ${sanitizedToolName} (original: ${originalToolName}, ${toolInfo?.serverId}.${toolInfo?.toolName})`, args);
|
|
211
211
|
try {
|
|
212
212
|
if (toolInfo) {
|
|
213
213
|
const mcpToolName = `${toolInfo.serverId}.${toolInfo.toolName}`;
|
|
214
|
-
// Log
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
214
|
+
// Log execution details in debug mode only
|
|
215
|
+
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
216
|
+
mcpLogger.debug("Calling executeFunctionCall with:", {
|
|
217
|
+
mcpToolName,
|
|
218
|
+
args,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
218
221
|
const result = await executeFunctionCall(mcpToolName, args, context);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
222
|
+
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
223
|
+
mcpLogger.debug("Tool execution result:", {
|
|
224
|
+
success: result.success,
|
|
225
|
+
hasData: !!result.data,
|
|
226
|
+
error: result.error,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
225
229
|
mcpLogger.debug(`[${functionTag}] Tool execution result for ${sanitizedToolName}:`, {
|
|
226
230
|
success: result.success,
|
|
227
231
|
hasData: !!result.data,
|
|
@@ -242,7 +246,9 @@ export class FunctionCallingProvider {
|
|
|
242
246
|
return { success: false, error: "Tool mapping not found" };
|
|
243
247
|
}
|
|
244
248
|
catch (error) {
|
|
245
|
-
|
|
249
|
+
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
250
|
+
mcpLogger.debug("Tool execution error:", error);
|
|
251
|
+
}
|
|
246
252
|
mcpLogger.error(`[${functionTag}] Tool execution failed for ${sanitizedToolName}:`, error);
|
|
247
253
|
return {
|
|
248
254
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -252,13 +258,16 @@ export class FunctionCallingProvider {
|
|
|
252
258
|
};
|
|
253
259
|
});
|
|
254
260
|
mcpLogger.debug(`[${functionTag}] Converted ${Object.keys(convertedTools).length} tools for AI SDK:`, Object.keys(convertedTools));
|
|
255
|
-
// Log first tool details for debugging
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
261
|
+
// Log first tool details for debugging in debug mode only
|
|
262
|
+
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
263
|
+
const firstToolName = Object.keys(convertedTools)[0];
|
|
264
|
+
if (firstToolName) {
|
|
265
|
+
mcpLogger.debug("First tool details:", {
|
|
266
|
+
name: firstToolName,
|
|
267
|
+
description: convertedTools[firstToolName].description,
|
|
268
|
+
parameters: convertedTools[firstToolName].parameters,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
262
271
|
}
|
|
263
272
|
return convertedTools;
|
|
264
273
|
}
|
|
@@ -7,9 +7,15 @@ const DEFAULT_SYSTEM_CONTEXT = {
|
|
|
7
7
|
};
|
|
8
8
|
// Configuration helpers
|
|
9
9
|
const getGoogleAIApiKey = () => {
|
|
10
|
+
// Check for both possible environment variables
|
|
10
11
|
const apiKey = process.env.GOOGLE_AI_API_KEY || process.env.GOOGLE_GENERATIVE_AI_API_KEY;
|
|
11
12
|
if (!apiKey) {
|
|
12
|
-
throw new Error("GOOGLE_AI_API_KEY environment variable is not set");
|
|
13
|
+
throw new Error("GOOGLE_AI_API_KEY or GOOGLE_GENERATIVE_AI_API_KEY environment variable is not set");
|
|
14
|
+
}
|
|
15
|
+
// Ensure GOOGLE_GENERATIVE_AI_API_KEY is set for @ai-sdk/google compatibility
|
|
16
|
+
// The AI SDK specifically looks for this variable name
|
|
17
|
+
if (!process.env.GOOGLE_GENERATIVE_AI_API_KEY && process.env.GOOGLE_AI_API_KEY) {
|
|
18
|
+
process.env.GOOGLE_GENERATIVE_AI_API_KEY = process.env.GOOGLE_AI_API_KEY;
|
|
13
19
|
}
|
|
14
20
|
return apiKey;
|
|
15
21
|
};
|
|
@@ -95,7 +101,7 @@ export class GoogleAIStudio {
|
|
|
95
101
|
const options = typeof optionsOrPrompt === "string"
|
|
96
102
|
? { prompt: optionsOrPrompt }
|
|
97
103
|
: optionsOrPrompt;
|
|
98
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
104
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
|
|
99
105
|
// Use schema from options or fallback parameter
|
|
100
106
|
const finalSchema = schema || analysisSchema;
|
|
101
107
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -186,7 +192,7 @@ export class GoogleAIStudio {
|
|
|
186
192
|
const options = typeof optionsOrPrompt === "string"
|
|
187
193
|
? { prompt: optionsOrPrompt }
|
|
188
194
|
: optionsOrPrompt;
|
|
189
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
195
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, } = options;
|
|
190
196
|
// Use schema from options or fallback parameter
|
|
191
197
|
const finalSchema = schema || analysisSchema;
|
|
192
198
|
logger.debug(`[${functionTag}] Generate request started`, {
|
|
@@ -285,7 +285,7 @@ export class GoogleVertexAI {
|
|
|
285
285
|
const options = typeof optionsOrPrompt === "string"
|
|
286
286
|
? { prompt: optionsOrPrompt }
|
|
287
287
|
: optionsOrPrompt;
|
|
288
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
288
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
289
289
|
// Use schema from options or fallback parameter
|
|
290
290
|
const finalSchema = schema || analysisSchema;
|
|
291
291
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -372,7 +372,7 @@ export class GoogleVertexAI {
|
|
|
372
372
|
const options = typeof optionsOrPrompt === "string"
|
|
373
373
|
? { prompt: optionsOrPrompt }
|
|
374
374
|
: optionsOrPrompt;
|
|
375
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
375
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
376
376
|
// Use schema from options or fallback parameter
|
|
377
377
|
const finalSchema = schema || analysisSchema;
|
|
378
378
|
logger.debug(`[${functionTag}] Generate request started`, {
|
|
@@ -228,7 +228,7 @@ export class HuggingFace {
|
|
|
228
228
|
const options = typeof optionsOrPrompt === "string"
|
|
229
229
|
? { prompt: optionsOrPrompt }
|
|
230
230
|
: optionsOrPrompt;
|
|
231
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
231
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
232
232
|
// Use schema from options or fallback parameter
|
|
233
233
|
const finalSchema = schema || analysisSchema;
|
|
234
234
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -316,7 +316,7 @@ export class HuggingFace {
|
|
|
316
316
|
const options = typeof optionsOrPrompt === "string"
|
|
317
317
|
? { prompt: optionsOrPrompt }
|
|
318
318
|
: optionsOrPrompt;
|
|
319
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
319
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
320
320
|
// Use schema from options or fallback parameter
|
|
321
321
|
const finalSchema = schema || analysisSchema;
|
|
322
322
|
logger.debug(`[${functionTag}] Generate request started`, {
|
|
@@ -30,18 +30,46 @@ export class MCPAwareProvider {
|
|
|
30
30
|
try {
|
|
31
31
|
// Get or create MCP client for this session
|
|
32
32
|
const mcpClient = getMCPManager(this.sessionId, {
|
|
33
|
-
userId: this.config.userId,
|
|
34
|
-
aiProvider: this.config.providerName,
|
|
33
|
+
userId: this.config.userId || "anonymous",
|
|
34
|
+
aiProvider: this.config.providerName || "unknown",
|
|
35
35
|
modelId: this.config.modelName,
|
|
36
36
|
});
|
|
37
37
|
// Create execution context
|
|
38
38
|
const context = {
|
|
39
39
|
sessionId: this.sessionId,
|
|
40
|
-
userId: this.config.userId,
|
|
41
|
-
organizationId: this.config.organizationId,
|
|
42
|
-
aiProvider: this.config.providerName,
|
|
40
|
+
userId: this.config.userId || "anonymous",
|
|
41
|
+
organizationId: this.config.organizationId || "default",
|
|
42
|
+
aiProvider: this.config.providerName || "unknown",
|
|
43
43
|
modelId: this.config.modelName,
|
|
44
44
|
timestamp: Date.now(),
|
|
45
|
+
// Required properties
|
|
46
|
+
secureFS: {
|
|
47
|
+
readFile: async () => {
|
|
48
|
+
throw new Error("secureFS not configured");
|
|
49
|
+
},
|
|
50
|
+
writeFile: async () => {
|
|
51
|
+
throw new Error("secureFS not configured");
|
|
52
|
+
},
|
|
53
|
+
readdir: async () => {
|
|
54
|
+
throw new Error("secureFS not configured");
|
|
55
|
+
},
|
|
56
|
+
stat: async () => {
|
|
57
|
+
throw new Error("secureFS not configured");
|
|
58
|
+
},
|
|
59
|
+
mkdir: async () => {
|
|
60
|
+
throw new Error("secureFS not configured");
|
|
61
|
+
},
|
|
62
|
+
exists: async () => false,
|
|
63
|
+
},
|
|
64
|
+
path: {
|
|
65
|
+
join: (...paths) => require("path").join(...paths),
|
|
66
|
+
resolve: (...paths) => require("path").resolve(...paths),
|
|
67
|
+
relative: (from, to) => require("path").relative(from, to),
|
|
68
|
+
dirname: (path) => require("path").dirname(path),
|
|
69
|
+
basename: (path, ext) => require("path").basename(path, ext),
|
|
70
|
+
},
|
|
71
|
+
grantedPermissions: [],
|
|
72
|
+
log: console.log,
|
|
45
73
|
};
|
|
46
74
|
// Initialize all MCP tools
|
|
47
75
|
initializeMCPTools(this.sessionId, mcpClient, context);
|
|
@@ -88,7 +88,7 @@ export class MistralAI {
|
|
|
88
88
|
const options = typeof optionsOrPrompt === "string"
|
|
89
89
|
? { prompt: optionsOrPrompt }
|
|
90
90
|
: optionsOrPrompt;
|
|
91
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
91
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
92
92
|
// Use schema from options or fallback parameter
|
|
93
93
|
const finalSchema = schema || analysisSchema;
|
|
94
94
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -176,7 +176,7 @@ export class MistralAI {
|
|
|
176
176
|
const options = typeof optionsOrPrompt === "string"
|
|
177
177
|
? { prompt: optionsOrPrompt }
|
|
178
178
|
: optionsOrPrompt;
|
|
179
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
179
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
180
180
|
// Use schema from options or fallback parameter
|
|
181
181
|
const finalSchema = schema || analysisSchema;
|
|
182
182
|
logger.debug(`[${functionTag}] Generate request started`, {
|
|
@@ -388,7 +388,7 @@ export class Ollama {
|
|
|
388
388
|
const options = typeof optionsOrPrompt === "string"
|
|
389
389
|
? { prompt: optionsOrPrompt }
|
|
390
390
|
: optionsOrPrompt;
|
|
391
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
391
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
392
392
|
// Use schema from options or fallback parameter
|
|
393
393
|
const finalSchema = schema || analysisSchema;
|
|
394
394
|
logger.debug(`[${functionTag}] Generate request started`, {
|
|
@@ -446,7 +446,7 @@ export class Ollama {
|
|
|
446
446
|
const options = typeof optionsOrPrompt === "string"
|
|
447
447
|
? { prompt: optionsOrPrompt }
|
|
448
448
|
: optionsOrPrompt;
|
|
449
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
449
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
450
450
|
// Use schema from options or fallback parameter
|
|
451
451
|
const finalSchema = schema || analysisSchema;
|
|
452
452
|
logger.debug(`[${functionTag}] Stream request started`, {
|
|
@@ -59,7 +59,7 @@ export class OpenAI {
|
|
|
59
59
|
const options = typeof optionsOrPrompt === "string"
|
|
60
60
|
? { prompt: optionsOrPrompt }
|
|
61
61
|
: optionsOrPrompt;
|
|
62
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
62
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
63
63
|
// Use schema from options or fallback parameter
|
|
64
64
|
const finalSchema = schema || analysisSchema;
|
|
65
65
|
logger.debug(`[${functionTag}] Stream text started`, {
|
|
@@ -136,7 +136,7 @@ export class OpenAI {
|
|
|
136
136
|
const options = typeof optionsOrPrompt === "string"
|
|
137
137
|
? { prompt: optionsOrPrompt }
|
|
138
138
|
: optionsOrPrompt;
|
|
139
|
-
const { prompt, temperature = 0.7, maxTokens =
|
|
139
|
+
const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, } = options;
|
|
140
140
|
// Use schema from options or fallback parameter
|
|
141
141
|
const finalSchema = schema || analysisSchema;
|
|
142
142
|
logger.debug(`[${functionTag}] Generate text started`, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AIProviderFactory } from
|
|
2
|
-
import { logger } from
|
|
3
|
-
import { hasProviderEnvVars } from
|
|
1
|
+
import { AIProviderFactory } from "../core/factory.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
import { hasProviderEnvVars } from "./providerUtils.js";
|
|
4
4
|
/**
|
|
5
5
|
* Asynchronously get the best available provider based on real-time checks.
|
|
6
6
|
* This function performs actual authentication and availability tests.
|
|
@@ -20,7 +20,7 @@ export async function getBestProvider(requestedProvider) {
|
|
|
20
20
|
"bedrock",
|
|
21
21
|
"ollama",
|
|
22
22
|
];
|
|
23
|
-
if (requestedProvider && requestedProvider !==
|
|
23
|
+
if (requestedProvider && requestedProvider !== "auto") {
|
|
24
24
|
if (await isProviderAvailable(requestedProvider)) {
|
|
25
25
|
logger.debug(`[getBestProvider] Using requested provider: ${requestedProvider}`);
|
|
26
26
|
return requestedProvider;
|
|
@@ -44,14 +44,14 @@ export async function getBestProvider(requestedProvider) {
|
|
|
44
44
|
* @returns True if the provider is available and authenticated.
|
|
45
45
|
*/
|
|
46
46
|
async function isProviderAvailable(providerName) {
|
|
47
|
-
if (!hasProviderEnvVars(providerName) && providerName !==
|
|
47
|
+
if (!hasProviderEnvVars(providerName) && providerName !== "ollama") {
|
|
48
48
|
return false;
|
|
49
49
|
}
|
|
50
|
-
if (providerName ===
|
|
50
|
+
if (providerName === "ollama") {
|
|
51
51
|
try {
|
|
52
|
-
const response = await fetch(
|
|
53
|
-
method:
|
|
54
|
-
signal: AbortSignal.timeout(2000)
|
|
52
|
+
const response = await fetch("http://localhost:11434/api/tags", {
|
|
53
|
+
method: "GET",
|
|
54
|
+
signal: AbortSignal.timeout(2000),
|
|
55
55
|
});
|
|
56
56
|
if (response.ok) {
|
|
57
57
|
const { models } = await response.json();
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Bridge Adapter
|
|
3
|
+
* Provides compatibility layer for existing MCP integrations
|
|
4
|
+
*/
|
|
5
|
+
import type { ExecutionContext } from "../contracts/mcp-contract.js";
|
|
6
|
+
/**
|
|
7
|
+
* Bridge interface for legacy MCP compatibility
|
|
8
|
+
*/
|
|
9
|
+
export interface LegacyMCPBridge {
|
|
10
|
+
writeFile: (filePath: string, content: string) => Promise<void>;
|
|
11
|
+
readFile: (filePath: string) => Promise<string>;
|
|
12
|
+
listFiles: (dirPath: string) => Promise<string[]>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a bridge for legacy MCP integrations
|
|
16
|
+
*/
|
|
17
|
+
export declare function createLegacyBridge(context: ExecutionContext): LegacyMCPBridge;
|
|
18
|
+
/**
|
|
19
|
+
* Enhanced execution context with bridge compatibility
|
|
20
|
+
*/
|
|
21
|
+
export declare function enhanceExecutionContext(context: ExecutionContext): ExecutionContext;
|
|
22
|
+
/**
|
|
23
|
+
* Utility function to adapt legacy MCP calls
|
|
24
|
+
*/
|
|
25
|
+
export declare function adaptLegacyMCPCall(context: ExecutionContext, operation: string, ...args: any[]): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Quick plugin factory for simple plugin creation
|
|
28
|
+
*/
|
|
29
|
+
export declare class QuickPluginFactory {
|
|
30
|
+
static create(name: string, config: any): Promise<{
|
|
31
|
+
name: string;
|
|
32
|
+
config: any;
|
|
33
|
+
initialized: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute plugin with enhanced context
|
|
38
|
+
*/
|
|
39
|
+
export declare function executePlugin(plugin: any, context: ExecutionContext, operation: string, ...args: any[]): Promise<any>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Bridge Adapter
|
|
3
|
+
* Provides compatibility layer for existing MCP integrations
|
|
4
|
+
*/
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
/**
|
|
7
|
+
* Create a bridge for legacy MCP integrations
|
|
8
|
+
*/
|
|
9
|
+
export function createLegacyBridge(context) {
|
|
10
|
+
const basePath = process.cwd();
|
|
11
|
+
return {
|
|
12
|
+
async writeFile(filePath, content) {
|
|
13
|
+
const fullPath = path.resolve(basePath, filePath);
|
|
14
|
+
await context.secureFS.writeFile(fullPath, content);
|
|
15
|
+
},
|
|
16
|
+
async readFile(filePath) {
|
|
17
|
+
const fullPath = path.resolve(basePath, filePath);
|
|
18
|
+
const result = await context.secureFS.readFile(fullPath, "utf-8");
|
|
19
|
+
return typeof result === "string" ? result : result.toString();
|
|
20
|
+
},
|
|
21
|
+
async listFiles(dirPath) {
|
|
22
|
+
const fullPath = path.resolve(basePath, dirPath);
|
|
23
|
+
return await context.secureFS.readdir(fullPath);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Enhanced execution context with bridge compatibility
|
|
29
|
+
*/
|
|
30
|
+
export function enhanceExecutionContext(context) {
|
|
31
|
+
return {
|
|
32
|
+
...context,
|
|
33
|
+
path: {
|
|
34
|
+
join: path.join,
|
|
35
|
+
resolve: path.resolve,
|
|
36
|
+
relative: path.relative,
|
|
37
|
+
dirname: path.dirname,
|
|
38
|
+
basename: path.basename,
|
|
39
|
+
},
|
|
40
|
+
plugin: createLegacyBridge(context),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Utility function to adapt legacy MCP calls
|
|
45
|
+
*/
|
|
46
|
+
export async function adaptLegacyMCPCall(context, operation, ...args) {
|
|
47
|
+
const bridge = createLegacyBridge(context);
|
|
48
|
+
switch (operation) {
|
|
49
|
+
case "writeFile":
|
|
50
|
+
return bridge.writeFile(args[0], args[1]);
|
|
51
|
+
case "readFile":
|
|
52
|
+
return bridge.readFile(args[0]);
|
|
53
|
+
case "listFiles":
|
|
54
|
+
return bridge.listFiles(args[0]);
|
|
55
|
+
default:
|
|
56
|
+
throw new Error(`Unsupported legacy operation: ${operation}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Quick plugin factory for simple plugin creation
|
|
61
|
+
*/
|
|
62
|
+
export class QuickPluginFactory {
|
|
63
|
+
static async create(name, config) {
|
|
64
|
+
// Simple factory implementation
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
config,
|
|
68
|
+
initialized: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute plugin with enhanced context
|
|
74
|
+
*/
|
|
75
|
+
export async function executePlugin(plugin, context, operation, ...args) {
|
|
76
|
+
const enhancedContext = enhanceExecutionContext(context);
|
|
77
|
+
if (typeof plugin.execute === "function") {
|
|
78
|
+
return plugin.execute(enhancedContext, { operation, args });
|
|
79
|
+
}
|
|
80
|
+
// Fallback to legacy adaptation
|
|
81
|
+
return adaptLegacyMCPCall(enhancedContext, operation, ...args);
|
|
82
|
+
}
|