@voicethere/agent 0.8.1 → 0.8.2
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.
- package/README.md +10 -9
- package/dist/agent.js +45 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +36 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +11 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +95 -0
- package/dist/runtime.js.map +1 -1
- package/dist/templates/echo/agent.js +39 -1
- package/dist/templates/echo-dc/agent.js +39 -1
- package/dist/templates/game-sync/agent.js +39 -1
- package/dist/templates/positional-tts/agent.js +39 -1
- package/dist/templates/recording-consent/agent.js +39 -1
- package/dist/templates/spatial-showcase/agent.js +39 -1
- package/dist/templates/voice-showcase/agent.js +39 -1
- package/dist/templates/voice-starter/agent.js +39 -1
- package/dist/templates/webhooks/agent.js +39 -1
- package/dist/templates/webhooks-redis/agent.js +39 -1
- package/dist/templates/world-sync/agent.js +39 -1
- package/dist/templates/world-sync-binary/agent.js +39 -1
- package/package.json +1 -1
|
@@ -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") {
|