@voicethere/agent 0.6.0 → 0.7.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.
@@ -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,31 @@ 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
+ ...message.statuses ? { statuses: message.statuses } : {}
236
+ });
237
+ }
238
+ function handleSttControlAck(message) {
239
+ const pending = pendingSttAcks.get(message.requestId);
240
+ if (!pending)
241
+ return;
242
+ clearTimeout(pending.timer);
243
+ pendingSttAcks.delete(message.requestId);
244
+ pending.resolve({
245
+ ok: message.ok,
246
+ reason: message.reason,
247
+ requestId: message.requestId
248
+ });
249
+ }
209
250
  function clearPendingRecordingAcksForSession(sessionId, reason) {
210
251
  for (const [requestId, pending] of pendingRecordingAcks) {
211
252
  if (pending.sessionId !== sessionId)
@@ -261,6 +302,11 @@ function allowOutboundForSession(sessionId) {
261
302
  return queue.isLive(sessionId);
262
303
  }
263
304
  function sendParentMessage(message) {
305
+ const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
306
+ if (msgType === "mix_control" || msgType === "stt_control") {
307
+ process.send?.(message);
308
+ return;
309
+ }
264
310
  const sessionId = message && typeof message === "object" && "sessionId" in message && typeof message.sessionId === "string" ? message.sessionId : void 0;
265
311
  if (!allowOutboundForSession(sessionId))
266
312
  return;
@@ -342,6 +388,8 @@ async function handleParentMessage(message, handlers) {
342
388
  endedSessionIds.delete(message.sessionId);
343
389
  peerEnvBySessionId.set(message.sessionId, message.env);
344
390
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
391
+ mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
392
+ ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
345
393
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
346
394
  if (sessionStartInitDelayMs > 0) {
347
395
  await new Promise((resolve) => setTimeout(resolve, sessionStartInitDelayMs));
@@ -349,7 +397,9 @@ async function handleParentMessage(message, handlers) {
349
397
  await (handlers.onClientJoin ?? handlers.onSessionStart)?.({
350
398
  sessionId: message.sessionId,
351
399
  env: message.env,
352
- recordingAvailable: message.recordingAvailable ?? false
400
+ recordingAvailable: message.recordingAvailable ?? false,
401
+ mixAvailable: message.mixAvailable ?? false,
402
+ ttsPoseAvailable: message.ttsPoseAvailable ?? false
353
403
  });
354
404
  sendParentMessage({
355
405
  type: "session_start_ack",
@@ -387,6 +437,8 @@ async function handleParentMessage(message, handlers) {
387
437
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
388
438
  peerEnvBySessionId.delete(message.sessionId);
389
439
  recordingAvailableBySessionId.delete(message.sessionId);
440
+ mixAvailableBySessionId.delete(message.sessionId);
441
+ ttsPoseAvailableBySessionId.delete(message.sessionId);
390
442
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
391
443
  sessionId: message.sessionId
392
444
  });
@@ -406,6 +458,14 @@ function defineAgent(handlers) {
406
458
  handleRecordingControlAck(message);
407
459
  return;
408
460
  }
461
+ if (isMixControlAckMessage(message)) {
462
+ handleMixControlAck(message);
463
+ return;
464
+ }
465
+ if (isSttControlAckMessage(message)) {
466
+ handleSttControlAck(message);
467
+ return;
468
+ }
409
469
  if (isWebhookMessage(message)) {
410
470
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
411
471
  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,31 @@ 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
+ ...message.statuses ? { statuses: message.statuses } : {}
10990
+ });
10991
+ }
10992
+ function handleSttControlAck(message) {
10993
+ const pending = pendingSttAcks.get(message.requestId);
10994
+ if (!pending)
10995
+ return;
10996
+ clearTimeout(pending.timer);
10997
+ pendingSttAcks.delete(message.requestId);
10998
+ pending.resolve({
10999
+ ok: message.ok,
11000
+ reason: message.reason,
11001
+ requestId: message.requestId
11002
+ });
11003
+ }
10963
11004
  function clearPendingRecordingAcksForSession(sessionId, reason) {
10964
11005
  for (const [requestId, pending] of pendingRecordingAcks) {
10965
11006
  if (pending.sessionId !== sessionId)
@@ -11015,6 +11056,11 @@ function allowOutboundForSession(sessionId) {
11015
11056
  return queue.isLive(sessionId);
11016
11057
  }
11017
11058
  function sendParentMessage(message) {
11059
+ const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
11060
+ if (msgType === "mix_control" || msgType === "stt_control") {
11061
+ process.send?.(message);
11062
+ return;
11063
+ }
11018
11064
  const sessionId = message && typeof message === "object" && "sessionId" in message && typeof message.sessionId === "string" ? message.sessionId : void 0;
11019
11065
  if (!allowOutboundForSession(sessionId))
11020
11066
  return;
@@ -11096,6 +11142,8 @@ async function handleParentMessage(message, handlers) {
11096
11142
  endedSessionIds.delete(message.sessionId);
11097
11143
  peerEnvBySessionId.set(message.sessionId, message.env);
11098
11144
  recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
11145
+ mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
11146
+ ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
11099
11147
  const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
11100
11148
  if (sessionStartInitDelayMs > 0) {
11101
11149
  await new Promise((resolve) => setTimeout(resolve, sessionStartInitDelayMs));
@@ -11103,7 +11151,9 @@ async function handleParentMessage(message, handlers) {
11103
11151
  await (handlers.onClientJoin ?? handlers.onSessionStart)?.({
11104
11152
  sessionId: message.sessionId,
11105
11153
  env: message.env,
11106
- recordingAvailable: message.recordingAvailable ?? false
11154
+ recordingAvailable: message.recordingAvailable ?? false,
11155
+ mixAvailable: message.mixAvailable ?? false,
11156
+ ttsPoseAvailable: message.ttsPoseAvailable ?? false
11107
11157
  });
11108
11158
  sendParentMessage({
11109
11159
  type: "session_start_ack",
@@ -11141,6 +11191,8 @@ async function handleParentMessage(message, handlers) {
11141
11191
  clearPendingRecordingAcksForSession(message.sessionId, "session_ended");
11142
11192
  peerEnvBySessionId.delete(message.sessionId);
11143
11193
  recordingAvailableBySessionId.delete(message.sessionId);
11194
+ mixAvailableBySessionId.delete(message.sessionId);
11195
+ ttsPoseAvailableBySessionId.delete(message.sessionId);
11144
11196
  await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
11145
11197
  sessionId: message.sessionId
11146
11198
  });
@@ -11160,6 +11212,14 @@ function defineAgent(handlers) {
11160
11212
  handleRecordingControlAck(message);
11161
11213
  return;
11162
11214
  }
11215
+ if (isMixControlAckMessage(message)) {
11216
+ handleMixControlAck(message);
11217
+ return;
11218
+ }
11219
+ if (isSttControlAckMessage(message)) {
11220
+ handleSttControlAck(message);
11221
+ return;
11222
+ }
11163
11223
  if (isWebhookMessage(message)) {
11164
11224
  void agentStartReady.then(() => handleWebhookMessage(message, handlers));
11165
11225
  return;