@juspay/neurolink 6.0.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.
Files changed (283) hide show
  1. package/CHANGELOG.md +14 -3
  2. package/dist/cli/commands/config.d.ts +13 -13
  3. package/dist/cli/index.js +3 -9
  4. package/dist/core/analytics.d.ts +11 -1
  5. package/dist/core/analytics.js +2 -2
  6. package/dist/core/base-provider.js +4 -18
  7. package/dist/core/dynamic-models.d.ts +8 -8
  8. package/dist/core/factory.js +3 -11
  9. package/dist/index.d.ts +2 -4
  10. package/dist/index.js +2 -11
  11. package/dist/lib/core/analytics.d.ts +11 -1
  12. package/dist/lib/core/analytics.js +2 -2
  13. package/dist/lib/core/base-provider.js +4 -18
  14. package/dist/lib/core/dynamic-models.d.ts +8 -8
  15. package/dist/lib/core/factory.js +3 -11
  16. package/dist/lib/index.d.ts +2 -4
  17. package/dist/lib/index.js +2 -11
  18. package/dist/lib/mcp/factory.d.ts +1 -1
  19. package/dist/lib/mcp/index.d.ts +7 -19
  20. package/dist/lib/mcp/index.js +15 -56
  21. package/dist/lib/neurolink.d.ts +1 -9
  22. package/dist/lib/neurolink.js +21 -70
  23. package/dist/lib/providers/amazon-bedrock.js +5 -16
  24. package/dist/lib/providers/anthropic-baseprovider.js +3 -21
  25. package/dist/lib/providers/anthropic.js +4 -7
  26. package/dist/lib/providers/azure-openai.js +4 -2
  27. package/dist/lib/providers/google-vertex.js +5 -9
  28. package/dist/lib/providers/huggingFace.js +5 -10
  29. package/dist/lib/providers/mistral.js +5 -8
  30. package/dist/lib/providers/openAI.js +4 -7
  31. package/dist/lib/utils/providerConfig.d.ts +117 -0
  32. package/dist/lib/utils/providerConfig.js +353 -0
  33. package/dist/lib/utils/providerUtils.d.ts +2 -1
  34. package/dist/lib/utils/providerUtils.js +53 -36
  35. package/dist/lib/utils/timeout.d.ts +72 -1
  36. package/dist/lib/utils/timeout.js +203 -2
  37. package/dist/mcp/factory.d.ts +1 -1
  38. package/dist/mcp/index.d.ts +7 -19
  39. package/dist/mcp/index.js +15 -56
  40. package/dist/neurolink.d.ts +1 -9
  41. package/dist/neurolink.js +21 -70
  42. package/dist/providers/amazon-bedrock.js +5 -16
  43. package/dist/providers/anthropic-baseprovider.js +3 -21
  44. package/dist/providers/anthropic.js +4 -7
  45. package/dist/providers/azure-openai.js +4 -2
  46. package/dist/providers/google-vertex.js +5 -9
  47. package/dist/providers/huggingFace.js +5 -10
  48. package/dist/providers/mistral.js +5 -8
  49. package/dist/providers/openAI.js +4 -7
  50. package/dist/utils/providerConfig.d.ts +117 -0
  51. package/dist/utils/providerConfig.js +353 -0
  52. package/dist/utils/providerUtils.d.ts +2 -1
  53. package/dist/utils/providerUtils.js +53 -36
  54. package/dist/utils/timeout.d.ts +72 -1
  55. package/dist/utils/timeout.js +203 -2
  56. package/package.json +2 -1
  57. package/dist/chat/client-utils.d.ts +0 -95
  58. package/dist/chat/client-utils.js +0 -315
  59. package/dist/chat/index.d.ts +0 -24
  60. package/dist/chat/index.js +0 -33
  61. package/dist/chat/session-storage.d.ts +0 -77
  62. package/dist/chat/session-storage.js +0 -233
  63. package/dist/chat/session.d.ts +0 -96
  64. package/dist/chat/session.js +0 -257
  65. package/dist/chat/sse-handler.d.ts +0 -49
  66. package/dist/chat/sse-handler.js +0 -259
  67. package/dist/chat/types.d.ts +0 -74
  68. package/dist/chat/types.js +0 -5
  69. package/dist/chat/websocket-chat-handler.d.ts +0 -37
  70. package/dist/chat/websocket-chat-handler.js +0 -262
  71. package/dist/cli/commands/mcp.d.ts +0 -20
  72. package/dist/cli/commands/mcp.js +0 -1272
  73. package/dist/core/defaults.d.ts +0 -19
  74. package/dist/core/defaults.js +0 -29
  75. package/dist/core/evaluation-config.d.ts +0 -29
  76. package/dist/core/evaluation-config.js +0 -144
  77. package/dist/factories/compatibility-factory.d.ts +0 -35
  78. package/dist/factories/compatibility-factory.js +0 -71
  79. package/dist/factories/provider-generate-factory.d.ts +0 -20
  80. package/dist/factories/provider-generate-factory.js +0 -93
  81. package/dist/lib/chat/client-utils.d.ts +0 -95
  82. package/dist/lib/chat/client-utils.js +0 -315
  83. package/dist/lib/chat/index.d.ts +0 -24
  84. package/dist/lib/chat/index.js +0 -33
  85. package/dist/lib/chat/session-storage.d.ts +0 -77
  86. package/dist/lib/chat/session-storage.js +0 -233
  87. package/dist/lib/chat/session.d.ts +0 -96
  88. package/dist/lib/chat/session.js +0 -257
  89. package/dist/lib/chat/sse-handler.d.ts +0 -49
  90. package/dist/lib/chat/sse-handler.js +0 -259
  91. package/dist/lib/chat/types.d.ts +0 -74
  92. package/dist/lib/chat/types.js +0 -5
  93. package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
  94. package/dist/lib/chat/websocket-chat-handler.js +0 -262
  95. package/dist/lib/core/defaults.d.ts +0 -19
  96. package/dist/lib/core/defaults.js +0 -29
  97. package/dist/lib/core/evaluation-config.d.ts +0 -29
  98. package/dist/lib/core/evaluation-config.js +0 -144
  99. package/dist/lib/factories/compatibility-factory.d.ts +0 -35
  100. package/dist/lib/factories/compatibility-factory.js +0 -71
  101. package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
  102. package/dist/lib/factories/provider-generate-factory.js +0 -93
  103. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
  104. package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
  105. package/dist/lib/mcp/auto-discovery.d.ts +0 -62
  106. package/dist/lib/mcp/auto-discovery.js +0 -149
  107. package/dist/lib/mcp/client.d.ts +0 -68
  108. package/dist/lib/mcp/client.js +0 -248
  109. package/dist/lib/mcp/config.d.ts +0 -31
  110. package/dist/lib/mcp/config.js +0 -99
  111. package/dist/lib/mcp/context-manager.d.ts +0 -171
  112. package/dist/lib/mcp/context-manager.js +0 -362
  113. package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
  114. package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
  115. package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
  116. package/dist/lib/mcp/core/plugin-manager.js +0 -110
  117. package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
  118. package/dist/lib/mcp/demo/plugin-demo.js +0 -118
  119. package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
  120. package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
  121. package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
  122. package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
  123. package/dist/lib/mcp/ecosystem.d.ts +0 -75
  124. package/dist/lib/mcp/ecosystem.js +0 -161
  125. package/dist/lib/mcp/error-manager.d.ts +0 -254
  126. package/dist/lib/mcp/error-manager.js +0 -501
  127. package/dist/lib/mcp/error-recovery.d.ts +0 -159
  128. package/dist/lib/mcp/error-recovery.js +0 -405
  129. package/dist/lib/mcp/external-client.d.ts +0 -88
  130. package/dist/lib/mcp/external-client.js +0 -331
  131. package/dist/lib/mcp/external-manager.d.ts +0 -112
  132. package/dist/lib/mcp/external-manager.js +0 -308
  133. package/dist/lib/mcp/function-calling.d.ts +0 -65
  134. package/dist/lib/mcp/function-calling.js +0 -642
  135. package/dist/lib/mcp/health-monitor.d.ts +0 -257
  136. package/dist/lib/mcp/health-monitor.js +0 -630
  137. package/dist/lib/mcp/initialize-tools.d.ts +0 -29
  138. package/dist/lib/mcp/initialize-tools.js +0 -261
  139. package/dist/lib/mcp/initialize.d.ts +0 -18
  140. package/dist/lib/mcp/initialize.js +0 -62
  141. package/dist/lib/mcp/manager.d.ts +0 -68
  142. package/dist/lib/mcp/manager.js +0 -176
  143. package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
  144. package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
  145. package/dist/lib/mcp/orchestrator.d.ts +0 -302
  146. package/dist/lib/mcp/orchestrator.js +0 -703
  147. package/dist/lib/mcp/plugin-manager.d.ts +0 -98
  148. package/dist/lib/mcp/plugin-manager.js +0 -296
  149. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  150. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
  151. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
  152. package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
  153. package/dist/lib/mcp/security-manager.d.ts +0 -87
  154. package/dist/lib/mcp/security-manager.js +0 -344
  155. package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
  156. package/dist/lib/mcp/semaphore-manager.js +0 -329
  157. package/dist/lib/mcp/session-manager.d.ts +0 -187
  158. package/dist/lib/mcp/session-manager.js +0 -400
  159. package/dist/lib/mcp/session-persistence.d.ts +0 -93
  160. package/dist/lib/mcp/session-persistence.js +0 -301
  161. package/dist/lib/mcp/tool-integration.d.ts +0 -58
  162. package/dist/lib/mcp/tool-integration.js +0 -203
  163. package/dist/lib/mcp/transport-manager.d.ts +0 -154
  164. package/dist/lib/mcp/transport-manager.js +0 -334
  165. package/dist/lib/mcp/unified-mcp.d.ts +0 -133
  166. package/dist/lib/mcp/unified-mcp.js +0 -251
  167. package/dist/lib/mcp/unified-registry.d.ts +0 -165
  168. package/dist/lib/mcp/unified-registry.js +0 -538
  169. package/dist/lib/providers/analytics-helper.d.ts +0 -38
  170. package/dist/lib/providers/analytics-helper.js +0 -216
  171. package/dist/lib/providers/function-calling-provider.d.ts +0 -142
  172. package/dist/lib/providers/function-calling-provider.js +0 -630
  173. package/dist/lib/providers/mcp-provider.d.ts +0 -75
  174. package/dist/lib/providers/mcp-provider.js +0 -283
  175. package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
  176. package/dist/lib/providers/timeout-wrapper.js +0 -100
  177. package/dist/lib/sdk/tool-extension.d.ts +0 -181
  178. package/dist/lib/sdk/tool-extension.js +0 -284
  179. package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
  180. package/dist/lib/services/streaming/streaming-manager.js +0 -245
  181. package/dist/lib/services/types.d.ts +0 -156
  182. package/dist/lib/services/types.js +0 -2
  183. package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
  184. package/dist/lib/services/websocket/websocket-server.js +0 -305
  185. package/dist/lib/utils/provider-validation.d.ts +0 -36
  186. package/dist/lib/utils/provider-validation.js +0 -625
  187. package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
  188. package/dist/lib/utils/providerUtils-fixed.js +0 -94
  189. package/dist/lib/utils/streaming-utils.d.ts +0 -79
  190. package/dist/lib/utils/streaming-utils.js +0 -198
  191. package/dist/lib/utils/timeout-manager.d.ts +0 -75
  192. package/dist/lib/utils/timeout-manager.js +0 -244
  193. package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
  194. package/dist/mcp/adapters/plugin-bridge.js +0 -89
  195. package/dist/mcp/auto-discovery.d.ts +0 -62
  196. package/dist/mcp/auto-discovery.js +0 -149
  197. package/dist/mcp/client.d.ts +0 -68
  198. package/dist/mcp/client.js +0 -248
  199. package/dist/mcp/config.d.ts +0 -31
  200. package/dist/mcp/config.js +0 -99
  201. package/dist/mcp/context-manager.d.ts +0 -171
  202. package/dist/mcp/context-manager.js +0 -362
  203. package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
  204. package/dist/mcp/contracts/mcp-contract.js +0 -58
  205. package/dist/mcp/core/plugin-manager.d.ts +0 -46
  206. package/dist/mcp/core/plugin-manager.js +0 -110
  207. package/dist/mcp/demo/plugin-demo.d.ts +0 -20
  208. package/dist/mcp/demo/plugin-demo.js +0 -118
  209. package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
  210. package/dist/mcp/dynamic-chain-executor.js +0 -489
  211. package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
  212. package/dist/mcp/dynamic-orchestrator.js +0 -351
  213. package/dist/mcp/ecosystem.d.ts +0 -75
  214. package/dist/mcp/ecosystem.js +0 -162
  215. package/dist/mcp/error-manager.d.ts +0 -254
  216. package/dist/mcp/error-manager.js +0 -501
  217. package/dist/mcp/error-recovery.d.ts +0 -159
  218. package/dist/mcp/error-recovery.js +0 -405
  219. package/dist/mcp/external-client.d.ts +0 -88
  220. package/dist/mcp/external-client.js +0 -331
  221. package/dist/mcp/external-manager.d.ts +0 -112
  222. package/dist/mcp/external-manager.js +0 -308
  223. package/dist/mcp/function-calling.d.ts +0 -65
  224. package/dist/mcp/function-calling.js +0 -642
  225. package/dist/mcp/health-monitor.d.ts +0 -257
  226. package/dist/mcp/health-monitor.js +0 -630
  227. package/dist/mcp/initialize-tools.d.ts +0 -29
  228. package/dist/mcp/initialize-tools.js +0 -262
  229. package/dist/mcp/initialize.d.ts +0 -18
  230. package/dist/mcp/initialize.js +0 -62
  231. package/dist/mcp/manager.d.ts +0 -68
  232. package/dist/mcp/manager.js +0 -176
  233. package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
  234. package/dist/mcp/neurolink-mcp-client.js +0 -462
  235. package/dist/mcp/orchestrator.d.ts +0 -302
  236. package/dist/mcp/orchestrator.js +0 -703
  237. package/dist/mcp/plugin-manager.d.ts +0 -98
  238. package/dist/mcp/plugin-manager.js +0 -297
  239. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  240. package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
  241. package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
  242. package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
  243. package/dist/mcp/plugins/filesystem-mcp.js +0 -54
  244. package/dist/mcp/security-manager.d.ts +0 -87
  245. package/dist/mcp/security-manager.js +0 -344
  246. package/dist/mcp/semaphore-manager.d.ts +0 -137
  247. package/dist/mcp/semaphore-manager.js +0 -329
  248. package/dist/mcp/session-manager.d.ts +0 -187
  249. package/dist/mcp/session-manager.js +0 -400
  250. package/dist/mcp/session-persistence.d.ts +0 -93
  251. package/dist/mcp/session-persistence.js +0 -302
  252. package/dist/mcp/tool-integration.d.ts +0 -58
  253. package/dist/mcp/tool-integration.js +0 -203
  254. package/dist/mcp/transport-manager.d.ts +0 -154
  255. package/dist/mcp/transport-manager.js +0 -335
  256. package/dist/mcp/unified-mcp.d.ts +0 -133
  257. package/dist/mcp/unified-mcp.js +0 -251
  258. package/dist/mcp/unified-registry.d.ts +0 -165
  259. package/dist/mcp/unified-registry.js +0 -539
  260. package/dist/providers/analytics-helper.d.ts +0 -38
  261. package/dist/providers/analytics-helper.js +0 -216
  262. package/dist/providers/function-calling-provider.d.ts +0 -142
  263. package/dist/providers/function-calling-provider.js +0 -630
  264. package/dist/providers/mcp-provider.d.ts +0 -75
  265. package/dist/providers/mcp-provider.js +0 -283
  266. package/dist/providers/timeout-wrapper.d.ts +0 -40
  267. package/dist/providers/timeout-wrapper.js +0 -100
  268. package/dist/sdk/tool-extension.d.ts +0 -181
  269. package/dist/sdk/tool-extension.js +0 -284
  270. package/dist/services/streaming/streaming-manager.d.ts +0 -29
  271. package/dist/services/streaming/streaming-manager.js +0 -245
  272. package/dist/services/types.d.ts +0 -156
  273. package/dist/services/types.js +0 -2
  274. package/dist/services/websocket/websocket-server.d.ts +0 -34
  275. package/dist/services/websocket/websocket-server.js +0 -306
  276. package/dist/utils/provider-validation.d.ts +0 -36
  277. package/dist/utils/provider-validation.js +0 -625
  278. package/dist/utils/providerUtils-fixed.d.ts +0 -8
  279. package/dist/utils/providerUtils-fixed.js +0 -94
  280. package/dist/utils/streaming-utils.d.ts +0 -79
  281. package/dist/utils/streaming-utils.js +0 -198
  282. package/dist/utils/timeout-manager.d.ts +0 -75
  283. 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
- }