@voicethere/agent 0.1.6 → 0.1.8
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/dist/agent.js +13 -2
- 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 +21 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +9 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +18 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +2 -2
- package/templates/README.md +17 -0
- package/templates/echo.ts +65 -0
package/dist/agent.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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" || msg.type === "data_channel_message";
|
|
5
|
+
return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message" || msg.type === "data_channel_binary";
|
|
6
6
|
}
|
|
7
7
|
function parseDataChannelPayload(raw) {
|
|
8
8
|
try {
|
|
@@ -39,7 +39,18 @@ function defineAgent(handlers) {
|
|
|
39
39
|
await handlers.onDataChannelMessage?.({
|
|
40
40
|
sessionId: message.sessionId,
|
|
41
41
|
message: parseDataChannelPayload(message.payload),
|
|
42
|
-
raw: message.payload
|
|
42
|
+
raw: message.payload,
|
|
43
|
+
rawBinary: null,
|
|
44
|
+
channel: "control"
|
|
45
|
+
});
|
|
46
|
+
break;
|
|
47
|
+
case "data_channel_binary":
|
|
48
|
+
await handlers.onDataChannelBinary?.({
|
|
49
|
+
sessionId: message.sessionId,
|
|
50
|
+
message: null,
|
|
51
|
+
raw: null,
|
|
52
|
+
rawBinary: message.data,
|
|
53
|
+
channel: message.channel ?? "sync"
|
|
43
54
|
});
|
|
44
55
|
break;
|
|
45
56
|
case "session_end":
|
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 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";
|
|
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 DataChannelBinaryMessage, type DataChannelKind, type SendBinaryToClientMessage, type SpeakMessage, type SpeechEventMessage, } from "./protocol.js";
|
|
3
|
+
export { agentLog, defineAgent, parseChatText, sendToClient, sendBinaryToClient, 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,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"}
|
|
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,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,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
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { ALLOWED_CHILD_ENV_KEYS, } from "./protocol.js";
|
|
2
|
-
export { agentLog, defineAgent, parseChatText, sendToClient, speak, } from "./runtime.js";
|
|
2
|
+
export { agentLog, defineAgent, parseChatText, sendToClient, sendBinaryToClient, speak, } from "./runtime.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
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,GAevB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,GAMN,MAAM,cAAc,CAAC"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -15,13 +15,15 @@ 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 | DataChannelMessageMessage;
|
|
18
|
+
export type ParentToChildMessage = SessionStartMessage | SpeechEventMessage | SessionEndMessage | DataChannelMessageMessage | DataChannelBinaryMessage;
|
|
19
19
|
/**
|
|
20
20
|
* Messages the customer child may send back to the runner parent.
|
|
21
21
|
*
|
|
22
|
-
* Prefer {@link speak}, {@link sendToClient}, and {@link agentLog} helpers over raw `process.send`.
|
|
22
|
+
* Prefer {@link speak}, {@link sendToClient}, {@link sendBinaryToClient}, and {@link agentLog} helpers over raw `process.send`.
|
|
23
23
|
*/
|
|
24
|
-
export type ChildToParentMessage = SpeakMessage | AgentLogMessage | AgentErrorMessage | SendToClientMessage;
|
|
24
|
+
export type ChildToParentMessage = SpeakMessage | AgentLogMessage | AgentErrorMessage | SendToClientMessage | SendBinaryToClientMessage;
|
|
25
|
+
/** Which WebRTC data channel carried a binary IPC payload. */
|
|
26
|
+
export type DataChannelKind = "control" | "sync";
|
|
25
27
|
/**
|
|
26
28
|
* A WebRTC peer connected to the runner and mapped to this child process.
|
|
27
29
|
*
|
|
@@ -73,6 +75,15 @@ export interface DataChannelMessageMessage {
|
|
|
73
75
|
/** UTF-8 JSON string from the browser peer. */
|
|
74
76
|
payload: string;
|
|
75
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Raw binary payload from the browser data channel (`voice-control` or `voicethere-sync`).
|
|
80
|
+
*/
|
|
81
|
+
export interface DataChannelBinaryMessage {
|
|
82
|
+
type: "data_channel_binary";
|
|
83
|
+
sessionId: string;
|
|
84
|
+
data: Buffer;
|
|
85
|
+
channel?: DataChannelKind;
|
|
86
|
+
}
|
|
76
87
|
/**
|
|
77
88
|
* Ask the parent to synthesize speech on the agent outbound WebRTC track.
|
|
78
89
|
*
|
|
@@ -117,6 +128,13 @@ export interface SendToClientMessage {
|
|
|
117
128
|
sessionId: string;
|
|
118
129
|
payload: unknown;
|
|
119
130
|
}
|
|
131
|
+
/** Send raw bytes to the browser peer over a WebRTC data channel. */
|
|
132
|
+
export interface SendBinaryToClientMessage {
|
|
133
|
+
type: "send_binary_to_client";
|
|
134
|
+
sessionId: string;
|
|
135
|
+
data: Buffer;
|
|
136
|
+
channel?: DataChannelKind;
|
|
137
|
+
}
|
|
120
138
|
/**
|
|
121
139
|
* Environment variable names the runner may inject into {@link SessionStartMessage.env}.
|
|
122
140
|
*
|
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,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,GACzB,wBAAwB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,yBAAyB,CAAC;AAE9B,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;;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;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,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;;;;;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;AAyJH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,YAAY;IACZ,UAAU;CACF,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SpeechEvent } from "@node-webrtc-rust/sdk/voice";
|
|
2
|
+
import type { DataChannelKind } from "./protocol.js";
|
|
2
3
|
export interface SessionContext {
|
|
3
4
|
sessionId: string;
|
|
4
5
|
env: Record<string, string>;
|
|
@@ -14,7 +15,10 @@ export interface DataChannelContext {
|
|
|
14
15
|
sessionId: string;
|
|
15
16
|
/** Parsed JSON when the payload is valid JSON; otherwise the raw string. */
|
|
16
17
|
message: unknown;
|
|
17
|
-
raw: string;
|
|
18
|
+
raw: string | null;
|
|
19
|
+
/** Present when the parent forwarded a binary data channel frame. */
|
|
20
|
+
rawBinary: Buffer | null;
|
|
21
|
+
channel: DataChannelKind;
|
|
18
22
|
}
|
|
19
23
|
export interface AgentHandlers {
|
|
20
24
|
onSessionStart?: (ctx: SessionContext) => void | Promise<void>;
|
|
@@ -27,6 +31,8 @@ export interface AgentHandlers {
|
|
|
27
31
|
}) => void | Promise<void>;
|
|
28
32
|
/** Browser data channel JSON (chat, custom app protocol). */
|
|
29
33
|
onDataChannelMessage?: (ctx: DataChannelContext) => void | Promise<void>;
|
|
34
|
+
/** Browser data channel binary (game state, custom framing). */
|
|
35
|
+
onDataChannelBinary?: (ctx: DataChannelContext) => void | Promise<void>;
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
32
38
|
* Register IPC handlers for a customer agent child process.
|
|
@@ -37,6 +43,8 @@ export declare function defineAgent(handlers: AgentHandlers): void;
|
|
|
37
43
|
export declare function speak(sessionId: string, text: string): void;
|
|
38
44
|
/** Send a JSON payload to the browser peer via the runner parent. */
|
|
39
45
|
export declare function sendToClient(sessionId: string, payload: unknown): void;
|
|
46
|
+
/** Send raw bytes to the browser peer via the runner parent. */
|
|
47
|
+
export declare function sendBinaryToClient(sessionId: string, data: Buffer | Uint8Array, channel?: DataChannelKind): void;
|
|
40
48
|
/** Structured log forwarded to the runner parent. */
|
|
41
49
|
export declare function agentLog(level: "info" | "error", message: string): void;
|
|
42
50
|
/** Extract chat text from a parsed data channel message. */
|
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":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,eAAe,CAAC;AAEvB,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,GAAG,IAAI,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,eAAe,CAAC;CAC1B;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;IACzE,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAsBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CA8DzD;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,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,GAAE,eAAwB,GAChC,IAAI,CAGN;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
|
@@ -5,7 +5,8 @@ function isParentMessage(value) {
|
|
|
5
5
|
return (msg.type === "session_start" ||
|
|
6
6
|
msg.type === "speech_event" ||
|
|
7
7
|
msg.type === "session_end" ||
|
|
8
|
-
msg.type === "data_channel_message"
|
|
8
|
+
msg.type === "data_channel_message" ||
|
|
9
|
+
msg.type === "data_channel_binary");
|
|
9
10
|
}
|
|
10
11
|
function parseDataChannelPayload(raw) {
|
|
11
12
|
try {
|
|
@@ -48,6 +49,17 @@ export function defineAgent(handlers) {
|
|
|
48
49
|
sessionId: message.sessionId,
|
|
49
50
|
message: parseDataChannelPayload(message.payload),
|
|
50
51
|
raw: message.payload,
|
|
52
|
+
rawBinary: null,
|
|
53
|
+
channel: "control",
|
|
54
|
+
});
|
|
55
|
+
break;
|
|
56
|
+
case "data_channel_binary":
|
|
57
|
+
await handlers.onDataChannelBinary?.({
|
|
58
|
+
sessionId: message.sessionId,
|
|
59
|
+
message: null,
|
|
60
|
+
raw: null,
|
|
61
|
+
rawBinary: message.data,
|
|
62
|
+
channel: message.channel ?? "sync",
|
|
51
63
|
});
|
|
52
64
|
break;
|
|
53
65
|
case "session_end":
|
|
@@ -74,6 +86,11 @@ export function speak(sessionId, text) {
|
|
|
74
86
|
export function sendToClient(sessionId, payload) {
|
|
75
87
|
process.send?.({ type: "send_to_client", sessionId, payload });
|
|
76
88
|
}
|
|
89
|
+
/** Send raw bytes to the browser peer via the runner parent. */
|
|
90
|
+
export function sendBinaryToClient(sessionId, data, channel = "sync") {
|
|
91
|
+
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
92
|
+
process.send?.({ type: "send_binary_to_client", sessionId, data: buffer, channel });
|
|
93
|
+
}
|
|
77
94
|
/** Structured log forwarded to the runner parent. */
|
|
78
95
|
export function agentLog(level, message) {
|
|
79
96
|
process.send?.({ type: "log", level, message });
|
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.8",
|
|
4
4
|
"description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"esbuild": "^0.25.12"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@node-webrtc-rust/sdk": ">=0.5.
|
|
59
|
+
"@node-webrtc-rust/sdk": ">=0.5.4"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/node": "^22.10.0",
|
package/templates/README.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Agent templates
|
|
2
2
|
|
|
3
|
+
## `echo.ts`
|
|
4
|
+
|
|
5
|
+
Full echo debug agent for the VoiceThere dashboard — speaks **"you said: …"** on voice finals and text chat, relays speech events over DataChannel, and echoes chat replies on DC.
|
|
6
|
+
|
|
7
|
+
**Build:**
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @voicethere/agent
|
|
11
|
+
npx @voicethere/agent build --entry templates/echo.ts
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Platform auto-seeds the built bundle when a project is created with the **Echo (voice + chat)** template.
|
|
15
|
+
|
|
16
|
+
## `echo-dc.ts`
|
|
17
|
+
|
|
18
|
+
Data-channel-only echo — relays speech events and chat text over DC without TTS. Use when debugging the dashboard chat panel without agent playback.
|
|
19
|
+
|
|
3
20
|
## `agent.ts`
|
|
4
21
|
|
|
5
22
|
Full starter bundle covering every speech event from `@node-webrtc-rust/sdk/voice`:
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full echo agent — speaks and chats back "you said: …" for voice and text.
|
|
3
|
+
*
|
|
4
|
+
* Build:
|
|
5
|
+
* npm install @voicethere/agent
|
|
6
|
+
* npx @voicethere/agent build --entry templates/echo.ts
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
agentLog,
|
|
10
|
+
defineAgent,
|
|
11
|
+
parseChatText,
|
|
12
|
+
sendToClient,
|
|
13
|
+
speak,
|
|
14
|
+
type SpeechEvent,
|
|
15
|
+
} from "@voicethere/agent";
|
|
16
|
+
|
|
17
|
+
const echoPrefix =
|
|
18
|
+
(process.env.AGENT_ECHO_PREFIX ?? "you said:").trim() || "you said:";
|
|
19
|
+
|
|
20
|
+
function formatEcho(text: string): string {
|
|
21
|
+
return `${echoPrefix} ${text}`.trim();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
defineAgent({
|
|
25
|
+
onSessionStart({ sessionId }) {
|
|
26
|
+
sendToClient(sessionId, {
|
|
27
|
+
type: "agent_event",
|
|
28
|
+
event: "session_start",
|
|
29
|
+
sessionId,
|
|
30
|
+
});
|
|
31
|
+
agentLog("info", `echo session_start ${sessionId}`);
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
onSpeechEvent({ sessionId }, event: SpeechEvent) {
|
|
35
|
+
sendToClient(sessionId, {
|
|
36
|
+
type: "agent_event",
|
|
37
|
+
event: event.type,
|
|
38
|
+
text: event.text,
|
|
39
|
+
raw: event,
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
onUserSpeechFinal({ sessionId, text }) {
|
|
44
|
+
const reply = formatEcho(text);
|
|
45
|
+
speak(sessionId, reply);
|
|
46
|
+
sendToClient(sessionId, { type: "chat_reply", text: reply });
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
onDataChannelMessage(ctx) {
|
|
50
|
+
const text = parseChatText(ctx.message);
|
|
51
|
+
if (!text) return;
|
|
52
|
+
const reply = formatEcho(text);
|
|
53
|
+
sendToClient(ctx.sessionId, { type: "chat_reply", text: reply });
|
|
54
|
+
speak(ctx.sessionId, reply);
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
onSessionEnd({ sessionId }) {
|
|
58
|
+
sendToClient(sessionId, {
|
|
59
|
+
type: "agent_event",
|
|
60
|
+
event: "session_end",
|
|
61
|
+
sessionId,
|
|
62
|
+
});
|
|
63
|
+
agentLog("info", `echo session_end ${sessionId}`);
|
|
64
|
+
},
|
|
65
|
+
});
|