@juspay/neurolink 6.1.0 → 6.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 +10 -6
- package/dist/cli/commands/config.d.ts +13 -13
- package/dist/cli/index.js +3 -9
- package/dist/core/analytics.d.ts +11 -1
- package/dist/core/analytics.js +2 -2
- package/dist/core/base-provider.js +4 -18
- package/dist/core/dynamic-models.d.ts +8 -8
- package/dist/core/factory.js +3 -11
- package/dist/index.d.ts +2 -4
- package/dist/index.js +2 -11
- package/dist/lib/core/analytics.d.ts +11 -1
- package/dist/lib/core/analytics.js +2 -2
- package/dist/lib/core/base-provider.js +4 -18
- package/dist/lib/core/dynamic-models.d.ts +8 -8
- package/dist/lib/core/factory.js +3 -11
- package/dist/lib/index.d.ts +2 -4
- package/dist/lib/index.js +2 -11
- package/dist/lib/mcp/factory.d.ts +1 -1
- package/dist/lib/mcp/index.d.ts +7 -19
- package/dist/lib/mcp/index.js +15 -56
- package/dist/lib/neurolink.d.ts +1 -9
- package/dist/lib/neurolink.js +21 -70
- package/dist/lib/providers/amazon-bedrock.js +5 -16
- package/dist/lib/providers/anthropic-baseprovider.js +3 -21
- package/dist/lib/providers/anthropic.js +4 -7
- package/dist/lib/providers/azure-openai.js +4 -2
- package/dist/lib/providers/google-vertex.js +5 -9
- package/dist/lib/providers/huggingFace.js +5 -10
- package/dist/lib/providers/mistral.js +5 -8
- package/dist/lib/providers/openAI.js +4 -7
- package/dist/lib/utils/providerConfig.d.ts +117 -0
- package/dist/lib/utils/providerConfig.js +353 -0
- package/dist/lib/utils/providerUtils.d.ts +2 -1
- package/dist/lib/utils/providerUtils.js +53 -36
- package/dist/lib/utils/timeout.d.ts +72 -1
- package/dist/lib/utils/timeout.js +203 -2
- package/dist/mcp/factory.d.ts +1 -1
- package/dist/mcp/index.d.ts +7 -19
- package/dist/mcp/index.js +15 -56
- package/dist/neurolink.d.ts +1 -9
- package/dist/neurolink.js +21 -70
- package/dist/providers/amazon-bedrock.js +5 -16
- package/dist/providers/anthropic-baseprovider.js +3 -21
- package/dist/providers/anthropic.js +4 -7
- package/dist/providers/azure-openai.js +4 -2
- package/dist/providers/google-vertex.js +5 -9
- package/dist/providers/huggingFace.js +5 -10
- package/dist/providers/mistral.js +5 -8
- package/dist/providers/openAI.js +4 -7
- package/dist/utils/providerConfig.d.ts +117 -0
- package/dist/utils/providerConfig.js +353 -0
- package/dist/utils/providerUtils.d.ts +2 -1
- package/dist/utils/providerUtils.js +53 -36
- package/dist/utils/timeout.d.ts +72 -1
- package/dist/utils/timeout.js +203 -2
- package/package.json +1 -1
- package/dist/chat/client-utils.d.ts +0 -95
- package/dist/chat/client-utils.js +0 -315
- package/dist/chat/index.d.ts +0 -24
- package/dist/chat/index.js +0 -33
- package/dist/chat/session-storage.d.ts +0 -77
- package/dist/chat/session-storage.js +0 -233
- package/dist/chat/session.d.ts +0 -96
- package/dist/chat/session.js +0 -257
- package/dist/chat/sse-handler.d.ts +0 -49
- package/dist/chat/sse-handler.js +0 -259
- package/dist/chat/types.d.ts +0 -74
- package/dist/chat/types.js +0 -5
- package/dist/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/chat/websocket-chat-handler.js +0 -262
- package/dist/cli/commands/mcp.d.ts +0 -20
- package/dist/cli/commands/mcp.js +0 -1272
- package/dist/core/defaults.d.ts +0 -19
- package/dist/core/defaults.js +0 -29
- package/dist/core/evaluation-config.d.ts +0 -29
- package/dist/core/evaluation-config.js +0 -144
- package/dist/factories/compatibility-factory.d.ts +0 -35
- package/dist/factories/compatibility-factory.js +0 -71
- package/dist/factories/provider-generate-factory.d.ts +0 -20
- package/dist/factories/provider-generate-factory.js +0 -93
- package/dist/lib/chat/client-utils.d.ts +0 -95
- package/dist/lib/chat/client-utils.js +0 -315
- package/dist/lib/chat/index.d.ts +0 -24
- package/dist/lib/chat/index.js +0 -33
- package/dist/lib/chat/session-storage.d.ts +0 -77
- package/dist/lib/chat/session-storage.js +0 -233
- package/dist/lib/chat/session.d.ts +0 -96
- package/dist/lib/chat/session.js +0 -257
- package/dist/lib/chat/sse-handler.d.ts +0 -49
- package/dist/lib/chat/sse-handler.js +0 -259
- package/dist/lib/chat/types.d.ts +0 -74
- package/dist/lib/chat/types.js +0 -5
- package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/lib/chat/websocket-chat-handler.js +0 -262
- package/dist/lib/core/defaults.d.ts +0 -19
- package/dist/lib/core/defaults.js +0 -29
- package/dist/lib/core/evaluation-config.d.ts +0 -29
- package/dist/lib/core/evaluation-config.js +0 -144
- package/dist/lib/factories/compatibility-factory.d.ts +0 -35
- package/dist/lib/factories/compatibility-factory.js +0 -71
- package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
- package/dist/lib/factories/provider-generate-factory.js +0 -93
- package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/lib/mcp/auto-discovery.d.ts +0 -62
- package/dist/lib/mcp/auto-discovery.js +0 -149
- package/dist/lib/mcp/client.d.ts +0 -68
- package/dist/lib/mcp/client.js +0 -248
- package/dist/lib/mcp/config.d.ts +0 -31
- package/dist/lib/mcp/config.js +0 -99
- package/dist/lib/mcp/context-manager.d.ts +0 -171
- package/dist/lib/mcp/context-manager.js +0 -362
- package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
- package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/lib/mcp/core/plugin-manager.js +0 -110
- package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/lib/mcp/demo/plugin-demo.js +0 -118
- package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
- package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
- package/dist/lib/mcp/ecosystem.d.ts +0 -75
- package/dist/lib/mcp/ecosystem.js +0 -161
- package/dist/lib/mcp/error-manager.d.ts +0 -254
- package/dist/lib/mcp/error-manager.js +0 -501
- package/dist/lib/mcp/error-recovery.d.ts +0 -159
- package/dist/lib/mcp/error-recovery.js +0 -405
- package/dist/lib/mcp/external-client.d.ts +0 -88
- package/dist/lib/mcp/external-client.js +0 -331
- package/dist/lib/mcp/external-manager.d.ts +0 -112
- package/dist/lib/mcp/external-manager.js +0 -308
- package/dist/lib/mcp/function-calling.d.ts +0 -65
- package/dist/lib/mcp/function-calling.js +0 -642
- package/dist/lib/mcp/health-monitor.d.ts +0 -257
- package/dist/lib/mcp/health-monitor.js +0 -630
- package/dist/lib/mcp/initialize-tools.d.ts +0 -29
- package/dist/lib/mcp/initialize-tools.js +0 -261
- package/dist/lib/mcp/initialize.d.ts +0 -18
- package/dist/lib/mcp/initialize.js +0 -62
- package/dist/lib/mcp/manager.d.ts +0 -68
- package/dist/lib/mcp/manager.js +0 -176
- package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
- package/dist/lib/mcp/orchestrator.d.ts +0 -302
- package/dist/lib/mcp/orchestrator.js +0 -703
- package/dist/lib/mcp/plugin-manager.d.ts +0 -98
- package/dist/lib/mcp/plugin-manager.js +0 -296
- package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/lib/mcp/security-manager.d.ts +0 -87
- package/dist/lib/mcp/security-manager.js +0 -344
- package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
- package/dist/lib/mcp/semaphore-manager.js +0 -329
- package/dist/lib/mcp/session-manager.d.ts +0 -187
- package/dist/lib/mcp/session-manager.js +0 -400
- package/dist/lib/mcp/session-persistence.d.ts +0 -93
- package/dist/lib/mcp/session-persistence.js +0 -301
- package/dist/lib/mcp/tool-integration.d.ts +0 -58
- package/dist/lib/mcp/tool-integration.js +0 -203
- package/dist/lib/mcp/transport-manager.d.ts +0 -154
- package/dist/lib/mcp/transport-manager.js +0 -334
- package/dist/lib/mcp/unified-mcp.d.ts +0 -133
- package/dist/lib/mcp/unified-mcp.js +0 -251
- package/dist/lib/mcp/unified-registry.d.ts +0 -165
- package/dist/lib/mcp/unified-registry.js +0 -538
- package/dist/lib/providers/analytics-helper.d.ts +0 -38
- package/dist/lib/providers/analytics-helper.js +0 -216
- package/dist/lib/providers/function-calling-provider.d.ts +0 -142
- package/dist/lib/providers/function-calling-provider.js +0 -630
- package/dist/lib/providers/mcp-provider.d.ts +0 -75
- package/dist/lib/providers/mcp-provider.js +0 -283
- package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
- package/dist/lib/providers/timeout-wrapper.js +0 -100
- package/dist/lib/sdk/tool-extension.d.ts +0 -181
- package/dist/lib/sdk/tool-extension.js +0 -284
- package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/lib/services/streaming/streaming-manager.js +0 -245
- package/dist/lib/services/types.d.ts +0 -156
- package/dist/lib/services/types.js +0 -2
- package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
- package/dist/lib/services/websocket/websocket-server.js +0 -305
- package/dist/lib/utils/provider-validation.d.ts +0 -36
- package/dist/lib/utils/provider-validation.js +0 -625
- package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/lib/utils/providerUtils-fixed.js +0 -94
- package/dist/lib/utils/streaming-utils.d.ts +0 -79
- package/dist/lib/utils/streaming-utils.js +0 -198
- package/dist/lib/utils/timeout-manager.d.ts +0 -75
- package/dist/lib/utils/timeout-manager.js +0 -244
- package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/mcp/auto-discovery.d.ts +0 -62
- package/dist/mcp/auto-discovery.js +0 -149
- package/dist/mcp/client.d.ts +0 -68
- package/dist/mcp/client.js +0 -248
- package/dist/mcp/config.d.ts +0 -31
- package/dist/mcp/config.js +0 -99
- package/dist/mcp/context-manager.d.ts +0 -171
- package/dist/mcp/context-manager.js +0 -362
- package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/mcp/contracts/mcp-contract.js +0 -58
- package/dist/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/mcp/core/plugin-manager.js +0 -110
- package/dist/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/mcp/demo/plugin-demo.js +0 -118
- package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/mcp/dynamic-chain-executor.js +0 -489
- package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/mcp/dynamic-orchestrator.js +0 -351
- package/dist/mcp/ecosystem.d.ts +0 -75
- package/dist/mcp/ecosystem.js +0 -162
- package/dist/mcp/error-manager.d.ts +0 -254
- package/dist/mcp/error-manager.js +0 -501
- package/dist/mcp/error-recovery.d.ts +0 -159
- package/dist/mcp/error-recovery.js +0 -405
- package/dist/mcp/external-client.d.ts +0 -88
- package/dist/mcp/external-client.js +0 -331
- package/dist/mcp/external-manager.d.ts +0 -112
- package/dist/mcp/external-manager.js +0 -308
- package/dist/mcp/function-calling.d.ts +0 -65
- package/dist/mcp/function-calling.js +0 -642
- package/dist/mcp/health-monitor.d.ts +0 -257
- package/dist/mcp/health-monitor.js +0 -630
- package/dist/mcp/initialize-tools.d.ts +0 -29
- package/dist/mcp/initialize-tools.js +0 -262
- package/dist/mcp/initialize.d.ts +0 -18
- package/dist/mcp/initialize.js +0 -62
- package/dist/mcp/manager.d.ts +0 -68
- package/dist/mcp/manager.js +0 -176
- package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/mcp/neurolink-mcp-client.js +0 -462
- package/dist/mcp/orchestrator.d.ts +0 -302
- package/dist/mcp/orchestrator.js +0 -703
- package/dist/mcp/plugin-manager.d.ts +0 -98
- package/dist/mcp/plugin-manager.js +0 -297
- package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
- package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/mcp/security-manager.d.ts +0 -87
- package/dist/mcp/security-manager.js +0 -344
- package/dist/mcp/semaphore-manager.d.ts +0 -137
- package/dist/mcp/semaphore-manager.js +0 -329
- package/dist/mcp/session-manager.d.ts +0 -187
- package/dist/mcp/session-manager.js +0 -400
- package/dist/mcp/session-persistence.d.ts +0 -93
- package/dist/mcp/session-persistence.js +0 -302
- package/dist/mcp/tool-integration.d.ts +0 -58
- package/dist/mcp/tool-integration.js +0 -203
- package/dist/mcp/transport-manager.d.ts +0 -154
- package/dist/mcp/transport-manager.js +0 -335
- package/dist/mcp/unified-mcp.d.ts +0 -133
- package/dist/mcp/unified-mcp.js +0 -251
- package/dist/mcp/unified-registry.d.ts +0 -165
- package/dist/mcp/unified-registry.js +0 -539
- package/dist/providers/analytics-helper.d.ts +0 -38
- package/dist/providers/analytics-helper.js +0 -216
- package/dist/providers/function-calling-provider.d.ts +0 -142
- package/dist/providers/function-calling-provider.js +0 -630
- package/dist/providers/mcp-provider.d.ts +0 -75
- package/dist/providers/mcp-provider.js +0 -283
- package/dist/providers/timeout-wrapper.d.ts +0 -40
- package/dist/providers/timeout-wrapper.js +0 -100
- package/dist/sdk/tool-extension.d.ts +0 -181
- package/dist/sdk/tool-extension.js +0 -284
- package/dist/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/services/streaming/streaming-manager.js +0 -245
- package/dist/services/types.d.ts +0 -156
- package/dist/services/types.js +0 -2
- package/dist/services/websocket/websocket-server.d.ts +0 -34
- package/dist/services/websocket/websocket-server.js +0 -306
- package/dist/utils/provider-validation.d.ts +0 -36
- package/dist/utils/provider-validation.js +0 -625
- package/dist/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/utils/providerUtils-fixed.js +0 -94
- package/dist/utils/streaming-utils.d.ts +0 -79
- package/dist/utils/streaming-utils.js +0 -198
- package/dist/utils/timeout-manager.d.ts +0 -75
- package/dist/utils/timeout-manager.js +0 -244
|
@@ -1,462 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NeuroLink MCP Client with Automatic Tool Detection
|
|
3
|
-
* Implements automatic tool execution based on prompt analysis
|
|
4
|
-
* Following Lighthouse's pattern of prompt-based tool invocation
|
|
5
|
-
*/
|
|
6
|
-
import { EventEmitter } from "events";
|
|
7
|
-
import { logger } from "../utils/logger.js";
|
|
8
|
-
import { v4 as uuidv4 } from "uuid";
|
|
9
|
-
import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
|
|
10
|
-
/**
|
|
11
|
-
* NeuroLink MCP Client with Automatic Tool Detection
|
|
12
|
-
*/
|
|
13
|
-
export class NeuroLinkMCPClient extends EventEmitter {
|
|
14
|
-
provider;
|
|
15
|
-
tools = new Map();
|
|
16
|
-
toolPatterns = [];
|
|
17
|
-
config;
|
|
18
|
-
sessionId;
|
|
19
|
-
executionCount = 0;
|
|
20
|
-
constructor(config) {
|
|
21
|
-
super();
|
|
22
|
-
this.provider = config.provider;
|
|
23
|
-
this.config = config;
|
|
24
|
-
this.sessionId = config.sessionId || uuidv4();
|
|
25
|
-
this.initializeDefaultPatterns();
|
|
26
|
-
logger.info(`[NeuroLink MCP Client] Initialized with automatic tool detection`, {
|
|
27
|
-
sessionId: this.sessionId,
|
|
28
|
-
provider: config.providerName,
|
|
29
|
-
model: config.modelName,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Initialize default tool detection patterns
|
|
34
|
-
*/
|
|
35
|
-
initializeDefaultPatterns() {
|
|
36
|
-
// NO HARDCODED PATTERNS! Let AI decide which tools to use
|
|
37
|
-
// This is TRUE automatic tool detection
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Register a tool with automatic detection patterns
|
|
41
|
-
*/
|
|
42
|
-
registerTool(tool, patterns) {
|
|
43
|
-
this.tools.set(tool.name, tool);
|
|
44
|
-
// Add custom patterns if provided
|
|
45
|
-
if (patterns) {
|
|
46
|
-
this.toolPatterns.push(patterns);
|
|
47
|
-
}
|
|
48
|
-
logger.debug(`[NeuroLink MCP Client] Registered tool: ${tool.name}`, {
|
|
49
|
-
hasPatterns: !!patterns,
|
|
50
|
-
sessionId: this.sessionId,
|
|
51
|
-
});
|
|
52
|
-
this.emit("tool:registered", { toolName: tool.name });
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Extract tool parameters using AI
|
|
56
|
-
* No hardcoded patterns - let AI figure out the parameters
|
|
57
|
-
*/
|
|
58
|
-
async extractToolParameters(toolName, tool, prompt) {
|
|
59
|
-
// If the tool has no input schema, no parameters needed
|
|
60
|
-
if (!tool.inputSchema) {
|
|
61
|
-
return {};
|
|
62
|
-
}
|
|
63
|
-
// Get the schema information
|
|
64
|
-
let schemaDescription = "";
|
|
65
|
-
try {
|
|
66
|
-
// Convert schema to a readable format
|
|
67
|
-
if (typeof tool.inputSchema === "object" && tool.inputSchema !== null) {
|
|
68
|
-
schemaDescription = JSON.stringify(tool.inputSchema, null, 2);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
logger.warn(`[NeuroLink MCP Client] Could not serialize schema for ${toolName}`);
|
|
73
|
-
return {};
|
|
74
|
-
}
|
|
75
|
-
// Ask AI to extract parameters
|
|
76
|
-
const extractionPrompt = `Extract the parameters needed for the tool "${toolName}" from the user prompt.
|
|
77
|
-
|
|
78
|
-
Tool: ${toolName}
|
|
79
|
-
Description: ${tool.description}
|
|
80
|
-
Input Schema: ${schemaDescription}
|
|
81
|
-
|
|
82
|
-
User prompt: "${prompt}"
|
|
83
|
-
|
|
84
|
-
Instructions:
|
|
85
|
-
1. Analyze the user prompt to extract values for the tool parameters
|
|
86
|
-
2. Return ONLY a JSON object with the extracted parameters
|
|
87
|
-
3. If a parameter cannot be extracted from the prompt, omit it or use a reasonable default
|
|
88
|
-
4. Make sure the JSON is valid and matches the schema
|
|
89
|
-
|
|
90
|
-
Examples:
|
|
91
|
-
- Prompt: "What's the weather in New York?" → {"location": "New York"}
|
|
92
|
-
- Prompt: "Calculate 5 + 3" → {"expression": "5 + 3"}
|
|
93
|
-
- Prompt: "What time is it?" → {} (no parameters needed)
|
|
94
|
-
|
|
95
|
-
Response (JSON object only):`;
|
|
96
|
-
try {
|
|
97
|
-
const response = await this.provider.generate({
|
|
98
|
-
prompt: extractionPrompt,
|
|
99
|
-
temperature: 0,
|
|
100
|
-
maxTokens: 200,
|
|
101
|
-
});
|
|
102
|
-
if (response?.content) {
|
|
103
|
-
// Extract JSON object from response
|
|
104
|
-
const match = response.content.match(/\{([^}]*)\}/);
|
|
105
|
-
if (match) {
|
|
106
|
-
try {
|
|
107
|
-
const params = JSON.parse(match[0]);
|
|
108
|
-
logger.debug(`[NeuroLink MCP Client] Extracted parameters for ${toolName}`, params);
|
|
109
|
-
return params;
|
|
110
|
-
}
|
|
111
|
-
catch (parseError) {
|
|
112
|
-
logger.error(`[NeuroLink MCP Client] Failed to parse parameters`, parseError);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
logger.error(`[NeuroLink MCP Client] Failed to extract parameters with AI`, error);
|
|
119
|
-
}
|
|
120
|
-
return {};
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Analyze prompt to detect required tools
|
|
124
|
-
* TRUE AUTOMATIC DETECTION - AI decides which tools to use
|
|
125
|
-
*/
|
|
126
|
-
async analyzePrompt(prompt) {
|
|
127
|
-
const detectedTools = [];
|
|
128
|
-
// No patterns! Always use AI to detect tools
|
|
129
|
-
if (this.tools.size > 0) {
|
|
130
|
-
const toolList = Array.from(this.tools.values()).map((tool) => ({
|
|
131
|
-
name: tool.name,
|
|
132
|
-
description: tool.description,
|
|
133
|
-
}));
|
|
134
|
-
const analysisPrompt = `Analyze this user prompt and determine which tools should be used to answer it properly.
|
|
135
|
-
|
|
136
|
-
User prompt: "${prompt}"
|
|
137
|
-
|
|
138
|
-
Available tools:
|
|
139
|
-
${toolList.map((t) => `- ${t.name}: ${t.description}`).join("\n")}
|
|
140
|
-
|
|
141
|
-
Instructions:
|
|
142
|
-
1. Analyze what the user is asking for
|
|
143
|
-
2. Determine which tools would be helpful to answer the question
|
|
144
|
-
3. Return ONLY a JSON array of tool names that should be used
|
|
145
|
-
4. If no tools are needed, return an empty array []
|
|
146
|
-
5. Be selective - only choose tools that are directly relevant
|
|
147
|
-
|
|
148
|
-
Examples:
|
|
149
|
-
- "What time is it?" → ["neurolink-utility_get-current-time"]
|
|
150
|
-
- "Calculate 5 + 3" → ["neurolink-utility_calculator"]
|
|
151
|
-
- "What is the capital of France?" → []
|
|
152
|
-
- "What's the weather in NYC?" → ["neurolink-utility_get-weather"]
|
|
153
|
-
|
|
154
|
-
Response (JSON array only):`;
|
|
155
|
-
try {
|
|
156
|
-
const response = await this.provider.generate({
|
|
157
|
-
prompt: analysisPrompt,
|
|
158
|
-
temperature: 0,
|
|
159
|
-
maxTokens: 200,
|
|
160
|
-
});
|
|
161
|
-
if (response?.content) {
|
|
162
|
-
// Extract JSON array from response
|
|
163
|
-
const match = response.content.match(/\[([^\]]*)\]/);
|
|
164
|
-
if (match) {
|
|
165
|
-
try {
|
|
166
|
-
const toolNames = JSON.parse(match[0]);
|
|
167
|
-
// Filter to only include tools that actually exist
|
|
168
|
-
const validTools = toolNames.filter((name) => {
|
|
169
|
-
// Check exact match first
|
|
170
|
-
if (this.tools.has(name)) {
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
// Check for partial matches (e.g., "get-current-time" matches "neurolink-utility_get-current-time")
|
|
174
|
-
for (const [registeredName] of this.tools) {
|
|
175
|
-
if (registeredName.endsWith(`_${name}`) ||
|
|
176
|
-
registeredName.includes(name)) {
|
|
177
|
-
// Replace with the full registered name
|
|
178
|
-
const index = toolNames.indexOf(name);
|
|
179
|
-
if (index !== -1) {
|
|
180
|
-
toolNames[index] = registeredName;
|
|
181
|
-
}
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return false;
|
|
186
|
-
});
|
|
187
|
-
detectedTools.push(...validTools);
|
|
188
|
-
}
|
|
189
|
-
catch (parseError) {
|
|
190
|
-
logger.error(`[NeuroLink MCP Client] Failed to parse tool names`, parseError);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
catch (error) {
|
|
196
|
-
logger.error(`[NeuroLink MCP Client] Failed to analyze prompt with AI`, error);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
logger.info(`[NeuroLink MCP Client] AI detected tools for prompt`, {
|
|
200
|
-
prompt: prompt.substring(0, 50),
|
|
201
|
-
detectedTools,
|
|
202
|
-
sessionId: this.sessionId,
|
|
203
|
-
});
|
|
204
|
-
return detectedTools;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Execute detected tools
|
|
208
|
-
*/
|
|
209
|
-
async executeTools(toolNames, prompt) {
|
|
210
|
-
const results = [];
|
|
211
|
-
for (const toolName of toolNames) {
|
|
212
|
-
const tool = this.tools.get(toolName);
|
|
213
|
-
if (!tool) {
|
|
214
|
-
logger.warn(`[NeuroLink MCP Client] Tool not found: ${toolName}`);
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
// Extract parameters for the tool using AI
|
|
218
|
-
const params = await this.extractToolParameters(toolName, tool, prompt);
|
|
219
|
-
// Create execution context
|
|
220
|
-
const context = {
|
|
221
|
-
sessionId: this.sessionId,
|
|
222
|
-
userId: this.config.userId || "anonymous",
|
|
223
|
-
organizationId: this.config.organizationId || "default",
|
|
224
|
-
aiProvider: this.config.providerName || "unknown",
|
|
225
|
-
modelId: this.config.modelName,
|
|
226
|
-
timestamp: Date.now(),
|
|
227
|
-
// Required properties
|
|
228
|
-
secureFS: {
|
|
229
|
-
readFile: async () => {
|
|
230
|
-
throw new Error("secureFS not configured");
|
|
231
|
-
},
|
|
232
|
-
writeFile: async () => {
|
|
233
|
-
throw new Error("secureFS not configured");
|
|
234
|
-
},
|
|
235
|
-
readdir: async () => {
|
|
236
|
-
throw new Error("secureFS not configured");
|
|
237
|
-
},
|
|
238
|
-
stat: async () => {
|
|
239
|
-
throw new Error("secureFS not configured");
|
|
240
|
-
},
|
|
241
|
-
mkdir: async () => {
|
|
242
|
-
throw new Error("secureFS not configured");
|
|
243
|
-
},
|
|
244
|
-
exists: async () => false,
|
|
245
|
-
},
|
|
246
|
-
path: {
|
|
247
|
-
join: (...paths) => {
|
|
248
|
-
const pathModule = require("path");
|
|
249
|
-
return pathModule.join(...paths);
|
|
250
|
-
},
|
|
251
|
-
resolve: (...paths) => {
|
|
252
|
-
const pathModule = require("path");
|
|
253
|
-
return pathModule.resolve(...paths);
|
|
254
|
-
},
|
|
255
|
-
relative: (from, to) => {
|
|
256
|
-
const pathModule = require("path");
|
|
257
|
-
return pathModule.relative(from, to);
|
|
258
|
-
},
|
|
259
|
-
dirname: (pathArg) => {
|
|
260
|
-
const pathModule = require("path");
|
|
261
|
-
return pathModule.dirname(pathArg);
|
|
262
|
-
},
|
|
263
|
-
basename: (pathArg, ext) => {
|
|
264
|
-
const pathModule = require("path");
|
|
265
|
-
return pathModule.basename(pathArg, ext);
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
grantedPermissions: [],
|
|
269
|
-
log: console.log,
|
|
270
|
-
};
|
|
271
|
-
// Emit tool start event
|
|
272
|
-
this.executionCount++;
|
|
273
|
-
const executionId = `exec-${this.executionCount}`;
|
|
274
|
-
this.emit("tool:start", {
|
|
275
|
-
executionId,
|
|
276
|
-
toolName,
|
|
277
|
-
params,
|
|
278
|
-
});
|
|
279
|
-
const startTime = Date.now();
|
|
280
|
-
try {
|
|
281
|
-
// Execute the tool
|
|
282
|
-
const result = await tool.execute(params, context);
|
|
283
|
-
const executionTime = Date.now() - startTime;
|
|
284
|
-
results.push({
|
|
285
|
-
toolName,
|
|
286
|
-
result,
|
|
287
|
-
executionTime,
|
|
288
|
-
});
|
|
289
|
-
// Emit tool end event
|
|
290
|
-
this.emit("tool:end", {
|
|
291
|
-
executionId,
|
|
292
|
-
toolName,
|
|
293
|
-
result,
|
|
294
|
-
executionTime,
|
|
295
|
-
});
|
|
296
|
-
logger.info(`[NeuroLink MCP Client] Tool executed successfully`, {
|
|
297
|
-
toolName,
|
|
298
|
-
executionTime,
|
|
299
|
-
success: result.success,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
catch (error) {
|
|
303
|
-
const executionTime = Date.now() - startTime;
|
|
304
|
-
const errorResult = {
|
|
305
|
-
success: false,
|
|
306
|
-
error: error instanceof Error ? error.message : String(error),
|
|
307
|
-
};
|
|
308
|
-
results.push({
|
|
309
|
-
toolName,
|
|
310
|
-
result: errorResult,
|
|
311
|
-
executionTime,
|
|
312
|
-
});
|
|
313
|
-
// Emit tool error event
|
|
314
|
-
this.emit("tool:error", {
|
|
315
|
-
executionId,
|
|
316
|
-
toolName,
|
|
317
|
-
error: errorResult.error,
|
|
318
|
-
executionTime,
|
|
319
|
-
});
|
|
320
|
-
logger.error(`[NeuroLink MCP Client] Tool execution failed`, {
|
|
321
|
-
toolName,
|
|
322
|
-
error: errorResult.error,
|
|
323
|
-
executionTime,
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return results;
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Generate response with tool results incorporated
|
|
331
|
-
*/
|
|
332
|
-
async generateResponse(prompt, toolResults) {
|
|
333
|
-
// If no tools were used, generate regular response
|
|
334
|
-
if (toolResults.length === 0) {
|
|
335
|
-
const response = await this.provider.generate({ prompt });
|
|
336
|
-
return response?.content || "";
|
|
337
|
-
}
|
|
338
|
-
// Extract human-readable results from tool executions
|
|
339
|
-
const toolResultsText = toolResults
|
|
340
|
-
.map((tr) => {
|
|
341
|
-
if (tr.result.success && tr.result.data) {
|
|
342
|
-
// Check if tool result has a displayString or other human-readable format
|
|
343
|
-
const data = tr.result.data;
|
|
344
|
-
// For time tool, use the displayString
|
|
345
|
-
if (data.displayString) {
|
|
346
|
-
return data.displayString;
|
|
347
|
-
}
|
|
348
|
-
// For other tools, try to extract meaningful text
|
|
349
|
-
if (data.formatted) {
|
|
350
|
-
return data.formatted;
|
|
351
|
-
}
|
|
352
|
-
// For complex results, create a summary
|
|
353
|
-
if (typeof data === "object") {
|
|
354
|
-
// Try to find the most relevant field
|
|
355
|
-
if (data.result) {
|
|
356
|
-
return String(data.result);
|
|
357
|
-
}
|
|
358
|
-
if (data.output) {
|
|
359
|
-
return String(data.output);
|
|
360
|
-
}
|
|
361
|
-
if (data.text) {
|
|
362
|
-
return String(data.text);
|
|
363
|
-
}
|
|
364
|
-
if (data.value) {
|
|
365
|
-
return String(data.value);
|
|
366
|
-
}
|
|
367
|
-
// For time-specific fields
|
|
368
|
-
if (data.localTime) {
|
|
369
|
-
return `The current time is ${data.localTime} in ${data.actualTimezone || data.requestedTimezone}`;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
// Fallback to stringified result
|
|
373
|
-
return JSON.stringify(data);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
return `Tool ${tr.toolName} failed: ${tr.result.error}`;
|
|
377
|
-
}
|
|
378
|
-
})
|
|
379
|
-
.join("\n");
|
|
380
|
-
// For single tool results with displayString, return directly
|
|
381
|
-
if (toolResults.length === 1) {
|
|
382
|
-
const toolResult = toolResults[0];
|
|
383
|
-
if (toolResult.result.success && toolResult.result.data) {
|
|
384
|
-
const data = toolResult.result.data;
|
|
385
|
-
if (typeof data.displayString === "string") {
|
|
386
|
-
return data.displayString;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
// For more complex queries, let the AI incorporate the results
|
|
391
|
-
const enhancedPrompt = `User question: ${prompt}
|
|
392
|
-
|
|
393
|
-
Tool results: ${toolResultsText}
|
|
394
|
-
|
|
395
|
-
Please provide a natural response based on the tool results.`;
|
|
396
|
-
// Generate final response
|
|
397
|
-
const response = await this.provider.generate({
|
|
398
|
-
prompt: enhancedPrompt,
|
|
399
|
-
temperature: 0.7,
|
|
400
|
-
maxTokens: DEFAULT_MAX_TOKENS,
|
|
401
|
-
});
|
|
402
|
-
return response?.content || toolResultsText;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Send a prompt and automatically execute any needed tools
|
|
406
|
-
*/
|
|
407
|
-
async sendPrompt(prompt) {
|
|
408
|
-
logger.info(`[NeuroLink MCP Client] Processing prompt with automatic tool detection`, {
|
|
409
|
-
prompt: prompt.substring(0, 100),
|
|
410
|
-
sessionId: this.sessionId,
|
|
411
|
-
});
|
|
412
|
-
// Step 1: Analyze prompt for tool needs
|
|
413
|
-
const toolsNeeded = await this.analyzePrompt(prompt);
|
|
414
|
-
// Step 2: Execute tools if needed
|
|
415
|
-
const toolResults = await this.executeTools(toolsNeeded, prompt);
|
|
416
|
-
// Step 3: Generate response with tool results
|
|
417
|
-
const response = await this.generateResponse(prompt, toolResults);
|
|
418
|
-
return response;
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Get registered tools
|
|
422
|
-
*/
|
|
423
|
-
getTools() {
|
|
424
|
-
const tools = {};
|
|
425
|
-
for (const [name, tool] of this.tools) {
|
|
426
|
-
tools[name] = {
|
|
427
|
-
name: name, // Include the tool name as a property
|
|
428
|
-
description: tool.description,
|
|
429
|
-
inputSchema: tool.inputSchema,
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
return tools;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Get session statistics
|
|
436
|
-
*/
|
|
437
|
-
getStats() {
|
|
438
|
-
return {
|
|
439
|
-
sessionId: this.sessionId,
|
|
440
|
-
toolCount: this.tools.size,
|
|
441
|
-
patternCount: this.toolPatterns.length,
|
|
442
|
-
executionCount: this.executionCount,
|
|
443
|
-
provider: this.config.providerName,
|
|
444
|
-
model: this.config.modelName,
|
|
445
|
-
};
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Clean up resources
|
|
449
|
-
*/
|
|
450
|
-
async cleanup() {
|
|
451
|
-
this.tools.clear();
|
|
452
|
-
this.toolPatterns = [];
|
|
453
|
-
this.removeAllListeners();
|
|
454
|
-
logger.info(`[NeuroLink MCP Client] Cleaned up session ${this.sessionId}`);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
/**
|
|
458
|
-
* Create a new NeuroLink MCP Client instance
|
|
459
|
-
*/
|
|
460
|
-
export function createNeuroLinkMCPClient(config) {
|
|
461
|
-
return new NeuroLinkMCPClient(config);
|
|
462
|
-
}
|