@juspay/neurolink 3.0.0 → 4.0.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 (192) hide show
  1. package/CHANGELOG.md +62 -4
  2. package/README.md +235 -2
  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 +256 -27
  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/function-calling.js +11 -3
  82. package/dist/lib/mcp/logging.js +5 -0
  83. package/dist/lib/mcp/neurolink-mcp-client.js +2 -1
  84. package/dist/lib/mcp/orchestrator.js +18 -9
  85. package/dist/lib/mcp/registry.d.ts +49 -16
  86. package/dist/lib/mcp/registry.js +80 -6
  87. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  88. package/dist/lib/mcp/tool-integration.js +1 -1
  89. package/dist/lib/mcp/tool-registry.d.ts +55 -34
  90. package/dist/lib/mcp/tool-registry.js +111 -97
  91. package/dist/lib/mcp/unified-mcp.js +6 -1
  92. package/dist/lib/mcp/unified-registry.d.ts +12 -4
  93. package/dist/lib/mcp/unified-registry.js +17 -4
  94. package/dist/lib/neurolink.d.ts +28 -0
  95. package/dist/lib/neurolink.js +48 -4
  96. package/dist/lib/providers/agent-enhanced-provider.d.ts +11 -2
  97. package/dist/lib/providers/agent-enhanced-provider.js +86 -15
  98. package/dist/lib/providers/amazonBedrock.d.ts +9 -1
  99. package/dist/lib/providers/amazonBedrock.js +26 -2
  100. package/dist/lib/providers/analytics-helper.d.ts +53 -0
  101. package/dist/lib/providers/analytics-helper.js +151 -0
  102. package/dist/lib/providers/anthropic.d.ts +11 -1
  103. package/dist/lib/providers/anthropic.js +29 -4
  104. package/dist/lib/providers/azureOpenAI.d.ts +3 -1
  105. package/dist/lib/providers/azureOpenAI.js +28 -4
  106. package/dist/lib/providers/function-calling-provider.d.ts +9 -1
  107. package/dist/lib/providers/function-calling-provider.js +14 -1
  108. package/dist/lib/providers/googleAIStudio.d.ts +15 -1
  109. package/dist/lib/providers/googleAIStudio.js +32 -2
  110. package/dist/lib/providers/googleVertexAI.d.ts +9 -1
  111. package/dist/lib/providers/googleVertexAI.js +31 -2
  112. package/dist/lib/providers/huggingFace.d.ts +3 -1
  113. package/dist/lib/providers/huggingFace.js +26 -3
  114. package/dist/lib/providers/mcp-provider.d.ts +9 -1
  115. package/dist/lib/providers/mcp-provider.js +12 -0
  116. package/dist/lib/providers/mistralAI.d.ts +3 -1
  117. package/dist/lib/providers/mistralAI.js +25 -2
  118. package/dist/lib/providers/ollama.d.ts +3 -1
  119. package/dist/lib/providers/ollama.js +27 -4
  120. package/dist/lib/providers/openAI.d.ts +15 -1
  121. package/dist/lib/providers/openAI.js +32 -2
  122. package/dist/lib/proxy/proxy-fetch.js +8 -7
  123. package/dist/lib/services/streaming/streaming-manager.d.ts +29 -0
  124. package/dist/lib/services/streaming/streaming-manager.js +244 -0
  125. package/dist/lib/services/types.d.ts +155 -0
  126. package/dist/lib/services/types.js +2 -0
  127. package/dist/lib/services/websocket/websocket-server.d.ts +34 -0
  128. package/dist/lib/services/websocket/websocket-server.js +304 -0
  129. package/dist/lib/telemetry/index.d.ts +15 -0
  130. package/dist/lib/telemetry/index.js +22 -0
  131. package/dist/lib/telemetry/telemetry-service.d.ts +47 -0
  132. package/dist/lib/telemetry/telemetry-service.js +259 -0
  133. package/dist/lib/utils/streaming-utils.d.ts +67 -0
  134. package/dist/lib/utils/streaming-utils.js +201 -0
  135. package/dist/mcp/contracts/mcpContract.d.ts +118 -0
  136. package/dist/mcp/contracts/mcpContract.js +5 -0
  137. package/dist/mcp/function-calling.js +11 -3
  138. package/dist/mcp/logging.js +5 -0
  139. package/dist/mcp/neurolink-mcp-client.js +2 -1
  140. package/dist/mcp/orchestrator.js +18 -9
  141. package/dist/mcp/registry.d.ts +49 -16
  142. package/dist/mcp/registry.js +80 -6
  143. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  144. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  145. package/dist/mcp/tool-integration.js +1 -1
  146. package/dist/mcp/tool-registry.d.ts +55 -34
  147. package/dist/mcp/tool-registry.js +111 -97
  148. package/dist/mcp/unified-mcp.js +6 -1
  149. package/dist/mcp/unified-registry.d.ts +12 -4
  150. package/dist/mcp/unified-registry.js +17 -4
  151. package/dist/neurolink.d.ts +28 -0
  152. package/dist/neurolink.js +48 -4
  153. package/dist/providers/agent-enhanced-provider.d.ts +11 -2
  154. package/dist/providers/agent-enhanced-provider.js +86 -15
  155. package/dist/providers/amazonBedrock.d.ts +9 -1
  156. package/dist/providers/amazonBedrock.js +26 -2
  157. package/dist/providers/analytics-helper.d.ts +53 -0
  158. package/dist/providers/analytics-helper.js +151 -0
  159. package/dist/providers/anthropic.d.ts +11 -1
  160. package/dist/providers/anthropic.js +29 -4
  161. package/dist/providers/azureOpenAI.d.ts +3 -1
  162. package/dist/providers/azureOpenAI.js +29 -4
  163. package/dist/providers/function-calling-provider.d.ts +9 -1
  164. package/dist/providers/function-calling-provider.js +14 -1
  165. package/dist/providers/googleAIStudio.d.ts +15 -1
  166. package/dist/providers/googleAIStudio.js +32 -2
  167. package/dist/providers/googleVertexAI.d.ts +9 -1
  168. package/dist/providers/googleVertexAI.js +31 -2
  169. package/dist/providers/huggingFace.d.ts +3 -1
  170. package/dist/providers/huggingFace.js +26 -3
  171. package/dist/providers/mcp-provider.d.ts +9 -1
  172. package/dist/providers/mcp-provider.js +12 -0
  173. package/dist/providers/mistralAI.d.ts +3 -1
  174. package/dist/providers/mistralAI.js +25 -2
  175. package/dist/providers/ollama.d.ts +3 -1
  176. package/dist/providers/ollama.js +27 -4
  177. package/dist/providers/openAI.d.ts +15 -1
  178. package/dist/providers/openAI.js +33 -2
  179. package/dist/proxy/proxy-fetch.js +8 -7
  180. package/dist/services/streaming/streaming-manager.d.ts +29 -0
  181. package/dist/services/streaming/streaming-manager.js +244 -0
  182. package/dist/services/types.d.ts +155 -0
  183. package/dist/services/types.js +2 -0
  184. package/dist/services/websocket/websocket-server.d.ts +34 -0
  185. package/dist/services/websocket/websocket-server.js +304 -0
  186. package/dist/telemetry/index.d.ts +15 -0
  187. package/dist/telemetry/index.js +22 -0
  188. package/dist/telemetry/telemetry-service.d.ts +47 -0
  189. package/dist/telemetry/telemetry-service.js +261 -0
  190. package/dist/utils/streaming-utils.d.ts +67 -0
  191. package/dist/utils/streaming-utils.js +201 -0
  192. package/package.json +18 -2
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,15 +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", {
342
+ .option("model", {
256
343
  type: "string",
257
- default: "30s",
258
- description: "Timeout for the request (e.g., 30s, 2m, 1h, 5000)",
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)",
259
350
  })
260
351
  .option("disable-tools", {
261
352
  type: "boolean",
262
353
  default: false,
263
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",
264
382
  })
265
383
  .example('$0 generate-text "Hello world"', "Basic text generation")
266
384
  .example('$0 generate-text "Write a story" --provider openai', "Use specific provider")
@@ -285,10 +403,25 @@ const cli = yargs(args)
285
403
  ? null
286
404
  : ora("🤖 Generating text...").start();
287
405
  try {
288
- // The SDK will handle the timeout internally, so we don't need this wrapper anymore
289
- // 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
+ });
290
413
  // Use AgentEnhancedProvider when tools are enabled, otherwise use standard SDK
291
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
+ }
292
425
  if (argv.disableTools === true) {
293
426
  // Tools disabled - use standard SDK
294
427
  generatePromise = sdk.generateText({
@@ -296,10 +429,18 @@ const cli = yargs(args)
296
429
  provider: argv.provider === "auto"
297
430
  ? undefined
298
431
  : argv.provider,
432
+ model: argv.model,
299
433
  temperature: argv.temperature,
300
434
  maxTokens: argv.maxTokens,
301
435
  systemPrompt: argv.system,
302
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,
303
444
  });
304
445
  }
305
446
  else {
@@ -318,40 +459,55 @@ const cli = yargs(args)
318
459
  })();
319
460
  const agentProvider = new AgentEnhancedProvider({
320
461
  provider: supportedProvider,
321
- model: undefined, // Use default model for provider
462
+ model: argv.model, // Use specified model or default
322
463
  toolCategory: "all", // Enable all tool categories
323
464
  });
324
- 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
+ });
325
478
  }
326
- const result = await generatePromise;
479
+ // Wrap generation with master timeout to prevent infinite hangs
480
+ const result = await Promise.race([generatePromise, timeoutPromise]);
327
481
  if (argv.format === "json" && originalConsole.log) {
328
482
  Object.assign(console, originalConsole);
329
483
  }
330
484
  if (spinner) {
331
485
  spinner.succeed(chalk.green("✅ Text generated successfully!"));
332
486
  }
333
- // Handle both AgentEnhancedProvider (AI SDK) and standard NeuroLink SDK responses
334
- const responseText = result
335
- ? result.text || result.content || ""
336
- : "";
337
- const responseUsage = result
338
- ? result.usage || {
339
- promptTokens: 0,
340
- completionTokens: 0,
341
- totalTokens: 0,
342
- }
343
- : { 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
+ };
344
494
  if (argv.format === "json") {
345
495
  const jsonOutput = {
346
496
  content: responseText,
347
- provider: result
348
- ? result.provider || argv.provider
349
- : argv.provider,
497
+ provider: typedResult?.provider || argv.provider,
350
498
  usage: responseUsage,
351
- responseTime: result ? result.responseTime || 0 : 0,
352
- toolCalls: result ? result.toolCalls || [] : [],
353
- toolResults: result ? result.toolResults || [] : [],
499
+ responseTime: typedResult?.responseTime || 0,
500
+ toolCalls: typedResult?.toolCalls || [],
501
+ toolResults: typedResult?.toolResults || [],
354
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
+ }
355
511
  process.stdout.write(JSON.stringify(jsonOutput, null, 2) + "\n");
356
512
  }
357
513
  else if (argv.debug) {
@@ -381,6 +537,21 @@ const cli = yargs(args)
381
537
  }
382
538
  console.log();
383
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);
384
555
  console.log(JSON.stringify({
385
556
  provider: result
386
557
  ? result.provider || argv.provider
@@ -397,6 +568,8 @@ const cli = yargs(args)
397
568
  if (responseText) {
398
569
  console.log(responseText);
399
570
  }
571
+ // Show analytics and evaluation if enabled
572
+ displayAnalyticsAndEvaluation(result, argv);
400
573
  }
401
574
  // Explicitly exit to prevent hanging, especially with Google AI Studio
402
575
  process.exit(0);
@@ -450,6 +623,10 @@ const cli = yargs(args)
450
623
  type: "string",
451
624
  default: "2m",
452
625
  description: "Timeout for streaming (e.g., 30s, 2m, 1h)",
626
+ })
627
+ .option("model", {
628
+ type: "string",
629
+ description: "Specific model to use (e.g., gemini-2.5-pro, gemini-2.5-flash)",
453
630
  })
454
631
  .option("debug", {
455
632
  type: "boolean",
@@ -460,6 +637,33 @@ const cli = yargs(args)
460
637
  type: "boolean",
461
638
  default: false,
462
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",
463
667
  })
464
668
  .example('$0 stream "Tell me a story"', "Stream a story in real-time")
465
669
  .example('$0 stream "What time is it?"', "Stream with natural tool integration (default)")
@@ -473,6 +677,16 @@ const cli = yargs(args)
473
677
  console.log(chalk.blue(`🔄 Streaming from ${argv.provider} provider with debug logging...\n`));
474
678
  }
475
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
+ }
476
690
  let stream;
477
691
  if (argv.disableTools === true) {
478
692
  // Tools disabled - use standard SDK
@@ -481,8 +695,13 @@ const cli = yargs(args)
481
695
  provider: argv.provider === "auto"
482
696
  ? undefined
483
697
  : argv.provider,
698
+ model: argv.model,
484
699
  temperature: argv.temperature,
485
700
  timeout: argv.timeout,
701
+ // NEW: Analytics and evaluation support
702
+ enableAnalytics: argv.enableAnalytics,
703
+ enableEvaluation: argv.enableEvaluation,
704
+ context: contextObj,
486
705
  });
487
706
  }
488
707
  else {
@@ -501,12 +720,19 @@ const cli = yargs(args)
501
720
  })();
502
721
  const agentProvider = new AgentEnhancedProvider({
503
722
  provider: supportedProvider,
504
- model: undefined, // Use default model for provider
723
+ model: argv.model, // Use specified model or default
505
724
  toolCategory: "all", // Enable all tool categories
506
725
  });
507
726
  // Note: AgentEnhancedProvider doesn't support streaming with tools yet
508
727
  // Fall back to generateText for now
509
- 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
+ });
510
736
  // Simulate streaming by outputting the result
511
737
  const text = result?.text || "";
512
738
  const CHUNK_SIZE = 10;
@@ -518,6 +744,9 @@ const cli = yargs(args)
518
744
  if (!argv.quiet) {
519
745
  process.stdout.write("\n");
520
746
  }
747
+ // Show analytics if enabled
748
+ // Show analytics and evaluation if enabled
749
+ displayAnalyticsAndEvaluation(result, argv);
521
750
  return; // Exit early for agent mode
522
751
  }
523
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
+ }