@convai/web-sdk 1.5.0-beta.0 → 1.6.0-beta.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.
Files changed (44) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +85 -19
  3. package/dist/core/BlendshapeQueue.d.ts +75 -4
  4. package/dist/core/BlendshapeQueue.d.ts.map +1 -1
  5. package/dist/core/BlendshapeQueue.js +400 -24
  6. package/dist/core/BlendshapeQueue.js.map +1 -1
  7. package/dist/core/ConvaiClient.d.ts +10 -2
  8. package/dist/core/ConvaiClient.d.ts.map +1 -1
  9. package/dist/core/ConvaiClient.js +208 -57
  10. package/dist/core/ConvaiClient.js.map +1 -1
  11. package/dist/core/MessageHandler.d.ts +8 -0
  12. package/dist/core/MessageHandler.d.ts.map +1 -1
  13. package/dist/core/MessageHandler.js +63 -12
  14. package/dist/core/MessageHandler.js.map +1 -1
  15. package/dist/core/VideoManager.d.ts +40 -5
  16. package/dist/core/VideoManager.d.ts.map +1 -1
  17. package/dist/core/VideoManager.js +579 -30
  18. package/dist/core/VideoManager.js.map +1 -1
  19. package/dist/core/connectRequest.d.ts +23 -0
  20. package/dist/core/connectRequest.d.ts.map +1 -0
  21. package/dist/core/connectRequest.js +31 -0
  22. package/dist/core/connectRequest.js.map +1 -0
  23. package/dist/core/contextUpdateRequest.d.ts +4 -0
  24. package/dist/core/contextUpdateRequest.d.ts.map +1 -0
  25. package/dist/core/contextUpdateRequest.js +10 -0
  26. package/dist/core/contextUpdateRequest.js.map +1 -0
  27. package/dist/core/index.d.ts +1 -1
  28. package/dist/core/index.d.ts.map +1 -1
  29. package/dist/core/types.d.ts +172 -3
  30. package/dist/core/types.d.ts.map +1 -1
  31. package/dist/core/videoSourceState.d.ts +4 -0
  32. package/dist/core/videoSourceState.d.ts.map +1 -0
  33. package/dist/core/videoSourceState.js +9 -0
  34. package/dist/core/videoSourceState.js.map +1 -0
  35. package/dist/core/visionRequest.d.ts +4 -0
  36. package/dist/core/visionRequest.d.ts.map +1 -0
  37. package/dist/core/visionRequest.js +42 -0
  38. package/dist/core/visionRequest.js.map +1 -0
  39. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  40. package/dist/react/hooks/useConvaiClient.js +3 -0
  41. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  42. package/dist/vanilla/types.d.ts +6 -0
  43. package/dist/vanilla/types.d.ts.map +1 -1
  44. package/package.json +6 -3
@@ -25,8 +25,12 @@ export class BlendshapeQueue {
25
25
  * Create a new BlendshapeQueue
26
26
  * @param mapper - Optional function to map/transform blendshape data as it's added
27
27
  */
28
- constructor(mapper) {
28
+ constructor(mapper, now = () => Date.now()) {
29
29
  this.queue = [];
30
+ this.pendingTimelineFrames = new Map();
31
+ this.activeTimelineAliases = new Set();
32
+ this.retiredTimelineAliases = new Set();
33
+ this.retiredOwnerlessTimelineAliases = new Set();
30
34
  this.conversationActive = false; // Queue is accepting frames (starts when user sends message)
31
35
  this.botSpeaking = false; // Bot is actually speaking (starts when bot-started-speaking)
32
36
  this.conversationEnded = false;
@@ -36,13 +40,21 @@ export class BlendshapeQueue {
36
40
  this.interruptedAtFrame = 0; // Frame number when interrupted
37
41
  this.needsNormalization = false; // One-shot signal for lipsync player to lerp morphs back to 0
38
42
  this._awaitingBotSpeak = false; // Set by startConversation(), cleared by startBotSpeaking(); guards against stale blendshape-turn-stats
43
+ this.playbackFps = 60;
44
+ this.ownerReplacementStoppedSpeaking = false;
45
+ this.missingExpectedFramesSinceMs = null;
39
46
  this.mapper = mapper;
47
+ this.now = now;
40
48
  }
41
49
  /**
42
50
  * Add a chunk of blendshapes to the queue
43
51
  * @param blendshapes - Array of blendshape frames (each frame is an array of numbers)
52
+ * @param metadata - Optional timeline metadata for ahead-delivered chunks
44
53
  */
45
- addChunk(blendshapes) {
54
+ addChunk(blendshapes, metadata = {}) {
55
+ if (blendshapes.length === 0) {
56
+ return;
57
+ }
46
58
  // Accept frames when:
47
59
  // a) conversation is active (user sent message, server hasn't sent turn-stats yet), OR
48
60
  // b) bot is currently speaking (bot-started-speaking received), OR
@@ -50,22 +62,293 @@ export class BlendshapeQueue {
50
62
  // this covers the race where bot-stopped-speaking and blendshape-turn-stats both reach
51
63
  // the client before the last in-flight blendshape chunks do. Without this guard those
52
64
  // trailing chunks would be silently dropped because both flags above are already false.
53
- const framesReceivedSoFar = this.framesConsumed + this.queue.length;
65
+ const framesReceivedSoFar = this.framesConsumed + this.queue.length + this.pendingTimelineFrames.size;
54
66
  const stillExpectingFrames = this.conversationEnded &&
55
67
  this.turnStats !== null &&
56
68
  framesReceivedSoFar < this.turnStats.total_blendshapes;
57
69
  const shouldAcceptFrames = this.conversationActive || this.botSpeaking || stillExpectingFrames;
58
- if (!shouldAcceptFrames) {
70
+ const ownerAliases = this.timelineAliases(metadata);
71
+ if (ownerAliases.length > 0) {
72
+ if (this.isRetiredTimelineOwner(metadata)) {
73
+ return;
74
+ }
75
+ if (!this.hasActiveTimelineOwner()) {
76
+ if (!shouldAcceptFrames) {
77
+ return;
78
+ }
79
+ this.adoptTimelineOwner(ownerAliases, this.botSpeaking);
80
+ }
81
+ else if (this.matchesActiveTimelineChunkOwner(metadata)) {
82
+ this.mergeActiveTimelineAliases(ownerAliases);
83
+ }
84
+ else {
85
+ // A different response owner means the server has moved to a new bot
86
+ // turn. Ahead-delivered chunks can race ahead of the explicit cancel
87
+ // event, so adopt the newer owner instead of dropping its first frames.
88
+ const replacedSpeakingOwner = this.botSpeaking;
89
+ this.rememberRetiredTimelineAliases(this.activeTimelineAliases, ownerAliases);
90
+ this.adoptTimelineOwner(ownerAliases);
91
+ if (replacedSpeakingOwner) {
92
+ this.ownerReplacementStoppedSpeaking = true;
93
+ this.needsNormalization = true;
94
+ }
95
+ }
96
+ }
97
+ else if (!shouldAcceptFrames) {
59
98
  return;
60
99
  }
100
+ const hasIndexedTimeline = Number.isInteger(metadata.startFrameIndex);
101
+ if (hasIndexedTimeline &&
102
+ Number.isFinite(metadata.fps) &&
103
+ metadata.fps > 0) {
104
+ this.playbackFps = metadata.fps;
105
+ }
106
+ this.missingExpectedFramesSinceMs = null;
107
+ if (hasIndexedTimeline) {
108
+ this.addTimelineChunk(blendshapes, metadata.startFrameIndex);
109
+ return;
110
+ }
111
+ for (let i = 0; i < blendshapes.length; i++) {
112
+ this.queue.push(this.mapFrame(blendshapes[i]));
113
+ }
114
+ }
115
+ mapFrame(input) {
116
+ return this.mapper ? this.mapper(input) : new Float32Array(input);
117
+ }
118
+ addTimelineChunk(blendshapes, startFrameIndex) {
119
+ const queuedStart = this.framesConsumed;
120
+ const queuedEnd = this.framesConsumed + this.queue.length;
61
121
  for (let i = 0; i < blendshapes.length; i++) {
62
- const rawFrame = blendshapes[i];
63
- // Apply mapper if provided, otherwise convert to Float32Array directly
64
- const mappedFrame = this.mapper
65
- ? this.mapper(rawFrame)
66
- : new Float32Array(rawFrame);
67
- this.queue.push(mappedFrame);
122
+ const absoluteIndex = startFrameIndex + i;
123
+ if (absoluteIndex < queuedStart ||
124
+ absoluteIndex < queuedEnd ||
125
+ this.pendingTimelineFrames.has(absoluteIndex)) {
126
+ continue;
127
+ }
128
+ this.pendingTimelineFrames.set(absoluteIndex, this.mapFrame(blendshapes[i]));
129
+ }
130
+ this.flushContiguousTimelineFrames();
131
+ }
132
+ flushContiguousTimelineFrames() {
133
+ let nextFrameIndex = this.framesConsumed + this.queue.length;
134
+ while (this.pendingTimelineFrames.has(nextFrameIndex)) {
135
+ const frame = this.pendingTimelineFrames.get(nextFrameIndex);
136
+ if (!frame) {
137
+ break;
138
+ }
139
+ this.pendingTimelineFrames.delete(nextFrameIndex);
140
+ this.queue.push(frame);
141
+ nextFrameIndex += 1;
142
+ }
143
+ }
144
+ timelineAliases(metadata = {}) {
145
+ const aliases = [];
146
+ if (metadata.responseId) {
147
+ aliases.push(`r:${metadata.responseId}`);
148
+ }
149
+ if (Number.isInteger(metadata.neurosyncTurnId)) {
150
+ aliases.push(`t:${metadata.neurosyncTurnId}`);
151
+ if (Number.isInteger(metadata.epoch)) {
152
+ aliases.push(`t:${metadata.neurosyncTurnId}|e:${metadata.epoch}`);
153
+ }
154
+ }
155
+ return Array.from(new Set(aliases));
156
+ }
157
+ hasActiveTimelineOwner() {
158
+ return this.activeTimelineAliases.size > 0;
159
+ }
160
+ responseAlias(metadata = {}) {
161
+ return metadata.responseId ? `r:${metadata.responseId}` : undefined;
162
+ }
163
+ turnEpochAlias(metadata = {}) {
164
+ return Number.isInteger(metadata.neurosyncTurnId) &&
165
+ Number.isInteger(metadata.epoch)
166
+ ? `t:${metadata.neurosyncTurnId}|e:${metadata.epoch}`
167
+ : undefined;
168
+ }
169
+ turnAlias(metadata = {}) {
170
+ return Number.isInteger(metadata.neurosyncTurnId)
171
+ ? `t:${metadata.neurosyncTurnId}`
172
+ : undefined;
173
+ }
174
+ activeHasResponseAlias() {
175
+ return Array.from(this.activeTimelineAliases).some((alias) => alias.startsWith("r:"));
176
+ }
177
+ activeHasTurnEpochAlias() {
178
+ return Array.from(this.activeTimelineAliases).some((alias) => alias.includes("|e:"));
179
+ }
180
+ matchesActiveTimelineOwner(metadata = {}) {
181
+ const aliases = this.timelineAliases(metadata);
182
+ if (aliases.length === 0 || !this.hasActiveTimelineOwner()) {
183
+ return false;
184
+ }
185
+ const responseAlias = this.responseAlias(metadata);
186
+ if (responseAlias && this.activeHasResponseAlias()) {
187
+ return this.activeTimelineAliases.has(responseAlias);
188
+ }
189
+ const turnEpochAlias = this.turnEpochAlias(metadata);
190
+ if (turnEpochAlias && this.activeHasTurnEpochAlias()) {
191
+ return this.activeTimelineAliases.has(turnEpochAlias);
192
+ }
193
+ return aliases.some((alias) => this.activeTimelineAliases.has(alias));
194
+ }
195
+ matchesActiveTimelineChunkOwner(metadata = {}) {
196
+ if (!this.hasActiveTimelineOwner()) {
197
+ return false;
198
+ }
199
+ const responseAlias = this.responseAlias(metadata);
200
+ const activeHasResponseAlias = this.activeHasResponseAlias();
201
+ if (activeHasResponseAlias && responseAlias) {
202
+ return this.activeTimelineAliases.has(responseAlias);
203
+ }
204
+ const turnEpochAlias = this.turnEpochAlias(metadata);
205
+ const activeHasTurnEpochAlias = this.activeHasTurnEpochAlias();
206
+ if (turnEpochAlias || activeHasTurnEpochAlias) {
207
+ return (turnEpochAlias !== undefined &&
208
+ this.activeTimelineAliases.has(turnEpochAlias));
209
+ }
210
+ const turnAlias = this.turnAlias(metadata);
211
+ return turnAlias !== undefined && this.activeTimelineAliases.has(turnAlias);
212
+ }
213
+ mergeActiveTimelineAliases(aliases) {
214
+ aliases.forEach((alias) => this.activeTimelineAliases.add(alias));
215
+ }
216
+ isRetiredTimelineOwner(metadata = {}) {
217
+ const aliases = this.timelineAliases(metadata);
218
+ if (aliases.length === 0) {
219
+ return false;
220
+ }
221
+ const responseAlias = this.responseAlias(metadata);
222
+ if (responseAlias) {
223
+ if (this.retiredTimelineAliases.has(responseAlias)) {
224
+ return true;
225
+ }
226
+ if (this.activeTimelineAliases.has(responseAlias)) {
227
+ return false;
228
+ }
229
+ }
230
+ const turnEpochAlias = this.turnEpochAlias(metadata);
231
+ if (turnEpochAlias !== undefined &&
232
+ this.retiredTimelineAliases.has(turnEpochAlias)) {
233
+ return true;
234
+ }
235
+ if (responseAlias === undefined &&
236
+ turnEpochAlias !== undefined &&
237
+ this.retiredOwnerlessTimelineAliases.has(turnEpochAlias)) {
238
+ return true;
239
+ }
240
+ const turnAlias = this.turnAlias(metadata);
241
+ return (turnAlias !== undefined &&
242
+ (this.retiredTimelineAliases.has(turnAlias) ||
243
+ (responseAlias === undefined &&
244
+ this.retiredOwnerlessTimelineAliases.has(turnAlias))));
245
+ }
246
+ rememberRetiredTimelineAliases(aliases, keepAliases = []) {
247
+ this.rememberBoundedAliases(this.retiredTimelineAliases, aliases, keepAliases);
248
+ }
249
+ rememberRetiredOwnerlessTimelineAliases(aliases, keepAliases = []) {
250
+ this.rememberBoundedAliases(this.retiredOwnerlessTimelineAliases, aliases, keepAliases);
251
+ }
252
+ rememberBoundedAliases(target, aliases, keepAliases = []) {
253
+ const aliasesToKeep = new Set(keepAliases);
254
+ const aliasesToRetire = Array.from(aliases).filter((alias) => !aliasesToKeep.has(alias));
255
+ if (aliasesToRetire.length === 0) {
256
+ return;
257
+ }
258
+ aliasesToRetire.forEach((alias) => target.add(alias));
259
+ while (target.size >
260
+ BlendshapeQueue.MAX_RETIRED_TIMELINE_ALIASES) {
261
+ const oldestKey = target.values().next().value;
262
+ if (!oldestKey) {
263
+ break;
264
+ }
265
+ target.delete(oldestKey);
266
+ }
267
+ }
268
+ adoptTimelineOwner(ownerAliases, preserveBotSpeaking = false) {
269
+ const botSpeaking = preserveBotSpeaking && this.botSpeaking;
270
+ this.activeTimelineAliases = new Set(ownerAliases);
271
+ this.queue = [];
272
+ this.pendingTimelineFrames.clear();
273
+ this.framesConsumed = 0;
274
+ this.turnStats = null;
275
+ this.missingExpectedFramesSinceMs = null;
276
+ this.conversationActive = true;
277
+ this.conversationEnded = false;
278
+ this.interrupted = false;
279
+ this.botSpeaking = botSpeaking;
280
+ this._awaitingBotSpeak = !botSpeaking;
281
+ this.playbackFps = BlendshapeQueue.TARGET_FPS;
282
+ if (!botSpeaking) {
283
+ this.ownerReplacementStoppedSpeaking = false;
284
+ }
285
+ }
286
+ clearTimelineOwner() {
287
+ this.activeTimelineAliases.clear();
288
+ }
289
+ /**
290
+ * True when a lifecycle event belongs to an owner that has already been
291
+ * interrupted/cancelled or does not match the active indexed timeline.
292
+ * Ownerless events are treated as current for backward compatibility.
293
+ */
294
+ isStaleOwner(metadata = {}) {
295
+ const ownerAliases = this.timelineAliases(metadata);
296
+ if (ownerAliases.length === 0) {
297
+ return false;
298
+ }
299
+ if (this.isRetiredOwner(metadata)) {
300
+ return true;
68
301
  }
302
+ return (this.hasActiveTimelineOwner() &&
303
+ !this.matchesActiveTimelineOwner(metadata));
304
+ }
305
+ /**
306
+ * True when an owner was explicitly interrupted/cancelled/completed.
307
+ * Chunk messages use this narrower predicate so a newer owner can still
308
+ * reach addChunk() and atomically replace the active owner there.
309
+ */
310
+ isRetiredOwner(metadata = {}) {
311
+ return this.isRetiredTimelineOwner(metadata);
312
+ }
313
+ /**
314
+ * Drop buffered ahead-delivered frames for a server-cancelled owner.
315
+ * Returns true when the active owner was flushed.
316
+ */
317
+ cancelOwner(metadata = {}) {
318
+ const ownerAliases = this.timelineAliases(metadata);
319
+ if (ownerAliases.length === 0) {
320
+ return false;
321
+ }
322
+ const matchesActiveOwner = this.matchesActiveTimelineOwner(metadata);
323
+ const activeOwnerAliases = Array.from(this.activeTimelineAliases);
324
+ const isResponseScopedActiveCancel = matchesActiveOwner &&
325
+ this.responseAlias(metadata) !== undefined &&
326
+ this.turnAlias(metadata) === undefined;
327
+ if (isResponseScopedActiveCancel) {
328
+ this.rememberRetiredTimelineAliases(ownerAliases);
329
+ this.rememberRetiredOwnerlessTimelineAliases(activeOwnerAliases, ownerAliases);
330
+ }
331
+ else {
332
+ this.rememberRetiredTimelineAliases(matchesActiveOwner
333
+ ? [...ownerAliases, ...activeOwnerAliases]
334
+ : ownerAliases, matchesActiveOwner ? [] : activeOwnerAliases);
335
+ }
336
+ if (!matchesActiveOwner) {
337
+ return false;
338
+ }
339
+ this.queue = [];
340
+ this.pendingTimelineFrames.clear();
341
+ this.framesConsumed = 0;
342
+ this.missingExpectedFramesSinceMs = null;
343
+ this.botSpeaking = false;
344
+ this.conversationActive = false;
345
+ this.conversationEnded = true;
346
+ this.needsNormalization = true;
347
+ this.clearTimelineOwner();
348
+ return true;
349
+ }
350
+ hasBufferedFrames() {
351
+ return this.queue.length > 0 || this.pendingTimelineFrames.size > 0;
69
352
  }
70
353
  /**
71
354
  * Set or update the mapper function
@@ -160,6 +443,7 @@ export class BlendshapeQueue {
160
443
  const actualConsumed = Math.min(count, this.queue.length);
161
444
  this.queue.splice(0, actualConsumed);
162
445
  this.framesConsumed += actualConsumed;
446
+ this.flushContiguousTimelineFrames();
163
447
  }
164
448
  /**
165
449
  * Get the number of frames currently in the queue
@@ -206,24 +490,57 @@ export class BlendshapeQueue {
206
490
  // Check completion - EITHER:
207
491
  // A) All expected frames consumed based on server stats
208
492
  const allFramesConsumed = this.isAllFramesConsumed();
209
- // B) OR stats received AND queue is now empty (handles dropped frames)
210
- const queueEmptyAfterStats = !this.hasFrames();
211
- return allFramesConsumed || queueEmptyAfterStats;
493
+ // B) OR stats received and there are no playable frames. For indexed owners,
494
+ // defer the first empty check while expected frames are missing so late
495
+ // chunks can arrive; allow a later empty check to complete so dropped chunks
496
+ // or unfillable pending gaps do not hang the player forever.
497
+ const waitingForExpectedFrames = this.hasUnconsumedExpectedFrames();
498
+ const noPlayableFramesAfterStats = !this.hasFrames();
499
+ if (!noPlayableFramesAfterStats || !waitingForExpectedFrames) {
500
+ this.missingExpectedFramesSinceMs = null;
501
+ }
502
+ else if (this.hasActiveTimelineOwner()) {
503
+ if (this.missingExpectedFramesSinceMs === null) {
504
+ this.missingExpectedFramesSinceMs = this.now();
505
+ return false;
506
+ }
507
+ if (this.now() - this.missingExpectedFramesSinceMs <
508
+ BlendshapeQueue.MISSING_INDEXED_FRAME_GRACE_MS) {
509
+ return false;
510
+ }
511
+ }
512
+ return allFramesConsumed || noPlayableFramesAfterStats;
212
513
  }
213
514
  /**
214
- * Check if server has signaled conversation end (blendshape-turn-stats received)
515
+ * Check if the server end signal is safe to expose to playback consumers.
516
+ *
517
+ * Ahead-delivery can deliver blendshape-turn-stats before bot-started-speaking.
518
+ * Keep those early stats internally for expected-frame accounting, but do not
519
+ * expose a public drain signal until audio playback has actually started.
215
520
  * This does NOT check if all frames have been consumed - use isConversationEnded() for that.
216
521
  */
217
522
  hasReceivedEndSignal() {
218
- return this.conversationEnded;
523
+ return this.conversationEnded && !this._awaitingBotSpeak;
219
524
  }
220
525
  /**
221
526
  * Mark conversation start (called when user sends a message)
222
527
  * Clears any remaining frames from previous conversation and activates the queue
223
528
  */
224
529
  startConversation() {
530
+ if (this.hasActiveTimelineOwner() &&
531
+ (this.hasBufferedFrames() || this.hasUnconsumedExpectedFrames())) {
532
+ this.conversationActive = !this.conversationEnded;
533
+ this.botSpeaking = false;
534
+ this.interrupted = false;
535
+ this._awaitingBotSpeak = true;
536
+ this.ownerReplacementStoppedSpeaking = false;
537
+ return;
538
+ }
225
539
  // Clear any leftover frames from previous conversation
226
540
  this.queue = [];
541
+ this.pendingTimelineFrames.clear();
542
+ this.rememberRetiredTimelineAliases(this.activeTimelineAliases);
543
+ this.clearTimelineOwner();
227
544
  this.conversationActive = true;
228
545
  this.botSpeaking = false; // Bot hasn't started speaking yet
229
546
  this.conversationEnded = false;
@@ -232,6 +549,9 @@ export class BlendshapeQueue {
232
549
  this.interrupted = false; // Reset interruption flag
233
550
  this.interruptedAtFrame = 0;
234
551
  this._awaitingBotSpeak = true; // Guard: ignore stale blendshape-turn-stats until new bot-started-speaking
552
+ this.playbackFps = BlendshapeQueue.TARGET_FPS;
553
+ this.ownerReplacementStoppedSpeaking = false;
554
+ this.missingExpectedFramesSinceMs = null;
235
555
  }
236
556
  /**
237
557
  * Mark bot as started speaking (called when bot-started-speaking event received)
@@ -241,7 +561,11 @@ export class BlendshapeQueue {
241
561
  // Reject stale bot-started-speaking that arrives after the current turn has already
242
562
  // ended (conversationEnded=true). This happens when an interrupted conversation's
243
563
  // delayed bot-started-speaking arrives after a later conversation has fully completed.
244
- if (this.conversationEnded) {
564
+ const hasEarlyAheadStats = this.conversationEnded &&
565
+ this._awaitingBotSpeak &&
566
+ this.hasActiveTimelineOwner() &&
567
+ this.hasBufferedFrames();
568
+ if (this.conversationEnded && !hasEarlyAheadStats) {
245
569
  return false;
246
570
  }
247
571
  this.botSpeaking = true;
@@ -261,21 +585,47 @@ export class BlendshapeQueue {
261
585
  isBotSpeaking() {
262
586
  return this.botSpeaking;
263
587
  }
588
+ /**
589
+ * Consume the signal that a newer ahead-delivered owner replaced an active
590
+ * speaking owner before the old bot-stopped-speaking event arrived.
591
+ */
592
+ consumeOwnerReplacementStoppedSpeaking() {
593
+ const val = this.ownerReplacementStoppedSpeaking;
594
+ this.ownerReplacementStoppedSpeaking = false;
595
+ return val;
596
+ }
264
597
  /**
265
598
  * Mark conversation end with turn stats
266
599
  * Called when blendshape-turn-stats received
267
600
  * Stops accepting new frames and marks conversation as ended
268
601
  */
269
- endConversation(stats) {
602
+ endConversation(stats, metadata = {}) {
603
+ const ownerAliases = this.timelineAliases(metadata);
604
+ if (ownerAliases.length > 0) {
605
+ if (this.isRetiredTimelineOwner(metadata)) {
606
+ return;
607
+ }
608
+ if (this.hasActiveTimelineOwner() &&
609
+ !this.matchesActiveTimelineOwner(metadata)) {
610
+ return;
611
+ }
612
+ if (this.hasActiveTimelineOwner() || !this._awaitingBotSpeak) {
613
+ this.mergeActiveTimelineAliases(ownerAliases);
614
+ }
615
+ }
270
616
  // Ignore stale blendshape-turn-stats that arrive after startConversation()
271
617
  // but before the new turn's bot-started-speaking. These are in-flight leftovers
272
618
  // from the interrupted turn and would corrupt conversationEnded/botSpeaking state.
273
- if (this._awaitingBotSpeak) {
619
+ const belongsToActiveAheadOwner = ownerAliases.length > 0 &&
620
+ this.hasActiveTimelineOwner() &&
621
+ this.matchesActiveTimelineOwner(metadata);
622
+ if (this._awaitingBotSpeak && !belongsToActiveAheadOwner) {
274
623
  return;
275
624
  }
276
625
  // Stop accepting new frames when conversation ends
277
626
  this.conversationActive = false;
278
627
  this.conversationEnded = true;
628
+ this.missingExpectedFramesSinceMs = null;
279
629
  if (stats) {
280
630
  this.turnStats = stats;
281
631
  }
@@ -285,16 +635,20 @@ export class BlendshapeQueue {
285
635
  * Keeps last 10 frames in queue and fades them out
286
636
  */
287
637
  interrupt() {
638
+ this.rememberRetiredTimelineAliases(this.activeTimelineAliases);
639
+ this.clearTimelineOwner();
288
640
  this.interrupted = true;
289
641
  this.interruptedAtFrame = this.framesConsumed + this.queue.length;
290
642
  this.conversationActive = false; // Stop accepting new frames
291
643
  this.botSpeaking = false; // Bot is no longer speaking due to interruption
292
644
  this.conversationEnded = true; // Mark conversation as ended so the player can drain fade-out frames and fire onConversationEnded
293
645
  this.needsNormalization = true; // Signal lipsync player to lerp morphs back to 0
294
- // Keep only last 10 frames for fade out
295
- if (this.queue.length > 10) {
296
- this.queue = this.queue.slice(-10);
297
- }
646
+ this.ownerReplacementStoppedSpeaking = false;
647
+ this.pendingTimelineFrames.clear();
648
+ this.missingExpectedFramesSinceMs = null;
649
+ // Ahead-delivered turns may have many seconds of future frames buffered.
650
+ // On interrupt, audio stops immediately, so visuals must hard-stop too.
651
+ this.queue = [];
298
652
  }
299
653
  /**
300
654
  * Consume the normalization signal (one-shot).
@@ -319,6 +673,12 @@ export class BlendshapeQueue {
319
673
  getFramesConsumed() {
320
674
  return this.framesConsumed;
321
675
  }
676
+ /**
677
+ * Get playback FPS from chunk metadata, falling back to 60fps.
678
+ */
679
+ getPlaybackFps() {
680
+ return this.playbackFps || BlendshapeQueue.TARGET_FPS;
681
+ }
322
682
  /**
323
683
  * Calculate time left in milliseconds based on turn stats
324
684
  * Returns null if stats not available
@@ -343,12 +703,21 @@ export class BlendshapeQueue {
343
703
  return false;
344
704
  return this.framesConsumed >= this.turnStats.total_blendshapes;
345
705
  }
706
+ hasUnconsumedExpectedFrames() {
707
+ if (!this.turnStats)
708
+ return false;
709
+ const receivedOrConsumedFrames = this.framesConsumed + this.queue.length + this.pendingTimelineFrames.size;
710
+ return receivedOrConsumedFrames < this.turnStats.total_blendshapes;
711
+ }
346
712
  /**
347
713
  * Reset queue for new conversation
348
714
  * Should be called after all frames have been consumed
349
715
  */
350
716
  reset() {
351
717
  this.queue = [];
718
+ this.pendingTimelineFrames.clear();
719
+ this.rememberRetiredTimelineAliases(this.activeTimelineAliases);
720
+ this.clearTimelineOwner();
352
721
  this.conversationActive = false;
353
722
  this.botSpeaking = false;
354
723
  this.conversationEnded = false;
@@ -356,6 +725,9 @@ export class BlendshapeQueue {
356
725
  this.framesConsumed = 0;
357
726
  this.needsNormalization = false;
358
727
  this._awaitingBotSpeak = false;
728
+ this.playbackFps = BlendshapeQueue.TARGET_FPS;
729
+ this.ownerReplacementStoppedSpeaking = false;
730
+ this.missingExpectedFramesSinceMs = null;
359
731
  }
360
732
  /**
361
733
  * Get frame at specified time
@@ -366,8 +738,8 @@ export class BlendshapeQueue {
366
738
  if (this.queue.length === 0) {
367
739
  return null;
368
740
  }
369
- // Calculate frame index based on elapsed time and target FPS
370
- const frameIndex = Math.floor(elapsedTime * BlendshapeQueue.TARGET_FPS);
741
+ // Calculate frame index based on elapsed time and current playback FPS
742
+ const frameIndex = Math.floor(elapsedTime * this.getPlaybackFps());
371
743
  // Clamp to valid range
372
744
  const clampedIndex = Math.min(frameIndex, this.queue.length - 1);
373
745
  return {
@@ -389,9 +761,13 @@ export class BlendshapeQueue {
389
761
  framesConsumed: this.framesConsumed,
390
762
  turnStats: this.turnStats,
391
763
  timeLeftMs: this.getTimeLeftMs(),
764
+ pendingTimelineFrames: this.pendingTimelineFrames.size,
765
+ playbackFps: this.getPlaybackFps(),
392
766
  };
393
767
  }
394
768
  }
395
769
  // Constants
396
770
  BlendshapeQueue.TARGET_FPS = 60;
771
+ BlendshapeQueue.MAX_RETIRED_TIMELINE_ALIASES = 48;
772
+ BlendshapeQueue.MISSING_INDEXED_FRAME_GRACE_MS = (24 / BlendshapeQueue.TARGET_FPS) * 1000;
397
773
  //# sourceMappingURL=BlendshapeQueue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlendshapeQueue.js","sourceRoot":"","sources":["../../src/core/BlendshapeQueue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BlendshapeQueue.js","sourceRoot":"","sources":["../../src/core/BlendshapeQueue.ts"],"names":[],"mappings":"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"}