@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();
@@ -254,6 +262,18 @@ function handleRecordingControlAck(message) {
254
262
  requestId: message.requestId
255
263
  });
256
264
  }
265
+ function handleConversationHistoryControlAck(message) {
266
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
267
+ if (!pending)
268
+ return;
269
+ clearTimeout(pending.timer);
270
+ pendingConversationHistoryAcks.delete(message.requestId);
271
+ pending.resolve({
272
+ ok: message.ok,
273
+ reason: message.reason,
274
+ requestId: message.requestId
275
+ });
276
+ }
257
277
  function handlePlayAck(message) {
258
278
  const pending = pendingPlayAcks.get(message.requestId);
259
279
  if (!pending)
@@ -341,6 +361,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
341
361
  pending.resolve({ ok: false, reason, requestId });
342
362
  }
343
363
  }
364
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
365
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
366
+ if (pending.sessionId !== sessionId)
367
+ continue;
368
+ clearTimeout(pending.timer);
369
+ pendingConversationHistoryAcks.delete(requestId);
370
+ pending.resolve({ ok: false, reason, requestId });
371
+ }
372
+ }
344
373
  var sessionExecutionContext = new AsyncLocalStorage();
345
374
  var agentLogSessionContext = new AsyncLocalStorage();
346
375
  var inboundQueueAuthority = null;
@@ -487,6 +516,7 @@ async function handleParentMessage(message, handlers) {
487
516
  endedSessionIds.delete(message.sessionId);
488
517
  peerEnvBySessionId.set(message.sessionId, message.env);
489
518
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
519
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
490
520
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
491
521
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
492
522
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -497,6 +527,7 @@ async function handleParentMessage(message, handlers) {
497
527
  sessionId: message.sessionId,
498
528
  env: message.env,
499
529
  recordingAvailable: message.recordingAvailable ?? false,
530
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
500
531
  mixAvailable: message.mixAvailable ?? false,
501
532
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
502
533
  });
@@ -543,8 +574,10 @@ async function handleParentMessage(message, handlers) {
543
574
  break;
544
575
  case "session_end":
545
576
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
577
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
546
578
  peerEnvBySessionId.delete(message.sessionId);
547
579
  recordingAvailableBySessionId.delete(message.sessionId);
580
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
548
581
  mixAvailableBySessionId.delete(message.sessionId);
549
582
  ttsPoseAvailableBySessionId.delete(message.sessionId);
550
583
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -566,6 +599,10 @@ function defineAgent(handlers) {
566
599
  handleRecordingControlAck(message);
567
600
  return;
568
601
  }
602
+ if (isConversationHistoryControlAckMessage(message)) {
603
+ handleConversationHistoryControlAck(message);
604
+ return;
605
+ }
569
606
  if (isPlayAckMessage(message)) {
570
607
  handlePlayAck(message);
571
608
  return;
@@ -599,6 +636,7 @@ function defineAgent(handlers) {
599
636
  if (message.type === "session_end") {
600
637
  endedSessionIds.add(message.sessionId);
601
638
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
639
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
602
640
  inboundBySession.clear(message.sessionId);
603
641
  }
604
642
  if (message.type === "session_start") {
@@ -10915,6 +10915,12 @@ function isRecordingControlAckMessage(value) {
10915
10915
  const msg = value;
10916
10916
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
10917
10917
  }
10918
+ function isConversationHistoryControlAckMessage(value) {
10919
+ if (!value || typeof value !== "object")
10920
+ return false;
10921
+ const msg = value;
10922
+ return msg.type === "conversation_history_control_ack" && typeof msg.requestId === "string";
10923
+ }
10918
10924
  function isMixControlAckMessage(value) {
10919
10925
  if (!value || typeof value !== "object")
10920
10926
  return false;
@@ -10969,7 +10975,7 @@ function isParentMessage(value) {
10969
10975
  if (!value || typeof value !== "object")
10970
10976
  return false;
10971
10977
  const msg = value;
10972
- 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";
10978
+ 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";
10973
10979
  }
10974
10980
  function isSessionScopedParentMessage(value) {
10975
10981
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -10983,11 +10989,13 @@ function parseDataChannelPayload(raw) {
10983
10989
  }
10984
10990
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
10985
10991
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
10992
+ var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
10986
10993
  var mixAvailableBySessionId = /* @__PURE__ */ new Map();
10987
10994
  var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
10988
10995
  var endedSessionIds = /* @__PURE__ */ new Set();
10989
10996
  var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
10990
10997
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
10998
+ var pendingConversationHistoryAcks = /* @__PURE__ */ new Map();
10991
10999
  var pendingPlayAcks = /* @__PURE__ */ new Map();
10992
11000
  var pendingPlayStatusAcks = /* @__PURE__ */ new Map();
10993
11001
  var pendingPlayStopAcks = /* @__PURE__ */ new Map();
@@ -11006,6 +11014,18 @@ function handleRecordingControlAck(message) {
11006
11014
  requestId: message.requestId
11007
11015
  });
11008
11016
  }
11017
+ function handleConversationHistoryControlAck(message) {
11018
+ const pending = pendingConversationHistoryAcks.get(message.requestId);
11019
+ if (!pending)
11020
+ return;
11021
+ clearTimeout(pending.timer);
11022
+ pendingConversationHistoryAcks.delete(message.requestId);
11023
+ pending.resolve({
11024
+ ok: message.ok,
11025
+ reason: message.reason,
11026
+ requestId: message.requestId
11027
+ });
11028
+ }
11009
11029
  function handlePlayAck(message) {
11010
11030
  const pending = pendingPlayAcks.get(message.requestId);
11011
11031
  if (!pending)
@@ -11093,6 +11113,15 @@ function clearPendingRecordingAcksForSession(sessionId, reason) {
11093
11113
  pending.resolve({ ok: false, reason, requestId });
11094
11114
  }
11095
11115
  }
11116
+ function clearPendingConversationHistoryAcksForSession(sessionId, reason) {
11117
+ for (const [requestId, pending] of pendingConversationHistoryAcks) {
11118
+ if (pending.sessionId !== sessionId)
11119
+ continue;
11120
+ clearTimeout(pending.timer);
11121
+ pendingConversationHistoryAcks.delete(requestId);
11122
+ pending.resolve({ ok: false, reason, requestId });
11123
+ }
11124
+ }
11096
11125
  var sessionExecutionContext = new AsyncLocalStorage();
11097
11126
  var agentLogSessionContext = new AsyncLocalStorage();
11098
11127
  var inboundQueueAuthority = null;
@@ -11239,6 +11268,7 @@ async function handleParentMessage(message, handlers) {
11239
11268
  endedSessionIds.delete(message.sessionId);
11240
11269
  peerEnvBySessionId.set(message.sessionId, message.env);
11241
11270
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
11271
+ conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
11242
11272
  mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
11243
11273
  ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
11244
11274
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
@@ -11249,6 +11279,7 @@ async function handleParentMessage(message, handlers) {
11249
11279
  sessionId: message.sessionId,
11250
11280
  env: message.env,
11251
11281
  recordingAvailable: message.recordingAvailable ?? false,
11282
+ conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
11252
11283
  mixAvailable: message.mixAvailable ?? false,
11253
11284
  ttsPoseAvailable: message.ttsPoseAvailable ?? false
11254
11285
  });
@@ -11295,8 +11326,10 @@ async function handleParentMessage(message, handlers) {
11295
11326
  break;
11296
11327
  case "session_end":
11297
11328
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
11329
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
11298
11330
  peerEnvBySessionId.delete(message.sessionId);
11299
11331
  recordingAvailableBySessionId.delete(message.sessionId);
11332
+ conversationHistoryAvailableBySessionId.delete(message.sessionId);
11300
11333
  mixAvailableBySessionId.delete(message.sessionId);
11301
11334
  ttsPoseAvailableBySessionId.delete(message.sessionId);
11302
11335
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
@@ -11318,6 +11351,10 @@ function defineAgent(handlers) {
11318
11351
  handleRecordingControlAck(message);
11319
11352
  return;
11320
11353
  }
11354
+ if (isConversationHistoryControlAckMessage(message)) {
11355
+ handleConversationHistoryControlAck(message);
11356
+ return;
11357
+ }
11321
11358
  if (isPlayAckMessage(message)) {
11322
11359
  handlePlayAck(message);
11323
11360
  return;
@@ -11351,6 +11388,7 @@ function defineAgent(handlers) {
11351
11388
  if (message.type === "session_end") {
11352
11389
  endedSessionIds.add(message.sessionId);
11353
11390
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
11391
+ clearPendingConversationHistoryAcksForSession(message.sessionId, "session_ended");
11354
11392
  inboundBySession.clear(message.sessionId);
11355
11393
  }
11356
11394
  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") {
@@ -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") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voicethere/agent",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
5
5
  "type": "module",
6
6
  "exports": {
@@ -56,8 +56,9 @@ import {
56
56
  orbitSineClipDurationMs,
57
57
  } from "./sine.js";
58
58
 
59
- const ORBIT_TICK_MS = 50;
60
- const ORBIT_POSE_EMIT_MS = 100;
59
+ const ORBIT_POSE_HZ = 60;
60
+ const ORBIT_TICK_MS = 1000 / ORBIT_POSE_HZ;
61
+ const ORBIT_POSE_EMIT_MS = ORBIT_TICK_MS;
61
62
  const ROOM_STATE_TICK_MS = 100;
62
63
  const LOOP_PAD_POLL_MS = 250;
63
64
  const ORBIT_SINE_POLL_MS = 250;
@@ -426,7 +427,7 @@ function emitOrbitPose(sessionId: string, state: SessionState): void {
426
427
  const now = Date.now();
427
428
  if (
428
429
  state.lastOrbitPoseEmitMs !== undefined &&
429
- now - state.lastOrbitPoseEmitMs < ORBIT_POSE_EMIT_MS
430
+ now - state.lastOrbitPoseEmitMs < ORBIT_POSE_EMIT_MS - 2
430
431
  ) {
431
432
  return;
432
433
  }
@@ -35,6 +35,8 @@ export const SHOWCASE_SOUND_FILES: Record<ShowcaseClipId, ShowcaseSoundFile> = {
35
35
  export const SHOWCASE_ASSET_ORIGINS = [
36
36
  "https://app.voicethere.io",
37
37
  "https://app.voicethere.dev",
38
+ "https://www.voicethere.io",
39
+ "https://voicethere.io",
38
40
  "http://localhost:3000",
39
41
  ] as const;
40
42