@voicethere/agent 0.8.3 → 0.9.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/README.md +36 -20
- package/dist/agent.js +55 -2
- 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 +81 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +69 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +152 -1
- package/dist/runtime.js.map +1 -1
- package/dist/templates/echo/agent.js +51 -2
- package/dist/templates/echo-dc/agent.js +51 -2
- package/dist/templates/game-sync/agent.js +51 -2
- package/dist/templates/language-switch/agent.js +1112 -0
- package/dist/templates/positional-tts/agent.js +51 -2
- package/dist/templates/recording-consent/agent.js +51 -2
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +8 -0
- package/dist/templates/registry.js.map +1 -1
- package/dist/templates/spatial-showcase/agent.js +51 -2
- package/dist/templates/voice-showcase/agent.js +51 -2
- package/dist/templates/voice-starter/agent.js +51 -2
- package/dist/templates/webhooks/agent.js +51 -2
- package/dist/templates/webhooks-redis/agent.js +51 -2
- package/dist/templates/world-sync/agent.js +51 -2
- package/dist/templates/world-sync-binary/agent.js +51 -2
- package/package.json +1 -1
- package/templates/README.md +31 -30
- package/templates/language-switch/README.md +31 -0
- package/templates/language-switch/agent.ts +233 -0
- package/templates/voice-starter/agent.ts +3 -1
|
@@ -178,6 +178,12 @@ function isSttControlAckMessage(value) {
|
|
|
178
178
|
const msg = value;
|
|
179
179
|
return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
|
|
180
180
|
}
|
|
181
|
+
function isVoiceLanguageControlAckMessage(value) {
|
|
182
|
+
if (!value || typeof value !== "object")
|
|
183
|
+
return false;
|
|
184
|
+
const msg = value;
|
|
185
|
+
return msg.type === "voice_language_control_ack" && typeof msg.requestId === "string";
|
|
186
|
+
}
|
|
181
187
|
function isWebhookMessage(value) {
|
|
182
188
|
if (!value || typeof value !== "object")
|
|
183
189
|
return false;
|
|
@@ -220,7 +226,7 @@ function isParentMessage(value) {
|
|
|
220
226
|
if (!value || typeof value !== "object")
|
|
221
227
|
return false;
|
|
222
228
|
const msg = value;
|
|
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";
|
|
229
|
+
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 === "voice_language_control_ack" || msg.type === "webhook";
|
|
224
230
|
}
|
|
225
231
|
function isSessionScopedParentMessage(value) {
|
|
226
232
|
return isParentMessage(value) && !isWebhookMessage(value);
|
|
@@ -236,6 +242,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
|
|
|
236
242
|
var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
237
243
|
var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
238
244
|
var mixAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
245
|
+
var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
246
|
+
var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
|
|
239
247
|
var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
240
248
|
var endedSessionIds = /* @__PURE__ */ new Set();
|
|
241
249
|
var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
|
|
@@ -247,6 +255,7 @@ var pendingPlayStopAcks = /* @__PURE__ */ new Map();
|
|
|
247
255
|
var pendingPlayPoseAcks = /* @__PURE__ */ new Map();
|
|
248
256
|
var pendingMixAcks = /* @__PURE__ */ new Map();
|
|
249
257
|
var pendingSttAcks = /* @__PURE__ */ new Map();
|
|
258
|
+
var pendingVoiceLanguageAcks = /* @__PURE__ */ new Map();
|
|
250
259
|
function handleRecordingControlAck(message) {
|
|
251
260
|
const pending = pendingRecordingAcks.get(message.requestId);
|
|
252
261
|
if (!pending)
|
|
@@ -349,6 +358,27 @@ function handleSttControlAck(message) {
|
|
|
349
358
|
requestId: message.requestId
|
|
350
359
|
});
|
|
351
360
|
}
|
|
361
|
+
function handleVoiceLanguageControlAck(message) {
|
|
362
|
+
const pending = pendingVoiceLanguageAcks.get(message.requestId);
|
|
363
|
+
if (!pending)
|
|
364
|
+
return;
|
|
365
|
+
clearTimeout(pending.timer);
|
|
366
|
+
pendingVoiceLanguageAcks.delete(message.requestId);
|
|
367
|
+
if (message.ok && message.language?.trim()) {
|
|
368
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
|
|
369
|
+
}
|
|
370
|
+
pending.resolve({
|
|
371
|
+
ok: message.ok,
|
|
372
|
+
reason: message.reason,
|
|
373
|
+
requestId: message.requestId,
|
|
374
|
+
...message.language ? { language: message.language } : {},
|
|
375
|
+
...message.voice ? { voice: message.voice } : {},
|
|
376
|
+
...message.stt ? { stt: message.stt } : {},
|
|
377
|
+
...message.scope ? { scope: message.scope } : {},
|
|
378
|
+
...message.sttProvider ? { sttProvider: message.sttProvider } : {},
|
|
379
|
+
...message.ttsProvider ? { ttsProvider: message.ttsProvider } : {}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
352
382
|
function clearPendingRecordingAcksForSession(sessionId, reason) {
|
|
353
383
|
for (const [requestId, pending] of pendingRecordingAcks) {
|
|
354
384
|
if (pending.sessionId !== sessionId)
|
|
@@ -414,7 +444,7 @@ function allowOutboundForSession(sessionId) {
|
|
|
414
444
|
}
|
|
415
445
|
function sendParentMessage(message) {
|
|
416
446
|
const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
|
|
417
|
-
if (msgType === "mix_control" || msgType === "stt_control") {
|
|
447
|
+
if (msgType === "mix_control" || msgType === "stt_control" || msgType === "voice_language_control") {
|
|
418
448
|
process.send?.(message);
|
|
419
449
|
return;
|
|
420
450
|
}
|
|
@@ -515,6 +545,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
515
545
|
recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
|
|
516
546
|
conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
|
|
517
547
|
mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
|
|
548
|
+
voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
|
|
518
549
|
ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
|
|
519
550
|
const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
|
|
520
551
|
if (sessionStartInitDelayMs > 0) {
|
|
@@ -526,6 +557,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
526
557
|
recordingAvailable: message.recordingAvailable ?? false,
|
|
527
558
|
conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
|
|
528
559
|
mixAvailable: message.mixAvailable ?? false,
|
|
560
|
+
voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
|
|
529
561
|
ttsPoseAvailable: message.ttsPoseAvailable ?? false
|
|
530
562
|
});
|
|
531
563
|
sendParentMessage({
|
|
@@ -544,12 +576,23 @@ async function handleParentMessage(message, handlers) {
|
|
|
544
576
|
if (message.event.type === "user_language") {
|
|
545
577
|
const language = resolveUserLanguageCode(message.event);
|
|
546
578
|
if (language) {
|
|
579
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, language);
|
|
547
580
|
await handlers.onUserLanguage?.({
|
|
548
581
|
sessionId: message.sessionId,
|
|
549
582
|
language
|
|
550
583
|
});
|
|
551
584
|
}
|
|
552
585
|
}
|
|
586
|
+
if (message.event.type === "voice_language_changed") {
|
|
587
|
+
const language = resolveUserLanguageCode(message.event);
|
|
588
|
+
if (language) {
|
|
589
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, language);
|
|
590
|
+
await handlers.onVoiceLanguageChanged?.({
|
|
591
|
+
sessionId: message.sessionId,
|
|
592
|
+
language
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
553
596
|
break;
|
|
554
597
|
case "data_channel_message":
|
|
555
598
|
await handlers.onDataChannelMessage?.({
|
|
@@ -576,6 +619,8 @@ async function handleParentMessage(message, handlers) {
|
|
|
576
619
|
recordingAvailableBySessionId.delete(message.sessionId);
|
|
577
620
|
conversationHistoryAvailableBySessionId.delete(message.sessionId);
|
|
578
621
|
mixAvailableBySessionId.delete(message.sessionId);
|
|
622
|
+
voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
|
|
623
|
+
lastVoiceLanguageBySessionId.delete(message.sessionId);
|
|
579
624
|
ttsPoseAvailableBySessionId.delete(message.sessionId);
|
|
580
625
|
await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
|
|
581
626
|
sessionId: message.sessionId
|
|
@@ -624,6 +669,10 @@ function defineAgent(handlers) {
|
|
|
624
669
|
handleSttControlAck(message);
|
|
625
670
|
return;
|
|
626
671
|
}
|
|
672
|
+
if (isVoiceLanguageControlAckMessage(message)) {
|
|
673
|
+
handleVoiceLanguageControlAck(message);
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
627
676
|
if (isWebhookMessage(message)) {
|
|
628
677
|
void agentStartReady.then(() => handleWebhookMessage(message, handlers));
|
|
629
678
|
return;
|
|
@@ -10932,6 +10932,12 @@ function isSttControlAckMessage(value) {
|
|
|
10932
10932
|
const msg = value;
|
|
10933
10933
|
return msg.type === "stt_control_ack" && typeof msg.requestId === "string";
|
|
10934
10934
|
}
|
|
10935
|
+
function isVoiceLanguageControlAckMessage(value) {
|
|
10936
|
+
if (!value || typeof value !== "object")
|
|
10937
|
+
return false;
|
|
10938
|
+
const msg = value;
|
|
10939
|
+
return msg.type === "voice_language_control_ack" && typeof msg.requestId === "string";
|
|
10940
|
+
}
|
|
10935
10941
|
function isWebhookMessage(value) {
|
|
10936
10942
|
if (!value || typeof value !== "object")
|
|
10937
10943
|
return false;
|
|
@@ -10974,7 +10980,7 @@ function isParentMessage(value) {
|
|
|
10974
10980
|
if (!value || typeof value !== "object")
|
|
10975
10981
|
return false;
|
|
10976
10982
|
const msg = value;
|
|
10977
|
-
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";
|
|
10983
|
+
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 === "voice_language_control_ack" || msg.type === "webhook";
|
|
10978
10984
|
}
|
|
10979
10985
|
function isSessionScopedParentMessage(value) {
|
|
10980
10986
|
return isParentMessage(value) && !isWebhookMessage(value);
|
|
@@ -10990,6 +10996,8 @@ var peerEnvBySessionId = /* @__PURE__ */ new Map();
|
|
|
10990
10996
|
var recordingAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
10991
10997
|
var conversationHistoryAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
10992
10998
|
var mixAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
10999
|
+
var voiceLanguageSwitchAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
11000
|
+
var lastVoiceLanguageBySessionId = /* @__PURE__ */ new Map();
|
|
10993
11001
|
var ttsPoseAvailableBySessionId = /* @__PURE__ */ new Map();
|
|
10994
11002
|
var endedSessionIds = /* @__PURE__ */ new Set();
|
|
10995
11003
|
var PLAY_BYTES_MAX_DECODED_LENGTH = 64 * 1024;
|
|
@@ -11001,6 +11009,7 @@ var pendingPlayStopAcks = /* @__PURE__ */ new Map();
|
|
|
11001
11009
|
var pendingPlayPoseAcks = /* @__PURE__ */ new Map();
|
|
11002
11010
|
var pendingMixAcks = /* @__PURE__ */ new Map();
|
|
11003
11011
|
var pendingSttAcks = /* @__PURE__ */ new Map();
|
|
11012
|
+
var pendingVoiceLanguageAcks = /* @__PURE__ */ new Map();
|
|
11004
11013
|
function handleRecordingControlAck(message) {
|
|
11005
11014
|
const pending = pendingRecordingAcks.get(message.requestId);
|
|
11006
11015
|
if (!pending)
|
|
@@ -11103,6 +11112,27 @@ function handleSttControlAck(message) {
|
|
|
11103
11112
|
requestId: message.requestId
|
|
11104
11113
|
});
|
|
11105
11114
|
}
|
|
11115
|
+
function handleVoiceLanguageControlAck(message) {
|
|
11116
|
+
const pending = pendingVoiceLanguageAcks.get(message.requestId);
|
|
11117
|
+
if (!pending)
|
|
11118
|
+
return;
|
|
11119
|
+
clearTimeout(pending.timer);
|
|
11120
|
+
pendingVoiceLanguageAcks.delete(message.requestId);
|
|
11121
|
+
if (message.ok && message.language?.trim()) {
|
|
11122
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, message.language.trim());
|
|
11123
|
+
}
|
|
11124
|
+
pending.resolve({
|
|
11125
|
+
ok: message.ok,
|
|
11126
|
+
reason: message.reason,
|
|
11127
|
+
requestId: message.requestId,
|
|
11128
|
+
...message.language ? { language: message.language } : {},
|
|
11129
|
+
...message.voice ? { voice: message.voice } : {},
|
|
11130
|
+
...message.stt ? { stt: message.stt } : {},
|
|
11131
|
+
...message.scope ? { scope: message.scope } : {},
|
|
11132
|
+
...message.sttProvider ? { sttProvider: message.sttProvider } : {},
|
|
11133
|
+
...message.ttsProvider ? { ttsProvider: message.ttsProvider } : {}
|
|
11134
|
+
});
|
|
11135
|
+
}
|
|
11106
11136
|
function clearPendingRecordingAcksForSession(sessionId, reason) {
|
|
11107
11137
|
for (const [requestId, pending] of pendingRecordingAcks) {
|
|
11108
11138
|
if (pending.sessionId !== sessionId)
|
|
@@ -11168,7 +11198,7 @@ function allowOutboundForSession(sessionId) {
|
|
|
11168
11198
|
}
|
|
11169
11199
|
function sendParentMessage(message) {
|
|
11170
11200
|
const msgType = message && typeof message === "object" && "type" in message ? message.type : void 0;
|
|
11171
|
-
if (msgType === "mix_control" || msgType === "stt_control") {
|
|
11201
|
+
if (msgType === "mix_control" || msgType === "stt_control" || msgType === "voice_language_control") {
|
|
11172
11202
|
process.send?.(message);
|
|
11173
11203
|
return;
|
|
11174
11204
|
}
|
|
@@ -11269,6 +11299,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
11269
11299
|
recordingAvailableBySessionId.set(message.sessionId, message.recordingAvailable ?? false);
|
|
11270
11300
|
conversationHistoryAvailableBySessionId.set(message.sessionId, message.conversationHistoryAvailable ?? false);
|
|
11271
11301
|
mixAvailableBySessionId.set(message.sessionId, message.mixAvailable ?? false);
|
|
11302
|
+
voiceLanguageSwitchAvailableBySessionId.set(message.sessionId, message.voiceLanguageSwitchAvailable ?? false);
|
|
11272
11303
|
ttsPoseAvailableBySessionId.set(message.sessionId, message.ttsPoseAvailable ?? false);
|
|
11273
11304
|
const sessionStartInitDelayMs = resolveSessionStartInitDelayMs();
|
|
11274
11305
|
if (sessionStartInitDelayMs > 0) {
|
|
@@ -11280,6 +11311,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
11280
11311
|
recordingAvailable: message.recordingAvailable ?? false,
|
|
11281
11312
|
conversationHistoryAvailable: message.conversationHistoryAvailable ?? false,
|
|
11282
11313
|
mixAvailable: message.mixAvailable ?? false,
|
|
11314
|
+
voiceLanguageSwitchAvailable: message.voiceLanguageSwitchAvailable ?? false,
|
|
11283
11315
|
ttsPoseAvailable: message.ttsPoseAvailable ?? false
|
|
11284
11316
|
});
|
|
11285
11317
|
sendParentMessage({
|
|
@@ -11298,12 +11330,23 @@ async function handleParentMessage(message, handlers) {
|
|
|
11298
11330
|
if (message.event.type === "user_language") {
|
|
11299
11331
|
const language = resolveUserLanguageCode(message.event);
|
|
11300
11332
|
if (language) {
|
|
11333
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, language);
|
|
11301
11334
|
await handlers.onUserLanguage?.({
|
|
11302
11335
|
sessionId: message.sessionId,
|
|
11303
11336
|
language
|
|
11304
11337
|
});
|
|
11305
11338
|
}
|
|
11306
11339
|
}
|
|
11340
|
+
if (message.event.type === "voice_language_changed") {
|
|
11341
|
+
const language = resolveUserLanguageCode(message.event);
|
|
11342
|
+
if (language) {
|
|
11343
|
+
lastVoiceLanguageBySessionId.set(message.sessionId, language);
|
|
11344
|
+
await handlers.onVoiceLanguageChanged?.({
|
|
11345
|
+
sessionId: message.sessionId,
|
|
11346
|
+
language
|
|
11347
|
+
});
|
|
11348
|
+
}
|
|
11349
|
+
}
|
|
11307
11350
|
break;
|
|
11308
11351
|
case "data_channel_message":
|
|
11309
11352
|
await handlers.onDataChannelMessage?.({
|
|
@@ -11330,6 +11373,8 @@ async function handleParentMessage(message, handlers) {
|
|
|
11330
11373
|
recordingAvailableBySessionId.delete(message.sessionId);
|
|
11331
11374
|
conversationHistoryAvailableBySessionId.delete(message.sessionId);
|
|
11332
11375
|
mixAvailableBySessionId.delete(message.sessionId);
|
|
11376
|
+
voiceLanguageSwitchAvailableBySessionId.delete(message.sessionId);
|
|
11377
|
+
lastVoiceLanguageBySessionId.delete(message.sessionId);
|
|
11333
11378
|
ttsPoseAvailableBySessionId.delete(message.sessionId);
|
|
11334
11379
|
await (handlers.onClientLeave ?? handlers.onSessionEnd)?.({
|
|
11335
11380
|
sessionId: message.sessionId
|
|
@@ -11378,6 +11423,10 @@ function defineAgent(handlers) {
|
|
|
11378
11423
|
handleSttControlAck(message);
|
|
11379
11424
|
return;
|
|
11380
11425
|
}
|
|
11426
|
+
if (isVoiceLanguageControlAckMessage(message)) {
|
|
11427
|
+
handleVoiceLanguageControlAck(message);
|
|
11428
|
+
return;
|
|
11429
|
+
}
|
|
11381
11430
|
if (isWebhookMessage(message)) {
|
|
11382
11431
|
void agentStartReady.then(() => handleWebhookMessage(message, handlers));
|
|
11383
11432
|
return;
|