@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.
- package/dist/agent.js +63 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +99 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +4 -0
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +45 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +230 -0
- package/dist/runtime.js.map +1 -1
- package/dist/templates/echo/agent.js +61 -2
- package/dist/templates/echo-dc/agent.js +61 -2
- package/dist/templates/game-sync/agent.js +61 -2
- package/dist/templates/positional-tts/agent.js +810 -0
- package/dist/templates/recording-consent/agent.js +61 -2
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +16 -0
- package/dist/templates/registry.js.map +1 -1
- package/dist/templates/voice-showcase/agent.js +61 -2
- package/dist/templates/voice-starter/agent.js +61 -2
- package/dist/templates/webhooks/agent.js +61 -2
- package/dist/templates/webhooks-redis/agent.js +61 -2
- package/package.json +4 -4
- package/templates/README.md +10 -4
- package/templates/mix-smoke.ts +224 -0
- package/templates/positional-tts/agent.ts +115 -0
- package/templates/positional-tts/orbit.ts +11 -0
|
@@ -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;
|