@juspay/neurolink 6.1.0 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/CHANGELOG.md +16 -6
  2. package/dist/agent/direct-tools.js +6 -5
  3. package/dist/cli/commands/config.d.ts +13 -13
  4. package/dist/cli/index.js +3 -9
  5. package/dist/config/configManager.js +11 -10
  6. package/dist/core/analytics.d.ts +11 -1
  7. package/dist/core/analytics.js +2 -2
  8. package/dist/core/base-provider.js +4 -18
  9. package/dist/core/dynamic-models.d.ts +8 -8
  10. package/dist/core/factory.js +3 -11
  11. package/dist/index.d.ts +2 -4
  12. package/dist/index.js +2 -11
  13. package/dist/lib/agent/direct-tools.js +6 -5
  14. package/dist/lib/config/configManager.js +11 -10
  15. package/dist/lib/core/analytics.d.ts +11 -1
  16. package/dist/lib/core/analytics.js +2 -2
  17. package/dist/lib/core/base-provider.js +4 -18
  18. package/dist/lib/core/dynamic-models.d.ts +8 -8
  19. package/dist/lib/core/factory.js +3 -11
  20. package/dist/lib/index.d.ts +2 -4
  21. package/dist/lib/index.js +2 -11
  22. package/dist/lib/mcp/factory.d.ts +1 -1
  23. package/dist/lib/mcp/index.d.ts +9 -21
  24. package/dist/lib/mcp/index.js +16 -57
  25. package/dist/lib/mcp/registry.js +1 -1
  26. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
  27. package/dist/lib/mcp/tool-registry.js +1 -1
  28. package/dist/lib/neurolink.d.ts +1 -9
  29. package/dist/lib/neurolink.js +22 -71
  30. package/dist/lib/providers/amazon-bedrock.js +5 -16
  31. package/dist/lib/providers/anthropic-baseprovider.js +3 -21
  32. package/dist/lib/providers/anthropic.js +4 -7
  33. package/dist/lib/providers/azure-openai.js +6 -3
  34. package/dist/lib/providers/google-vertex.js +5 -9
  35. package/dist/lib/providers/huggingFace.js +5 -10
  36. package/dist/lib/providers/mistral.js +5 -8
  37. package/dist/lib/providers/openAI.js +4 -7
  38. package/dist/lib/telemetry/index.js +2 -1
  39. package/dist/lib/utils/logger.d.ts +62 -2
  40. package/dist/lib/utils/logger.js +174 -9
  41. package/dist/lib/utils/providerConfig.d.ts +117 -0
  42. package/dist/lib/utils/providerConfig.js +353 -0
  43. package/dist/lib/utils/providerUtils.d.ts +2 -1
  44. package/dist/lib/utils/providerUtils.js +53 -36
  45. package/dist/lib/utils/timeout.d.ts +72 -1
  46. package/dist/lib/utils/timeout.js +203 -2
  47. package/dist/mcp/factory.d.ts +1 -1
  48. package/dist/mcp/index.d.ts +9 -21
  49. package/dist/mcp/index.js +16 -57
  50. package/dist/mcp/registry.js +1 -1
  51. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
  52. package/dist/mcp/tool-registry.js +1 -1
  53. package/dist/neurolink.d.ts +1 -9
  54. package/dist/neurolink.js +22 -71
  55. package/dist/providers/amazon-bedrock.js +5 -16
  56. package/dist/providers/anthropic-baseprovider.js +3 -21
  57. package/dist/providers/anthropic.js +4 -7
  58. package/dist/providers/azure-openai.js +6 -3
  59. package/dist/providers/google-vertex.js +5 -9
  60. package/dist/providers/huggingFace.js +5 -10
  61. package/dist/providers/mistral.js +5 -8
  62. package/dist/providers/openAI.js +4 -7
  63. package/dist/telemetry/index.js +2 -1
  64. package/dist/utils/logger.d.ts +62 -2
  65. package/dist/utils/logger.js +174 -9
  66. package/dist/utils/providerConfig.d.ts +117 -0
  67. package/dist/utils/providerConfig.js +353 -0
  68. package/dist/utils/providerUtils.d.ts +2 -1
  69. package/dist/utils/providerUtils.js +53 -36
  70. package/dist/utils/timeout.d.ts +72 -1
  71. package/dist/utils/timeout.js +203 -2
  72. package/package.json +1 -1
  73. package/dist/chat/client-utils.d.ts +0 -95
  74. package/dist/chat/client-utils.js +0 -315
  75. package/dist/chat/index.d.ts +0 -24
  76. package/dist/chat/index.js +0 -33
  77. package/dist/chat/session-storage.d.ts +0 -77
  78. package/dist/chat/session-storage.js +0 -233
  79. package/dist/chat/session.d.ts +0 -96
  80. package/dist/chat/session.js +0 -257
  81. package/dist/chat/sse-handler.d.ts +0 -49
  82. package/dist/chat/sse-handler.js +0 -259
  83. package/dist/chat/types.d.ts +0 -74
  84. package/dist/chat/types.js +0 -5
  85. package/dist/chat/websocket-chat-handler.d.ts +0 -37
  86. package/dist/chat/websocket-chat-handler.js +0 -262
  87. package/dist/cli/commands/mcp.d.ts +0 -20
  88. package/dist/cli/commands/mcp.js +0 -1272
  89. package/dist/core/defaults.d.ts +0 -19
  90. package/dist/core/defaults.js +0 -29
  91. package/dist/core/evaluation-config.d.ts +0 -29
  92. package/dist/core/evaluation-config.js +0 -144
  93. package/dist/factories/compatibility-factory.d.ts +0 -35
  94. package/dist/factories/compatibility-factory.js +0 -71
  95. package/dist/factories/provider-generate-factory.d.ts +0 -20
  96. package/dist/factories/provider-generate-factory.js +0 -93
  97. package/dist/lib/chat/client-utils.d.ts +0 -95
  98. package/dist/lib/chat/client-utils.js +0 -315
  99. package/dist/lib/chat/index.d.ts +0 -24
  100. package/dist/lib/chat/index.js +0 -33
  101. package/dist/lib/chat/session-storage.d.ts +0 -77
  102. package/dist/lib/chat/session-storage.js +0 -233
  103. package/dist/lib/chat/session.d.ts +0 -96
  104. package/dist/lib/chat/session.js +0 -257
  105. package/dist/lib/chat/sse-handler.d.ts +0 -49
  106. package/dist/lib/chat/sse-handler.js +0 -259
  107. package/dist/lib/chat/types.d.ts +0 -74
  108. package/dist/lib/chat/types.js +0 -5
  109. package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
  110. package/dist/lib/chat/websocket-chat-handler.js +0 -262
  111. package/dist/lib/core/defaults.d.ts +0 -19
  112. package/dist/lib/core/defaults.js +0 -29
  113. package/dist/lib/core/evaluation-config.d.ts +0 -29
  114. package/dist/lib/core/evaluation-config.js +0 -144
  115. package/dist/lib/factories/compatibility-factory.d.ts +0 -35
  116. package/dist/lib/factories/compatibility-factory.js +0 -71
  117. package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
  118. package/dist/lib/factories/provider-generate-factory.js +0 -93
  119. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
  120. package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
  121. package/dist/lib/mcp/auto-discovery.d.ts +0 -62
  122. package/dist/lib/mcp/auto-discovery.js +0 -149
  123. package/dist/lib/mcp/client.d.ts +0 -68
  124. package/dist/lib/mcp/client.js +0 -248
  125. package/dist/lib/mcp/config.d.ts +0 -31
  126. package/dist/lib/mcp/config.js +0 -99
  127. package/dist/lib/mcp/context-manager.d.ts +0 -171
  128. package/dist/lib/mcp/context-manager.js +0 -362
  129. package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
  130. package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
  131. package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
  132. package/dist/lib/mcp/core/plugin-manager.js +0 -110
  133. package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
  134. package/dist/lib/mcp/demo/plugin-demo.js +0 -118
  135. package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
  136. package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
  137. package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
  138. package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
  139. package/dist/lib/mcp/ecosystem.d.ts +0 -75
  140. package/dist/lib/mcp/ecosystem.js +0 -161
  141. package/dist/lib/mcp/error-manager.d.ts +0 -254
  142. package/dist/lib/mcp/error-manager.js +0 -501
  143. package/dist/lib/mcp/error-recovery.d.ts +0 -159
  144. package/dist/lib/mcp/error-recovery.js +0 -405
  145. package/dist/lib/mcp/external-client.d.ts +0 -88
  146. package/dist/lib/mcp/external-client.js +0 -331
  147. package/dist/lib/mcp/external-manager.d.ts +0 -112
  148. package/dist/lib/mcp/external-manager.js +0 -308
  149. package/dist/lib/mcp/function-calling.d.ts +0 -65
  150. package/dist/lib/mcp/function-calling.js +0 -642
  151. package/dist/lib/mcp/health-monitor.d.ts +0 -257
  152. package/dist/lib/mcp/health-monitor.js +0 -630
  153. package/dist/lib/mcp/initialize-tools.d.ts +0 -29
  154. package/dist/lib/mcp/initialize-tools.js +0 -261
  155. package/dist/lib/mcp/initialize.d.ts +0 -18
  156. package/dist/lib/mcp/initialize.js +0 -62
  157. package/dist/lib/mcp/logging.d.ts +0 -38
  158. package/dist/lib/mcp/logging.js +0 -100
  159. package/dist/lib/mcp/manager.d.ts +0 -68
  160. package/dist/lib/mcp/manager.js +0 -176
  161. package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
  162. package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
  163. package/dist/lib/mcp/orchestrator.d.ts +0 -302
  164. package/dist/lib/mcp/orchestrator.js +0 -703
  165. package/dist/lib/mcp/plugin-manager.d.ts +0 -98
  166. package/dist/lib/mcp/plugin-manager.js +0 -296
  167. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  168. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
  169. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
  170. package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
  171. package/dist/lib/mcp/security-manager.d.ts +0 -87
  172. package/dist/lib/mcp/security-manager.js +0 -344
  173. package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
  174. package/dist/lib/mcp/semaphore-manager.js +0 -329
  175. package/dist/lib/mcp/session-manager.d.ts +0 -187
  176. package/dist/lib/mcp/session-manager.js +0 -400
  177. package/dist/lib/mcp/session-persistence.d.ts +0 -93
  178. package/dist/lib/mcp/session-persistence.js +0 -301
  179. package/dist/lib/mcp/tool-integration.d.ts +0 -58
  180. package/dist/lib/mcp/tool-integration.js +0 -203
  181. package/dist/lib/mcp/transport-manager.d.ts +0 -154
  182. package/dist/lib/mcp/transport-manager.js +0 -334
  183. package/dist/lib/mcp/unified-mcp.d.ts +0 -133
  184. package/dist/lib/mcp/unified-mcp.js +0 -251
  185. package/dist/lib/mcp/unified-registry.d.ts +0 -165
  186. package/dist/lib/mcp/unified-registry.js +0 -538
  187. package/dist/lib/providers/analytics-helper.d.ts +0 -38
  188. package/dist/lib/providers/analytics-helper.js +0 -216
  189. package/dist/lib/providers/function-calling-provider.d.ts +0 -142
  190. package/dist/lib/providers/function-calling-provider.js +0 -630
  191. package/dist/lib/providers/mcp-provider.d.ts +0 -75
  192. package/dist/lib/providers/mcp-provider.js +0 -283
  193. package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
  194. package/dist/lib/providers/timeout-wrapper.js +0 -100
  195. package/dist/lib/sdk/tool-extension.d.ts +0 -181
  196. package/dist/lib/sdk/tool-extension.js +0 -284
  197. package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
  198. package/dist/lib/services/streaming/streaming-manager.js +0 -245
  199. package/dist/lib/services/types.d.ts +0 -156
  200. package/dist/lib/services/types.js +0 -2
  201. package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
  202. package/dist/lib/services/websocket/websocket-server.js +0 -305
  203. package/dist/lib/utils/provider-validation.d.ts +0 -36
  204. package/dist/lib/utils/provider-validation.js +0 -625
  205. package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
  206. package/dist/lib/utils/providerUtils-fixed.js +0 -94
  207. package/dist/lib/utils/streaming-utils.d.ts +0 -79
  208. package/dist/lib/utils/streaming-utils.js +0 -198
  209. package/dist/lib/utils/timeout-manager.d.ts +0 -75
  210. package/dist/lib/utils/timeout-manager.js +0 -244
  211. package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
  212. package/dist/mcp/adapters/plugin-bridge.js +0 -89
  213. package/dist/mcp/auto-discovery.d.ts +0 -62
  214. package/dist/mcp/auto-discovery.js +0 -149
  215. package/dist/mcp/client.d.ts +0 -68
  216. package/dist/mcp/client.js +0 -248
  217. package/dist/mcp/config.d.ts +0 -31
  218. package/dist/mcp/config.js +0 -99
  219. package/dist/mcp/context-manager.d.ts +0 -171
  220. package/dist/mcp/context-manager.js +0 -362
  221. package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
  222. package/dist/mcp/contracts/mcp-contract.js +0 -58
  223. package/dist/mcp/core/plugin-manager.d.ts +0 -46
  224. package/dist/mcp/core/plugin-manager.js +0 -110
  225. package/dist/mcp/demo/plugin-demo.d.ts +0 -20
  226. package/dist/mcp/demo/plugin-demo.js +0 -118
  227. package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
  228. package/dist/mcp/dynamic-chain-executor.js +0 -489
  229. package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
  230. package/dist/mcp/dynamic-orchestrator.js +0 -351
  231. package/dist/mcp/ecosystem.d.ts +0 -75
  232. package/dist/mcp/ecosystem.js +0 -162
  233. package/dist/mcp/error-manager.d.ts +0 -254
  234. package/dist/mcp/error-manager.js +0 -501
  235. package/dist/mcp/error-recovery.d.ts +0 -159
  236. package/dist/mcp/error-recovery.js +0 -405
  237. package/dist/mcp/external-client.d.ts +0 -88
  238. package/dist/mcp/external-client.js +0 -331
  239. package/dist/mcp/external-manager.d.ts +0 -112
  240. package/dist/mcp/external-manager.js +0 -308
  241. package/dist/mcp/function-calling.d.ts +0 -65
  242. package/dist/mcp/function-calling.js +0 -642
  243. package/dist/mcp/health-monitor.d.ts +0 -257
  244. package/dist/mcp/health-monitor.js +0 -630
  245. package/dist/mcp/initialize-tools.d.ts +0 -29
  246. package/dist/mcp/initialize-tools.js +0 -262
  247. package/dist/mcp/initialize.d.ts +0 -18
  248. package/dist/mcp/initialize.js +0 -62
  249. package/dist/mcp/logging.d.ts +0 -38
  250. package/dist/mcp/logging.js +0 -100
  251. package/dist/mcp/manager.d.ts +0 -68
  252. package/dist/mcp/manager.js +0 -176
  253. package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
  254. package/dist/mcp/neurolink-mcp-client.js +0 -462
  255. package/dist/mcp/orchestrator.d.ts +0 -302
  256. package/dist/mcp/orchestrator.js +0 -703
  257. package/dist/mcp/plugin-manager.d.ts +0 -98
  258. package/dist/mcp/plugin-manager.js +0 -297
  259. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  260. package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
  261. package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
  262. package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
  263. package/dist/mcp/plugins/filesystem-mcp.js +0 -54
  264. package/dist/mcp/security-manager.d.ts +0 -87
  265. package/dist/mcp/security-manager.js +0 -344
  266. package/dist/mcp/semaphore-manager.d.ts +0 -137
  267. package/dist/mcp/semaphore-manager.js +0 -329
  268. package/dist/mcp/session-manager.d.ts +0 -187
  269. package/dist/mcp/session-manager.js +0 -400
  270. package/dist/mcp/session-persistence.d.ts +0 -93
  271. package/dist/mcp/session-persistence.js +0 -302
  272. package/dist/mcp/tool-integration.d.ts +0 -58
  273. package/dist/mcp/tool-integration.js +0 -203
  274. package/dist/mcp/transport-manager.d.ts +0 -154
  275. package/dist/mcp/transport-manager.js +0 -335
  276. package/dist/mcp/unified-mcp.d.ts +0 -133
  277. package/dist/mcp/unified-mcp.js +0 -251
  278. package/dist/mcp/unified-registry.d.ts +0 -165
  279. package/dist/mcp/unified-registry.js +0 -539
  280. package/dist/providers/analytics-helper.d.ts +0 -38
  281. package/dist/providers/analytics-helper.js +0 -216
  282. package/dist/providers/function-calling-provider.d.ts +0 -142
  283. package/dist/providers/function-calling-provider.js +0 -630
  284. package/dist/providers/mcp-provider.d.ts +0 -75
  285. package/dist/providers/mcp-provider.js +0 -283
  286. package/dist/providers/timeout-wrapper.d.ts +0 -40
  287. package/dist/providers/timeout-wrapper.js +0 -100
  288. package/dist/sdk/tool-extension.d.ts +0 -181
  289. package/dist/sdk/tool-extension.js +0 -284
  290. package/dist/services/streaming/streaming-manager.d.ts +0 -29
  291. package/dist/services/streaming/streaming-manager.js +0 -245
  292. package/dist/services/types.d.ts +0 -156
  293. package/dist/services/types.js +0 -2
  294. package/dist/services/websocket/websocket-server.d.ts +0 -34
  295. package/dist/services/websocket/websocket-server.js +0 -306
  296. package/dist/utils/provider-validation.d.ts +0 -36
  297. package/dist/utils/provider-validation.js +0 -625
  298. package/dist/utils/providerUtils-fixed.d.ts +0 -8
  299. package/dist/utils/providerUtils-fixed.js +0 -94
  300. package/dist/utils/streaming-utils.d.ts +0 -79
  301. package/dist/utils/streaming-utils.js +0 -198
  302. package/dist/utils/timeout-manager.d.ts +0 -75
  303. package/dist/utils/timeout-manager.js +0 -244
package/dist/neurolink.js CHANGED
@@ -14,18 +14,15 @@ catch (error) {
14
14
  // Environment variables should be set externally in production
15
15
  }
16
16
  import { AIProviderFactory } from "./core/factory.js";
17
- import { ContextManager } from "./mcp/context-manager.js";
18
- import { mcpLogger } from "./mcp/logging.js";
17
+ import { mcpLogger } from "./utils/logger.js";
19
18
  import { toolRegistry } from "./mcp/tool-registry.js";
20
- import { unifiedRegistry } from "./mcp/unified-registry.js";
21
19
  import { logger } from "./utils/logger.js";
22
- import { getBestProvider } from "./utils/providerUtils-fixed.js";
20
+ import { getBestProvider } from "./utils/providerUtils.js";
23
21
  import { ProviderRegistry } from "./factories/provider-registry.js";
24
22
  import { validateTool, createMCPServerFromTools, } from "./sdk/tool-registration.js";
25
23
  // Core types imported from core/types.js
26
24
  export class NeuroLink {
27
25
  mcpInitialized = false;
28
- contextManager;
29
26
  // Tool registration support
30
27
  customTools = new Map();
31
28
  inMemoryServers = new Map();
@@ -34,7 +31,6 @@ export class NeuroLink {
34
31
  ProviderRegistry.setOptions({
35
32
  enableManualMCP: false,
36
33
  });
37
- this.contextManager = new ContextManager();
38
34
  }
39
35
  /**
40
36
  * Initialize MCP registry with enhanced error handling and resource cleanup
@@ -223,12 +219,7 @@ export class NeuroLink {
223
219
  if (!this.mcpInitialized) {
224
220
  return null; // Skip MCP if not available
225
221
  }
226
- // Create execution context
227
- const context = this.contextManager.createContext({
228
- sessionId: `neurolink-${Date.now()}`,
229
- userId: "neurolink-user",
230
- aiProvider: options.provider || "auto",
231
- });
222
+ // Context creation removed - was never used
232
223
  // Determine provider
233
224
  const providerName = options.provider === "auto" || !options.provider
234
225
  ? await getBestProvider()
@@ -402,12 +393,7 @@ export class NeuroLink {
402
393
  }
403
394
  // Initialize MCP if needed
404
395
  await this.initializeMCP();
405
- // Create execution context for tool operations
406
- const context = this.contextManager.createContext({
407
- sessionId: `neurolink-stream-${Date.now()}`,
408
- userId: "neurolink-user",
409
- aiProvider: options.provider || "auto",
410
- });
396
+ // Context creation removed - was never used
411
397
  // Determine provider to use
412
398
  const providerName = options.provider === "auto" || !options.provider
413
399
  ? await getBestProvider()
@@ -416,7 +402,6 @@ export class NeuroLink {
416
402
  mcpLogger.debug(`[${functionTag}] Starting MCP-enabled streaming`, {
417
403
  provider: providerName,
418
404
  prompt: (options.input.text?.substring(0, 100) || "No text") + "...",
419
- contextId: context.sessionId,
420
405
  });
421
406
  // Create provider using the same factory pattern as generate
422
407
  const provider = await AIProviderFactory.createBestProvider(providerName, options.model, true, this);
@@ -632,19 +617,14 @@ export class NeuroLink {
632
617
  }
633
618
  // If not found in custom tools or in-memory servers, try unified registry
634
619
  try {
635
- // Ensure built-in tools are initialized
636
- const { initializeNeuroLinkMCP, isNeuroLinkMCPInitialized } = await import("./mcp/initialize.js");
637
- if (!isNeuroLinkMCPInitialized()) {
638
- mcpLogger.debug(`[${functionTag}] Initializing built-in MCP servers`);
639
- await initializeNeuroLinkMCP();
640
- }
620
+ // Built-in tools initialization simplified
621
+ mcpLogger.debug(`[${functionTag}] MCP initialization simplified`);
641
622
  // Create minimal execution context for external tools
642
- const context = this.contextManager.createContext({
623
+ const context = {
643
624
  sessionId: `neurolink-tool-${Date.now()}`,
644
625
  userId: "neurolink-user",
645
- aiProvider: "auto",
646
- });
647
- const result = (await unifiedRegistry.executeTool(toolName, params, context));
626
+ };
627
+ const result = (await toolRegistry.executeTool(toolName, params, context));
648
628
  return result;
649
629
  }
650
630
  catch (error) {
@@ -669,8 +649,9 @@ export class NeuroLink {
669
649
  * @returns Array of available tools with metadata
670
650
  */
671
651
  async getAllAvailableTools() {
672
- const { getAllAvailableTools } = await import("./mcp/initialize-tools.js");
673
- return getAllAvailableTools(this.inMemoryServers);
652
+ // Simplified tool listing - removed initialize-tools dependency
653
+ const tools = await toolRegistry.listTools();
654
+ return tools;
674
655
  }
675
656
  // ============================================================================
676
657
  // PROVIDER DIAGNOSTICS - SDK-First Architecture
@@ -857,25 +838,16 @@ export class NeuroLink {
857
838
  * @returns Promise resolving to MCP status details
858
839
  */
859
840
  async getMCPStatus() {
860
- const { unifiedRegistry } = await import("./mcp/unified-registry.js");
861
841
  try {
862
- const totalServers = unifiedRegistry.getTotalServerCount();
863
- const availableServers = unifiedRegistry.getAvailableServerCount();
864
- const autoDiscoveredServers = unifiedRegistry.getAutoDiscoveredServers();
865
- const allTools = await unifiedRegistry.listAllTools();
842
+ // Simplified MCP status - unified registry removed
843
+ const allTools = await toolRegistry.listTools();
866
844
  return {
867
845
  mcpInitialized: this.mcpInitialized,
868
- totalServers,
869
- availableServers,
870
- autoDiscoveredCount: autoDiscoveredServers.length,
846
+ totalServers: 1, // Only tool registry now
847
+ availableServers: 1,
848
+ autoDiscoveredCount: 0, // No auto-discovery
871
849
  totalTools: allTools.length,
872
- autoDiscoveredServers: autoDiscoveredServers.map((server) => ({
873
- id: server.metadata.name,
874
- name: server.metadata.name,
875
- source: server.source,
876
- status: "discovered",
877
- hasServer: true,
878
- })),
850
+ autoDiscoveredServers: [], // No auto-discovery
879
851
  customToolsCount: this.customTools.size,
880
852
  inMemoryServersCount: this.inMemoryServers.size,
881
853
  };
@@ -899,24 +871,8 @@ export class NeuroLink {
899
871
  * @returns Promise resolving to array of MCP server information
900
872
  */
901
873
  async listMCPServers() {
902
- const { unifiedRegistry } = await import("./mcp/unified-registry.js");
903
- try {
904
- const servers = unifiedRegistry.getAutoDiscoveredServers();
905
- return servers.map((server) => ({
906
- id: server.metadata.name,
907
- name: server.metadata.name,
908
- source: server.source,
909
- status: unifiedRegistry.isConnected(server.metadata.name)
910
- ? "connected"
911
- : "discovered",
912
- hasServer: true,
913
- metadata: server.metadata,
914
- }));
915
- }
916
- catch (error) {
917
- logger.warn("Failed to list MCP servers", { error });
918
- return [];
919
- }
874
+ // Simplified MCP servers listing - unified registry removed
875
+ return [];
920
876
  }
921
877
  /**
922
878
  * Test connectivity to a specific MCP server
@@ -924,13 +880,8 @@ export class NeuroLink {
924
880
  * @returns Promise resolving to true if server is reachable
925
881
  */
926
882
  async testMCPServer(serverId) {
927
- const { unifiedRegistry } = await import("./mcp/unified-registry.js");
928
- try {
929
- return unifiedRegistry.isConnected(serverId);
930
- }
931
- catch {
932
- return false;
933
- }
883
+ // Simplified MCP server testing - unified registry removed
884
+ return false; // No auto-discovery servers available
934
885
  }
935
886
  }
936
887
  // Create default instance
@@ -4,32 +4,21 @@ import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
7
+ import { validateApiKey, createAWSAccessKeyConfig, createAWSSecretConfig, getAWSRegion, getAWSSessionToken, } from "../utils/providerConfig.js";
7
8
  // Configuration helpers
8
9
  const getBedrockModelId = () => {
9
10
  return (process.env.BEDROCK_MODEL ||
10
11
  process.env.BEDROCK_MODEL_ID ||
11
12
  "arn:aws:bedrock:us-east-2:225681119357:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0");
12
13
  };
14
+ // Configuration helpers - now using consolidated utility
13
15
  const getAWSAccessKeyId = () => {
14
- const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
15
- if (!accessKeyId) {
16
- throw new Error(`āŒ AWS Bedrock Provider Configuration Error\n\nMissing required environment variables: AWS_ACCESS_KEY_ID\n\nšŸ”§ Step 1: Get AWS Credentials\n1. Visit: https://console.aws.amazon.com/iam/\n2. Create IAM user with Bedrock permissions\n3. Generate access key\n\nšŸ”§ Step 2: Set Environment Variables\nAdd to your .env file:\nAWS_ACCESS_KEY_ID=your_access_key_here\nAWS_SECRET_ACCESS_KEY=your_secret_key_here\nAWS_REGION=us-east-1\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
17
- }
18
- return accessKeyId;
16
+ return validateApiKey(createAWSAccessKeyConfig());
19
17
  };
20
18
  const getAWSSecretAccessKey = () => {
21
- const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
22
- if (!secretAccessKey) {
23
- throw new Error(`āŒ AWS Bedrock Provider Configuration Error\n\nMissing required environment variables: AWS_SECRET_ACCESS_KEY\n\nšŸ”§ Step 1: Get AWS Credentials\n1. Visit: https://console.aws.amazon.com/iam/\n2. Create IAM user with Bedrock permissions\n3. Generate access key\n\nšŸ”§ Step 2: Set Environment Variables\nAdd to your .env file:\nAWS_ACCESS_KEY_ID=your_access_key_here\nAWS_SECRET_ACCESS_KEY=your_secret_key_here\nAWS_REGION=us-east-1\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
24
- }
25
- return secretAccessKey;
26
- };
27
- const getAWSRegion = () => {
28
- return process.env.AWS_REGION || "us-east-1";
29
- };
30
- const getAWSSessionToken = () => {
31
- return process.env.AWS_SESSION_TOKEN;
19
+ return validateApiKey(createAWSSecretConfig());
32
20
  };
21
+ // Note: getAWSRegion and getAWSSessionToken are now directly imported from consolidated utility
33
22
  const getAppEnvironment = () => {
34
23
  return process.env.PUBLIC_APP_ENVIRONMENT || "production";
35
24
  };
@@ -4,6 +4,7 @@ import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
7
+ import { validateApiKey, createAnthropicBaseConfig, } from "../utils/providerConfig.js";
7
8
  /**
8
9
  * Anthropic provider implementation using BaseProvider pattern
9
10
  * Migrated from direct API calls to Vercel AI SDK (@ai-sdk/anthropic)
@@ -50,28 +51,9 @@ export class AnthropicProviderV2 extends BaseProvider {
50
51
  }
51
52
  return new Error(`Anthropic error: ${errorWithStatus?.message || String(error) || "Unknown error"}`);
52
53
  }
54
+ // Configuration helper - now using consolidated utility
53
55
  getApiKey() {
54
- const apiKey = process.env.ANTHROPIC_API_KEY;
55
- if (!apiKey) {
56
- throw new Error(`āŒ ANTHROPIC Provider Configuration Error
57
-
58
- Missing required environment variables: ANTHROPIC_API_KEY
59
-
60
- šŸ”§ Step 1: Get Credentials
61
- Get your API key from https://console.anthropic.com/
62
-
63
- šŸ’” Step 2: Add to your .env file (or export in CLI):
64
- ANTHROPIC_API_KEY="sk-ant-your-anthropic-api-key"
65
- # Optional:
66
- ANTHROPIC_MODEL="claude-3-5-sonnet-20241022"
67
- ANTHROPIC_BASE_URL="https://api.anthropic.com"
68
-
69
- šŸš€ Step 3: Test the setup:
70
- npx neurolink generate "Hello" --provider anthropic
71
-
72
- šŸ“– More info: https://docs.neurolink.dev/providers/anthropic`);
73
- }
74
- return apiKey;
56
+ return validateApiKey(createAnthropicBaseConfig());
75
57
  }
76
58
  // executeGenerate removed - BaseProvider handles all generation with tools
77
59
  async executeStream(options, analysisSchema) {
@@ -4,16 +4,13 @@ import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
7
- // Configuration helpers
7
+ import { validateApiKey, createAnthropicConfig, getProviderModel, } from "../utils/providerConfig.js";
8
+ // Configuration helpers - now using consolidated utility
8
9
  const getAnthropicApiKey = () => {
9
- const apiKey = process.env.ANTHROPIC_API_KEY;
10
- if (!apiKey) {
11
- throw new Error(`āŒ Anthropic Provider Configuration Error\n\nMissing required environment variable: ANTHROPIC_API_KEY\n\nšŸ”§ Step 1: Get Anthropic API Key\n1. Visit: https://console.anthropic.com/\n2. Sign in or create an account\n3. Go to API Keys section\n4. Create a new API key\n\nšŸ”§ Step 2: Set Environment Variable\nAdd to your .env file:\nANTHROPIC_API_KEY=your_api_key_here\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
12
- }
13
- return apiKey;
10
+ return validateApiKey(createAnthropicConfig());
14
11
  };
15
12
  const getDefaultAnthropicModel = () => {
16
- return process.env.ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022";
13
+ return getProviderModel("ANTHROPIC_MODEL", "claude-3-5-sonnet-20241022");
17
14
  };
18
15
  /**
19
16
  * Anthropic Provider v2 - BaseProvider Implementation
@@ -1,6 +1,8 @@
1
1
  import { createAzure } from "@ai-sdk/azure";
2
2
  import { streamText } from "ai";
3
3
  import { BaseProvider } from "../core/base-provider.js";
4
+ import { validateApiKey, createAzureAPIKeyConfig, createAzureEndpointConfig, } from "../utils/providerConfig.js";
5
+ import { logger } from "../utils/logger.js";
4
6
  export class AzureOpenAIProvider extends BaseProvider {
5
7
  apiKey;
6
8
  resourceName;
@@ -21,11 +23,12 @@ export class AzureOpenAIProvider extends BaseProvider {
21
23
  process.env.AZURE_OPENAI_DEPLOYMENT_ID ||
22
24
  "gpt-4o";
23
25
  this.apiVersion = process.env.AZURE_API_VERSION || "2024-10-01-preview";
26
+ // Configuration validation - now using consolidated utility
24
27
  if (!this.apiKey) {
25
- throw new Error("AZURE_OPENAI_API_KEY environment variable is required");
28
+ validateApiKey(createAzureAPIKeyConfig());
26
29
  }
27
30
  if (!this.resourceName) {
28
- throw new Error("AZURE_OPENAI_ENDPOINT environment variable is required");
31
+ validateApiKey(createAzureEndpointConfig());
29
32
  }
30
33
  // Create the Azure provider instance
31
34
  this.azureProvider = createAzure({
@@ -33,7 +36,7 @@ export class AzureOpenAIProvider extends BaseProvider {
33
36
  apiKey: this.apiKey,
34
37
  apiVersion: this.apiVersion,
35
38
  });
36
- console.log("Azure Vercel Provider initialized", {
39
+ logger.debug("Azure Vercel Provider initialized", {
37
40
  deployment: this.deployment,
38
41
  resourceName: this.resourceName,
39
42
  provider: "azure-vercel",
@@ -4,6 +4,7 @@ import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
7
+ import { validateApiKey, createVertexProjectConfig, createGoogleAuthConfig, } from "../utils/providerConfig.js";
7
8
  // Cache for anthropic module to avoid repeated imports
8
9
  let _createVertexAnthropic = null;
9
10
  let _anthropicImportAttempted = false;
@@ -28,14 +29,9 @@ async function getCreateVertexAnthropic() {
28
29
  }
29
30
  }
30
31
  // Configuration helpers
32
+ // Configuration helpers - now using consolidated utility
31
33
  const getVertexProjectId = () => {
32
- const projectId = process.env.GOOGLE_CLOUD_PROJECT_ID ||
33
- process.env.VERTEX_PROJECT_ID ||
34
- process.env.GOOGLE_VERTEX_PROJECT;
35
- if (!projectId) {
36
- throw new Error(`āŒ Google Vertex AI Provider Configuration Error\n\nMissing required environment variables: GOOGLE_CLOUD_PROJECT_ID or VERTEX_PROJECT_ID\n\nšŸ”§ Step 1: Get Google Cloud Credentials\n1. Visit: https://console.cloud.google.com/\n2. Create or select a project\n3. Enable Vertex AI API\n4. Set up authentication\n\nšŸ”§ Step 2: Set Environment Variables\nAdd to your .env file:\nGOOGLE_CLOUD_PROJECT_ID=your_project_id_here\nGOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
37
- }
38
- return projectId;
34
+ return validateApiKey(createVertexProjectConfig());
39
35
  };
40
36
  const getVertexLocation = () => {
41
37
  return (process.env.GOOGLE_CLOUD_LOCATION ||
@@ -72,9 +68,9 @@ export class GoogleVertexProvider extends BaseProvider {
72
68
  cachedAnthropicModel = null;
73
69
  constructor(modelName, sdk) {
74
70
  super(modelName, "vertex", sdk);
75
- // Validate Google Cloud credentials
71
+ // Validate Google Cloud credentials - now using consolidated utility
76
72
  if (!hasGoogleCredentials()) {
77
- throw new Error(`āŒ Google Vertex AI Provider Configuration Error\n\nMissing Google Cloud authentication. One of the following is required:\n\nšŸ”§ Option 1: Service Account Key File\nGOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json\n\nšŸ”§ Option 2: Service Account Key (Base64)\nGOOGLE_SERVICE_ACCOUNT_KEY=base64_encoded_key\n\nšŸ”§ Option 3: Individual Credentials\nGOOGLE_AUTH_CLIENT_EMAIL=your-service-account@project.iam.gserviceaccount.com\nGOOGLE_AUTH_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----...\n\nšŸ”§ Step 4: Restart Application\nRestart your application to load the new environment variables.`);
73
+ validateApiKey(createGoogleAuthConfig());
78
74
  }
79
75
  // Initialize Google Cloud configuration
80
76
  this.projectId = getVertexProjectId();
@@ -4,20 +4,15 @@ import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
7
- // Configuration helpers
7
+ import { validateApiKey, createHuggingFaceConfig, getProviderModel, hasHuggingFaceCredentials, } from "../utils/providerConfig.js";
8
+ // Configuration helpers - now using consolidated utility
8
9
  const getHuggingFaceApiKey = () => {
9
- const apiKey = process.env.HUGGINGFACE_API_KEY || process.env.HF_TOKEN;
10
- if (!apiKey) {
11
- throw new Error(`āŒ HuggingFace Provider Configuration Error\n\nMissing required environment variables: HUGGINGFACE_API_KEY\n\nšŸ”§ Step 1: Get Credentials\n1. Visit: https://huggingface.co/settings/tokens\n2. Create new API token\n3. Copy the token\n\nšŸ”§ Step 2: Set Environment Variable\nAdd to your .env file:\nHUGGINGFACE_API_KEY=your_token_here\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
12
- }
13
- return apiKey;
10
+ return validateApiKey(createHuggingFaceConfig());
14
11
  };
15
12
  const getDefaultHuggingFaceModel = () => {
16
- return process.env.HUGGINGFACE_MODEL || "microsoft/DialoGPT-medium";
17
- };
18
- const hasHuggingFaceCredentials = () => {
19
- return !!(process.env.HUGGINGFACE_API_KEY || process.env.HF_TOKEN);
13
+ return getProviderModel("HUGGINGFACE_MODEL", "microsoft/DialoGPT-medium");
20
14
  };
15
+ // Note: hasHuggingFaceCredentials now directly imported from consolidated utility
21
16
  /**
22
17
  * HuggingFace Provider - BaseProvider Implementation
23
18
  * Using AI SDK with HuggingFace's OpenAI-compatible endpoint
@@ -2,17 +2,14 @@ import { createMistral } from "@ai-sdk/mistral";
2
2
  import { streamText } from "ai";
3
3
  import { BaseProvider } from "../core/base-provider.js";
4
4
  import { logger } from "../utils/logger.js";
5
- import { createAnalytics } from "./analytics-helper.js";
6
- // Configuration helpers
5
+ import { createAnalytics } from "../core/analytics.js";
6
+ import { validateApiKey, createMistralConfig, getProviderModel, } from "../utils/providerConfig.js";
7
+ // Configuration helpers - now using consolidated utility
7
8
  const getMistralApiKey = () => {
8
- const apiKey = process.env.MISTRAL_API_KEY;
9
- if (!apiKey) {
10
- throw new Error("Mistral API key not found. Please set MISTRAL_API_KEY environment variable.");
11
- }
12
- return apiKey;
9
+ return validateApiKey(createMistralConfig());
13
10
  };
14
11
  const getDefaultMistralModel = () => {
15
- return process.env.MISTRAL_MODEL || "mistral-large-latest";
12
+ return getProviderModel("MISTRAL_MODEL", "mistral-large-latest");
16
13
  };
17
14
  /**
18
15
  * Mistral AI Provider v2 - BaseProvider Implementation
@@ -5,16 +5,13 @@ import { BaseProvider } from "../core/base-provider.js";
5
5
  import { logger } from "../utils/logger.js";
6
6
  import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
7
7
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
8
- // Configuration helpers
8
+ import { validateApiKey, createOpenAIConfig, getProviderModel, } from "../utils/providerConfig.js";
9
+ // Configuration helpers - now using consolidated utility
9
10
  const getOpenAIApiKey = () => {
10
- const apiKey = process.env.OPENAI_API_KEY;
11
- if (!apiKey) {
12
- throw new Error(`āŒ OPENAI Provider Configuration Error\n\nMissing required environment variables: OPENAI_API_KEY\n\nšŸ”§ Step 1: Get Credentials\n1. Visit: https://platform.openai.com/api-keys\n2. Create new API key\n3. Copy the key\n\nšŸ”§ Step 2: Set Environment Variable\nAdd to your .env file:\nOPENAI_API_KEY=your_api_key_here\n\nšŸ”§ Step 3: Restart Application\nRestart your application to load the new environment variables.`);
13
- }
14
- return apiKey;
11
+ return validateApiKey(createOpenAIConfig());
15
12
  };
16
13
  const getOpenAIModel = () => {
17
- return process.env.OPENAI_MODEL || "gpt-4o";
14
+ return getProviderModel("OPENAI_MODEL", "gpt-4o");
18
15
  };
19
16
  /**
20
17
  * OpenAI Provider v2 - BaseProvider Implementation
@@ -1,5 +1,6 @@
1
1
  // Optional Telemetry Infrastructure (Phase 2)
2
2
  export { TelemetryService } from "./telemetry-service.js";
3
+ import { logger } from "../utils/logger.js";
3
4
  /**
4
5
  * Initialize telemetry for NeuroLink
5
6
  * OPTIONAL - Only works when NEUROLINK_TELEMETRY_ENABLED=true
@@ -9,7 +10,7 @@ export async function initializeTelemetry() {
9
10
  const telemetry = TelemetryService.getInstance();
10
11
  if (telemetry.isEnabled()) {
11
12
  await telemetry.initialize();
12
- console.log("[NeuroLink] Telemetry initialized");
13
+ logger.info("[NeuroLink] Telemetry initialized");
13
14
  }
14
15
  return telemetry;
15
16
  }
@@ -1,12 +1,72 @@
1
1
  /**
2
- * NeuroLink Logger Utility
2
+ * NeuroLink Unified Logger Utility
3
3
  *
4
- * Provides conditional logging based on NEUROLINK_DEBUG environment variable
4
+ * Centralized logging for the entire NeuroLink ecosystem
5
+ * Supports both CLI --debug flag and NEUROLINK_DEBUG environment variable
6
+ * Migrated from MCP logging with enhanced features
5
7
  */
8
+ export type LogLevel = "debug" | "info" | "warn" | "error";
9
+ interface LogEntry {
10
+ level: LogLevel;
11
+ message: string;
12
+ timestamp: Date;
13
+ data?: unknown;
14
+ }
15
+ declare class NeuroLinkLogger {
16
+ private logLevel;
17
+ private logs;
18
+ private maxLogs;
19
+ private isDebugMode;
20
+ constructor();
21
+ setLogLevel(level: LogLevel): void;
22
+ shouldLog(level: LogLevel): boolean;
23
+ private getLogPrefix;
24
+ /**
25
+ * Outputs a log entry to the console based on the log level.
26
+ *
27
+ * @param level - The log level (debug, info, warn, error).
28
+ * @param prefix - The formatted log prefix.
29
+ * @param message - The log message.
30
+ * @param data - Optional additional data to log.
31
+ */
32
+ private outputToConsole;
33
+ private log;
34
+ debug(message: string, data?: unknown): void;
35
+ info(message: string, data?: unknown): void;
36
+ warn(message: string, data?: unknown): void;
37
+ error(message: string, data?: unknown): void;
38
+ getLogs(level?: LogLevel): LogEntry[];
39
+ clearLogs(): void;
40
+ /**
41
+ * Logs messages unconditionally using `console.log`.
42
+ *
43
+ * This method is part of a legacy simple logger interface for backward compatibility.
44
+ * It bypasses the structured logging mechanism and should only be used when
45
+ * unstructured, unconditional logging is required.
46
+ *
47
+ * @param args - The arguments to log. These are passed directly to `console.log`.
48
+ */
49
+ always(...args: unknown[]): void;
50
+ }
6
51
  export declare const logger: {
7
52
  debug: (...args: unknown[]) => void;
8
53
  info: (...args: unknown[]) => void;
9
54
  warn: (...args: unknown[]) => void;
10
55
  error: (...args: unknown[]) => void;
11
56
  always: (...args: unknown[]) => void;
57
+ setLogLevel: (level: LogLevel) => void;
58
+ getLogs: (level?: LogLevel) => LogEntry[];
59
+ clearLogs: () => void;
12
60
  };
61
+ export declare const mcpLogger: NeuroLinkLogger;
62
+ export declare const autoDiscoveryLogger: NeuroLinkLogger;
63
+ export declare const registryLogger: NeuroLinkLogger;
64
+ export declare const unifiedRegistryLogger: NeuroLinkLogger;
65
+ export declare function setGlobalMCPLogLevel(level: LogLevel): void;
66
+ export declare const LogLevels: {
67
+ readonly debug: "debug";
68
+ readonly info: "info";
69
+ readonly warn: "warn";
70
+ readonly error: "error";
71
+ };
72
+ export type { LogEntry };