@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.
- package/dist/agent.js +64 -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 +120 -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 +63 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +259 -0
- package/dist/runtime.js.map +1 -1
- package/dist/templates/echo/agent.js +62 -2
- package/dist/templates/echo-dc/agent.js +62 -2
- package/dist/templates/game-sync/agent.js +62 -2
- package/dist/templates/positional-tts/agent.js +811 -0
- package/dist/templates/recording-consent/agent.js +62 -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 +62 -2
- package/dist/templates/voice-starter/agent.js +62 -2
- package/dist/templates/webhooks/agent.js +62 -2
- package/dist/templates/webhooks-redis/agent.js +62 -2
- package/package.json +4 -4
- package/templates/README.md +10 -4
- package/templates/mix-smoke.ts +352 -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,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;
|