@voicethere/agent 0.1.14 → 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 +17 -0
- package/dist/protocol.d.ts +1 -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/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 +16 -3
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
|
@@ -182,6 +182,9 @@ function speak(sessionId, text) {
|
|
|
182
182
|
if (endedSessionIds.has(sessionId)) return;
|
|
183
183
|
process.send?.({ type: "speak", sessionId, text });
|
|
184
184
|
}
|
|
185
|
+
function sendToClient(sessionId, payload) {
|
|
186
|
+
process.send?.({ type: "send_to_client", sessionId, payload });
|
|
187
|
+
}
|
|
185
188
|
function agentLog(level, message, sessionId) {
|
|
186
189
|
const resolvedSessionId = sessionId ?? agentLogSessionContext.getStore();
|
|
187
190
|
process.send?.({
|
|
@@ -191,6 +194,13 @@ function agentLog(level, message, sessionId) {
|
|
|
191
194
|
...resolvedSessionId ? { sessionId: resolvedSessionId } : {}
|
|
192
195
|
});
|
|
193
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;
|
|
203
|
+
}
|
|
194
204
|
|
|
195
205
|
// examples/agent.ts
|
|
196
206
|
var peers = /* @__PURE__ */ new Map();
|
|
@@ -283,6 +293,13 @@ defineAgent({
|
|
|
283
293
|
onUserSpeechFinal({ sessionId, text }) {
|
|
284
294
|
speak(sessionId, `You said: ${text}`);
|
|
285
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
|
+
},
|
|
286
303
|
onSessionEnd({ sessionId }) {
|
|
287
304
|
peers.delete(sessionId);
|
|
288
305
|
agentLog("info", `session_end ${sessionId}`);
|
package/dist/protocol.d.ts
CHANGED
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;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,iGAOzB,CAAC;AAEX,0CAA0C;AAC1C,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,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"}
|
|
@@ -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": {
|
|
@@ -63,8 +73,11 @@
|
|
|
63
73
|
"@node-webrtc-rust/sdk": ">=0.6.5"
|
|
64
74
|
},
|
|
65
75
|
"devDependencies": {
|
|
76
|
+
"@node-webrtc-rust/helpers": "0.6.5",
|
|
66
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"
|