@juspay/neurolink 13.8.17 → 13.8.19

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 (214) hide show
  1. package/CHANGELOG.md +5 -2
  2. package/README.md +1 -1
  3. package/dist/action/actionExecutor.d.ts +33 -3
  4. package/dist/action/actionExecutor.js +71 -15
  5. package/dist/action/actionInputs.js +4 -1
  6. package/dist/action/cliVersion.d.ts +25 -0
  7. package/dist/action/cliVersion.js +26 -0
  8. package/dist/action/index.d.ts +2 -1
  9. package/dist/action/index.js +2 -1
  10. package/dist/adapters/video/directorPipeline.js +46 -36
  11. package/dist/adapters/video/ffmpegAdapter.d.ts +17 -0
  12. package/dist/adapters/video/ffmpegAdapter.js +32 -5
  13. package/dist/adapters/video/frameExtractor.js +1 -1
  14. package/dist/adapters/video/videoMerger.js +5 -2
  15. package/dist/agent/arithmeticEvaluator.d.ts +32 -0
  16. package/dist/agent/arithmeticEvaluator.js +349 -0
  17. package/dist/agent/directTools.d.ts +6 -18
  18. package/dist/agent/directTools.js +17 -56
  19. package/dist/artifacts/artifactStore.d.ts +22 -1
  20. package/dist/artifacts/artifactStore.js +66 -6
  21. package/dist/auth/anthropicOAuth.d.ts +26 -1
  22. package/dist/auth/anthropicOAuth.js +81 -5
  23. package/dist/auth/secureFiles.d.ts +37 -0
  24. package/dist/auth/secureFiles.js +95 -0
  25. package/dist/auth/tokenStore.d.ts +43 -6
  26. package/dist/auth/tokenStore.js +260 -79
  27. package/dist/avatar/providers/DIDAvatar.js +49 -45
  28. package/dist/avatar/providers/ReplicateAvatar.js +33 -40
  29. package/dist/browser/neurolink.min.js +485 -558
  30. package/dist/cli/commands/auth.js +112 -70
  31. package/dist/cli/commands/proxy.d.ts +4 -0
  32. package/dist/cli/commands/proxy.js +128 -13
  33. package/dist/cli/commands/serve.d.ts +10 -1
  34. package/dist/cli/commands/serve.js +98 -17
  35. package/dist/cli/commands/server.js +17 -5
  36. package/dist/cli/index.js +146 -5
  37. package/dist/cli/loop/optionsSchema.d.ts +1 -1
  38. package/dist/cli/utils/envManager.js +17 -3
  39. package/dist/cli/utils/serverUtils.d.ts +39 -3
  40. package/dist/cli/utils/serverUtils.js +63 -6
  41. package/dist/core/baseProvider.js +7 -1
  42. package/dist/core/modules/MessageBuilder.js +5 -0
  43. package/dist/core/modules/ToolsManager.d.ts +46 -1
  44. package/dist/core/modules/ToolsManager.js +190 -43
  45. package/dist/files/fileReferenceRegistry.d.ts +2 -23
  46. package/dist/files/fileReferenceRegistry.js +55 -5
  47. package/dist/hitl/hitlManager.js +1 -0
  48. package/dist/index.d.ts +2 -1
  49. package/dist/index.js +6 -1
  50. package/dist/mcp/auth/tokenStorage.d.ts +7 -0
  51. package/dist/mcp/auth/tokenStorage.js +23 -4
  52. package/dist/mcp/externalServerManager.d.ts +13 -3
  53. package/dist/mcp/externalServerManager.js +154 -136
  54. package/dist/mcp/index.d.ts +2 -0
  55. package/dist/mcp/index.js +3 -0
  56. package/dist/mcp/mcpClientFactory.d.ts +14 -0
  57. package/dist/mcp/mcpClientFactory.js +70 -7
  58. package/dist/mcp/projectConfigTrust.d.ts +72 -0
  59. package/dist/mcp/projectConfigTrust.js +237 -0
  60. package/dist/mcp/transportUrlPolicy.d.ts +39 -0
  61. package/dist/mcp/transportUrlPolicy.js +172 -0
  62. package/dist/music/providers/BeatovenMusic.js +35 -46
  63. package/dist/music/providers/ReplicateMusic.js +33 -40
  64. package/dist/neurolink.d.ts +16 -1
  65. package/dist/neurolink.js +64 -11
  66. package/dist/processors/archive/ArchiveProcessor.js +15 -1
  67. package/dist/processors/archive/zipEntryIndex.d.ts +22 -0
  68. package/dist/processors/archive/zipEntryIndex.js +33 -0
  69. package/dist/processors/base/BaseFileProcessor.d.ts +9 -21
  70. package/dist/processors/base/BaseFileProcessor.js +40 -111
  71. package/dist/processors/data/YamlProcessor.d.ts +13 -1
  72. package/dist/processors/data/YamlProcessor.js +93 -2
  73. package/dist/processors/document/OpenDocumentProcessor.js +7 -2
  74. package/dist/processors/document/PptxProcessor.js +12 -7
  75. package/dist/processors/media/VideoProcessor.js +93 -15
  76. package/dist/providers/openaiChatCompletionsClient.js +12 -3
  77. package/dist/proxy/accountLedger.js +6 -8
  78. package/dist/proxy/geminiFormat.d.ts +3 -11
  79. package/dist/proxy/geminiFormat.js +11 -2
  80. package/dist/proxy/inboundAuth.d.ts +89 -0
  81. package/dist/proxy/inboundAuth.js +219 -0
  82. package/dist/proxy/openaiFormat.d.ts +3 -9
  83. package/dist/proxy/openaiFormat.js +21 -15
  84. package/dist/proxy/proxyTranslationEngine.d.ts +2 -6
  85. package/dist/proxy/proxyTranslationEngine.js +25 -14
  86. package/dist/proxy/routingPolicy.d.ts +3 -1
  87. package/dist/proxy/routingPolicy.js +7 -8
  88. package/dist/proxy/tokenRefresh.d.ts +6 -0
  89. package/dist/proxy/tokenRefresh.js +13 -1
  90. package/dist/proxy/updateState.js +4 -4
  91. package/dist/rag/document/loaders.d.ts +0 -6
  92. package/dist/rag/document/loaders.js +16 -10
  93. package/dist/rag/ragIntegration.d.ts +2 -2
  94. package/dist/rag/ragIntegration.js +35 -10
  95. package/dist/rag/retrieval/vectorQueryTool.d.ts +7 -0
  96. package/dist/rag/retrieval/vectorQueryTool.js +54 -17
  97. package/dist/server/abstract/baseServerAdapter.d.ts +43 -0
  98. package/dist/server/abstract/baseServerAdapter.js +119 -6
  99. package/dist/server/adapters/expressAdapter.d.ts +3 -0
  100. package/dist/server/adapters/expressAdapter.js +78 -6
  101. package/dist/server/adapters/fastifyAdapter.d.ts +3 -0
  102. package/dist/server/adapters/fastifyAdapter.js +165 -70
  103. package/dist/server/adapters/honoAdapter.d.ts +9 -1
  104. package/dist/server/adapters/honoAdapter.js +99 -21
  105. package/dist/server/adapters/koaAdapter.d.ts +1 -0
  106. package/dist/server/adapters/koaAdapter.js +153 -74
  107. package/dist/server/index.d.ts +2 -0
  108. package/dist/server/index.js +4 -0
  109. package/dist/server/middleware/auth.js +6 -2
  110. package/dist/server/middleware/cache.js +6 -1
  111. package/dist/server/middleware/rateLimit.js +29 -4
  112. package/dist/server/routes/agentRoutes.js +24 -11
  113. package/dist/server/routes/claudeProxyRoutes.d.ts +1 -0
  114. package/dist/server/routes/claudeProxyRoutes.js +273 -84
  115. package/dist/server/routes/codexProxyRoutes.d.ts +2 -2
  116. package/dist/server/routes/codexProxyRoutes.js +125 -40
  117. package/dist/server/routes/index.d.ts +4 -0
  118. package/dist/server/routes/index.js +35 -4
  119. package/dist/server/routes/mcpRoutes.d.ts +6 -2
  120. package/dist/server/routes/mcpRoutes.js +21 -7
  121. package/dist/server/routes/memoryRoutes.js +7 -6
  122. package/dist/server/routes/toolRoutes.d.ts +12 -2
  123. package/dist/server/routes/toolRoutes.js +33 -3
  124. package/dist/server/routes/transcribeRoutes.js +60 -13
  125. package/dist/server/utils/clientAddress.d.ts +23 -0
  126. package/dist/server/utils/clientAddress.js +65 -0
  127. package/dist/server/utils/clientError.d.ts +35 -0
  128. package/dist/server/utils/clientError.js +129 -0
  129. package/dist/server/utils/pathMatch.d.ts +21 -0
  130. package/dist/server/utils/pathMatch.js +41 -0
  131. package/dist/server/utils/validation.d.ts +9 -0
  132. package/dist/server/utils/validation.js +9 -0
  133. package/dist/server/websocket/WebSocketHandler.js +22 -3
  134. package/dist/server/websocket/frameQueue.d.ts +19 -0
  135. package/dist/server/websocket/frameQueue.js +41 -3
  136. package/dist/server/websocket/transcribeWebSocket.d.ts +8 -1
  137. package/dist/server/websocket/transcribeWebSocket.js +223 -34
  138. package/dist/skills/skillStores.js +5 -0
  139. package/dist/tasks/store/fileTaskStore.d.ts +2 -0
  140. package/dist/tasks/store/fileTaskStore.js +11 -4
  141. package/dist/types/attachments.d.ts +117 -0
  142. package/dist/types/attachments.js +15 -0
  143. package/dist/types/auth.d.ts +6 -0
  144. package/dist/types/cli.d.ts +4 -0
  145. package/dist/types/config.d.ts +56 -0
  146. package/dist/types/file.d.ts +8 -0
  147. package/dist/types/hitl.d.ts +8 -0
  148. package/dist/types/index.d.ts +1 -0
  149. package/dist/types/index.js +1 -0
  150. package/dist/types/mcp.d.ts +98 -0
  151. package/dist/types/multimodal.js +0 -41
  152. package/dist/types/openaiCompatible.d.ts +1 -1
  153. package/dist/types/processor.d.ts +14 -1
  154. package/dist/types/proxy.d.ts +71 -16
  155. package/dist/types/proxyClient.d.ts +2 -0
  156. package/dist/types/rag.d.ts +9 -0
  157. package/dist/types/safeFetch.d.ts +40 -0
  158. package/dist/types/server.d.ts +206 -10
  159. package/dist/types/tools.d.ts +57 -0
  160. package/dist/types/transcribe.d.ts +6 -0
  161. package/dist/utils/attachmentPolicy.d.ts +89 -0
  162. package/dist/utils/attachmentPolicy.js +327 -0
  163. package/dist/utils/dotenvBootstrap.d.ts +48 -19
  164. package/dist/utils/dotenvBootstrap.js +172 -31
  165. package/dist/utils/fileDetector.js +115 -65
  166. package/dist/utils/json/coerce.js +11 -1
  167. package/dist/utils/logSanitize.d.ts +5 -0
  168. package/dist/utils/logSanitize.js +8 -0
  169. package/dist/utils/logger.js +73 -1
  170. package/dist/utils/messageBuilder.d.ts +2 -2
  171. package/dist/utils/messageBuilder.js +118 -105
  172. package/dist/utils/multimodalOptionsBuilder.d.ts +1 -0
  173. package/dist/utils/multimodalOptionsBuilder.js +2 -0
  174. package/dist/utils/redis.d.ts +12 -0
  175. package/dist/utils/redis.js +72 -0
  176. package/dist/utils/retryAfter.d.ts +32 -0
  177. package/dist/utils/retryAfter.js +135 -11
  178. package/dist/utils/safeFetch.d.ts +22 -1
  179. package/dist/utils/safeFetch.js +132 -38
  180. package/dist/utils/safeStoreId.d.ts +19 -0
  181. package/dist/utils/safeStoreId.js +29 -0
  182. package/dist/utils/schemaConversion.d.ts +30 -3
  183. package/dist/utils/schemaConversion.js +457 -84
  184. package/dist/utils/sizeGuard.js +2 -2
  185. package/dist/utils/ssrfGuard.d.ts +3 -3
  186. package/dist/utils/ssrfGuard.js +71 -39
  187. package/dist/voice/eval/sttEvalStore.d.ts +26 -3
  188. package/dist/voice/eval/sttEvalStore.js +77 -12
  189. package/dist/voice/livekit/agentDefinition.d.ts +18 -0
  190. package/dist/voice/livekit/agentDefinition.js +22 -0
  191. package/dist/voice/livekit/realtimeMcpTools.d.ts +1 -1
  192. package/dist/voice/livekit/realtimeMcpTools.js +8 -7
  193. package/dist/voice/livekit/realtimeVoiceAgent.d.ts +2 -4
  194. package/dist/voice/livekit/realtimeVoiceAgent.js +18 -7
  195. package/dist/voice/livekit/voiceAgent.d.ts +2 -2
  196. package/dist/voice/livekit/voiceAgent.js +2 -1
  197. package/dist/voice/livekit/xaiSessionWatch.d.ts +0 -5
  198. package/dist/voice/livekit/xaiSessionWatch.js +30 -0
  199. package/dist/voice/providers/GeminiLive.js +21 -6
  200. package/dist/voice/providers/GoogleSTT.js +8 -5
  201. package/dist/voice/transcribe.d.ts +2 -2
  202. package/dist/voice/transcribe.js +34 -18
  203. package/dist/voice/whistle/audio.js +11 -5
  204. package/dist/workflow/workflows/adaptiveWorkflow.d.ts +2 -2
  205. package/dist/workflow/workflows/adaptiveWorkflow.js +10 -10
  206. package/dist/workflow/workflows/consensusWorkflow.d.ts +4 -4
  207. package/dist/workflow/workflows/consensusWorkflow.js +12 -12
  208. package/dist/workflow/workflows/fallbackWorkflow.d.ts +3 -3
  209. package/dist/workflow/workflows/fallbackWorkflow.js +7 -7
  210. package/dist/workflow/workflows/multiJudgeWorkflow.d.ts +7 -7
  211. package/dist/workflow/workflows/multiJudgeWorkflow.js +31 -31
  212. package/docs-site/static/search-index.json +74 -52
  213. package/package.json +173 -156
  214. package/scripts/observability/import-openobserve-dashboard.mjs +11 -3
@@ -2,6 +2,7 @@
2
2
  * Rate Limiting Middleware
3
3
  * Provides configurable rate limiting for server adapters
4
4
  */
5
+ import { logger } from "../../utils/logger.js";
5
6
  import { RateLimitError as ServerRateLimitError } from "../errors.js";
6
7
  /**
7
8
  * In-memory rate limit store
@@ -86,6 +87,9 @@ export function createRateLimitMiddleware(config) {
86
87
  excludePaths: skipPaths,
87
88
  handler: async (ctx, next) => {
88
89
  const key = keyGenerator(ctx);
90
+ if (!key) {
91
+ return next(); // Nothing to attribute the request to: see defaultKeyGenerator.
92
+ }
89
93
  const { count, resetAt } = await store.increment(key, windowMs);
90
94
  // Set rate limit headers in responseHeaders (adapters read from here)
91
95
  ctx.responseHeaders = ctx.responseHeaders || {};
@@ -107,12 +111,27 @@ export function createRateLimitMiddleware(config) {
107
111
  };
108
112
  }
109
113
  /**
110
- * Default key generator using IP address
114
+ * Default key: the TCP peer the adapter recorded on the context. Never a
115
+ * header, which the client writes: keyed on `X-Forwarded-For`, one shared
116
+ * bucket served every direct client and a rotating header escaped the limit.
117
+ * Behind a reverse proxy, pass a `keyGenerator` that reads the proxy's header
118
+ * (see `resolveClientAddress`). An empty key means "do not count".
111
119
  */
112
120
  function defaultKeyGenerator(ctx) {
113
- return (ctx.headers["x-forwarded-for"]?.split(",")[0].trim() ||
114
- ctx.headers["x-real-ip"] ||
115
- "unknown");
121
+ const address = ctx.remoteAddress?.trim();
122
+ if (!address) {
123
+ warnNoAddressOnce();
124
+ return "";
125
+ }
126
+ return address;
127
+ }
128
+ let warnedNoAddress = false;
129
+ function warnNoAddressOnce() {
130
+ if (warnedNoAddress) {
131
+ return;
132
+ }
133
+ warnedNoAddress = true;
134
+ logger.alwaysStderr("[rateLimit] A request carried no peer address (ctx.remoteAddress), so the rate limiter let it through uncounted; pass a keyGenerator to limit by another key.");
116
135
  }
117
136
  /**
118
137
  * Create a sliding window rate limiter
@@ -142,6 +161,9 @@ export function createSlidingWindowRateLimitMiddleware(config) {
142
161
  excludePaths: skipPaths,
143
162
  handler: async (ctx, next) => {
144
163
  const key = keyGenerator(ctx);
164
+ if (!key) {
165
+ return next();
166
+ }
145
167
  const now = Date.now();
146
168
  // Get existing timestamps and filter old ones
147
169
  let timestamps = store.get(key) || [];
@@ -201,6 +223,9 @@ export function createFixedWindowRateLimitMiddleware(config, store) {
201
223
  excludePaths: skipPaths,
202
224
  handler: async (ctx, next) => {
203
225
  const key = keyGenerator(ctx);
226
+ if (!key) {
227
+ return next();
228
+ }
204
229
  const { count, resetAt } = await rateLimitStore.increment(key, windowMs);
205
230
  // Set rate limit headers in responseHeaders (adapters read from here)
206
231
  ctx.responseHeaders = ctx.responseHeaders || {};
@@ -29,7 +29,13 @@ async function resolveRequestToolFilter(ctx, requestedTools) {
29
29
  return undefined;
30
30
  }
31
31
  import { AgentInputError, resolveAgentInput } from "../utils/agentInput.js";
32
+ import { shapeRouteError } from "../utils/clientError.js";
32
33
  import { createStreamRedactor } from "../utils/redaction.js";
34
+ /** The route's error response for an exception: a fixed message, the detail logged. */
35
+ function agentFailure(ctx, error, code = "EXECUTION_FAILED") {
36
+ const shaped = shapeRouteError("agentRoutes", ctx.requestId, error);
37
+ return createError(shaped.status === 500 ? code : shaped.code, shaped.message, undefined, ctx.requestId, shaped.status);
38
+ }
33
39
  import { AgentExecuteRequestSchema, createErrorResponse as createError, EmbedManyRequestSchema, EmbedRequestSchema, SkillCreateRequestSchema, SkillUpdateRequestSchema, validateRequest, } from "../utils/validation.js";
34
40
  /**
35
41
  * Resolve the skills manager from the server's NeuroLink instance, or a
@@ -244,6 +250,9 @@ export function createAgentRoutes(basePath = "/api", options) {
244
250
  return input;
245
251
  }
246
252
  const requestToolFilter = await resolveRequestToolFilter(ctx, request.tools);
253
+ // The adapter's signal: the client went away, or the request
254
+ // ran past the server's timeout. Either stops the generation
255
+ // instead of leaving it running for nobody.
247
256
  const result = await ctx.neurolink.generate({
248
257
  input,
249
258
  provider: request.provider,
@@ -252,6 +261,7 @@ export function createAgentRoutes(basePath = "/api", options) {
252
261
  temperature: request.temperature,
253
262
  maxTokens: request.maxTokens,
254
263
  ...(requestToolFilter ? { toolFilter: requestToolFilter } : {}),
264
+ ...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}),
255
265
  context: callerContext(ctx, request),
256
266
  });
257
267
  // Map tool calls from SDK format to API format
@@ -295,6 +305,7 @@ export function createAgentRoutes(basePath = "/api", options) {
295
305
  temperature: request.temperature,
296
306
  maxTokens: request.maxTokens,
297
307
  ...(streamToolFilter ? { toolFilter: streamToolFilter } : {}),
308
+ ...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}),
298
309
  context: callerContext(ctx, request),
299
310
  });
300
311
  // Create redactor (no-op if redaction is not enabled)
@@ -377,9 +388,7 @@ export function createAgentRoutes(basePath = "/api", options) {
377
388
  });
378
389
  }
379
390
  catch (error) {
380
- return createError("EXECUTION_FAILED", error instanceof Error
381
- ? error.message
382
- : "Embedding generation failed", undefined, ctx.requestId);
391
+ return agentFailure(ctx, error);
383
392
  }
384
393
  },
385
394
  description: "Generate embedding for a single text",
@@ -418,9 +427,7 @@ export function createAgentRoutes(basePath = "/api", options) {
418
427
  });
419
428
  }
420
429
  catch (error) {
421
- return createError("EXECUTION_FAILED", error instanceof Error
422
- ? error.message
423
- : "Batch embedding generation failed", undefined, ctx.requestId);
430
+ return agentFailure(ctx, error);
424
431
  }
425
432
  },
426
433
  description: "Generate embeddings for multiple texts in a batch",
@@ -439,7 +446,7 @@ export function createAgentRoutes(basePath = "/api", options) {
439
446
  return { skills, count: skills.length };
440
447
  }
441
448
  catch (error) {
442
- return createError("EXECUTION_FAILED", error instanceof Error ? error.message : "Skills listing failed", undefined, ctx.requestId);
449
+ return agentFailure(ctx, error);
443
450
  }
444
451
  },
445
452
  description: "List active skills (index only — no instructions). Optional ?scopeId= filter.",
@@ -461,7 +468,7 @@ export function createAgentRoutes(basePath = "/api", options) {
461
468
  return skill;
462
469
  }
463
470
  catch (error) {
464
- return createError("EXECUTION_FAILED", error instanceof Error ? error.message : "Skill lookup failed", undefined, ctx.requestId);
471
+ return agentFailure(ctx, error);
465
472
  }
466
473
  },
467
474
  description: "Fetch one skill (by id or exact name) with instructions",
@@ -490,7 +497,7 @@ export function createAgentRoutes(basePath = "/api", options) {
490
497
  return result;
491
498
  }
492
499
  catch (error) {
493
- return createError("EXECUTION_FAILED", error instanceof Error ? error.message : "Skill create failed", undefined, ctx.requestId);
500
+ return agentFailure(ctx, error);
494
501
  }
495
502
  },
496
503
  description: "Create a skill (routed through the host's onMutationRequest gate when configured)",
@@ -520,8 +527,12 @@ export function createAgentRoutes(basePath = "/api", options) {
520
527
  return result;
521
528
  }
522
529
  catch (error) {
530
+ // "not found" is this server's own wording for an unknown id, so
531
+ // it may be said; anything else is reduced to its category.
523
532
  const message = error instanceof Error ? error.message : "Skill update failed";
524
- return createError(message.includes("not found") ? "NOT_FOUND" : "EXECUTION_FAILED", message, undefined, ctx.requestId);
533
+ return message.includes("not found")
534
+ ? createError("NOT_FOUND", `Skill "${ctx.params.id}" not found`, undefined, ctx.requestId)
535
+ : agentFailure(ctx, error);
525
536
  }
526
537
  },
527
538
  description: "Update a skill (patch semantics; version is bumped)",
@@ -546,7 +557,9 @@ export function createAgentRoutes(basePath = "/api", options) {
546
557
  }
547
558
  catch (error) {
548
559
  const message = error instanceof Error ? error.message : "Skill delete failed";
549
- return createError(message.includes("not found") ? "NOT_FOUND" : "EXECUTION_FAILED", message, undefined, ctx.requestId);
560
+ return message.includes("not found")
561
+ ? createError("NOT_FOUND", `Skill "${ctx.params.id}" not found`, undefined, ctx.requestId)
562
+ : agentFailure(ctx, error);
550
563
  }
551
564
  },
552
565
  description: "Soft-delete (deprecate) a skill",
@@ -385,6 +385,7 @@ declare function handleAnthropicNonOkResponse(args: {
385
385
  } | null;
386
386
  entitlementFailure: AnthropicEntitlementFailure | null;
387
387
  allowConfiguredModelFallback?: boolean;
388
+ clientSuppliedBetaForwarded?: boolean;
388
389
  }): Promise<AnthropicNonOkResult>;
389
390
  /**
390
391
  * Detect Anthropic's anti-abuse / request-construction 429.