@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.
- package/CHANGELOG.md +12 -0
- package/README.md +19 -0
- package/dist/adapters/tts/cartesiaHandler.d.ts +12 -0
- package/dist/adapters/tts/cartesiaHandler.js +130 -0
- package/dist/agent/directTools.d.ts +2 -2
- package/dist/auth/errors.d.ts +1 -1
- package/dist/auth/middleware/AuthMiddleware.d.ts +1 -1
- package/dist/auth/providers/BaseAuthProvider.d.ts +1 -1
- package/dist/autoresearch/config.d.ts +11 -0
- package/dist/autoresearch/config.js +108 -0
- package/dist/autoresearch/errors.d.ts +40 -0
- package/dist/autoresearch/errors.js +20 -0
- package/dist/autoresearch/index.d.ts +23 -0
- package/dist/autoresearch/index.js +34 -0
- package/dist/autoresearch/phasePolicy.d.ts +9 -0
- package/dist/autoresearch/phasePolicy.js +69 -0
- package/dist/autoresearch/promptCompiler.d.ts +15 -0
- package/dist/autoresearch/promptCompiler.js +120 -0
- package/dist/autoresearch/repoPolicy.d.ts +32 -0
- package/dist/autoresearch/repoPolicy.js +128 -0
- package/dist/autoresearch/resultRecorder.d.ts +20 -0
- package/dist/autoresearch/resultRecorder.js +130 -0
- package/dist/autoresearch/runner.d.ts +10 -0
- package/dist/autoresearch/runner.js +102 -0
- package/dist/autoresearch/stateStore.d.ts +12 -0
- package/dist/autoresearch/stateStore.js +163 -0
- package/dist/autoresearch/summaryParser.d.ts +16 -0
- package/dist/autoresearch/summaryParser.js +94 -0
- package/dist/autoresearch/tools.d.ts +257 -0
- package/dist/autoresearch/tools.js +617 -0
- package/dist/autoresearch/worker.d.ts +71 -0
- package/dist/autoresearch/worker.js +417 -0
- package/dist/browser/neurolink.min.js +340 -326
- package/dist/cli/commands/autoresearch.d.ts +41 -0
- package/dist/cli/commands/autoresearch.js +487 -0
- package/dist/cli/commands/config.d.ts +1 -1
- package/dist/cli/commands/task.d.ts +2 -0
- package/dist/cli/commands/task.js +32 -3
- package/dist/cli/commands/voiceServer.d.ts +6 -0
- package/dist/cli/commands/voiceServer.js +17 -0
- package/dist/cli/parser.js +7 -1
- package/dist/core/baseProvider.js +18 -0
- package/dist/evaluation/errors/EvaluationError.d.ts +1 -1
- package/dist/lib/adapters/tts/cartesiaHandler.d.ts +12 -0
- package/dist/lib/adapters/tts/cartesiaHandler.js +131 -0
- package/dist/lib/agent/directTools.d.ts +2 -2
- package/dist/lib/auth/errors.d.ts +1 -1
- package/dist/lib/auth/middleware/AuthMiddleware.d.ts +1 -1
- package/dist/lib/auth/providers/BaseAuthProvider.d.ts +1 -1
- package/dist/lib/autoresearch/config.d.ts +11 -0
- package/dist/lib/autoresearch/config.js +109 -0
- package/dist/lib/autoresearch/errors.d.ts +40 -0
- package/dist/lib/autoresearch/errors.js +21 -0
- package/dist/lib/autoresearch/index.d.ts +23 -0
- package/dist/lib/autoresearch/index.js +35 -0
- package/dist/lib/autoresearch/phasePolicy.d.ts +9 -0
- package/dist/lib/autoresearch/phasePolicy.js +70 -0
- package/dist/lib/autoresearch/promptCompiler.d.ts +15 -0
- package/dist/lib/autoresearch/promptCompiler.js +121 -0
- package/dist/lib/autoresearch/repoPolicy.d.ts +32 -0
- package/dist/lib/autoresearch/repoPolicy.js +129 -0
- package/dist/lib/autoresearch/resultRecorder.d.ts +20 -0
- package/dist/lib/autoresearch/resultRecorder.js +131 -0
- package/dist/lib/autoresearch/runner.d.ts +10 -0
- package/dist/lib/autoresearch/runner.js +103 -0
- package/dist/lib/autoresearch/stateStore.d.ts +12 -0
- package/dist/lib/autoresearch/stateStore.js +164 -0
- package/dist/lib/autoresearch/summaryParser.d.ts +16 -0
- package/dist/lib/autoresearch/summaryParser.js +95 -0
- package/dist/lib/autoresearch/tools.d.ts +257 -0
- package/dist/lib/autoresearch/tools.js +618 -0
- package/dist/lib/autoresearch/worker.d.ts +71 -0
- package/dist/lib/autoresearch/worker.js +418 -0
- package/dist/lib/core/baseProvider.js +18 -0
- package/dist/lib/evaluation/errors/EvaluationError.d.ts +1 -1
- package/dist/lib/files/fileTools.d.ts +1 -1
- package/dist/lib/neurolink.js +22 -2
- package/dist/lib/providers/azureOpenai.d.ts +4 -1
- package/dist/lib/providers/azureOpenai.js +9 -3
- package/dist/lib/providers/litellm.js +2 -2
- package/dist/lib/providers/openRouter.js +2 -2
- package/dist/lib/providers/openaiCompatible.js +3 -1
- package/dist/lib/server/voice/frameBus.d.ts +8 -0
- package/dist/lib/server/voice/frameBus.js +25 -0
- package/dist/lib/server/voice/turnManager.d.ts +15 -0
- package/dist/lib/server/voice/turnManager.js +36 -0
- package/dist/lib/server/voice/types.d.ts +20 -0
- package/dist/lib/server/voice/types.js +2 -0
- package/dist/lib/server/voice/voiceServerApp.d.ts +1 -0
- package/dist/lib/server/voice/voiceServerApp.js +118 -0
- package/dist/lib/server/voice/voiceWebSocketHandler.d.ts +11 -0
- package/dist/lib/server/voice/voiceWebSocketHandler.js +536 -0
- package/dist/lib/tasks/autoresearchTaskExecutor.d.ts +32 -0
- package/dist/lib/tasks/autoresearchTaskExecutor.js +303 -0
- package/dist/lib/tasks/errors.d.ts +3 -1
- package/dist/lib/tasks/errors.js +1 -0
- package/dist/lib/tasks/taskExecutor.d.ts +4 -2
- package/dist/lib/tasks/taskExecutor.js +8 -1
- package/dist/lib/tasks/taskManager.js +27 -3
- package/dist/lib/tasks/tools/taskTools.d.ts +1 -1
- package/dist/lib/telemetry/attributes.d.ts +15 -0
- package/dist/lib/telemetry/attributes.js +16 -0
- package/dist/lib/telemetry/tracers.d.ts +1 -0
- package/dist/lib/telemetry/tracers.js +1 -0
- package/dist/lib/types/autoresearchTypes.d.ts +194 -0
- package/dist/lib/types/autoresearchTypes.js +18 -0
- package/dist/lib/types/common.d.ts +11 -0
- package/dist/lib/types/index.d.ts +16 -14
- package/dist/lib/types/index.js +21 -17
- package/dist/lib/types/taskTypes.d.ts +38 -0
- package/dist/lib/workflow/config.d.ts +3 -3
- package/dist/neurolink.js +22 -2
- package/dist/providers/azureOpenai.d.ts +4 -1
- package/dist/providers/azureOpenai.js +9 -3
- package/dist/providers/litellm.js +2 -2
- package/dist/providers/openRouter.js +2 -2
- package/dist/providers/openaiCompatible.js +3 -1
- package/dist/rag/errors/RAGError.d.ts +1 -1
- package/dist/server/voice/frameBus.d.ts +8 -0
- package/dist/server/voice/frameBus.js +24 -0
- package/dist/server/voice/public/app.js +275 -0
- package/dist/server/voice/public/index.html +18 -0
- package/dist/server/voice/public/pcm-worklet.js +67 -0
- package/dist/server/voice/public/styles.css +102 -0
- package/dist/server/voice/turnManager.d.ts +15 -0
- package/dist/server/voice/turnManager.js +35 -0
- package/dist/server/voice/types.d.ts +20 -0
- package/dist/server/voice/types.js +1 -0
- package/dist/server/voice/voiceServerApp.d.ts +1 -0
- package/dist/server/voice/voiceServerApp.js +117 -0
- package/dist/server/voice/voiceWebSocketHandler.d.ts +11 -0
- package/dist/server/voice/voiceWebSocketHandler.js +535 -0
- package/dist/tasks/autoresearchTaskExecutor.d.ts +32 -0
- package/dist/tasks/autoresearchTaskExecutor.js +302 -0
- package/dist/tasks/errors.d.ts +3 -1
- package/dist/tasks/errors.js +1 -0
- package/dist/tasks/taskExecutor.d.ts +4 -2
- package/dist/tasks/taskExecutor.js +8 -1
- package/dist/tasks/taskManager.js +27 -3
- package/dist/tasks/tools/taskTools.d.ts +1 -1
- package/dist/telemetry/attributes.d.ts +15 -0
- package/dist/telemetry/attributes.js +16 -0
- package/dist/telemetry/tracers.d.ts +1 -0
- package/dist/telemetry/tracers.js +1 -0
- package/dist/types/autoresearchTypes.d.ts +194 -0
- package/dist/types/autoresearchTypes.js +17 -0
- package/dist/types/common.d.ts +11 -0
- package/dist/types/index.d.ts +16 -14
- package/dist/types/index.js +21 -17
- package/dist/types/taskTypes.d.ts +38 -0
- 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 @@
|
|
|
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;
|