@juspay/neurolink 9.41.0 → 9.42.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 (212) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +7 -1
  3. package/dist/auth/anthropicOAuth.d.ts +18 -3
  4. package/dist/auth/anthropicOAuth.js +149 -4
  5. package/dist/auth/providers/firebase.js +5 -1
  6. package/dist/auth/providers/jwt.js +5 -1
  7. package/dist/auth/providers/workos.js +5 -1
  8. package/dist/auth/sessionManager.d.ts +1 -1
  9. package/dist/auth/sessionManager.js +58 -27
  10. package/dist/browser/neurolink.min.js +354 -334
  11. package/dist/cli/commands/mcp.d.ts +6 -0
  12. package/dist/cli/commands/mcp.js +188 -181
  13. package/dist/cli/commands/proxy.d.ts +2 -1
  14. package/dist/cli/commands/proxy.js +713 -431
  15. package/dist/cli/commands/task.js +3 -0
  16. package/dist/cli/factories/commandFactory.d.ts +2 -0
  17. package/dist/cli/factories/commandFactory.js +38 -0
  18. package/dist/cli/parser.js +4 -3
  19. package/dist/client/aiSdkAdapter.js +3 -0
  20. package/dist/client/streamingClient.js +30 -10
  21. package/dist/core/baseProvider.d.ts +6 -1
  22. package/dist/core/baseProvider.js +208 -230
  23. package/dist/core/factory.d.ts +3 -0
  24. package/dist/core/factory.js +138 -188
  25. package/dist/core/modules/GenerationHandler.js +3 -2
  26. package/dist/core/redisConversationMemoryManager.js +7 -3
  27. package/dist/evaluation/BatchEvaluator.js +4 -1
  28. package/dist/evaluation/hooks/observabilityHooks.js +5 -3
  29. package/dist/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  30. package/dist/evaluation/pipeline/evaluationPipeline.js +24 -9
  31. package/dist/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  32. package/dist/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  33. package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
  34. package/dist/evaluation/scorers/scorerRegistry.js +353 -282
  35. package/dist/lib/auth/anthropicOAuth.d.ts +18 -3
  36. package/dist/lib/auth/anthropicOAuth.js +149 -4
  37. package/dist/lib/auth/providers/firebase.js +5 -1
  38. package/dist/lib/auth/providers/jwt.js +5 -1
  39. package/dist/lib/auth/providers/workos.js +5 -1
  40. package/dist/lib/auth/sessionManager.d.ts +1 -1
  41. package/dist/lib/auth/sessionManager.js +58 -27
  42. package/dist/lib/client/aiSdkAdapter.js +3 -0
  43. package/dist/lib/client/streamingClient.js +30 -10
  44. package/dist/lib/core/baseProvider.d.ts +6 -1
  45. package/dist/lib/core/baseProvider.js +208 -230
  46. package/dist/lib/core/factory.d.ts +3 -0
  47. package/dist/lib/core/factory.js +138 -188
  48. package/dist/lib/core/modules/GenerationHandler.js +3 -2
  49. package/dist/lib/core/redisConversationMemoryManager.js +7 -3
  50. package/dist/lib/evaluation/BatchEvaluator.js +4 -1
  51. package/dist/lib/evaluation/hooks/observabilityHooks.js +5 -3
  52. package/dist/lib/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  53. package/dist/lib/evaluation/pipeline/evaluationPipeline.js +24 -9
  54. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  55. package/dist/lib/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  56. package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
  57. package/dist/lib/evaluation/scorers/scorerRegistry.js +353 -282
  58. package/dist/lib/mcp/toolRegistry.d.ts +2 -0
  59. package/dist/lib/mcp/toolRegistry.js +32 -31
  60. package/dist/lib/neurolink.d.ts +41 -2
  61. package/dist/lib/neurolink.js +1616 -1681
  62. package/dist/lib/observability/otelBridge.d.ts +2 -2
  63. package/dist/lib/observability/otelBridge.js +12 -3
  64. package/dist/lib/providers/amazonBedrock.js +2 -4
  65. package/dist/lib/providers/anthropic.d.ts +9 -5
  66. package/dist/lib/providers/anthropic.js +19 -14
  67. package/dist/lib/providers/anthropicBaseProvider.d.ts +3 -3
  68. package/dist/lib/providers/anthropicBaseProvider.js +5 -4
  69. package/dist/lib/providers/azureOpenai.d.ts +1 -1
  70. package/dist/lib/providers/azureOpenai.js +5 -4
  71. package/dist/lib/providers/googleAiStudio.js +30 -6
  72. package/dist/lib/providers/googleVertex.d.ts +10 -0
  73. package/dist/lib/providers/googleVertex.js +437 -423
  74. package/dist/lib/providers/huggingFace.d.ts +3 -3
  75. package/dist/lib/providers/huggingFace.js +6 -8
  76. package/dist/lib/providers/litellm.d.ts +1 -0
  77. package/dist/lib/providers/litellm.js +76 -55
  78. package/dist/lib/providers/mistral.js +2 -1
  79. package/dist/lib/providers/ollama.js +93 -23
  80. package/dist/lib/providers/openAI.d.ts +2 -0
  81. package/dist/lib/providers/openAI.js +141 -141
  82. package/dist/lib/providers/openRouter.js +2 -1
  83. package/dist/lib/providers/openaiCompatible.d.ts +4 -4
  84. package/dist/lib/providers/openaiCompatible.js +4 -4
  85. package/dist/lib/proxy/claudeFormat.d.ts +3 -2
  86. package/dist/lib/proxy/claudeFormat.js +27 -14
  87. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  88. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  89. package/dist/lib/proxy/modelRouter.js +3 -0
  90. package/dist/lib/proxy/oauthFetch.d.ts +1 -1
  91. package/dist/lib/proxy/oauthFetch.js +289 -316
  92. package/dist/lib/proxy/proxyConfig.js +46 -24
  93. package/dist/lib/proxy/proxyEnv.d.ts +19 -0
  94. package/dist/lib/proxy/proxyEnv.js +73 -0
  95. package/dist/lib/proxy/proxyFetch.js +291 -217
  96. package/dist/lib/proxy/proxyTracer.d.ts +133 -0
  97. package/dist/lib/proxy/proxyTracer.js +645 -0
  98. package/dist/lib/proxy/rawStreamCapture.d.ts +10 -0
  99. package/dist/lib/proxy/rawStreamCapture.js +83 -0
  100. package/dist/lib/proxy/requestLogger.d.ts +32 -5
  101. package/dist/lib/proxy/requestLogger.js +503 -47
  102. package/dist/lib/proxy/sseInterceptor.d.ts +97 -0
  103. package/dist/lib/proxy/sseInterceptor.js +427 -0
  104. package/dist/lib/proxy/usageStats.d.ts +4 -3
  105. package/dist/lib/proxy/usageStats.js +25 -12
  106. package/dist/lib/rag/chunkers/MarkdownChunker.js +13 -5
  107. package/dist/lib/rag/chunking/markdownChunker.js +15 -6
  108. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +17 -3
  109. package/dist/lib/server/routes/claudeProxyRoutes.js +3032 -1349
  110. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +7 -1
  111. package/dist/lib/services/server/ai/observability/instrumentation.js +337 -161
  112. package/dist/lib/tasks/backends/bullmqBackend.d.ts +1 -0
  113. package/dist/lib/tasks/backends/bullmqBackend.js +35 -22
  114. package/dist/lib/tasks/store/redisTaskStore.d.ts +1 -0
  115. package/dist/lib/tasks/store/redisTaskStore.js +54 -39
  116. package/dist/lib/tasks/taskManager.d.ts +5 -0
  117. package/dist/lib/tasks/taskManager.js +158 -30
  118. package/dist/lib/telemetry/index.d.ts +2 -1
  119. package/dist/lib/telemetry/index.js +2 -1
  120. package/dist/lib/telemetry/telemetryService.d.ts +3 -0
  121. package/dist/lib/telemetry/telemetryService.js +69 -5
  122. package/dist/lib/types/cli.d.ts +10 -0
  123. package/dist/lib/types/proxyTypes.d.ts +160 -5
  124. package/dist/lib/types/streamTypes.d.ts +25 -3
  125. package/dist/lib/utils/messageBuilder.js +3 -2
  126. package/dist/lib/utils/providerHealth.d.ts +19 -0
  127. package/dist/lib/utils/providerHealth.js +279 -33
  128. package/dist/lib/utils/providerUtils.js +17 -22
  129. package/dist/lib/utils/toolChoice.d.ts +4 -0
  130. package/dist/lib/utils/toolChoice.js +7 -0
  131. package/dist/mcp/toolRegistry.d.ts +2 -0
  132. package/dist/mcp/toolRegistry.js +32 -31
  133. package/dist/neurolink.d.ts +41 -2
  134. package/dist/neurolink.js +1616 -1681
  135. package/dist/observability/otelBridge.d.ts +2 -2
  136. package/dist/observability/otelBridge.js +12 -3
  137. package/dist/providers/amazonBedrock.js +2 -4
  138. package/dist/providers/anthropic.d.ts +9 -5
  139. package/dist/providers/anthropic.js +19 -14
  140. package/dist/providers/anthropicBaseProvider.d.ts +3 -3
  141. package/dist/providers/anthropicBaseProvider.js +5 -4
  142. package/dist/providers/azureOpenai.d.ts +1 -1
  143. package/dist/providers/azureOpenai.js +5 -4
  144. package/dist/providers/googleAiStudio.js +30 -6
  145. package/dist/providers/googleVertex.d.ts +10 -0
  146. package/dist/providers/googleVertex.js +437 -423
  147. package/dist/providers/huggingFace.d.ts +3 -3
  148. package/dist/providers/huggingFace.js +6 -7
  149. package/dist/providers/litellm.d.ts +1 -0
  150. package/dist/providers/litellm.js +76 -55
  151. package/dist/providers/mistral.js +2 -1
  152. package/dist/providers/ollama.js +93 -23
  153. package/dist/providers/openAI.d.ts +2 -0
  154. package/dist/providers/openAI.js +141 -141
  155. package/dist/providers/openRouter.js +2 -1
  156. package/dist/providers/openaiCompatible.d.ts +4 -4
  157. package/dist/providers/openaiCompatible.js +4 -3
  158. package/dist/proxy/claudeFormat.d.ts +3 -2
  159. package/dist/proxy/claudeFormat.js +27 -14
  160. package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  161. package/dist/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  162. package/dist/proxy/modelRouter.js +3 -0
  163. package/dist/proxy/oauthFetch.d.ts +1 -1
  164. package/dist/proxy/oauthFetch.js +289 -316
  165. package/dist/proxy/proxyConfig.js +46 -24
  166. package/dist/proxy/proxyEnv.d.ts +19 -0
  167. package/dist/proxy/proxyEnv.js +72 -0
  168. package/dist/proxy/proxyFetch.js +291 -217
  169. package/dist/proxy/proxyTracer.d.ts +133 -0
  170. package/dist/proxy/proxyTracer.js +644 -0
  171. package/dist/proxy/rawStreamCapture.d.ts +10 -0
  172. package/dist/proxy/rawStreamCapture.js +82 -0
  173. package/dist/proxy/requestLogger.d.ts +32 -5
  174. package/dist/proxy/requestLogger.js +503 -47
  175. package/dist/proxy/sseInterceptor.d.ts +97 -0
  176. package/dist/proxy/sseInterceptor.js +426 -0
  177. package/dist/proxy/usageStats.d.ts +4 -3
  178. package/dist/proxy/usageStats.js +25 -12
  179. package/dist/rag/chunkers/MarkdownChunker.js +13 -5
  180. package/dist/rag/chunking/markdownChunker.js +15 -6
  181. package/dist/server/routes/claudeProxyRoutes.d.ts +17 -3
  182. package/dist/server/routes/claudeProxyRoutes.js +3032 -1349
  183. package/dist/services/server/ai/observability/instrumentation.d.ts +7 -1
  184. package/dist/services/server/ai/observability/instrumentation.js +337 -161
  185. package/dist/tasks/backends/bullmqBackend.d.ts +1 -0
  186. package/dist/tasks/backends/bullmqBackend.js +35 -22
  187. package/dist/tasks/store/redisTaskStore.d.ts +1 -0
  188. package/dist/tasks/store/redisTaskStore.js +54 -39
  189. package/dist/tasks/taskManager.d.ts +5 -0
  190. package/dist/tasks/taskManager.js +158 -30
  191. package/dist/telemetry/index.d.ts +2 -1
  192. package/dist/telemetry/index.js +2 -1
  193. package/dist/telemetry/telemetryService.d.ts +3 -0
  194. package/dist/telemetry/telemetryService.js +69 -5
  195. package/dist/types/cli.d.ts +10 -0
  196. package/dist/types/proxyTypes.d.ts +160 -5
  197. package/dist/types/streamTypes.d.ts +25 -3
  198. package/dist/utils/messageBuilder.js +3 -2
  199. package/dist/utils/providerHealth.d.ts +19 -0
  200. package/dist/utils/providerHealth.js +279 -33
  201. package/dist/utils/providerUtils.js +18 -22
  202. package/dist/utils/toolChoice.d.ts +4 -0
  203. package/dist/utils/toolChoice.js +6 -0
  204. package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +6609 -0
  205. package/docs/changelog.md +252 -0
  206. package/package.json +19 -2
  207. package/scripts/observability/check-proxy-telemetry.mjs +235 -0
  208. package/scripts/observability/docker-compose.proxy-observability.yaml +55 -0
  209. package/scripts/observability/import-openobserve-dashboard.mjs +240 -0
  210. package/scripts/observability/manage-local-openobserve.sh +215 -0
  211. package/scripts/observability/otel-collector.proxy-observability.yaml +78 -0
  212. package/scripts/observability/proxy-observability.env.example +23 -0
@@ -198,33 +198,47 @@ export function validateProxyConfig(config) {
198
198
  if (cfg.version !== undefined && typeof cfg.version !== "number") {
199
199
  errors.push(`"version" must be a number, got ${typeof cfg.version}`);
200
200
  }
201
- if (!cfg.accounts ||
202
- typeof cfg.accounts !== "object" ||
203
- Array.isArray(cfg.accounts)) {
201
+ const hasAccounts = !!cfg.accounts &&
202
+ typeof cfg.accounts === "object" &&
203
+ !Array.isArray(cfg.accounts);
204
+ const hasRouting = !!cfg.routing &&
205
+ typeof cfg.routing === "object" &&
206
+ !Array.isArray(cfg.routing);
207
+ if (cfg.routing !== undefined && !hasRouting) {
208
+ errors.push('"routing" must be an object');
209
+ return errors;
210
+ }
211
+ if (!hasAccounts && !hasRouting) {
212
+ errors.push('Config must contain at least one of "accounts" or "routing"');
213
+ return errors;
214
+ }
215
+ if (cfg.accounts !== undefined && !hasAccounts) {
204
216
  errors.push('"accounts" must be an object mapping provider names to account arrays');
205
217
  return errors;
206
218
  }
207
- const accounts = cfg.accounts;
208
- let totalAccounts = 0;
209
- for (const [provider, list] of Object.entries(accounts)) {
210
- if (!Array.isArray(list)) {
211
- errors.push(`accounts.${provider} must be an array, got ${typeof list}`);
212
- continue;
213
- }
214
- totalAccounts += list.length;
215
- for (let i = 0; i < list.length; i++) {
216
- const acct = list[i];
217
- if (!acct || typeof acct !== "object") {
218
- errors.push(`accounts.${provider}[${i}] must be an object`);
219
+ if (hasAccounts) {
220
+ const accounts = cfg.accounts;
221
+ let totalAccounts = 0;
222
+ for (const [provider, list] of Object.entries(accounts)) {
223
+ if (!Array.isArray(list)) {
224
+ errors.push(`accounts.${provider} must be an array, got ${typeof list}`);
219
225
  continue;
220
226
  }
221
- if (typeof acct.apiKey !== "string" || acct.apiKey.length === 0) {
222
- errors.push(`accounts.${provider}[${i}].apiKey is required and must be a non-empty string`);
227
+ totalAccounts += list.length;
228
+ for (let i = 0; i < list.length; i++) {
229
+ const acct = list[i];
230
+ if (!acct || typeof acct !== "object") {
231
+ errors.push(`accounts.${provider}[${i}] must be an object`);
232
+ continue;
233
+ }
234
+ if (typeof acct.apiKey !== "string" || acct.apiKey.length === 0) {
235
+ errors.push(`accounts.${provider}[${i}].apiKey is required and must be a non-empty string`);
236
+ }
223
237
  }
224
238
  }
225
- }
226
- if (totalAccounts === 0) {
227
- errors.push('"accounts" must contain at least one account');
239
+ if (totalAccounts === 0 && !hasRouting) {
240
+ errors.push('"accounts" must contain at least one account');
241
+ }
228
242
  }
229
243
  return errors;
230
244
  }
@@ -422,8 +436,12 @@ export async function loadProxyConfig(filePath, options = {}) {
422
436
  const raw = parsed;
423
437
  const accounts = {};
424
438
  const rawAccounts = raw.accounts;
425
- for (const [provider, list] of Object.entries(rawAccounts)) {
426
- accounts[provider] = list.map((item) => applyAccountDefaults(item));
439
+ if (rawAccounts &&
440
+ typeof rawAccounts === "object" &&
441
+ !Array.isArray(rawAccounts)) {
442
+ for (const [provider, list] of Object.entries(rawAccounts)) {
443
+ accounts[provider] = list.map((item) => applyAccountDefaults(item));
444
+ }
427
445
  }
428
446
  // 7. Extract routing config
429
447
  const routing = parseRoutingConfig(raw.routing);
@@ -483,8 +501,12 @@ export async function parseProxyConfigString(content, options = {}) {
483
501
  const raw = parsed;
484
502
  const accounts = {};
485
503
  const rawAccounts = raw.accounts;
486
- for (const [provider, list] of Object.entries(rawAccounts)) {
487
- accounts[provider] = list.map((item) => applyAccountDefaults(item));
504
+ if (rawAccounts &&
505
+ typeof rawAccounts === "object" &&
506
+ !Array.isArray(rawAccounts)) {
507
+ for (const [provider, list] of Object.entries(rawAccounts)) {
508
+ accounts[provider] = list.map((item) => applyAccountDefaults(item));
509
+ }
488
510
  }
489
511
  const routing = parseRoutingConfig(raw.routing);
490
512
  const cloaking = validateCloakingConfig(raw.cloaking);
@@ -0,0 +1,19 @@
1
+ export type ProxyEnvSource = "cli" | "environment" | "default" | "none";
2
+ export type ProxyEnvResolution = {
3
+ path?: string;
4
+ source: ProxyEnvSource;
5
+ required: boolean;
6
+ };
7
+ export type ProxyEnvLoadResult = {
8
+ loaded: boolean;
9
+ path?: string;
10
+ source: ProxyEnvSource;
11
+ };
12
+ type ProxyEnvOptions = {
13
+ explicitEnvFile?: string;
14
+ env?: NodeJS.ProcessEnv;
15
+ homeDir?: string;
16
+ };
17
+ export declare function resolveProxyEnvFile(options?: ProxyEnvOptions): ProxyEnvResolution;
18
+ export declare function loadProxyEnvFile(options?: ProxyEnvOptions): Promise<ProxyEnvLoadResult>;
19
+ export {};
@@ -0,0 +1,72 @@
1
+ import { existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { resolve } from "node:path";
4
+ export function resolveProxyEnvFile(options = {}) {
5
+ const env = options.env ?? process.env;
6
+ const homeDir = options.homeDir ?? homedir();
7
+ if (options.explicitEnvFile?.trim()) {
8
+ return {
9
+ path: resolve(options.explicitEnvFile.trim()),
10
+ source: "cli",
11
+ required: true,
12
+ };
13
+ }
14
+ if (env.NEUROLINK_ENV_FILE?.trim()) {
15
+ return {
16
+ path: resolve(env.NEUROLINK_ENV_FILE.trim()),
17
+ source: "environment",
18
+ required: true,
19
+ };
20
+ }
21
+ const defaultPath = resolve(homeDir, ".neurolink", ".env");
22
+ if (existsSync(defaultPath)) {
23
+ return {
24
+ path: defaultPath,
25
+ source: "default",
26
+ required: false,
27
+ };
28
+ }
29
+ return {
30
+ source: "none",
31
+ required: false,
32
+ };
33
+ }
34
+ export async function loadProxyEnvFile(options = {}) {
35
+ const resolution = resolveProxyEnvFile(options);
36
+ const env = options.env ?? process.env;
37
+ if (!resolution.path) {
38
+ return {
39
+ loaded: false,
40
+ source: "none",
41
+ };
42
+ }
43
+ if (!existsSync(resolution.path)) {
44
+ if (resolution.required) {
45
+ throw new Error(`Proxy env file not found: ${resolution.path}`);
46
+ }
47
+ return {
48
+ loaded: false,
49
+ source: resolution.source,
50
+ };
51
+ }
52
+ try {
53
+ const { config } = await import("dotenv");
54
+ const result = config({
55
+ path: resolution.path,
56
+ override: true,
57
+ quiet: true,
58
+ });
59
+ if (result.error) {
60
+ throw result.error;
61
+ }
62
+ }
63
+ catch (error) {
64
+ throw new Error(`Failed to load proxy env file ${resolution.path}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
65
+ }
66
+ env.NEUROLINK_ENV_FILE = resolution.path;
67
+ return {
68
+ loaded: true,
69
+ path: resolution.path,
70
+ source: resolution.source,
71
+ };
72
+ }