@voicethere/agent 0.9.0 → 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.
@@ -245,6 +245,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
245
245
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
246
246
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
247
247
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
248
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
249
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
248
250
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
249
251
  var endedSessionIds = /* @__PURE__ */ new Set();
250
252
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -366,6 +368,9 @@ function handleVoiceLanguageControlAck(message) {
366
368
  return;
367
369
  clearTimeout(pending.timer);
368
370
  pendingVoiceLanguageAcks.delete(message.requestId);
371
+ if (message.ok && message.language?.trim()) {
372
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
373
+ }
369
374
  pending.resolve({
370
375
  ok: message.ok,
371
376
  reason: message.reason,
@@ -559,6 +564,7 @@ async function handleParentMessage(message, handlers) {
559
564
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
560
565
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
561
566
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
567
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
562
568
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
563
569
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
564
570
  if (sessionStartInitDelayMs > 0) {
@@ -570,6 +576,7 @@ async function handleParentMessage(message, handlers) {
570
576
  recordingAvailable: message.recordingAvailable ?? false,
571
577
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
572
578
  mixAvailable: message.mixAvailable ?? false,
579
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
573
580
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
574
581
  });
575
582
  sendParentMessage({
@@ -588,12 +595,23 @@ async function handleParentMessage(message, handlers) {
588
595
  if (message.event.type === "user_language") {
589
596
  const language = resolveUserLanguageCode(message.event);
590
597
  if (language) {
598
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
591
599
  await handlers.onUserLanguage?.({
592
600
  sessionId: message.sessionId,
593
601
  language
594
602
  });
595
603
  }
596
604
  }
605
+ if (message.event.type === "voice_language_changed") {
606
+ const language = resolveUserLanguageCode(message.event);
607
+ if (language) {
608
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
609
+ await handlers.onVoiceLanguageChanged?.({
610
+ sessionId: message.sessionId,
611
+ language
612
+ });
613
+ }
614
+ }
597
615
  break;
598
616
  case "data_channel_message":
599
617
  await handlers.onDataChannelMessage?.({
@@ -620,6 +638,8 @@ async function handleParentMessage(message, handlers) {
620
638
  recordingAvailableBySessionId.delete(message.sessionId);
621
639
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
622
640
  mixAvailableBySessionId.delete(message.sessionId);
641
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
642
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
623
643
  ttsPoseAvailableBySessionId.delete(message.sessionId);
624
644
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
625
645
  sessionId: message.sessionId
@@ -242,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
242
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
243
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
244
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
245
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
246
248
  var endedSessionIds = /* @__PURE__ */ new Set();
247
249
  var RECORDING_CONTROL_ACK_TIMEOUT_MS = 5e3;
@@ -363,6 +365,9 @@ function handleVoiceLanguageControlAck(message) {
363
365
  return;
364
366
  clearTimeout(pending.timer);
365
367
  pendingVoiceLanguageAcks.delete(message.requestId);
368
+ if (message.ok && message.language?.trim()) {
369
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
370
+ }
366
371
  pending.resolve({
367
372
  ok: message.ok,
368
373
  reason: message.reason,
@@ -544,6 +549,7 @@ async function handleParentMessage(message, handlers) {
544
549
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
545
550
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
546
551
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
552
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
547
553
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
548
554
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
549
555
  if (sessionStartInitDelayMs > 0) {
@@ -555,6 +561,7 @@ async function handleParentMessage(message, handlers) {
555
561
  recordingAvailable: message.recordingAvailable ?? false,
556
562
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
557
563
  mixAvailable: message.mixAvailable ?? false,
564
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
558
565
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
559
566
  });
560
567
  sendParentMessage({
@@ -573,12 +580,23 @@ async function handleParentMessage(message, handlers) {
573
580
  if (message.event.type === "user_language") {
574
581
  const language = resolveUserLanguageCode(message.event);
575
582
  if (language) {
583
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
576
584
  await handlers.onUserLanguage?.({
577
585
  sessionId: message.sessionId,
578
586
  language
579
587
  });
580
588
  }
581
589
  }
590
+ if (message.event.type === "voice_language_changed") {
591
+ const language = resolveUserLanguageCode(message.event);
592
+ if (language) {
593
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
594
+ await handlers.onVoiceLanguageChanged?.({
595
+ sessionId: message.sessionId,
596
+ language
597
+ });
598
+ }
599
+ }
582
600
  break;
583
601
  case "data_channel_message":
584
602
  await handlers.onDataChannelMessage?.({
@@ -605,6 +623,8 @@ async function handleParentMessage(message, handlers) {
605
623
  recordingAvailableBySessionId.delete(message.sessionId);
606
624
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
607
625
  mixAvailableBySessionId.delete(message.sessionId);
626
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
627
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
608
628
  ttsPoseAvailableBySessionId.delete(message.sessionId);
609
629
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
610
630
  sessionId: message.sessionId
@@ -246,6 +246,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
246
246
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
247
247
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
248
248
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
249
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
250
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
249
251
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
250
252
  var endedSessionIds = /* @__PURE__ */ new Set();
251
253
  var PLAY_CONTROL_ACK_TIMEOUT_MS = 5e3;
@@ -369,6 +371,9 @@ function handleVoiceLanguageControlAck(message) {
369
371
  return;
370
372
  clearTimeout(pending.timer);
371
373
  pendingVoiceLanguageAcks.delete(message.requestId);
374
+ if (message.ok && message.language?.trim()) {
375
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
376
+ }
372
377
  pending.resolve({
373
378
  ok: message.ok,
374
379
  reason: message.reason,
@@ -574,6 +579,7 @@ async function handleParentMessage(message, handlers) {
574
579
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
575
580
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
576
581
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
582
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
577
583
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
578
584
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
579
585
  if (sessionStartInitDelayMs > 0) {
@@ -585,6 +591,7 @@ async function handleParentMessage(message, handlers) {
585
591
  recordingAvailable: message.recordingAvailable ?? false,
586
592
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
587
593
  mixAvailable: message.mixAvailable ?? false,
594
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
588
595
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
589
596
  });
590
597
  sendParentMessage({
@@ -603,12 +610,23 @@ async function handleParentMessage(message, handlers) {
603
610
  if (message.event.type === "user_language") {
604
611
  const language = resolveUserLanguageCode(message.event);
605
612
  if (language) {
613
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
606
614
  await handlers.onUserLanguage?.({
607
615
  sessionId: message.sessionId,
608
616
  language
609
617
  });
610
618
  }
611
619
  }
620
+ if (message.event.type === "voice_language_changed") {
621
+ const language = resolveUserLanguageCode(message.event);
622
+ if (language) {
623
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
624
+ await handlers.onVoiceLanguageChanged?.({
625
+ sessionId: message.sessionId,
626
+ language
627
+ });
628
+ }
629
+ }
612
630
  break;
613
631
  case "data_channel_message":
614
632
  await handlers.onDataChannelMessage?.({
@@ -635,6 +653,8 @@ async function handleParentMessage(message, handlers) {
635
653
  recordingAvailableBySessionId.delete(message.sessionId);
636
654
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
637
655
  mixAvailableBySessionId.delete(message.sessionId);
656
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
657
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
638
658
  ttsPoseAvailableBySessionId.delete(message.sessionId);
639
659
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
640
660
  sessionId: message.sessionId
@@ -242,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
242
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
243
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
244
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
245
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
246
248
  var endedSessionIds = /* @__PURE__ */ new Set();
247
249
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -362,6 +364,9 @@ function handleVoiceLanguageControlAck(message) {
362
364
  return;
363
365
  clearTimeout(pending.timer);
364
366
  pendingVoiceLanguageAcks.delete(message.requestId);
367
+ if (message.ok && message.language?.trim()) {
368
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
369
+ }
365
370
  pending.resolve({
366
371
  ok: message.ok,
367
372
  reason: message.reason,
@@ -540,6 +545,7 @@ async function handleParentMessage(message, handlers) {
540
545
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
541
546
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
542
547
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
548
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
543
549
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
544
550
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
545
551
  if (sessionStartInitDelayMs > 0) {
@@ -551,6 +557,7 @@ async function handleParentMessage(message, handlers) {
551
557
  recordingAvailable: message.recordingAvailable ?? false,
552
558
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
553
559
  mixAvailable: message.mixAvailable ?? false,
560
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
554
561
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
555
562
  });
556
563
  sendParentMessage({
@@ -569,12 +576,23 @@ async function handleParentMessage(message, handlers) {
569
576
  if (message.event.type === "user_language") {
570
577
  const language = resolveUserLanguageCode(message.event);
571
578
  if (language) {
579
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
572
580
  await handlers.onUserLanguage?.({
573
581
  sessionId: message.sessionId,
574
582
  language
575
583
  });
576
584
  }
577
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
+ }
578
596
  break;
579
597
  case "data_channel_message":
580
598
  await handlers.onDataChannelMessage?.({
@@ -601,6 +619,8 @@ async function handleParentMessage(message, handlers) {
601
619
  recordingAvailableBySessionId.delete(message.sessionId);
602
620
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
603
621
  mixAvailableBySessionId.delete(message.sessionId);
622
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
623
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
604
624
  ttsPoseAvailableBySessionId.delete(message.sessionId);
605
625
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
606
626
  sessionId: message.sessionId
@@ -242,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
242
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
243
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
244
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
245
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
246
248
  var endedSessionIds = /* @__PURE__ */ new Set();
247
249
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -362,6 +364,9 @@ function handleVoiceLanguageControlAck(message) {
362
364
  return;
363
365
  clearTimeout(pending.timer);
364
366
  pendingVoiceLanguageAcks.delete(message.requestId);
367
+ if (message.ok && message.language?.trim()) {
368
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
369
+ }
365
370
  pending.resolve({
366
371
  ok: message.ok,
367
372
  reason: message.reason,
@@ -540,6 +545,7 @@ async function handleParentMessage(message, handlers) {
540
545
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
541
546
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
542
547
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
548
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
543
549
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
544
550
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
545
551
  if (sessionStartInitDelayMs > 0) {
@@ -551,6 +557,7 @@ async function handleParentMessage(message, handlers) {
551
557
  recordingAvailable: message.recordingAvailable ?? false,
552
558
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
553
559
  mixAvailable: message.mixAvailable ?? false,
560
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
554
561
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
555
562
  });
556
563
  sendParentMessage({
@@ -569,12 +576,23 @@ async function handleParentMessage(message, handlers) {
569
576
  if (message.event.type === "user_language") {
570
577
  const language = resolveUserLanguageCode(message.event);
571
578
  if (language) {
579
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
572
580
  await handlers.onUserLanguage?.({
573
581
  sessionId: message.sessionId,
574
582
  language
575
583
  });
576
584
  }
577
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
+ }
578
596
  break;
579
597
  case "data_channel_message":
580
598
  await handlers.onDataChannelMessage?.({
@@ -601,6 +619,8 @@ async function handleParentMessage(message, handlers) {
601
619
  recordingAvailableBySessionId.delete(message.sessionId);
602
620
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
603
621
  mixAvailableBySessionId.delete(message.sessionId);
622
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
623
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
604
624
  ttsPoseAvailableBySessionId.delete(message.sessionId);
605
625
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
606
626
  sessionId: message.sessionId
@@ -245,6 +245,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
245
245
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
246
246
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
247
247
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
248
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
249
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
248
250
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
249
251
  var endedSessionIds = /* @__PURE__ */ new Set();
250
252
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -365,6 +367,9 @@ function handleVoiceLanguageControlAck(message) {
365
367
  return;
366
368
  clearTimeout(pending.timer);
367
369
  pendingVoiceLanguageAcks.delete(message.requestId);
370
+ if (message.ok && message.language?.trim()) {
371
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
372
+ }
368
373
  pending.resolve({
369
374
  ok: message.ok,
370
375
  reason: message.reason,
@@ -543,6 +548,7 @@ async function handleParentMessage(message, handlers) {
543
548
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
544
549
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
545
550
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
551
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
546
552
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
547
553
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
548
554
  if (sessionStartInitDelayMs > 0) {
@@ -554,6 +560,7 @@ async function handleParentMessage(message, handlers) {
554
560
  recordingAvailable: message.recordingAvailable ?? false,
555
561
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
556
562
  mixAvailable: message.mixAvailable ?? false,
563
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
557
564
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
558
565
  });
559
566
  sendParentMessage({
@@ -572,12 +579,23 @@ async function handleParentMessage(message, handlers) {
572
579
  if (message.event.type === "user_language") {
573
580
  const language = resolveUserLanguageCode(message.event);
574
581
  if (language) {
582
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
575
583
  await handlers.onUserLanguage?.({
576
584
  sessionId: message.sessionId,
577
585
  language
578
586
  });
579
587
  }
580
588
  }
589
+ if (message.event.type === "voice_language_changed") {
590
+ const language = resolveUserLanguageCode(message.event);
591
+ if (language) {
592
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
593
+ await handlers.onVoiceLanguageChanged?.({
594
+ sessionId: message.sessionId,
595
+ language
596
+ });
597
+ }
598
+ }
581
599
  break;
582
600
  case "data_channel_message":
583
601
  await handlers.onDataChannelMessage?.({
@@ -604,6 +622,8 @@ async function handleParentMessage(message, handlers) {
604
622
  recordingAvailableBySessionId.delete(message.sessionId);
605
623
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
606
624
  mixAvailableBySessionId.delete(message.sessionId);
625
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
626
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
607
627
  ttsPoseAvailableBySessionId.delete(message.sessionId);
608
628
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
609
629
  sessionId: message.sessionId
@@ -10997,6 +10997,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
10997
10997
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
10998
10998
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
10999
10999
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
11000
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
11001
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
11000
11002
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
11001
11003
  var endedSessionIds = /* @__PURE__ */ new Set();
11002
11004
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -11117,6 +11119,9 @@ function handleVoiceLanguageControlAck(message) {
11117
11119
  return;
11118
11120
  clearTimeout(pending.timer);
11119
11121
  pendingVoiceLanguageAcks.delete(message.requestId);
11122
+ if (message.ok && message.language?.trim()) {
11123
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
11124
+ }
11120
11125
  pending.resolve({
11121
11126
  ok: message.ok,
11122
11127
  reason: message.reason,
@@ -11295,6 +11300,7 @@ async function handleParentMessage(message, handlers) {
11295
11300
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
11296
11301
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
11297
11302
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
11303
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
11298
11304
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
11299
11305
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
11300
11306
  if (sessionStartInitDelayMs > 0) {
@@ -11306,6 +11312,7 @@ async function handleParentMessage(message, handlers) {
11306
11312
  recordingAvailable: message.recordingAvailable ?? false,
11307
11313
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
11308
11314
  mixAvailable: message.mixAvailable ?? false,
11315
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
11309
11316
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
11310
11317
  });
11311
11318
  sendParentMessage({
@@ -11324,12 +11331,23 @@ async function handleParentMessage(message, handlers) {
11324
11331
  if (message.event.type === "user_language") {
11325
11332
  const language = resolveUserLanguageCode(message.event);
11326
11333
  if (language) {
11334
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
11327
11335
  await handlers.onUserLanguage?.({
11328
11336
  sessionId: message.sessionId,
11329
11337
  language
11330
11338
  });
11331
11339
  }
11332
11340
  }
11341
+ if (message.event.type === "voice_language_changed") {
11342
+ const language = resolveUserLanguageCode(message.event);
11343
+ if (language) {
11344
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
11345
+ await handlers.onVoiceLanguageChanged?.({
11346
+ sessionId: message.sessionId,
11347
+ language
11348
+ });
11349
+ }
11350
+ }
11333
11351
  break;
11334
11352
  case "data_channel_message":
11335
11353
  await handlers.onDataChannelMessage?.({
@@ -11356,6 +11374,8 @@ async function handleParentMessage(message, handlers) {
11356
11374
  recordingAvailableBySessionId.delete(message.sessionId);
11357
11375
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
11358
11376
  mixAvailableBySessionId.delete(message.sessionId);
11377
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
11378
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
11359
11379
  ttsPoseAvailableBySessionId.delete(message.sessionId);
11360
11380
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
11361
11381
  sessionId: message.sessionId
@@ -242,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
242
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
243
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
244
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
245
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
246
248
  var endedSessionIds = /* @__PURE__ */ new Set();
247
249
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -362,6 +364,9 @@ function handleVoiceLanguageControlAck(message) {
362
364
  return;
363
365
  clearTimeout(pending.timer);
364
366
  pendingVoiceLanguageAcks.delete(message.requestId);
367
+ if (message.ok && message.language?.trim()) {
368
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
369
+ }
365
370
  pending.resolve({
366
371
  ok: message.ok,
367
372
  reason: message.reason,
@@ -540,6 +545,7 @@ async function handleParentMessage(message, handlers) {
540
545
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
541
546
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
542
547
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
548
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
543
549
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
544
550
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
545
551
  if (sessionStartInitDelayMs > 0) {
@@ -551,6 +557,7 @@ async function handleParentMessage(message, handlers) {
551
557
  recordingAvailable: message.recordingAvailable ?? false,
552
558
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
553
559
  mixAvailable: message.mixAvailable ?? false,
560
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
554
561
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
555
562
  });
556
563
  sendParentMessage({
@@ -569,12 +576,23 @@ async function handleParentMessage(message, handlers) {
569
576
  if (message.event.type === "user_language") {
570
577
  const language = resolveUserLanguageCode(message.event);
571
578
  if (language) {
579
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
572
580
  await handlers.onUserLanguage?.({
573
581
  sessionId: message.sessionId,
574
582
  language
575
583
  });
576
584
  }
577
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
+ }
578
596
  break;
579
597
  case "data_channel_message":
580
598
  await handlers.onDataChannelMessage?.({
@@ -601,6 +619,8 @@ async function handleParentMessage(message, handlers) {
601
619
  recordingAvailableBySessionId.delete(message.sessionId);
602
620
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
603
621
  mixAvailableBySessionId.delete(message.sessionId);
622
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
623
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
604
624
  ttsPoseAvailableBySessionId.delete(message.sessionId);
605
625
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
606
626
  sessionId: message.sessionId
@@ -242,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
242
242
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
243
243
  var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
244
244
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
245
+ var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
246
+ var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
245
247
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
246
248
  var endedSessionIds = /* @__PURE__ */ new Set();
247
249
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
@@ -362,6 +364,9 @@ function handleVoiceLanguageControlAck(message) {
362
364
  return;
363
365
  clearTimeout(pending.timer);
364
366
  pendingVoiceLanguageAcks.delete(message.requestId);
367
+ if (message.ok && message.language?.trim()) {
368
+ lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
369
+ }
365
370
  pending.resolve({
366
371
  ok: message.ok,
367
372
  reason: message.reason,
@@ -540,6 +545,7 @@ async function handleParentMessage(message, handlers) {
540
545
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
541
546
  conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
542
547
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
548
+ voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
543
549
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
544
550
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
545
551
  if (sessionStartInitDelayMs > 0) {
@@ -551,6 +557,7 @@ async function handleParentMessage(message, handlers) {
551
557
  recordingAvailable: message.recordingAvailable ?? false,
552
558
  conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
553
559
  mixAvailable: message.mixAvailable ?? false,
560
+ voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
554
561
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
555
562
  });
556
563
  sendParentMessage({
@@ -569,12 +576,23 @@ async function handleParentMessage(message, handlers) {
569
576
  if (message.event.type === "user_language") {
570
577
  const language = resolveUserLanguageCode(message.event);
571
578
  if (language) {
579
+ lastVoiceLanguageBySessionId.set(message.sessionId, language);
572
580
  await handlers.onUserLanguage?.({
573
581
  sessionId: message.sessionId,
574
582
  language
575
583
  });
576
584
  }
577
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
+ }
578
596
  break;
579
597
  case "data_channel_message":
580
598
  await handlers.onDataChannelMessage?.({
@@ -601,6 +619,8 @@ async function handleParentMessage(message, handlers) {
601
619
  recordingAvailableBySessionId.delete(message.sessionId);
602
620
  conversationHistoryAvailableBySessionId.delete(message.sessionId);
603
621
  mixAvailableBySessionId.delete(message.sessionId);
622
+ voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
623
+ lastVoiceLanguageBySessionId.delete(message.sessionId);
604
624
  ttsPoseAvailableBySessionId.delete(message.sessionId);
605
625
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
606
626
  sessionId: message.sessionId
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voicethere/agent",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
5
5
  "type": "module",
6
6
  "exports": {