@streamoji/avatar-widget 0.2.4 → 0.2.6

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.
@@ -1,96 +1,100 @@
1
- import { jsx as c, jsxs as ie } from "react/jsx-runtime";
2
- import { useGLTF as Ze, Environment as Ct } from "@react-three/drei";
3
- import { useFrame as Dt, Canvas as Ot, useThree as Ft } from "@react-three/fiber";
4
- import { memo as Ut, useMemo as tt, useRef as o, useState as k, useEffect as H, useCallback as $e, useLayoutEffect as Nt, Suspense as Wt } from "react";
5
- import * as Fe from "three";
6
- import { GLTFLoader as Bt } from "three/examples/jsm/loaders/GLTFLoader.js";
7
- const W = (...d) => {
8
- }, Pt = (...d) => {
9
- }, ft = ({ analyser: d }) => {
10
- const A = o(null), v = o(null);
11
- return H(() => {
12
- const p = A.current;
13
- if (!p) return;
14
- const U = p.getContext("2d", { alpha: !0 });
15
- if (!U) return;
16
- let I, R = null;
17
- d && (d.fftSize = 128, R = new Uint8Array(d.frequencyBinCount));
18
- const pe = () => {
19
- I = requestAnimationFrame(pe), (p.width !== p.offsetWidth || p.height !== p.offsetHeight) && (p.width = p.offsetWidth, p.height = p.offsetHeight);
20
- const oe = p.width, y = p.height;
21
- if (oe === 0 || y === 0) return;
22
- const _ = y / 2;
23
- U.clearRect(0, 0, oe, y), U.fillStyle = "#1e293b";
24
- const ee = 2, M = ee + 2, ue = oe * 0.95, g = Math.floor(ue / M);
25
- (!v.current || v.current.length !== g) && (v.current = new Float32Array(g).fill(2));
26
- const xe = g * M, te = (oe - xe) / 2;
27
- d && R && d.getByteFrequencyData(R);
28
- const me = R ? R.length : 0, q = Math.floor(me * 0.7) / g, F = new Float32Array(g);
29
- for (let m = 0; m < g; m++) {
30
- let $ = 0;
31
- if (R && q > 0) {
32
- const b = Math.floor(m * q), Q = Math.floor((m + 1) * q);
33
- for (let G = b; G < Q; G++) {
34
- const de = R[G] || 0;
35
- de > $ && ($ = de);
1
+ import { jsx as l, jsxs as oe } from "react/jsx-runtime";
2
+ import { useGLTF as ct, Environment as zt } from "@react-three/drei";
3
+ import { useFrame as Yt, Canvas as Qt, useThree as Xt } from "@react-three/fiber";
4
+ import { memo as Kt, useMemo as dt, useRef as c, useState as b, useEffect as P, useCallback as Qe, useLayoutEffect as Zt, Suspense as en } from "react";
5
+ import * as Ve from "three";
6
+ import { GLTFLoader as tn } from "three/examples/jsm/loaders/GLTFLoader.js";
7
+ const lt = "https://ai.streamoji.com", B = (...f) => {
8
+ }, nn = (...f) => {
9
+ }, Tt = ({ analyser: f }) => {
10
+ const A = c(null), w = c(null);
11
+ return P(() => {
12
+ const g = A.current;
13
+ if (!g) return;
14
+ const T = g.getContext("2d", { alpha: !0 });
15
+ if (!T) return;
16
+ let V, E = null;
17
+ f && (f.fftSize = 128, E = new Uint8Array(f.frequencyBinCount));
18
+ const ee = () => {
19
+ V = requestAnimationFrame(ee), (g.width !== g.offsetWidth || g.height !== g.offsetHeight) && (g.width = g.offsetWidth, g.height = g.offsetHeight);
20
+ const ae = g.width, N = g.height;
21
+ if (ae === 0 || N === 0) return;
22
+ const U = N / 2;
23
+ T.clearRect(0, 0, ae, N), T.fillStyle = "#1e293b";
24
+ const _ = 2, m = _ + 2, Y = ae * 0.95, $ = Math.floor(Y / m);
25
+ (!w.current || w.current.length !== $) && (w.current = new Float32Array($).fill(2));
26
+ const pe = $ * m, k = (ae - pe) / 2;
27
+ f && E && f.getByteFrequencyData(E);
28
+ const He = E ? E.length : 0, q = Math.floor(He * 0.7) / $, ge = new Float32Array($);
29
+ for (let I = 0; I < $; I++) {
30
+ let C = 0;
31
+ if (E && q > 0) {
32
+ const be = Math.floor(I * q), L = Math.floor((I + 1) * q);
33
+ for (let v = be; v < L; v++) {
34
+ const y = E[v] || 0;
35
+ y > C && (C = y);
36
36
  }
37
37
  }
38
- $ < 10 && ($ = 0);
39
- const L = $ / 255, S = $ > 0 ? Math.max(2, Math.pow(L, 1.4) * y * 0.25) : 2;
40
- F[m] = S;
38
+ C < 10 && (C = 0);
39
+ const W = C / 255, M = C > 0 ? Math.max(2, Math.pow(W, 1.4) * N * 0.25) : 2;
40
+ ge[I] = M;
41
41
  }
42
- for (let m = 0; m < g; m++) {
43
- const $ = g - 1 - m, L = Math.max(F[m], F[$]), S = v.current[m] + (L - v.current[m]) * 0.3;
44
- v.current[m] = S;
45
- const b = te + m * M, Q = _ - S / 2;
46
- U.beginPath(), U.roundRect ? U.roundRect(b, Q, ee, S, 4) : U.fillRect(b, Q, ee, S), U.fill();
42
+ for (let I = 0; I < $; I++) {
43
+ const C = $ - 1 - I, W = Math.max(ge[I], ge[C]), M = w.current[I] + (W - w.current[I]) * 0.3;
44
+ w.current[I] = M;
45
+ const be = k + I * m, L = U - M / 2;
46
+ T.beginPath(), T.roundRect ? T.roundRect(be, L, _, M, 4) : T.fillRect(be, L, _, M), T.fill();
47
47
  }
48
48
  };
49
- return pe(), () => {
50
- cancelAnimationFrame(I);
49
+ return ee(), () => {
50
+ cancelAnimationFrame(V);
51
51
  };
52
- }, [d]), /* @__PURE__ */ c(
52
+ }, [f]), /* @__PURE__ */ l(
53
53
  "canvas",
54
54
  {
55
55
  ref: A,
56
56
  style: { width: "100%", height: "100%", display: "block" }
57
57
  }
58
58
  );
59
- }, ht = "https://ai.streamoji.com", Vt = "https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev", pt = "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/fullbodyavatarmale.glb";
60
- async function Ht(d) {
59
+ }, rn = "https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev", Et = "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/fullbodyavatarmale.glb";
60
+ async function sn(f) {
61
61
  const A = await crypto.subtle.digest(
62
62
  "SHA-256",
63
- new TextEncoder().encode(d)
63
+ new TextEncoder().encode(f)
64
64
  );
65
- return Array.from(new Uint8Array(A)).map((v) => v.toString(16).padStart(2, "0")).join("");
65
+ return Array.from(new Uint8Array(A)).map((w) => w.toString(16).padStart(2, "0")).join("");
66
66
  }
67
- function $t(d) {
68
- const [A, v] = k(null);
69
- return H(() => {
70
- if (!d) {
71
- v(null);
67
+ function on(f) {
68
+ const [A, w] = b(null);
69
+ return P(() => {
70
+ if (!f) {
71
+ w(null);
72
72
  return;
73
73
  }
74
- let p = !1;
75
- return Ht(d).then((U) => {
76
- if (p) return;
77
- const I = `${Vt}/${U}.glb`;
78
- fetch(I, { method: "HEAD" }).then((R) => {
79
- p || v(R.ok ? I : pt);
74
+ let g = !1;
75
+ return sn(f).then((T) => {
76
+ if (g) return;
77
+ const V = `${rn}/${T}.glb`;
78
+ fetch(V, { method: "HEAD" }).then((E) => {
79
+ g || w(E.ok ? V : Et);
80
80
  }).catch(() => {
81
- p || v(pt);
81
+ g || w(Et);
82
82
  });
83
83
  }), () => {
84
- p = !0;
84
+ g = !0;
85
85
  };
86
- }, [d]), A;
86
+ }, [f]), A;
87
87
  }
88
- const jt = [
88
+ const an = [
89
89
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_001.glb",
90
90
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_002.glb",
91
91
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_002.glb",
92
92
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_005.glb"
93
- ], Jt = [
93
+ ], cn = [
94
+ "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_001.glb",
95
+ "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb",
96
+ "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb"
97
+ ], ln = [
94
98
  {
95
99
  id: "m_expr_01",
96
100
  name: "Friendly Wave",
@@ -256,17 +260,17 @@ const jt = [
256
260
  name: "Take It Easy",
257
261
  url: "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_006.glb"
258
262
  }
259
- ], qt = [
263
+ ], un = [
260
264
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb",
261
265
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb"
262
- ], Gt = {
266
+ ], dn = {
263
267
  zoom: 0.85,
264
268
  position: [0.15, -0.8, 0],
265
269
  scale: 1.5,
266
270
  rotation: [0.15, 0.02, 0]
267
- }, zt = [-0.45, 1.9, 0.1], Yt = {
271
+ }, fn = [-0.45, 1.9, 0.1], hn = {
268
272
  browInnerUp: 0.2
269
- }, et = 0.18, Xt = 1, je = {
273
+ }, ut = 0.18, mn = 1, It = "__branding__", Xe = {
270
274
  neutral: { eyeLookDownLeft: 0.1, eyeLookDownRight: 0.1 },
271
275
  happy: {
272
276
  mouthSmileLeft: 0.2,
@@ -348,7 +352,7 @@ const jt = [
348
352
  mouthUpperUpLeft: 0.1,
349
353
  mouthUpperUpRight: 0.1
350
354
  }
351
- }, Kt = [
355
+ }, pn = [
352
356
  { key: "viseme_aa", mix: { jawOpen: 0.6 } },
353
357
  {
354
358
  key: "viseme_E",
@@ -444,7 +448,7 @@ const jt = [
444
448
  }
445
449
  },
446
450
  { key: "viseme_sil", mix: {} }
447
- ], Qt = {
451
+ ], gn = {
448
452
  aei: [
449
453
  { v: "E", w: 0.8 },
450
454
  { v: "I", w: 0.2 }
@@ -473,317 +477,333 @@ const jt = [
473
477
  ],
474
478
  sil: [{ v: "sil", w: 1 }]
475
479
  };
476
- function Zt(d) {
477
- if (!d) return [{ v: "sil", w: 1 }];
478
- const A = d.toLowerCase();
479
- return Qt[A] ?? [{ v: "sil", w: 1 }];
480
+ function bn(f) {
481
+ if (!f) return [{ v: "sil", w: 1 }];
482
+ const A = f.toLowerCase();
483
+ return gn[A] ?? [{ v: "sil", w: 1 }];
480
484
  }
481
- function en({ target: d }) {
482
- const { camera: A } = Ft();
483
- return H(() => {
484
- A.lookAt(...d);
485
- }, [A, d]), null;
485
+ function _n({ target: f }) {
486
+ const { camera: A } = Xt();
487
+ return P(() => {
488
+ A.lookAt(...f);
489
+ }, [A, f]), null;
486
490
  }
487
- function Y(d, A, v) {
488
- if (!d || !d.morphTargetDictionary)
491
+ function z(f, A, w) {
492
+ if (!f || !f.morphTargetDictionary)
489
493
  return;
490
- const p = d, U = p.morphTargetDictionary, I = p.morphTargetInfluences;
491
- if (I)
492
- for (const R in U)
493
- R.toLowerCase() === A.toLowerCase() && (I[U[R]] = v);
494
+ const g = f, T = g.morphTargetDictionary, V = g.morphTargetInfluences;
495
+ if (V)
496
+ for (const E in T)
497
+ E.toLowerCase() === A.toLowerCase() && (V[T[E]] = w);
494
498
  }
495
- function mt(d, A = 0.97) {
496
- if (!d) return;
497
- const v = d;
498
- if (v.morphTargetInfluences)
499
- for (let p = 0; p < v.morphTargetInfluences.length; p++)
500
- v.morphTargetInfluences[p] *= A;
499
+ function Mt(f, A = 0.97) {
500
+ if (!f) return;
501
+ const w = f;
502
+ if (w.morphTargetInfluences)
503
+ for (let g = 0; g < w.morphTargetInfluences.length; g++)
504
+ w.morphTargetInfluences[g] *= A;
501
505
  }
502
- const tn = Ut(
506
+ const wn = Kt(
503
507
  ({
504
- avatarUrl: d,
508
+ avatarUrl: f,
505
509
  isPlayingRef: A,
506
- visemeQueueRef: v,
507
- audioContextRef: p,
508
- responseAudioStartTimeRef: U,
509
- adjustments: I,
510
- mood: R,
511
- expression: pe,
512
- agentResponse: oe,
513
- isSpeaking: y,
514
- nextStartTimeRef: _,
515
- stopPlayback: ee,
516
- setIsSpeaking: O,
517
- expressionUrl: M,
518
- onExpressionFinished: ue
510
+ visemeQueueRef: w,
511
+ audioContextRef: g,
512
+ responseAudioStartTimeRef: T,
513
+ adjustments: V,
514
+ mood: E,
515
+ expression: ee,
516
+ agentResponse: ae,
517
+ isSpeaking: N,
518
+ nextStartTimeRef: U,
519
+ stopPlayback: _,
520
+ setIsSpeaking: ce,
521
+ expressionUrl: m,
522
+ onExpressionFinished: Y,
523
+ isNudgeResponse: $,
524
+ avatarGender: pe
519
525
  }) => {
520
- const { scene: g } = Ze(d), xe = Ze(jt), te = tt(
521
- () => xe.flatMap((f) => f.animations),
526
+ const { scene: k } = ct(f), xe = ct(pe === "female" ? cn : an), q = dt(
527
+ () => xe.flatMap((d) => d.animations),
522
528
  [xe]
523
- ), me = Ze(qt), ae = tt(
524
- () => me.flatMap((f) => f.animations),
525
- [me]
526
- ), q = o(null), F = o(null), m = o(null), $ = o([]), [L] = k(() => new Fe.AnimationMixer(g)), S = o({}), b = o(null), Q = o(0), G = o(!1), de = o(0), ne = o(null);
527
- H(() => {
528
- if (!(!te || !g)) {
529
- if (te.forEach((f, u) => {
530
- const s = `idle_${u}`;
531
- if (!S.current[s]) {
532
- const n = L.clipAction(f, g);
533
- n.name = s, n.setLoop(Fe.LoopOnce, 1), n.clampWhenFinished = !0, S.current[s] = n;
529
+ ), ge = ct(un), I = dt(
530
+ () => ge.flatMap((d) => d.animations),
531
+ [ge]
532
+ ), C = c(null), W = c(null), M = c(null), be = c([]), [L] = b(() => new Ve.AnimationMixer(k)), v = c({}), y = c(null), _e = c(0), Ie = c(!1), we = c(0), le = c(null);
533
+ P(() => {
534
+ if (!(!q || !k)) {
535
+ if (q.forEach((d, u) => {
536
+ const i = `idle_${u}`;
537
+ if (!v.current[i]) {
538
+ const r = L.clipAction(d, k);
539
+ r.name = i, r.setLoop(Ve.LoopOnce, 1), r.clampWhenFinished = !0, v.current[i] = r;
534
540
  }
535
- }), ae.forEach((f, u) => {
536
- const s = `talk_${u}`;
537
- if (!S.current[s]) {
538
- const n = L.clipAction(f, g);
539
- n.name = s, n.setLoop(Fe.LoopOnce, 1), n.clampWhenFinished = !0, S.current[s] = n;
541
+ }), I.forEach((d, u) => {
542
+ const i = `talk_${u}`;
543
+ if (!v.current[i]) {
544
+ const r = L.clipAction(d, k);
545
+ r.name = i, r.setLoop(Ve.LoopOnce, 1), r.clampWhenFinished = !0, v.current[i] = r;
540
546
  }
541
- }), te.length > 0) {
542
- const f = S.current.idle_0, u = b.current && L.existingAction(b.current.getClip());
543
- f && !u && (f.reset().fadeIn(0.5).play(), b.current = f);
547
+ }), q.length > 0) {
548
+ const d = v.current.idle_0, u = y.current && L.existingAction(y.current.getClip());
549
+ d && !u && (d.reset().fadeIn(0.5).play(), y.current = d);
544
550
  }
545
551
  return () => {
546
- L.stopAllAction(), S.current = {}, b.current = null;
552
+ L.stopAllAction(), v.current = {}, y.current = null;
547
553
  };
548
554
  }
549
- }, [te, ae, g, L]);
550
- const ke = o("");
551
- H(() => {
552
- if (!M || !g || M === ke.current) return;
553
- ke.current = M, ne.current = M, new Bt().load(
554
- M,
555
+ }, [q, I, k, L]);
556
+ const ve = c("");
557
+ P(() => {
558
+ if (!m || !k || m === ve.current) return;
559
+ ve.current = m, le.current = m, new tn().load(
560
+ m,
555
561
  (u) => {
556
562
  if (u.animations && u.animations.length > 0) {
557
- const s = u.animations[0], n = L.clipAction(s, g);
558
- if (n.name = `EXPR_${M}`, n.setLoop(Fe.LoopOnce, 1), n.clampWhenFinished = !0, S.current[`EXPR_${M}`] = n, y && ne.current === M) {
559
- const h = b.current;
560
- n.reset().fadeIn(0.3).play(), h && h !== n && h.crossFadeTo(n, 0.3, !0), b.current = n, ne.current = null;
563
+ const i = u.animations[0], r = L.clipAction(i, k);
564
+ if (r.name = `EXPR_${m}`, r.setLoop(Ve.LoopOnce, 1), r.clampWhenFinished = !0, v.current[`EXPR_${m}`] = r, N && le.current === m) {
565
+ const h = y.current;
566
+ r.reset().fadeIn(0.3).play(), h && h !== r && h.crossFadeTo(r, 0.3, !0), y.current = r, le.current = null;
561
567
  }
562
568
  }
563
569
  },
564
570
  void 0,
565
571
  (u) => {
566
- console.error(`[ANIMATION] Failed to load ${M}`, u);
572
+ console.error(`[ANIMATION] Failed to load ${m}`, u);
567
573
  }
568
574
  );
569
- }, [M, g, L, y]), H(() => {
570
- const f = (u) => {
571
- const s = u.action, n = s.name || "";
572
- if (n.startsWith("idle_")) {
573
- const j = (parseInt(n.split("_")[1]) + 1) % te.length, X = S.current[`idle_${j}`];
574
- X && (X.reset().fadeIn(0.5).play(), s.crossFadeTo(X, 0.5, !0), b.current = X);
575
- } else if (n.startsWith("EXPR_")) {
576
- if (y) {
577
- const h = S.current.talk_0;
578
- h && (h.reset().fadeIn(0.5).play(), s.crossFadeTo(h, 0.5, !0), b.current = h);
575
+ }, [m, k, L, N]), P(() => {
576
+ const d = (u) => {
577
+ const i = u.action, r = i.name || "";
578
+ if (r.startsWith("idle_")) {
579
+ const G = (parseInt(r.split("_")[1]) + 1) % q.length, Q = v.current[`idle_${G}`];
580
+ Q && (Q.reset().fadeIn(0.5).play(), i.crossFadeTo(Q, 0.5, !0), y.current = Q);
581
+ } else if (r.startsWith("EXPR_")) {
582
+ if (N) {
583
+ const h = v.current.talk_0;
584
+ h && (h.reset().fadeIn(0.5).play(), i.crossFadeTo(h, 0.5, !0), y.current = h);
579
585
  } else {
580
- const h = S.current.idle_0;
581
- h && (h.reset().fadeIn(0.5).play(), s.crossFadeTo(h, 0.5, !0), b.current = h);
586
+ const h = v.current.idle_0;
587
+ h && (h.reset().fadeIn(0.5).play(), i.crossFadeTo(h, 0.5, !0), y.current = h);
582
588
  }
583
- ue && ue();
584
- } else if (n.startsWith("talk_"))
585
- if (y) {
586
- const j = (parseInt(n.split("_")[1]) + 1) % ae.length, X = S.current[`talk_${j}`];
587
- X && (X.reset().fadeIn(0.3).play(), s.crossFadeTo(X, 0.3, !0), b.current = X);
589
+ Y && Y();
590
+ } else if (r.startsWith("talk_"))
591
+ if (N && !$) {
592
+ const G = (parseInt(r.split("_")[1]) + 1) % I.length, Q = v.current[`talk_${G}`];
593
+ Q && (Q.reset().fadeIn(0.3).play(), i.crossFadeTo(Q, 0.3, !0), y.current = Q);
588
594
  } else {
589
- const h = S.current.idle_0;
590
- h && (h.reset().fadeIn(0.5).play(), s.crossFadeTo(h, 0.5, !0), b.current = h);
595
+ const h = v.current.idle_0;
596
+ h && (h.reset().fadeIn(0.5).play(), i.crossFadeTo(h, 0.5, !0), y.current = h);
591
597
  }
592
598
  };
593
- return L.addEventListener("finished", f), () => L.removeEventListener("finished", f);
599
+ return L.addEventListener("finished", d), () => L.removeEventListener("finished", d);
594
600
  }, [
595
601
  L,
596
- te,
597
- ae,
598
- y,
599
- ue
600
- ]), H(() => {
601
- if (y && g) {
602
- const f = b.current, u = f?.name || "";
602
+ q,
603
+ I,
604
+ N,
605
+ $,
606
+ Y
607
+ ]), P(() => {
608
+ if (N && k) {
609
+ const d = y.current, u = d?.name || "";
603
610
  if (u.startsWith("idle_") || u.startsWith("talk_") || u === "") {
604
- const s = ne.current;
605
- if (s) {
606
- const n = S.current[`EXPR_${s}`];
607
- if (n) {
608
- n.reset().fadeIn(0.3).play(), f && f !== n && f.crossFadeTo(n, 0.3, !0), b.current = n, ne.current = null;
611
+ const i = le.current;
612
+ if (i) {
613
+ const r = v.current[`EXPR_${i}`];
614
+ if (r) {
615
+ r.reset().fadeIn(0.3).play(), d && d !== r && d.crossFadeTo(r, 0.3, !0), y.current = r, le.current = null;
609
616
  return;
610
617
  }
611
618
  }
612
619
  if (u.startsWith("idle_") || u === "") {
613
- const n = S.current.talk_0;
614
- n && (n.reset().fadeIn(0.5).play(), f && f.crossFadeTo(n, 0.5, !0), b.current = n);
620
+ const r = v.current.talk_0;
621
+ r && (r.reset().fadeIn(0.5).play(), d && d.crossFadeTo(r, 0.5, !0), y.current = r);
615
622
  }
616
623
  }
617
- } else if (!y && g) {
618
- const f = b.current, u = f?.name || "";
624
+ } else if (!N && k) {
625
+ const d = y.current, u = d?.name || "";
619
626
  if (u.startsWith("talk_") || u.startsWith("EXPR_")) {
620
- const s = S.current.idle_0;
621
- s && (s.reset().fadeIn(0.5).play(), f && f.crossFadeTo(s, 0.5, !0), b.current = s);
627
+ const i = v.current.idle_0;
628
+ i && (i.reset().fadeIn(0.5).play(), d && d.crossFadeTo(i, 0.5, !0), y.current = i);
622
629
  }
623
630
  }
624
- }, [y, g, M]), H(() => {
625
- if (!g) return;
626
- g.traverse((s) => {
627
- if (s.isMesh && s.morphTargetDictionary) {
628
- const n = s.name.toLowerCase();
629
- (n.includes("head") || n.includes("avatar")) && (F.current = s, W(`[ANIMATION] Found head mesh: ${s.name}`)), n.includes("teeth") && (m.current = s, W(`[ANIMATION] Found teeth mesh: ${s.name}`));
631
+ }, [N, k, m]), P(() => {
632
+ if (!k) return;
633
+ k.traverse((i) => {
634
+ if (i.isMesh && i.morphTargetDictionary) {
635
+ const r = i.name.toLowerCase();
636
+ (r.includes("head") || r.includes("avatar")) && (W.current = i, B(`[ANIMATION] Found head mesh: ${i.name}`)), r.includes("teeth") && (M.current = i, B(`[ANIMATION] Found teeth mesh: ${i.name}`));
630
637
  }
631
638
  });
632
- const f = F.current?.morphTargetDictionary;
633
- f && Object.keys(f).filter(
634
- (s) => s.toLowerCase().includes("brow")
639
+ const d = W.current?.morphTargetDictionary;
640
+ d && Object.keys(d).filter(
641
+ (i) => i.toLowerCase().includes("brow")
635
642
  );
636
643
  const u = [];
637
- g.traverse((s) => {
638
- if (s.isMesh) {
639
- const h = s.morphTargetDictionary;
640
- h && Object.keys(h).some((j) => j.toLowerCase().includes("brow")) && u.push(s);
644
+ k.traverse((i) => {
645
+ if (i.isMesh) {
646
+ const h = i.morphTargetDictionary;
647
+ h && Object.keys(h).some((G) => G.toLowerCase().includes("brow")) && u.push(i);
641
648
  }
642
- }), $.current = u, u.length > 0 && W("[ANIMATION] Meshes with brow morphs:", u.length);
643
- }, [g]);
644
- const Ue = (f, u = 1) => {
645
- const s = `viseme_${f}`.toLowerCase(), n = Kt.find((h) => h.key.toLowerCase() === s);
646
- if (n)
647
- for (const h in n.mix) {
648
- const j = n.mix[h] * u;
649
- Y(F.current, h, j), Y(m.current, h, j);
649
+ }), be.current = u, u.length > 0 && B("[ANIMATION] Meshes with brow morphs:", u.length);
650
+ }, [k]);
651
+ const Ne = (d, u = 1) => {
652
+ const i = `viseme_${d}`.toLowerCase(), r = pn.find((h) => h.key.toLowerCase() === i);
653
+ if (r)
654
+ for (const h in r.mix) {
655
+ const G = r.mix[h] * u;
656
+ z(W.current, h, G), z(M.current, h, G);
650
657
  }
651
- }, Ie = (f) => {
652
- const u = je[f] ?? je.neutral;
653
- for (const s in u)
654
- Y(F.current, s, u[s]), Y(m.current, s, u[s]);
658
+ }, ke = (d) => {
659
+ const u = Xe[d] ?? Xe.neutral;
660
+ for (const i in u)
661
+ z(W.current, i, u[i]), z(M.current, i, u[i]);
655
662
  };
656
- return Dt((f, u) => {
657
- const s = Math.pow(0.88, 60 * u);
658
- mt(F.current, s), mt(m.current, s), Ie(R);
659
- const n = f.clock.elapsedTime;
663
+ return Yt((d, u) => {
664
+ const i = Math.pow(0.88, 60 * u);
665
+ Mt(W.current, i), Mt(M.current, i), ke(E);
666
+ const r = d.clock.elapsedTime;
660
667
  let h = 0;
661
- if (Math.floor(n) % 5 === 0 && Math.floor((n - u) % 5) !== 0) {
668
+ if (Math.floor(r) % 5 === 0 && Math.floor((r - u) % 5) !== 0) {
662
669
  let J = null;
663
- g.traverse((z) => {
664
- z.name.toLowerCase().includes("hips") && (J = z);
670
+ k.traverse((ne) => {
671
+ ne.name.toLowerCase().includes("hips") && (J = ne);
665
672
  });
666
- const P = J ? `Hips Y: ${J.position.y.toFixed(4)}` : "Hips not found";
667
- W(`[ANIMATION] Mixer Time: ${L.time.toFixed(2)}, ${P}`);
673
+ const ye = J ? `Hips Y: ${J.position.y.toFixed(4)}` : "Hips not found";
674
+ B(`[ANIMATION] Mixer Time: ${L.time.toFixed(2)}, ${ye}`);
668
675
  }
669
- if (L.update(u), n > Q.current && !G.current && (G.current = !0, de.current = n), G.current) {
670
- const P = (n - de.current) / 0.3;
671
- if (P >= 1)
672
- G.current = !1, Q.current = n + 2 + Math.random() * 5;
676
+ if (L.update(u), r > _e.current && !Ie.current && (Ie.current = !0, we.current = r), Ie.current) {
677
+ const ye = (r - we.current) / 0.3;
678
+ if (ye >= 1)
679
+ Ie.current = !1, _e.current = r + 2 + Math.random() * 5;
673
680
  else {
674
- const z = P < 0.5 ? P * 2 : (1 - P) * 2;
675
- Y(F.current, "eyeBlinkLeft", z), Y(F.current, "eyeBlinkRight", z), Y(m.current, "eyeBlinkLeft", z), Y(m.current, "eyeBlinkRight", z), h = z * Yt.browInnerUp;
681
+ const ne = ye < 0.5 ? ye * 2 : (1 - ye) * 2;
682
+ z(W.current, "eyeBlinkLeft", ne), z(W.current, "eyeBlinkRight", ne), z(M.current, "eyeBlinkLeft", ne), z(M.current, "eyeBlinkRight", ne), h = ne * hn.browInnerUp;
676
683
  }
677
684
  }
678
- const j = je[R] ?? je.neutral, X = j.browInnerUp ?? 0, _e = j.browOuterUpLeft ?? 0, ge = j.browOuterUpRight ?? 0, Re = n * Xt, be = et * Math.sin(Re), we = et * 0.7 * Math.sin(Re + 0.7), Ce = et * 0.7 * Math.sin(Re + 1.3), ve = (J) => Math.max(0, Math.min(1, J)), De = ve(X + be), Ae = ve(_e + we), Je = ve(ge + Ce), Ne = ve(De + h);
679
- if (Y(F.current, "browInnerUp", Ne), Y(m.current, "browInnerUp", Ne), Y(F.current, "browOuterUpLeft", Ae), Y(m.current, "browOuterUpLeft", Ae), Y(F.current, "browOuterUpRight", Je), Y(m.current, "browOuterUpRight", Je), q.current) {
680
- const J = A.current ? 0 : I.rotation[1];
681
- q.current.rotation.y = Fe.MathUtils.lerp(
682
- q.current.rotation.y,
685
+ const G = Xe[E] ?? Xe.neutral, Q = G.browInnerUp ?? 0, Ke = G.browOuterUpLeft ?? 0, $e = G.browOuterUpRight ?? 0, Ue = r * mn, Re = ut * Math.sin(Ue), K = ut * 0.7 * Math.sin(Ue + 0.7), je = ut * 0.7 * Math.sin(Ue + 1.3), te = (J) => Math.max(0, Math.min(1, J)), Ae = te(Q + Re), Le = te(Ke + K), Be = te($e + je), Me = te(Ae + h);
686
+ if (z(W.current, "browInnerUp", Me), z(M.current, "browInnerUp", Me), z(W.current, "browOuterUpLeft", Le), z(M.current, "browOuterUpLeft", Le), z(W.current, "browOuterUpRight", Be), z(M.current, "browOuterUpRight", Be), C.current) {
687
+ const J = A.current ? 0 : V.rotation[1];
688
+ C.current.rotation.y = Ve.MathUtils.lerp(
689
+ C.current.rotation.y,
683
690
  J,
684
691
  0.1
685
- ), q.current.position.set(...I.position), q.current.scale.setScalar(I.scale), q.current.rotation.x = I.rotation[0], q.current.rotation.z = I.rotation[2];
692
+ ), C.current.position.set(...V.position), C.current.scale.setScalar(V.scale), C.current.rotation.x = V.rotation[0], C.current.rotation.z = V.rotation[2];
686
693
  }
687
- if (A.current && p.current) {
688
- const J = p.current.currentTime, Oe = (J - U.current) * 1e3 - -150;
689
- for (let Le = 0; Le < v.current.length; Le++) {
690
- const Z = v.current[Le];
691
- Oe >= Z.vtime && Oe < Z.vtime + Z.vduration && Ue(Z.viseme, Z.weight ?? 1);
694
+ if (A.current && g.current) {
695
+ const J = g.current.currentTime, De = (J - T.current) * 1e3 - -150;
696
+ for (let Z = 0; Z < w.current.length; Z++) {
697
+ const re = w.current[Z];
698
+ De >= re.vtime && De < re.vtime + re.vduration && Ne(re.viseme, re.weight ?? 1);
692
699
  }
693
- J > _.current + 0.5 && (ee(), O(!1));
700
+ J > U.current + 0.5 && (_(), ce(!1));
694
701
  }
695
- }), /* @__PURE__ */ c("group", { ref: q, children: /* @__PURE__ */ c("primitive", { object: g }) });
702
+ }), /* @__PURE__ */ l("group", { ref: C, children: /* @__PURE__ */ l("primitive", { object: k }) });
696
703
  }
697
704
  );
698
- function nn(d) {
699
- return d ? d.charAt(0).toUpperCase() + d.slice(1).toLowerCase() : "";
705
+ function vn(f) {
706
+ return f ? f.charAt(0).toUpperCase() + f.slice(1).toLowerCase() : "";
700
707
  }
701
- const rn = ({
702
- token: d,
708
+ const yn = ({
709
+ token: f,
703
710
  agentToken: A,
704
- onNavigationRequested: v
711
+ onNavigationRequested: w,
712
+ avatarGender: g
705
713
  } = {}) => {
706
- const p = d ?? A ?? "", U = $t(p || void 0), [I, R] = k(""), [pe, oe] = k(""), [y, _] = k("Ready"), [ee, O] = k(!1), [M, ue] = k(!1), [g, xe] = k(
714
+ const T = f ?? A ?? "", V = on(T || void 0), [E, ee] = b(""), [ae, N] = b(""), [U, _] = b("Ready"), [ce, m] = b(!1), [Y, $] = b(!1), [pe, k] = b([]), [He, xe] = b(""), q = c(null), [ge, I] = b(
707
715
  () => typeof window < "u" ? window.matchMedia("(max-width: 480px)").matches : !1
708
716
  );
709
- H(() => {
710
- const e = window.matchMedia("(max-width: 480px)"), t = () => xe(e.matches);
717
+ P(() => {
718
+ const e = window.matchMedia("(max-width: 480px)"), t = () => I(e.matches);
711
719
  return e.addEventListener("change", t), () => e.removeEventListener("change", t);
712
720
  }, []);
713
- const te = g ? 80 : 600, me = o(!1), ae = o([]), q = o(0), F = o(!1), m = o([]), $ = o(null), L = o([]);
714
- o([]);
715
- const S = o([]), b = o(0), Q = o(0), G = o(0), de = o(0), ne = o(!1), [ke, Ue] = k(
721
+ const C = ge ? 80 : 600, W = c(!1), M = c([]), be = c(0), L = c(!1), v = c([]), y = c(null), _e = c([]);
722
+ c([]);
723
+ const Ie = c([]), we = c(0), le = c(0), ve = c(0), Ne = c(0), ke = c(!1), [d, u] = b(
716
724
  null
717
- ), Ie = o(null), [f, u] = k("neutral"), [s, n] = k(""), [h, j] = k(""), [X, _e] = k("Chat with us"), [ge, Re] = k(
725
+ ), i = c(null), [r, h] = b("neutral"), [G, Q] = b(""), [Ke, $e] = b(""), [Ue, Re] = b("Chat with us"), [K, je] = b(
718
726
  null
719
- ), [be, we] = k("hidden"), [Ce, ve] = k(""), De = o(null), Ae = o(be);
720
- Ae.current = be;
721
- const [Je, Ne] = k(null), J = o(null), P = o(null), [z, Oe] = k(!1), Le = o(null), [Z, We] = k("hidden"), [nt, gt] = k(""), qe = o(Z);
722
- qe.current = Z;
723
- const fe = o(""), Te = o(!1), Me = o(""), Ee = tt(() => z ? "Try again" : y === "Busy" ? "Busy" : y === "Thinking..." || y === "Processing Voice..." ? y : ge != null && ge !== "" && ge !== "none" && ge !== "<none>" ? `Enter ${nn(ge)}` : null, [y, ge, z]), Be = Ee != null && Ee !== "";
724
- H(() => {
725
- const e = Ae.current;
727
+ ), [te, Ae] = b("hidden"), [Le, Be] = b(""), Me = c(null), J = c(te);
728
+ J.current = te;
729
+ const [ye, ne] = b(null), De = c(null), Z = c(null), [re, ft] = b(!1), ht = c(null), [ue, Je] = b("hidden"), [mt, Dt] = b(""), Ze = c(ue);
730
+ Ze.current = ue;
731
+ const he = c(""), Ce = c(!1), Oe = c(""), pt = c(Date.now()), et = c([]), Pe = c(!1), [tt, We] = b(!1), [gt, bt] = b(!1), Se = c(null), Fe = dt(() => re ? "Try again" : U === "Busy" ? "Busy" : U === "Thinking..." || U === "Processing Voice..." ? U : K != null && K !== "" && K !== "none" && K !== "<none>" ? `Enter ${vn(K)}` : ue !== "hidden" || !gt ? null : It, [U, K, re, ue, gt]), _t = !re && U !== "Busy" && U !== "Thinking..." && U !== "Processing Voice..." && (K == null || K === "" || K === "none" || K === "<none>");
732
+ P(() => {
733
+ if (ue !== "hidden" || !_t) {
734
+ bt(!1), Se.current != null && (clearTimeout(Se.current), Se.current = null);
735
+ return;
736
+ }
737
+ return Se.current = setTimeout(() => {
738
+ Se.current = null, bt(!0);
739
+ }, 400), () => {
740
+ Se.current != null && (clearTimeout(Se.current), Se.current = null);
741
+ };
742
+ }, [ue, _t]);
743
+ const qe = Fe != null && Fe !== "";
744
+ P(() => {
745
+ const e = J.current;
726
746
  if (!(e === "exiting" || e === "entering")) {
727
747
  if (e === "hidden") {
728
- Be && (ve(Ee ?? ""), we("entering"));
748
+ qe && (Be(Fe ?? ""), Ae("entering"));
729
749
  return;
730
750
  }
731
- e === "visible" && (!Be || Ee !== Ce) && (De.current = Be ? Ee : null, we("exiting"));
751
+ e === "visible" && (!qe || Fe !== Le) && (Me.current = qe ? Fe : null, Ae("exiting"));
732
752
  }
733
753
  }, [
734
- Be,
735
- Ee,
736
- be,
737
- Ce
738
- ]), H(() => {
739
- if (y !== "Busy") {
740
- P.current != null && (clearTimeout(P.current), P.current = null);
754
+ qe,
755
+ Fe,
756
+ te,
757
+ Le
758
+ ]), P(() => {
759
+ if (U !== "Busy") {
760
+ Z.current != null && (clearTimeout(Z.current), Z.current = null);
741
761
  return;
742
762
  }
743
- return P.current = setTimeout(() => {
744
- P.current = null, _("Ready"), Oe(!0);
763
+ return Z.current = setTimeout(() => {
764
+ Z.current = null, _("Ready"), ft(!0);
745
765
  }, 12e3), () => {
746
- P.current != null && (clearTimeout(P.current), P.current = null);
766
+ Z.current != null && (clearTimeout(Z.current), Z.current = null);
747
767
  };
748
- }, [y]), H(() => {
749
- if (!z) return;
750
- const e = setTimeout(() => Oe(!1), 2500);
768
+ }, [U]), P(() => {
769
+ if (!re) return;
770
+ const e = setTimeout(() => ft(!1), 2500);
751
771
  return () => clearTimeout(e);
752
- }, [z]);
753
- const bt = $e(() => {
754
- const e = Ae.current;
772
+ }, [re]);
773
+ const Ct = Qe(() => {
774
+ const e = J.current;
755
775
  if (e === "exiting") {
756
- we("hidden");
757
- const t = De.current;
758
- De.current = null, t != null && t !== "" && (ve(t), we("entering"));
759
- } else e === "entering" && we("visible");
760
- }, []), _t = (e) => {
776
+ Ae("hidden");
777
+ const t = Me.current;
778
+ Me.current = null, t != null && t !== "" && (Be(t), Ae("entering"));
779
+ } else e === "entering" && Ae("visible");
780
+ }, []), Ot = (e) => {
761
781
  if (!e) return;
762
782
  if (e.mood != null) {
763
- const r = String(e.mood).toLowerCase();
764
- u(r);
783
+ const n = String(e.mood).toLowerCase();
784
+ h(n);
765
785
  }
766
786
  if (e.expression != null) {
767
- const r = String(e.expression).trim();
768
- n(r);
769
- const a = Jt.find(
770
- (w) => w.name.toLowerCase() === r.toLowerCase()
787
+ const n = String(e.expression).trim();
788
+ Q(n);
789
+ const a = ln.find(
790
+ (p) => p.name.toLowerCase() === n.toLowerCase()
771
791
  );
772
- W(
773
- `[STREAM] Animation match for "${r}": ${a ? a.name : "NONE"}`
774
- ), j(a?.url ?? "");
792
+ B(
793
+ `[STREAM] Animation match for "${n}": ${a ? a.name : "NONE"}`
794
+ ), $e(a?.url ?? "");
775
795
  }
776
796
  if (e.navigation != null) {
777
- const r = String(e.navigation).trim();
778
- r !== "" && (v ? v(r) : window.open(r, "_blank"));
797
+ const n = String(e.navigation).trim();
798
+ n !== "" && (w ? w(n) : window.open(n, "_blank"));
779
799
  }
780
- const t = e.ask_for || e.lead_capture?.ask_for, i = t ? String(t).trim().toLowerCase() : "", l = i === "none" || i === "<none>";
781
- if (t && !l) {
782
- const r = i;
783
- Re(r || null), _e(r === "email" ? "Enter your email" : r === "name" ? "Enter your name" : r === "phone" ? "Enter your phone number" : "Chat with us");
784
- } else (l || e.ask_for === null || e.lead_capture && e.lead_capture.ask_for === null || e.ask_for === "none") && (Re(null), X !== "Chat with us" && _e("Chat with us"));
800
+ const t = e.ask_for || e.lead_capture?.ask_for, s = t ? String(t).trim().toLowerCase() : "", o = s === "none" || s === "<none>";
801
+ if (t && !o) {
802
+ const n = s;
803
+ je(n || null), Re(n === "email" ? "Enter your email" : n === "name" ? "Enter your name" : n === "phone" ? "Enter your phone number" : "Chat with us");
804
+ } else (o || e.ask_for === null || e.lead_capture && e.lead_capture.ask_for === null || e.ask_for === "none") && (je(null), Ue !== "Chat with us" && Re("Chat with us"));
785
805
  e.collected, e.valid;
786
- }, wt = (e) => {
806
+ }, Ft = (e) => {
787
807
  const t = e.trim();
788
808
  if (!t) return null;
789
809
  if (t.startsWith("{"))
@@ -793,48 +813,48 @@ const rn = ({
793
813
  return null;
794
814
  }
795
815
  if (t.includes(":")) {
796
- const i = t.split(":"), l = i[0].trim().toLowerCase(), r = i.slice(1).join(":").trim();
797
- return { [l]: r };
816
+ const s = t.split(":"), o = s[0].trim().toLowerCase(), n = s.slice(1).join(":").trim();
817
+ return { [o]: n };
798
818
  }
799
819
  return null;
800
- }, vt = $e(() => {
801
- }, []), rt = (e) => {
802
- if (Te.current)
803
- e === "§" ? Te.current = !1 : (Me.current += e, oe((t) => t + e));
820
+ }, Nt = Qe(() => {
821
+ }, []), wt = (e) => {
822
+ if (Ce.current)
823
+ e === "§" ? Ce.current = !1 : (Oe.current += e, N((t) => t + e));
804
824
  else if (e === "§") {
805
- Te.current = !0;
825
+ Ce.current = !0;
806
826
  return;
807
827
  } else
808
- for (fe.current += e; fe.current.includes(`
828
+ for (he.current += e; he.current.includes(`
809
829
  `); ) {
810
- const t = fe.current.indexOf(`
811
- `), i = fe.current.slice(0, t).trim();
812
- fe.current = fe.current.slice(t + 1);
813
- const l = wt(i);
814
- l && _t(l);
830
+ const t = he.current.indexOf(`
831
+ `), s = he.current.slice(0, t).trim();
832
+ he.current = he.current.slice(t + 1);
833
+ const o = Ft(s);
834
+ o && Ot(o);
815
835
  }
816
836
  };
817
- H(() => {
837
+ P(() => {
818
838
  (async () => {
819
839
  if (!sessionStorage.getItem(
820
840
  "STREAMOJI_LEADS_SESSION_LEAD_ID"
821
841
  )) {
822
- const i = "secret", l = Math.floor(Date.now() / 1e3).toString();
842
+ const s = "secret", o = Math.floor(Date.now() / 1e3).toString();
823
843
  try {
824
- const r = new TextEncoder(), a = await crypto.subtle.importKey(
844
+ const n = new TextEncoder(), a = await crypto.subtle.importKey(
825
845
  "raw",
826
- r.encode(i),
846
+ n.encode(s),
827
847
  { name: "HMAC", hash: "SHA-256" },
828
848
  !1,
829
849
  ["sign"]
830
- ), w = await crypto.subtle.sign(
850
+ ), p = await crypto.subtle.sign(
831
851
  "HMAC",
832
852
  a,
833
- r.encode(l)
834
- ), N = Array.from(new Uint8Array(w)).map((x) => x.toString(16).padStart(2, "0")).join("");
835
- sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", N), W("[SESSION] New HMAC UID generated and saved:", N);
836
- } catch (r) {
837
- console.error("[SESSION] HMAC generation failed:", r);
853
+ n.encode(o)
854
+ ), S = Array.from(new Uint8Array(p)).map((x) => x.toString(16).padStart(2, "0")).join("");
855
+ sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", S), B("[SESSION] New HMAC UID generated and saved:", S);
856
+ } catch (n) {
857
+ console.error("[SESSION] HMAC generation failed:", n);
838
858
  const a = Math.random().toString(36) + Date.now().toString();
839
859
  sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", a);
840
860
  }
@@ -844,8 +864,57 @@ const rn = ({
844
864
  JSON.stringify([])
845
865
  );
846
866
  })();
847
- }, []);
848
- const st = () => {
867
+ }, []), P(() => {
868
+ const e = () => {
869
+ pt.current = Date.now(), Pe.current && (Pe.current = !1, We(!1), k([]), xe(""), N(""), $(!1));
870
+ };
871
+ window.addEventListener("mousemove", e), window.addEventListener("keydown", e), window.addEventListener("mousedown", e), window.addEventListener("touchstart", e);
872
+ const t = setInterval(async () => {
873
+ if (Date.now() - pt.current >= 3e4 && !Y && !ce && U === "Ready" && !Pe.current)
874
+ if (Pe.current = !0, et.current.length > 0)
875
+ We(!0), k(et.current);
876
+ else
877
+ try {
878
+ const n = `${lt}/nudgeUser`, a = {
879
+ navigationUrl: window.location.href,
880
+ token: T
881
+ }, p = await fetch(n, {
882
+ method: "POST",
883
+ headers: {
884
+ "Content-Type": "application/json"
885
+ },
886
+ body: JSON.stringify(a)
887
+ });
888
+ if (p.ok) {
889
+ const S = (await p.json()).nudge_questions;
890
+ S && S.length > 0 && (B("[NUDGE] Received nudge questions from API:", S), et.current = S, We(!0), k(S));
891
+ }
892
+ } catch (n) {
893
+ console.error("[NUDGE] Error calling /nudgeUser:", n), Pe.current = !1;
894
+ }
895
+ }, 1e3);
896
+ return () => {
897
+ window.removeEventListener("mousemove", e), window.removeEventListener("keydown", e), window.removeEventListener("mousedown", e), window.removeEventListener("touchstart", e), clearInterval(t);
898
+ };
899
+ }, [T, Y, ce, U]), P(() => {
900
+ if (pe.length === 0) return;
901
+ let e = 0, t = 0, s = !1, o = 100;
902
+ const n = () => {
903
+ const a = pe[e];
904
+ if (s) {
905
+ const p = a.substring(0, t - 1);
906
+ xe(p), t--, o = 50;
907
+ } else {
908
+ const p = a.substring(0, t + 1);
909
+ xe(p), t++, o = 100;
910
+ }
911
+ !s && t === a.length ? (s = !0, o = 3e3) : s && t === 0 && (s = !1, e = (e + 1) % pe.length, o = 500), q.current = setTimeout(n, o);
912
+ };
913
+ return n(), () => {
914
+ q.current && clearTimeout(q.current);
915
+ };
916
+ }, [pe]);
917
+ const vt = () => {
849
918
  try {
850
919
  return JSON.parse(
851
920
  sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES") || "[]"
@@ -853,232 +922,232 @@ const rn = ({
853
922
  } catch {
854
923
  return [];
855
924
  }
856
- }, yt = (e) => {
925
+ }, Ut = (e) => {
857
926
  sessionStorage.setItem(
858
927
  "STREAMOJI_LEADS_SESSION_MESSAGES",
859
928
  JSON.stringify(e)
860
929
  );
861
- }, [Ge, ze] = k(!1), [it, Ye] = k(0), ce = o(null), Pe = o([]), ot = o(0), [at, St] = k(
930
+ }, [nt, rt] = b(!1), [yt, st] = b(0), de = c(null), Ge = c([]), St = c(0), [xt, Bt] = b(
862
931
  null
863
- ), [xt, Xe] = k(
932
+ ), [Pt, it] = b(
864
933
  null
865
- ), he = o(null), ye = o(
934
+ ), me = c(null), Te = c(
866
935
  null
867
- ), Ve = $e((e = !1) => {
868
- e && (ne.current = !0, O(!1), _("Ready")), m.current = [], ae.current = [], F.current = !1, ue(!1), b.current = 0, Q.current = 0, G.current = 0, L.current.forEach((t) => {
936
+ ), ze = Qe((e = !1) => {
937
+ e && (ke.current = !0, m(!1), _("Ready")), v.current = [], M.current = [], L.current = !1, $(!1), we.current = 0, le.current = 0, ve.current = 0, _e.current.forEach((t) => {
869
938
  try {
870
939
  t.stop();
871
940
  } catch {
872
941
  }
873
- }), J.current && (clearTimeout(J.current), J.current = null), Ne(null), j(""), L.current = [];
874
- }, []), kt = async () => {
942
+ }), De.current && (clearTimeout(De.current), De.current = null), ne(null), $e(""), _e.current = [];
943
+ }, []), Wt = async () => {
875
944
  try {
876
- const e = await navigator.mediaDevices.getUserMedia({ audio: !0 }), t = window.AudioContext || window.webkitAudioContext, i = new t(), l = i.createMediaStreamSource(e), r = i.createAnalyser();
877
- r.fftSize = 64, l.connect(r), he.current = i, ye.current = l, Xe(r);
945
+ const e = await navigator.mediaDevices.getUserMedia({ audio: !0 }), t = window.AudioContext || window.webkitAudioContext, s = new t(), o = s.createMediaStreamSource(e), n = s.createAnalyser();
946
+ n.fftSize = 64, o.connect(n), me.current = s, Te.current = o, it(n);
878
947
  const a = new MediaRecorder(e);
879
- ce.current = a, Pe.current = [], a.ondataavailable = (w) => {
880
- w.data.size > 0 && Pe.current.push(w.data);
948
+ de.current = a, Ge.current = [], a.ondataavailable = (p) => {
949
+ p.data.size > 0 && Ge.current.push(p.data);
881
950
  }, a.onstop = async () => {
882
- const w = Date.now() - ot.current;
883
- if (Xe(null), ye.current && (ye.current.disconnect(), ye.current = null), he.current && he.current.state !== "closed" && (he.current.close(), he.current = null), w < 1e3) {
884
- _("Recording too short. Hold or click longer."), O(!1);
951
+ const p = Date.now() - St.current;
952
+ if (it(null), Te.current && (Te.current.disconnect(), Te.current = null), me.current && me.current.state !== "closed" && (me.current.close(), me.current = null), p < 1e3) {
953
+ _("Recording too short. Hold or click longer."), m(!1);
885
954
  return;
886
955
  }
887
- const T = new Blob(Pe.current, {
956
+ const R = new Blob(Ge.current, {
888
957
  type: "audio/wav"
889
958
  });
890
- await Tt(T);
891
- }, ot.current = Date.now(), a.start(100), ze(!0), _("Listening...");
959
+ await jt(R);
960
+ }, St.current = Date.now(), a.start(100), rt(!0), _("Listening...");
892
961
  } catch (e) {
893
962
  console.error("Error accessing microphone:", e), _("Mic Access Error");
894
963
  }
895
- }, Rt = () => {
896
- ce.current && ce.current.state !== "inactive" && (ce.current.stop(), ce.current.stream.getTracks().forEach((e) => e.stop()), ze(!1));
897
- }, At = () => {
898
- ce.current && ce.current.state !== "inactive" && (ce.current.onstop = null, ce.current.stop(), ce.current.stream.getTracks().forEach((e) => e.stop()), Xe(null), ye.current && (ye.current.disconnect(), ye.current = null), he.current && he.current.state !== "closed" && (he.current.close(), he.current = null), ze(!1), Pe.current = [], _("Ready"));
964
+ }, Vt = () => {
965
+ de.current && de.current.state !== "inactive" && (de.current.stop(), de.current.stream.getTracks().forEach((e) => e.stop()), rt(!1));
966
+ }, Ht = () => {
967
+ de.current && de.current.state !== "inactive" && (de.current.onstop = null, de.current.stop(), de.current.stream.getTracks().forEach((e) => e.stop()), it(null), Te.current && (Te.current.disconnect(), Te.current = null), me.current && me.current.state !== "closed" && (me.current.close(), me.current = null), rt(!1), Ge.current = [], _("Ready"));
899
968
  };
900
- H(() => {
901
- if (!M) return;
969
+ P(() => {
970
+ if (!Y) return;
902
971
  const e = () => {
903
- const t = G.current;
972
+ const t = ve.current;
904
973
  if (t <= 0) return;
905
- const i = $.current, l = b.current;
906
- if (!i) return;
907
- const r = i.currentTime - l, a = Math.min(Math.max(0, r), t), w = pe.trim().length;
908
- if (w <= 0) return;
909
- const T = Math.min(
910
- Math.round(a / t * w),
911
- w
974
+ const s = y.current, o = we.current;
975
+ if (!s) return;
976
+ const n = s.currentTime - o, a = Math.min(Math.max(0, n), t), p = ae.trim().length;
977
+ if (p <= 0) return;
978
+ const R = Math.min(
979
+ Math.round(a / t * p),
980
+ p
912
981
  );
913
- Ue(T);
982
+ u(R);
914
983
  };
915
- return clearInterval(Ie.current ?? void 0), Ie.current = setInterval(e, 90), () => clearInterval(Ie.current ?? void 0);
916
- }, [M, pe, G.current]), H(() => {
984
+ return clearInterval(i.current ?? void 0), i.current = setInterval(e, 90), () => clearInterval(i.current ?? void 0);
985
+ }, [Y, ae, ve.current]), P(() => {
917
986
  let e;
918
- return Ge ? (Ye(0), e = window.setInterval(() => {
919
- Ye((t) => t + 1);
920
- }, 1e3)) : Ye(0), () => clearInterval(e);
921
- }, [Ge]);
922
- const Lt = (e) => {
923
- const t = e.numberOfChannels, i = e.length * t * 2 + 44, l = new ArrayBuffer(i), r = new DataView(l);
987
+ return nt ? (st(0), e = window.setInterval(() => {
988
+ st((t) => t + 1);
989
+ }, 1e3)) : st(0), () => clearInterval(e);
990
+ }, [nt]);
991
+ const $t = (e) => {
992
+ const t = e.numberOfChannels, s = e.length * t * 2 + 44, o = new ArrayBuffer(s), n = new DataView(o);
924
993
  let a = 0;
925
- const w = (C) => {
926
- r.setUint16(a, C, !0), a += 2;
927
- }, T = (C) => {
928
- r.setUint32(a, C, !0), a += 4;
994
+ const p = (O) => {
995
+ n.setUint16(a, O, !0), a += 2;
996
+ }, R = (O) => {
997
+ n.setUint32(a, O, !0), a += 4;
929
998
  };
930
- T(1179011410), T(i - 8), T(1163280727), T(544501094), T(16), w(1), w(t), T(e.sampleRate), T(e.sampleRate * 2 * t), w(t * 2), w(16), T(1635017060), T(i - a - 4);
931
- const N = [];
932
- for (let C = 0; C < t; C++) N.push(e.getChannelData(C));
999
+ R(1179011410), R(s - 8), R(1163280727), R(544501094), R(16), p(1), p(t), R(e.sampleRate), R(e.sampleRate * 2 * t), p(t * 2), p(16), R(1635017060), R(s - a - 4);
1000
+ const S = [];
1001
+ for (let O = 0; O < t; O++) S.push(e.getChannelData(O));
933
1002
  let x = 0;
934
- for (; a < i; ) {
935
- for (let C = 0; C < t; C++) {
936
- let B = Math.max(-1, Math.min(1, N[C][x]));
937
- B = B < 0 ? B * 32768 : B * 32767, r.setInt16(a, B, !0), a += 2;
1003
+ for (; a < s; ) {
1004
+ for (let O = 0; O < t; O++) {
1005
+ let H = Math.max(-1, Math.min(1, S[O][x]));
1006
+ H = H < 0 ? H * 32768 : H * 32767, n.setInt16(a, H, !0), a += 2;
938
1007
  }
939
1008
  x++;
940
1009
  }
941
- return new Blob([l], { type: "audio/wav" });
942
- }, Ke = async (e, t, i = !1) => {
943
- if (!ne.current) {
944
- if (me.current) {
945
- ae.current.push({
1010
+ return new Blob([o], { type: "audio/wav" });
1011
+ }, ot = async (e, t, s = !1) => {
1012
+ if (!ke.current) {
1013
+ if (W.current) {
1014
+ M.current.push({
946
1015
  audio: e,
947
1016
  visemes: t,
948
- isNewSegment: i
1017
+ isNewSegment: s
949
1018
  });
950
1019
  return;
951
1020
  }
952
- me.current = !0;
1021
+ W.current = !0;
953
1022
  try {
954
- const l = window.AudioContext || window.webkitAudioContext, r = $.current ?? new l();
955
- r.state === "suspended" && await r.resume(), $.current = r;
956
- const a = window.atob(e), w = new Uint8Array(a.length);
957
- for (let D = 0; D < a.length; D++)
958
- w[D] = a.charCodeAt(D);
959
- const T = await r.decodeAudioData(w.buffer.slice(0));
960
- G.current += T.duration;
961
- const N = r.currentTime;
962
- let x = Q.current;
963
- const C = !F.current;
964
- x < N && (x = N + 0.1), Q.current = x + T.duration;
965
- const B = r.createBufferSource();
966
- B.buffer = T;
967
- let V = at;
968
- if ((!V || V.context !== r) && (V = r.createAnalyser(), V.fftSize = 64, V.connect(r.destination), St(V)), B.connect(V), L.current.push(B), ne.current) {
969
- L.current = L.current.filter((D) => D !== B);
1023
+ const o = window.AudioContext || window.webkitAudioContext, n = y.current ?? new o();
1024
+ n.state === "suspended" && await n.resume(), y.current = n;
1025
+ const a = window.atob(e), p = new Uint8Array(a.length);
1026
+ for (let F = 0; F < a.length; F++)
1027
+ p[F] = a.charCodeAt(F);
1028
+ const R = await n.decodeAudioData(p.buffer.slice(0));
1029
+ ve.current += R.duration;
1030
+ const S = n.currentTime;
1031
+ let x = le.current;
1032
+ const O = !L.current;
1033
+ x < S && (x = S + 0.1), le.current = x + R.duration;
1034
+ const H = n.createBufferSource();
1035
+ H.buffer = R;
1036
+ let j = xt;
1037
+ if ((!j || j.context !== n) && (j = n.createAnalyser(), j.fftSize = 64, j.connect(n.destination), Bt(j)), H.connect(j), _e.current.push(H), ke.current) {
1038
+ _e.current = _e.current.filter((F) => F !== H);
970
1039
  return;
971
1040
  }
972
- if (C) {
973
- F.current = !0, ue(!0), W(
1041
+ if (O) {
1042
+ L.current = !0, $(!0), B(
974
1043
  `[AUDIO] setIsSpeaking(true) - First chunk starting at ${x.toFixed(
975
1044
  3
976
1045
  )}`
977
- ), b.current = x;
978
- const D = (x - N) * 1e3;
979
- q.current = performance.now() + D, W(
1046
+ ), we.current = x;
1047
+ const F = (x - S) * 1e3;
1048
+ be.current = performance.now() + F, B(
980
1049
  `[AUDIO] Response started. Initial startTime: ${x.toFixed(
981
1050
  3
982
- )}, CT: ${N.toFixed(3)}`
1051
+ )}, CT: ${S.toFixed(3)}`
983
1052
  );
984
1053
  }
985
- B.start(x);
986
- const K = (x - b.current) * 1e3;
987
- i && (de.current = K, W(
988
- `[AUDIO] New segment detected at +${K.toFixed(
1054
+ H.start(x);
1055
+ const X = (x - we.current) * 1e3;
1056
+ s && (Ne.current = X, B(
1057
+ `[AUDIO] New segment detected at +${X.toFixed(
989
1058
  0
990
1059
  )}ms. Resetting segment offset.`
991
- )), t.forEach((D, re) => {
992
- const E = D.symbol ?? "";
993
- if (E) {
994
- const se = Zt(E), le = Math.round(D.start * 1e3), Se = Math.round((D.duration ?? 0) * 1e3), ut = de.current + le;
995
- re < 3 && W(
996
- `[AUDIO] Viseme "${E}": segment_relative=${le}ms, segment_offset=${de.current.toFixed(
1060
+ )), t.forEach((F, se) => {
1061
+ const D = F.symbol ?? "";
1062
+ if (D) {
1063
+ const ie = bn(D), fe = Math.round(F.start * 1e3), Ee = Math.round((F.duration ?? 0) * 1e3), At = Ne.current + fe;
1064
+ se < 3 && B(
1065
+ `[AUDIO] Viseme "${D}": segment_relative=${fe}ms, segment_offset=${Ne.current.toFixed(
997
1066
  0
998
- )}ms => vtime=${ut}ms`
999
- ), se.forEach((dt) => {
1000
- m.current.push({
1001
- viseme: dt.v,
1002
- weight: dt.w,
1003
- vtime: ut,
1004
- vduration: Se
1067
+ )}ms => vtime=${At}ms`
1068
+ ), ie.forEach((Lt) => {
1069
+ v.current.push({
1070
+ viseme: Lt.v,
1071
+ weight: Lt.w,
1072
+ vtime: At,
1073
+ vduration: Ee
1005
1074
  });
1006
1075
  });
1007
1076
  }
1008
1077
  }), _("Speaking...");
1009
1078
  } finally {
1010
- if (me.current = !1, ae.current.length > 0) {
1011
- const l = ae.current.shift();
1012
- l && Ke(l.audio, l.visemes, l.isNewSegment);
1079
+ if (W.current = !1, M.current.length > 0) {
1080
+ const o = M.current.shift();
1081
+ o && ot(o.audio, o.visemes, o.isNewSegment);
1013
1082
  }
1014
1083
  }
1015
1084
  }
1016
- }, Tt = async (e) => {
1085
+ }, jt = async (e) => {
1017
1086
  try {
1018
- O(!0), Me.current = "", oe(""), _("Processing Voice...");
1019
- const t = await e.arrayBuffer(), l = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(t), r = Lt(l), a = new FileReader();
1020
- a.readAsDataURL(r), a.onloadend = async () => {
1021
- const w = a.result.split(",")[1];
1022
- Ve(), R(""), fe.current = "", Te.current = !1;
1023
- const T = `${ht}/stt?token=${encodeURIComponent(
1024
- p
1025
- )}`, N = await fetch(T, {
1087
+ m(!0), We(!1), Oe.current = "", N(""), _("Processing Voice...");
1088
+ const t = await e.arrayBuffer(), o = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(t), n = $t(o), a = new FileReader();
1089
+ a.readAsDataURL(n), a.onloadend = async () => {
1090
+ const p = a.result.split(",")[1];
1091
+ ze(), ee(""), he.current = "", Ce.current = !1;
1092
+ const R = `${lt}/stt?token=${encodeURIComponent(
1093
+ T
1094
+ )}`, S = await fetch(R, {
1026
1095
  method: "POST",
1027
1096
  headers: { "Content-Type": "application/json" },
1028
1097
  body: JSON.stringify({
1029
- audio_base64: w,
1098
+ audio_base64: p,
1030
1099
  audio_format: "wav"
1031
1100
  })
1032
1101
  });
1033
- if (N.status === 429) {
1102
+ if (S.status === 429) {
1034
1103
  try {
1035
- const re = await N.text(), E = JSON.parse(re);
1036
- W("[STT] 429 agent at capacity:", E?.detail);
1104
+ const se = await S.text(), D = JSON.parse(se);
1105
+ B("[STT] 429 agent at capacity:", D?.detail);
1037
1106
  } catch {
1038
1107
  }
1039
- R(""), _("Busy"), O(!1);
1108
+ ee(""), _("Busy"), m(!1);
1040
1109
  return;
1041
1110
  }
1042
- if (!N.ok) {
1043
- const re = await N.text();
1044
- let E = "STT Failed";
1111
+ if (!S.ok) {
1112
+ const se = await S.text();
1113
+ let D = "STT Failed";
1045
1114
  try {
1046
- E = JSON.parse(re).error || E;
1115
+ D = JSON.parse(se).error || D;
1047
1116
  } catch {
1048
- re && (E = re.slice(0, 200));
1117
+ se && (D = se.slice(0, 200));
1049
1118
  }
1050
- throw new Error(E);
1119
+ throw new Error(D);
1051
1120
  }
1052
- const x = N.body;
1053
- if (W("this is body" + x), !x) {
1054
- _("STT Failed"), O(!1);
1121
+ const x = S.body;
1122
+ if (B("this is body" + x), !x) {
1123
+ _("STT Failed"), m(!1);
1055
1124
  return;
1056
1125
  }
1057
- const C = x.getReader();
1058
- ne.current = !1;
1059
- const B = new TextDecoder();
1060
- let V = "", K = !1;
1061
- const D = async (re, E) => {
1062
- switch (re) {
1126
+ const O = x.getReader();
1127
+ ke.current = !1;
1128
+ const H = new TextDecoder();
1129
+ let j = "", X = !1;
1130
+ const F = async (se, D) => {
1131
+ switch (se) {
1063
1132
  case "transcript":
1064
- E.transcript != null && R(String(E.transcript));
1133
+ D.transcript != null && ee(String(D.transcript));
1065
1134
  break;
1066
1135
  case "text": {
1067
- const se = E.delta ?? E.text ?? "";
1068
- se && rt(se);
1136
+ const ie = D.delta ?? D.text ?? "";
1137
+ ie && wt(ie);
1069
1138
  break;
1070
1139
  }
1071
1140
  case "audio": {
1072
- const se = E.chunk, le = E.visemes ?? [], Se = !!E.is_new_segment;
1073
- se && await Ke(se, le, Se);
1141
+ const ie = D.chunk, fe = D.visemes ?? [], Ee = !!D.is_new_segment;
1142
+ ie && await ot(ie, fe, Ee);
1074
1143
  break;
1075
1144
  }
1076
1145
  case "done": {
1077
- K = !0, _("Ready"), O(!1);
1146
+ X = !0, _("Ready"), m(!1);
1078
1147
  break;
1079
1148
  }
1080
1149
  case "error": {
1081
- K = !0, _("STT Failed"), O(!1);
1150
+ X = !0, _("STT Failed"), m(!1);
1082
1151
  break;
1083
1152
  }
1084
1153
  default:
@@ -1086,172 +1155,180 @@ const rn = ({
1086
1155
  }
1087
1156
  };
1088
1157
  for (; ; ) {
1089
- const { done: re, value: E } = await C.read();
1090
- E && (V += B.decode(E, { stream: !0 }));
1091
- const se = V.split(`
1158
+ const { done: se, value: D } = await O.read();
1159
+ D && (j += H.decode(D, { stream: !0 }));
1160
+ const ie = j.split(`
1092
1161
 
1093
1162
  `);
1094
- V = se.pop() ?? "";
1095
- for (const le of se) {
1096
- const Se = He(le);
1097
- Se && await D(Se.event, Se.data);
1163
+ j = ie.pop() ?? "";
1164
+ for (const fe of ie) {
1165
+ const Ee = Ye(fe);
1166
+ Ee && await F(Ee.event, Ee.data);
1098
1167
  }
1099
- if (re) {
1100
- if (V.trim()) {
1101
- const le = He(V.trim());
1102
- le && await D(le.event, le.data);
1168
+ if (se) {
1169
+ if (j.trim()) {
1170
+ const fe = Ye(j.trim());
1171
+ fe && await F(fe.event, fe.data);
1103
1172
  }
1104
- K || (_("Ready"), O(!1));
1173
+ X || (_("Ready"), m(!1));
1105
1174
  break;
1106
1175
  }
1107
1176
  }
1108
1177
  };
1109
1178
  } catch (t) {
1110
- console.error("Audio Submission Error:", t), _("STT Failed"), O(!1);
1179
+ console.error("Audio Submission Error:", t), _("STT Failed"), m(!1);
1111
1180
  }
1112
- }, Mt = async (e) => {
1113
- e && e.preventDefault(), Me.current = "", oe(""), !(!I || ee) && await Et(I);
1114
- }, He = (e) => {
1181
+ }, Jt = async (e) => {
1182
+ e && e.preventDefault(), We(!1), Oe.current = "", N(""), !(!E || ce) && await qt(E);
1183
+ }, Ye = (e) => {
1115
1184
  const t = e.split(/\r?\n/);
1116
- let i = "", l = "";
1185
+ let s = "", o = "";
1117
1186
  for (const a of t)
1118
- a.startsWith("event:") ? i = a.slice(6).trim() : a.startsWith("data:") && (l = a.slice(5).trim());
1119
- if (!i) return null;
1120
- let r = {};
1121
- if (l)
1187
+ a.startsWith("event:") ? s = a.slice(6).trim() : a.startsWith("data:") && (o = a.slice(5).trim());
1188
+ if (!s) return null;
1189
+ let n = {};
1190
+ if (o)
1122
1191
  try {
1123
- r = JSON.parse(l);
1192
+ n = JSON.parse(o);
1124
1193
  } catch {
1125
- r = { raw: l };
1194
+ n = { raw: o };
1126
1195
  }
1127
- return { event: i, data: r };
1128
- }, ct = (e, t) => {
1196
+ return { event: s, data: n };
1197
+ }, kt = (e, t) => {
1129
1198
  switch (e) {
1130
1199
  case "connected":
1131
- fe.current = "", Te.current = !1;
1200
+ he.current = "", Ce.current = !1;
1132
1201
  break;
1133
1202
  case "text": {
1134
- const i = t.delta ?? "";
1135
- i && rt(i);
1203
+ const s = t.delta ?? "";
1204
+ s && wt(s);
1136
1205
  break;
1137
1206
  }
1138
1207
  case "audio": {
1139
- const i = t.chunk, l = t.visemes ?? [];
1140
- i && Ke(i, l);
1208
+ const s = t.chunk, o = t.visemes ?? [];
1209
+ s && ot(s, o);
1141
1210
  break;
1142
1211
  }
1143
1212
  case "done": {
1144
- const i = st(), l = Me.current.trim(), r = [
1145
- ...i,
1146
- { role: "user", content: I || "..." },
1147
- { role: "assistant", content: l }
1213
+ const s = vt(), o = Oe.current.trim(), n = [
1214
+ ...s,
1215
+ { role: "user", content: E || "..." },
1216
+ { role: "assistant", content: o }
1148
1217
  ];
1149
- yt(r), S.current = [...m.current], _("Ready"), O(!1), R("");
1218
+ Ut(n), Ie.current = [...v.current], _("Ready"), m(!1), ee("");
1150
1219
  break;
1151
1220
  }
1152
1221
  case "error": {
1153
- const i = t.message ?? "Unknown error";
1154
- Me.current = i, oe(i), _("Agent Failed"), O(!1);
1222
+ const s = t.message ?? "Unknown error";
1223
+ Oe.current = s, N(s), _("Agent Failed"), m(!1);
1155
1224
  break;
1156
1225
  }
1157
1226
  }
1158
- }, Et = async (e) => {
1159
- O(!0), _("Thinking..."), Me.current = "", fe.current = "", Te.current = !1, Ve(), G.current = 0, Ue(0);
1160
- const t = `${ht}/agent/chat?token=${encodeURIComponent(
1161
- p
1227
+ }, qt = async (e) => {
1228
+ m(!0), _("Thinking..."), Oe.current = "", he.current = "", Ce.current = !1, ze(), ve.current = 0, u(0);
1229
+ const t = `${lt}/agent/chat?token=${encodeURIComponent(
1230
+ T
1162
1231
  )}`;
1163
1232
  try {
1164
- const i = st();
1165
- let l = sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID");
1166
- l || (Pt(
1233
+ const s = vt();
1234
+ let o = sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID");
1235
+ o || (nn(
1167
1236
  "[CHAT] Session UID missing at send time! Generating emergency backup."
1168
- ), l = "emergency-" + Math.random().toString(36).substring(7), sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", l));
1169
- const r = {
1170
- history: i,
1237
+ ), o = "emergency-" + Math.random().toString(36).substring(7), sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", o));
1238
+ const n = {
1239
+ history: s,
1171
1240
  question: e,
1172
- lead_id: l
1241
+ lead_id: o
1173
1242
  };
1174
- W("[CHAT] Sending payload:", r);
1243
+ B("[CHAT] Sending payload:", n);
1175
1244
  const a = await fetch(t, {
1176
1245
  method: "POST",
1177
1246
  headers: {
1178
1247
  "Content-Type": "application/json"
1179
1248
  },
1180
- body: JSON.stringify(r),
1249
+ body: JSON.stringify(n),
1181
1250
  cache: "default"
1182
1251
  });
1183
1252
  if (a.status === 429) {
1184
1253
  try {
1185
- const C = await a.json();
1186
- W("[CHAT] 429 agent at capacity:", C?.detail);
1254
+ const O = await a.json();
1255
+ B("[CHAT] 429 agent at capacity:", O?.detail);
1187
1256
  } catch {
1188
1257
  }
1189
- R(""), _("Busy"), O(!1);
1258
+ ee(""), _("Busy"), m(!1);
1190
1259
  return;
1191
1260
  }
1192
1261
  if (!a.ok)
1193
1262
  throw new Error("Agent request failed");
1194
- const w = a.body;
1195
- if (!w) {
1196
- _("Agent Failed"), O(!1);
1263
+ const p = a.body;
1264
+ if (!p) {
1265
+ _("Agent Failed"), m(!1);
1197
1266
  return;
1198
1267
  }
1199
- const T = w.getReader();
1200
- ne.current = !1;
1201
- const N = new TextDecoder();
1268
+ const R = p.getReader();
1269
+ ke.current = !1;
1270
+ const S = new TextDecoder();
1202
1271
  let x = "";
1203
1272
  for (; ; ) {
1204
- const { done: C, value: B } = await T.read();
1205
- W(
1206
- `[SSE] Chunk received. done=${C}, length=${B?.length || 0}`
1207
- ), B && (x += N.decode(B, { stream: !0 }));
1208
- const V = x.split(`
1273
+ const { done: O, value: H } = await R.read();
1274
+ B(
1275
+ `[SSE] Chunk received. done=${O}, length=${H?.length || 0}`
1276
+ ), H && (x += S.decode(H, { stream: !0 }));
1277
+ const j = x.split(`
1209
1278
 
1210
1279
  `);
1211
- x = V.pop() ?? "";
1212
- for (const K of V) {
1213
- W(`[SSE] Processing block: ${K.slice(0, 50)}...`);
1214
- const D = He(K);
1215
- D && (W(`[SSE] Event: ${D.event}`), ct(D.event, D.data));
1280
+ x = j.pop() ?? "";
1281
+ for (const X of j) {
1282
+ B(`[SSE] Processing block: ${X.slice(0, 50)}...`);
1283
+ const F = Ye(X);
1284
+ F && (B(`[SSE] Event: ${F.event}`), kt(F.event, F.data));
1216
1285
  }
1217
- if (C) {
1218
- if (W("[SSE] Stream finished"), x.trim()) {
1219
- const K = He(x.trim());
1220
- K && ct(K.event, K.data);
1286
+ if (O) {
1287
+ if (B("[SSE] Stream finished"), x.trim()) {
1288
+ const X = Ye(x.trim());
1289
+ X && kt(X.event, X.data);
1221
1290
  }
1222
- _("Ready"), O(!1), R("");
1291
+ _("Ready"), m(!1), ee("");
1223
1292
  break;
1224
1293
  }
1225
1294
  }
1226
- } catch (i) {
1227
- console.error("Chat Error:", i), _("Agent Failed"), O(!1);
1295
+ } catch (s) {
1296
+ console.error("Chat Error:", s), _("Agent Failed"), m(!1);
1228
1297
  }
1229
- }, lt = pe.trim(), Qe = lt && M ? lt.slice(
1298
+ }, Rt = ae.trim(), at = Rt && Y ? Rt.slice(
1230
1299
  0,
1231
- ke != null && ke > 0 ? ke : 0
1300
+ d != null && d > 0 ? d : 0
1232
1301
  ) : "";
1233
- H(() => {
1234
- const e = qe.current;
1235
- e !== "exiting" && (Qe ? (gt(Qe), e === "hidden" && We("entering")) : (e === "visible" || e === "entering") && We("exiting"));
1236
- }, [Qe, Z]);
1237
- const It = $e(() => {
1238
- const e = qe.current;
1239
- e === "entering" ? We("visible") : e === "exiting" && We("hidden");
1302
+ P(() => {
1303
+ const e = Ze.current;
1304
+ e !== "exiting" && (at ? (Dt(at), e === "hidden" && Je("entering")) : (e === "visible" || e === "entering") && Je("exiting"));
1305
+ }, [at, ue]);
1306
+ const Gt = Qe(() => {
1307
+ const e = Ze.current;
1308
+ e === "entering" ? Je("visible") : e === "exiting" && Je("hidden");
1240
1309
  }, []);
1241
- return Nt(() => {
1242
- const e = Le.current;
1310
+ return Zt(() => {
1311
+ const e = ht.current;
1243
1312
  e && (e.scrollTop = e.scrollHeight);
1244
- }, [nt]), /* @__PURE__ */ ie("div", { className: "avatar-widget-container", children: [
1245
- /* @__PURE__ */ ie("div", { className: "avatar-input-area", children: [
1246
- be !== "hidden" ? /* @__PURE__ */ c(
1313
+ }, [mt]), /* @__PURE__ */ oe("div", { className: "avatar-widget-container", children: [
1314
+ /* @__PURE__ */ oe("div", { className: "avatar-input-area", children: [
1315
+ te !== "hidden" ? /* @__PURE__ */ l(
1247
1316
  "div",
1248
1317
  {
1249
- className: `avatar-thinking-tab${be === "exiting" ? " avatar-thinking-tab--exiting" : be === "entering" ? " avatar-thinking-tab--entering" : ""}`,
1250
- onAnimationEnd: bt,
1251
- children: Ce
1318
+ className: `avatar-thinking-tab${te === "exiting" ? " avatar-thinking-tab--exiting" : te === "entering" ? " avatar-thinking-tab--entering" : ""}`,
1319
+ onAnimationEnd: Ct,
1320
+ children: Le === It ? /* @__PURE__ */ l(
1321
+ "a",
1322
+ {
1323
+ href: "https://leads.streamoji.com",
1324
+ target: "_blank",
1325
+ rel: "noopener noreferrer",
1326
+ children: "Made by Streamoji Leads"
1327
+ }
1328
+ ) : Le
1252
1329
  }
1253
1330
  ) : null,
1254
- /* @__PURE__ */ c("div", { className: "avatar-input-container", children: /* @__PURE__ */ c(
1331
+ /* @__PURE__ */ l("div", { className: "avatar-input-container", children: /* @__PURE__ */ l(
1255
1332
  "div",
1256
1333
  {
1257
1334
  style: {
@@ -1260,15 +1337,15 @@ const rn = ({
1260
1337
  width: "100%",
1261
1338
  height: "100%"
1262
1339
  },
1263
- children: Ge ? /* @__PURE__ */ ie("div", { className: "avatar-input-recording", children: [
1264
- /* @__PURE__ */ c(
1340
+ children: nt ? /* @__PURE__ */ oe("div", { className: "avatar-input-recording", children: [
1341
+ /* @__PURE__ */ l(
1265
1342
  "button",
1266
1343
  {
1267
1344
  type: "button",
1268
1345
  className: "avatar-recording-cancel",
1269
- onClick: At,
1346
+ onClick: Ht,
1270
1347
  title: "Cancel",
1271
- children: /* @__PURE__ */ ie(
1348
+ children: /* @__PURE__ */ oe(
1272
1349
  "svg",
1273
1350
  {
1274
1351
  width: "18",
@@ -1281,14 +1358,14 @@ const rn = ({
1281
1358
  strokeLinejoin: "round",
1282
1359
  style: { display: "block" },
1283
1360
  children: [
1284
- /* @__PURE__ */ c("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1285
- /* @__PURE__ */ c("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1361
+ /* @__PURE__ */ l("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1362
+ /* @__PURE__ */ l("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1286
1363
  ]
1287
1364
  }
1288
1365
  )
1289
1366
  }
1290
1367
  ),
1291
- /* @__PURE__ */ ie(
1368
+ /* @__PURE__ */ oe(
1292
1369
  "div",
1293
1370
  {
1294
1371
  style: {
@@ -1300,8 +1377,8 @@ const rn = ({
1300
1377
  minWidth: 0
1301
1378
  },
1302
1379
  children: [
1303
- /* @__PURE__ */ c("div", { style: { flex: 1, height: "100%" }, children: /* @__PURE__ */ c(ft, { analyser: xt }) }),
1304
- /* @__PURE__ */ ie(
1380
+ /* @__PURE__ */ l("div", { style: { flex: 1, height: "100%" }, children: /* @__PURE__ */ l(Tt, { analyser: Pt }) }),
1381
+ /* @__PURE__ */ oe(
1305
1382
  "span",
1306
1383
  {
1307
1384
  style: {
@@ -1314,23 +1391,23 @@ const rn = ({
1314
1391
  fontVariantNumeric: "tabular-nums"
1315
1392
  },
1316
1393
  children: [
1317
- Math.floor(it / 60),
1394
+ Math.floor(yt / 60),
1318
1395
  ":",
1319
- String(it % 60).padStart(2, "0")
1396
+ String(yt % 60).padStart(2, "0")
1320
1397
  ]
1321
1398
  }
1322
1399
  )
1323
1400
  ]
1324
1401
  }
1325
1402
  ),
1326
- /* @__PURE__ */ c(
1403
+ /* @__PURE__ */ l(
1327
1404
  "button",
1328
1405
  {
1329
1406
  type: "button",
1330
1407
  className: "avatar-recording-confirm",
1331
- onClick: Rt,
1408
+ onClick: Vt,
1332
1409
  title: "Send",
1333
- children: /* @__PURE__ */ c(
1410
+ children: /* @__PURE__ */ l(
1334
1411
  "svg",
1335
1412
  {
1336
1413
  width: "18",
@@ -1342,13 +1419,13 @@ const rn = ({
1342
1419
  strokeLinecap: "round",
1343
1420
  strokeLinejoin: "round",
1344
1421
  style: { display: "block" },
1345
- children: /* @__PURE__ */ c("polyline", { points: "20 6 9 17 4 12" })
1422
+ children: /* @__PURE__ */ l("polyline", { points: "20 6 9 17 4 12" })
1346
1423
  }
1347
1424
  )
1348
1425
  }
1349
1426
  )
1350
- ] }) : M ? /* @__PURE__ */ ie("div", { className: "avatar-input-speaking", children: [
1351
- /* @__PURE__ */ c(
1427
+ ] }) : Y && !tt ? /* @__PURE__ */ oe("div", { className: "avatar-input-speaking", children: [
1428
+ /* @__PURE__ */ l(
1352
1429
  "div",
1353
1430
  {
1354
1431
  style: {
@@ -1358,20 +1435,20 @@ const rn = ({
1358
1435
  alignItems: "center",
1359
1436
  paddingRight: "8px"
1360
1437
  },
1361
- children: /* @__PURE__ */ c(ft, { analyser: at })
1438
+ children: /* @__PURE__ */ l(Tt, { analyser: xt })
1362
1439
  }
1363
1440
  ),
1364
- /* @__PURE__ */ c(
1441
+ /* @__PURE__ */ l(
1365
1442
  "button",
1366
1443
  {
1367
1444
  type: "button",
1368
1445
  className: "avatar-speaking-stop",
1369
- onClick: () => Ve(!0),
1446
+ onClick: () => ze(!0),
1370
1447
  title: "Stop",
1371
- children: /* @__PURE__ */ c("span", { className: "avatar-speaking-stop__icon", "aria-hidden": !0 })
1448
+ children: /* @__PURE__ */ l("span", { className: "avatar-speaking-stop__icon", "aria-hidden": !0 })
1372
1449
  }
1373
1450
  )
1374
- ] }) : ee ? /* @__PURE__ */ c(
1451
+ ] }) : ce ? /* @__PURE__ */ l(
1375
1452
  "div",
1376
1453
  {
1377
1454
  style: {
@@ -1381,12 +1458,12 @@ const rn = ({
1381
1458
  alignItems: "center",
1382
1459
  justifyContent: "center"
1383
1460
  },
1384
- children: /* @__PURE__ */ c("div", { className: "avatar-input-loader" })
1461
+ children: /* @__PURE__ */ l("div", { className: "avatar-input-loader" })
1385
1462
  }
1386
- ) : /* @__PURE__ */ ie(
1463
+ ) : /* @__PURE__ */ oe(
1387
1464
  "form",
1388
1465
  {
1389
- onSubmit: Mt,
1466
+ onSubmit: Jt,
1390
1467
  style: {
1391
1468
  flex: 1,
1392
1469
  display: "flex",
@@ -1394,20 +1471,20 @@ const rn = ({
1394
1471
  alignItems: "center"
1395
1472
  },
1396
1473
  children: [
1397
- /* @__PURE__ */ c(
1474
+ /* @__PURE__ */ l(
1398
1475
  "input",
1399
1476
  {
1400
1477
  id: "avatar-text-input",
1401
1478
  type: "text",
1402
- value: I,
1403
- onChange: (e) => R(e.target.value),
1404
- placeholder: y === "Busy" ? "Assisting another user" : "Ask me anything",
1405
- disabled: ee || y === "Busy",
1479
+ value: E,
1480
+ onChange: (e) => ee(e.target.value),
1481
+ placeholder: U === "Busy" ? "Assisting another user" : He || "Ask me anything",
1482
+ disabled: ce || U === "Busy",
1406
1483
  autoComplete: "off",
1407
1484
  style: { width: "100%", height: "100%" }
1408
1485
  }
1409
1486
  ),
1410
- y === "Busy" ? /* @__PURE__ */ c(
1487
+ U === "Busy" ? /* @__PURE__ */ l(
1411
1488
  "button",
1412
1489
  {
1413
1490
  type: "button",
@@ -1415,7 +1492,7 @@ const rn = ({
1415
1492
  disabled: !0,
1416
1493
  style: { backgroundColor: "#1e4a5e" },
1417
1494
  title: "Agent at capacity",
1418
- children: /* @__PURE__ */ c(
1495
+ children: /* @__PURE__ */ l(
1419
1496
  "svg",
1420
1497
  {
1421
1498
  width: "24",
@@ -1424,7 +1501,7 @@ const rn = ({
1424
1501
  fill: "none",
1425
1502
  xmlns: "http://www.w3.org/2000/svg",
1426
1503
  "aria-hidden": "true",
1427
- children: /* @__PURE__ */ c(
1504
+ children: /* @__PURE__ */ l(
1428
1505
  "path",
1429
1506
  {
1430
1507
  d: "M4 2L20 2L12 10L4 2z M12 14L4 22L20 22L12 14z",
@@ -1434,15 +1511,15 @@ const rn = ({
1434
1511
  }
1435
1512
  )
1436
1513
  }
1437
- ) : I.trim() === "" ? /* @__PURE__ */ c(
1514
+ ) : E.trim() === "" ? /* @__PURE__ */ l(
1438
1515
  "button",
1439
1516
  {
1440
1517
  type: "button",
1441
1518
  className: "mic-button",
1442
- onClick: kt,
1443
- disabled: ee,
1519
+ onClick: Wt,
1520
+ disabled: ce,
1444
1521
  style: { backgroundColor: "#1e4a5e" },
1445
- children: /* @__PURE__ */ ie(
1522
+ children: /* @__PURE__ */ oe(
1446
1523
  "svg",
1447
1524
  {
1448
1525
  width: "28",
@@ -1451,14 +1528,14 @@ const rn = ({
1451
1528
  fill: "none",
1452
1529
  xmlns: "http://www.w3.org/2000/svg",
1453
1530
  children: [
1454
- /* @__PURE__ */ c(
1531
+ /* @__PURE__ */ l(
1455
1532
  "path",
1456
1533
  {
1457
1534
  d: "M12 14C13.66 14 15 12.66 15 11V5C15 3.34 13.66 2 12 2C10.34 2 9 3.34 9 5V11C9 12.66 10.34 14 12 14Z",
1458
1535
  fill: "white"
1459
1536
  }
1460
1537
  ),
1461
- /* @__PURE__ */ c(
1538
+ /* @__PURE__ */ l(
1462
1539
  "path",
1463
1540
  {
1464
1541
  d: "M17 11C17 13.76 14.76 16 12 16C9.24 16 7 13.76 7 11H5C5 14.53 7.61 17.43 11 17.93V21H13V17.93C16.39 17.43 19 14.53 19 11H17Z",
@@ -1469,15 +1546,15 @@ const rn = ({
1469
1546
  }
1470
1547
  )
1471
1548
  }
1472
- ) : /* @__PURE__ */ c(
1549
+ ) : /* @__PURE__ */ l(
1473
1550
  "button",
1474
1551
  {
1475
1552
  type: "submit",
1476
1553
  className: "mic-button",
1477
- disabled: ee,
1554
+ disabled: ce,
1478
1555
  style: { backgroundColor: "#1e4a5e" },
1479
1556
  title: "Send",
1480
- children: /* @__PURE__ */ c(
1557
+ children: /* @__PURE__ */ l(
1481
1558
  "svg",
1482
1559
  {
1483
1560
  width: 24,
@@ -1485,7 +1562,7 @@ const rn = ({
1485
1562
  viewBox: "0 0 24 24",
1486
1563
  fill: "none",
1487
1564
  "aria-hidden": "true",
1488
- children: /* @__PURE__ */ c(
1565
+ children: /* @__PURE__ */ l(
1489
1566
  "path",
1490
1567
  {
1491
1568
  d: "M19 12H5M19 12L14 17M19 12L14 7",
@@ -1505,22 +1582,22 @@ const rn = ({
1505
1582
  }
1506
1583
  ) })
1507
1584
  ] }),
1508
- /* @__PURE__ */ c("div", { className: "avatar-wrapper", children: /* @__PURE__ */ ie("div", { className: "avatar-scene-wrapper", children: [
1509
- Z !== "hidden" && /* @__PURE__ */ c(
1585
+ /* @__PURE__ */ l("div", { className: "avatar-wrapper", children: /* @__PURE__ */ oe("div", { className: "avatar-scene-wrapper", children: [
1586
+ ue !== "hidden" && /* @__PURE__ */ l(
1510
1587
  "div",
1511
1588
  {
1512
- className: `avatar-bubble${Z === "entering" ? " avatar-bubble--entering" : Z === "exiting" ? " avatar-bubble--exiting" : ""}`,
1513
- onAnimationEnd: It,
1514
- children: /* @__PURE__ */ c("div", { ref: Le, className: "avatar-bubble__content", children: nt })
1589
+ className: `avatar-bubble${ue === "entering" ? " avatar-bubble--entering" : ue === "exiting" ? " avatar-bubble--exiting" : ""}`,
1590
+ onAnimationEnd: Gt,
1591
+ children: /* @__PURE__ */ l("div", { ref: ht, className: `avatar-bubble__content${tt ? " avatar-bubble__content--nudge" : ""}`, children: mt })
1515
1592
  }
1516
1593
  ),
1517
- /* @__PURE__ */ c(
1594
+ /* @__PURE__ */ l(
1518
1595
  "div",
1519
1596
  {
1520
1597
  className: "avatar-canvas-layer",
1521
- style: { width: te, height: te },
1522
- children: /* @__PURE__ */ ie(
1523
- Ot,
1598
+ style: { width: C, height: C },
1599
+ children: /* @__PURE__ */ oe(
1600
+ Qt,
1524
1601
  {
1525
1602
  shadows: !0,
1526
1603
  camera: { position: [0.2, 1.4, 3], fov: 42 },
@@ -1528,28 +1605,30 @@ const rn = ({
1528
1605
  dpr: 1.8,
1529
1606
  style: { pointerEvents: "none", width: "100%", height: "100%" },
1530
1607
  children: [
1531
- /* @__PURE__ */ c(en, { target: zt }),
1532
- /* @__PURE__ */ c("ambientLight", { intensity: 0.7 }),
1533
- /* @__PURE__ */ c("directionalLight", { position: [0, 2, 2], intensity: 1 }),
1534
- /* @__PURE__ */ c(Ct, { preset: "city" }),
1535
- /* @__PURE__ */ c(Wt, { fallback: null, children: U !== null && /* @__PURE__ */ c(
1536
- tn,
1608
+ /* @__PURE__ */ l(_n, { target: fn }),
1609
+ /* @__PURE__ */ l("ambientLight", { intensity: 0.7 }),
1610
+ /* @__PURE__ */ l("directionalLight", { position: [0, 2, 2], intensity: 1 }),
1611
+ /* @__PURE__ */ l(zt, { preset: "city" }),
1612
+ /* @__PURE__ */ l(en, { fallback: null, children: V !== null && /* @__PURE__ */ l(
1613
+ wn,
1537
1614
  {
1538
- avatarUrl: U,
1539
- isPlayingRef: F,
1540
- visemeQueueRef: m,
1541
- audioContextRef: $,
1542
- responseAudioStartTimeRef: b,
1543
- adjustments: Gt,
1544
- mood: f,
1545
- expression: s,
1546
- agentResponse: pe,
1547
- isSpeaking: M,
1548
- nextStartTimeRef: Q,
1549
- stopPlayback: Ve,
1550
- setIsSpeaking: ue,
1551
- expressionUrl: h,
1552
- onExpressionFinished: vt
1615
+ avatarUrl: V,
1616
+ isPlayingRef: L,
1617
+ visemeQueueRef: v,
1618
+ audioContextRef: y,
1619
+ responseAudioStartTimeRef: we,
1620
+ adjustments: dn,
1621
+ mood: r,
1622
+ expression: G,
1623
+ agentResponse: ae,
1624
+ isSpeaking: Y,
1625
+ nextStartTimeRef: le,
1626
+ stopPlayback: ze,
1627
+ setIsSpeaking: $,
1628
+ expressionUrl: Ke,
1629
+ onExpressionFinished: Nt,
1630
+ isNudgeResponse: tt,
1631
+ avatarGender: g
1553
1632
  }
1554
1633
  ) })
1555
1634
  ]
@@ -1559,17 +1638,17 @@ const rn = ({
1559
1638
  )
1560
1639
  ] }) })
1561
1640
  ] });
1562
- }, un = ({
1563
- token: d,
1641
+ }, Ln = ({
1642
+ token: f,
1564
1643
  onNavigationRequested: A
1565
- }) => /* @__PURE__ */ c(
1566
- rn,
1644
+ }) => /* @__PURE__ */ l(
1645
+ yn,
1567
1646
  {
1568
- token: d,
1647
+ token: f,
1569
1648
  onNavigationRequested: A
1570
1649
  }
1571
1650
  );
1572
1651
  export {
1573
- un as AvatarWidget
1652
+ Ln as AvatarWidget
1574
1653
  };
1575
1654
  //# sourceMappingURL=avatar-widget.js.map