@voicethere/agent 0.8.1 → 0.8.3

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.
@@ -163,6 +163,12 @@ function isRecordingControlAckMessage(value) {
163
163
  const msg = value;
164
164
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
165
165
  }
166
+ function isConversationHistoryControlAckMessage(value) {
167
+ if (!value || typeof value !== "object")
168
+ return false;
169
+ const msg = value;
170
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
171
+ }
166
172
  function isMixControlAckMessage(value) {
167
173
  if (!value || typeof value !== "object")
168
174
  return false;
@@ -217,7 +223,7 @@ function isParentMessage(value) {
217
223
  if (!value || typeof value !== "object")
218
224
  return false;
219
225
  const msg = value;
220
- 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 === "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";
226
+ 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";
221
227
  }
222
228
  function isSessionScopedParentMessage(value) {
223
229
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -231,11 +237,13 @@ function parseDataChannelPayload(raw) {
231
237
  }
232
238
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
233
239
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
240
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
234
241
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
235
242
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
236
243
  var endedSessionIds = /* @__PURE__ */ new Set();
237
244
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
238
245
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
246
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
239
247
  var pendingPlayAcks = /* @__PURE__ */ new Map();
240
248
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
241
249
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -255,6 +263,18 @@ function handleRecordingControlAck(message) {
255
263
  requestId: message.requestId
256
264
  });
257
265
  }
266
+ function handleConversationHistoryControlAck(message) {
267
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
268
+ if (!pending)
269
+ return;
270
+ clearTimeout(pending.timer);
271
+ pendingConversationHistoryAcks.delete(message.requestId);
272
+ pending.resolve({
273
+ ok: message.ok,
274
+ reason: message.reason,
275
+ requestId: message.requestId
276
+ });
277
+ }
258
278
  function handlePlayAck(message) {
259
279
  const pending = pendingPlayAcks.get(message.requestId);
260
280
  if (!pending)
@@ -354,6 +374,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
354
374
  pending.resolve({ ok: false, reason, requestId });
355
375
  }
356
376
  }
377
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
378
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
379
+ if (pending.sessionId !== sessionId)
380
+ continue;
381
+ clearTimeout(pending.timer);
382
+ pendingConversationHistoryAcks.delete(requestId);
383
+ pending.resolve({ ok: false, reason, requestId });
384
+ }
385
+ }
357
386
  function isVoicethereAgentChild() {
358
387
  return typeof process.send === "function" && process.connected !== false && typeof process.env.__CHILD_BUNDLE_PATH__ === "string" && process.env.__CHILD_BUNDLE_PATH__.trim().length > 0;
359
388
  }
@@ -503,6 +532,7 @@ async function handleParentMessage(message, handlers) {
503
532
  endedSessionIds.delete(message.sessionId);
504
533
  peerEnvBySessionId.set(message.sessionId, message.env);
505
534
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
535
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
506
536
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
507
537
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
508
538
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -513,6 +543,7 @@ async function handleParentMessage(message, handlers) {
513
543
  sessionId: message.sessionId,
514
544
  env: message.env,
515
545
  recordingAvailable: message.recordingAvailable ?? false,
546
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
516
547
  mixAvailable: message.mixAvailable ?? false,
517
548
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
518
549
  });
@@ -559,8 +590,10 @@ async function handleParentMessage(message, handlers) {
559
590
  break;
560
591
  case "session_end":
561
592
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
593
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
562
594
  peerEnvBySessionId.delete(message.sessionId);
563
595
  recordingAvailableBySessionId.delete(message.sessionId);
596
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
564
597
  mixAvailableBySessionId.delete(message.sessionId);
565
598
  ttsPoseAvailableBySessionId.delete(message.sessionId);
566
599
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -582,6 +615,10 @@ function defineAgent(handlers) {
582
615
  handleRecordingControlAck(message);
583
616
  return;
584
617
  }
618
+ if (isConversationHistoryControlAckMessage(message)) {
619
+ handleConversationHistoryControlAck(message);
620
+ return;
621
+ }
585
622
  if (isPlayAckMessage(message)) {
586
623
  handlePlayAck(message);
587
624
  return;
@@ -615,6 +652,7 @@ function defineAgent(handlers) {
615
652
  if (message.type === "session_end") {
616
653
  endedSessionIds.add(message.sessionId);
617
654
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
655
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
618
656
  inboundBySession.clear(message.sessionId);
619
657
  }
620
658
  if (message.type === "session_start") {
@@ -160,6 +160,12 @@ function isRecordingControlAckMessage(value) {
160
160
  const msg = value;
161
161
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
162
162
  }
163
+ function isConversationHistoryControlAckMessage(value) {
164
+ if (!value || typeof value !== "object")
165
+ return false;
166
+ const msg = value;
167
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
168
+ }
163
169
  function isMixControlAckMessage(value) {
164
170
  if (!value || typeof value !== "object")
165
171
  return false;
@@ -214,7 +220,7 @@ function isParentMessage(value) {
214
220
  if (!value || typeof value !== "object")
215
221
  return false;
216
222
  const msg = value;
217
- 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 === "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";
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";
218
224
  }
219
225
  function isSessionScopedParentMessage(value) {
220
226
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -228,12 +234,14 @@ function parseDataChannelPayload(raw) {
228
234
  }
229
235
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
230
236
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
237
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
231
238
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
232
239
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
233
240
  var endedSessionIds = /* @__PURE__ */ new Set();
234
241
  var RECORDING_CONTROL_ACK_TIMEOUT_MS = 5e3;
235
242
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
236
243
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
244
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
237
245
  var pendingPlayAcks = /* @__PURE__ */ new Map();
238
246
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
239
247
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -252,6 +260,18 @@ function handleRecordingControlAck(message) {
252
260
  requestId: message.requestId
253
261
  });
254
262
  }
263
+ function handleConversationHistoryControlAck(message) {
264
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
265
+ if (!pending)
266
+ return;
267
+ clearTimeout(pending.timer);
268
+ pendingConversationHistoryAcks.delete(message.requestId);
269
+ pending.resolve({
270
+ ok: message.ok,
271
+ reason: message.reason,
272
+ requestId: message.requestId
273
+ });
274
+ }
255
275
  function handlePlayAck(message) {
256
276
  const pending = pendingPlayAcks.get(message.requestId);
257
277
  if (!pending)
@@ -339,6 +359,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
339
359
  pending.resolve({ ok: false, reason, requestId });
340
360
  }
341
361
  }
362
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
363
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
364
+ if (pending.sessionId !== sessionId)
365
+ continue;
366
+ clearTimeout(pending.timer);
367
+ pendingConversationHistoryAcks.delete(requestId);
368
+ pending.resolve({ ok: false, reason, requestId });
369
+ }
370
+ }
342
371
  function isVoicethereAgentChild() {
343
372
  return typeof process.send === "function" && process.connected !== false && typeof process.env.__CHILD_BUNDLE_PATH__ === "string" && process.env.__CHILD_BUNDLE_PATH__.trim().length > 0;
344
373
  }
@@ -488,6 +517,7 @@ async function handleParentMessage(message, handlers) {
488
517
  endedSessionIds.delete(message.sessionId);
489
518
  peerEnvBySessionId.set(message.sessionId, message.env);
490
519
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
520
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
491
521
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
492
522
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
493
523
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -498,6 +528,7 @@ async function handleParentMessage(message, handlers) {
498
528
  sessionId: message.sessionId,
499
529
  env: message.env,
500
530
  recordingAvailable: message.recordingAvailable ?? false,
531
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
501
532
  mixAvailable: message.mixAvailable ?? false,
502
533
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
503
534
  });
@@ -544,8 +575,10 @@ async function handleParentMessage(message, handlers) {
544
575
  break;
545
576
  case "session_end":
546
577
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
578
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
547
579
  peerEnvBySessionId.delete(message.sessionId);
548
580
  recordingAvailableBySessionId.delete(message.sessionId);
581
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
549
582
  mixAvailableBySessionId.delete(message.sessionId);
550
583
  ttsPoseAvailableBySessionId.delete(message.sessionId);
551
584
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -567,6 +600,10 @@ function defineAgent(handlers) {
567
600
  handleRecordingControlAck(message);
568
601
  return;
569
602
  }
603
+ if (isConversationHistoryControlAckMessage(message)) {
604
+ handleConversationHistoryControlAck(message);
605
+ return;
606
+ }
570
607
  if (isPlayAckMessage(message)) {
571
608
  handlePlayAck(message);
572
609
  return;
@@ -600,6 +637,7 @@ function defineAgent(handlers) {
600
637
  if (message.type === "session_end") {
601
638
  endedSessionIds.add(message.sessionId);
602
639
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
640
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
603
641
  inboundBySession.clear(message.sessionId);
604
642
  }
605
643
  if (message.type === "session_start") {
@@ -164,6 +164,12 @@ function isRecordingControlAckMessage(value) {
164
164
  const msg = value;
165
165
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
166
166
  }
167
+ function isConversationHistoryControlAckMessage(value) {
168
+ if (!value || typeof value !== "object")
169
+ return false;
170
+ const msg = value;
171
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
172
+ }
167
173
  function isMixControlAckMessage(value) {
168
174
  if (!value || typeof value !== "object")
169
175
  return false;
@@ -218,7 +224,7 @@ function isParentMessage(value) {
218
224
  if (!value || typeof value !== "object")
219
225
  return false;
220
226
  const msg = value;
221
- 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 === "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";
227
+ 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";
222
228
  }
223
229
  function isSessionScopedParentMessage(value) {
224
230
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -232,12 +238,14 @@ function parseDataChannelPayload(raw) {
232
238
  }
233
239
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
234
240
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
241
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
235
242
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
236
243
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
237
244
  var endedSessionIds = /* @__PURE__ */ new Set();
238
245
  var PLAY_CONTROL_ACK_TIMEOUT_MS = 5e3;
239
246
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
240
247
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
248
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
241
249
  var pendingPlayAcks = /* @__PURE__ */ new Map();
242
250
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
243
251
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -258,6 +266,18 @@ function handleRecordingControlAck(message) {
258
266
  requestId: message.requestId
259
267
  });
260
268
  }
269
+ function handleConversationHistoryControlAck(message) {
270
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
271
+ if (!pending)
272
+ return;
273
+ clearTimeout(pending.timer);
274
+ pendingConversationHistoryAcks.delete(message.requestId);
275
+ pending.resolve({
276
+ ok: message.ok,
277
+ reason: message.reason,
278
+ requestId: message.requestId
279
+ });
280
+ }
261
281
  function handlePlayAck(message) {
262
282
  const pending = pendingPlayAcks.get(message.requestId);
263
283
  if (!pending)
@@ -369,6 +389,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
369
389
  pending.resolve({ ok: false, reason, requestId });
370
390
  }
371
391
  }
392
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
393
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
394
+ if (pending.sessionId !== sessionId)
395
+ continue;
396
+ clearTimeout(pending.timer);
397
+ pendingConversationHistoryAcks.delete(requestId);
398
+ pending.resolve({ ok: false, reason, requestId });
399
+ }
400
+ }
372
401
  function isVoicethereAgentChild() {
373
402
  return typeof process.send === "function" && process.connected !== false && typeof process.env.__CHILD_BUNDLE_PATH__ === "string" && process.env.__CHILD_BUNDLE_PATH__.trim().length > 0;
374
403
  }
@@ -518,6 +547,7 @@ async function handleParentMessage(message, handlers) {
518
547
  endedSessionIds.delete(message.sessionId);
519
548
  peerEnvBySessionId.set(message.sessionId, message.env);
520
549
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
550
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
521
551
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
522
552
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
523
553
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -528,6 +558,7 @@ async function handleParentMessage(message, handlers) {
528
558
  sessionId: message.sessionId,
529
559
  env: message.env,
530
560
  recordingAvailable: message.recordingAvailable ?? false,
561
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
531
562
  mixAvailable: message.mixAvailable ?? false,
532
563
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
533
564
  });
@@ -574,8 +605,10 @@ async function handleParentMessage(message, handlers) {
574
605
  break;
575
606
  case "session_end":
576
607
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
608
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
577
609
  peerEnvBySessionId.delete(message.sessionId);
578
610
  recordingAvailableBySessionId.delete(message.sessionId);
611
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
579
612
  mixAvailableBySessionId.delete(message.sessionId);
580
613
  ttsPoseAvailableBySessionId.delete(message.sessionId);
581
614
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -597,6 +630,10 @@ function defineAgent(handlers) {
597
630
  handleRecordingControlAck(message);
598
631
  return;
599
632
  }
633
+ if (isConversationHistoryControlAckMessage(message)) {
634
+ handleConversationHistoryControlAck(message);
635
+ return;
636
+ }
600
637
  if (isPlayAckMessage(message)) {
601
638
  handlePlayAck(message);
602
639
  return;
@@ -630,6 +667,7 @@ function defineAgent(handlers) {
630
667
  if (message.type === "session_end") {
631
668
  endedSessionIds.add(message.sessionId);
632
669
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
670
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
633
671
  inboundBySession.clear(message.sessionId);
634
672
  }
635
673
  if (message.type === "session_start") {
@@ -1110,6 +1148,8 @@ var SHOWCASE_SOUND_FILES = {
1110
1148
  var SHOWCASE_ASSET_ORIGINS = [
1111
1149
  "https://app.voicethere.io",
1112
1150
  "https://app.voicethere.dev",
1151
+ "https://www.voicethere.io",
1152
+ "https://voicethere.io",
1113
1153
  "http://localhost:3000"
1114
1154
  ];
1115
1155
  var CLIP_IDS = new Set(Object.keys(SHOWCASE_SOUND_FILES));
@@ -1451,8 +1491,9 @@ function buildOrbitSineInlineClipBase64(durationMs = ORBIT_SINE_DURATION_MS, fre
1451
1491
  }
1452
1492
 
1453
1493
  // templates/spatial-showcase/agent.ts
1454
- var ORBIT_TICK_MS = 50;
1455
- var ORBIT_POSE_EMIT_MS = 100;
1494
+ var ORBIT_POSE_HZ = 60;
1495
+ var ORBIT_TICK_MS = 1e3 / ORBIT_POSE_HZ;
1496
+ var ORBIT_POSE_EMIT_MS = ORBIT_TICK_MS;
1456
1497
  var ROOM_STATE_TICK_MS = 100;
1457
1498
  var LOOP_PAD_POLL_MS = 250;
1458
1499
  var ORBIT_SINE_POLL_MS = 250;
@@ -1721,7 +1762,7 @@ function emitOrbitPose(sessionId, state) {
1721
1762
  return;
1722
1763
  }
1723
1764
  const now = Date.now();
1724
- if (state.lastOrbitPoseEmitMs !== void 0 && now - state.lastOrbitPoseEmitMs < ORBIT_POSE_EMIT_MS) {
1765
+ if (state.lastOrbitPoseEmitMs !== void 0 && now - state.lastOrbitPoseEmitMs < ORBIT_POSE_EMIT_MS - 2) {
1725
1766
  return;
1726
1767
  }
1727
1768
  state.lastOrbitPoseEmitMs = now;
@@ -160,6 +160,12 @@ function isRecordingControlAckMessage(value) {
160
160
  const msg = value;
161
161
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
162
162
  }
163
+ function isConversationHistoryControlAckMessage(value) {
164
+ if (!value || typeof value !== "object")
165
+ return false;
166
+ const msg = value;
167
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
168
+ }
163
169
  function isMixControlAckMessage(value) {
164
170
  if (!value || typeof value !== "object")
165
171
  return false;
@@ -214,7 +220,7 @@ function isParentMessage(value) {
214
220
  if (!value || typeof value !== "object")
215
221
  return false;
216
222
  const msg = value;
217
- 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 === "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";
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";
218
224
  }
219
225
  function isSessionScopedParentMessage(value) {
220
226
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -228,11 +234,13 @@ function parseDataChannelPayload(raw) {
228
234
  }
229
235
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
230
236
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
237
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
231
238
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
232
239
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
233
240
  var endedSessionIds = /* @__PURE__ */ new Set();
234
241
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
235
242
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
243
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
236
244
  var pendingPlayAcks = /* @__PURE__ */ new Map();
237
245
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
238
246
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -251,6 +259,18 @@ function handleRecordingControlAck(message) {
251
259
  requestId: message.requestId
252
260
  });
253
261
  }
262
+ function handleConversationHistoryControlAck(message) {
263
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
264
+ if (!pending)
265
+ return;
266
+ clearTimeout(pending.timer);
267
+ pendingConversationHistoryAcks.delete(message.requestId);
268
+ pending.resolve({
269
+ ok: message.ok,
270
+ reason: message.reason,
271
+ requestId: message.requestId
272
+ });
273
+ }
254
274
  function handlePlayAck(message) {
255
275
  const pending = pendingPlayAcks.get(message.requestId);
256
276
  if (!pending)
@@ -338,6 +358,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
338
358
  pending.resolve({ ok: false, reason, requestId });
339
359
  }
340
360
  }
361
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
362
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
363
+ if (pending.sessionId !== sessionId)
364
+ continue;
365
+ clearTimeout(pending.timer);
366
+ pendingConversationHistoryAcks.delete(requestId);
367
+ pending.resolve({ ok: false, reason, requestId });
368
+ }
369
+ }
341
370
  var sessionExecutionContext = new AsyncLocalStorage();
342
371
  var agentLogSessionContext = new AsyncLocalStorage();
343
372
  var inboundQueueAuthority = null;
@@ -484,6 +513,7 @@ async function handleParentMessage(message, handlers) {
484
513
  endedSessionIds.delete(message.sessionId);
485
514
  peerEnvBySessionId.set(message.sessionId, message.env);
486
515
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
516
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
487
517
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
488
518
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
489
519
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -494,6 +524,7 @@ async function handleParentMessage(message, handlers) {
494
524
  sessionId: message.sessionId,
495
525
  env: message.env,
496
526
  recordingAvailable: message.recordingAvailable ?? false,
527
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
497
528
  mixAvailable: message.mixAvailable ?? false,
498
529
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
499
530
  });
@@ -540,8 +571,10 @@ async function handleParentMessage(message, handlers) {
540
571
  break;
541
572
  case "session_end":
542
573
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
574
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
543
575
  peerEnvBySessionId.delete(message.sessionId);
544
576
  recordingAvailableBySessionId.delete(message.sessionId);
577
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
545
578
  mixAvailableBySessionId.delete(message.sessionId);
546
579
  ttsPoseAvailableBySessionId.delete(message.sessionId);
547
580
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -563,6 +596,10 @@ function defineAgent(handlers) {
563
596
  handleRecordingControlAck(message);
564
597
  return;
565
598
  }
599
+ if (isConversationHistoryControlAckMessage(message)) {
600
+ handleConversationHistoryControlAck(message);
601
+ return;
602
+ }
566
603
  if (isPlayAckMessage(message)) {
567
604
  handlePlayAck(message);
568
605
  return;
@@ -596,6 +633,7 @@ function defineAgent(handlers) {
596
633
  if (message.type === "session_end") {
597
634
  endedSessionIds.add(message.sessionId);
598
635
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
636
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
599
637
  inboundBySession.clear(message.sessionId);
600
638
  }
601
639
  if (message.type === "session_start") {
@@ -160,6 +160,12 @@ function isRecordingControlAckMessage(value) {
160
160
  const msg = value;
161
161
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
162
162
  }
163
+ function isConversationHistoryControlAckMessage(value) {
164
+ if (!value || typeof value !== "object")
165
+ return false;
166
+ const msg = value;
167
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
168
+ }
163
169
  function isMixControlAckMessage(value) {
164
170
  if (!value || typeof value !== "object")
165
171
  return false;
@@ -214,7 +220,7 @@ function isParentMessage(value) {
214
220
  if (!value || typeof value !== "object")
215
221
  return false;
216
222
  const msg = value;
217
- 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 === "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";
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";
218
224
  }
219
225
  function isSessionScopedParentMessage(value) {
220
226
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -228,11 +234,13 @@ function parseDataChannelPayload(raw) {
228
234
  }
229
235
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
230
236
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
237
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
231
238
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
232
239
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
233
240
  var endedSessionIds = /* @__PURE__ */ new Set();
234
241
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
235
242
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
243
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
236
244
  var pendingPlayAcks = /* @__PURE__ */ new Map();
237
245
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
238
246
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -251,6 +259,18 @@ function handleRecordingControlAck(message) {
251
259
  requestId: message.requestId
252
260
  });
253
261
  }
262
+ function handleConversationHistoryControlAck(message) {
263
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
264
+ if (!pending)
265
+ return;
266
+ clearTimeout(pending.timer);
267
+ pendingConversationHistoryAcks.delete(message.requestId);
268
+ pending.resolve({
269
+ ok: message.ok,
270
+ reason: message.reason,
271
+ requestId: message.requestId
272
+ });
273
+ }
254
274
  function handlePlayAck(message) {
255
275
  const pending = pendingPlayAcks.get(message.requestId);
256
276
  if (!pending)
@@ -338,6 +358,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
338
358
  pending.resolve({ ok: false, reason, requestId });
339
359
  }
340
360
  }
361
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
362
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
363
+ if (pending.sessionId !== sessionId)
364
+ continue;
365
+ clearTimeout(pending.timer);
366
+ pendingConversationHistoryAcks.delete(requestId);
367
+ pending.resolve({ ok: false, reason, requestId });
368
+ }
369
+ }
341
370
  var sessionExecutionContext = new AsyncLocalStorage();
342
371
  var agentLogSessionContext = new AsyncLocalStorage();
343
372
  var inboundQueueAuthority = null;
@@ -484,6 +513,7 @@ async function handleParentMessage(message, handlers) {
484
513
  endedSessionIds.delete(message.sessionId);
485
514
  peerEnvBySessionId.set(message.sessionId, message.env);
486
515
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
516
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
487
517
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
488
518
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
489
519
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -494,6 +524,7 @@ async function handleParentMessage(message, handlers) {
494
524
  sessionId: message.sessionId,
495
525
  env: message.env,
496
526
  recordingAvailable: message.recordingAvailable ?? false,
527
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
497
528
  mixAvailable: message.mixAvailable ?? false,
498
529
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
499
530
  });
@@ -540,8 +571,10 @@ async function handleParentMessage(message, handlers) {
540
571
  break;
541
572
  case "session_end":
542
573
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
574
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
543
575
  peerEnvBySessionId.delete(message.sessionId);
544
576
  recordingAvailableBySessionId.delete(message.sessionId);
577
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
545
578
  mixAvailableBySessionId.delete(message.sessionId);
546
579
  ttsPoseAvailableBySessionId.delete(message.sessionId);
547
580
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -563,6 +596,10 @@ function defineAgent(handlers) {
563
596
  handleRecordingControlAck(message);
564
597
  return;
565
598
  }
599
+ if (isConversationHistoryControlAckMessage(message)) {
600
+ handleConversationHistoryControlAck(message);
601
+ return;
602
+ }
566
603
  if (isPlayAckMessage(message)) {
567
604
  handlePlayAck(message);
568
605
  return;
@@ -596,6 +633,7 @@ function defineAgent(handlers) {
596
633
  if (message.type === "session_end") {
597
634
  endedSessionIds.add(message.sessionId);
598
635
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
636
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
599
637
  inboundBySession.clear(message.sessionId);
600
638
  }
601
639
  if (message.type === "session_start") {