@juspay/neurolink 12.48.1 → 12.49.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 (107) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/dist/browser/neurolink.min.js +616 -595
  3. package/dist/cli/commands/serve.d.ts +5 -3
  4. package/dist/cli/commands/serve.js +113 -20
  5. package/dist/cli/commands/server.js +13 -6
  6. package/dist/cli/commands/transcribe.d.ts +24 -0
  7. package/dist/cli/commands/transcribe.js +718 -0
  8. package/dist/cli/factories/commandFactory.d.ts +10 -0
  9. package/dist/cli/factories/commandFactory.js +13 -0
  10. package/dist/cli/parser.js +3 -0
  11. package/dist/cli/utils/serverUtils.d.ts +28 -0
  12. package/dist/cli/utils/serverUtils.js +71 -0
  13. package/dist/factories/mediaHandlerCatalog.js +11 -9
  14. package/dist/factories/sttDescriptors.d.ts +63 -0
  15. package/dist/factories/sttDescriptors.js +286 -0
  16. package/dist/index.d.ts +4 -1
  17. package/dist/index.js +7 -1
  18. package/dist/neurolink.d.ts +68 -1
  19. package/dist/neurolink.js +202 -4
  20. package/dist/processors/media/AudioProcessor.d.ts +15 -56
  21. package/dist/processors/media/AudioProcessor.js +105 -276
  22. package/dist/processors/media/VideoProcessor.d.ts +3 -5
  23. package/dist/processors/media/VideoProcessor.js +52 -51
  24. package/dist/server/abstract/baseServerAdapter.d.ts +28 -1
  25. package/dist/server/abstract/baseServerAdapter.js +84 -4
  26. package/dist/server/adapters/expressAdapter.d.ts +1 -0
  27. package/dist/server/adapters/expressAdapter.js +50 -10
  28. package/dist/server/adapters/fastifyAdapter.d.ts +1 -0
  29. package/dist/server/adapters/fastifyAdapter.js +51 -8
  30. package/dist/server/adapters/honoAdapter.d.ts +1 -4
  31. package/dist/server/adapters/honoAdapter.js +95 -8
  32. package/dist/server/adapters/koaAdapter.d.ts +7 -0
  33. package/dist/server/adapters/koaAdapter.js +71 -10
  34. package/dist/server/index.d.ts +3 -2
  35. package/dist/server/index.js +3 -2
  36. package/dist/server/routes/index.d.ts +1 -0
  37. package/dist/server/routes/index.js +3 -0
  38. package/dist/server/routes/transcribeRoutes.d.ts +23 -0
  39. package/dist/server/routes/transcribeRoutes.js +506 -0
  40. package/dist/server/utils/rawBody.d.ts +32 -0
  41. package/dist/server/utils/rawBody.js +76 -0
  42. package/dist/server/utils/validation.d.ts +192 -0
  43. package/dist/server/utils/validation.js +100 -0
  44. package/dist/server/websocket/transcribeWebSocket.d.ts +42 -0
  45. package/dist/server/websocket/transcribeWebSocket.js +264 -0
  46. package/dist/types/cli.d.ts +47 -0
  47. package/dist/types/index.d.ts +1 -0
  48. package/dist/types/index.js +1 -0
  49. package/dist/types/providers.d.ts +7 -1
  50. package/dist/types/server.d.ts +117 -1
  51. package/dist/types/stt.d.ts +160 -7
  52. package/dist/types/transcribe.d.ts +506 -0
  53. package/dist/types/transcribe.js +29 -0
  54. package/dist/utils/speakerTurns.d.ts +28 -0
  55. package/dist/utils/speakerTurns.js +93 -0
  56. package/dist/utils/sttProcessor.d.ts +20 -2
  57. package/dist/utils/sttProcessor.js +73 -5
  58. package/dist/voice/correction/dictionary.d.ts +49 -0
  59. package/dist/voice/correction/dictionary.js +134 -0
  60. package/dist/voice/correction/guard.d.ts +35 -0
  61. package/dist/voice/correction/guard.js +161 -0
  62. package/dist/voice/correction/index.d.ts +47 -0
  63. package/dist/voice/correction/index.js +211 -0
  64. package/dist/voice/correction/rewrite.d.ts +92 -0
  65. package/dist/voice/correction/rewrite.js +322 -0
  66. package/dist/voice/errors.d.ts +15 -0
  67. package/dist/voice/errors.js +45 -0
  68. package/dist/voice/index.d.ts +20 -2
  69. package/dist/voice/index.js +75 -9
  70. package/dist/voice/providers/AzureSTT.d.ts +10 -7
  71. package/dist/voice/providers/AzureSTT.js +23 -75
  72. package/dist/voice/providers/DeepgramSTT.d.ts +17 -2
  73. package/dist/voice/providers/DeepgramSTT.js +109 -13
  74. package/dist/voice/providers/ElevenLabsSTT.d.ts +12 -2
  75. package/dist/voice/providers/ElevenLabsSTT.js +34 -8
  76. package/dist/voice/providers/GoogleSTT.d.ts +10 -8
  77. package/dist/voice/providers/GoogleSTT.js +21 -75
  78. package/dist/voice/providers/OpenAISTT.d.ts +30 -9
  79. package/dist/voice/providers/OpenAISTT.js +196 -21
  80. package/dist/voice/providers/WhistleSTT.d.ts +87 -0
  81. package/dist/voice/providers/WhistleSTT.js +313 -0
  82. package/dist/voice/streaming/chunkedStreamAdapter.d.ts +19 -0
  83. package/dist/voice/streaming/chunkedStreamAdapter.js +519 -0
  84. package/dist/voice/streaming/endpointer.d.ts +81 -0
  85. package/dist/voice/streaming/endpointer.js +247 -0
  86. package/dist/voice/streaming/localAgreement.d.ts +30 -0
  87. package/dist/voice/streaming/localAgreement.js +44 -0
  88. package/dist/voice/sttEnvCredentials.d.ts +12 -0
  89. package/dist/voice/sttEnvCredentials.js +12 -0
  90. package/dist/voice/transcribe.d.ts +47 -0
  91. package/dist/voice/transcribe.js +519 -0
  92. package/dist/voice/transcribeStream.d.ts +4 -0
  93. package/dist/voice/transcribeStream.js +584 -0
  94. package/dist/voice/whistle/assets.d.ts +47 -0
  95. package/dist/voice/whistle/assets.js +270 -0
  96. package/dist/voice/whistle/audio.d.ts +32 -0
  97. package/dist/voice/whistle/audio.js +267 -0
  98. package/dist/voice/whistle/engine.d.ts +32 -0
  99. package/dist/voice/whistle/engine.js +193 -0
  100. package/dist/voice/whistle/worker.d.ts +18 -0
  101. package/dist/voice/whistle/worker.js +294 -0
  102. package/docs-site/static/search-index.json +69 -10
  103. package/models/whistle/README.md +18 -0
  104. package/models/whistle/needle.js +2 -0
  105. package/models/whistle/needle.wasm +0 -0
  106. package/models/whistle/whistle.cact +0 -0
  107. package/package.json +7 -3
@@ -4,13 +4,34 @@
4
4
  * Hono is chosen for its performance, TypeScript-first design, and edge compatibility
5
5
  */
6
6
  import { logger } from "../../utils/logger.js";
7
- import { AlreadyRunningError, ServerStopError, wrapError } from "../errors.js";
7
+ import { AlreadyRunningError, ServerAdapterError, ServerStopError, wrapError, } from "../errors.js";
8
8
  import { BaseServerAdapter } from "../abstract/baseServerAdapter.js";
9
9
  import { isErrorResponse } from "../utils/validation.js";
10
+ import { isRawBodyContentType, isWebResponse, parseByteLimit, RawBodyTooLargeError, readRawBody, } from "../utils/rawBody.js";
10
11
  /**
11
12
  * Hono-specific server adapter
12
13
  * Supports multiple runtimes: Bun, Deno, Node.js
13
14
  */
15
+ /** Raw bodies already read for a request, so a second extraction never hits a consumed stream. */
16
+ const rawBodies = new WeakMap();
17
+ /** A web `ReadableStream` of bytes as an async iterable of Buffers, releasing the reader on exit. */
18
+ async function* webStreamChunks(stream) {
19
+ const reader = stream.getReader();
20
+ try {
21
+ for (;;) {
22
+ const { value, done } = await reader.read();
23
+ if (done) {
24
+ return;
25
+ }
26
+ if (value) {
27
+ yield Buffer.from(value.buffer, value.byteOffset, value.byteLength);
28
+ }
29
+ }
30
+ }
31
+ finally {
32
+ reader.releaseLock();
33
+ }
34
+ }
14
35
  export class HonoServerAdapter extends BaseServerAdapter {
15
36
  app;
16
37
  server;
@@ -132,7 +153,12 @@ export class HonoServerAdapter extends BaseServerAdapter {
132
153
  // Add CORS if enabled
133
154
  if (this.config.cors.enabled) {
134
155
  this.app.use("*", cors({
135
- origin: this.config.cors.origins,
156
+ // Hono matches a list of origins literally, so `["*"]` (the default)
157
+ // matches nothing and no CORS header is sent; the string "*" is the
158
+ // wildcard. Pass it as such when the list contains it.
159
+ origin: this.config.cors.origins.includes("*")
160
+ ? "*"
161
+ : this.config.cors.origins,
136
162
  allowMethods: this.config.cors.methods,
137
163
  allowHeaders: this.config.cors.headers,
138
164
  credentials: this.config.cors.credentials,
@@ -154,16 +180,21 @@ export class HonoServerAdapter extends BaseServerAdapter {
154
180
  // Global error handler
155
181
  this.app.onError((error, c) => {
156
182
  const requestId = c.req.header("X-Request-ID") || this.generateRequestId();
157
- logger.error("[HonoAdapter] Request error", {
158
- requestId,
159
- error: error.message,
160
- stack: error.stack,
161
- });
162
- this.emit("error", {
183
+ this.logRequestError("HonoAdapter", requestId, error);
184
+ this.emitRequestError({
163
185
  requestId,
164
186
  error,
165
187
  timestamp: new Date(),
166
188
  });
189
+ if (error instanceof ServerAdapterError) {
190
+ return c.json({
191
+ error: { code: error.code, message: error.message },
192
+ metadata: {
193
+ requestId,
194
+ timestamp: new Date().toISOString(),
195
+ },
196
+ }, error.getHttpStatus());
197
+ }
167
198
  if (error instanceof HTTPException) {
168
199
  return c.json({
169
200
  error: {
@@ -237,6 +268,21 @@ export class HonoServerAdapter extends BaseServerAdapter {
237
268
  // Execute handler
238
269
  const result = await route.handler(ctx);
239
270
  const duration = Date.now() - startTime;
271
+ // A route that answers in its own wire format returns a web Response.
272
+ if (isWebResponse(result)) {
273
+ this.emit("response", {
274
+ requestId,
275
+ statusCode: result.status,
276
+ duration,
277
+ timestamp: new Date(),
278
+ });
279
+ for (const [key, value] of Object.entries(ctx.responseHeaders ?? {})) {
280
+ if (!result.headers.has(key)) {
281
+ result.headers.set(key, value);
282
+ }
283
+ }
284
+ return result;
285
+ }
240
286
  // Check if result is an error response
241
287
  if (isErrorResponse(result)) {
242
288
  const statusCode = result.httpStatus ?? 500;
@@ -599,6 +645,10 @@ export class HonoServerAdapter extends BaseServerAdapter {
599
645
  getFrameworkInstance() {
600
646
  return this.app;
601
647
  }
648
+ getNativeServer() {
649
+ // @hono/node-server's serve() returns the http.Server; Bun/Deno do not.
650
+ return this.server;
651
+ }
602
652
  // ============================================
603
653
  // Helper Methods
604
654
  // ============================================
@@ -638,6 +688,43 @@ export class HonoServerAdapter extends BaseServerAdapter {
638
688
  return undefined;
639
689
  }
640
690
  }
691
+ // Uploads (multipart, octet-stream, audio/*) reach the route as bytes.
692
+ // Over the size limit the body is the error itself rather than a throw:
693
+ // a throw from the middleware path would land in onError, which answers
694
+ // 500. The route answers 413 (or a validation error) from it.
695
+ if (isRawBodyContentType(contentType)) {
696
+ const limit = parseByteLimit(this.config.bodyParser.maxSize);
697
+ if (Number(c.req.header("Content-Length") ?? 0) > limit) {
698
+ return new RawBodyTooLargeError(limit);
699
+ }
700
+ // Read the web stream chunk by chunk and stop at the limit, so a
701
+ // chunked upload without a Content-Length cannot be buffered whole
702
+ // (and that before any route logic, including the API-key check, runs).
703
+ // The body is extracted more than once per request (middleware and
704
+ // route); a web stream can only be read once, so the outcome is kept
705
+ // per request the way Hono caches `arrayBuffer()`.
706
+ const cached = rawBodies.get(c.req.raw);
707
+ if (cached !== undefined) {
708
+ return cached;
709
+ }
710
+ const stream = c.req.raw.body;
711
+ if (!stream) {
712
+ return Buffer.alloc(0);
713
+ }
714
+ let outcome;
715
+ try {
716
+ outcome = await readRawBody(webStreamChunks(stream), limit);
717
+ }
718
+ catch (error) {
719
+ if (!(error instanceof RawBodyTooLargeError)) {
720
+ throw error;
721
+ }
722
+ await stream.cancel().catch(() => undefined);
723
+ outcome = error;
724
+ }
725
+ rawBodies.set(c.req.raw, outcome);
726
+ return outcome;
727
+ }
641
728
  return undefined;
642
729
  }
643
730
  }
@@ -18,6 +18,7 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
18
18
  private rateLimitStore;
19
19
  private rateLimitCleanupInterval?;
20
20
  private sockets;
21
+ private registeredMiddleware;
21
22
  constructor(neurolink: NeuroLink, config?: ServerAdapterConfig);
22
23
  /**
23
24
  * Initialize Koa framework
@@ -52,6 +53,11 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
52
53
  * Register middleware with Koa
53
54
  */
54
55
  protected registerFrameworkMiddleware(middleware: MiddlewareDefinition): void;
56
+ /**
57
+ * Run registered middleware in registration order, then continue to the
58
+ * router. Reads the list per request, so later registrations apply too.
59
+ */
60
+ private runRegisteredMiddleware;
55
61
  /**
56
62
  * Start the Koa server
57
63
  */
@@ -76,4 +82,5 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
76
82
  * Get the Koa app instance
77
83
  */
78
84
  getFrameworkInstance(): unknown;
85
+ getNativeServer(): unknown;
79
86
  }
@@ -4,9 +4,10 @@
4
4
  * Koa is known for its elegant middleware composition using async/await
5
5
  */
6
6
  import { logger } from "../../utils/logger.js";
7
- import { AlreadyRunningError, ServerStopError, wrapError } from "../errors.js";
7
+ import { AlreadyRunningError, ServerAdapterError, ServerStopError, wrapError, } from "../errors.js";
8
8
  import { BaseServerAdapter } from "../abstract/baseServerAdapter.js";
9
9
  import { isErrorResponse } from "../utils/validation.js";
10
+ import { isRawBodyContentType, isWebResponse, parseByteLimit, RawBodyTooLargeError, readRawBody, readWebResponse, } from "../utils/rawBody.js";
10
11
  /**
11
12
  * Koa-specific server adapter
12
13
  * Leverages Koa's middleware composition for clean request handling
@@ -19,6 +20,10 @@ export class KoaServerAdapter extends BaseServerAdapter {
19
20
  rateLimitStore = new Map();
20
21
  rateLimitCleanupInterval;
21
22
  sockets = new Set();
23
+ // Middleware from registerMiddleware(). It runs through one dispatcher that
24
+ // is mounted ahead of the router: app.use() after the router is mounted
25
+ // would only ever see requests no route matched.
26
+ registeredMiddleware = [];
22
27
  constructor(neurolink, config = {}) {
23
28
  super(neurolink, config);
24
29
  }
@@ -59,21 +64,19 @@ export class KoaServerAdapter extends BaseServerAdapter {
59
64
  catch (error) {
60
65
  const err = error;
61
66
  const requestId = ctx.state.requestId;
62
- logger.error("[KoaAdapter] Request error", {
63
- requestId,
64
- error: err.message,
65
- stack: err.stack,
66
- });
67
- this.emit("error", {
67
+ this.logRequestError("KoaAdapter", requestId, err);
68
+ this.emitRequestError({
68
69
  requestId,
69
70
  error: err,
70
71
  timestamp: new Date(),
71
72
  });
72
- const statusCode = err.status || err.statusCode || 500;
73
+ const adapterError = error instanceof ServerAdapterError ? error : undefined;
74
+ const statusCode = adapterError?.getHttpStatus() || err.status || err.statusCode || 500;
73
75
  ctx.status = statusCode;
74
76
  ctx.body = {
75
77
  error: {
76
- code: statusCode === 500 ? "INTERNAL_ERROR" : `HTTP_${statusCode}`,
78
+ code: adapterError?.code ??
79
+ (statusCode === 500 ? "INTERNAL_ERROR" : `HTTP_${statusCode}`),
77
80
  message: statusCode === 500 ? "An internal error occurred" : err.message,
78
81
  },
79
82
  metadata: {
@@ -109,6 +112,26 @@ export class KoaServerAdapter extends BaseServerAdapter {
109
112
  jsonLimit: this.config.bodyParser.jsonLimit,
110
113
  enableTypes: ["json", "form", "text"],
111
114
  }));
115
+ // Uploads (multipart, octet-stream, audio/*) reach the route as bytes.
116
+ const rawLimit = parseByteLimit(this.config.bodyParser.maxSize);
117
+ this.app.use(async (ctx, next) => {
118
+ if (isRawBodyContentType(ctx.get("content-type"))) {
119
+ try {
120
+ ctx.request.body = await readRawBody(ctx.req, rawLimit);
121
+ }
122
+ catch (error) {
123
+ if (error instanceof RawBodyTooLargeError) {
124
+ ctx.status = 413;
125
+ ctx.body = {
126
+ error: { code: "PAYLOAD_TOO_LARGE", message: error.message },
127
+ };
128
+ return;
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ await next();
134
+ });
112
135
  }
113
136
  // Rate limiting middleware
114
137
  if (this.config.rateLimit.enabled) {
@@ -130,6 +153,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
130
153
  });
131
154
  });
132
155
  }
156
+ this.app.use((ctx, next) => this.runRegisteredMiddleware(ctx, next));
133
157
  // Mount router
134
158
  this.app.use(this.router.routes());
135
159
  this.app.use(this.router.allowedMethods());
@@ -251,6 +275,25 @@ export class KoaServerAdapter extends BaseServerAdapter {
251
275
  // Execute handler
252
276
  const result = await route.handler(serverCtx);
253
277
  const duration = Date.now() - startTime;
278
+ // A route that answers in its own wire format returns a web Response.
279
+ if (isWebResponse(result)) {
280
+ const raw = await readWebResponse(result);
281
+ this.emit("response", {
282
+ requestId,
283
+ statusCode: raw.status,
284
+ duration,
285
+ timestamp: new Date(),
286
+ });
287
+ for (const [key, value] of Object.entries({
288
+ ...serverCtx.responseHeaders,
289
+ ...raw.headers,
290
+ })) {
291
+ ctx.set(key, value);
292
+ }
293
+ ctx.status = raw.status;
294
+ ctx.body = raw.body;
295
+ return;
296
+ }
254
297
  // Check if result is an error response
255
298
  if (isErrorResponse(result)) {
256
299
  const statusCode = result.httpStatus ?? 500;
@@ -349,7 +392,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
349
392
  * Register middleware with Koa
350
393
  */
351
394
  registerFrameworkMiddleware(middleware) {
352
- this.app.use(async (ctx, next) => {
395
+ this.registeredMiddleware.push(async (ctx, next) => {
353
396
  // Skip excluded paths
354
397
  if (middleware.excludePaths?.some((p) => ctx.path.startsWith(p))) {
355
398
  return next();
@@ -390,6 +433,21 @@ export class KoaServerAdapter extends BaseServerAdapter {
390
433
  }
391
434
  });
392
435
  }
436
+ /**
437
+ * Run registered middleware in registration order, then continue to the
438
+ * router. Reads the list per request, so later registrations apply too.
439
+ */
440
+ runRegisteredMiddleware(ctx, next) {
441
+ const dispatch = async (index) => {
442
+ const middleware = this.registeredMiddleware[index];
443
+ if (!middleware) {
444
+ await next();
445
+ return;
446
+ }
447
+ await middleware(ctx, () => dispatch(index + 1));
448
+ };
449
+ return dispatch(0);
450
+ }
393
451
  /**
394
452
  * Start the Koa server
395
453
  */
@@ -517,4 +575,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
517
575
  getFrameworkInstance() {
518
576
  return this.app;
519
577
  }
578
+ getNativeServer() {
579
+ return this.server;
580
+ }
520
581
  }
@@ -38,9 +38,10 @@ export { createMCPBodyAttachmentMiddleware, fastifyMCPBodyHook, } from "./middle
38
38
  export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore, } from "./middleware/rateLimit.js";
39
39
  export { CommonSchemas, createFieldValidator, createRequestValidationMiddleware, ValidationError, } from "./middleware/validation.js";
40
40
  export { AgentExecuteRequestSchema as OpenAPIAgentExecuteRequestSchema, AgentExecuteResponseSchema, AgentInputSchema, ApiKeySecurityScheme, BasicSecurityScheme, BearerSecurityScheme, CommonParameters, ConversationMessageSchema, createApiInfo, createDeleteOperation, createErrorResponse as createOpenAPIErrorResponse, createGetOperation, createHeaderParameter, createOpenAPIGenerator, createPathParameter, createPostOperation, createQueryParameter, createServer as createOpenAPIServer, createStreamingPostOperation, createStreamingResponse, createSuccessResponse, DefaultServers, ErrorResponseSchema, generateOpenAPIFromConfig, generateOpenAPISpec, HealthResponseSchema, MCPServerStatusSchema, MCPServersListResponseSchema, MCPServerToolSchema, MetricsResponseSchema, NeuroLinkApiInfo, OpenAPIGenerator, OpenAPISchemas, ProviderInfoSchema, ReadyResponseSchema, SessionSchema, SessionsListResponseSchema, StandardErrorResponses, StandardTags, TokenUsageSchema, ToolCallSchema, ToolDefinitionSchema, ToolExecuteRequestSchema as OpenAPIToolExecuteRequestSchema, ToolExecuteResponseSchema, ToolListResponseSchema, ToolParameterSchema, } from "./openapi/index.js";
41
- export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, registerAllRoutes, createClaudeProxyRoutes, createOpenAIProxyRoutes, createCodexProxyRoutes, createGeminiProxyRoutes, } from "./routes/index.js";
41
+ export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, createTranscribeRoutes, registerAllRoutes, createClaudeProxyRoutes, createOpenAIProxyRoutes, createCodexProxyRoutes, createGeminiProxyRoutes, } from "./routes/index.js";
42
42
  export { BaseDataStreamWriter, createDataStreamResponse, createDataStreamWriter, createNDJSONHeaders, createSSEHeaders, DataStreamResponse, formatSSEEvent, pipeAsyncIterableToDataStream, WebStreamWriter, } from "./streaming/index.js";
43
43
  export { ErrorCategory, ErrorSeverity, ServerAdapterErrorCode, } from "../types/index.js";
44
44
  export { createStreamRedactor, redactStreamChunk } from "./utils/redaction.js";
45
- export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
45
+ export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, TranscribeConfigSchema, TranscribeRequestSchema, TranscribeStreamConfigSchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
46
46
  export { createAgentWebSocketHandler, WebSocketConnectionManager, WebSocketMessageRouter, } from "./websocket/index.js";
47
+ export { attachTranscribeWebSocket } from "./websocket/transcribeWebSocket.js";
@@ -93,7 +93,7 @@ OpenAPIGenerator, OpenAPISchemas, ProviderInfoSchema, ReadyResponseSchema, Sessi
93
93
  // ============================================
94
94
  // Routes
95
95
  // ============================================
96
- export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, registerAllRoutes,
96
+ export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, createTranscribeRoutes, registerAllRoutes,
97
97
  // The proxy doors. All were reachable only from the deep path
98
98
  // ./routes/index.js, which is not a package export — so a consumer of
99
99
  // "@juspay/neurolink/server" could reach them only indirectly through
@@ -120,8 +120,9 @@ export { createStreamRedactor, redactStreamChunk } from "./utils/redaction.js";
120
120
  // ============================================
121
121
  // Validation Utilities
122
122
  // ============================================
123
- export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
123
+ export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, TranscribeConfigSchema, TranscribeRequestSchema, TranscribeStreamConfigSchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
124
124
  // ============================================
125
125
  // WebSocket
126
126
  // ============================================
127
127
  export { createAgentWebSocketHandler, WebSocketConnectionManager, WebSocketMessageRouter, } from "./websocket/index.js";
128
+ export { attachTranscribeWebSocket } from "./websocket/transcribeWebSocket.js";
@@ -13,6 +13,7 @@ export { createMCPRoutes } from "./mcpRoutes.js";
13
13
  export { createMemoryRoutes } from "./memoryRoutes.js";
14
14
  export { createOpenApiRoutes } from "./openApiRoutes.js";
15
15
  export { createToolRoutes } from "./toolRoutes.js";
16
+ export { createTranscribeRoutes } from "./transcribeRoutes.js";
16
17
  /**
17
18
  * Create all standard routes
18
19
  * Convenience method that combines all route groups
@@ -13,6 +13,7 @@ import { createMCPRoutes } from "./mcpRoutes.js";
13
13
  import { createMemoryRoutes } from "./memoryRoutes.js";
14
14
  import { createOpenApiRoutes } from "./openApiRoutes.js";
15
15
  import { createToolRoutes } from "./toolRoutes.js";
16
+ import { createTranscribeRoutes } from "./transcribeRoutes.js";
16
17
  // Re-export route builders from individual files
17
18
  export { createAgentRoutes } from "./agentRoutes.js";
18
19
  export { createClaudeProxyRoutes } from "./claudeProxyRoutes.js";
@@ -25,6 +26,7 @@ export { createMCPRoutes } from "./mcpRoutes.js";
25
26
  export { createMemoryRoutes } from "./memoryRoutes.js";
26
27
  export { createOpenApiRoutes } from "./openApiRoutes.js";
27
28
  export { createToolRoutes } from "./toolRoutes.js";
29
+ export { createTranscribeRoutes } from "./transcribeRoutes.js";
28
30
  /**
29
31
  * Create all standard routes
30
32
  * Convenience method that combines all route groups
@@ -44,6 +46,7 @@ export function createAllRoutes(basePath = "/api", options) {
44
46
  createMCPRoutes(basePath),
45
47
  createMemoryRoutes(basePath),
46
48
  createHealthRoutes(basePath),
49
+ createTranscribeRoutes(basePath, options?.transcribe),
47
50
  ];
48
51
  // Conditionally add OpenAPI/Swagger routes
49
52
  if (options?.enableSwagger) {
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Transcribe Routes
3
+ *
4
+ * - `POST <basePath>/agent/transcribe` — JSON in (`audio` base64, `audioUrl`
5
+ * or an allow-listed `audioPath`), `TranscribeResult` out, in the adapters'
6
+ * usual `{ data, metadata }` envelope.
7
+ * - `POST /v1/audio/transcriptions` — OpenAI-compatible: `multipart/form-data`
8
+ * in, OpenAI's `json` / `verbose_json` / `text` out (no envelope), with
9
+ * NeuroLink's extras on `verbose_json`.
10
+ *
11
+ * Both call `neurolink.transcribe()`. Neither accepts credentials: engines use
12
+ * the server's own configuration.
13
+ */
14
+ import type { RouteGroup, ServerTranscribeRouteOptions } from "../../types/index.js";
15
+ /**
16
+ * Create the transcription routes.
17
+ *
18
+ * @param basePath - Prefix of the NeuroLink route (default `/api`).
19
+ * @param options - `allowedAudioRoots` (default: `audioPath` refused),
20
+ * `maxAudioBytes` (default 50 MB) and `openaiBasePath` (default `""`, so the
21
+ * OpenAI-compatible route is `/v1/audio/transcriptions`).
22
+ */
23
+ export declare function createTranscribeRoutes(basePath?: string, options?: ServerTranscribeRouteOptions): RouteGroup;