@voqalize/avatar 0.3.0 → 0.4.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.
Files changed (147) hide show
  1. package/LICENSE-CC-BY-4.0 +396 -0
  2. package/README.md +65 -17
  3. package/assets/README.md +48 -0
  4. package/assets/tanya.glb +0 -0
  5. package/assets/tara.glb +0 -0
  6. package/assets/tushar.glb +0 -0
  7. package/client/AvatarClient.ts +337 -42
  8. package/client/arjun.ts +2 -0
  9. package/client/createAvatar.ts +38 -0
  10. package/client/index.ts +6 -1
  11. package/client/internal.ts +31 -3
  12. package/client/ishita.ts +2 -0
  13. package/client/kabir.ts +2 -0
  14. package/client/meera.ts +2 -0
  15. package/client/naina.ts +2 -0
  16. package/client/playout.ts +95 -0
  17. package/client/supports.ts +28 -0
  18. package/client/three/assets.ts +22 -0
  19. package/client/three/budgets.ts +27 -0
  20. package/client/three/holds.ts +64 -0
  21. package/client/three/internal.ts +54 -0
  22. package/client/three/motion-limits.json +116 -0
  23. package/client/three/sequences.ts +281 -0
  24. package/client/three/tanya-asset.ts +6 -0
  25. package/client/three/tanya.ts +69 -0
  26. package/client/three/tara-asset.ts +25 -0
  27. package/client/three/tara-rig.ts +1571 -0
  28. package/client/three/tara.ts +77 -0
  29. package/client/three/tushar-asset.ts +6 -0
  30. package/client/three/tushar.ts +65 -0
  31. package/client/types.ts +109 -20
  32. package/client/vikram.ts +2 -0
  33. package/dist/AvatarClient.d.ts +89 -11
  34. package/dist/AvatarClient.d.ts.map +1 -1
  35. package/dist/AvatarClient.js +297 -35
  36. package/dist/AvatarClient.js.map +1 -1
  37. package/dist/arjun.d.ts +1 -0
  38. package/dist/arjun.d.ts.map +1 -1
  39. package/dist/arjun.js +2 -0
  40. package/dist/arjun.js.map +1 -1
  41. package/dist/createAvatar.d.ts +36 -0
  42. package/dist/createAvatar.d.ts.map +1 -1
  43. package/dist/createAvatar.js.map +1 -1
  44. package/dist/index.d.ts +6 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +5 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/internal.d.ts +9 -5
  49. package/dist/internal.d.ts.map +1 -1
  50. package/dist/internal.js +13 -5
  51. package/dist/internal.js.map +1 -1
  52. package/dist/ishita.d.ts +1 -0
  53. package/dist/ishita.d.ts.map +1 -1
  54. package/dist/ishita.js +2 -0
  55. package/dist/ishita.js.map +1 -1
  56. package/dist/kabir.d.ts +1 -0
  57. package/dist/kabir.d.ts.map +1 -1
  58. package/dist/kabir.js +2 -0
  59. package/dist/kabir.js.map +1 -1
  60. package/dist/meera.d.ts +1 -0
  61. package/dist/meera.d.ts.map +1 -1
  62. package/dist/meera.js +2 -0
  63. package/dist/meera.js.map +1 -1
  64. package/dist/naina.d.ts +1 -0
  65. package/dist/naina.d.ts.map +1 -1
  66. package/dist/naina.js +2 -0
  67. package/dist/naina.js.map +1 -1
  68. package/dist/playout.d.ts +42 -0
  69. package/dist/playout.d.ts.map +1 -0
  70. package/dist/playout.js +85 -0
  71. package/dist/playout.js.map +1 -0
  72. package/dist/supports.d.ts +20 -0
  73. package/dist/supports.d.ts.map +1 -0
  74. package/dist/supports.js +26 -0
  75. package/dist/supports.js.map +1 -0
  76. package/dist/three/assets.d.ts +8 -0
  77. package/dist/three/assets.d.ts.map +1 -0
  78. package/dist/three/assets.js +19 -0
  79. package/dist/three/assets.js.map +1 -0
  80. package/dist/three/budgets.d.ts +17 -0
  81. package/dist/three/budgets.d.ts.map +1 -0
  82. package/dist/three/budgets.js +21 -0
  83. package/dist/three/budgets.js.map +1 -0
  84. package/dist/three/holds.d.ts +33 -0
  85. package/dist/three/holds.d.ts.map +1 -0
  86. package/dist/three/holds.js +56 -0
  87. package/dist/three/holds.js.map +1 -0
  88. package/dist/three/internal.d.ts +52 -0
  89. package/dist/three/internal.d.ts.map +1 -0
  90. package/dist/three/internal.js +49 -0
  91. package/dist/three/internal.js.map +1 -0
  92. package/dist/three/motion-limits.json +116 -0
  93. package/dist/three/sequences.d.ts +71 -0
  94. package/dist/three/sequences.d.ts.map +1 -0
  95. package/dist/three/sequences.js +262 -0
  96. package/dist/three/sequences.js.map +1 -0
  97. package/dist/three/tanya-asset.d.ts +7 -0
  98. package/dist/three/tanya-asset.d.ts.map +1 -0
  99. package/dist/three/tanya-asset.js +7 -0
  100. package/dist/three/tanya-asset.js.map +1 -0
  101. package/dist/three/tanya.d.ts +35 -0
  102. package/dist/three/tanya.d.ts.map +1 -0
  103. package/dist/three/tanya.js +51 -0
  104. package/dist/three/tanya.js.map +1 -0
  105. package/dist/three/tara-asset.d.ts +26 -0
  106. package/dist/three/tara-asset.d.ts.map +1 -0
  107. package/dist/three/tara-asset.js +26 -0
  108. package/dist/three/tara-asset.js.map +1 -0
  109. package/dist/three/tara-rig.d.ts +409 -0
  110. package/dist/three/tara-rig.d.ts.map +1 -0
  111. package/dist/three/tara-rig.js +1504 -0
  112. package/dist/three/tara-rig.js.map +1 -0
  113. package/dist/three/tara.d.ts +35 -0
  114. package/dist/three/tara.d.ts.map +1 -0
  115. package/dist/three/tara.js +59 -0
  116. package/dist/three/tara.js.map +1 -0
  117. package/dist/three/tushar-asset.d.ts +7 -0
  118. package/dist/three/tushar-asset.d.ts.map +1 -0
  119. package/dist/three/tushar-asset.js +7 -0
  120. package/dist/three/tushar-asset.js.map +1 -0
  121. package/dist/three/tushar.d.ts +31 -0
  122. package/dist/three/tushar.d.ts.map +1 -0
  123. package/dist/three/tushar.js +47 -0
  124. package/dist/three/tushar.js.map +1 -0
  125. package/dist/types.d.ts +65 -10
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/types.js +58 -11
  128. package/dist/types.js.map +1 -1
  129. package/dist/vikram.d.ts +1 -0
  130. package/dist/vikram.d.ts.map +1 -1
  131. package/dist/vikram.js +2 -0
  132. package/dist/vikram.js.map +1 -1
  133. package/package.json +34 -6
  134. package/src/avatar.d.ts +59 -2
  135. package/src/avatar.js +743 -94
  136. package/src/behavior.d.ts +28 -12
  137. package/src/behavior.js +54 -42
  138. package/src/canvas/create-rig.js +1 -1
  139. package/src/canvas/src/live.js +2 -2
  140. package/src/conformance.js +1 -1
  141. package/src/emotions.js +4 -2
  142. package/src/gaze.js +334 -73
  143. package/src/head.js +134 -0
  144. package/src/idle.js +210 -19
  145. package/src/interjections.js +70 -26
  146. package/src/prosody.js +647 -0
  147. package/src/visemes.js +85 -15
@@ -7,17 +7,36 @@
7
7
  * Base Pipecat TTS gives each serialized TTS context an opaque `context_id`.
8
8
  * The server uses it only to group and splice cue chunks. `botStartedSpeaking`
9
9
  * has no context payload, so the browser FIFO-claims the next buffered context
10
- * at that Pipecat output-lifecycle event and anchors its clock there.
11
- * `botStoppedSpeaking` closes the active context. Neither event observes the
12
- * browser's audio device, and no avatar-specific speech marker exists.
10
+ * at that Pipecat output-lifecycle event. `botStoppedSpeaking` closes it. No
11
+ * avatar-specific speech marker exists.
12
+ *
13
+ * The event says *which* audio is starting, not *when* it is heard, and the
14
+ * turn clock is anchored to the sound itself (`playout.ts` has the
15
+ * measurements that forced it). `attach()` listens to the bot's audio track;
16
+ * at the event, the turn's zero is backdated to a sound that has already begun,
17
+ * or the mouth is held shut until one does. When the track cannot be heard —
18
+ * no `attach()`, no track, a suspended audio graph, or a sound that never
19
+ * arrives within `ONSET_WAIT_MS` — the event is the anchor, as it always was.
20
+ * Which one won is logged once per turn, at `info`, because a desync report is
21
+ * unanswerable without it.
22
+ *
23
+ * The clock then runs `VISUAL_LEAD_MS` ahead of the sound, since the mixer's
24
+ * smoothing makes every mouth shape late by about that much. It is pulled back
25
+ * by any output-device latency beyond what the display already matches (a
26
+ * Bluetooth headset). Within a turn, each resumption after a pause in the
27
+ * track is a second chance to hear where the sound really is — but a mouth
28
+ * opens before its sound, so a resumption heard within the track's usual
29
+ * anticipation of it agrees with the clock. Only a disagreement beyond that is
30
+ * slewed out, at no more than 10 % of clock rate, never jumped, because a
31
+ * mouth that skips is seen and one that runs briefly fast is not.
13
32
  *
14
33
  * `attach()` subscribes to the avatar server-message channel *and* Pipecat's
15
34
  * standard lifecycle events. Server messages carry only what Pipecat cannot:
16
35
  * correlated speech/cue timing and deliberate application instructions. The
17
36
  * lifecycle events project the factual presence states locally. The server
18
- * supplies only lower-priority `THINKING` / `WORKING` claims and deliberate,
37
+ * supplies only the three lower-priority states and deliberate,
19
38
  * self-completing actions. This keeps the face tied to Pipecat's output truth
20
- * even if a server claim is delayed or stale.
39
+ * even if a server state is delayed or stale.
21
40
  *
22
41
  * ## Cue splice
23
42
  *
@@ -51,7 +70,51 @@
51
70
  * necessarily the first *message*.
52
71
  */
53
72
  import { BehaviorController } from "../src/behavior.js";
73
+ import { createPlayoutProbe } from "./playout.js";
54
74
  import { isAvatarMessage, parseAvatarCommand, } from "./types.js";
75
+ /**
76
+ * Longest the mouth is held for audio `botStartedSpeaking` has announced but
77
+ * the track has not yet carried. The event has been measured leading the first
78
+ * sample by ~160 ms on a local stack; twice that is a stall, and a mouth that
79
+ * starts without its sound is better than one that waits indefinitely.
80
+ */
81
+ const ONSET_WAIT_MS = 350;
82
+ const ONSET_POLL_MS = 10;
83
+ /**
84
+ * How far the cue clock runs ahead of the sound. The mixer eases every mouth
85
+ * channel toward its target with a 42 ms time constant
86
+ * (`MOUTH_RESPONSE_TAU_S`), which delays a shape by about that much, and a
87
+ * frame is drawn on average half a frame after its time. Picture ahead of sound
88
+ * is the side people forgive (ITU-R BT.1359: sound leading is noticed at about
89
+ * 45 ms, picture leading at about 125 ms), so a small surplus is the safe error.
90
+ */
91
+ export const VISUAL_LEAD_MS = 50;
92
+ /** Output latency the display already matches: a compositor and a screen are
93
+ * late by about as much as a wired speaker, so only the excess counts. */
94
+ const DISPLAY_LATENCY_MS = 40;
95
+ /** A reported latency beyond this is a broken report, not a device. */
96
+ const MAX_OUTPUT_LATENCY_MS = 250;
97
+ /** A pause in the track at least this long is one the audio can be heard to
98
+ * resume after — shorter ones are usually not digital silence on the wire. */
99
+ const REANCHOR_GAP_MS = 250;
100
+ /** When to look, after the resumption is due, and for how long. The probe
101
+ * sees 170 ms back, so one look catches an early sound as well as a late one. */
102
+ const REANCHOR_LOOK_MS = 100;
103
+ const REANCHOR_WINDOW_MS = 150;
104
+ /**
105
+ * Where a resumption is heard, after the cue that marks it. The track opens
106
+ * the mouth before the sound leaves digital silence: by 30–41 ms at most of the
107
+ * demo corpus's silent resumptions (median 32, both voices) and by up to 105 at
108
+ * a few, and the browser hears the sound a few ms after it leaves the wire. A
109
+ * sound heard anywhere in that band is the clock being right. Taking
110
+ * it as the resumption itself set every later phrase of a turn that much late —
111
+ * the direction people notice — and a mouth left early by an underrun smaller
112
+ * than the band is the direction they forgive (see `VISUAL_LEAD_MS`).
113
+ */
114
+ const RESUME_HEARD_MS = 30;
115
+ const RESUME_HEARD_RANGE_MS = [0, 130];
116
+ /** The most a re-anchor may speed or slow the clock, as a fraction of real time. */
117
+ const MAX_SLEW = 0.1;
55
118
  /**
56
119
  * The one `RTVIEvent` member `attach()` subscribes to, spelled as its value.
57
120
  *
@@ -77,9 +140,12 @@ export const RTVI_EVENTS = {
77
140
  userStoppedSpeaking: "userStoppedSpeaking",
78
141
  botStartedSpeaking: "botStartedSpeaking",
79
142
  botStoppedSpeaking: "botStoppedSpeaking",
80
- // Mute is a Pipecat fact, not a claim: the server's mute strategy emits
81
- // `UserMuteStarted/StoppedFrame`, the RTVI observer forwards them, and the
82
- // browser client raises these. So "has muted you" costs no wire verb —
143
+ // Only to find the bot's audio track once the transport has it; which track
144
+ // is re-read from `tracks()`, the one authority for whose it is.
145
+ trackStarted: "trackStarted",
146
+ // Mute is a Pipecat fact, and there is no server state for it: the server's
147
+ // mute strategy emits `UserMuteStarted/StoppedFrame`, the RTVI observer
148
+ // forwards them, and the browser client raises these. So "has muted you" costs no wire verb —
83
149
  // reading the events the peer already sends is exactly the authority model.
84
150
  userMuteStarted: "userMuteStarted",
85
151
  userMuteStopped: "userMuteStopped",
@@ -102,7 +168,7 @@ export class AvatarClient {
102
168
  pendingCtxs = [];
103
169
  closedCtxs = new Set();
104
170
  projected = null;
105
- serverClaim = null;
171
+ serverState = null;
106
172
  userSpeaking = false;
107
173
  botSpeaking = false;
108
174
  muted = false;
@@ -117,6 +183,13 @@ export class AvatarClient {
117
183
  idleDelayMs;
118
184
  setTimer;
119
185
  clearTimer;
186
+ probe;
187
+ probeTrack = null;
188
+ /** Whether the probe has ever heard an onset. One that has not, and times
189
+ * out, is deaf to this track rather than early to it. */
190
+ probeHeard = false;
191
+ onsetTimer = null;
192
+ reanchorTimer = null;
120
193
  constructor(avatar, opts = {}) {
121
194
  this.avatar = avatar;
122
195
  this.behavior = new BehaviorController(avatar);
@@ -125,6 +198,7 @@ export class AvatarClient {
125
198
  this.idleDelayMs = opts.idleDelayMs ?? 12_000;
126
199
  this.setTimer = opts.setTimeout ?? globalThis.setTimeout.bind(globalThis);
127
200
  this.clearTimer = opts.clearTimeout ?? globalThis.clearTimeout.bind(globalThis);
201
+ this.probe = opts.playoutProbe ?? null;
128
202
  }
129
203
  /** The active turn's ctx, or `null` between turns. For tests and telemetry. */
130
204
  get turnCtx() {
@@ -157,8 +231,8 @@ export class AvatarClient {
157
231
  return;
158
232
  try {
159
233
  switch (msg.cmd) {
160
- case "claim":
161
- this.handleClaim(msg.state);
234
+ case "state":
235
+ this.handleState(msg.state);
162
236
  break;
163
237
  case "action":
164
238
  this.handleAction(msg.id);
@@ -179,8 +253,8 @@ export class AvatarClient {
179
253
  console.warn("[avatar] dispatch failed", msg, err);
180
254
  }
181
255
  }
182
- handleClaim(state) {
183
- this.serverClaim = state;
256
+ handleState(state) {
257
+ this.serverState = state;
184
258
  if (state)
185
259
  this.idle = false;
186
260
  this.applyProjection();
@@ -206,7 +280,10 @@ export class AvatarClient {
206
280
  const existing = this.turns.get(ctx);
207
281
  if (existing)
208
282
  return existing;
209
- const turn = { ctx, cues: [], started: false, clock: null };
283
+ const turn = {
284
+ ctx, cues: [], started: false, clock: null, t0: null,
285
+ target: null, read: 0, lead: 0, checked: -Infinity,
286
+ };
210
287
  this.turns.set(ctx, turn);
211
288
  this.pendingCtxs.push(ctx);
212
289
  return turn;
@@ -230,6 +307,8 @@ export class AvatarClient {
230
307
  else {
231
308
  this.avatar.speak({ cues: turn.cues, clock: turn.clock });
232
309
  }
310
+ // A resumption this chunk added may be the next one worth listening for.
311
+ this.scheduleReanchor(turn);
233
312
  }
234
313
  activateNextTurn() {
235
314
  if (this.turn)
@@ -240,11 +319,165 @@ export class AvatarClient {
240
319
  }
241
320
  if (!turn)
242
321
  return;
243
- const t0 = this.now();
244
- turn.clock = () => this.now() - t0;
245
- turn.started = true;
246
- this.turn = turn;
247
- this.avatar.speak({ cues: turn.cues, clock: turn.clock });
322
+ const active = turn;
323
+ active.lead = this.leadMs();
324
+ active.clock = () => {
325
+ if (active.t0 === null)
326
+ return -1;
327
+ const now = this.now();
328
+ if (active.target !== null) {
329
+ const room = MAX_SLEW * Math.max(0, now - active.read);
330
+ const off = active.target - active.t0;
331
+ if (Math.abs(off) <= room) {
332
+ active.t0 = active.target;
333
+ active.target = null;
334
+ }
335
+ else {
336
+ active.t0 += Math.sign(off) * room;
337
+ }
338
+ }
339
+ active.read = now;
340
+ return now - active.t0 + active.lead;
341
+ };
342
+ active.started = true;
343
+ this.turn = active;
344
+ this.anchor(active);
345
+ this.avatar.speak({ cues: active.cues, clock: active.clock });
346
+ }
347
+ /** Put the turn's zero where its sound began — see the header. */
348
+ anchor(turn) {
349
+ const event = this.now();
350
+ // A context made before any gesture can sit suspended; every turn asks again.
351
+ this.probe?.resume?.();
352
+ const heard = this.probe?.onset();
353
+ if (typeof heard === "number") {
354
+ this.probeHeard = true;
355
+ this.anchored(turn, heard, "the sound", event);
356
+ return;
357
+ }
358
+ if (heard !== null) {
359
+ this.anchored(turn, event, this.probe ? "the event (probe cannot say)" : "the event (no probe)", event);
360
+ return;
361
+ }
362
+ const poll = () => {
363
+ this.onsetTimer = null;
364
+ if (this.turn !== turn)
365
+ return;
366
+ const onset = this.probe?.onset();
367
+ if (typeof onset === "number") {
368
+ this.probeHeard = true;
369
+ this.anchored(turn, onset, "the sound", event);
370
+ }
371
+ else if (onset === null && this.now() - event < ONSET_WAIT_MS) {
372
+ this.onsetTimer = this.setTimer(poll, ONSET_POLL_MS);
373
+ }
374
+ else {
375
+ if (!this.probeHeard)
376
+ this.dropProbe();
377
+ this.anchored(turn, event, onset === null ? "the event (no sound in time)" : "the event (probe cannot say)", event);
378
+ }
379
+ };
380
+ this.onsetTimer = this.setTimer(poll, ONSET_POLL_MS);
381
+ }
382
+ anchored(turn, t0, how, event) {
383
+ turn.t0 = t0;
384
+ turn.read = this.now();
385
+ console.info(`[avatar] ${turn.ctx} anchored on ${how}: sound ${Math.round(event - t0)} ms before the event, `
386
+ + `mouth ${Math.round(turn.lead)} ms ahead`);
387
+ this.scheduleReanchor(turn);
388
+ }
389
+ /** The lead for a turn starting now — see `VISUAL_LEAD_MS`. */
390
+ leadMs() {
391
+ const out = this.probe?.outputLatencyMs?.() ?? 0;
392
+ const excess = Math.min(MAX_OUTPUT_LATENCY_MS, Math.max(0, out - DISPLAY_LATENCY_MS));
393
+ return VISUAL_LEAD_MS - excess;
394
+ }
395
+ /** The first resumption after `after` (track ms) that follows a pause long
396
+ * enough to be heard as one. */
397
+ nextResumption(turn, after) {
398
+ let silentFrom = null;
399
+ for (const c of turn.cues) {
400
+ if (c.v === "X") {
401
+ silentFrom ??= c.t;
402
+ continue;
403
+ }
404
+ if (silentFrom !== null && c.t - silentFrom >= REANCHOR_GAP_MS && c.t > after)
405
+ return c.t;
406
+ silentFrom = null;
407
+ }
408
+ return null;
409
+ }
410
+ /** Listen for the sound at the turn's next resumption, once. */
411
+ scheduleReanchor(turn) {
412
+ if (this.reanchorTimer !== null || !this.probe || turn.t0 === null || this.turn !== turn)
413
+ return;
414
+ const zero = turn.target ?? turn.t0;
415
+ const at = this.nextResumption(turn, Math.max(turn.checked, this.now() - zero - REANCHOR_WINDOW_MS));
416
+ if (at === null)
417
+ return;
418
+ const poll = () => {
419
+ this.reanchorTimer = null;
420
+ if (this.turn !== turn || !this.probe || turn.t0 === null)
421
+ return;
422
+ const due = (turn.target ?? turn.t0) + at;
423
+ const onset = this.probe.onset();
424
+ if (onset === null && this.now() < due + RESUME_HEARD_MS + REANCHOR_WINDOW_MS) {
425
+ this.reanchorTimer = this.setTimer(poll, ONSET_POLL_MS);
426
+ return;
427
+ }
428
+ turn.checked = at;
429
+ // `undefined` is sound all the way back: the pause was not silence on
430
+ // the wire, or it resumed long before the track says. Either way there
431
+ // is nothing to measure.
432
+ if (typeof onset === "number") {
433
+ const heard = onset - due;
434
+ const [earliest, latest] = RESUME_HEARD_RANGE_MS;
435
+ const agrees = heard >= earliest && heard <= latest;
436
+ if (!agrees && Math.abs(heard - RESUME_HEARD_MS) <= REANCHOR_WINDOW_MS) {
437
+ turn.target = onset - at - RESUME_HEARD_MS;
438
+ }
439
+ }
440
+ this.scheduleReanchor(turn);
441
+ };
442
+ const zeroNow = turn.target ?? turn.t0;
443
+ this.reanchorTimer = this.setTimer(poll, Math.max(0, zeroNow + at + REANCHOR_LOOK_MS - this.now()));
444
+ }
445
+ clearReanchorTimer() {
446
+ if (this.reanchorTimer !== null) {
447
+ this.clearTimer(this.reanchorTimer);
448
+ this.reanchorTimer = null;
449
+ }
450
+ }
451
+ clearOnsetTimer() {
452
+ if (this.onsetTimer !== null) {
453
+ this.clearTimer(this.onsetTimer);
454
+ this.onsetTimer = null;
455
+ }
456
+ }
457
+ dropProbe() {
458
+ this.probe?.dispose();
459
+ this.probe = null;
460
+ this.probeTrack = null;
461
+ this.probeHeard = false;
462
+ }
463
+ /** Listen to the bot's audio track, if the transport has one yet. */
464
+ listenTo(client, heard) {
465
+ if (this.opts.playoutProbe)
466
+ return;
467
+ let track = heard;
468
+ if (!track) {
469
+ try {
470
+ track = client.tracks().bot?.audio;
471
+ }
472
+ catch {
473
+ return;
474
+ }
475
+ }
476
+ if (!track || track === this.probeTrack)
477
+ return;
478
+ this.dropProbe();
479
+ this.probe = createPlayoutProbe(track, this.now);
480
+ this.probeTrack = this.probe ? track : null;
248
481
  }
249
482
  discardQueuedTurns() {
250
483
  for (const ctx of this.pendingCtxs.splice(0)) {
@@ -256,7 +489,7 @@ export class AvatarClient {
256
489
  // The one copy of the ladder is docs/pipecat-lifecycle-protocol.md; this is
257
490
  // its implementation, in the same order.
258
491
  //
259
- // Audio truth is the P0 invariant: no lower claim or microphone event may
492
+ // Audio truth is the P0 invariant: no lower state or microphone event may
260
493
  // put the face in a non-speaking pose while bot speech is audible.
261
494
  if (this.botSpeaking)
262
495
  return "SPEAKING";
@@ -268,14 +501,14 @@ export class AvatarClient {
268
501
  return this.failure;
269
502
  if (this.muted)
270
503
  return "MUTED";
271
- // Every claim resolves to the presence state of the same name, so there is
272
- // nothing to rank here — a claim is a single value and only one can be in
273
- // flight. STRAINING > THINKING > WORKING is decided where more than one
274
- // condition can hold at once, which is the server: `AvatarStateMachine.
275
- // _resolve()`. Ranking them again on this side would be a second, silent
276
- // copy of that ladder, and the two would drift.
277
- if (this.serverClaim)
278
- return this.serverClaim;
504
+ // A server state *is* the presence state of the same name, so there is
505
+ // nothing to rank here — only one can be in flight, and the command sets
506
+ // rather than adds. CANT_HEAR > THINKING > WORKING is decided where more
507
+ // than one condition can hold at once, which is the server:
508
+ // `AvatarStateMachine._resolve()`. Ranking them again on this side would be
509
+ // a second, silent copy of that ladder, and the two would drift.
510
+ if (this.serverState)
511
+ return this.serverState;
279
512
  if (this.idle)
280
513
  return "IDLE";
281
514
  return "LISTENING";
@@ -311,7 +544,7 @@ export class AvatarClient {
311
544
  }
312
545
  eligibleForIdle() {
313
546
  return this.listening && !this.userSpeaking && !this.botSpeaking
314
- && !this.muted && !this.serverClaim && !this.failure;
547
+ && !this.muted && !this.serverState && !this.failure;
315
548
  }
316
549
  enterListening() {
317
550
  this.listening = true;
@@ -319,10 +552,10 @@ export class AvatarClient {
319
552
  this.applyProjection();
320
553
  this.armIdleIfEligible();
321
554
  }
322
- clearClaimForTurnBoundary() {
323
- // Claims are lower-priority hints. A fresh user turn or bot output means
324
- // any prior thinking/work claim is no longer allowed to reappear later.
325
- this.serverClaim = null;
555
+ clearServerStateForTurnBoundary() {
556
+ // A server state is a lower-priority hint. A fresh user turn or bot output
557
+ // means any prior thinking/working one may not reappear later.
558
+ this.serverState = null;
326
559
  }
327
560
  maybePlayInterrupted() {
328
561
  if (this.pendingInterruptedAction && !this.botSpeaking) {
@@ -339,7 +572,7 @@ export class AvatarClient {
339
572
  onUserStartedSpeaking = () => {
340
573
  this.clearRecoverableFailure();
341
574
  this.userSpeaking = true;
342
- this.clearClaimForTurnBoundary();
575
+ this.clearServerStateForTurnBoundary();
343
576
  this.listening = true;
344
577
  this.idle = false;
345
578
  this.clearIdleTimer();
@@ -354,7 +587,7 @@ export class AvatarClient {
354
587
  onBotStartedSpeaking = () => {
355
588
  this.clearRecoverableFailure();
356
589
  this.botSpeaking = true;
357
- this.clearClaimForTurnBoundary();
590
+ this.clearServerStateForTurnBoundary();
358
591
  this.idle = false;
359
592
  this.clearIdleTimer();
360
593
  this.applyProjection();
@@ -362,6 +595,8 @@ export class AvatarClient {
362
595
  };
363
596
  onBotStoppedSpeaking = () => {
364
597
  this.botSpeaking = false;
598
+ this.clearOnsetTimer();
599
+ this.clearReanchorTimer();
365
600
  // Playout truth releases the only active mouth track. A late cue chunk for
366
601
  // this context is ignored rather than reviving a silent mouth.
367
602
  if (this.turn) {
@@ -420,6 +655,15 @@ export class AvatarClient {
420
655
  */
421
656
  attach(client) {
422
657
  const onServerMessage = (raw) => this.dispatch(unwrapServerMessage(raw));
658
+ // The bot's track has to come from the event. SmallWebRTC never lists a
659
+ // remote track in `tracks()`; it only hands it to this callback, with no
660
+ // participant. Asking `tracks()` alone meant no probe on that transport,
661
+ // so every turn fell back to the event.
662
+ const onTrackStarted = (track, participant) => {
663
+ if (participant?.local || (track && track.kind !== "audio"))
664
+ return;
665
+ this.listenTo(client, track);
666
+ };
423
667
  const subscriptions = [
424
668
  [RTVI_EVENTS.serverMessage, onServerMessage],
425
669
  [RTVI_EVENTS.connected, this.onConnectedOrReady],
@@ -432,11 +676,26 @@ export class AvatarClient {
432
676
  [RTVI_EVENTS.botStoppedSpeaking, this.onBotStoppedSpeaking],
433
677
  [RTVI_EVENTS.userMuteStarted, this.onUserMuteStarted],
434
678
  [RTVI_EVENTS.userMuteStopped, this.onUserMuteStopped],
679
+ [RTVI_EVENTS.trackStarted, onTrackStarted],
435
680
  ];
436
681
  for (const [event, listener] of subscriptions)
437
682
  client.on(event, listener);
683
+ this.listenTo(client);
684
+ // Some browsers keep an audio context suspended until it is resumed inside
685
+ // a gesture, and the connect click usually lands before the bot's track
686
+ // exists. Any later click or key is the next chance.
687
+ const wake = () => this.probe?.resume?.();
688
+ const doc = typeof document === "undefined" ? null : document;
689
+ doc?.addEventListener("pointerdown", wake, true);
690
+ doc?.addEventListener("keydown", wake, true);
438
691
  return () => {
692
+ doc?.removeEventListener("pointerdown", wake, true);
693
+ doc?.removeEventListener("keydown", wake, true);
439
694
  this.clearIdleTimer();
695
+ this.clearOnsetTimer();
696
+ this.clearReanchorTimer();
697
+ if (!this.opts.playoutProbe)
698
+ this.dropProbe();
440
699
  for (const [event, listener] of subscriptions)
441
700
  client.off(event, listener);
442
701
  };
@@ -444,6 +703,9 @@ export class AvatarClient {
444
703
  /** Dispose controller-owned timers when its mounted avatar is destroyed. */
445
704
  destroy() {
446
705
  this.clearIdleTimer();
706
+ this.clearOnsetTimer();
707
+ this.clearReanchorTimer();
708
+ this.dropProbe();
447
709
  this.behavior.destroy();
448
710
  }
449
711
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AvatarClient.js","sourceRoot":"","sources":["../client/AvatarClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,kBAAkB,GAInB,MAAM,YAAY,CAAC;AA6CpB;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,4EAA4E;IAC5E,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;CACO,CAAC;AAS5C;yEACyE;AACzE,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAwC,CAAC;IACjE,OAAO,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,CAAC;AAED,MAAM,OAAO,YAAY;IACN,MAAM,CAAY;IACnC,yEAAyE;IACxD,QAAQ,CAAqB;IAC7B,IAAI,CAAsB;IAC1B,GAAG,CAAe;IAC3B,IAAI,GAAgB,IAAI,CAAC;IAChB,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,WAAW,GAAa,EAAE,CAAC;IAC3B,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,SAAS,GAA0B,IAAI,CAAC;IACxC,WAAW,GAAgB,IAAI,CAAC;IAChC,YAAY,GAAG,KAAK,CAAC;IACrB,WAAW,GAAG,KAAK,CAAC;IACpB,KAAK,GAAG,KAAK,CAAC;IACd,SAAS,GAAG,KAAK,CAAC;IAC1B,sEAAsE;IACtE,4DAA4D;IACpD,IAAI,GAAG,KAAK,CAAC;IACb,OAAO,GAAkC,IAAI,CAAC;IAC9C,SAAS,GAAyC,IAAI,CAAC;IACvD,wBAAwB,GAAG,KAAK,CAAC;IACjC,8BAA8B,GAAG,KAAK,CAAC;IAC9B,WAAW,CAAS;IACpB,QAAQ,CAAoB;IAC5B,UAAU,CAAsB;IAEjD,YAAY,MAAiB,EAAE,OAA4B,EAAE;QAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,+EAA+E;IAC/E,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,wFAAwF;IACxF,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED;;6EAEyE;IACzE,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC;IACvC,CAAC;IAED;;oDAEgD;IAChD,iBAAiB;QACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;0EAEsE;IACtE,QAAQ,CAAC,GAAY;QACnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YAAE,OAAO;QAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,OAAO;oBACV,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC5B,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC1B,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBACrB,MAAM;gBACR,qEAAqE;gBACrE,uEAAuE;gBACvE,uEAAuE;gBACvE,oBAAoB;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;gBAC9C,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAkB;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,YAAY,CAAC,EAAkB;QACrC,yEAAyE;QACzE,yEAAyE;QACzE,wDAAwD;QACxD,IAAI,EAAE,KAAK,sBAAsB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YACrC,kEAAkE;YAClE,uEAAuE;YACvE,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAEO,UAAU,CAAC,EAAkB;QACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEO,UAAU,CAAC,GAAW;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,GAAkB;QACnC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,sEAAsE;YACtE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QACtB,IAAI,IAAsB,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAG,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,kBAAkB;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,4EAA4E;QAC5E,yCAAyC;QACzC,EAAE;QACF,0EAA0E;QAC1E,mEAAmE;QACnE,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,UAAU,CAAC;QACxC,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,WAAW,CAAC;QAC1C,0EAA0E;QAC1E,gDAAgD;QAChD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QAC/B,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,wEAAwE;QACxE,yEAAyE;QACzE,gDAAgD;QAChD,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,eAAe,CAAC,KAAK,GAAG,KAAK;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,wEAAwE;QACxE,4EAA4E;QAC5E,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW;eAC3D,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACzD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,yBAAyB;QAC/B,yEAAyE;QACzE,wEAAwE;QACxE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,qBAAqB,GAAG,GAAS,EAAE;QACzC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IAEM,qBAAqB,GAAG,GAAS,EAAE;QACzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC;IAEM,oBAAoB,GAAG,GAAS,EAAE;QACxC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEM,oBAAoB,GAAG,GAAS,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACxC,IAAI,CAAC,8BAA8B,GAAG,KAAK,CAAC;YAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEM,iBAAiB,GAAG,GAAS,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IAEM,iBAAiB,GAAG,GAAS,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,2EAA2E;QAC3E,+CAA+C;QAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC;IAEM,OAAO,GAAG,CAAC,GAAY,EAAQ,EAAE;QACvC,MAAM,IAAI,GAAI,GAA0B,EAAE,IAAuC,CAAC;QAClF,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7D,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IAEM,cAAc,GAAG,GAAS,EAAE;QAClC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IAEM,kBAAkB,GAAG,GAAS,EAAE;QACtC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpD,uEAAuE;QACvE,yEAAyE;QACzE,mCAAmC;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF;;;;;;;OAOG;IACH,MAAM,CAAC,MAAqB;QAC1B,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,MAAM,aAAa,GAA8C;YAC/D,CAAC,WAAW,CAAC,aAAa,EAAE,eAAe,CAAC;YAC5C,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC;YAChD,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC;YAC/C,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;YAC/C,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;YACjC,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,qBAAqB,CAAC;YAC7D,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,qBAAqB,CAAC;YAC7D,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,CAAC;YAC3D,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,CAAC;YAC3D,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC;YACrD,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACtD,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,aAAa;YAAE,MAAM,CAAC,EAAE,CAAC,KAAkB,EAAE,QAAiB,CAAC,CAAC;QAChG,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,aAAa;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAkB,EAAE,QAAiB,CAAC,CAAC;QACnG,CAAC,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,OAAO;QACL,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"AvatarClient.js","sourceRoot":"","sources":["../client/AvatarClient.ts"],"names":[],"mappings":"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"}
package/dist/arjun.d.ts CHANGED
@@ -2,5 +2,6 @@
2
2
  import type { CanvasAvatarOptions } from './createCanvasAvatar.js';
3
3
  import type { AvatarInstance } from './createAvatar.js';
4
4
  export type { CanvasAvatarOptions };
5
+ export { supports } from './supports.js';
5
6
  export declare function createAvatar(options: CanvasAvatarOptions): AvatarInstance;
6
7
  //# sourceMappingURL=arjun.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arjun.d.ts","sourceRoot":"","sources":["../client/arjun.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAGhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
1
+ {"version":3,"file":"arjun.d.ts","sourceRoot":"","sources":["../client/arjun.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAGhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
package/dist/arjun.js CHANGED
@@ -7,6 +7,8 @@ const IMAGES = {
7
7
  'round-m3-hair-front.webp': new URL('../src/canvas/data/img/round-m3-hair-front.webp', import.meta.url),
8
8
  };
9
9
  const FACE = () => import('../src/canvas/avatars/round/face.mjs');
10
+ // Same mixer, same clip library, so the same declaration (`supports.ts`).
11
+ export { supports } from './supports.js';
10
12
  export function createAvatar(options) {
11
13
  return createCanvasAvatar(options, {
12
14
  rigUrl: RIG_URL,
package/dist/arjun.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"arjun.js","sourceRoot":"","sources":["../client/arjun.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,8CAA8C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzF,MAAM,MAAM,GAAG;IACb,yBAAyB,EAAE,IAAI,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACrG,wBAAwB,EAAE,IAAI,GAAG,CAAC,+CAA+C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACnG,0BAA0B,EAAE,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CAC/F,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAIlE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,8CAA8C;KACtD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"arjun.js","sourceRoot":"","sources":["../client/arjun.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,8CAA8C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzF,MAAM,MAAM,GAAG;IACb,yBAAyB,EAAE,IAAI,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACrG,wBAAwB,EAAE,IAAI,GAAG,CAAC,+CAA+C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACnG,0BAA0B,EAAE,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CAC/F,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAGlE,0EAA0E;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,8CAA8C;KACtD,CAAC,CAAC;AACL,CAAC"}
@@ -39,6 +39,7 @@
39
39
  */
40
40
  import type { PipecatClient } from "@pipecat-ai/client-js";
41
41
  import type { Face, FaceTheme, Gain, HandSide } from "../src/avatar.js";
42
+ import type { BehaviorStateId } from "../src/behavior.js";
42
43
  export type { Face, FaceTheme, Gain, HandSide };
43
44
  /**
44
45
  * What every `createAvatar` takes. Implementations extend it with their own
@@ -65,6 +66,41 @@ export interface AvatarInstance {
65
66
  * the common denominator — the two options everyone shares.
66
67
  */
67
68
  export type AvatarFactory<O extends AvatarOptions = AvatarOptions> = (options: O) => AvatarInstance;
69
+ /**
70
+ * What a mounted avatar answers to — the one *optional* export beside
71
+ * `createAvatar`.
72
+ *
73
+ * A page that drives an avatar has a problem an ordinary consumer does not.
74
+ * The wire's action id is open and an unknown one is ignored in silence
75
+ * (docs/contract-wire.md § Action), which is right for a protocol and useless
76
+ * for a control surface: a button per name cannot tell "this face has no such
77
+ * motion" from "nothing happened". This is the avatar answering that question
78
+ * for a driving UI, and nothing else reads it — `createAvatar` does not take
79
+ * it, the library never consults it, and an avatar that omits it is fully
80
+ * conforming. It is a *declaration*: nobody verifies it, so a list that has
81
+ * drifted from the drawing is a bug in the avatar and not something the
82
+ * library can catch.
83
+ */
84
+ export interface AvatarSupport {
85
+ /**
86
+ * Every action id this avatar answers to, the two required ones included.
87
+ * An id absent from here is a documented no-op, never an error.
88
+ */
89
+ readonly actions: readonly string[];
90
+ /**
91
+ * Which of the nine states this avatar draws *distinguishably*.
92
+ *
93
+ * Every avatar must accept all nine; a renderer that draws `CANT_HEAR` as
94
+ * ordinary listening is conforming (docs/contract-behavior.md). So this is
95
+ * the narrower claim — which of them a reviewer can expect to tell apart on
96
+ * the face — and omitting it claims all nine, which is what every avatar in
97
+ * this repo does.
98
+ */
99
+ readonly states?: readonly BehaviorStateId[];
100
+ }
101
+ /** The bundled avatars' own `supports` value is in `supports.ts`, not here: it
102
+ * is a value, so this module's `peep` import would follow it into the bundle of
103
+ * anything that read it — including the canvas avatars, which draw no SVG face. */
68
104
  /**
69
105
  * Options for the bundled SVG avatars — ours alone; nothing outside this
70
106
  * package reads them.
@@ -1 +1 @@
1
- {"version":3,"file":"createAvatar.d.ts","sourceRoot":"","sources":["../client/createAvatar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIxE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAC/D,CAAC,OAAO,EAAE,CAAC,KAAK,cAAc,CAAC;AAEjC;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB;8DAC0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,cAAc,CA4BtE"}
1
+ {"version":3,"file":"createAvatar.d.ts","sourceRoot":"","sources":["../client/createAvatar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAC/D,CAAC,OAAO,EAAE,CAAC,KAAK,cAAc,CAAC;AAEjC;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED;;oFAEoF;AAEpF;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB;8DAC0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,cAAc,CA4BtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"createAvatar.js","sourceRoot":"","sources":["../client/createAvatar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgEjD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAU,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACvE,8EAA8E;IAC9E,uDAAuD;IACvD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,wBAAwB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createAvatar.js","sourceRoot":"","sources":["../client/createAvatar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAqGjD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAU,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACvE,8EAA8E;IAC9E,uDAAuD;IACvD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,wBAAwB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}