@juspay/neurolink 3.0.1 → 4.1.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 (232) hide show
  1. package/CHANGELOG.md +66 -6
  2. package/README.md +318 -27
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/client-utils.d.ts +92 -0
  5. package/dist/chat/client-utils.js +298 -0
  6. package/dist/chat/index.d.ts +27 -0
  7. package/dist/chat/index.js +41 -0
  8. package/dist/chat/session-storage.d.ts +77 -0
  9. package/dist/chat/session-storage.js +233 -0
  10. package/dist/chat/session.d.ts +95 -0
  11. package/dist/chat/session.js +257 -0
  12. package/dist/chat/sse-handler.d.ts +49 -0
  13. package/dist/chat/sse-handler.js +266 -0
  14. package/dist/chat/types.d.ts +73 -0
  15. package/dist/chat/types.js +5 -0
  16. package/dist/chat/websocket-chat-handler.d.ts +36 -0
  17. package/dist/chat/websocket-chat-handler.js +262 -0
  18. package/dist/cli/commands/config.js +12 -12
  19. package/dist/cli/commands/mcp.js +3 -4
  20. package/dist/cli/index.d.ts +0 -7
  21. package/dist/cli/index.js +247 -28
  22. package/dist/config/configManager.d.ts +60 -0
  23. package/dist/config/configManager.js +300 -0
  24. package/dist/config/types.d.ts +136 -0
  25. package/dist/config/types.js +43 -0
  26. package/dist/core/analytics.d.ts +23 -0
  27. package/dist/core/analytics.js +131 -0
  28. package/dist/core/constants.d.ts +41 -0
  29. package/dist/core/constants.js +50 -0
  30. package/dist/core/defaults.d.ts +18 -0
  31. package/dist/core/defaults.js +29 -0
  32. package/dist/core/evaluation-config.d.ts +29 -0
  33. package/dist/core/evaluation-config.js +144 -0
  34. package/dist/core/evaluation-providers.d.ts +30 -0
  35. package/dist/core/evaluation-providers.js +187 -0
  36. package/dist/core/evaluation.d.ts +117 -0
  37. package/dist/core/evaluation.js +528 -0
  38. package/dist/core/factory.js +33 -25
  39. package/dist/core/types.d.ts +165 -6
  40. package/dist/core/types.js +3 -4
  41. package/dist/index.d.ts +9 -4
  42. package/dist/index.js +25 -4
  43. package/dist/lib/agent/direct-tools.d.ts +6 -6
  44. package/dist/lib/chat/client-utils.d.ts +92 -0
  45. package/dist/lib/chat/client-utils.js +298 -0
  46. package/dist/lib/chat/index.d.ts +27 -0
  47. package/dist/lib/chat/index.js +41 -0
  48. package/dist/lib/chat/session-storage.d.ts +77 -0
  49. package/dist/lib/chat/session-storage.js +233 -0
  50. package/dist/lib/chat/session.d.ts +95 -0
  51. package/dist/lib/chat/session.js +257 -0
  52. package/dist/lib/chat/sse-handler.d.ts +49 -0
  53. package/dist/lib/chat/sse-handler.js +266 -0
  54. package/dist/lib/chat/types.d.ts +73 -0
  55. package/dist/lib/chat/types.js +5 -0
  56. package/dist/lib/chat/websocket-chat-handler.d.ts +36 -0
  57. package/dist/lib/chat/websocket-chat-handler.js +262 -0
  58. package/dist/lib/config/configManager.d.ts +60 -0
  59. package/dist/lib/config/configManager.js +300 -0
  60. package/dist/lib/config/types.d.ts +136 -0
  61. package/dist/lib/config/types.js +43 -0
  62. package/dist/lib/core/analytics.d.ts +23 -0
  63. package/dist/lib/core/analytics.js +131 -0
  64. package/dist/lib/core/constants.d.ts +41 -0
  65. package/dist/lib/core/constants.js +50 -0
  66. package/dist/lib/core/defaults.d.ts +18 -0
  67. package/dist/lib/core/defaults.js +29 -0
  68. package/dist/lib/core/evaluation-config.d.ts +29 -0
  69. package/dist/lib/core/evaluation-config.js +144 -0
  70. package/dist/lib/core/evaluation-providers.d.ts +30 -0
  71. package/dist/lib/core/evaluation-providers.js +187 -0
  72. package/dist/lib/core/evaluation.d.ts +117 -0
  73. package/dist/lib/core/evaluation.js +528 -0
  74. package/dist/lib/core/factory.js +33 -26
  75. package/dist/lib/core/types.d.ts +165 -6
  76. package/dist/lib/core/types.js +3 -4
  77. package/dist/lib/index.d.ts +9 -4
  78. package/dist/lib/index.js +25 -4
  79. package/dist/lib/mcp/contracts/mcpContract.d.ts +118 -0
  80. package/dist/lib/mcp/contracts/mcpContract.js +5 -0
  81. package/dist/lib/mcp/dynamic-chain-executor.d.ts +201 -0
  82. package/dist/lib/mcp/dynamic-chain-executor.js +489 -0
  83. package/dist/lib/mcp/dynamic-orchestrator.d.ts +109 -0
  84. package/dist/lib/mcp/dynamic-orchestrator.js +351 -0
  85. package/dist/lib/mcp/error-manager.d.ts +254 -0
  86. package/dist/lib/mcp/error-manager.js +501 -0
  87. package/dist/lib/mcp/error-recovery.d.ts +158 -0
  88. package/dist/lib/mcp/error-recovery.js +405 -0
  89. package/dist/lib/mcp/function-calling.js +11 -3
  90. package/dist/lib/mcp/health-monitor.d.ts +256 -0
  91. package/dist/lib/mcp/health-monitor.js +621 -0
  92. package/dist/lib/mcp/logging.js +5 -0
  93. package/dist/lib/mcp/neurolink-mcp-client.js +2 -1
  94. package/dist/lib/mcp/orchestrator.d.ts +136 -5
  95. package/dist/lib/mcp/orchestrator.js +332 -16
  96. package/dist/lib/mcp/registry.d.ts +71 -16
  97. package/dist/lib/mcp/registry.js +104 -6
  98. package/dist/lib/mcp/semaphore-manager.d.ts +137 -0
  99. package/dist/lib/mcp/semaphore-manager.js +329 -0
  100. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  101. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  102. package/dist/lib/mcp/session-manager.d.ts +186 -0
  103. package/dist/lib/mcp/session-manager.js +400 -0
  104. package/dist/lib/mcp/session-persistence.d.ts +93 -0
  105. package/dist/lib/mcp/session-persistence.js +298 -0
  106. package/dist/lib/mcp/tool-integration.js +1 -1
  107. package/dist/lib/mcp/tool-registry.d.ts +55 -34
  108. package/dist/lib/mcp/tool-registry.js +111 -97
  109. package/dist/lib/mcp/transport-manager.d.ts +153 -0
  110. package/dist/lib/mcp/transport-manager.js +330 -0
  111. package/dist/lib/mcp/unified-mcp.js +6 -1
  112. package/dist/lib/mcp/unified-registry.d.ts +54 -5
  113. package/dist/lib/mcp/unified-registry.js +139 -6
  114. package/dist/lib/neurolink.d.ts +101 -0
  115. package/dist/lib/neurolink.js +147 -1
  116. package/dist/lib/providers/agent-enhanced-provider.d.ts +11 -2
  117. package/dist/lib/providers/agent-enhanced-provider.js +86 -15
  118. package/dist/lib/providers/amazonBedrock.d.ts +9 -1
  119. package/dist/lib/providers/amazonBedrock.js +26 -2
  120. package/dist/lib/providers/analytics-helper.d.ts +53 -0
  121. package/dist/lib/providers/analytics-helper.js +151 -0
  122. package/dist/lib/providers/anthropic.d.ts +11 -1
  123. package/dist/lib/providers/anthropic.js +29 -4
  124. package/dist/lib/providers/azureOpenAI.d.ts +3 -1
  125. package/dist/lib/providers/azureOpenAI.js +28 -4
  126. package/dist/lib/providers/function-calling-provider.d.ts +9 -1
  127. package/dist/lib/providers/function-calling-provider.js +14 -1
  128. package/dist/lib/providers/googleAIStudio.d.ts +15 -1
  129. package/dist/lib/providers/googleAIStudio.js +32 -2
  130. package/dist/lib/providers/googleVertexAI.d.ts +9 -1
  131. package/dist/lib/providers/googleVertexAI.js +31 -2
  132. package/dist/lib/providers/huggingFace.d.ts +3 -1
  133. package/dist/lib/providers/huggingFace.js +26 -3
  134. package/dist/lib/providers/mcp-provider.d.ts +9 -1
  135. package/dist/lib/providers/mcp-provider.js +12 -0
  136. package/dist/lib/providers/mistralAI.d.ts +3 -1
  137. package/dist/lib/providers/mistralAI.js +25 -2
  138. package/dist/lib/providers/ollama.d.ts +3 -1
  139. package/dist/lib/providers/ollama.js +27 -4
  140. package/dist/lib/providers/openAI.d.ts +15 -1
  141. package/dist/lib/providers/openAI.js +32 -2
  142. package/dist/lib/proxy/proxy-fetch.js +8 -7
  143. package/dist/lib/services/streaming/streaming-manager.d.ts +29 -0
  144. package/dist/lib/services/streaming/streaming-manager.js +244 -0
  145. package/dist/lib/services/types.d.ts +155 -0
  146. package/dist/lib/services/types.js +2 -0
  147. package/dist/lib/services/websocket/websocket-server.d.ts +34 -0
  148. package/dist/lib/services/websocket/websocket-server.js +304 -0
  149. package/dist/lib/telemetry/index.d.ts +15 -0
  150. package/dist/lib/telemetry/index.js +22 -0
  151. package/dist/lib/telemetry/telemetry-service.d.ts +47 -0
  152. package/dist/lib/telemetry/telemetry-service.js +259 -0
  153. package/dist/lib/utils/streaming-utils.d.ts +67 -0
  154. package/dist/lib/utils/streaming-utils.js +201 -0
  155. package/dist/mcp/contracts/mcpContract.d.ts +118 -0
  156. package/dist/mcp/contracts/mcpContract.js +5 -0
  157. package/dist/mcp/dynamic-chain-executor.d.ts +201 -0
  158. package/dist/mcp/dynamic-chain-executor.js +489 -0
  159. package/dist/mcp/dynamic-orchestrator.d.ts +109 -0
  160. package/dist/mcp/dynamic-orchestrator.js +351 -0
  161. package/dist/mcp/error-manager.d.ts +254 -0
  162. package/dist/mcp/error-manager.js +501 -0
  163. package/dist/mcp/error-recovery.d.ts +158 -0
  164. package/dist/mcp/error-recovery.js +405 -0
  165. package/dist/mcp/function-calling.js +11 -3
  166. package/dist/mcp/health-monitor.d.ts +256 -0
  167. package/dist/mcp/health-monitor.js +621 -0
  168. package/dist/mcp/logging.js +5 -0
  169. package/dist/mcp/neurolink-mcp-client.js +2 -1
  170. package/dist/mcp/orchestrator.d.ts +136 -5
  171. package/dist/mcp/orchestrator.js +332 -16
  172. package/dist/mcp/plugins/core/neurolink-mcp.json +15 -15
  173. package/dist/mcp/registry.d.ts +71 -16
  174. package/dist/mcp/registry.js +104 -6
  175. package/dist/mcp/semaphore-manager.d.ts +137 -0
  176. package/dist/mcp/semaphore-manager.js +329 -0
  177. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  178. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  179. package/dist/mcp/session-manager.d.ts +186 -0
  180. package/dist/mcp/session-manager.js +400 -0
  181. package/dist/mcp/session-persistence.d.ts +93 -0
  182. package/dist/mcp/session-persistence.js +299 -0
  183. package/dist/mcp/tool-integration.js +1 -1
  184. package/dist/mcp/tool-registry.d.ts +55 -34
  185. package/dist/mcp/tool-registry.js +111 -97
  186. package/dist/mcp/transport-manager.d.ts +153 -0
  187. package/dist/mcp/transport-manager.js +331 -0
  188. package/dist/mcp/unified-mcp.js +6 -1
  189. package/dist/mcp/unified-registry.d.ts +54 -5
  190. package/dist/mcp/unified-registry.js +139 -6
  191. package/dist/neurolink.d.ts +101 -0
  192. package/dist/neurolink.js +147 -1
  193. package/dist/providers/agent-enhanced-provider.d.ts +11 -2
  194. package/dist/providers/agent-enhanced-provider.js +86 -15
  195. package/dist/providers/amazonBedrock.d.ts +9 -1
  196. package/dist/providers/amazonBedrock.js +26 -2
  197. package/dist/providers/analytics-helper.d.ts +53 -0
  198. package/dist/providers/analytics-helper.js +151 -0
  199. package/dist/providers/anthropic.d.ts +11 -1
  200. package/dist/providers/anthropic.js +29 -4
  201. package/dist/providers/azureOpenAI.d.ts +3 -1
  202. package/dist/providers/azureOpenAI.js +29 -4
  203. package/dist/providers/function-calling-provider.d.ts +9 -1
  204. package/dist/providers/function-calling-provider.js +14 -1
  205. package/dist/providers/googleAIStudio.d.ts +15 -1
  206. package/dist/providers/googleAIStudio.js +32 -2
  207. package/dist/providers/googleVertexAI.d.ts +9 -1
  208. package/dist/providers/googleVertexAI.js +31 -2
  209. package/dist/providers/huggingFace.d.ts +3 -1
  210. package/dist/providers/huggingFace.js +26 -3
  211. package/dist/providers/mcp-provider.d.ts +9 -1
  212. package/dist/providers/mcp-provider.js +12 -0
  213. package/dist/providers/mistralAI.d.ts +3 -1
  214. package/dist/providers/mistralAI.js +25 -2
  215. package/dist/providers/ollama.d.ts +3 -1
  216. package/dist/providers/ollama.js +27 -4
  217. package/dist/providers/openAI.d.ts +15 -1
  218. package/dist/providers/openAI.js +33 -2
  219. package/dist/proxy/proxy-fetch.js +8 -7
  220. package/dist/services/streaming/streaming-manager.d.ts +29 -0
  221. package/dist/services/streaming/streaming-manager.js +244 -0
  222. package/dist/services/types.d.ts +155 -0
  223. package/dist/services/types.js +2 -0
  224. package/dist/services/websocket/websocket-server.d.ts +34 -0
  225. package/dist/services/websocket/websocket-server.js +304 -0
  226. package/dist/telemetry/index.d.ts +15 -0
  227. package/dist/telemetry/index.js +22 -0
  228. package/dist/telemetry/telemetry-service.d.ts +47 -0
  229. package/dist/telemetry/telemetry-service.js +261 -0
  230. package/dist/utils/streaming-utils.d.ts +67 -0
  231. package/dist/utils/streaming-utils.js +201 -0
  232. package/package.json +245 -228
package/dist/cli/index.js CHANGED
@@ -1,4 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ // CRITICAL: Set MCP logging level before ANY imports
3
+ if (!process.argv.includes("--debug")) {
4
+ process.env.MCP_LOG_LEVEL = "error"; // Only show MCP errors unless debugging
5
+ }
6
+ else {
7
+ process.env.MCP_LOG_LEVEL = "info"; // Show MCP logs when debugging
8
+ }
2
9
  /**
3
10
  * NeuroLink CLI - Enhanced Simplified Approach
4
11
  *
@@ -16,6 +23,84 @@ import { addMCPCommands } from "./commands/mcp.js";
16
23
  import { addOllamaCommands } from "./commands/ollama.js";
17
24
  import { agentGenerateCommand } from "./commands/agent-generate.js";
18
25
  import { AgentEnhancedProvider } from "../lib/providers/agent-enhanced-provider.js";
26
+ import { logger } from "../lib/utils/logger.js";
27
+ /**
28
+ * Helper functions for displaying analytics and evaluation results
29
+ * Addresses DRY principle - extracted shared parts into reusable functions
30
+ */
31
+ function displayDebugInfo(title, data, debug) {
32
+ if (debug) {
33
+ console.log(chalk.blue(title));
34
+ console.log(JSON.stringify(data, null, 2));
35
+ console.log();
36
+ }
37
+ }
38
+ function displayMissingDataWarning(type) {
39
+ console.log();
40
+ console.log(chalk.red(`⚠️ ${type} enabled but no data received`));
41
+ console.log();
42
+ }
43
+ function formatAnalytics(analytics) {
44
+ console.log();
45
+ console.log(chalk.blue("📊 Analytics:"));
46
+ console.log(` 🚀 Provider: ${analytics.provider}`);
47
+ console.log(` 🤖 Model: ${analytics.model}`);
48
+ if (analytics.tokens) {
49
+ console.log(` 💬 Tokens: ${analytics.tokens.totalTokens || analytics.tokens.total || "unknown"}`);
50
+ }
51
+ console.log(` ⏱️ Response Time: ${analytics.responseTime}ms`);
52
+ if (analytics.context) {
53
+ console.log(` 📋 Context: ${Object.keys(analytics.context).length} fields`);
54
+ }
55
+ console.log();
56
+ }
57
+ function formatEvaluation(evaluation) {
58
+ console.log();
59
+ console.log(chalk.blue("⭐ Response Quality Evaluation:"));
60
+ console.log(` 📊 Scores: Relevance ${evaluation.relevanceScore || evaluation.relevance}/10, Accuracy ${evaluation.accuracyScore || evaluation.accuracy}/10, Completeness ${evaluation.completenessScore || evaluation.completeness}/10`);
61
+ console.log(` 🎯 Overall Quality: ${evaluation.overall}/10`);
62
+ const severity = evaluation.alertSeverity || "none";
63
+ const severityColors = {
64
+ high: chalk.red,
65
+ medium: chalk.yellow,
66
+ low: chalk.blue,
67
+ none: chalk.green,
68
+ };
69
+ const severityColor = severityColors[severity] || chalk.gray;
70
+ console.log(` 🚨 Alert Level: ${severityColor(severity)}`);
71
+ if (evaluation.reasoning) {
72
+ console.log(` 💭 Analysis: ${evaluation.reasoning}`);
73
+ }
74
+ if (evaluation.suggestedImprovements) {
75
+ console.log(` 💡 Improvements: ${evaluation.suggestedImprovements}`);
76
+ }
77
+ const evalModel = evaluation.evaluationModel || "unknown";
78
+ const evalTime = evaluation.evaluationTime
79
+ ? `${evaluation.evaluationTime}ms`
80
+ : "unknown";
81
+ console.log(` 🤖 Evaluated by: ${evalModel} (${evalTime})`);
82
+ console.log();
83
+ }
84
+ function displayAnalyticsAndEvaluation(result, argv) {
85
+ if (result && result.analytics) {
86
+ displayDebugInfo("📊 Analytics:", result.analytics, argv.debug);
87
+ if (!argv.debug) {
88
+ formatAnalytics(result.analytics);
89
+ }
90
+ }
91
+ else if (argv.enableAnalytics) {
92
+ displayMissingDataWarning("Analytics");
93
+ }
94
+ if (result && result.evaluation) {
95
+ displayDebugInfo("⭐ Response Evaluation:", result.evaluation, argv.debug);
96
+ if (!argv.debug) {
97
+ formatEvaluation(result.evaluation);
98
+ }
99
+ }
100
+ else if (argv.enableEvaluation) {
101
+ displayMissingDataWarning("Evaluation");
102
+ }
103
+ }
19
104
  // Load environment variables from .env file
20
105
  try {
21
106
  // Try to import and configure dotenv
@@ -129,10 +214,12 @@ const cli = yargs(args)
129
214
  // Control SDK logging based on debug flag
130
215
  if (argv.debug) {
131
216
  process.env.NEUROLINK_DEBUG = "true";
217
+ process.env.MCP_LOG_LEVEL = "info"; // Show MCP logs in debug mode
132
218
  }
133
219
  else {
134
220
  // Always set to false when debug is not enabled (including when not provided)
135
221
  process.env.NEUROLINK_DEBUG = "false";
222
+ process.env.MCP_LOG_LEVEL = "error"; // Hide MCP info logs when not debugging
136
223
  }
137
224
  // Keep existing quiet middleware
138
225
  if (process.env.NEUROLINK_QUIET === "true" &&
@@ -252,19 +339,46 @@ const cli = yargs(args)
252
339
  default: false,
253
340
  description: "Enable debug mode with verbose output",
254
341
  }) // Kept for potential specific debug logic
255
- .option("timeout", {
256
- type: "string",
257
- default: "30s",
258
- description: "Timeout for the request (e.g., 30s, 2m, 1h, 5000)",
259
- })
260
342
  .option("model", {
261
343
  type: "string",
262
344
  description: "Specific model to use (e.g. gemini-2.5-pro, gemini-2.5-flash)",
345
+ })
346
+ .option("timeout", {
347
+ type: "number",
348
+ default: 120,
349
+ description: "Maximum execution time in seconds (default: 120)",
263
350
  })
264
351
  .option("disable-tools", {
265
352
  type: "boolean",
266
353
  default: false,
267
354
  description: "Disable MCP tool integration (tools enabled by default)",
355
+ })
356
+ .option("enable-analytics", {
357
+ type: "boolean",
358
+ default: false,
359
+ description: "Enable usage analytics collection",
360
+ })
361
+ .option("enable-evaluation", {
362
+ type: "boolean",
363
+ default: false,
364
+ description: "Enable AI response quality evaluation",
365
+ })
366
+ .option("evaluation-domain", {
367
+ type: "string",
368
+ description: "Domain expertise for evaluation (e.g., 'AI coding assistant', 'Customer service expert')",
369
+ })
370
+ .option("tool-usage-context", {
371
+ type: "string",
372
+ description: "Tool usage context for evaluation (e.g., 'Used sales-data MCP tools')",
373
+ })
374
+ .option("lighthouse-style", {
375
+ type: "boolean",
376
+ default: false,
377
+ description: "Use Lighthouse-compatible domain-aware evaluation",
378
+ })
379
+ .option("context", {
380
+ type: "string",
381
+ description: "JSON context object for custom data",
268
382
  })
269
383
  .example('$0 generate-text "Hello world"', "Basic text generation")
270
384
  .example('$0 generate-text "Write a story" --provider openai', "Use specific provider")
@@ -289,10 +403,25 @@ const cli = yargs(args)
289
403
  ? null
290
404
  : ora("🤖 Generating text...").start();
291
405
  try {
292
- // The SDK will handle the timeout internally, so we don't need this wrapper anymore
293
- // Just pass the timeout to the SDK
406
+ // CRITICAL: Add master timeout to prevent infinite hangs
407
+ const cliTimeout = argv.timeout ? argv.timeout * 1000 : 120000; // Default 2 minutes
408
+ const timeoutPromise = new Promise((_, reject) => {
409
+ setTimeout(() => {
410
+ reject(new Error(`CLI operation timed out after ${cliTimeout / 1000} seconds. Use --timeout to adjust.`));
411
+ }, cliTimeout);
412
+ });
294
413
  // Use AgentEnhancedProvider when tools are enabled, otherwise use standard SDK
295
414
  let generatePromise;
415
+ // Parse context if provided
416
+ let contextObj;
417
+ if (argv.context) {
418
+ try {
419
+ contextObj = JSON.parse(argv.context);
420
+ }
421
+ catch {
422
+ throw new Error("Invalid JSON provided for --context option");
423
+ }
424
+ }
296
425
  if (argv.disableTools === true) {
297
426
  // Tools disabled - use standard SDK
298
427
  generatePromise = sdk.generateText({
@@ -305,6 +434,13 @@ const cli = yargs(args)
305
434
  maxTokens: argv.maxTokens,
306
435
  systemPrompt: argv.system,
307
436
  timeout: argv.timeout,
437
+ // NEW: Analytics and evaluation support
438
+ enableAnalytics: argv.enableAnalytics,
439
+ enableEvaluation: argv.enableEvaluation,
440
+ context: contextObj,
441
+ // NEW: Lighthouse-compatible domain-aware evaluation
442
+ evaluationDomain: argv.evaluationDomain,
443
+ toolUsageContext: argv.toolUsageContext,
308
444
  });
309
445
  }
310
446
  else {
@@ -326,37 +462,52 @@ const cli = yargs(args)
326
462
  model: argv.model, // Use specified model or default
327
463
  toolCategory: "all", // Enable all tool categories
328
464
  });
329
- generatePromise = agentProvider.generateText(argv.prompt);
465
+ generatePromise = agentProvider.generateText({
466
+ prompt: argv.prompt,
467
+ temperature: argv.temperature,
468
+ maxTokens: argv.maxTokens, // Respect user's token limit - no artificial caps
469
+ systemPrompt: argv.system,
470
+ // NEW: Analytics and evaluation support
471
+ enableAnalytics: argv.enableAnalytics,
472
+ enableEvaluation: argv.enableEvaluation,
473
+ context: contextObj,
474
+ // NEW: Lighthouse-compatible domain-aware evaluation
475
+ evaluationDomain: argv.evaluationDomain,
476
+ toolUsageContext: argv.toolUsageContext,
477
+ });
330
478
  }
331
- const result = await generatePromise;
479
+ // Wrap generation with master timeout to prevent infinite hangs
480
+ const result = await Promise.race([generatePromise, timeoutPromise]);
332
481
  if (argv.format === "json" && originalConsole.log) {
333
482
  Object.assign(console, originalConsole);
334
483
  }
335
484
  if (spinner) {
336
485
  spinner.succeed(chalk.green("✅ Text generated successfully!"));
337
486
  }
338
- // Handle both AgentEnhancedProvider (AI SDK) and standard NeuroLink SDK responses
339
- const responseText = result
340
- ? result.text || result.content || ""
341
- : "";
342
- const responseUsage = result
343
- ? result.usage || {
344
- promptTokens: 0,
345
- completionTokens: 0,
346
- totalTokens: 0,
347
- }
348
- : { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
487
+ const typedResult = result;
488
+ const responseText = typedResult?.text || typedResult?.content || "";
489
+ const responseUsage = typedResult?.usage || {
490
+ promptTokens: 0,
491
+ completionTokens: 0,
492
+ totalTokens: 0,
493
+ };
349
494
  if (argv.format === "json") {
350
495
  const jsonOutput = {
351
496
  content: responseText,
352
- provider: result
353
- ? result.provider || argv.provider
354
- : argv.provider,
497
+ provider: typedResult?.provider || argv.provider,
355
498
  usage: responseUsage,
356
- responseTime: result ? result.responseTime || 0 : 0,
357
- toolCalls: result ? result.toolCalls || [] : [],
358
- toolResults: result ? result.toolResults || [] : [],
499
+ responseTime: typedResult?.responseTime || 0,
500
+ toolCalls: typedResult?.toolCalls || [],
501
+ toolResults: typedResult?.toolResults || [],
359
502
  };
503
+ // Include analytics if present
504
+ if (typedResult?.analytics) {
505
+ jsonOutput.analytics = typedResult.analytics;
506
+ }
507
+ // Include evaluation if present
508
+ if (typedResult?.evaluation) {
509
+ jsonOutput.evaluation = typedResult.evaluation;
510
+ }
360
511
  process.stdout.write(JSON.stringify(jsonOutput, null, 2) + "\n");
361
512
  }
362
513
  else if (argv.debug) {
@@ -386,6 +537,21 @@ const cli = yargs(args)
386
537
  }
387
538
  console.log();
388
539
  }
540
+ // DEBUG: Show what's in the result object
541
+ if (argv.debug) {
542
+ logger.debug("Result object keys:", {
543
+ keys: Object.keys(result || {}),
544
+ });
545
+ logger.debug("Enhancement status:", {
546
+ hasAnalytics: !!(result && result.analytics),
547
+ hasEvaluation: !!(result && result.evaluation),
548
+ enableAnalytics: argv.enableAnalytics,
549
+ enableEvaluation: argv.enableEvaluation,
550
+ hasContext: !!contextObj,
551
+ });
552
+ }
553
+ // Show analytics and evaluation if enabled
554
+ displayAnalyticsAndEvaluation(result, argv);
389
555
  console.log(JSON.stringify({
390
556
  provider: result
391
557
  ? result.provider || argv.provider
@@ -402,6 +568,8 @@ const cli = yargs(args)
402
568
  if (responseText) {
403
569
  console.log(responseText);
404
570
  }
571
+ // Show analytics and evaluation if enabled
572
+ displayAnalyticsAndEvaluation(result, argv);
405
573
  }
406
574
  // Explicitly exit to prevent hanging, especially with Google AI Studio
407
575
  process.exit(0);
@@ -458,7 +626,7 @@ const cli = yargs(args)
458
626
  })
459
627
  .option("model", {
460
628
  type: "string",
461
- description: "Specific model to use (e.g., gemini-1.5-pro-latest, gemini-2.0-flash-exp)",
629
+ description: "Specific model to use (e.g., gemini-2.5-pro, gemini-2.5-flash)",
462
630
  })
463
631
  .option("debug", {
464
632
  type: "boolean",
@@ -469,6 +637,33 @@ const cli = yargs(args)
469
637
  type: "boolean",
470
638
  default: false,
471
639
  description: "Disable MCP tool integration (tools enabled by default)",
640
+ })
641
+ .option("enable-analytics", {
642
+ type: "boolean",
643
+ default: false,
644
+ description: "Enable usage analytics collection",
645
+ })
646
+ .option("enable-evaluation", {
647
+ type: "boolean",
648
+ default: false,
649
+ description: "Enable AI response quality evaluation",
650
+ })
651
+ .option("evaluation-domain", {
652
+ type: "string",
653
+ description: "Domain expertise for evaluation (e.g., 'AI coding assistant', 'Customer service expert')",
654
+ })
655
+ .option("tool-usage-context", {
656
+ type: "string",
657
+ description: "Tool usage context for evaluation (e.g., 'Used sales-data MCP tools')",
658
+ })
659
+ .option("lighthouse-style", {
660
+ type: "boolean",
661
+ default: false,
662
+ description: "Use Lighthouse-compatible domain-aware evaluation",
663
+ })
664
+ .option("context", {
665
+ type: "string",
666
+ description: "JSON context object for custom data",
472
667
  })
473
668
  .example('$0 stream "Tell me a story"', "Stream a story in real-time")
474
669
  .example('$0 stream "What time is it?"', "Stream with natural tool integration (default)")
@@ -482,6 +677,16 @@ const cli = yargs(args)
482
677
  console.log(chalk.blue(`🔄 Streaming from ${argv.provider} provider with debug logging...\n`));
483
678
  }
484
679
  try {
680
+ // Parse context if provided
681
+ let contextObj;
682
+ if (argv.context) {
683
+ try {
684
+ contextObj = JSON.parse(argv.context);
685
+ }
686
+ catch {
687
+ throw new Error("Invalid JSON provided for --context option");
688
+ }
689
+ }
485
690
  let stream;
486
691
  if (argv.disableTools === true) {
487
692
  // Tools disabled - use standard SDK
@@ -493,6 +698,10 @@ const cli = yargs(args)
493
698
  model: argv.model,
494
699
  temperature: argv.temperature,
495
700
  timeout: argv.timeout,
701
+ // NEW: Analytics and evaluation support
702
+ enableAnalytics: argv.enableAnalytics,
703
+ enableEvaluation: argv.enableEvaluation,
704
+ context: contextObj,
496
705
  });
497
706
  }
498
707
  else {
@@ -516,7 +725,14 @@ const cli = yargs(args)
516
725
  });
517
726
  // Note: AgentEnhancedProvider doesn't support streaming with tools yet
518
727
  // Fall back to generateText for now
519
- const result = await agentProvider.generateText(argv.prompt);
728
+ const result = await agentProvider.generateText({
729
+ prompt: argv.prompt,
730
+ temperature: argv.temperature,
731
+ // NEW: Analytics and evaluation support
732
+ enableAnalytics: argv.enableAnalytics,
733
+ enableEvaluation: argv.enableEvaluation,
734
+ context: contextObj,
735
+ });
520
736
  // Simulate streaming by outputting the result
521
737
  const text = result?.text || "";
522
738
  const CHUNK_SIZE = 10;
@@ -528,6 +744,9 @@ const cli = yargs(args)
528
744
  if (!argv.quiet) {
529
745
  process.stdout.write("\n");
530
746
  }
747
+ // Show analytics if enabled
748
+ // Show analytics and evaluation if enabled
749
+ displayAnalyticsAndEvaluation(result, argv);
531
750
  return; // Exit early for agent mode
532
751
  }
533
752
  for await (const chunk of stream) {
@@ -0,0 +1,60 @@
1
+ /**
2
+ * NeuroLink Config Manager with Backup/Restore System
3
+ * Industry standard configuration management with safety mechanisms
4
+ */
5
+ import type { NeuroLinkConfig, ProviderConfig, BackupInfo, ConfigValidationResult, ConfigUpdateOptions } from "./types.js";
6
+ /**
7
+ * Enhanced Config Manager with automatic backup/restore capabilities
8
+ */
9
+ export declare class NeuroLinkConfigManager {
10
+ private configPath;
11
+ private backupDir;
12
+ private config;
13
+ private configCache;
14
+ /**
15
+ * Load configuration with caching
16
+ */
17
+ loadConfig(): Promise<NeuroLinkConfig>;
18
+ /**
19
+ * Update configuration with automatic backup
20
+ */
21
+ updateConfig(updates: Partial<NeuroLinkConfig>, options?: ConfigUpdateOptions): Promise<void>;
22
+ /**
23
+ * Create a backup with metadata
24
+ */
25
+ createBackup(reason?: string): Promise<string>;
26
+ /**
27
+ * List all available backups
28
+ */
29
+ listBackups(): Promise<BackupInfo[]>;
30
+ /**
31
+ * Restore from specific backup
32
+ */
33
+ restoreFromBackup(backupFilename: string): Promise<void>;
34
+ /**
35
+ * Restore from latest backup
36
+ */
37
+ restoreLatestBackup(): Promise<void>;
38
+ /**
39
+ * Clean up old backups
40
+ */
41
+ cleanupOldBackups(keepCount?: number): Promise<void>;
42
+ /**
43
+ * Update provider status
44
+ */
45
+ updateProviderStatus(providerId: string, status: Partial<ProviderConfig>): Promise<void>;
46
+ /**
47
+ * Validate configuration
48
+ */
49
+ validateConfig(config: NeuroLinkConfig): Promise<ConfigValidationResult>;
50
+ /**
51
+ * Generate default configuration
52
+ */
53
+ generateDefaultConfig(): Promise<NeuroLinkConfig>;
54
+ private ensureBackupDirectory;
55
+ private readConfigFile;
56
+ private persistConfig;
57
+ private generateConfigHash;
58
+ private extractMetadataFromBackup;
59
+ private extractConfigFromBackup;
60
+ }