@voicethere/agent 0.7.2 → 0.7.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/verify/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,eAAe;IACf,mBAAmB;IACnB,sBAAsB;IACtB,qBAAqB;IACrB,WAAW;IACX,gBAAgB;CACR,CAAC;AAGX,MAAM,UAAU,cAAc,CAC5B,IAAc,EACd,MAAyB,OAAO,CAAC,GAAG,EACpC,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgC,EAChC,SAAiB,EACjB,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CACzB,CAAC,CAAC,EAAyD,EAAE,CAC3D,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAClD,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;gBACtC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,MAAM,CACJ,IAAI,KAAK,CACP,mBAAmB,SAAS,gCAAgC,CAC7D,CACF,CAAC;YACJ,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAgC,EAChC,SAAiB,EACjB,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CACvB,CACE,CAAC,EACkE,EAAE,CACrE,CAAC,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAC9D,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,cAAc,CAAC,GAAG,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;gBACtC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,MAAM,CACJ,IAAI,KAAK,CACP,mBAAmB,SAAS,4CAA4C,CACzE,CACF,CAAC;YACJ,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,YAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7C,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACvC,4DAA4D;QAC5D,sBAAsB;QACtB,0BAA0B;QAC1B,uCAAuC;QACvC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;QAC3D,IACE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,YAAoB;IAC7D,OAAO,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/verify/lib.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.7.2",
3
+ "version": "0.7.4",
4
4
  "description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
5
5
  "type": "module",
6
6
  "exports": {
@@ -92,12 +92,12 @@
92
92
  "esbuild": "0.25.12"
93
93
  },
94
94
  "peerDependencies": {
95
- "@node-webrtc-rust/sdk": ">=0.6.5"
95
+ "@node-webrtc-rust/sdk": ">=0.9.0"
96
96
  },
97
97
  "devDependencies": {
98
- "@node-webrtc-rust/helpers": "0.8.0",
99
- "@node-webrtc-rust/sdk": "0.8.0",
100
- "@node-webrtc-rust/signaling": "0.8.0",
98
+ "@node-webrtc-rust/helpers": "0.9.0",
99
+ "@node-webrtc-rust/sdk": "0.9.0",
100
+ "@node-webrtc-rust/signaling": "0.9.0",
101
101
  "@types/node": "22.20.1",
102
102
  "http-server": "14.1.1",
103
103
  "ioredis": "5.11.1",
@@ -48,6 +48,8 @@ function peerState(sessionId: string): PeerState {
48
48
  }
49
49
 
50
50
  function formatSpeechDetail(speech: SpeechEvent): string {
51
+ const language = (speech as SpeechEvent & { language?: string }).language;
52
+ if (language) return language;
51
53
  if (speech.text) return `"${speech.text}"`;
52
54
  if (speech.error) return speech.error;
53
55
  return "";
@@ -61,6 +63,12 @@ function handleSpeechEvent(sessionId: string, speech: SpeechEvent): void {
61
63
  const state = peerState(sessionId);
62
64
  const detail = formatSpeechDetail(speech);
63
65
 
66
+ // Published `@node-webrtc-rust/sdk` may not list `user_language` yet.
67
+ if ((speech.type as string) === "user_language") {
68
+ agentLog("info", `[${sessionId}] user_language ${detail}`);
69
+ return;
70
+ }
71
+
64
72
  switch (speech.type) {
65
73
  // --- User turn (VAD + STT) ---
66
74
  case "user_speaking_start":
@@ -170,6 +178,11 @@ defineAgent({
170
178
  speak(sessionId, `You said: ${text}`);
171
179
  },
172
180
 
181
+ onUserLanguage({ sessionId, language }) {
182
+ // Route prompts / TTS voice from the detected ISO 639-1 code
183
+ agentLog("info", `user_language ${sessionId} ${language}`);
184
+ },
185
+
173
186
  onSessionEnd({ sessionId }) {
174
187
  peers.delete(sessionId);
175
188
  agentLog("info", `session_end ${sessionId}`);
@@ -13,6 +13,7 @@
13
13
  * - `{ type: "mix", action: "set_tts_pose", clientId, pose }`
14
14
  * - `{ type: "mix", action: "speak", clientId, text }`
15
15
  * - `{ type: "mix", action: "clear_tts_pose", clientId }`
16
+ * - `{ type: "mix", action: "play", sessionIds?, bytes?, url?, volume? }`
16
17
  *
17
18
  * Acks: `{ type: "mix_ack", action, ok: true, statuses?, ... }` or `{ ok: false, error }`.
18
19
  * Ignores `ping` / chat strings (voice-control readiness).
@@ -23,6 +24,7 @@ import {
23
24
  createMixGroup,
24
25
  defineAgent,
25
26
  getClientMixStatus,
27
+ play,
26
28
  sendToClient,
27
29
  setClientPose,
28
30
  setGlobalMute,
@@ -68,7 +70,15 @@ export type MixCommand =
68
70
  | { type: "mix"; action: "get_status"; clientId?: string }
69
71
  | { type: "mix"; action: "set_tts_pose"; clientId: string; pose: MixPose }
70
72
  | { type: "mix"; action: "speak"; clientId: string; text: string }
71
- | { type: "mix"; action: "clear_tts_pose"; clientId: string };
73
+ | { type: "mix"; action: "clear_tts_pose"; clientId: string }
74
+ | {
75
+ type: "mix";
76
+ action: "play";
77
+ sessionIds?: string[];
78
+ bytes?: string;
79
+ url?: string;
80
+ volume?: number;
81
+ };
72
82
 
73
83
  export type MixClientStatus = {
74
84
  clientId?: string;
@@ -86,6 +96,7 @@ export type MixAck =
86
96
  sessionId?: string;
87
97
  clientIds?: string[];
88
98
  statuses?: MixClientStatus[];
99
+ playId?: string;
89
100
  }
90
101
  | { type: "mix_ack"; action: string; ok: false; error: string };
91
102
 
@@ -194,6 +205,47 @@ export function isMixCommand(message: unknown): message is MixCommand {
194
205
  clearMsg.clientId.trim().length > 0
195
206
  );
196
207
  }
208
+ case "play": {
209
+ const playMsg = message as {
210
+ sessionIds?: unknown;
211
+ bytes?: unknown;
212
+ url?: unknown;
213
+ volume?: unknown;
214
+ };
215
+ const hasBytes =
216
+ typeof playMsg.bytes === "string" && playMsg.bytes.trim().length > 0;
217
+ const hasUrl =
218
+ typeof playMsg.url === "string" && playMsg.url.trim().length > 0;
219
+ if (!hasBytes && !hasUrl) {
220
+ return false;
221
+ }
222
+ if (
223
+ playMsg.bytes !== undefined &&
224
+ (typeof playMsg.bytes !== "string" || playMsg.bytes.trim().length === 0)
225
+ ) {
226
+ return false;
227
+ }
228
+ if (
229
+ playMsg.url !== undefined &&
230
+ (typeof playMsg.url !== "string" || playMsg.url.trim().length === 0)
231
+ ) {
232
+ return false;
233
+ }
234
+ if (playMsg.sessionIds !== undefined) {
235
+ if (
236
+ !Array.isArray(playMsg.sessionIds) ||
237
+ !playMsg.sessionIds.every(
238
+ (id) => typeof id === "string" && id.trim().length > 0,
239
+ )
240
+ ) {
241
+ return false;
242
+ }
243
+ }
244
+ if (playMsg.volume !== undefined && typeof playMsg.volume !== "number") {
245
+ return false;
246
+ }
247
+ return true;
248
+ }
197
249
  default:
198
250
  return false;
199
251
  }
@@ -235,6 +287,7 @@ function ackOk(
235
287
  sessionId?: string;
236
288
  clientIds?: string[];
237
289
  statuses?: MixClientStatus[];
290
+ playId?: string;
238
291
  },
239
292
  ): void {
240
293
  sendToClient(sessionId, {
@@ -386,6 +439,24 @@ async function handleMixCommand(
386
439
  ackOk(sessionId, action);
387
440
  return;
388
441
  }
442
+ case "play": {
443
+ const inlineUrl =
444
+ command.url?.trim() || "https://example.com/inline-clip.wav";
445
+ const result = await play({
446
+ url: inlineUrl,
447
+ ...(command.sessionIds?.length
448
+ ? { sessionIds: command.sessionIds }
449
+ : {}),
450
+ ...(command.bytes ? { bytes: command.bytes } : {}),
451
+ ...(command.volume !== undefined ? { volume: command.volume } : {}),
452
+ });
453
+ if (!result.ok || !result.playId) {
454
+ ackError(sessionId, action, result.reason ?? "play failed");
455
+ return;
456
+ }
457
+ ackOk(sessionId, action, { playId: result.playId });
458
+ return;
459
+ }
389
460
  default:
390
461
  ackError(sessionId, "unknown", "unsupported mix action");
391
462
  }