@juspay/neurolink 9.52.0 → 9.54.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 (151) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -0
  3. package/dist/adapters/tts/cartesiaHandler.d.ts +12 -0
  4. package/dist/adapters/tts/cartesiaHandler.js +130 -0
  5. package/dist/agent/directTools.d.ts +2 -2
  6. package/dist/auth/errors.d.ts +1 -1
  7. package/dist/auth/middleware/AuthMiddleware.d.ts +1 -1
  8. package/dist/auth/providers/BaseAuthProvider.d.ts +1 -1
  9. package/dist/autoresearch/config.d.ts +11 -0
  10. package/dist/autoresearch/config.js +108 -0
  11. package/dist/autoresearch/errors.d.ts +40 -0
  12. package/dist/autoresearch/errors.js +20 -0
  13. package/dist/autoresearch/index.d.ts +23 -0
  14. package/dist/autoresearch/index.js +34 -0
  15. package/dist/autoresearch/phasePolicy.d.ts +9 -0
  16. package/dist/autoresearch/phasePolicy.js +69 -0
  17. package/dist/autoresearch/promptCompiler.d.ts +15 -0
  18. package/dist/autoresearch/promptCompiler.js +120 -0
  19. package/dist/autoresearch/repoPolicy.d.ts +32 -0
  20. package/dist/autoresearch/repoPolicy.js +128 -0
  21. package/dist/autoresearch/resultRecorder.d.ts +20 -0
  22. package/dist/autoresearch/resultRecorder.js +130 -0
  23. package/dist/autoresearch/runner.d.ts +10 -0
  24. package/dist/autoresearch/runner.js +102 -0
  25. package/dist/autoresearch/stateStore.d.ts +12 -0
  26. package/dist/autoresearch/stateStore.js +163 -0
  27. package/dist/autoresearch/summaryParser.d.ts +16 -0
  28. package/dist/autoresearch/summaryParser.js +94 -0
  29. package/dist/autoresearch/tools.d.ts +257 -0
  30. package/dist/autoresearch/tools.js +617 -0
  31. package/dist/autoresearch/worker.d.ts +71 -0
  32. package/dist/autoresearch/worker.js +417 -0
  33. package/dist/browser/neurolink.min.js +340 -326
  34. package/dist/cli/commands/autoresearch.d.ts +41 -0
  35. package/dist/cli/commands/autoresearch.js +487 -0
  36. package/dist/cli/commands/config.d.ts +1 -1
  37. package/dist/cli/commands/task.d.ts +2 -0
  38. package/dist/cli/commands/task.js +32 -3
  39. package/dist/cli/commands/voiceServer.d.ts +6 -0
  40. package/dist/cli/commands/voiceServer.js +17 -0
  41. package/dist/cli/parser.js +7 -1
  42. package/dist/core/baseProvider.js +18 -0
  43. package/dist/evaluation/errors/EvaluationError.d.ts +1 -1
  44. package/dist/lib/adapters/tts/cartesiaHandler.d.ts +12 -0
  45. package/dist/lib/adapters/tts/cartesiaHandler.js +131 -0
  46. package/dist/lib/agent/directTools.d.ts +2 -2
  47. package/dist/lib/auth/errors.d.ts +1 -1
  48. package/dist/lib/auth/middleware/AuthMiddleware.d.ts +1 -1
  49. package/dist/lib/auth/providers/BaseAuthProvider.d.ts +1 -1
  50. package/dist/lib/autoresearch/config.d.ts +11 -0
  51. package/dist/lib/autoresearch/config.js +109 -0
  52. package/dist/lib/autoresearch/errors.d.ts +40 -0
  53. package/dist/lib/autoresearch/errors.js +21 -0
  54. package/dist/lib/autoresearch/index.d.ts +23 -0
  55. package/dist/lib/autoresearch/index.js +35 -0
  56. package/dist/lib/autoresearch/phasePolicy.d.ts +9 -0
  57. package/dist/lib/autoresearch/phasePolicy.js +70 -0
  58. package/dist/lib/autoresearch/promptCompiler.d.ts +15 -0
  59. package/dist/lib/autoresearch/promptCompiler.js +121 -0
  60. package/dist/lib/autoresearch/repoPolicy.d.ts +32 -0
  61. package/dist/lib/autoresearch/repoPolicy.js +129 -0
  62. package/dist/lib/autoresearch/resultRecorder.d.ts +20 -0
  63. package/dist/lib/autoresearch/resultRecorder.js +131 -0
  64. package/dist/lib/autoresearch/runner.d.ts +10 -0
  65. package/dist/lib/autoresearch/runner.js +103 -0
  66. package/dist/lib/autoresearch/stateStore.d.ts +12 -0
  67. package/dist/lib/autoresearch/stateStore.js +164 -0
  68. package/dist/lib/autoresearch/summaryParser.d.ts +16 -0
  69. package/dist/lib/autoresearch/summaryParser.js +95 -0
  70. package/dist/lib/autoresearch/tools.d.ts +257 -0
  71. package/dist/lib/autoresearch/tools.js +618 -0
  72. package/dist/lib/autoresearch/worker.d.ts +71 -0
  73. package/dist/lib/autoresearch/worker.js +418 -0
  74. package/dist/lib/core/baseProvider.js +18 -0
  75. package/dist/lib/evaluation/errors/EvaluationError.d.ts +1 -1
  76. package/dist/lib/files/fileTools.d.ts +1 -1
  77. package/dist/lib/neurolink.js +22 -2
  78. package/dist/lib/providers/azureOpenai.d.ts +4 -1
  79. package/dist/lib/providers/azureOpenai.js +9 -3
  80. package/dist/lib/providers/litellm.js +2 -2
  81. package/dist/lib/providers/openRouter.js +2 -2
  82. package/dist/lib/providers/openaiCompatible.js +3 -1
  83. package/dist/lib/server/voice/frameBus.d.ts +8 -0
  84. package/dist/lib/server/voice/frameBus.js +25 -0
  85. package/dist/lib/server/voice/turnManager.d.ts +15 -0
  86. package/dist/lib/server/voice/turnManager.js +36 -0
  87. package/dist/lib/server/voice/types.d.ts +20 -0
  88. package/dist/lib/server/voice/types.js +2 -0
  89. package/dist/lib/server/voice/voiceServerApp.d.ts +1 -0
  90. package/dist/lib/server/voice/voiceServerApp.js +118 -0
  91. package/dist/lib/server/voice/voiceWebSocketHandler.d.ts +11 -0
  92. package/dist/lib/server/voice/voiceWebSocketHandler.js +536 -0
  93. package/dist/lib/tasks/autoresearchTaskExecutor.d.ts +32 -0
  94. package/dist/lib/tasks/autoresearchTaskExecutor.js +303 -0
  95. package/dist/lib/tasks/errors.d.ts +3 -1
  96. package/dist/lib/tasks/errors.js +1 -0
  97. package/dist/lib/tasks/taskExecutor.d.ts +4 -2
  98. package/dist/lib/tasks/taskExecutor.js +8 -1
  99. package/dist/lib/tasks/taskManager.js +27 -3
  100. package/dist/lib/tasks/tools/taskTools.d.ts +1 -1
  101. package/dist/lib/telemetry/attributes.d.ts +15 -0
  102. package/dist/lib/telemetry/attributes.js +16 -0
  103. package/dist/lib/telemetry/tracers.d.ts +1 -0
  104. package/dist/lib/telemetry/tracers.js +1 -0
  105. package/dist/lib/types/autoresearchTypes.d.ts +194 -0
  106. package/dist/lib/types/autoresearchTypes.js +18 -0
  107. package/dist/lib/types/common.d.ts +11 -0
  108. package/dist/lib/types/index.d.ts +16 -14
  109. package/dist/lib/types/index.js +21 -17
  110. package/dist/lib/types/taskTypes.d.ts +38 -0
  111. package/dist/lib/workflow/config.d.ts +3 -3
  112. package/dist/neurolink.js +22 -2
  113. package/dist/providers/azureOpenai.d.ts +4 -1
  114. package/dist/providers/azureOpenai.js +9 -3
  115. package/dist/providers/litellm.js +2 -2
  116. package/dist/providers/openRouter.js +2 -2
  117. package/dist/providers/openaiCompatible.js +3 -1
  118. package/dist/rag/errors/RAGError.d.ts +1 -1
  119. package/dist/server/voice/frameBus.d.ts +8 -0
  120. package/dist/server/voice/frameBus.js +24 -0
  121. package/dist/server/voice/public/app.js +275 -0
  122. package/dist/server/voice/public/index.html +18 -0
  123. package/dist/server/voice/public/pcm-worklet.js +67 -0
  124. package/dist/server/voice/public/styles.css +102 -0
  125. package/dist/server/voice/turnManager.d.ts +15 -0
  126. package/dist/server/voice/turnManager.js +35 -0
  127. package/dist/server/voice/types.d.ts +20 -0
  128. package/dist/server/voice/types.js +1 -0
  129. package/dist/server/voice/voiceServerApp.d.ts +1 -0
  130. package/dist/server/voice/voiceServerApp.js +117 -0
  131. package/dist/server/voice/voiceWebSocketHandler.d.ts +11 -0
  132. package/dist/server/voice/voiceWebSocketHandler.js +535 -0
  133. package/dist/tasks/autoresearchTaskExecutor.d.ts +32 -0
  134. package/dist/tasks/autoresearchTaskExecutor.js +302 -0
  135. package/dist/tasks/errors.d.ts +3 -1
  136. package/dist/tasks/errors.js +1 -0
  137. package/dist/tasks/taskExecutor.d.ts +4 -2
  138. package/dist/tasks/taskExecutor.js +8 -1
  139. package/dist/tasks/taskManager.js +27 -3
  140. package/dist/tasks/tools/taskTools.d.ts +1 -1
  141. package/dist/telemetry/attributes.d.ts +15 -0
  142. package/dist/telemetry/attributes.js +16 -0
  143. package/dist/telemetry/tracers.d.ts +1 -0
  144. package/dist/telemetry/tracers.js +1 -0
  145. package/dist/types/autoresearchTypes.d.ts +194 -0
  146. package/dist/types/autoresearchTypes.js +17 -0
  147. package/dist/types/common.d.ts +11 -0
  148. package/dist/types/index.d.ts +16 -14
  149. package/dist/types/index.js +21 -17
  150. package/dist/types/taskTypes.d.ts +38 -0
  151. package/package.json +2 -1
@@ -0,0 +1,36 @@
1
+ export var TurnState;
2
+ (function (TurnState) {
3
+ TurnState[TurnState["IDLE"] = 0] = "IDLE";
4
+ TurnState[TurnState["USER_SPEAKING"] = 1] = "USER_SPEAKING";
5
+ TurnState[TurnState["PROCESSING"] = 2] = "PROCESSING";
6
+ TurnState[TurnState["ASSISTANT_SPEAKING"] = 3] = "ASSISTANT_SPEAKING";
7
+ })(TurnState || (TurnState = {}));
8
+ export class TurnManager {
9
+ state = TurnState.IDLE;
10
+ constructor(bus) {
11
+ bus.subscribe("vad_start", () => this.onVadStart());
12
+ bus.subscribe("vad_stop", () => this.onVadStop());
13
+ }
14
+ onVadStart() {
15
+ // Only update state if TTS is NOT playing. During ASSISTANT_SPEAKING, the
16
+ // barge-in interrupt is triggered by Soniox non-final tokens — which arrive
17
+ // after a network round-trip. If we let VAD immediately flip state to
18
+ // USER_SPEAKING, the state check in handleSonioxMessage fails and the
19
+ // interrupt never fires.
20
+ if (this.state !== TurnState.ASSISTANT_SPEAKING) {
21
+ this.state = TurnState.USER_SPEAKING;
22
+ }
23
+ }
24
+ onVadStop() {
25
+ if (this.state === TurnState.USER_SPEAKING) {
26
+ this.state = TurnState.PROCESSING;
27
+ }
28
+ }
29
+ assistantSpeaking() {
30
+ this.state = TurnState.ASSISTANT_SPEAKING;
31
+ }
32
+ reset() {
33
+ this.state = TurnState.IDLE;
34
+ }
35
+ }
36
+ //# sourceMappingURL=turnManager.js.map
@@ -0,0 +1,20 @@
1
+ export type Frame = {
2
+ type: "audio";
3
+ data: Int16Array;
4
+ } | {
5
+ type: "vad_start";
6
+ } | {
7
+ type: "vad_stop";
8
+ } | {
9
+ type: "transcript";
10
+ text: string;
11
+ final: boolean;
12
+ } | {
13
+ type: "llm_token";
14
+ text: string;
15
+ } | {
16
+ type: "tts_audio";
17
+ data: Buffer;
18
+ } | {
19
+ type: "interrupt";
20
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ export declare function startVoiceServer(port?: number): Promise<void>;
@@ -0,0 +1,118 @@
1
+ import express from "express";
2
+ import fs from "fs";
3
+ import http from "http";
4
+ import path from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { setupWebSocket } from "./voiceWebSocketHandler.js";
7
+ import { NeuroLink } from "../../neurolink.js";
8
+ import { logger } from "../../utils/logger.js";
9
+ import { withTimeout } from "../../utils/async/withTimeout.js";
10
+ import { getCartesiaWsUrl } from "../../adapters/tts/cartesiaHandler.js";
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ /**
14
+ * Resolve the public/ directory containing static assets.
15
+ * The CLI build (tsc) only emits .ts → .js and does NOT copy non-TS assets,
16
+ * so __dirname/public may not exist when running from dist/.
17
+ * Fall back to the original source path in that case.
18
+ */
19
+ function resolvePublicPath() {
20
+ const compiled = path.join(__dirname, "public");
21
+ if (fs.existsSync(compiled)) {
22
+ return compiled;
23
+ }
24
+ // Resolve from project root → src/lib/server/voice/public
25
+ const source = path.resolve(__dirname, "../../../../src/lib/server/voice/public");
26
+ if (fs.existsSync(source)) {
27
+ return source;
28
+ }
29
+ return compiled; // let express.static handle the 404
30
+ }
31
+ export async function startVoiceServer(port = 3000) {
32
+ const app = express();
33
+ /* ---------- STATIC FILES ---------- */
34
+ const publicPath = resolvePublicPath();
35
+ logger.info("[SERVER] Serving static from:", publicPath);
36
+ app.use(express.static(publicPath));
37
+ app.get("/", (_, res) => {
38
+ res.sendFile(path.join(publicPath, "index.html"));
39
+ });
40
+ /* ---------- HEALTH CHECK ---------- */
41
+ app.get("/health", (_, res) => {
42
+ res.json({ status: "ok" });
43
+ });
44
+ const server = http.createServer(app);
45
+ /* ---------- WS ---------- */
46
+ setupWebSocket(server);
47
+ /* ---------- START ---------- */
48
+ await new Promise((resolve, reject) => {
49
+ server.once("error", reject);
50
+ server.listen(port, () => {
51
+ server.removeListener("error", reject);
52
+ logger.info(`[SERVER] Voice server running at http://localhost:${port}`);
53
+ resolve();
54
+ });
55
+ });
56
+ /* ---------- WARMUP ---------- */
57
+ // Pre-warm NeuroLink + Azure on startup so the first real user request isn't
58
+ // slow. NeuroLink's MCP init + Azure's connection pool both have cold-start
59
+ // overhead that shows up as 3-4s on the very first call. We also open and
60
+ // immediately close a Cartesia WS to prime the TLS handshake.
61
+ warmup().catch((err) => {
62
+ logger.warn("[WARMUP] Failed (non-fatal):", err.message);
63
+ });
64
+ }
65
+ async function warmup() {
66
+ const t = Date.now();
67
+ logger.info("[WARMUP] Warming up LLM + TTS...");
68
+ const neurolink = new NeuroLink();
69
+ const provider = process.env.VOICE_LLM_PROVIDER ?? "azure";
70
+ const model = process.env.VOICE_LLM_MODEL ?? "gpt-4o-automatic";
71
+ try {
72
+ const result = await withTimeout(neurolink.stream({
73
+ provider,
74
+ model,
75
+ input: { text: "hi" },
76
+ maxTokens: 3,
77
+ disableTools: true,
78
+ enableAnalytics: false,
79
+ enableEvaluation: false,
80
+ }), 15000, "LLM warmup timed out");
81
+ // Drain the stream so the connection is fully exercised.
82
+ for await (const _chunk of result.stream) {
83
+ /* drain */
84
+ }
85
+ logger.info(`[WARMUP] LLM warmup done in ${Date.now() - t}ms`);
86
+ }
87
+ catch (err) {
88
+ logger.warn("[WARMUP] LLM warmup failed (non-fatal):", err.message);
89
+ }
90
+ // Cartesia TLS warmup — open WS, wait for connect, then close.
91
+ try {
92
+ const { default: WebSocket } = await import("ws");
93
+ const apiKey = process.env.CARTESIA_API_KEY;
94
+ await new Promise((resolve) => {
95
+ const ws = new WebSocket(getCartesiaWsUrl(), {
96
+ headers: apiKey ? { "X-API-Key": apiKey } : undefined,
97
+ });
98
+ const timeout = setTimeout(() => {
99
+ ws.terminate();
100
+ resolve(); // non-fatal, just move on
101
+ }, 5000);
102
+ ws.once("open", () => {
103
+ clearTimeout(timeout);
104
+ ws.close();
105
+ resolve();
106
+ });
107
+ ws.once("error", () => {
108
+ clearTimeout(timeout);
109
+ resolve(); // non-fatal
110
+ });
111
+ });
112
+ logger.info(`[WARMUP] Cartesia warmup done in ${Date.now() - t}ms`);
113
+ }
114
+ catch {
115
+ // non-fatal
116
+ }
117
+ }
118
+ //# sourceMappingURL=voiceServerApp.js.map
@@ -0,0 +1,11 @@
1
+ import type { Server as HttpServer } from "http";
2
+ /**
3
+ * Call from the voice-server command handler BEFORE importing anything else
4
+ * so the env change is scoped to voice mode only.
5
+ */
6
+ export declare function configureVoiceServerEnvironment(): void;
7
+ export type Message = {
8
+ role: "system" | "user" | "assistant";
9
+ content: string;
10
+ };
11
+ export declare function setupWebSocket(server: HttpServer): void;