@voicethere/agent 0.1.4 → 0.1.6
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/LICENSE +21 -0
- package/README.md +4 -0
- package/dist/agent.js +15 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +20 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +12 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +31 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +4 -3
- package/templates/echo-dc.ts +55 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 A KIRILYUK LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -248,3 +248,7 @@ See [`scripts/RELEASE.md`](./scripts/RELEASE.md) — tag `release/X.Y.Z` trigger
|
|
|
248
248
|
| VoiceThere agent runner (internal session worker) | Hosts your `agent.js` bundle in production and local E2E |
|
|
249
249
|
| [`voicethere/cli`](https://github.com/voicethere/cli) | CLI for the VoiceThere platform (projects, deploys, sessions) |
|
|
250
250
|
| [`akirilyuk/node-webrtc-rust`](https://github.com/akirilyuk/node-webrtc-rust) | WebRTC + voice SDK (`SpeechEvent` types) |
|
|
251
|
+
|
|
252
|
+
## License
|
|
253
|
+
|
|
254
|
+
MIT — see [LICENSE](./LICENSE).
|
package/dist/agent.js
CHANGED
|
@@ -2,7 +2,14 @@
|
|
|
2
2
|
function isParentMessage(value) {
|
|
3
3
|
if (!value || typeof value !== "object") return false;
|
|
4
4
|
const msg = value;
|
|
5
|
-
return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end";
|
|
5
|
+
return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message";
|
|
6
|
+
}
|
|
7
|
+
function parseDataChannelPayload(raw) {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
} catch {
|
|
11
|
+
return raw;
|
|
12
|
+
}
|
|
6
13
|
}
|
|
7
14
|
function defineAgent(handlers) {
|
|
8
15
|
process.on("message", (message) => {
|
|
@@ -28,6 +35,13 @@ function defineAgent(handlers) {
|
|
|
28
35
|
});
|
|
29
36
|
}
|
|
30
37
|
break;
|
|
38
|
+
case "data_channel_message":
|
|
39
|
+
await handlers.onDataChannelMessage?.({
|
|
40
|
+
sessionId: message.sessionId,
|
|
41
|
+
message: parseDataChannelPayload(message.payload),
|
|
42
|
+
raw: message.payload
|
|
43
|
+
});
|
|
44
|
+
break;
|
|
31
45
|
case "session_end":
|
|
32
46
|
await handlers.onSessionEnd?.({ sessionId: message.sessionId });
|
|
33
47
|
break;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export type { SpeechEvent, SpeechEventListener, SpeechEventName, SpeechEventType, } from "@node-webrtc-rust/sdk/voice";
|
|
2
|
-
export { ALLOWED_CHILD_ENV_KEYS, type AgentErrorMessage, type AgentLogMessage, type AllowedChildEnvKey, type ChildToParentMessage, type ParentToChildMessage, type SessionEndMessage, type SessionStartMessage, type SpeakMessage, type SpeechEventMessage, } from "./protocol.js";
|
|
3
|
-
export { agentLog, defineAgent, speak, type AgentHandlers, type SessionContext, type SpeechContext, type SpeechEventContext, } from "./runtime.js";
|
|
2
|
+
export { ALLOWED_CHILD_ENV_KEYS, type AgentErrorMessage, type AgentLogMessage, type AllowedChildEnvKey, type ChildToParentMessage, type ParentToChildMessage, type SessionEndMessage, type SessionStartMessage, type SendToClientMessage, type DataChannelMessageMessage, type SpeakMessage, type SpeechEventMessage, } from "./protocol.js";
|
|
3
|
+
export { agentLog, defineAgent, parseChatText, sendToClient, speak, type AgentHandlers, type DataChannelContext, type SessionContext, type SpeechContext, type SpeechEventContext, } from "./runtime.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,KAAK,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,sBAAsB,GAYvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,GAMN,MAAM,cAAc,CAAC"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -15,13 +15,13 @@ import type { SpeechEvent } from "@node-webrtc-rust/sdk/voice";
|
|
|
15
15
|
* Register handlers via {@link defineAgent} in `@voicethere/agent` — do not read
|
|
16
16
|
* `process.on('message')` directly in customer bundles.
|
|
17
17
|
*/
|
|
18
|
-
export type ParentToChildMessage = SessionStartMessage | SpeechEventMessage | SessionEndMessage;
|
|
18
|
+
export type ParentToChildMessage = SessionStartMessage | SpeechEventMessage | SessionEndMessage | DataChannelMessageMessage;
|
|
19
19
|
/**
|
|
20
20
|
* Messages the customer child may send back to the runner parent.
|
|
21
21
|
*
|
|
22
|
-
* Prefer {@link speak} and {@link agentLog} helpers over raw `process.send`.
|
|
22
|
+
* Prefer {@link speak}, {@link sendToClient}, and {@link agentLog} helpers over raw `process.send`.
|
|
23
23
|
*/
|
|
24
|
-
export type ChildToParentMessage = SpeakMessage | AgentLogMessage | AgentErrorMessage;
|
|
24
|
+
export type ChildToParentMessage = SpeakMessage | AgentLogMessage | AgentErrorMessage | SendToClientMessage;
|
|
25
25
|
/**
|
|
26
26
|
* A WebRTC peer connected to the runner and mapped to this child process.
|
|
27
27
|
*
|
|
@@ -64,6 +64,15 @@ export interface SessionEndMessage {
|
|
|
64
64
|
/** Peer/session id that ended. */
|
|
65
65
|
sessionId: string;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Raw JSON payload received from the browser data channel (voice-control or voicethere).
|
|
69
|
+
*/
|
|
70
|
+
export interface DataChannelMessageMessage {
|
|
71
|
+
type: "data_channel_message";
|
|
72
|
+
sessionId: string;
|
|
73
|
+
/** UTF-8 JSON string from the browser peer. */
|
|
74
|
+
payload: string;
|
|
75
|
+
}
|
|
67
76
|
/**
|
|
68
77
|
* Ask the parent to synthesize speech on the agent outbound WebRTC track.
|
|
69
78
|
*
|
|
@@ -100,6 +109,14 @@ export interface AgentErrorMessage {
|
|
|
100
109
|
/** Human-readable error summary (no stack traces required). */
|
|
101
110
|
message: string;
|
|
102
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Send a JSON-serializable payload to the browser peer over the WebRTC data channel.
|
|
114
|
+
*/
|
|
115
|
+
export interface SendToClientMessage {
|
|
116
|
+
type: "send_to_client";
|
|
117
|
+
sessionId: string;
|
|
118
|
+
payload: unknown;
|
|
119
|
+
}
|
|
103
120
|
/**
|
|
104
121
|
* Environment variable names the runner may inject into {@link SessionStartMessage.env}.
|
|
105
122
|
*
|
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,CAAC;
|
|
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,CAAC;AAE9B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,mBAAmB,CAAC;AAExB;;;;;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;;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;;;;;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;CACjB;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;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,mDAIzB,CAAC;AAEX,0CAA0C;AAC1C,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
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;AAkIH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,YAAY;IACZ,UAAU;CACF,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -10,6 +10,12 @@ export interface SpeechContext {
|
|
|
10
10
|
export interface SpeechEventContext {
|
|
11
11
|
sessionId: string;
|
|
12
12
|
}
|
|
13
|
+
export interface DataChannelContext {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
/** Parsed JSON when the payload is valid JSON; otherwise the raw string. */
|
|
16
|
+
message: unknown;
|
|
17
|
+
raw: string;
|
|
18
|
+
}
|
|
13
19
|
export interface AgentHandlers {
|
|
14
20
|
onSessionStart?: (ctx: SessionContext) => void | Promise<void>;
|
|
15
21
|
/** Fired for every speech lifecycle event from the parent voice pipeline. */
|
|
@@ -19,6 +25,8 @@ export interface AgentHandlers {
|
|
|
19
25
|
onSessionEnd?: (ctx: {
|
|
20
26
|
sessionId: string;
|
|
21
27
|
}) => void | Promise<void>;
|
|
28
|
+
/** Browser data channel JSON (chat, custom app protocol). */
|
|
29
|
+
onDataChannelMessage?: (ctx: DataChannelContext) => void | Promise<void>;
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
32
|
* Register IPC handlers for a customer agent child process.
|
|
@@ -27,6 +35,10 @@ export interface AgentHandlers {
|
|
|
27
35
|
export declare function defineAgent(handlers: AgentHandlers): void;
|
|
28
36
|
/** Ask the runner parent to synthesize speech for the session. */
|
|
29
37
|
export declare function speak(sessionId: string, text: string): void;
|
|
38
|
+
/** Send a JSON payload to the browser peer via the runner parent. */
|
|
39
|
+
export declare function sendToClient(sessionId: string, payload: unknown): void;
|
|
30
40
|
/** Structured log forwarded to the runner parent. */
|
|
31
41
|
export declare function agentLog(level: "info" | "error", message: string): void;
|
|
42
|
+
/** Extract chat text from a parsed data channel message. */
|
|
43
|
+
export declare function parseChatText(message: unknown): string | null;
|
|
32
44
|
//# sourceMappingURL=runtime.d.ts.map
|
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;AAI/D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,CACd,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,WAAW,KACf,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,CACd,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,WAAW,KACf,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAqBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAmDzD;AAED,kEAAkE;AAClE,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEtE;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEvE;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAM7D"}
|
package/dist/runtime.js
CHANGED
|
@@ -4,7 +4,16 @@ function isParentMessage(value) {
|
|
|
4
4
|
const msg = value;
|
|
5
5
|
return (msg.type === "session_start" ||
|
|
6
6
|
msg.type === "speech_event" ||
|
|
7
|
-
msg.type === "session_end"
|
|
7
|
+
msg.type === "session_end" ||
|
|
8
|
+
msg.type === "data_channel_message");
|
|
9
|
+
}
|
|
10
|
+
function parseDataChannelPayload(raw) {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return raw;
|
|
16
|
+
}
|
|
8
17
|
}
|
|
9
18
|
/**
|
|
10
19
|
* Register IPC handlers for a customer agent child process.
|
|
@@ -34,6 +43,13 @@ export function defineAgent(handlers) {
|
|
|
34
43
|
});
|
|
35
44
|
}
|
|
36
45
|
break;
|
|
46
|
+
case "data_channel_message":
|
|
47
|
+
await handlers.onDataChannelMessage?.({
|
|
48
|
+
sessionId: message.sessionId,
|
|
49
|
+
message: parseDataChannelPayload(message.payload),
|
|
50
|
+
raw: message.payload,
|
|
51
|
+
});
|
|
52
|
+
break;
|
|
37
53
|
case "session_end":
|
|
38
54
|
await handlers.onSessionEnd?.({ sessionId: message.sessionId });
|
|
39
55
|
break;
|
|
@@ -54,8 +70,22 @@ export function defineAgent(handlers) {
|
|
|
54
70
|
export function speak(sessionId, text) {
|
|
55
71
|
process.send?.({ type: "speak", sessionId, text });
|
|
56
72
|
}
|
|
73
|
+
/** Send a JSON payload to the browser peer via the runner parent. */
|
|
74
|
+
export function sendToClient(sessionId, payload) {
|
|
75
|
+
process.send?.({ type: "send_to_client", sessionId, payload });
|
|
76
|
+
}
|
|
57
77
|
/** Structured log forwarded to the runner parent. */
|
|
58
78
|
export function agentLog(level, message) {
|
|
59
79
|
process.send?.({ type: "log", level, message });
|
|
60
80
|
}
|
|
81
|
+
/** Extract chat text from a parsed data channel message. */
|
|
82
|
+
export function parseChatText(message) {
|
|
83
|
+
if (!message || typeof message !== "object")
|
|
84
|
+
return null;
|
|
85
|
+
const record = message;
|
|
86
|
+
if (record.type !== "chat" || typeof record.text !== "string")
|
|
87
|
+
return null;
|
|
88
|
+
const trimmed = record.text.trim();
|
|
89
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
90
|
+
}
|
|
61
91
|
//# sourceMappingURL=runtime.js.map
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voicethere/agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"dist",
|
|
19
19
|
"templates",
|
|
20
|
-
"README.md"
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
21
22
|
],
|
|
22
23
|
"scripts": {
|
|
23
24
|
"build:lib": "tsc -p tsconfig.json && mkdir -p dist/sandbox && cp src/sandbox/loader-entry.js dist/sandbox/",
|
|
@@ -50,7 +51,7 @@
|
|
|
50
51
|
"engines": {
|
|
51
52
|
"node": ">=22"
|
|
52
53
|
},
|
|
53
|
-
"license": "
|
|
54
|
+
"license": "MIT",
|
|
54
55
|
"dependencies": {
|
|
55
56
|
"esbuild": "^0.25.12"
|
|
56
57
|
},
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Echo debug agent — relays speech events and chat replies over the data channel.
|
|
3
|
+
*
|
|
4
|
+
* Build:
|
|
5
|
+
* npm install @voicethere/agent
|
|
6
|
+
* npx @voicethere/agent build --entry templates/echo-dc.ts
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
agentLog,
|
|
10
|
+
defineAgent,
|
|
11
|
+
parseChatText,
|
|
12
|
+
sendToClient,
|
|
13
|
+
type SpeechEvent,
|
|
14
|
+
} from "@voicethere/agent";
|
|
15
|
+
|
|
16
|
+
const echoPrefix =
|
|
17
|
+
(process.env.AGENT_ECHO_PREFIX ?? "you said:").trim() || "you said:";
|
|
18
|
+
|
|
19
|
+
defineAgent({
|
|
20
|
+
onSessionStart({ sessionId }) {
|
|
21
|
+
sendToClient(sessionId, {
|
|
22
|
+
type: "agent_event",
|
|
23
|
+
event: "session_start",
|
|
24
|
+
sessionId,
|
|
25
|
+
});
|
|
26
|
+
agentLog("info", `echo-dc session_start ${sessionId}`);
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
onSpeechEvent({ sessionId }, event: SpeechEvent) {
|
|
30
|
+
sendToClient(sessionId, {
|
|
31
|
+
type: "agent_event",
|
|
32
|
+
event: event.type,
|
|
33
|
+
text: event.text,
|
|
34
|
+
raw: event,
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
onDataChannelMessage(ctx) {
|
|
39
|
+
const text = parseChatText(ctx.message);
|
|
40
|
+
if (!text) return;
|
|
41
|
+
sendToClient(ctx.sessionId, {
|
|
42
|
+
type: "chat_reply",
|
|
43
|
+
text: `${echoPrefix} ${text}`,
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
onSessionEnd({ sessionId }) {
|
|
48
|
+
sendToClient(sessionId, {
|
|
49
|
+
type: "agent_event",
|
|
50
|
+
event: "session_end",
|
|
51
|
+
sessionId,
|
|
52
|
+
});
|
|
53
|
+
agentLog("info", `echo-dc session_end ${sessionId}`);
|
|
54
|
+
},
|
|
55
|
+
});
|