@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,630 +0,0 @@
1
- /**
2
- * Enhanced AI Provider with Real Function Calling Support
3
- * Integrates MCP tools directly with AI SDK's function calling capabilities
4
- * This is the missing piece that enables true AI function calling!
5
- */
6
- import { streamText as aiStreamText, generateText as aiGenerate, Output, } from "ai";
7
- import { getAvailableFunctionTools, executeFunctionCall, isFunctionCallingAvailable, } from "../mcp/function-calling.js";
8
- import { createExecutionContext } from "../mcp/context-manager.js";
9
- import { mcpLogger } from "../mcp/logging.js";
10
- import { DEFAULT_MAX_TOKENS, DEFAULT_MAX_STEPS } from "../core/constants.js";
11
- /**
12
- * Enhanced provider that enables real function calling with MCP tools
13
- */
14
- export class FunctionCallingProvider {
15
- baseProvider;
16
- enableFunctionCalling;
17
- sessionId;
18
- userId;
19
- cachedToolsObject = null;
20
- cachedToolMap = null;
21
- cacheTimestamp = null;
22
- cacheExpiryMs;
23
- constructor(baseProvider, options = {}) {
24
- this.baseProvider = baseProvider;
25
- this.enableFunctionCalling = options.enableFunctionCalling ?? true;
26
- this.sessionId = options.sessionId || `function-calling-${Date.now()}`;
27
- this.userId = options.userId || "function-calling-user";
28
- // Configurable cache expiry: default 5 minutes, with environment override, then constructor option
29
- const defaultExpiryMs = 5 * 60 * 1000; // 5 minutes
30
- const envExpiryMs = process.env.NEUROLINK_CACHE_EXPIRY_MS
31
- ? parseInt(process.env.NEUROLINK_CACHE_EXPIRY_MS, 10)
32
- : undefined;
33
- this.cacheExpiryMs =
34
- options.cacheExpiryMs ?? envExpiryMs ?? defaultExpiryMs;
35
- }
36
- /**
37
- * PRIMARY METHOD: Stream content using AI (recommended for new code)
38
- * Future-ready for multi-modal capabilities with current text focus
39
- */
40
- async stream(optionsOrPrompt, analysisSchema) {
41
- const functionTag = "FunctionCallingProvider.stream";
42
- const startTime = Date.now();
43
- // Parse parameters - support both string and options object
44
- const options = typeof optionsOrPrompt === "string"
45
- ? { input: { text: optionsOrPrompt } }
46
- : optionsOrPrompt;
47
- // Validate input
48
- if (!options?.input?.text ||
49
- typeof options.input.text !== "string" ||
50
- options.input.text.trim() === "") {
51
- throw new Error("Stream options must include input.text as a non-empty string");
52
- }
53
- // Use base provider's stream implementation
54
- const baseResult = await this.baseProvider.stream(options);
55
- if (!baseResult) {
56
- throw new Error("No stream response received from provider");
57
- }
58
- // Return the result with function-calling metadata
59
- return {
60
- ...baseResult,
61
- provider: "function-calling",
62
- model: options.model || "unknown",
63
- metadata: {
64
- streamId: `function-calling-${Date.now()}`,
65
- startTime,
66
- },
67
- };
68
- }
69
- /**
70
- * Generate text with real function calling support
71
- */
72
- async generate(optionsOrPrompt, analysisSchema) {
73
- const options = typeof optionsOrPrompt === "string"
74
- ? { prompt: optionsOrPrompt }
75
- : optionsOrPrompt;
76
- const functionTag = "FunctionCallingProvider.generate";
77
- // If function calling is disabled, use base provider
78
- if (!this.enableFunctionCalling) {
79
- mcpLogger.debug(`[${functionTag}] Function calling disabled, using base provider`);
80
- const result = await this.baseProvider.generate(options, analysisSchema);
81
- if (!result) {
82
- return {
83
- content: "No response generated",
84
- provider: "function-calling",
85
- model: "unknown",
86
- };
87
- }
88
- return result;
89
- }
90
- try {
91
- // Check if function calling is available
92
- const functionsAvailable = await isFunctionCallingAvailable();
93
- if (!functionsAvailable) {
94
- mcpLogger.debug(`[${functionTag}] No functions available, using base provider`);
95
- const result = await this.baseProvider.generate(options, analysisSchema);
96
- if (!result) {
97
- return {
98
- content: "No response generated",
99
- provider: "function-calling",
100
- model: "unknown",
101
- };
102
- }
103
- return result;
104
- }
105
- // Get available function tools (with automatic cache invalidation)
106
- let toolsObject, toolMap;
107
- const now = Date.now();
108
- const isCacheExpired = this.cacheTimestamp === null ||
109
- now - this.cacheTimestamp > this.cacheExpiryMs;
110
- if (this.cachedToolsObject && this.cachedToolMap && !isCacheExpired) {
111
- toolsObject = this.cachedToolsObject;
112
- toolMap = this.cachedToolMap;
113
- mcpLogger.debug(`[${functionTag}] Using cached tools (${Math.round((now - this.cacheTimestamp) / 1000)}s old)`);
114
- }
115
- else {
116
- if (isCacheExpired && this.cachedToolsObject) {
117
- mcpLogger.debug(`[${functionTag}] Cache expired, refreshing tools`);
118
- }
119
- const result = await getAvailableFunctionTools();
120
- toolsObject = result.toolsObject;
121
- toolMap = result.toolMap;
122
- // Cache the results for future use with timestamp
123
- this.cachedToolsObject = toolsObject;
124
- this.cachedToolMap = toolMap;
125
- this.cacheTimestamp = now;
126
- mcpLogger.debug(`[${functionTag}] Cached ${Object.keys(toolsObject).length} tools with expiry in ${this.cacheExpiryMs / 1000}s`);
127
- }
128
- const tools = Object.values(toolsObject);
129
- if (tools.length === 0) {
130
- mcpLogger.debug(`[${functionTag}] No tools available, using base provider`);
131
- const result = await this.baseProvider.generate(options, analysisSchema);
132
- if (!result) {
133
- return {
134
- content: "No response generated",
135
- provider: "function-calling",
136
- model: "unknown",
137
- };
138
- }
139
- return result;
140
- }
141
- mcpLogger.debug(`[${functionTag}] Function calling enabled with ${tools.length} tools`);
142
- // Create execution context
143
- const context = createExecutionContext({
144
- sessionId: this.sessionId,
145
- userId: this.userId,
146
- aiProvider: this.baseProvider.constructor.name,
147
- });
148
- // Use the AI SDK's native function calling by calling generate directly
149
- // We can now use the toolsObject directly instead of converting from array
150
- const result = await this.generateWithToolsObject(options, toolsObject, toolMap, context, analysisSchema);
151
- if (!result) {
152
- return {
153
- content: "No response generated",
154
- provider: "function-calling",
155
- model: "unknown",
156
- };
157
- }
158
- // Enhance result with function calling metadata
159
- const enhancedResult = {
160
- ...result,
161
- functionCallingEnabled: true,
162
- availableFunctions: tools.length,
163
- mcpIntegration: {
164
- sessionId: this.sessionId,
165
- functionCallsSupported: true,
166
- toolsRegistered: tools.length,
167
- },
168
- };
169
- mcpLogger.debug(`[${functionTag}] Function-calling generation completed with ${result.toolCalls?.length || 0} tool calls`);
170
- return enhancedResult;
171
- }
172
- catch (error) {
173
- mcpLogger.warn(`[${functionTag}] Function calling failed, using base provider:`, error);
174
- const result = await this.baseProvider.generate(options, analysisSchema);
175
- if (!result) {
176
- return {
177
- content: "No response generated",
178
- provider: "function-calling",
179
- model: "unknown",
180
- };
181
- }
182
- return result;
183
- }
184
- }
185
- /**
186
- * Generate text with tools using the AI SDK's generate function (with tools object)
187
- */
188
- async generateWithToolsObject(options, toolsObject, toolMap, context, analysisSchema) {
189
- const functionTag = "FunctionCallingProvider.generateWithToolsObject";
190
- try {
191
- // Use the toolsObject directly with proper execution wrapped
192
- const toolsWithExecution = this.wrapToolsWithExecution(toolsObject, toolMap, context);
193
- mcpLogger.debug(`[${functionTag}] Using tools object with ${Object.keys(toolsWithExecution).length} tools`);
194
- // Get the model from base provider
195
- const modelInfo = await this.getModelFromProvider();
196
- if (!modelInfo) {
197
- mcpLogger.warn(`[${functionTag}] Could not get model from provider, falling back to base provider`);
198
- const result = await this.baseProvider.generate(options, analysisSchema);
199
- if (!result) {
200
- return {
201
- content: "No response generated",
202
- provider: "function-calling",
203
- model: "unknown",
204
- };
205
- }
206
- return result;
207
- }
208
- // Use AI SDK's generate directly with tools
209
- const generateOptions = {
210
- model: modelInfo.model,
211
- prompt: options.prompt,
212
- system: options.systemPrompt || "You are a helpful AI assistant.",
213
- temperature: options.temperature || 0.7,
214
- maxTokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
215
- tools: toolsWithExecution,
216
- toolChoice: "auto", // Let the AI decide when to use tools
217
- maxSteps: options.maxSteps ?? DEFAULT_MAX_STEPS, // Enable multi-turn tool execution
218
- };
219
- // Add experimental_output if schema is provided
220
- if (analysisSchema) {
221
- generateOptions.experimental_output = Output.object({
222
- schema: analysisSchema,
223
- });
224
- }
225
- const result = await aiGenerate(generateOptions);
226
- mcpLogger.debug(`[${functionTag}] AI SDK generate completed`, {
227
- toolCalls: result.toolCalls?.length || 0,
228
- finishReason: result.finishReason,
229
- usage: result.usage,
230
- });
231
- return {
232
- content: result.text,
233
- provider: "function-calling",
234
- model: "unknown",
235
- usage: result.usage
236
- ? {
237
- inputTokens: result.usage.promptTokens,
238
- outputTokens: result.usage.completionTokens,
239
- totalTokens: result.usage.totalTokens,
240
- }
241
- : undefined,
242
- responseTime: 0,
243
- toolsUsed: result.toolCalls?.map((tc) => tc.toolName) || [],
244
- toolExecutions: [],
245
- enhancedWithTools: (result.toolCalls?.length || 0) > 0,
246
- availableTools: [],
247
- };
248
- }
249
- catch (error) {
250
- mcpLogger.error(`[${functionTag}] Failed to generate text with tools:`, error);
251
- throw error;
252
- }
253
- }
254
- /**
255
- * Generate text using AI SDK's native function calling (legacy array-based)
256
- */
257
- async generateWithTools(options, tools, toolMap, context, analysisSchema) {
258
- const functionTag = "FunctionCallingProvider.generateWithTools";
259
- try {
260
- // Convert our tools to AI SDK format with proper execution
261
- const toolsWithExecution = this.convertToAISDKTools(tools, toolMap, context);
262
- mcpLogger.debug(`[${functionTag}] Calling AI SDK generate with ${Object.keys(toolsWithExecution).length} tools and maxSteps: ${options.maxSteps ?? DEFAULT_MAX_STEPS}`);
263
- mcpLogger.debug(`[${functionTag}] Sanitized tool names:`, Object.keys(toolsWithExecution));
264
- // Log the first few tools to debug the issue
265
- const toolNames = Object.keys(toolsWithExecution);
266
- mcpLogger.debug(`[${functionTag}] First 5 tool names:`, toolNames.slice(0, 5));
267
- // Get the model from base provider (this requires accessing the private model property)
268
- // For now, we'll create the model directly based on the provider type
269
- // This is a temporary solution until we have proper model access
270
- const modelInfo = await this.getModelFromProvider();
271
- if (!modelInfo) {
272
- mcpLogger.warn(`[${functionTag}] Could not get model from provider, falling back to base provider`);
273
- const result = await this.baseProvider.generate(options, analysisSchema);
274
- if (!result) {
275
- return {
276
- content: "No response generated",
277
- provider: "function-calling",
278
- model: "unknown",
279
- };
280
- }
281
- return result;
282
- }
283
- // Use AI SDK's generate directly with tools
284
- const generateOptions = {
285
- model: modelInfo.model,
286
- prompt: options.prompt,
287
- system: options.systemPrompt || "You are a helpful AI assistant.",
288
- temperature: options.temperature || 0.7,
289
- maxTokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
290
- tools: toolsWithExecution,
291
- toolChoice: "auto", // Let the AI decide when to use tools
292
- maxSteps: options.maxSteps ?? DEFAULT_MAX_STEPS, // Enable multi-turn tool execution
293
- };
294
- // Add experimental_output if schema is provided
295
- if (analysisSchema) {
296
- generateOptions.experimental_output = Output.object({
297
- schema: analysisSchema,
298
- });
299
- }
300
- const result = await aiGenerate(generateOptions);
301
- mcpLogger.debug(`[${functionTag}] AI SDK generate completed`, {
302
- toolCalls: result.toolCalls?.length || 0,
303
- finishReason: result.finishReason,
304
- usage: result.usage,
305
- });
306
- return {
307
- content: result.text,
308
- provider: "function-calling",
309
- model: "unknown",
310
- usage: result.usage
311
- ? {
312
- inputTokens: result.usage.promptTokens,
313
- outputTokens: result.usage.completionTokens,
314
- totalTokens: result.usage.totalTokens,
315
- }
316
- : undefined,
317
- responseTime: 0,
318
- toolsUsed: result.toolCalls?.map((tc) => tc.toolName) || [],
319
- toolExecutions: [],
320
- enhancedWithTools: (result.toolCalls?.length || 0) > 0,
321
- availableTools: [],
322
- };
323
- }
324
- catch (error) {
325
- mcpLogger.error(`[${functionTag}] Failed to generate text with tools:`, error);
326
- throw error;
327
- }
328
- }
329
- /**
330
- * Get the model from the base provider
331
- * This is a temporary solution - ideally we'd have a getModel() method on AIProvider
332
- */
333
- async getModelFromProvider() {
334
- const functionTag = "FunctionCallingProvider.getModelFromProvider";
335
- try {
336
- // Try to access the model property if it exists
337
- const provider = this.baseProvider;
338
- // Check if provider has a model property
339
- if (provider.model) {
340
- mcpLogger.debug(`[${functionTag}] Found model property on provider`);
341
- return { model: provider.model };
342
- }
343
- // Check if provider has a getModel method
344
- if (typeof provider.getModel === "function") {
345
- mcpLogger.debug(`[${functionTag}] Found getModel method on provider`);
346
- const model = await provider.getModel();
347
- return { model: model };
348
- }
349
- mcpLogger.warn(`[${functionTag}] Could not find model on provider`);
350
- return null;
351
- }
352
- catch (error) {
353
- mcpLogger.error(`[${functionTag}] Error getting model from provider:`, error);
354
- return null;
355
- }
356
- }
357
- /**
358
- * Sanitize tool name to comply with AI provider requirements
359
- */
360
- sanitizeToolName(name) {
361
- // Replace any character that's not alphanumeric, underscore, dot, or dash
362
- // Also ensure it starts with a letter or underscore
363
- let sanitized = name.replace(/[^a-zA-Z0-9_.-]/g, "_");
364
- // If it doesn't start with a letter or underscore, prepend an underscore
365
- if (!/^[a-zA-Z_]/.test(sanitized)) {
366
- sanitized = "_" + sanitized;
367
- }
368
- // Ensure it's not longer than 64 characters
369
- if (sanitized.length > 64) {
370
- sanitized = sanitized.substring(0, 64);
371
- }
372
- return sanitized;
373
- }
374
- /**
375
- * Wrap tools with proper execution context (for object-based tools)
376
- */
377
- wrapToolsWithExecution(toolsObject, toolMap, context) {
378
- const functionTag = "FunctionCallingProvider.wrapToolsWithExecution";
379
- const wrappedTools = {};
380
- for (const [toolName, tool] of Object.entries(toolsObject)) {
381
- const toolInfo = toolMap.get(toolName);
382
- const originalToolName = toolInfo ? toolInfo.toolName : toolName;
383
- // Create a version with actual MCP execution
384
- wrappedTools[toolName] = {
385
- description: tool.description,
386
- parameters: tool.parameters,
387
- execute: async (args) => {
388
- // Debug logging only in debug mode
389
- if (process.env.NEUROLINK_DEBUG === "true") {
390
- const providerName = this.baseProvider.constructor.name;
391
- mcpLogger.debug(`Tool execution - Provider: ${providerName}`);
392
- mcpLogger.debug(`Tool: ${toolName} (original: ${originalToolName})`);
393
- mcpLogger.debug(`Args:`, args);
394
- }
395
- try {
396
- // Execute the actual MCP tool
397
- const result = await executeFunctionCall(toolName, args);
398
- if (process.env.NEUROLINK_DEBUG === "true") {
399
- mcpLogger.debug(`Tool result:`, result);
400
- }
401
- if (result.success) {
402
- return result.data || { success: true };
403
- }
404
- else {
405
- return { error: result.error || "Tool execution failed" };
406
- }
407
- }
408
- catch (error) {
409
- mcpLogger.error(`[${functionTag}] Tool execution error: ${toolName}`, error);
410
- return {
411
- error: error instanceof Error ? error.message : String(error),
412
- };
413
- }
414
- },
415
- };
416
- }
417
- return wrappedTools;
418
- }
419
- /**
420
- * Convert our tools to AI SDK format with proper execution (legacy array-based)
421
- */
422
- convertToAISDKTools(tools, toolMap, context) {
423
- const functionTag = "FunctionCallingProvider.convertToAISDKTools";
424
- const convertedTools = {};
425
- const sanitizedNameMap = new Map(); // Maps sanitized names back to original
426
- // Convert the toolMap to easily access by index
427
- const toolInfoArray = Array.from(toolMap.entries());
428
- tools.forEach((tool, index) => {
429
- // Use the actual tool name from the map for better debugging
430
- const [mapKey, toolInfo] = toolInfoArray[index] || [
431
- `tool_${index}`,
432
- null,
433
- ];
434
- // Use the already sanitized mapKey instead of re-sanitizing the raw toolName
435
- const sanitizedToolName = mapKey;
436
- const originalToolName = toolInfo ? toolInfo.toolName : `tool_${index}`;
437
- // Store the mapping for later reference
438
- sanitizedNameMap.set(sanitizedToolName, originalToolName);
439
- // Create a version with actual MCP execution
440
- convertedTools[sanitizedToolName] = {
441
- description: tool.description,
442
- parameters: tool.parameters,
443
- execute: async (args) => {
444
- // Debug logging only in debug mode
445
- if (process.env.NEUROLINK_DEBUG === "true") {
446
- const providerName = this.baseProvider.constructor.name;
447
- mcpLogger.debug(`Tool execution - Provider: ${providerName}`);
448
- mcpLogger.debug(`Tool: ${sanitizedToolName} (original: ${originalToolName})`);
449
- mcpLogger.debug("Args received:", args);
450
- }
451
- mcpLogger.debug(`[${functionTag}] Executing MCP tool: ${sanitizedToolName} (original: ${originalToolName}, ${toolInfo?.serverId}.${toolInfo?.toolName})`, args);
452
- try {
453
- if (toolInfo) {
454
- const mcpToolName = `${toolInfo.serverId}.${toolInfo.toolName}`;
455
- // Log execution details in debug mode only
456
- if (process.env.NEUROLINK_DEBUG === "true") {
457
- mcpLogger.debug("Calling executeFunctionCall with:", {
458
- mcpToolName,
459
- args,
460
- });
461
- }
462
- const result = await executeFunctionCall(mcpToolName, args, context);
463
- if (process.env.NEUROLINK_DEBUG === "true") {
464
- mcpLogger.debug("Tool execution result:", {
465
- success: result.success,
466
- hasData: !!result.data,
467
- error: result.error,
468
- });
469
- }
470
- mcpLogger.debug(`[${functionTag}] Tool execution result for ${sanitizedToolName}:`, {
471
- success: result.success,
472
- hasData: !!result.data,
473
- error: result.error,
474
- });
475
- if (result.success) {
476
- return (result.data || {
477
- success: true,
478
- message: "Tool executed successfully",
479
- });
480
- }
481
- else {
482
- return { error: result.error || "Tool execution failed" };
483
- }
484
- }
485
- // Fallback execution - Tool info not found
486
- mcpLogger.warn(`[${functionTag}] Tool info not found for ${sanitizedToolName}, using fallback`);
487
- return { success: false, error: "Tool mapping not found" };
488
- }
489
- catch (error) {
490
- if (process.env.NEUROLINK_DEBUG === "true") {
491
- mcpLogger.debug("Tool execution error:", error);
492
- }
493
- mcpLogger.error(`[${functionTag}] Tool execution failed for ${sanitizedToolName}:`, error);
494
- return {
495
- error: error instanceof Error ? error.message : String(error),
496
- };
497
- }
498
- },
499
- };
500
- });
501
- mcpLogger.debug(`[${functionTag}] Converted ${Object.keys(convertedTools).length} tools for AI SDK:`, Object.keys(convertedTools));
502
- // Log first tool details for debugging in debug mode only
503
- if (process.env.NEUROLINK_DEBUG === "true") {
504
- const firstToolName = Object.keys(convertedTools)[0];
505
- if (firstToolName) {
506
- mcpLogger.debug("First tool details:", {
507
- name: firstToolName,
508
- description: convertedTools[firstToolName].description,
509
- parameters: convertedTools[firstToolName].parameters,
510
- });
511
- }
512
- }
513
- return convertedTools;
514
- }
515
- /**
516
- * Create function-aware system prompt
517
- */
518
- createFunctionAwareSystemPrompt(originalPrompt, tools) {
519
- const basePrompt = originalPrompt || "You are a helpful AI assistant.";
520
- if (tools.length === 0) {
521
- return basePrompt;
522
- }
523
- const functionList = tools
524
- .map((tool, index) => `${index + 1}. ${tool.description || "No description available"}`)
525
- .join("\n");
526
- return `${basePrompt}
527
-
528
- IMPORTANT: You have access to ${tools.length} specialized functions that can provide real-time information and capabilities:
529
-
530
- ${functionList}
531
-
532
- CRITICAL INSTRUCTIONS:
533
- - When asked about the current time, date, or timezone, you MUST use the time/date functions
534
- - When asked to list files or access the filesystem, you MUST use the filesystem functions
535
- - When asked about system information, you MUST use the appropriate system functions
536
- - DO NOT say "I cannot access" or "I don't have access" - you DO have access through these functions
537
- - Always use available functions instead of providing placeholder or estimated information
538
-
539
- These functions provide accurate, real-time data. Use them actively to enhance your responses.`;
540
- }
541
- /**
542
- * Alias for generate() - CLI-SDK consistency
543
- */
544
- /**
545
- * Clear cached tools - Cache Invalidation Strategy
546
- *
547
- * WHEN TO CALL clearToolsCache():
548
- *
549
- * 1. **MCP Server Changes**: When MCP servers are added, removed, or restarted
550
- * - After calling unifiedRegistry.addServer() or removeServer()
551
- * - When MCP server configurations change
552
- * - After MCP server restart or reconnection
553
- *
554
- * 2. **Tool Registration Changes**: When custom tools are modified
555
- * - After registering new SDK tools via registerTool()
556
- * - When tool implementations change
557
- * - After unregistering tools
558
- *
559
- * 3. **Provider Reinitialization**: When the provider context changes
560
- * - Before switching between different AI providers
561
- * - When session context changes significantly
562
- * - After provider authentication refresh
563
- *
564
- * 4. **Error Recovery**: When tool execution encounters systematic failures
565
- * - After MCP connection errors are resolved
566
- * - When tool discovery needs to be re-run
567
- * - During error recovery workflows
568
- *
569
- * 5. **Development/Testing**: During development and testing cycles
570
- * - Between test cases that modify tool availability
571
- * - When testing different tool configurations
572
- * - During hot reloading scenarios
573
- *
574
- * CACHE LIFECYCLE:
575
- * - Cache is populated on first generate() call via getAvailableFunctionTools()
576
- * - Cache persists across multiple generate() calls for performance
577
- * - Cache is invalidated by calling this method
578
- * - Next generate() call will rebuild cache from current tool state
579
- *
580
- * PERFORMANCE IMPACT:
581
- * - Clearing cache forces tool discovery on next usage (~100-500ms overhead)
582
- * - Recommended to clear cache proactively rather than reactively
583
- * - Consider batching tool changes before clearing cache
584
- *
585
- * THREAD SAFETY:
586
- * - This method is not thread-safe
587
- * - Avoid calling during active generate() operations
588
- * - Safe to call between separate AI generation requests
589
- */
590
- clearToolsCache() {
591
- this.cachedToolsObject = null;
592
- this.cachedToolMap = null;
593
- this.cacheTimestamp = null;
594
- }
595
- /**
596
- * Short alias for generate() - CLI-SDK consistency
597
- */
598
- async gen(optionsOrPrompt, analysisSchema) {
599
- return this.generate(optionsOrPrompt, analysisSchema);
600
- }
601
- }
602
- /**
603
- * Create a function-calling enhanced version of any AI provider
604
- */
605
- export function createFunctionCallingProvider(baseProvider, options) {
606
- return new FunctionCallingProvider(baseProvider, options);
607
- }
608
- /**
609
- * Enhanced MCP Provider Factory that creates function-calling enabled providers
610
- */
611
- export function createMCPAwareProviderV3(baseProvider, options = {}) {
612
- const functionTag = "createMCPAwareProviderV3";
613
- // If MCP is disabled, return base provider
614
- if (options.enableMCP === false) {
615
- mcpLogger.debug(`[${functionTag}] MCP disabled, returning base provider`);
616
- return baseProvider;
617
- }
618
- // Create function-calling enhanced provider
619
- const enhancedProvider = createFunctionCallingProvider(baseProvider, {
620
- enableFunctionCalling: options.enableFunctionCalling,
621
- sessionId: options.sessionId,
622
- userId: options.userId,
623
- cacheExpiryMs: options.cacheExpiryMs,
624
- });
625
- mcpLogger.debug(`[${functionTag}] Created MCP-aware provider with function calling`, {
626
- providerName: options.providerName,
627
- enableFunctionCalling: options.enableFunctionCalling !== false,
628
- });
629
- return enhancedProvider;
630
- }