@voicethere/agent 0.1.13 → 0.2.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/README.md +100 -0
- package/dist/agent.js +56 -27
- package/dist/protocol.d.ts +3 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runner.d.ts +3 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +3 -0
- package/dist/runner.js.map +1 -0
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +41 -30
- package/dist/runtime.js.map +1 -1
- package/dist/sandbox/loader-entry.js +13 -7
- package/dist/sandbox/start-child.d.ts +7 -3
- package/dist/sandbox/start-child.d.ts.map +1 -1
- package/dist/sandbox/start-child.js +14 -4
- package/dist/sandbox/start-child.js.map +1 -1
- package/package.json +18 -5
package/README.md
CHANGED
|
@@ -43,6 +43,90 @@ Optional flags: `--entry` / `-e`, `--outfile` / `-o` (same as `build`).
|
|
|
43
43
|
|
|
44
44
|
This does **not** replace a voice roundtrip with mic/WebRTC — deploy to the VoiceThere platform for full E2E.
|
|
45
45
|
|
|
46
|
+
For repository-local verify scripts, `dist/cli.js` is generated from `src/cli.ts` by `npm run build:lib`.
|
|
47
|
+
That is the package-local `@voicethere/agent` CLI artifact (not `@voicethere/cli`).
|
|
48
|
+
|
|
49
|
+
## Live browser test page (local stack)
|
|
50
|
+
|
|
51
|
+
The live harness runs fully from the `agent` repo:
|
|
52
|
+
|
|
53
|
+
1. local starter (`node-webrtc-rust` signaling + voice pipeline + sandboxed child bundle)
|
|
54
|
+
2. built child bundle (`dist/agent.js`)
|
|
55
|
+
3. browser page (`examples/live-test/index.html`, served by the starter)
|
|
56
|
+
|
|
57
|
+
### One-time setup
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 1) agent live-test config (optional overrides for scripts)
|
|
61
|
+
cd agent
|
|
62
|
+
cp .env.live-test.example .env.live-test
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Configure STT/TTS for local live testing
|
|
66
|
+
|
|
67
|
+
The starter reads env in this order: shell env → `agent/.env.live-test`.
|
|
68
|
+
|
|
69
|
+
For local Sherpa, at minimum ensure:
|
|
70
|
+
|
|
71
|
+
- `SHERPA_STT_MODEL_PATH`
|
|
72
|
+
- `SHERPA_TTS_MODEL_PATH`
|
|
73
|
+
- optional: `SHERPA_STT_LANGUAGE`, `SHERPA_TTS_SPEAKER`
|
|
74
|
+
|
|
75
|
+
Where the paths come from:
|
|
76
|
+
|
|
77
|
+
- Sherpa bundles are downloaded into:
|
|
78
|
+
- `agent/.models/`
|
|
79
|
+
- Catalog/source list:
|
|
80
|
+
- `agent/scripts/sherpa-stt-catalog.json` (STT)
|
|
81
|
+
- `agent/scripts/sherpa-tts-catalog.json` (TTS)
|
|
82
|
+
|
|
83
|
+
Use the agent helper to select models, download if missing, and emit absolute env exports:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm run live-test:models
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The script writes selected values into `agent/.env.live-test`.
|
|
90
|
+
|
|
91
|
+
To use hosted providers instead of local Sherpa, set in `agent/.env.live-test`:
|
|
92
|
+
|
|
93
|
+
- `VOICE_STT_PROVIDER` (`openai` | `deepgram` | `assemblyai` | `google`)
|
|
94
|
+
- `VOICE_TTS_PROVIDER` (`openai` | `elevenlabs` | `cartesia` | `google`)
|
|
95
|
+
- provider API keys (`OPENAI_API_KEY`, `DEEPGRAM_API_KEY`, `ASSEMBLYAI_API_KEY`, `ELEVENLABS_API_KEY`, `CARTESIA_API_KEY`, `GOOGLE_API_KEY`)
|
|
96
|
+
- optional model/voice overrides: `VOICE_STT_MODEL`, `VOICE_TTS_MODEL`, `VOICE_TTS_VOICE`, `VOICE_STT_LANGUAGE`
|
|
97
|
+
|
|
98
|
+
Vendor setup reference: https://github.com/akirilyuk/node-webrtc-rust#stttts-vendors-and-config
|
|
99
|
+
|
|
100
|
+
### Start local stack
|
|
101
|
+
|
|
102
|
+
From `agent/`:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm install
|
|
106
|
+
npm run live-test:models # select/download sherpa models and export env values
|
|
107
|
+
npm run live-test:stack
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
This starts the local starter with your sandboxed bundle and serves the page.
|
|
111
|
+
|
|
112
|
+
Live-test scripts load optional overrides from `agent/.env.live-test` (or `LIVE_TEST_ENV_FILE`).
|
|
113
|
+
|
|
114
|
+
Open:
|
|
115
|
+
|
|
116
|
+
`http://127.0.0.1:8080/examples/live-test/index.html`
|
|
117
|
+
|
|
118
|
+
If you prefer separate terminals:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Terminal A (agent starter + bundle + signaling)
|
|
122
|
+
npm run live-test:starter
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The page uses `@voicethere/client/browser` (loaded via esm.sh) and renders two visualizers:
|
|
126
|
+
|
|
127
|
+
- local microphone input
|
|
128
|
+
- incoming remote/agent audio
|
|
129
|
+
|
|
46
130
|
## API
|
|
47
131
|
|
|
48
132
|
```typescript
|
|
@@ -78,6 +162,22 @@ defineAgent({
|
|
|
78
162
|
| `agentLog` | Forward structured logs to parent |
|
|
79
163
|
| `ParentToChildMessage` / `ChildToParentMessage` | IPC contract shared with the VoiceThere agent runner |
|
|
80
164
|
|
|
165
|
+
### Runner runtime subpath (minimal shared sandbox API)
|
|
166
|
+
|
|
167
|
+
For runner-side child bootstrap reuse, `@voicethere/agent` exposes:
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
import {
|
|
171
|
+
buildChildExecArgv,
|
|
172
|
+
collectAllowFsReadDirs,
|
|
173
|
+
resolveBundlePath,
|
|
174
|
+
startSandboxedChild,
|
|
175
|
+
} from "@voicethere/agent/runner";
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
This subpath is intentionally narrow: sandbox/startup primitives only. Runner-specific
|
|
179
|
+
session orchestration and crash policy remain in the runner codebase.
|
|
180
|
+
|
|
81
181
|
### Speech events (parent → child)
|
|
82
182
|
|
|
83
183
|
Forwarded from the runner voice pipeline as SDK `SpeechEvent` payloads on `speech_event.event` (`event.type`, optional `text` / `error`):
|
package/dist/agent.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// src/runtime.ts
|
|
2
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
|
+
|
|
1
4
|
// src/session-serial-queue.ts
|
|
2
5
|
var SessionSerialQueue = class {
|
|
3
6
|
tails = /* @__PURE__ */ new Map();
|
|
@@ -34,6 +37,7 @@ function parseDataChannelPayload(raw) {
|
|
|
34
37
|
}
|
|
35
38
|
var peerEnvBySessionId = /* @__PURE__ */ new Map();
|
|
36
39
|
var endedSessionIds = /* @__PURE__ */ new Set();
|
|
40
|
+
var agentLogSessionContext = new AsyncLocalStorage();
|
|
37
41
|
async function handleParentMessage(message, handlers) {
|
|
38
42
|
switch (message.type) {
|
|
39
43
|
case "session_start":
|
|
@@ -94,30 +98,32 @@ function defineAgent(handlers) {
|
|
|
94
98
|
process.on("message", (message) => {
|
|
95
99
|
if (!isParentMessage(message)) return;
|
|
96
100
|
inboundBySession.enqueue(message.sessionId, async () => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
await agentLogSessionContext.run(message.sessionId, async () => {
|
|
102
|
+
try {
|
|
103
|
+
if (message.type === "session_end") {
|
|
104
|
+
endedSessionIds.add(message.sessionId);
|
|
105
|
+
inboundBySession.clear(message.sessionId);
|
|
106
|
+
}
|
|
107
|
+
await handleParentMessage(message, handlers);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
110
|
+
const env = peerEnvBySessionId.get(message.sessionId) ?? buildIdleEnv(message.sessionId);
|
|
111
|
+
await runErrorHook(handlers, {
|
|
112
|
+
sessionId: message.sessionId,
|
|
113
|
+
projectId: env.PROJECT_ID,
|
|
114
|
+
buildId: env.BUILD_ID,
|
|
115
|
+
env,
|
|
116
|
+
error: err,
|
|
117
|
+
customerContext: parseCustomerContext(env.AGENT_CUSTOMER_CONTEXT)
|
|
118
|
+
});
|
|
119
|
+
process.send?.({
|
|
120
|
+
type: "agent_error",
|
|
121
|
+
sessionId: message.sessionId,
|
|
122
|
+
message: err.message,
|
|
123
|
+
stack: err.stack
|
|
124
|
+
});
|
|
101
125
|
}
|
|
102
|
-
|
|
103
|
-
} catch (error) {
|
|
104
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
105
|
-
const env = peerEnvBySessionId.get(message.sessionId) ?? buildIdleEnv(message.sessionId);
|
|
106
|
-
await runErrorHook(handlers, {
|
|
107
|
-
sessionId: message.sessionId,
|
|
108
|
-
projectId: env.PROJECT_ID,
|
|
109
|
-
buildId: env.BUILD_ID,
|
|
110
|
-
env,
|
|
111
|
-
error: err,
|
|
112
|
-
customerContext: parseCustomerContext(env.AGENT_CUSTOMER_CONTEXT)
|
|
113
|
-
});
|
|
114
|
-
process.send?.({
|
|
115
|
-
type: "agent_error",
|
|
116
|
-
sessionId: message.sessionId,
|
|
117
|
-
message: err.message,
|
|
118
|
-
stack: err.stack
|
|
119
|
-
});
|
|
120
|
-
}
|
|
126
|
+
});
|
|
121
127
|
});
|
|
122
128
|
});
|
|
123
129
|
}
|
|
@@ -138,7 +144,7 @@ async function runErrorHook(handlers, ctx) {
|
|
|
138
144
|
await handlers.errorHook(ctx);
|
|
139
145
|
} catch (hookError) {
|
|
140
146
|
const message = hookError instanceof Error ? hookError.message : String(hookError);
|
|
141
|
-
agentLog("error", `errorHook failed: ${message}
|
|
147
|
+
agentLog("error", `errorHook failed: ${message}`, ctx.sessionId);
|
|
142
148
|
}
|
|
143
149
|
}
|
|
144
150
|
async function runIdleTimeoutHook(handlers, message) {
|
|
@@ -156,7 +162,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
156
162
|
await handlers.onIdleTimeout?.(ctx);
|
|
157
163
|
} catch (hookError) {
|
|
158
164
|
error = hookError instanceof Error ? hookError.message : String(hookError);
|
|
159
|
-
agentLog("error", `onIdleTimeout failed: ${error}
|
|
165
|
+
agentLog("error", `onIdleTimeout failed: ${error}`, message.sessionId);
|
|
160
166
|
}
|
|
161
167
|
process.send?.({
|
|
162
168
|
type: "idle_timeout_done",
|
|
@@ -176,8 +182,24 @@ function speak(sessionId, text) {
|
|
|
176
182
|
if (endedSessionIds.has(sessionId)) return;
|
|
177
183
|
process.send?.({ type: "speak", sessionId, text });
|
|
178
184
|
}
|
|
179
|
-
function
|
|
180
|
-
process.send?.({ type: "
|
|
185
|
+
function sendToClient(sessionId, payload) {
|
|
186
|
+
process.send?.({ type: "send_to_client", sessionId, payload });
|
|
187
|
+
}
|
|
188
|
+
function agentLog(level, message, sessionId) {
|
|
189
|
+
const resolvedSessionId = sessionId ?? agentLogSessionContext.getStore();
|
|
190
|
+
process.send?.({
|
|
191
|
+
type: "log",
|
|
192
|
+
level,
|
|
193
|
+
message,
|
|
194
|
+
...resolvedSessionId ? { sessionId: resolvedSessionId } : {}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function parseChatText(message) {
|
|
198
|
+
if (!message || typeof message !== "object") return null;
|
|
199
|
+
const record = message;
|
|
200
|
+
if (record.type !== "chat" || typeof record.text !== "string") return null;
|
|
201
|
+
const trimmed = record.text.trim();
|
|
202
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
181
203
|
}
|
|
182
204
|
|
|
183
205
|
// examples/agent.ts
|
|
@@ -271,6 +293,13 @@ defineAgent({
|
|
|
271
293
|
onUserSpeechFinal({ sessionId, text }) {
|
|
272
294
|
speak(sessionId, `You said: ${text}`);
|
|
273
295
|
},
|
|
296
|
+
onDataChannelMessage({ sessionId, message }) {
|
|
297
|
+
const text = parseChatText(message);
|
|
298
|
+
if (!text) return;
|
|
299
|
+
agentLog("info", `[${sessionId}] chat_received "${text}"`);
|
|
300
|
+
speak(sessionId, `You wrote: ${text}`);
|
|
301
|
+
sendToClient(sessionId, { type: "chat_echo", text });
|
|
302
|
+
},
|
|
274
303
|
onSessionEnd({ sessionId }) {
|
|
275
304
|
peers.delete(sessionId);
|
|
276
305
|
agentLog("info", `session_end ${sessionId}`);
|
package/dist/protocol.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @packageDocumentation
|
|
10
10
|
*/
|
|
11
11
|
import type { SpeechEvent } from "@node-webrtc-rust/sdk/voice";
|
|
12
|
+
export type { SpeechEvent } from "@node-webrtc-rust/sdk/voice";
|
|
12
13
|
/**
|
|
13
14
|
* Messages the trusted runner parent may send to the sandboxed customer child.
|
|
14
15
|
*
|
|
@@ -117,6 +118,8 @@ export interface AgentLogMessage {
|
|
|
117
118
|
type: "log";
|
|
118
119
|
level: "info" | "error";
|
|
119
120
|
message: string;
|
|
121
|
+
/** Orchestrator session id when the log originates from a session handler. */
|
|
122
|
+
sessionId?: string;
|
|
120
123
|
}
|
|
121
124
|
/**
|
|
122
125
|
* Unhandled exception or rejected promise in customer agent code.
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC5B,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,yBAAyB,GACzB,wBAAwB,GACxB,kBAAkB,CAAC;AAEvB;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC5B,sBAAsB,GACtB,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,yBAAyB,GACzB,sBAAsB,GACtB,uBAAuB,CAAC;AAE5B,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2MH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,kBAAkB;IAClB,wEAAwE;IACxE,wBAAwB;CAChB,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,GAChC,MAAM,0BAA0B,CAAC"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -83,8 +83,8 @@ export declare function sendToClient(sessionId: string, payload: unknown): void;
|
|
|
83
83
|
export declare function sendBinaryToClient(sessionId: string, data: Buffer | Uint8Array, channel?: DataChannelKind): void;
|
|
84
84
|
/** Send the same JSON payload to one or more browser peers. */
|
|
85
85
|
export declare function broadcastToClients(payload: unknown, sessionIds: readonly string[]): void;
|
|
86
|
-
/** Structured log forwarded to the runner parent. */
|
|
87
|
-
export declare function agentLog(level: "info" | "error", message: string): void;
|
|
86
|
+
/** Structured log forwarded to the runner parent (includes session when in a handler). */
|
|
87
|
+
export declare function agentLog(level: "info" | "error", message: string, sessionId?: string): void;
|
|
88
88
|
/** Ask the runner to disconnect a browser peer (customer-initiated). */
|
|
89
89
|
export declare function disconnectClient(sessionId: string, options?: {
|
|
90
90
|
reason?: string;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { SessionSerialQueue } from "./session-serial-queue.js";
|
|
2
3
|
function isParentMessage(value) {
|
|
3
4
|
if (!value || typeof value !== "object")
|
|
@@ -21,6 +22,8 @@ function parseDataChannelPayload(raw) {
|
|
|
21
22
|
const peerEnvBySessionId = new Map();
|
|
22
23
|
/** Sessions that received `session_end`; `speak()` becomes a no-op. */
|
|
23
24
|
const endedSessionIds = new Set();
|
|
25
|
+
/** Active orchestrator session while a parent IPC handler runs (per-session queue). */
|
|
26
|
+
const agentLogSessionContext = new AsyncLocalStorage();
|
|
24
27
|
async function handleParentMessage(message, handlers) {
|
|
25
28
|
switch (message.type) {
|
|
26
29
|
case "session_start":
|
|
@@ -88,32 +91,34 @@ export function defineAgent(handlers) {
|
|
|
88
91
|
if (!isParentMessage(message))
|
|
89
92
|
return;
|
|
90
93
|
inboundBySession.enqueue(message.sessionId, async () => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
await agentLogSessionContext.run(message.sessionId, async () => {
|
|
95
|
+
try {
|
|
96
|
+
if (message.type === "session_end") {
|
|
97
|
+
endedSessionIds.add(message.sessionId);
|
|
98
|
+
inboundBySession.clear(message.sessionId);
|
|
99
|
+
}
|
|
100
|
+
await handleParentMessage(message, handlers);
|
|
95
101
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
104
|
+
const env = peerEnvBySessionId.get(message.sessionId) ??
|
|
105
|
+
buildIdleEnv(message.sessionId);
|
|
106
|
+
await runErrorHook(handlers, {
|
|
107
|
+
sessionId: message.sessionId,
|
|
108
|
+
projectId: env.PROJECT_ID,
|
|
109
|
+
buildId: env.BUILD_ID,
|
|
110
|
+
env,
|
|
111
|
+
error: err,
|
|
112
|
+
customerContext: parseCustomerContext(env.AGENT_CUSTOMER_CONTEXT),
|
|
113
|
+
});
|
|
114
|
+
process.send?.({
|
|
115
|
+
type: "agent_error",
|
|
116
|
+
sessionId: message.sessionId,
|
|
117
|
+
message: err.message,
|
|
118
|
+
stack: err.stack,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
});
|
|
117
122
|
});
|
|
118
123
|
});
|
|
119
124
|
}
|
|
@@ -139,7 +144,7 @@ async function runErrorHook(handlers, ctx) {
|
|
|
139
144
|
}
|
|
140
145
|
catch (hookError) {
|
|
141
146
|
const message = hookError instanceof Error ? hookError.message : String(hookError);
|
|
142
|
-
agentLog("error", `errorHook failed: ${message}
|
|
147
|
+
agentLog("error", `errorHook failed: ${message}`, ctx.sessionId);
|
|
143
148
|
}
|
|
144
149
|
}
|
|
145
150
|
async function runIdleTimeoutHook(handlers, message) {
|
|
@@ -160,7 +165,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
160
165
|
catch (hookError) {
|
|
161
166
|
error =
|
|
162
167
|
hookError instanceof Error ? hookError.message : String(hookError);
|
|
163
|
-
agentLog("error", `onIdleTimeout failed: ${error}
|
|
168
|
+
agentLog("error", `onIdleTimeout failed: ${error}`, message.sessionId);
|
|
164
169
|
}
|
|
165
170
|
process.send?.({
|
|
166
171
|
type: "idle_timeout_done",
|
|
@@ -209,9 +214,15 @@ export function broadcastToClients(payload, sessionIds) {
|
|
|
209
214
|
sendToClient(sessionId, payload);
|
|
210
215
|
}
|
|
211
216
|
}
|
|
212
|
-
/** Structured log forwarded to the runner parent. */
|
|
213
|
-
export function agentLog(level, message) {
|
|
214
|
-
|
|
217
|
+
/** Structured log forwarded to the runner parent (includes session when in a handler). */
|
|
218
|
+
export function agentLog(level, message, sessionId) {
|
|
219
|
+
const resolvedSessionId = sessionId ?? agentLogSessionContext.getStore();
|
|
220
|
+
process.send?.({
|
|
221
|
+
type: "log",
|
|
222
|
+
level,
|
|
223
|
+
message,
|
|
224
|
+
...(resolvedSessionId ? { sessionId: resolvedSessionId } : {}),
|
|
225
|
+
});
|
|
215
226
|
}
|
|
216
227
|
/** Ask the runner to disconnect a browser peer (customer-initiated). */
|
|
217
228
|
export function disconnectClient(sessionId, options) {
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,22 +14,28 @@ function formatArgs(args) {
|
|
|
14
14
|
return args.map((value) => String(value)).join(" ");
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
function consoleLogPayload(level, message) {
|
|
18
|
+
const sessionId = process.env.SESSION_ID?.trim();
|
|
19
|
+
return {
|
|
20
|
+
type: "log",
|
|
21
|
+
level,
|
|
22
|
+
message,
|
|
23
|
+
...(sessionId ? { sessionId } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
console.log = (...args) => {
|
|
18
|
-
process.send?.(
|
|
28
|
+
process.send?.(consoleLogPayload("info", formatArgs(args)));
|
|
19
29
|
};
|
|
20
30
|
|
|
21
31
|
console.info = console.log;
|
|
22
32
|
|
|
23
33
|
console.error = (...args) => {
|
|
24
|
-
process.send?.(
|
|
34
|
+
process.send?.(consoleLogPayload("error", formatArgs(args)));
|
|
25
35
|
};
|
|
26
36
|
|
|
27
37
|
console.warn = (...args) => {
|
|
28
|
-
process.send?.({
|
|
29
|
-
type: "log",
|
|
30
|
-
level: "info",
|
|
31
|
-
message: `[warn] ${formatArgs(args)}`,
|
|
32
|
-
});
|
|
38
|
+
process.send?.(consoleLogPayload("info", `[warn] ${formatArgs(args)}`));
|
|
33
39
|
};
|
|
34
40
|
|
|
35
41
|
const { pathToFileURL } = await import("node:url");
|
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
import { type ChildToParentMessage, type ParentToChildMessage } from "../protocol.js";
|
|
7
7
|
export interface StartSandboxedChildOptions {
|
|
8
8
|
sessionId: string;
|
|
9
|
-
|
|
9
|
+
/** Absolute path to customer bundle. If omitted, uses `defaultBundlePath`. */
|
|
10
|
+
bundlePath?: string;
|
|
11
|
+
/** Optional fallback bundle when `bundlePath` is not provided. */
|
|
12
|
+
defaultBundlePath?: string;
|
|
10
13
|
projectId?: string;
|
|
11
14
|
buildId?: string;
|
|
12
|
-
|
|
15
|
+
allowlistedEnv?: Record<string, string>;
|
|
16
|
+
onStderr?: (message: string, childPid: number) => void;
|
|
13
17
|
}
|
|
14
18
|
export interface SandboxedChild {
|
|
15
19
|
pid: number;
|
|
@@ -19,6 +23,6 @@ export interface SandboxedChild {
|
|
|
19
23
|
onMessage(handler: (message: ChildToParentMessage) => void): () => void;
|
|
20
24
|
onExit(handler: (code: number | null, signal: NodeJS.Signals | null) => void): () => void;
|
|
21
25
|
}
|
|
22
|
-
export declare function resolveBundlePath(bundlePath
|
|
26
|
+
export declare function resolveBundlePath(bundlePath?: string, defaultBundlePath?: string): string;
|
|
23
27
|
export declare function startSandboxedChild(options: StartSandboxedChildOptions): SandboxedChild;
|
|
24
28
|
//# sourceMappingURL=start-child.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-child.d.ts","sourceRoot":"","sources":["../../src/sandbox/start-child.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"start-child.d.ts","sourceRoot":"","sources":["../../src/sandbox/start-child.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,MAAM,CACJ,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GACpE,MAAM,IAAI,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,cAAc,CA6EhB"}
|
|
@@ -11,8 +11,12 @@ import { ALLOWED_CHILD_ENV_KEYS, } from "../protocol.js";
|
|
|
11
11
|
import { buildChildExecArgv } from "./sandbox.js";
|
|
12
12
|
const SANDBOX_DIR = dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
const LOADER_ENTRY = join(SANDBOX_DIR, "loader-entry.js");
|
|
14
|
-
export function resolveBundlePath(bundlePath) {
|
|
15
|
-
const
|
|
14
|
+
export function resolveBundlePath(bundlePath, defaultBundlePath) {
|
|
15
|
+
const raw = bundlePath?.trim() || defaultBundlePath?.trim();
|
|
16
|
+
if (!raw) {
|
|
17
|
+
throw new Error("Bundle path is required");
|
|
18
|
+
}
|
|
19
|
+
const resolved = resolve(raw);
|
|
16
20
|
if (!existsSync(resolved)) {
|
|
17
21
|
throw new Error(`Bundle not found: ${resolved}`);
|
|
18
22
|
}
|
|
@@ -24,7 +28,7 @@ export function resolveBundlePath(bundlePath) {
|
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
export function startSandboxedChild(options) {
|
|
27
|
-
const bundlePath = resolveBundlePath(options.bundlePath);
|
|
31
|
+
const bundlePath = resolveBundlePath(options.bundlePath, options.defaultBundlePath);
|
|
28
32
|
const env = {
|
|
29
33
|
NODE_ENV: "production",
|
|
30
34
|
__CHILD_BUNDLE_PATH__: bundlePath,
|
|
@@ -37,6 +41,12 @@ export function startSandboxedChild(options) {
|
|
|
37
41
|
if (key === "BUILD_ID" && options.buildId)
|
|
38
42
|
env[key] = options.buildId;
|
|
39
43
|
}
|
|
44
|
+
for (const [key, value] of Object.entries(options.allowlistedEnv ?? {})) {
|
|
45
|
+
if (ALLOWED_CHILD_ENV_KEYS.includes(key) ||
|
|
46
|
+
key.startsWith("AGENT_")) {
|
|
47
|
+
env[key] = value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
40
50
|
const child = fork(LOADER_ENTRY, [], {
|
|
41
51
|
env,
|
|
42
52
|
stdio: ["ignore", "pipe", "pipe", "ipc"],
|
|
@@ -48,7 +58,7 @@ export function startSandboxedChild(options) {
|
|
|
48
58
|
child.stderr?.on("data", (chunk) => {
|
|
49
59
|
const message = String(chunk).trim();
|
|
50
60
|
if (message)
|
|
51
|
-
options.onStderr?.(message);
|
|
61
|
+
options.onStderr?.(message, child.pid ?? -1);
|
|
52
62
|
});
|
|
53
63
|
const messageHandlers = new Set();
|
|
54
64
|
const exitHandlers = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-child.js","sourceRoot":"","sources":["../../src/sandbox/start-child.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAqB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,sBAAsB,GAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"start-child.js","sourceRoot":"","sources":["../../src/sandbox/start-child.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voicethere/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
"require": "./dist/index.js",
|
|
11
11
|
"default": "./dist/index.js"
|
|
12
12
|
},
|
|
13
|
+
"./runner": {
|
|
14
|
+
"types": "./dist/runner.d.ts",
|
|
15
|
+
"import": "./dist/runner.js",
|
|
16
|
+
"require": "./dist/runner.js",
|
|
17
|
+
"default": "./dist/runner.js"
|
|
18
|
+
},
|
|
13
19
|
"./verify": {
|
|
14
20
|
"types": "./dist/verify/run-verify.d.ts",
|
|
15
21
|
"import": "./dist/verify/run-verify.js",
|
|
@@ -31,8 +37,12 @@
|
|
|
31
37
|
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
|
|
32
38
|
"test": "vitest run",
|
|
33
39
|
"test:ci": "npm run typecheck && npm run build && npm run test && node scripts/ci/verify-package-exports.mjs",
|
|
34
|
-
"verify:local": "npm run build && node dist/cli.js verify --no-build --bundle dist/agent.js",
|
|
35
|
-
"verify:local:only": "node dist/cli.js verify --no-build --bundle dist/agent.js",
|
|
40
|
+
"verify:local": "npm run build && node ./dist/cli.js verify --no-build --bundle ./dist/agent.js",
|
|
41
|
+
"verify:local:only": "node ./dist/cli.js verify --no-build --bundle ./dist/agent.js",
|
|
42
|
+
"live-test:models": "bash ./scripts/select-sherpa-models.sh",
|
|
43
|
+
"live-test:page": "bash ./scripts/live-test-page.sh",
|
|
44
|
+
"live-test:starter": "bash ./scripts/live-test-starter.sh",
|
|
45
|
+
"live-test:stack": "bash ./scripts/live-test-stack.sh",
|
|
36
46
|
"prepublishOnly": "npm run build"
|
|
37
47
|
},
|
|
38
48
|
"repository": {
|
|
@@ -60,11 +70,14 @@
|
|
|
60
70
|
"esbuild": "^0.25.12"
|
|
61
71
|
},
|
|
62
72
|
"peerDependencies": {
|
|
63
|
-
"@node-webrtc-rust/sdk": ">=0.6.
|
|
73
|
+
"@node-webrtc-rust/sdk": ">=0.6.5"
|
|
64
74
|
},
|
|
65
75
|
"devDependencies": {
|
|
66
|
-
"@node-webrtc-rust/
|
|
76
|
+
"@node-webrtc-rust/helpers": "0.6.5",
|
|
77
|
+
"@node-webrtc-rust/sdk": "0.6.5",
|
|
78
|
+
"@node-webrtc-rust/signaling": "0.6.5",
|
|
67
79
|
"@types/node": "^22.10.0",
|
|
80
|
+
"http-server": "^14.1.1",
|
|
68
81
|
"tsx": "^4.19.2",
|
|
69
82
|
"typescript": "^5.7.0",
|
|
70
83
|
"vitest": "^2.1.8"
|