@voicethere/agent 0.8.3 → 0.9.1

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.
@@ -178,6 +178,12 @@ function isSttControlAckMessage(value) {
178
178
  const msg = value;
179
179
  return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
180
180
  }
181
+ function isVoiceLanguageControlAckMessage(value) {
182
+ if (!value || typeof value !== "object")
183
+ return false;
184
+ const msg = value;
185
+ return msg.type === "voice_language_control_ack" && typeof msg.requestId === "string";
186
+ }
181
187
  function isWebhookMessage(value) {
182
188
  if (!value || typeof value !== "object")
183
189
  return false;
@@ -220,7 +226,7 @@ function isParentMessage(value) {
220
226
  if (!value || typeof value !== "object")
221
227
  return false;
222
228
  const msg = value;
223
- return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message" || msg.type === "data_channel_binary" || msg.type === "idle_timeout" || msg.type === "recording_control_ack" || msg.type === "conversation_history_control_ack" || msg.type === "play_ack" || msg.type === "play_status_ack" || msg.type === "play_stop_ack" || msg.type === "play_pose_ack" || msg.type === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "webhook";
229
+ return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message" || msg.type === "data_channel_binary" || msg.type === "idle_timeout" || msg.type === "recording_control_ack" || msg.type === "conversation_history_control_ack" || msg.type === "play_ack" || msg.type === "play_status_ack" || msg.type === "play_stop_ack" || msg.type === "play_pose_ack" || msg.type === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "voice_language_control_ack" || msg.type === "webhook";
224
230
  }
225
231
  function isSessionScopedParentMessage(value) {
226
232
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -236,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
236
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
237
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
238
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
239
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
240
248
  var endedSessionIds = /* @__PURE__ */ new Set();
241
249
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -247,6 +255,7 @@ var pendingPlayStopAcks = /* @__PURE__ */ new Map();
247
255
  var pendingPlayPoseAcks = /* @__PURE__ */ new Map();
248
256
  var pendingMixAcks = /* @__PURE__ */ new Map();
249
257
  var pendingSttAcks = /* @__PURE__ */ new Map();
258
+ var pendingVoiceLanguageAcks = /* @__PURE__ */ new Map();
250
259
  function handleRecordingControlAck(message) {
251
260
  const pending = pendingRecordingAcks.get(message.requestId);
252
261
  if (!pending)
@@ -349,6 +358,27 @@ function handleSttControlAck(message) {
349
358
  requestId: message.requestId
350
359
  });
351
360
  }
361
+ function handleVoiceLanguageControlAck(message) {
362
+ const pending = pendingVoiceLanguageAcks.get(message.requestId);
363
+ if (!pending)
364
+ return;
365
+ clearTimeout(pending.timer);
366
+ pendingVoiceLanguageAcks.delete(message.requestId);
367
+ if (message.ok && message.language?.trim()) {
368
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
369
+ }
370
+ pending.resolve({
371
+ ok: message.ok,
372
+ reason: message.reason,
373
+ requestId: message.requestId,
374
+ ...message.language ? { language: message.language } : {},
375
+ ...message.voice ? { voice: message.voice } : {},
376
+ ...message.stt ? { stt: message.stt } : {},
377
+ ...message.scope ? { scope: message.scope } : {},
378
+ ...message.sttProvider ? { sttProvider: message.sttProvider } : {},
379
+ ...message.ttsProvider ? { ttsProvider: message.ttsProvider } : {}
380
+ });
381
+ }
352
382
  function clearPendingRecordingAcksForSession(sessionId, reason) {
353
383
  for (const [requestId, pending] of pendingRecordingAcks) {
354
384
  if (pending.sessionId !== sessionId)
@@ -414,7 +444,7 @@ function allowOutboundForSession(sessionId) {
414
444
  }
415
445
  function sendParentMessage(message) {
416
446
  const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
417
- if (msgType === "mix_control" || msgType === "stt_control") {
447
+ if (msgType === "mix_control" || msgType === "stt_control" || msgType === "voice_language_control") {
418
448
  process.send?.(message);
419
449
  return;
420
450
  }
@@ -515,6 +545,7 @@ async function handleParentMessage(message, handlers) {
515
545
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
516
546
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
517
547
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
548
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
518
549
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
519
550
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
520
551
  if (sessionStartInitDelayMs > 0) {
@@ -526,6 +557,7 @@ async function handleParentMessage(message, handlers) {
526
557
  recordingAvailable: message.recordingAvailable ?? false,
527
558
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
528
559
  mixAvailable: message.mixAvailable ?? false,
560
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
529
561
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
530
562
  });
531
563
  sendParentMessage({
@@ -544,12 +576,23 @@ async function handleParentMessage(message, handlers) {
544
576
  if (message.event.type === "user_language") {
545
577
  const language = resolveUserLanguageCode(message.event);
546
578
  if (language) {
579
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
547
580
  await handlers.onUserLanguage?.({
548
581
  sessionId: message.sessionId,
549
582
  language
550
583
  });
551
584
  }
552
585
  }
586
+ if (message.event.type === "voice_language_changed") {
587
+ const language = resolveUserLanguageCode(message.event);
588
+ if (language) {
589
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
590
+ await handlers.onVoiceLanguageChanged?.({
591
+ sessionId: message.sessionId,
592
+ language
593
+ });
594
+ }
595
+ }
553
596
  break;
554
597
  case "data_channel_message":
555
598
  await handlers.onDataChannelMessage?.({
@@ -576,6 +619,8 @@ async function handleParentMessage(message, handlers) {
576
619
  recordingAvailableBySessionId.delete(message.sessionId);
577
620
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
578
621
  mixAvailableBySessionId.delete(message.sessionId);
622
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
623
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
579
624
  ttsPoseAvailableBySessionId.delete(message.sessionId);
580
625
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
581
626
  sessionId: message.sessionId
@@ -624,6 +669,10 @@ function defineAgent(handlers) {
624
669
  handleSttControlAck(message);
625
670
  return;
626
671
  }
672
+ if (isVoiceLanguageControlAckMessage(message)) {
673
+ handleVoiceLanguageControlAck(message);
674
+ return;
675
+ }
627
676
  if (isWebhookMessage(message)) {
628
677
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
629
678
  return;
@@ -10932,6 +10932,12 @@ function isSttControlAckMessage(value) {
10932
10932
  const msg = value;
10933
10933
  return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
10934
10934
  }
10935
+ function isVoiceLanguageControlAckMessage(value) {
10936
+ if (!value || typeof value !== "object")
10937
+ return false;
10938
+ const msg = value;
10939
+ return msg.type === "voice_language_control_ack" && typeof msg.requestId === "string";
10940
+ }
10935
10941
  function isWebhookMessage(value) {
10936
10942
  if (!value || typeof value !== "object")
10937
10943
  return false;
@@ -10974,7 +10980,7 @@ function isParentMessage(value) {
10974
10980
  if (!value || typeof value !== "object")
10975
10981
  return false;
10976
10982
  const msg = value;
10977
- return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message" || msg.type === "data_channel_binary" || msg.type === "idle_timeout" || msg.type === "recording_control_ack" || msg.type === "conversation_history_control_ack" || msg.type === "play_ack" || msg.type === "play_status_ack" || msg.type === "play_stop_ack" || msg.type === "play_pose_ack" || msg.type === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "webhook";
10983
+ return msg.type === "session_start" || msg.type === "speech_event" || msg.type === "session_end" || msg.type === "data_channel_message" || msg.type === "data_channel_binary" || msg.type === "idle_timeout" || msg.type === "recording_control_ack" || msg.type === "conversation_history_control_ack" || msg.type === "play_ack" || msg.type === "play_status_ack" || msg.type === "play_stop_ack" || msg.type === "play_pose_ack" || msg.type === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "voice_language_control_ack" || msg.type === "webhook";
10978
10984
  }
10979
10985
  function isSessionScopedParentMessage(value) {
10980
10986
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -10990,6 +10996,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
10990
10996
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
10991
10997
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
10992
10998
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
10999
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
11000
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
10993
11001
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
10994
11002
  var endedSessionIds = /* @__PURE__ */ new Set();
10995
11003
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -11001,6 +11009,7 @@ var pendingPlayStopAcks = /* @__PURE__ */ new Map();
11001
11009
  var pendingPlayPoseAcks = /* @__PURE__ */ new Map();
11002
11010
  var pendingMixAcks = /* @__PURE__ */ new Map();
11003
11011
  var pendingSttAcks = /* @__PURE__ */ new Map();
11012
+ var pendingVoiceLanguageAcks = /* @__PURE__ */ new Map();
11004
11013
  function handleRecordingControlAck(message) {
11005
11014
  const pending = pendingRecordingAcks.get(message.requestId);
11006
11015
  if (!pending)
@@ -11103,6 +11112,27 @@ function handleSttControlAck(message) {
11103
11112
  requestId: message.requestId
11104
11113
  });
11105
11114
  }
11115
+ function handleVoiceLanguageControlAck(message) {
11116
+ const pending = pendingVoiceLanguageAcks.get(message.requestId);
11117
+ if (!pending)
11118
+ return;
11119
+ clearTimeout(pending.timer);
11120
+ pendingVoiceLanguageAcks.delete(message.requestId);
11121
+ if (message.ok && message.language?.trim()) {
11122
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
11123
+ }
11124
+ pending.resolve({
11125
+ ok: message.ok,
11126
+ reason: message.reason,
11127
+ requestId: message.requestId,
11128
+ ...message.language ? { language: message.language } : {},
11129
+ ...message.voice ? { voice: message.voice } : {},
11130
+ ...message.stt ? { stt: message.stt } : {},
11131
+ ...message.scope ? { scope: message.scope } : {},
11132
+ ...message.sttProvider ? { sttProvider: message.sttProvider } : {},
11133
+ ...message.ttsProvider ? { ttsProvider: message.ttsProvider } : {}
11134
+ });
11135
+ }
11106
11136
  function clearPendingRecordingAcksForSession(sessionId, reason) {
11107
11137
  for (const [requestId, pending] of pendingRecordingAcks) {
11108
11138
  if (pending.sessionId !== sessionId)
@@ -11168,7 +11198,7 @@ function allowOutboundForSession(sessionId) {
11168
11198
  }
11169
11199
  function sendParentMessage(message) {
11170
11200
  const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
11171
- if (msgType === "mix_control" || msgType === "stt_control") {
11201
+ if (msgType === "mix_control" || msgType === "stt_control" || msgType === "voice_language_control") {
11172
11202
  process.send?.(message);
11173
11203
  return;
11174
11204
  }
@@ -11269,6 +11299,7 @@ async function handleParentMessage(message, handlers) {
11269
11299
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
11270
11300
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
11271
11301
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
11302
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
11272
11303
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
11273
11304
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
11274
11305
  if (sessionStartInitDelayMs > 0) {
@@ -11280,6 +11311,7 @@ async function handleParentMessage(message, handlers) {
11280
11311
  recordingAvailable: message.recordingAvailable ?? false,
11281
11312
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
11282
11313
  mixAvailable: message.mixAvailable ?? false,
11314
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
11283
11315
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
11284
11316
  });
11285
11317
  sendParentMessage({
@@ -11298,12 +11330,23 @@ async function handleParentMessage(message, handlers) {
11298
11330
  if (message.event.type === "user_language") {
11299
11331
  const language = resolveUserLanguageCode(message.event);
11300
11332
  if (language) {
11333
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
11301
11334
  await handlers.onUserLanguage?.({
11302
11335
  sessionId: message.sessionId,
11303
11336
  language
11304
11337
  });
11305
11338
  }
11306
11339
  }
11340
+ if (message.event.type === "voice_language_changed") {
11341
+ const language = resolveUserLanguageCode(message.event);
11342
+ if (language) {
11343
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
11344
+ await handlers.onVoiceLanguageChanged?.({
11345
+ sessionId: message.sessionId,
11346
+ language
11347
+ });
11348
+ }
11349
+ }
11307
11350
  break;
11308
11351
  case "data_channel_message":
11309
11352
  await handlers.onDataChannelMessage?.({
@@ -11330,6 +11373,8 @@ async function handleParentMessage(message, handlers) {
11330
11373
  recordingAvailableBySessionId.delete(message.sessionId);
11331
11374
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
11332
11375
  mixAvailableBySessionId.delete(message.sessionId);
11376
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
11377
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
11333
11378
  ttsPoseAvailableBySessionId.delete(message.sessionId);
11334
11379
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
11335
11380
  sessionId: message.sessionId
@@ -11378,6 +11423,10 @@ function defineAgent(handlers) {
11378
11423
  handleSttControlAck(message);
11379
11424
  return;
11380
11425
  }
11426
+ if (isVoiceLanguageControlAckMessage(message)) {
11427
+ handleVoiceLanguageControlAck(message);
11428
+ return;
11429
+ }
11381
11430
  if (isWebhookMessage(message)) {
11382
11431
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
11383
11432
  return;