@voicethere/agent 0.6.0 → 0.7.0

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.
@@ -136,6 +136,18 @@ function isRecordingControlAckMessage(value) {
136
136
  const msg = value;
137
137
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
138
138
  }
139
+ function isMixControlAckMessage(value) {
140
+ if (!value || typeof value !== "object")
141
+ return false;
142
+ const msg = value;
143
+ return msg.type === "mix_control_ack" && typeof msg.requestId === "string";
144
+ }
145
+ function isSttControlAckMessage(value) {
146
+ if (!value || typeof value !== "object")
147
+ return false;
148
+ const msg = value;
149
+ return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
150
+ }
139
151
  function isWebhookMessage(value) {
140
152
  if (!value || typeof value !== "object")
141
153
  return false;
@@ -178,7 +190,7 @@ function isParentMessage(value) {
178
190
  if (!value || typeof value !== "object")
179
191
  return false;
180
192
  const msg = value;
181
- 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 === "webhook";
193
+ 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 === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "webhook";
182
194
  }
183
195
  function isSessionScopedParentMessage(value) {
184
196
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -192,8 +204,12 @@ function parseDataChannelPayload(raw) {
192
204
  }
193
205
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
194
206
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
207
+ var mixAvailableBySessionId = /* @__PURE__ */ new Map();
208
+ var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
195
209
  var endedSessionIds = /* @__PURE__ */ new Set();
196
210
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
211
+ var pendingMixAcks = /* @__PURE__ */ new Map();
212
+ var pendingSttAcks = /* @__PURE__ */ new Map();
197
213
  function handleRecordingControlAck(message) {
198
214
  const pending = pendingRecordingAcks.get(message.requestId);
199
215
  if (!pending)
@@ -206,6 +222,30 @@ function handleRecordingControlAck(message) {
206
222
  requestId: message.requestId
207
223
  });
208
224
  }
225
+ function handleMixControlAck(message) {
226
+ const pending = pendingMixAcks.get(message.requestId);
227
+ if (!pending)
228
+ return;
229
+ clearTimeout(pending.timer);
230
+ pendingMixAcks.delete(message.requestId);
231
+ pending.resolve({
232
+ ok: message.ok,
233
+ reason: message.reason,
234
+ requestId: message.requestId
235
+ });
236
+ }
237
+ function handleSttControlAck(message) {
238
+ const pending = pendingSttAcks.get(message.requestId);
239
+ if (!pending)
240
+ return;
241
+ clearTimeout(pending.timer);
242
+ pendingSttAcks.delete(message.requestId);
243
+ pending.resolve({
244
+ ok: message.ok,
245
+ reason: message.reason,
246
+ requestId: message.requestId
247
+ });
248
+ }
209
249
  function clearPendingRecordingAcksForSession(sessionId, reason) {
210
250
  for (const [requestId, pending] of pendingRecordingAcks) {
211
251
  if (pending.sessionId !== sessionId)
@@ -261,6 +301,11 @@ function allowOutboundForSession(sessionId) {
261
301
  return queue.isLive(sessionId);
262
302
  }
263
303
  function sendParentMessage(message) {
304
+ const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
305
+ if (msgType === "mix_control" || msgType === "stt_control") {
306
+ process.send?.(message);
307
+ return;
308
+ }
264
309
  const sessionId = message && typeof message === "object" && "sessionId" in message && typeof message.sessionId === "string" ? message.sessionId : void 0;
265
310
  if (!allowOutboundForSession(sessionId))
266
311
  return;
@@ -342,6 +387,8 @@ async function handleParentMessage(message, handlers) {
342
387
  endedSessionIds.delete(message.sessionId);
343
388
  peerEnvBySessionId.set(message.sessionId, message.env);
344
389
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
390
+ mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
391
+ ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
345
392
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
346
393
  if (sessionStartInitDelayMs > 0) {
347
394
  await new Promise((resolve) => setTimeout(resolve, sessionStartInitDelayMs));
@@ -349,7 +396,9 @@ async function handleParentMessage(message, handlers) {
349
396
  await (handlers.onClientJoin ?? handlers.onSessionStart)?.({
350
397
  sessionId: message.sessionId,
351
398
  env: message.env,
352
- recordingAvailable: message.recordingAvailable ?? false
399
+ recordingAvailable: message.recordingAvailable ?? false,
400
+ mixAvailable: message.mixAvailable ?? false,
401
+ ttsPoseAvailable: message.ttsPoseAvailable ?? false
353
402
  });
354
403
  sendParentMessage({
355
404
  type: "session_start_ack",
@@ -387,6 +436,8 @@ async function handleParentMessage(message, handlers) {
387
436
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
388
437
  peerEnvBySessionId.delete(message.sessionId);
389
438
  recordingAvailableBySessionId.delete(message.sessionId);
439
+ mixAvailableBySessionId.delete(message.sessionId);
440
+ ttsPoseAvailableBySessionId.delete(message.sessionId);
390
441
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
391
442
  sessionId: message.sessionId
392
443
  });
@@ -406,6 +457,14 @@ function defineAgent(handlers) {
406
457
  handleRecordingControlAck(message);
407
458
  return;
408
459
  }
460
+ if (isMixControlAckMessage(message)) {
461
+ handleMixControlAck(message);
462
+ return;
463
+ }
464
+ if (isSttControlAckMessage(message)) {
465
+ handleSttControlAck(message);
466
+ return;
467
+ }
409
468
  if (isWebhookMessage(message)) {
410
469
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
411
470
  return;
@@ -10890,6 +10890,18 @@ function isRecordingControlAckMessage(value) {
10890
10890
  const msg = value;
10891
10891
  return msg.type === "recording_control_ack" && typeof msg.requestId === "string";
10892
10892
  }
10893
+ function isMixControlAckMessage(value) {
10894
+ if (!value || typeof value !== "object")
10895
+ return false;
10896
+ const msg = value;
10897
+ return msg.type === "mix_control_ack" && typeof msg.requestId === "string";
10898
+ }
10899
+ function isSttControlAckMessage(value) {
10900
+ if (!value || typeof value !== "object")
10901
+ return false;
10902
+ const msg = value;
10903
+ return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
10904
+ }
10893
10905
  function isWebhookMessage(value) {
10894
10906
  if (!value || typeof value !== "object")
10895
10907
  return false;
@@ -10932,7 +10944,7 @@ function isParentMessage(value) {
10932
10944
  if (!value || typeof value !== "object")
10933
10945
  return false;
10934
10946
  const msg = value;
10935
- 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 === "webhook";
10947
+ 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 === "mix_control_ack" || msg.type === "stt_control_ack" || msg.type === "webhook";
10936
10948
  }
10937
10949
  function isSessionScopedParentMessage(value) {
10938
10950
  return isParentMessage(value) && !isWebhookMessage(value);
@@ -10946,8 +10958,12 @@ function parseDataChannelPayload(raw) {
10946
10958
  }
10947
10959
  var peerEnvBySessionId = /* @__PURE__ */ new Map();
10948
10960
  var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
10961
+ var mixAvailableBySessionId = /* @__PURE__ */ new Map();
10962
+ var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
10949
10963
  var endedSessionIds = /* @__PURE__ */ new Set();
10950
10964
  var pendingRecordingAcks = /* @__PURE__ */ new Map();
10965
+ var pendingMixAcks = /* @__PURE__ */ new Map();
10966
+ var pendingSttAcks = /* @__PURE__ */ new Map();
10951
10967
  function handleRecordingControlAck(message) {
10952
10968
  const pending = pendingRecordingAcks.get(message.requestId);
10953
10969
  if (!pending)
@@ -10960,6 +10976,30 @@ function handleRecordingControlAck(message) {
10960
10976
  requestId: message.requestId
10961
10977
  });
10962
10978
  }
10979
+ function handleMixControlAck(message) {
10980
+ const pending = pendingMixAcks.get(message.requestId);
10981
+ if (!pending)
10982
+ return;
10983
+ clearTimeout(pending.timer);
10984
+ pendingMixAcks.delete(message.requestId);
10985
+ pending.resolve({
10986
+ ok: message.ok,
10987
+ reason: message.reason,
10988
+ requestId: message.requestId
10989
+ });
10990
+ }
10991
+ function handleSttControlAck(message) {
10992
+ const pending = pendingSttAcks.get(message.requestId);
10993
+ if (!pending)
10994
+ return;
10995
+ clearTimeout(pending.timer);
10996
+ pendingSttAcks.delete(message.requestId);
10997
+ pending.resolve({
10998
+ ok: message.ok,
10999
+ reason: message.reason,
11000
+ requestId: message.requestId
11001
+ });
11002
+ }
10963
11003
  function clearPendingRecordingAcksForSession(sessionId, reason) {
10964
11004
  for (const [requestId, pending] of pendingRecordingAcks) {
10965
11005
  if (pending.sessionId !== sessionId)
@@ -11015,6 +11055,11 @@ function allowOutboundForSession(sessionId) {
11015
11055
  return queue.isLive(sessionId);
11016
11056
  }
11017
11057
  function sendParentMessage(message) {
11058
+ const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
11059
+ if (msgType === "mix_control" || msgType === "stt_control") {
11060
+ process.send?.(message);
11061
+ return;
11062
+ }
11018
11063
  const sessionId = message && typeof message === "object" && "sessionId" in message && typeof message.sessionId === "string" ? message.sessionId : void 0;
11019
11064
  if (!allowOutboundForSession(sessionId))
11020
11065
  return;
@@ -11096,6 +11141,8 @@ async function handleParentMessage(message, handlers) {
11096
11141
  endedSessionIds.delete(message.sessionId);
11097
11142
  peerEnvBySessionId.set(message.sessionId, message.env);
11098
11143
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
11144
+ mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
11145
+ ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
11099
11146
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
11100
11147
  if (sessionStartInitDelayMs > 0) {
11101
11148
  await new Promise((resolve) => setTimeout(resolve, sessionStartInitDelayMs));
@@ -11103,7 +11150,9 @@ async function handleParentMessage(message, handlers) {
11103
11150
  await (handlers.onClientJoin ?? handlers.onSessionStart)?.({
11104
11151
  sessionId: message.sessionId,
11105
11152
  env: message.env,
11106
- recordingAvailable: message.recordingAvailable ?? false
11153
+ recordingAvailable: message.recordingAvailable ?? false,
11154
+ mixAvailable: message.mixAvailable ?? false,
11155
+ ttsPoseAvailable: message.ttsPoseAvailable ?? false
11107
11156
  });
11108
11157
  sendParentMessage({
11109
11158
  type: "session_start_ack",
@@ -11141,6 +11190,8 @@ async function handleParentMessage(message, handlers) {
11141
11190
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
11142
11191
  peerEnvBySessionId.delete(message.sessionId);
11143
11192
  recordingAvailableBySessionId.delete(message.sessionId);
11193
+ mixAvailableBySessionId.delete(message.sessionId);
11194
+ ttsPoseAvailableBySessionId.delete(message.sessionId);
11144
11195
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
11145
11196
  sessionId: message.sessionId
11146
11197
  });
@@ -11160,6 +11211,14 @@ function defineAgent(handlers) {
11160
11211
  handleRecordingControlAck(message);
11161
11212
  return;
11162
11213
  }
11214
+ if (isMixControlAckMessage(message)) {
11215
+ handleMixControlAck(message);
11216
+ return;
11217
+ }
11218
+ if (isSttControlAckMessage(message)) {
11219
+ handleSttControlAck(message);
11220
+ return;
11221
+ }
11163
11222
  if (isWebhookMessage(message)) {
11164
11223
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
11165
11224
  return;