@streamoji/avatar-widget 0.4.1 → 0.4.3

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,100 +1,90 @@
1
- import { jsx as d, jsxs as le } from "react/jsx-runtime";
2
- import { useGLTF as mt, Environment as on } from "@react-three/drei";
3
- import { useFrame as an, Canvas as cn, useThree as un } from "@react-three/fiber";
4
- import { memo as ln, useMemo as bt, useRef as a, useState as y, useEffect as W, useCallback as $e, useLayoutEffect as dn, Suspense as hn } from "react";
5
- import * as ze from "three";
6
- import { GLTFLoader as fn } from "three/examples/jsm/loaders/GLTFLoader.js";
7
- const Ye = "https://ai.streamoji.com", B = (...f) => {
8
- }, mn = (...f) => {
9
- }, Nt = ({ analyser: f }) => {
10
- const T = a(null), x = a(null);
1
+ import { jsx as l, jsxs as be } from "react/jsx-runtime";
2
+ import { useGLTF as Mt, Environment as Ln } from "@react-three/drei";
3
+ import { useFrame as vn, Canvas as kn, useThree as Rn } from "@react-three/fiber";
4
+ import { memo as xn, useMemo as Ct, useRef as a, useState as S, useEffect as W, useCallback as et, useLayoutEffect as Tn, Suspense as An } from "react";
5
+ import * as at from "three";
6
+ import { GLTFLoader as En } from "three/examples/jsm/loaders/GLTFLoader.js";
7
+ const tt = "https://ai.streamoji.com", U = (...p) => {
8
+ }, Mn = (...p) => {
9
+ }, zt = ({ analyser: p }) => {
10
+ const E = a(null), w = a(null);
11
11
  return W(() => {
12
- const b = T.current;
13
- if (!b) return;
14
- const S = b.getContext("2d", { alpha: !0 });
15
- if (!S) return;
16
- let H, I = null;
17
- f && (f.fftSize = 128, I = new Uint8Array(f.frequencyBinCount));
18
- const Ue = () => {
19
- H = requestAnimationFrame(Ue), (b.width !== b.offsetWidth || b.height !== b.offsetHeight) && (b.width = b.offsetWidth, b.height = b.offsetHeight);
20
- const se = b.width, R = b.height;
21
- if (se === 0 || R === 0) return;
22
- const we = R / 2;
23
- S.clearRect(0, 0, se, R), S.fillStyle = "#1e293b";
24
- const K = 2, l = K + 2, Q = se * 0.95, g = Math.floor(Q / l);
25
- (!x.current || x.current.length !== g) && (x.current = new Float32Array(g).fill(2));
26
- const ee = g * l, k = (se - ee) / 2;
27
- f && I && f.getByteFrequencyData(I);
28
- const Te = I ? I.length : 0, te = Math.floor(Te * 0.7) / g, Se = new Float32Array(g);
29
- for (let D = 0; D < g; D++) {
30
- let J = 0;
31
- if (I && te > 0) {
32
- const V = Math.floor(D * te), $ = Math.floor((D + 1) * te);
33
- for (let Ee = V; Ee < $; Ee++) {
34
- const U = I[Ee] || 0;
35
- U > J && (J = U);
12
+ const y = E.current;
13
+ if (!y) return;
14
+ const j = y.getContext("2d", { alpha: !0 });
15
+ if (!j) return;
16
+ let Z, ee = null;
17
+ p && (p.fftSize = 128, ee = new Uint8Array(p.frequencyBinCount));
18
+ const nt = () => {
19
+ Z = requestAnimationFrame(nt), (y.width !== y.offsetWidth || y.height !== y.offsetHeight) && (y.width = y.offsetWidth, y.height = y.offsetHeight);
20
+ const Be = y.width, F = y.height;
21
+ if (Be === 0 || F === 0) return;
22
+ const rt = F / 2;
23
+ j.clearRect(0, 0, Be, F), j.fillStyle = "#1e293b";
24
+ const Te = 2, J = Te + 2, Ae = Be * 0.95, q = Math.floor(Ae / J);
25
+ (!w.current || w.current.length !== q) && (w.current = new Float32Array(q).fill(2));
26
+ const se = q * J, M = (Be - se) / 2;
27
+ p && ee && p.getByteFrequencyData(ee);
28
+ const _e = ee ? ee.length : 0, b = Math.floor(_e * 0.7) / q, ae = new Float32Array(q);
29
+ for (let f = 0; f < q; f++) {
30
+ let O = 0;
31
+ if (ee && b > 0) {
32
+ const I = Math.floor(f * b), N = Math.floor((f + 1) * b);
33
+ for (let Y = I; Y < N; Y++) {
34
+ const Q = ee[Y] || 0;
35
+ Q > O && (O = Q);
36
36
  }
37
37
  }
38
- J < 10 && (J = 0);
39
- const Y = J / 255, F = J > 0 ? Math.max(2, Math.pow(Y, 1.4) * R * 0.25) : 2;
40
- Se[D] = F;
38
+ O < 10 && (O = 0);
39
+ const z = O / 255, T = O > 0 ? Math.max(2, Math.pow(z, 1.4) * F * 0.25) : 2;
40
+ ae[f] = T;
41
41
  }
42
- for (let D = 0; D < g; D++) {
43
- const J = g - 1 - D, Y = Math.max(Se[D], Se[J]), F = x.current[D] + (Y - x.current[D]) * 0.3;
44
- x.current[D] = F;
45
- const V = k + D * l, $ = we - F / 2;
46
- S.beginPath(), S.roundRect ? S.roundRect(V, $, K, F, 4) : S.fillRect(V, $, K, F), S.fill();
42
+ for (let f = 0; f < q; f++) {
43
+ const O = q - 1 - f, z = Math.max(ae[f], ae[O]), T = w.current[f] + (z - w.current[f]) * 0.3;
44
+ w.current[f] = T;
45
+ const I = M + f * J, N = rt - T / 2;
46
+ j.beginPath(), j.roundRect ? j.roundRect(I, N, Te, T, 4) : j.fillRect(I, N, Te, T), j.fill();
47
47
  }
48
48
  };
49
- return Ue(), () => {
50
- cancelAnimationFrame(H);
49
+ return nt(), () => {
50
+ cancelAnimationFrame(Z);
51
51
  };
52
- }, [f]), /* @__PURE__ */ d(
52
+ }, [p]), /* @__PURE__ */ l(
53
53
  "canvas",
54
54
  {
55
- ref: T,
55
+ ref: E,
56
56
  style: { width: "100%", height: "100%", display: "block" }
57
57
  }
58
58
  );
59
- }, pn = "https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev", Pt = "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/avatar-blue-suit.glb";
60
- async function gn(f) {
61
- const T = await crypto.subtle.digest(
62
- "SHA-256",
63
- new TextEncoder().encode(f)
64
- );
65
- return Array.from(new Uint8Array(T)).map((x) => x.toString(16).padStart(2, "0")).join("");
66
- }
67
- function bn(f) {
68
- const [T, x] = y(null);
59
+ }, In = "https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev", Yt = "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/avatar-blue-suit.glb";
60
+ function Dn(p) {
61
+ const [E, w] = S(null);
69
62
  return W(() => {
70
- if (!f) {
71
- x(null);
63
+ if (!p) {
64
+ w(null);
72
65
  return;
73
66
  }
74
- let b = !1;
75
- return gn(f).then((S) => {
76
- if (b) return;
77
- const H = `${pn}/${S}.glb`;
78
- fetch(H, { method: "HEAD" }).then((I) => {
79
- b || x(I.ok ? H : Pt);
80
- }).catch(() => {
81
- b || x(Pt);
82
- });
67
+ let y = !1;
68
+ const j = `${In}/${p}.glb`;
69
+ return fetch(j, { method: "HEAD" }).then((Z) => {
70
+ y || w(Z.ok ? j : Yt);
71
+ }).catch(() => {
72
+ y || w(Yt);
83
73
  }), () => {
84
- b = !0;
74
+ y = !0;
85
75
  };
86
- }, [f]), T;
76
+ }, [p]), E;
87
77
  }
88
- const _n = [
78
+ const On = [
89
79
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_001.glb",
90
80
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_002.glb",
91
81
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_002.glb",
92
82
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_005.glb"
93
- ], wn = [
83
+ ], Cn = [
94
84
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_001.glb",
95
85
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb",
96
86
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb"
97
- ], Sn = [
87
+ ], Un = [
98
88
  {
99
89
  id: "m_expr_01",
100
90
  name: "Friendly Wave",
@@ -260,23 +250,23 @@ const _n = [
260
250
  name: "Take It Easy",
261
251
  url: "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_006.glb"
262
252
  }
263
- ], vn = [
253
+ ], Fn = [
264
254
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb",
265
255
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb",
266
256
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_006.glb"
267
- ], yn = [
257
+ ], Nn = [
268
258
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_004.glb",
269
259
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_005.glb",
270
260
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_006.glb",
271
261
  "https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_002.glb"
272
- ], xn = {
262
+ ], Pn = {
273
263
  zoom: 0.85,
274
264
  position: [0.15, -0.8, 0],
275
265
  scale: 1.5,
276
266
  rotation: [0.15, 0.02, 0]
277
- }, Ln = [-0.45, 1.9, 0.1], kn = [-0.45, 1.75, 0.1], Rn = {
267
+ }, Bn = [-0.45, 1.9, 0.1], Wn = [-0.45, 1.75, 0.1], Vn = {
278
268
  browInnerUp: 0.2
279
- }, pt = 0.18, An = 1, Bt = "__branding__", nt = {
269
+ }, It = 0.18, $n = 1, Hn = 0.5, Kt = 3, bt = 0.55, Dt = 0.12, Qt = 2, Xt = 2, _t = 4, Zt = 8, jn = 1, en = 0.38, tn = 0.32, nn = "__branding__", wt = {
280
270
  neutral: { eyeLookDownLeft: 0.1, eyeLookDownRight: 0.1 },
281
271
  happy: {
282
272
  mouthSmileLeft: 0.2,
@@ -358,7 +348,7 @@ const _n = [
358
348
  mouthUpperUpLeft: 0.1,
359
349
  mouthUpperUpRight: 0.1
360
350
  }
361
- }, Tn = [
351
+ }, Jn = [
362
352
  {
363
353
  key: "viseme_aa",
364
354
  mix: { jawOpen: 0.4, mouthSmileLeft: 0.15, mouthSmileRight: 0.15 },
@@ -593,7 +583,7 @@ const _n = [
593
583
  }
594
584
  },
595
585
  { key: "viseme_sil", mix: {} }
596
- ], Mn = {
586
+ ], Gn = {
597
587
  aei: [
598
588
  { v: "E", w: 0.8 },
599
589
  { v: "I", w: 0.2 }
@@ -622,482 +612,533 @@ const _n = [
622
612
  ],
623
613
  sil: [{ v: "sil", w: 1 }]
624
614
  };
625
- function En(f) {
626
- if (!f) return [{ v: "sil", w: 1 }];
627
- const T = f.toLowerCase();
628
- return Mn[T] ?? [{ v: "sil", w: 1 }];
615
+ function qn(p) {
616
+ if (!p) return [{ v: "sil", w: 1 }];
617
+ const E = p.toLowerCase();
618
+ return Gn[E] ?? [{ v: "sil", w: 1 }];
629
619
  }
630
- function In({ target: f }) {
631
- const { camera: T } = un();
620
+ function zn({ target: p }) {
621
+ const { camera: E } = Rn();
632
622
  return W(() => {
633
- T.lookAt(...f);
634
- }, [T, f]), null;
623
+ E.lookAt(...p);
624
+ }, [E, p]), null;
635
625
  }
636
- function E(f, T, x) {
637
- if (!f || !f.morphTargetDictionary)
626
+ function c(p, E, w) {
627
+ if (!p || !p.morphTargetDictionary)
638
628
  return;
639
- const b = f, S = b.morphTargetDictionary, H = b.morphTargetInfluences;
640
- if (H)
641
- for (const I in S)
642
- I.toLowerCase() === T.toLowerCase() && (H[S[I]] = x);
629
+ const y = p, j = y.morphTargetDictionary, Z = y.morphTargetInfluences;
630
+ if (Z)
631
+ for (const ee in j)
632
+ ee.toLowerCase() === E.toLowerCase() && (Z[j[ee]] = w);
643
633
  }
644
- function gt(f, T = 0.97) {
645
- if (!f) return;
646
- const x = f;
647
- if (x.morphTargetInfluences)
648
- for (let b = 0; b < x.morphTargetInfluences.length; b++)
649
- x.morphTargetInfluences[b] *= T;
634
+ function Ot(p, E = 0.97) {
635
+ if (!p) return;
636
+ const w = p;
637
+ if (w.morphTargetInfluences)
638
+ for (let y = 0; y < w.morphTargetInfluences.length; y++)
639
+ w.morphTargetInfluences[y] *= E;
650
640
  }
651
- const Dn = ln(
641
+ const Yn = xn(
652
642
  ({
653
- avatarUrl: f,
654
- isPlayingRef: T,
655
- visemeQueueRef: x,
656
- audioContextRef: b,
657
- responseAudioStartTimeRef: S,
658
- adjustments: H,
659
- mood: I,
660
- expression: Ue,
661
- agentResponse: se,
662
- isSpeaking: R,
663
- nextStartTimeRef: we,
664
- stopPlayback: K,
665
- setIsSpeaking: j,
666
- expressionUrl: l,
667
- onExpressionFinished: Q,
668
- isNudgeResponse: g,
669
- avatarGender: ee
643
+ avatarUrl: p,
644
+ isPlayingRef: E,
645
+ visemeQueueRef: w,
646
+ audioContextRef: y,
647
+ responseAudioStartTimeRef: j,
648
+ adjustments: Z,
649
+ mood: ee,
650
+ expression: nt,
651
+ agentResponse: Be,
652
+ isSpeaking: F,
653
+ nextStartTimeRef: rt,
654
+ stopPlayback: Te,
655
+ setIsSpeaking: We,
656
+ expressionUrl: J,
657
+ onExpressionFinished: Ae,
658
+ isNudgeResponse: q,
659
+ avatarGender: se
670
660
  }) => {
671
- const { scene: k } = mt(f), Me = mt(ee === "female" ? wn : _n), te = bt(
672
- () => Me.flatMap((m) => m.animations),
673
- [Me]
674
- ), D = mt(ee === "female" ? yn : vn), J = bt(
675
- () => D.flatMap((m) => m.animations),
676
- [D]
677
- ), Y = a(null), F = a(null), V = a(null), $ = a(null), Ee = a([]), [U] = y(() => new ze.AnimationMixer(k)), N = a({}), O = a(null), ve = a(0), Ne = a(!1), ye = a(0), de = a(null);
661
+ const { scene: M } = Mt(p), H = Mt(se === "female" ? Cn : On), b = Ct(
662
+ () => H.flatMap((m) => m.animations),
663
+ [H]
664
+ ), f = Mt(se === "female" ? Nn : Fn), O = Ct(
665
+ () => f.flatMap((m) => m.animations),
666
+ [f]
667
+ ), z = a(null), T = a(null), I = a(null), N = a(null), Y = a(null), Q = a(null), yt = a([]), [te] = S(() => new at.AnimationMixer(M)), G = a({}), V = a(null), Ee = a(0), Xe = a(!1), Ve = a(0), Me = a(!1), we = a(null), Ie = a(Kt), ct = a(-1), De = a("left"), $e = a(_t + Math.random() * (Zt - _t)), de = a(0), Oe = a("smile");
678
668
  W(() => {
679
- if (!(!te || !k)) {
680
- if (te.forEach((m, u) => {
681
- const s = `idle_${u}`;
682
- if (!N.current[s]) {
683
- const o = U.clipAction(m, k);
684
- o.name = s, o.setLoop(ze.LoopOnce, 1), o.clampWhenFinished = !0, N.current[s] = o;
669
+ if (!(!b || !M)) {
670
+ if (b.forEach((m, h) => {
671
+ const s = `idle_${h}`;
672
+ if (!G.current[s]) {
673
+ const o = te.clipAction(m, M);
674
+ o.name = s, o.setLoop(at.LoopOnce, 1), o.clampWhenFinished = !0, G.current[s] = o;
685
675
  }
686
- }), J.forEach((m, u) => {
687
- const s = `talk_${u}`;
688
- if (!N.current[s]) {
689
- const o = U.clipAction(m, k);
690
- o.name = s, o.setLoop(ze.LoopOnce, 1), o.clampWhenFinished = !0, N.current[s] = o;
676
+ }), O.forEach((m, h) => {
677
+ const s = `talk_${h}`;
678
+ if (!G.current[s]) {
679
+ const o = te.clipAction(m, M);
680
+ o.name = s, o.setLoop(at.LoopOnce, 1), o.clampWhenFinished = !0, G.current[s] = o;
691
681
  }
692
- }), te.length > 0) {
693
- const m = N.current.idle_0, u = O.current && U.existingAction(O.current.getClip());
694
- m && !u && (m.reset().fadeIn(0.5).play(), O.current = m);
682
+ }), b.length > 0) {
683
+ const m = G.current.idle_0, h = V.current && te.existingAction(V.current.getClip());
684
+ m && !h && (m.reset().fadeIn(0.5).play(), V.current = m);
695
685
  }
696
686
  return () => {
697
- U.stopAllAction(), N.current = {}, O.current = null;
687
+ te.stopAllAction(), G.current = {}, V.current = null;
698
688
  };
699
689
  }
700
- }, [te, J, k, U]);
701
- const pe = a("");
690
+ }, [b, O, M, te]);
691
+ const ve = a("");
702
692
  W(() => {
703
- if (!l || !k || l === pe.current) return;
704
- pe.current = l, de.current = l, new fn().load(
705
- l,
706
- (u) => {
707
- if (u.animations && u.animations.length > 0) {
708
- const s = u.animations[0], o = U.clipAction(s, k);
709
- if (o.name = `EXPR_${l}`, o.setLoop(ze.LoopOnce, 1), o.clampWhenFinished = !0, N.current[`EXPR_${l}`] = o, R && de.current === l) {
710
- const h = O.current;
711
- o.reset().fadeIn(0.3).play(), h && h !== o && h.crossFadeTo(o, 0.3, !0), O.current = o, de.current = null;
693
+ if (!J || !M || J === ve.current) return;
694
+ ve.current = J, we.current = J, new En().load(
695
+ J,
696
+ (h) => {
697
+ if (h.animations && h.animations.length > 0) {
698
+ const s = h.animations[0], o = te.clipAction(s, M);
699
+ if (o.name = `EXPR_${J}`, o.setLoop(at.LoopOnce, 1), o.clampWhenFinished = !0, G.current[`EXPR_${J}`] = o, F && we.current === J) {
700
+ const d = V.current;
701
+ o.reset().fadeIn(0.3).play(), d && d !== o && d.crossFadeTo(o, 0.3, !0), V.current = o, we.current = null;
712
702
  }
713
703
  }
714
704
  },
715
705
  void 0,
716
- (u) => {
717
- console.error(`[ANIMATION] Failed to load ${l}`, u);
706
+ (h) => {
707
+ console.error(`[ANIMATION] Failed to load ${J}`, h);
718
708
  }
719
709
  );
720
- }, [l, k, U, R]), W(() => {
721
- const m = (u) => {
722
- const s = u.action, o = s.name || "";
710
+ }, [J, M, te, F]), W(() => {
711
+ const m = (h) => {
712
+ const s = h.action, o = s.name || "";
723
713
  if (o.startsWith("idle_")) {
724
- const M = (parseInt(o.split("_")[1]) + 1) % te.length, X = N.current[`idle_${M}`];
725
- X && (X.reset().fadeIn(0.5).play(), s.crossFadeTo(X, 0.5, !0), O.current = X);
714
+ const D = (parseInt(o.split("_")[1]) + 1) % b.length, ne = G.current[`idle_${D}`];
715
+ ne && (ne.reset().fadeIn(0.5).play(), s.crossFadeTo(ne, 0.5, !0), V.current = ne);
726
716
  } else if (o.startsWith("EXPR_")) {
727
- if (R) {
728
- const h = Math.floor(
729
- Math.random() * J.length
730
- ), M = N.current[`talk_${h}`];
731
- M && (M.reset().fadeIn(0.5).play(), s.crossFadeTo(M, 0.5, !0), O.current = M);
717
+ if (F) {
718
+ const d = Math.floor(
719
+ Math.random() * O.length
720
+ ), D = G.current[`talk_${d}`];
721
+ D && (D.reset().fadeIn(0.5).play(), s.crossFadeTo(D, 0.5, !0), V.current = D);
732
722
  } else {
733
- const h = N.current.idle_0;
734
- h && (h.reset().fadeIn(0.5).play(), s.crossFadeTo(h, 0.5, !0), O.current = h);
723
+ const d = G.current.idle_0;
724
+ d && (d.reset().fadeIn(0.5).play(), s.crossFadeTo(d, 0.5, !0), V.current = d);
735
725
  }
736
- Q && Q();
726
+ Ae && Ae();
737
727
  } else if (o.startsWith("talk_"))
738
- if (R && !g) {
739
- const M = (parseInt(o.split("_")[1]) + 1) % J.length, X = N.current[`talk_${M}`];
740
- X && (X.reset().fadeIn(0.3).play(), s.crossFadeTo(X, 0.3, !0), O.current = X);
728
+ if (F && !q) {
729
+ const D = (parseInt(o.split("_")[1]) + 1) % O.length, ne = G.current[`talk_${D}`];
730
+ ne && (ne.reset().fadeIn(0.3).play(), s.crossFadeTo(ne, 0.3, !0), V.current = ne);
741
731
  } else {
742
- const h = N.current.idle_0;
743
- h && (h.reset().fadeIn(0.5).play(), s.crossFadeTo(h, 0.5, !0), O.current = h);
732
+ const d = G.current.idle_0;
733
+ d && (d.reset().fadeIn(0.5).play(), s.crossFadeTo(d, 0.5, !0), V.current = d);
744
734
  }
745
735
  };
746
- return U.addEventListener("finished", m), () => U.removeEventListener("finished", m);
736
+ return te.addEventListener("finished", m), () => te.removeEventListener("finished", m);
747
737
  }, [
748
- U,
749
738
  te,
750
- J,
751
- R,
752
- g,
753
- Q
739
+ b,
740
+ O,
741
+ F,
742
+ q,
743
+ Ae
754
744
  ]), W(() => {
755
- if (R && k) {
756
- const m = O.current, u = m?.name || "";
757
- if (u.startsWith("idle_") || u.startsWith("talk_") || u === "") {
758
- const s = de.current;
745
+ if (F && M) {
746
+ const m = V.current, h = m?.name || "";
747
+ if (h.startsWith("idle_") || h.startsWith("talk_") || h === "") {
748
+ const s = we.current;
759
749
  if (s) {
760
- const o = N.current[`EXPR_${s}`];
750
+ const o = G.current[`EXPR_${s}`];
761
751
  if (o) {
762
- o.reset().fadeIn(0.3).play(), m && m !== o && m.crossFadeTo(o, 0.3, !0), O.current = o, de.current = null;
752
+ o.reset().fadeIn(0.3).play(), m && m !== o && m.crossFadeTo(o, 0.3, !0), V.current = o, we.current = null;
763
753
  return;
764
754
  }
765
755
  }
766
- if (u.startsWith("idle_") || u === "") {
756
+ if (h.startsWith("idle_") || h === "") {
767
757
  const o = Math.floor(
768
- Math.random() * J.length
769
- ), h = N.current[`talk_${o}`];
770
- h && (h.reset().fadeIn(0.5).play(), m && m.crossFadeTo(h, 0.5, !0), O.current = h);
758
+ Math.random() * O.length
759
+ ), d = G.current[`talk_${o}`];
760
+ d && (d.reset().fadeIn(0.5).play(), m && m.crossFadeTo(d, 0.5, !0), V.current = d);
771
761
  }
772
762
  }
773
- } else if (!R && k) {
774
- const m = O.current, u = m?.name || "";
775
- if (u.startsWith("talk_") || u.startsWith("EXPR_")) {
776
- const s = N.current.idle_0;
777
- s && (s.reset().fadeIn(0.5).play(), m && m.crossFadeTo(s, 0.5, !0), O.current = s);
763
+ } else if (!F && M) {
764
+ const m = V.current, h = m?.name || "";
765
+ if (h.startsWith("talk_") || h.startsWith("EXPR_")) {
766
+ const s = G.current.idle_0;
767
+ s && (s.reset().fadeIn(0.5).play(), m && m.crossFadeTo(s, 0.5, !0), V.current = s);
778
768
  }
779
769
  }
780
- }, [R, k, l]), W(() => {
781
- if (!k) return;
782
- k.traverse((s) => {
770
+ }, [F, M, J]), W(() => {
771
+ if (!M) return;
772
+ M.traverse((s) => {
783
773
  if (s.isMesh && s.morphTargetDictionary) {
784
774
  const o = s.name.toLowerCase();
785
- (o.includes("head") || o.includes("avatar")) && (F.current = s, B(`[ANIMATION] Found head mesh: ${s.name}`)), o.includes("teeth") && (V.current = s, B(`[ANIMATION] Found teeth mesh: ${s.name}`)), o.includes("beard") && ($.current = s, B(`[ANIMATION] Found beard mesh: ${s.name}`));
775
+ (o.includes("head") || o.includes("avatar")) && (T.current = s, U(`[ANIMATION] Found head mesh: ${s.name}`)), o.includes("teeth") && (I.current = s, U(`[ANIMATION] Found teeth mesh: ${s.name}`)), o.includes("beard") && (N.current = s, U(`[ANIMATION] Found beard mesh: ${s.name}`)), o.includes("eyeleft") && (Y.current = s, U(`[ANIMATION] Found eye left mesh: ${s.name}`)), o.includes("eyeright") && (Q.current = s, U(`[ANIMATION] Found eye right mesh: ${s.name}`));
786
776
  }
787
777
  });
788
- const m = F.current?.morphTargetDictionary;
778
+ const m = T.current?.morphTargetDictionary;
789
779
  m && Object.keys(m).filter(
790
780
  (s) => s.toLowerCase().includes("brow")
791
781
  );
792
- const u = [];
793
- k.traverse((s) => {
782
+ const h = [];
783
+ M.traverse((s) => {
794
784
  if (s.isMesh) {
795
- const h = s.morphTargetDictionary;
796
- h && Object.keys(h).some((M) => M.toLowerCase().includes("brow")) && u.push(s);
785
+ const d = s.morphTargetDictionary;
786
+ d && Object.keys(d).some((D) => D.toLowerCase().includes("brow")) && h.push(s);
797
787
  }
798
- }), Ee.current = u, u.length > 0 && B("[ANIMATION] Meshes with brow morphs:", u.length);
799
- }, [k]);
800
- const He = (m, u = 1) => {
801
- const s = `viseme_${m}`.toLowerCase(), o = Tn.find((h) => h.key.toLowerCase() === s);
788
+ }), yt.current = h, h.length > 0 && U("[ANIMATION] Meshes with brow morphs:", h.length);
789
+ }, [M]);
790
+ const ot = (m, h = 1) => {
791
+ const s = `viseme_${m}`.toLowerCase(), o = Jn.find((d) => d.key.toLowerCase() === s);
802
792
  if (o) {
803
- for (const h in o.mix) {
804
- const M = o.mix[h] * u;
805
- E(F.current, h, M), E($.current, h, M), (!o.teethMix || !(h in o.teethMix)) && E(V.current, h, M);
793
+ for (const d in o.mix) {
794
+ const D = o.mix[d] * h;
795
+ c(T.current, d, D), c(N.current, d, D), (!o.teethMix || !(d in o.teethMix)) && c(I.current, d, D);
806
796
  }
807
797
  if (o.teethMix)
808
- for (const h in o.teethMix) {
809
- const M = o.teethMix[h] * u;
810
- E(V.current, h, M);
798
+ for (const d in o.teethMix) {
799
+ const D = o.teethMix[d] * h;
800
+ c(I.current, d, D);
811
801
  }
812
802
  }
813
- }, xe = (m) => {
814
- const u = nt[m] ?? nt.neutral;
815
- for (const s in u)
816
- E(F.current, s, u[s]), E(V.current, s, u[s]), E($.current, s, u[s]);
803
+ }, it = (m) => {
804
+ const h = wt[m] ?? wt.neutral;
805
+ for (const s in h)
806
+ c(T.current, s, h[s]), c(I.current, s, h[s]), c(N.current, s, h[s]);
817
807
  };
818
- return an((m, u) => {
819
- const s = Math.pow(0.88, 60 * u);
820
- gt(F.current, s), gt(V.current, s), gt($.current, s), xe(I);
808
+ return vn((m, h) => {
809
+ const s = Math.pow(0.88, 60 * h);
810
+ Ot(T.current, s), Ot(I.current, s), Ot(N.current, s), it(ee);
821
811
  const o = m.clock.elapsedTime;
822
- let h = 0;
823
- if (Math.floor(o) % 5 === 0 && Math.floor((o - u) % 5) !== 0) {
824
- let q = null;
825
- k.traverse((z) => {
826
- z.name.toLowerCase().includes("hips") && (q = z);
812
+ let d = 0;
813
+ if (Math.floor(o) % 5 === 0 && Math.floor((o - h) % 5) !== 0) {
814
+ let _ = null;
815
+ M.traverse((P) => {
816
+ P.name.toLowerCase().includes("hips") && (_ = P);
827
817
  });
828
- const ke = q ? `Hips Y: ${q.position.y.toFixed(4)}` : "Hips not found";
829
- B(`[ANIMATION] Mixer Time: ${U.time.toFixed(2)}, ${ke}`);
818
+ const K = _ ? `Hips Y: ${_.position.y.toFixed(4)}` : "Hips not found";
819
+ U(`[ANIMATION] Mixer Time: ${te.time.toFixed(2)}, ${K}`);
830
820
  }
831
- if (U.update(u), o > ve.current && !Ne.current && (Ne.current = !0, ye.current = o), Ne.current) {
832
- const q = R ? 0.2 : 0.3, ke = (o - ye.current) / q;
833
- if (ke >= 1) {
834
- Ne.current = !1;
835
- const z = R ? 1 : 2.5;
836
- ve.current = o + z;
837
- } else {
838
- const z = ke < 0.5 ? ke * 2 : (1 - ke) * 2;
839
- E(F.current, "eyeBlinkLeft", z), E(F.current, "eyeBlinkRight", z), E(V.current, "eyeBlinkLeft", z), E(V.current, "eyeBlinkRight", z), E($.current, "eyeBlinkLeft", z), E($.current, "eyeBlinkRight", z), h = z * Rn.browInnerUp;
821
+ if (te.update(h), o > Ee.current && !Xe.current && (Xe.current = !0, Ve.current = o), Xe.current) {
822
+ const _ = F ? 0.2 : 0.3, K = (o - Ve.current) / _;
823
+ if (K >= 1)
824
+ if (Xe.current = !1, Me.current) {
825
+ const P = F ? 1 : 2.5;
826
+ Ee.current = o + P, Me.current = !1;
827
+ } else
828
+ Ee.current = o + 0.12, Me.current = !0;
829
+ else {
830
+ const P = K < 0.5 ? K * 2 : (1 - K) * 2;
831
+ c(T.current, "eyeBlinkLeft", P), c(T.current, "eyeBlinkRight", P), c(I.current, "eyeBlinkLeft", P), c(I.current, "eyeBlinkRight", P), c(N.current, "eyeBlinkLeft", P), c(N.current, "eyeBlinkRight", P), d = P * Vn.browInnerUp;
840
832
  }
841
833
  }
842
- const M = nt[I] ?? nt.neutral, X = M.browInnerUp ?? 0, rt = M.browOuterUpLeft ?? 0, Ke = M.browOuterUpRight ?? 0, je = o * An, Ie = pt * Math.sin(je), ne = pt * 0.7 * Math.sin(je + 0.7), Qe = pt * 0.7 * Math.sin(je + 1.3), oe = (q) => Math.max(0, Math.min(1, q)), De = oe(X + Ie), Le = oe(rt + ne), Pe = oe(Ke + Qe), Oe = oe(De + h);
843
- if (E(F.current, "browInnerUp", Oe), E(V.current, "browInnerUp", Oe), E($.current, "browInnerUp", Oe), E(F.current, "browOuterUpLeft", Le), E(V.current, "browOuterUpLeft", Le), E($.current, "browOuterUpLeft", Le), E(F.current, "browOuterUpRight", Pe), E(V.current, "browOuterUpRight", Pe), E($.current, "browOuterUpRight", Pe), Y.current) {
844
- const q = T.current ? 0 : H.rotation[1];
845
- Y.current.rotation.y = ze.MathUtils.lerp(
846
- Y.current.rotation.y,
847
- q,
834
+ const D = wt[ee] ?? wt.neutral, ne = D.browInnerUp ?? 0, St = D.browOuterUpLeft ?? 0, He = D.browOuterUpRight ?? 0, re = o * $n, ut = It * Math.sin(re), Ce = It * 0.7 * Math.sin(re + 0.7), je = It * 0.7 * Math.sin(re + 1.3), L = (_) => Math.max(0, Math.min(1, _)), lt = L(ne + ut), Je = L(St + Ce), Ge = L(He + je), ht = L(lt + d);
835
+ c(T.current, "browInnerUp", ht), c(I.current, "browInnerUp", ht), c(N.current, "browInnerUp", ht), c(T.current, "browOuterUpLeft", Je), c(I.current, "browOuterUpLeft", Je), c(N.current, "browOuterUpLeft", Je), c(T.current, "browOuterUpRight", Ge), c(I.current, "browOuterUpRight", Ge), c(N.current, "browOuterUpRight", Ge);
836
+ const qe = Ie.current, Ue = qe + bt, fe = Ue + Dt;
837
+ o > fe && (Ie.current += bt + Dt + Kt);
838
+ const ye = !F && o >= qe && o < Ue, Fe = !F && o >= Ue && o < fe;
839
+ (ye || Fe) && ct.current !== qe && (ct.current = qe, De.current = Math.random() < 0.7 ? "left" : "up");
840
+ const dt = ye ? o - qe : Fe ? bt : 0, oe = ye || Fe ? Math.min(1, dt / bt) : 0, ze = oe <= 0 ? 0 : Math.sin(oe * Math.PI), ft = Fe ? 1 - (o - Ue) / Dt : 1, Lt = ye ? ze : Fe ? ze * ft : 0, Ne = Hn * Lt, k = (_) => D[_] ?? 0;
841
+ if (De.current === "up" ? (c(Y.current, "eyeLookUpLeft", L(k("eyeLookUpLeft") + Ne)), c(Y.current, "eyeLookDownLeft", L(k("eyeLookDownLeft"))), c(Y.current, "eyeLookOutLeft", L(k("eyeLookOutLeft"))), c(Y.current, "eyeLookInLeft", L(k("eyeLookInLeft"))), c(Q.current, "eyeLookUpRight", L(k("eyeLookUpRight") + Ne)), c(Q.current, "eyeLookDownRight", L(k("eyeLookDownRight"))), c(Q.current, "eyeLookOutRight", L(k("eyeLookOutRight"))), c(Q.current, "eyeLookInRight", L(k("eyeLookInRight")))) : (c(Y.current, "eyeLookUpLeft", L(k("eyeLookUpLeft"))), c(Y.current, "eyeLookDownLeft", L(k("eyeLookDownLeft"))), c(Y.current, "eyeLookOutLeft", L(k("eyeLookOutLeft"))), c(Y.current, "eyeLookInLeft", L(k("eyeLookInLeft") + Ne)), c(Q.current, "eyeLookUpRight", L(k("eyeLookUpRight"))), c(Q.current, "eyeLookDownRight", L(k("eyeLookDownRight"))), c(Q.current, "eyeLookOutRight", L(k("eyeLookOutRight") + Ne)), c(Q.current, "eyeLookInRight", L(k("eyeLookInRight")))), !F && o >= $e.current) {
842
+ de.current = o, Oe.current = Math.random() < 0.5 ? "pucker" : "smile";
843
+ const _ = Oe.current === "pucker" ? Xt : Qt;
844
+ $e.current = o + _ + _t + Math.random() * (Zt - _t);
845
+ }
846
+ const ce = Oe.current === "pucker" ? Xt : Qt, ue = !F && o >= de.current && o < de.current + ce, Ye = ue ? (o - de.current) / ce : 0, ke = Ye <= 0 ? 0 : Ye < 0.5 ? Ye * 2 : (() => {
847
+ const _ = (Ye - 0.5) * 2;
848
+ return 1 - _ * _ * (3 - 2 * _);
849
+ })(), me = (_) => D[_] ?? 0;
850
+ if (ue)
851
+ if (Oe.current === "pucker") {
852
+ const _ = L(me("mouthPucker") + jn * ke);
853
+ c(T.current, "mouthPucker", _), c(I.current, "mouthPucker", _), c(N.current, "mouthPucker", _);
854
+ } else {
855
+ const _ = L(me("mouthSmileLeft") + en * ke), K = L(me("mouthSmileRight") + en * ke), P = L(me("mouthDimpleLeft") + tn * ke), Re = L(me("mouthDimpleRight") + tn * ke);
856
+ c(T.current, "mouthSmileLeft", _), c(T.current, "mouthSmileRight", K), c(T.current, "mouthDimpleLeft", P), c(T.current, "mouthDimpleRight", Re), c(I.current, "mouthSmileLeft", _), c(I.current, "mouthSmileRight", K), c(I.current, "mouthDimpleLeft", P), c(I.current, "mouthDimpleRight", Re), c(N.current, "mouthSmileLeft", _), c(N.current, "mouthSmileRight", K), c(N.current, "mouthDimpleLeft", P), c(N.current, "mouthDimpleRight", Re);
857
+ }
858
+ if (z.current) {
859
+ const _ = E.current ? 0 : Z.rotation[1];
860
+ z.current.rotation.y = at.MathUtils.lerp(
861
+ z.current.rotation.y,
862
+ _,
848
863
  0.1
849
- ), Y.current.position.set(...H.position), Y.current.scale.setScalar(H.scale), Y.current.rotation.x = H.rotation[0], Y.current.rotation.z = H.rotation[2];
864
+ ), z.current.position.set(...Z.position), z.current.scale.setScalar(Z.scale), z.current.rotation.x = Z.rotation[0], z.current.rotation.z = Z.rotation[2];
850
865
  }
851
- if (T.current && b.current) {
852
- const q = b.current.currentTime, Be = (q - S.current) * 1e3 - -150;
853
- for (let re = 0; re < x.current.length; re++) {
854
- const ae = x.current[re];
855
- Be >= ae.vtime && Be < ae.vtime + ae.vduration && He(ae.viseme, ae.weight ?? 1);
866
+ if (E.current && y.current) {
867
+ const _ = y.current.currentTime, Re = (_ - j.current) * 1e3 - -150;
868
+ for (let le = 0; le < w.current.length; le++) {
869
+ const he = w.current[le];
870
+ Re >= he.vtime && Re < he.vtime + he.vduration && ot(he.viseme, he.weight ?? 1);
856
871
  }
857
- q > we.current + 0.5 && (K(), j(!1));
872
+ _ > rt.current + 0.5 && (Te(), We(!1));
858
873
  }
859
- }), /* @__PURE__ */ d("group", { ref: Y, children: /* @__PURE__ */ d("primitive", { object: k }) });
874
+ }), /* @__PURE__ */ l("group", { ref: z, children: /* @__PURE__ */ l("primitive", { object: M }) });
860
875
  }
861
876
  );
862
- function On(f) {
863
- return f ? f.charAt(0).toUpperCase() + f.slice(1).toLowerCase() : "";
877
+ function Kn(p) {
878
+ return p ? p.charAt(0).toUpperCase() + p.slice(1).toLowerCase() : "";
864
879
  }
865
- function Wt(f) {
866
- return f.replace(/\*(.*?)\*/g, " $1 ").replace(/\[.*?\]/g, " ").replace(/<.*?\/>/g, " ").replace(/<.*?>.*?<\/.*?>/g, " ").replace(/\s+/g, " ").trim();
880
+ function rn(p) {
881
+ return p.replace(/\*(.*?)\*/g, " $1 ").replace(/\[.*?\]/g, " ").replace(/<.*?\/>/g, " ").replace(/<.*?>.*?<\/.*?>/g, " ").replace(/\s+/g, " ").trim();
867
882
  }
868
- const Cn = ({
869
- token: f,
870
- agentToken: T,
871
- onNavigationRequested: x,
872
- avatarGender: b,
873
- presetUserDetails: S,
874
- onAvatarReady: H
875
- } = {}) => {
876
- const I = f ?? T ?? "", Ue = bn(I || void 0), [se, R] = y(""), [we, K] = y(""), [j, l] = y("Ready"), [Q, g] = y(!1), [ee, k] = y(!1), [Te, Me] = y([]), [te, Se] = y(""), D = a(null), [J, Y] = y(
883
+ const Qn = ({
884
+ onNavigationRequested: p,
885
+ agentId: E,
886
+ presetUserDetails: w,
887
+ onAvatarReady: y
888
+ }) => {
889
+ const [j, Z] = S(""), [ee, nt] = S("male"), [Be, F] = S(""), [rt, Te] = S(!1), We = j, J = ee;
890
+ W(() => {
891
+ if (!E) {
892
+ Te(!0);
893
+ return;
894
+ }
895
+ let e = !1;
896
+ return (async () => {
897
+ try {
898
+ const r = { agentId: E }, i = await fetch(`${tt}/visitedWebsite`, {
899
+ method: "POST",
900
+ headers: { "Content-Type": "application/json" },
901
+ body: JSON.stringify(r)
902
+ });
903
+ if (i.ok) {
904
+ const t = await i.json();
905
+ if (e) return;
906
+ t.encryptedAgentToken && Z(t.encryptedAgentToken), t.avatarGender && nt(t.avatarGender), t.agent_id && F(t.agent_id);
907
+ }
908
+ } catch (r) {
909
+ console.error("Failed to fetch avatar config:", r);
910
+ } finally {
911
+ e || Te(!0);
912
+ }
913
+ })(), () => {
914
+ e = !0;
915
+ };
916
+ }, [E]);
917
+ const Ae = Dn(E ?? Be), [q, se] = S(""), [M, _e] = S(""), [H, b] = S("Ready"), [ae, f] = S(!1), [O, z] = S(!1), [T, I] = S([]), [N, Y] = S(""), Q = a(null), [yt, te] = S(
877
918
  () => typeof window < "u" ? window.matchMedia("(max-width: 480px)").matches : !1
878
919
  );
879
920
  W(() => {
880
- const e = window.matchMedia("(max-width: 480px)"), t = () => Y(e.matches);
881
- return e.addEventListener("change", t), () => e.removeEventListener("change", t);
921
+ const e = window.matchMedia("(max-width: 480px)"), n = () => te(e.matches);
922
+ return e.addEventListener("change", n), () => e.removeEventListener("change", n);
882
923
  }, []);
883
- const F = J ? 80 : 600, V = a(!1), $ = a([]), Ee = a(0), U = a(!1), N = a([]), O = a(null), ve = a([]);
924
+ const G = yt ? 80 : 600, V = a(!1), Ee = a([]), Xe = a(0), Ve = a(!1), Me = a([]), we = a(null), Ie = a([]);
884
925
  a([]);
885
- const Ne = a([]), ye = a(0), de = a(0), pe = a(0), He = a(0), xe = a(!1), [m, u] = y(
926
+ const ct = a([]), De = a(0), $e = a(0), de = a(0), Oe = a(0), ve = a(!1), [ot, it] = S(
886
927
  null
887
- ), s = a(null), [o, h] = y("neutral"), [M, X] = y(""), [rt, Ke] = y(""), [je, Ie] = y("Chat with us"), [ne, Qe] = y(
928
+ ), m = a(null), [h, s] = S("neutral"), [o, d] = S(""), [D, ne] = S(""), [St, He] = S("Chat with us"), [re, ut] = S(
888
929
  null
889
- ), [oe, De] = y("hidden"), [Le, Pe] = y(""), Oe = a(null), q = a(oe);
890
- q.current = oe;
891
- const [ke, z] = y(null), Be = a(null), re = a(null), [ae, _t] = y(!1), wt = a(null), [he, Xe] = y("hidden"), [St, Vt] = y(""), it = a(he);
892
- it.current = he;
893
- const ie = a(""), ge = a(!1), be = a(""), vt = a(Date.now()), st = a([]), Je = a(!1), [ot, qe] = y(!1), [yt, xt] = y(!1), Re = a(null), We = bt(() => ae ? "Try again" : j === "Busy" ? "Busy" : j === "Thinking..." || j === "Processing Voice..." ? j : ne != null && ne !== "" && ne !== "none" && ne !== "<none>" ? `Enter ${On(ne)}` : he !== "hidden" || !yt ? null : Bt, [j, ne, ae, he, yt]), Lt = !ae && j !== "Busy" && j !== "Thinking..." && j !== "Processing Voice..." && (ne == null || ne === "" || ne === "none" || ne === "<none>");
930
+ ), [Ce, je] = S("hidden"), [L, lt] = S(""), Je = a(null), Ge = a(Ce);
931
+ Ge.current = Ce;
932
+ const [ht, qe] = S(null), Ue = a(null), fe = a(null), [ye, Fe] = S(!1), dt = a(null), [oe, ze] = S("hidden"), [ft, Lt] = S(""), Ne = a(oe);
933
+ Ne.current = oe;
934
+ const k = a(""), ce = a(!1), ue = a(""), Ye = a(Date.now()), ke = a([]), me = a(!1), [_, K] = S(!1), [P, Re] = S(!1), le = a(null), he = Ct(() => ye ? "Try again" : H === "Busy" ? "Busy" : H === "Thinking..." || H === "Processing Voice..." ? H : re != null && re !== "" && re !== "none" && re !== "<none>" ? `Enter ${Kn(re)}` : oe !== "hidden" || !P ? null : nn, [H, re, ye, oe, P]), Ut = !ye && H !== "Busy" && H !== "Thinking..." && H !== "Processing Voice..." && (re == null || re === "" || re === "none" || re === "<none>");
894
935
  W(() => {
895
- if (he !== "hidden" || !Lt) {
896
- xt(!1), Re.current != null && (clearTimeout(Re.current), Re.current = null);
936
+ if (oe !== "hidden" || !Ut) {
937
+ Re(!1), le.current != null && (clearTimeout(le.current), le.current = null);
897
938
  return;
898
939
  }
899
- return Re.current = setTimeout(() => {
900
- Re.current = null, xt(!0);
940
+ return le.current = setTimeout(() => {
941
+ le.current = null, Re(!0);
901
942
  }, 400), () => {
902
- Re.current != null && (clearTimeout(Re.current), Re.current = null);
943
+ le.current != null && (clearTimeout(le.current), le.current = null);
903
944
  };
904
- }, [he, Lt]);
905
- const Ze = We != null && We !== "";
945
+ }, [oe, Ut]);
946
+ const mt = he != null && he !== "";
906
947
  W(() => {
907
- const e = q.current;
948
+ const e = Ge.current;
908
949
  if (!(e === "exiting" || e === "entering")) {
909
950
  if (e === "hidden") {
910
- Ze && (Pe(We ?? ""), De("entering"));
951
+ mt && (lt(he ?? ""), je("entering"));
911
952
  return;
912
953
  }
913
- e === "visible" && (!Ze || We !== Le) && (Oe.current = Ze ? We : null, De("exiting"));
954
+ e === "visible" && (!mt || he !== L) && (Je.current = mt ? he : null, je("exiting"));
914
955
  }
915
956
  }, [
916
- Ze,
917
- We,
918
- oe,
919
- Le
957
+ mt,
958
+ he,
959
+ Ce,
960
+ L
920
961
  ]), W(() => {
921
- if (j !== "Busy") {
922
- re.current != null && (clearTimeout(re.current), re.current = null);
962
+ if (H !== "Busy") {
963
+ fe.current != null && (clearTimeout(fe.current), fe.current = null);
923
964
  return;
924
965
  }
925
- return re.current = setTimeout(() => {
926
- re.current = null, l("Ready"), _t(!0);
966
+ return fe.current = setTimeout(() => {
967
+ fe.current = null, b("Ready"), Fe(!0);
927
968
  }, 12e3), () => {
928
- re.current != null && (clearTimeout(re.current), re.current = null);
969
+ fe.current != null && (clearTimeout(fe.current), fe.current = null);
929
970
  };
930
- }, [j]), W(() => {
931
- if (!ae) return;
932
- const e = setTimeout(() => _t(!1), 2500);
971
+ }, [H]), W(() => {
972
+ if (!ye) return;
973
+ const e = setTimeout(() => Fe(!1), 2500);
933
974
  return () => clearTimeout(e);
934
- }, [ae]);
935
- const $t = $e(() => {
936
- const e = q.current;
975
+ }, [ye]);
976
+ const on = et(() => {
977
+ const e = Ge.current;
937
978
  if (e === "exiting") {
938
- De("hidden");
939
- const t = Oe.current;
940
- Oe.current = null, t != null && t !== "" && (Pe(t), De("entering"));
941
- } else e === "entering" && De("visible");
942
- }, []), Ht = (e) => {
979
+ je("hidden");
980
+ const n = Je.current;
981
+ Je.current = null, n != null && n !== "" && (lt(n), je("entering"));
982
+ } else e === "entering" && je("visible");
983
+ }, []), sn = (e) => {
943
984
  if (!e) return;
944
985
  if (e.mood != null) {
945
- const r = String(e.mood).toLowerCase();
946
- h(r);
986
+ const t = String(e.mood).toLowerCase();
987
+ s(t);
947
988
  }
948
989
  if (e.expression != null) {
949
- const r = String(e.expression).trim();
950
- X(r);
951
- const c = Sn.find(
952
- (p) => p.name.toLowerCase() === r.toLowerCase()
990
+ const t = String(e.expression).trim();
991
+ d(t);
992
+ const u = Un.find(
993
+ (g) => g.name.toLowerCase() === t.toLowerCase()
953
994
  );
954
- B(
955
- `[STREAM] Animation match for "${r}": ${c ? c.name : "NONE"}`
956
- ), Ke(c?.url ?? "");
995
+ U(
996
+ `[STREAM] Animation match for "${t}": ${u ? u.name : "NONE"}`
997
+ ), ne(u?.url ?? "");
957
998
  }
958
999
  if (e.navigation != null) {
959
- const r = String(e.navigation).trim();
960
- r !== "" && (x ? x(r) : window.open(r, "_blank"));
1000
+ const t = String(e.navigation).trim();
1001
+ t !== "" && (p ? p(t) : window.open(t, "_blank"));
961
1002
  }
962
- const t = e.ask_for || e.lead_capture?.ask_for, n = t ? String(t).trim().toLowerCase() : "", i = n === "none" || n === "<none>";
963
- if (t && !i) {
964
- const r = n;
965
- if (S && (r === "email" && S.email || r === "name" && S.name || r === "phone" && S.phone))
1003
+ const n = e.ask_for || e.lead_capture?.ask_for, r = n ? String(n).trim().toLowerCase() : "", i = r === "none" || r === "<none>";
1004
+ if (n && !i) {
1005
+ const t = r;
1006
+ if (w && (t === "email" && w.email || t === "name" && w.name || t === "phone" && w.phone))
966
1007
  return;
967
- Qe(r || null), Ie(r === "email" ? "Enter your email" : r === "name" ? "Enter your name" : r === "phone" ? "Enter your phone number" : "Chat with us");
968
- } else (i || e.ask_for === null || e.lead_capture && e.lead_capture.ask_for === null || e.ask_for === "none") && (Qe(null), je !== "Chat with us" && Ie("Chat with us"));
1008
+ ut(t || null), He(t === "email" ? "Enter your email" : t === "name" ? "Enter your name" : t === "phone" ? "Enter your phone number" : "Chat with us");
1009
+ } else (i || e.ask_for === null || e.lead_capture && e.lead_capture.ask_for === null || e.ask_for === "none") && (ut(null), St !== "Chat with us" && He("Chat with us"));
969
1010
  e.collected, e.valid;
970
- }, jt = (e) => {
971
- const t = e.trim();
972
- if (!t) return null;
973
- if (t.startsWith("{"))
1011
+ }, an = (e) => {
1012
+ const n = e.trim();
1013
+ if (!n) return null;
1014
+ if (n.startsWith("{"))
974
1015
  try {
975
- return JSON.parse(t);
1016
+ return JSON.parse(n);
976
1017
  } catch {
977
1018
  return null;
978
1019
  }
979
- if (t.includes(":")) {
980
- const n = t.split(":"), i = n[0].trim().toLowerCase(), r = n.slice(1).join(":").trim();
981
- return { [i]: r };
1020
+ if (n.includes(":")) {
1021
+ const r = n.split(":"), i = r[0].trim().toLowerCase(), t = r.slice(1).join(":").trim();
1022
+ return { [i]: t };
982
1023
  }
983
1024
  return null;
984
- }, Jt = $e(() => {
985
- }, []), Ae = "§", at = () => {
986
- for (; ie.current.includes(`
1025
+ }, cn = et(() => {
1026
+ }, []), Pe = "§", vt = () => {
1027
+ for (; k.current.includes(`
987
1028
  `); ) {
988
- const e = ie.current.indexOf(`
989
- `), t = ie.current.slice(0, e).trim();
990
- ie.current = ie.current.slice(e + 1);
991
- const n = jt(t);
992
- n && Ht(n);
1029
+ const e = k.current.indexOf(`
1030
+ `), n = k.current.slice(0, e).trim();
1031
+ k.current = k.current.slice(e + 1);
1032
+ const r = an(n);
1033
+ r && sn(r);
993
1034
  }
994
- }, kt = (e) => {
995
- if (ge.current)
996
- if (e.includes(Ae)) {
997
- const t = e.indexOf(Ae), n = e.slice(0, t), i = e.slice(t + Ae.length);
998
- n && (be.current += n, K((r) => r + n)), ge.current = !1, i && (ie.current += i, at());
999
- } else e === Ae ? ge.current = !1 : (be.current += e, K((t) => t + e));
1000
- else if (e.includes(Ae)) {
1001
- const t = e.indexOf(Ae), n = e.slice(0, t), i = e.slice(t + Ae.length);
1002
- ie.current += n, at(), ge.current = !0, i && (be.current += i, K((r) => r + i));
1003
- } else if (e === Ae) {
1004
- ge.current = !0;
1035
+ }, Ft = (e) => {
1036
+ if (ce.current)
1037
+ if (e.includes(Pe)) {
1038
+ const n = e.indexOf(Pe), r = e.slice(0, n), i = e.slice(n + Pe.length);
1039
+ r && (ue.current += r, _e((t) => t + r)), ce.current = !1, i && (k.current += i, vt());
1040
+ } else e === Pe ? ce.current = !1 : (ue.current += e, _e((n) => n + e));
1041
+ else if (e.includes(Pe)) {
1042
+ const n = e.indexOf(Pe), r = e.slice(0, n), i = e.slice(n + Pe.length);
1043
+ k.current += r, vt(), ce.current = !0, i && (ue.current += i, _e((t) => t + i));
1044
+ } else if (e === Pe) {
1045
+ ce.current = !0;
1005
1046
  return;
1006
1047
  } else
1007
- ie.current += e, at();
1048
+ k.current += e, vt();
1008
1049
  };
1009
1050
  W(() => {
1010
1051
  (async () => {
1011
1052
  if (!sessionStorage.getItem(
1012
1053
  "STREAMOJI_LEADS_SESSION_LEAD_ID"
1013
1054
  )) {
1014
- const r = "secret", c = Math.floor(Date.now() / 1e3).toString();
1055
+ const t = "secret", u = Math.floor(Date.now() / 1e3).toString();
1015
1056
  try {
1016
- const p = new TextEncoder(), _ = await crypto.subtle.importKey(
1057
+ const g = new TextEncoder(), v = await crypto.subtle.importKey(
1017
1058
  "raw",
1018
- p.encode(r),
1059
+ g.encode(t),
1019
1060
  { name: "HMAC", hash: "SHA-256" },
1020
1061
  !1,
1021
1062
  ["sign"]
1022
- ), v = await crypto.subtle.sign(
1063
+ ), x = await crypto.subtle.sign(
1023
1064
  "HMAC",
1024
- _,
1025
- p.encode(c)
1026
- ), w = Array.from(new Uint8Array(v)).map((A) => A.toString(16).padStart(2, "0")).join("");
1027
- sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", w), B("[SESSION] New HMAC UID generated and saved:", w);
1028
- } catch (p) {
1029
- console.error("[SESSION] HMAC generation failed:", p);
1030
- const _ = Math.random().toString(36) + Date.now().toString();
1031
- sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", _);
1065
+ v,
1066
+ g.encode(u)
1067
+ ), R = Array.from(new Uint8Array(x)).map((C) => C.toString(16).padStart(2, "0")).join("");
1068
+ sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", R), U("[SESSION] New HMAC UID generated and saved:", R);
1069
+ } catch (g) {
1070
+ console.error("[SESSION] HMAC generation failed:", g);
1071
+ const v = Math.random().toString(36) + Date.now().toString();
1072
+ sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", v);
1032
1073
  }
1033
1074
  }
1034
- const n = sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES");
1075
+ const r = sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES");
1035
1076
  let i = [];
1036
- if (n)
1077
+ if (r)
1037
1078
  try {
1038
- i = JSON.parse(n);
1079
+ i = JSON.parse(r);
1039
1080
  } catch {
1040
1081
  i = [];
1041
1082
  }
1042
- i.length === 0 && S && (S.name || S.email) ? (i = [{ role: "user", content: `PRESET_USER_DETAILS: Name is "${S.name || ""}" , Email is "${S.email || ""}"` }], sessionStorage.setItem(
1083
+ i.length === 0 && w && (w.name || w.email) ? (i = [{ role: "user", content: `PRESET_USER_DETAILS: Name is "${w.name || ""}" , Email is "${w.email || ""}"` }], sessionStorage.setItem(
1043
1084
  "STREAMOJI_LEADS_SESSION_MESSAGES",
1044
1085
  JSON.stringify(i)
1045
- )) : n || sessionStorage.setItem(
1086
+ )) : r || sessionStorage.setItem(
1046
1087
  "STREAMOJI_LEADS_SESSION_MESSAGES",
1047
1088
  JSON.stringify([])
1048
1089
  );
1049
1090
  })();
1050
- }, [S]), W(() => {
1091
+ }, [w]), W(() => {
1051
1092
  const e = () => {
1052
- vt.current = Date.now(), Je.current && (Je.current = !1, qe(!1), Me([]), Se(""), K(""), k(!1));
1093
+ Ye.current = Date.now(), me.current && (me.current = !1, K(!1), I([]), Y(""), _e(""), z(!1));
1053
1094
  };
1054
1095
  window.addEventListener("mousemove", e), window.addEventListener("keydown", e), window.addEventListener("mousedown", e), window.addEventListener("touchstart", e);
1055
- const t = setInterval(async () => {
1056
- if (Date.now() - vt.current >= 3e4 && !ee && !Q && j === "Ready" && !Je.current)
1057
- if (Je.current = !0, st.current.length > 0)
1058
- qe(!0), Me(st.current);
1096
+ const n = setInterval(async () => {
1097
+ if (Date.now() - Ye.current >= 3e4 && !O && !ae && H === "Ready" && !me.current)
1098
+ if (me.current = !0, ke.current.length > 0)
1099
+ K(!0), I(ke.current);
1059
1100
  else
1060
1101
  try {
1061
- const r = `${Ye}/nudgeUser`, c = {
1102
+ const t = `${tt}/nudgeUser`, u = {
1062
1103
  navigationUrl: window.location.href,
1063
- token: I
1064
- }, p = await fetch(r, {
1104
+ token: We
1105
+ }, g = await fetch(t, {
1065
1106
  method: "POST",
1066
1107
  headers: {
1067
1108
  "Content-Type": "application/json"
1068
1109
  },
1069
- body: JSON.stringify(c)
1110
+ body: JSON.stringify(u)
1070
1111
  });
1071
- if (p.ok) {
1072
- const v = (await p.json()).nudge_questions;
1073
- v && v.length > 0 && (B("[NUDGE] Received nudge questions from API:", v), st.current = v, qe(!0), Me(v));
1112
+ if (g.ok) {
1113
+ const x = (await g.json()).nudge_questions;
1114
+ x && x.length > 0 && (U("[NUDGE] Received nudge questions from API:", x), ke.current = x, K(!0), I(x));
1074
1115
  }
1075
- } catch (r) {
1076
- console.error("[NUDGE] Error calling /nudgeUser:", r), Je.current = !1;
1116
+ } catch (t) {
1117
+ console.error("[NUDGE] Error calling /nudgeUser:", t), me.current = !1;
1077
1118
  }
1078
1119
  }, 1e3);
1079
1120
  return () => {
1080
- window.removeEventListener("mousemove", e), window.removeEventListener("keydown", e), window.removeEventListener("mousedown", e), window.removeEventListener("touchstart", e), clearInterval(t);
1121
+ window.removeEventListener("mousemove", e), window.removeEventListener("keydown", e), window.removeEventListener("mousedown", e), window.removeEventListener("touchstart", e), clearInterval(n);
1081
1122
  };
1082
- }, [I, ee, Q, j]), W(() => {
1083
- if (Te.length === 0) return;
1084
- let e = 0, t = 0, n = !1, i = 100;
1085
- const r = () => {
1086
- const c = Te[e];
1087
- if (n) {
1088
- const p = c.substring(0, t - 1);
1089
- Se(p), t--, i = 50;
1123
+ }, [We, O, ae, H]), W(() => {
1124
+ if (T.length === 0) return;
1125
+ let e = 0, n = 0, r = !1, i = 100;
1126
+ const t = () => {
1127
+ const u = T[e];
1128
+ if (r) {
1129
+ const g = u.substring(0, n - 1);
1130
+ Y(g), n--, i = 50;
1090
1131
  } else {
1091
- const p = c.substring(0, t + 1);
1092
- Se(p), t++, i = 100;
1132
+ const g = u.substring(0, n + 1);
1133
+ Y(g), n++, i = 100;
1093
1134
  }
1094
- !n && t === c.length ? (n = !0, i = 3e3) : n && t === 0 && (n = !1, e = (e + 1) % Te.length, i = 500), D.current = setTimeout(r, i);
1135
+ !r && n === u.length ? (r = !0, i = 3e3) : r && n === 0 && (r = !1, e = (e + 1) % T.length, i = 500), Q.current = setTimeout(t, i);
1095
1136
  };
1096
- return r(), () => {
1097
- D.current && clearTimeout(D.current);
1137
+ return t(), () => {
1138
+ Q.current && clearTimeout(Q.current);
1098
1139
  };
1099
- }, [Te]);
1100
- const Rt = () => {
1140
+ }, [T]);
1141
+ const Nt = () => {
1101
1142
  try {
1102
1143
  return JSON.parse(
1103
1144
  sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES") || "[]"
@@ -1105,232 +1146,233 @@ const Cn = ({
1105
1146
  } catch {
1106
1147
  return [];
1107
1148
  }
1108
- }, qt = (e) => {
1149
+ }, un = (e) => {
1109
1150
  sessionStorage.setItem(
1110
1151
  "STREAMOJI_LEADS_SESSION_MESSAGES",
1111
1152
  JSON.stringify(e)
1112
1153
  );
1113
- }, [ct, ut] = y(!1), [At, lt] = y(0), fe = a(null), et = a([]), Tt = a(0), [Mt, Gt] = y(
1154
+ }, [kt, Rt] = S(!1), [Pt, xt] = S(0), Se = a(null), pt = a([]), Bt = a(0), [Wt, ln] = S(
1114
1155
  null
1115
- ), [zt, dt] = y(
1156
+ ), [hn, Tt] = S(
1116
1157
  null
1117
- ), _e = a(null), Ce = a(
1158
+ ), xe = a(null), Ke = a(
1118
1159
  null
1119
- ), Ge = $e((e = !1) => {
1120
- e && (xe.current = !0, g(!1), l("Ready")), N.current = [], $.current = [], U.current = !1, k(!1), ye.current = 0, de.current = 0, pe.current = 0, ve.current.forEach((t) => {
1160
+ ), st = et((e = !1) => {
1161
+ e && (ve.current = !0, f(!1), b("Ready")), Me.current = [], Ee.current = [], Ve.current = !1, z(!1), De.current = 0, $e.current = 0, de.current = 0, Ie.current.forEach((n) => {
1121
1162
  try {
1122
- t.stop();
1163
+ n.stop();
1123
1164
  } catch {
1124
1165
  }
1125
- }), Be.current && (clearTimeout(Be.current), Be.current = null), z(null), Ke(""), ve.current = [];
1126
- }, []), Yt = async () => {
1166
+ }), Ue.current && (clearTimeout(Ue.current), Ue.current = null), qe(null), ne(""), Ie.current = [];
1167
+ }, []), dn = async () => {
1127
1168
  try {
1128
- const e = await navigator.mediaDevices.getUserMedia({ audio: !0 }), t = window.AudioContext || window.webkitAudioContext, n = new t(), i = n.createMediaStreamSource(e), r = n.createAnalyser();
1129
- r.fftSize = 64, i.connect(r), _e.current = n, Ce.current = i, dt(r);
1130
- const c = new MediaRecorder(e);
1131
- fe.current = c, et.current = [], c.ondataavailable = (p) => {
1132
- p.data.size > 0 && et.current.push(p.data);
1133
- }, c.onstop = async () => {
1134
- const p = Date.now() - Tt.current;
1135
- if (dt(null), Ce.current && (Ce.current.disconnect(), Ce.current = null), _e.current && _e.current.state !== "closed" && (_e.current.close(), _e.current = null), p < 1e3) {
1136
- l("Recording too short. Hold or click longer."), g(!1);
1169
+ const e = await navigator.mediaDevices.getUserMedia({ audio: !0 }), n = window.AudioContext || window.webkitAudioContext, r = new n(), i = r.createMediaStreamSource(e), t = r.createAnalyser();
1170
+ t.fftSize = 64, i.connect(t), xe.current = r, Ke.current = i, Tt(t);
1171
+ const u = new MediaRecorder(e);
1172
+ Se.current = u, pt.current = [], u.ondataavailable = (g) => {
1173
+ g.data.size > 0 && pt.current.push(g.data);
1174
+ }, u.onstop = async () => {
1175
+ const g = Date.now() - Bt.current;
1176
+ if (Tt(null), Ke.current && (Ke.current.disconnect(), Ke.current = null), xe.current && xe.current.state !== "closed" && (xe.current.close(), xe.current = null), g < 1e3) {
1177
+ b("Recording too short. Hold or click longer."), f(!1);
1137
1178
  return;
1138
1179
  }
1139
- const _ = new Blob(et.current, {
1180
+ const v = new Blob(pt.current, {
1140
1181
  type: "audio/wav"
1141
1182
  });
1142
- await Zt(_);
1143
- }, Tt.current = Date.now(), c.start(100), ut(!0), l("Listening...");
1183
+ await gn(v);
1184
+ }, Bt.current = Date.now(), u.start(100), Rt(!0), b("Listening...");
1144
1185
  } catch (e) {
1145
- console.error("Error accessing microphone:", e), l("Mic Access Error");
1186
+ console.error("Error accessing microphone:", e), b("Mic Access Error");
1146
1187
  }
1147
- }, Kt = () => {
1148
- fe.current && fe.current.state !== "inactive" && (fe.current.stop(), fe.current.stream.getTracks().forEach((e) => e.stop()), ut(!1));
1149
- }, Qt = () => {
1150
- fe.current && fe.current.state !== "inactive" && (fe.current.onstop = null, fe.current.stop(), fe.current.stream.getTracks().forEach((e) => e.stop()), dt(null), Ce.current && (Ce.current.disconnect(), Ce.current = null), _e.current && _e.current.state !== "closed" && (_e.current.close(), _e.current = null), ut(!1), et.current = [], l("Ready"));
1188
+ }, fn = () => {
1189
+ Se.current && Se.current.state !== "inactive" && (Se.current.stop(), Se.current.stream.getTracks().forEach((e) => e.stop()), Rt(!1));
1190
+ }, mn = () => {
1191
+ Se.current && Se.current.state !== "inactive" && (Se.current.onstop = null, Se.current.stop(), Se.current.stream.getTracks().forEach((e) => e.stop()), Tt(null), Ke.current && (Ke.current.disconnect(), Ke.current = null), xe.current && xe.current.state !== "closed" && (xe.current.close(), xe.current = null), Rt(!1), pt.current = [], b("Ready"));
1151
1192
  };
1152
1193
  W(() => {
1153
- if (!ee) return;
1194
+ if (!O) return;
1154
1195
  const e = () => {
1155
- const t = pe.current;
1156
- if (t <= 0) return;
1157
- const n = O.current, i = ye.current;
1158
- if (!n) return;
1159
- const r = n.currentTime - i, c = Math.min(Math.max(0, r), t), _ = Wt(we).trim().length;
1160
- if (_ <= 0) return;
1161
- const v = Math.min(
1162
- Math.round(c / t * _),
1163
- _
1196
+ const n = de.current;
1197
+ if (n <= 0) return;
1198
+ const r = we.current, i = De.current;
1199
+ if (!r) return;
1200
+ const t = r.currentTime - i, u = Math.min(Math.max(0, t), n), v = rn(M).trim().length;
1201
+ if (v <= 0) return;
1202
+ const x = Math.min(
1203
+ Math.round(u / n * v),
1204
+ v
1164
1205
  );
1165
- u(v);
1206
+ it(x);
1166
1207
  };
1167
- return clearInterval(s.current ?? void 0), s.current = setInterval(e, 90), () => clearInterval(s.current ?? void 0);
1168
- }, [ee, we, pe.current]), W(() => {
1208
+ return clearInterval(m.current ?? void 0), m.current = setInterval(e, 90), () => clearInterval(m.current ?? void 0);
1209
+ }, [O, M, de.current]), W(() => {
1169
1210
  let e;
1170
- return ct ? (lt(0), e = window.setInterval(() => {
1171
- lt((t) => t + 1);
1172
- }, 1e3)) : lt(0), () => clearInterval(e);
1173
- }, [ct]);
1174
- const Xt = (e) => {
1175
- const t = e.numberOfChannels, n = e.length * t * 2 + 44, i = new ArrayBuffer(n), r = new DataView(i);
1176
- let c = 0;
1177
- const p = (w) => {
1178
- r.setUint16(c, w, !0), c += 2;
1179
- }, _ = (w) => {
1180
- r.setUint32(c, w, !0), c += 4;
1211
+ return kt ? (xt(0), e = window.setInterval(() => {
1212
+ xt((n) => n + 1);
1213
+ }, 1e3)) : xt(0), () => clearInterval(e);
1214
+ }, [kt]);
1215
+ const pn = (e) => {
1216
+ const n = e.numberOfChannels, r = e.length * n * 2 + 44, i = new ArrayBuffer(r), t = new DataView(i);
1217
+ let u = 0;
1218
+ const g = (R) => {
1219
+ t.setUint16(u, R, !0), u += 2;
1220
+ }, v = (R) => {
1221
+ t.setUint32(u, R, !0), u += 4;
1181
1222
  };
1182
- _(1179011410), _(n - 8), _(1163280727), _(544501094), _(16), p(1), p(t), _(e.sampleRate), _(e.sampleRate * 2 * t), p(t * 2), p(16), _(1635017060), _(n - c - 4);
1183
- const v = [];
1184
- for (let w = 0; w < t; w++) v.push(e.getChannelData(w));
1185
- let L = 0;
1186
- for (; c < n; ) {
1187
- for (let w = 0; w < t; w++) {
1188
- let A = Math.max(-1, Math.min(1, v[w][L]));
1189
- A = A < 0 ? A * 32768 : A * 32767, r.setInt16(c, A, !0), c += 2;
1223
+ v(1179011410), v(r - 8), v(1163280727), v(544501094), v(16), g(1), g(n), v(e.sampleRate), v(e.sampleRate * 2 * n), g(n * 2), g(16), v(1635017060), v(r - u - 4);
1224
+ const x = [];
1225
+ for (let R = 0; R < n; R++) x.push(e.getChannelData(R));
1226
+ let A = 0;
1227
+ for (; u < r; ) {
1228
+ for (let R = 0; R < n; R++) {
1229
+ let C = Math.max(-1, Math.min(1, x[R][A]));
1230
+ C = C < 0 ? C * 32768 : C * 32767, t.setInt16(u, C, !0), u += 2;
1190
1231
  }
1191
- L++;
1232
+ A++;
1192
1233
  }
1193
1234
  return new Blob([i], { type: "audio/wav" });
1194
- }, ht = async (e, t, n = !1) => {
1195
- if (!xe.current) {
1235
+ }, At = async (e, n, r = !1) => {
1236
+ if (!ve.current) {
1196
1237
  if (V.current) {
1197
- $.current.push({
1238
+ Ee.current.push({
1198
1239
  audio: e,
1199
- visemes: t,
1200
- isNewSegment: n
1240
+ visemes: n,
1241
+ isNewSegment: r
1201
1242
  });
1202
1243
  return;
1203
1244
  }
1204
1245
  V.current = !0;
1205
1246
  try {
1206
- const i = window.AudioContext || window.webkitAudioContext, r = O.current ?? new i();
1207
- r.state === "suspended" && await r.resume(), O.current = r;
1208
- const c = window.atob(e), p = new Uint8Array(c.length);
1209
- for (let P = 0; P < c.length; P++)
1210
- p[P] = c.charCodeAt(P);
1211
- const _ = await r.decodeAudioData(p.buffer.slice(0));
1212
- pe.current += _.duration;
1213
- const v = r.currentTime;
1214
- let L = de.current;
1215
- const w = !U.current;
1216
- L < v && (L = v + 0.1), de.current = L + _.duration;
1217
- const A = r.createBufferSource();
1218
- A.buffer = _;
1219
- let G = Mt;
1220
- if ((!G || G.context !== r) && (G = r.createAnalyser(), G.fftSize = 64, G.connect(r.destination), Gt(G)), A.connect(G), ve.current.push(A), xe.current) {
1221
- ve.current = ve.current.filter((P) => P !== A);
1247
+ const i = window.AudioContext || window.webkitAudioContext, t = we.current ?? new i();
1248
+ t.state === "suspended" && await t.resume(), we.current = t;
1249
+ const u = window.atob(e), g = new Uint8Array(u.length);
1250
+ for (let $ = 0; $ < u.length; $++)
1251
+ g[$] = u.charCodeAt($);
1252
+ const v = await t.decodeAudioData(g.buffer.slice(0));
1253
+ de.current += v.duration;
1254
+ const x = t.currentTime;
1255
+ let A = $e.current;
1256
+ const R = !Ve.current;
1257
+ A < x && (A = x + 0.1), $e.current = A + v.duration;
1258
+ const C = t.createBufferSource();
1259
+ C.buffer = v;
1260
+ let X = Wt;
1261
+ if ((!X || X.context !== t) && (X = t.createAnalyser(), X.fftSize = 64, X.connect(t.destination), ln(X)), C.connect(X), Ie.current.push(C), ve.current) {
1262
+ Ie.current = Ie.current.filter(($) => $ !== C);
1222
1263
  return;
1223
1264
  }
1224
- if (w) {
1225
- U.current = !0, k(!0), B(
1226
- `[AUDIO] setIsSpeaking(true) - First chunk starting at ${L.toFixed(
1265
+ if (R) {
1266
+ Ve.current = !0, z(!0), U(
1267
+ `[AUDIO] setIsSpeaking(true) - First chunk starting at ${A.toFixed(
1227
1268
  3
1228
1269
  )}`
1229
- ), ye.current = L;
1230
- const P = (L - v) * 1e3;
1231
- Ee.current = performance.now() + P, B(
1232
- `[AUDIO] Response started. Initial startTime: ${L.toFixed(
1270
+ ), De.current = A;
1271
+ const $ = (A - x) * 1e3;
1272
+ Xe.current = performance.now() + $, U(
1273
+ `[AUDIO] Response started. Initial startTime: ${A.toFixed(
1233
1274
  3
1234
- )}, CT: ${v.toFixed(3)}`
1275
+ )}, CT: ${x.toFixed(3)}`
1235
1276
  );
1236
1277
  }
1237
- A.start(L);
1238
- const Z = (L - ye.current) * 1e3;
1239
- n && (He.current = Z, B(
1240
- `[AUDIO] New segment detected at +${Z.toFixed(
1278
+ C.start(A);
1279
+ const ie = (A - De.current) * 1e3;
1280
+ r && (Oe.current = ie, U(
1281
+ `[AUDIO] New segment detected at +${ie.toFixed(
1241
1282
  0
1242
1283
  )}ms. Resetting segment offset.`
1243
- )), t.forEach((P, ce) => {
1244
- const C = P.symbol ?? "";
1245
- if (C) {
1246
- const ue = En(C), me = Math.round(P.start * 1e3), Fe = Math.round((P.duration ?? 0) * 1e3), Ft = He.current + me;
1247
- ce < 3 && B(
1248
- `[AUDIO] Viseme "${C}": segment_relative=${me}ms, segment_offset=${He.current.toFixed(
1284
+ )), n.forEach(($, pe) => {
1285
+ const B = $.symbol ?? "";
1286
+ if (B) {
1287
+ const ge = qn(B), Le = Math.round($.start * 1e3), Qe = Math.round(($.duration ?? 0) * 1e3), Gt = Oe.current + Le;
1288
+ pe < 3 && U(
1289
+ `[AUDIO] Viseme "${B}": segment_relative=${Le}ms, segment_offset=${Oe.current.toFixed(
1249
1290
  0
1250
- )}ms => vtime=${Ft}ms`
1251
- ), ue.forEach((Ut) => {
1252
- N.current.push({
1253
- viseme: Ut.v,
1254
- weight: Ut.w,
1255
- vtime: Ft,
1256
- vduration: Fe
1291
+ )}ms => vtime=${Gt}ms`
1292
+ ), ge.forEach((qt) => {
1293
+ Me.current.push({
1294
+ viseme: qt.v,
1295
+ weight: qt.w,
1296
+ vtime: Gt,
1297
+ vduration: Qe
1257
1298
  });
1258
1299
  });
1259
1300
  }
1260
- }), l("Speaking...");
1301
+ }), b("Speaking...");
1261
1302
  } finally {
1262
- if (V.current = !1, $.current.length > 0) {
1263
- const i = $.current.shift();
1264
- i && ht(i.audio, i.visemes, i.isNewSegment);
1303
+ if (V.current = !1, Ee.current.length > 0) {
1304
+ const i = Ee.current.shift();
1305
+ i && At(i.audio, i.visemes, i.isNewSegment);
1265
1306
  }
1266
1307
  }
1267
1308
  }
1268
- }, Zt = async (e) => {
1309
+ }, gn = async (e) => {
1269
1310
  try {
1270
- g(!0), qe(!1), be.current = "", K(""), l("Processing Voice...");
1271
- const t = await e.arrayBuffer(), i = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(t), r = Xt(i), c = new FileReader();
1272
- c.readAsDataURL(r), c.onloadend = async () => {
1273
- const p = c.result.split(",")[1];
1274
- Ge(), R(""), ie.current = "", ge.current = !1;
1275
- const _ = `${Ye}/stt?token=${encodeURIComponent(
1276
- I
1277
- )}`, v = await fetch(_, {
1311
+ f(!0), K(!1), ue.current = "", _e(""), b("Processing Voice...");
1312
+ const n = await e.arrayBuffer(), i = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(n), t = pn(i), u = new FileReader();
1313
+ u.readAsDataURL(t), u.onloadend = async () => {
1314
+ const g = u.result.split(",")[1];
1315
+ st(), se(""), k.current = "", ce.current = !1;
1316
+ const v = `${tt}/stt?token=${encodeURIComponent(
1317
+ We
1318
+ )}`, x = await fetch(v, {
1278
1319
  method: "POST",
1279
1320
  headers: { "Content-Type": "application/json" },
1280
1321
  body: JSON.stringify({
1281
- audio_base64: p,
1282
- audio_format: "wav"
1322
+ audio_base64: g,
1323
+ audio_format: "wav",
1324
+ agentId: E
1283
1325
  })
1284
1326
  });
1285
- if (v.status === 429) {
1327
+ if (x.status === 429) {
1286
1328
  try {
1287
- const ce = await v.text(), C = JSON.parse(ce);
1288
- B("[STT] 429 agent at capacity:", C?.detail);
1329
+ const pe = await x.text(), B = JSON.parse(pe);
1330
+ U("[STT] 429 agent at capacity:", B?.detail);
1289
1331
  } catch {
1290
1332
  }
1291
- R(""), l("Busy"), g(!1);
1333
+ se(""), b("Busy"), f(!1);
1292
1334
  return;
1293
1335
  }
1294
- if (!v.ok) {
1295
- const ce = await v.text();
1296
- let C = "STT Failed";
1336
+ if (!x.ok) {
1337
+ const pe = await x.text();
1338
+ let B = "STT Failed";
1297
1339
  try {
1298
- C = JSON.parse(ce).error || C;
1340
+ B = JSON.parse(pe).error || B;
1299
1341
  } catch {
1300
- ce && (C = ce.slice(0, 200));
1342
+ pe && (B = pe.slice(0, 200));
1301
1343
  }
1302
- throw new Error(C);
1344
+ throw new Error(B);
1303
1345
  }
1304
- const L = v.body;
1305
- if (B("this is body" + L), !L) {
1306
- l("STT Failed"), g(!1);
1346
+ const A = x.body;
1347
+ if (U("this is body" + A), !A) {
1348
+ b("STT Failed"), f(!1);
1307
1349
  return;
1308
1350
  }
1309
- const w = L.getReader();
1310
- xe.current = !1;
1311
- const A = new TextDecoder();
1312
- let G = "", Z = !1;
1313
- const P = async (ce, C) => {
1314
- switch (ce) {
1351
+ const R = A.getReader();
1352
+ ve.current = !1;
1353
+ const C = new TextDecoder();
1354
+ let X = "", ie = !1;
1355
+ const $ = async (pe, B) => {
1356
+ switch (pe) {
1315
1357
  case "transcript":
1316
- C.transcript != null && R(String(C.transcript));
1358
+ B.transcript != null && se(String(B.transcript));
1317
1359
  break;
1318
1360
  case "text": {
1319
- const ue = C.delta ?? C.text ?? "";
1320
- ue && kt(ue);
1361
+ const ge = B.delta ?? B.text ?? "";
1362
+ ge && Ft(ge);
1321
1363
  break;
1322
1364
  }
1323
1365
  case "audio": {
1324
- const ue = C.chunk, me = C.visemes ?? [], Fe = !!C.is_new_segment;
1325
- ue && await ht(ue, me, Fe);
1366
+ const ge = B.chunk, Le = B.visemes ?? [], Qe = !!B.is_new_segment;
1367
+ ge && await At(ge, Le, Qe);
1326
1368
  break;
1327
1369
  }
1328
1370
  case "done": {
1329
- Z = !0, l("Ready"), g(!1);
1371
+ ie = !0, b("Ready"), f(!1);
1330
1372
  break;
1331
1373
  }
1332
1374
  case "error": {
1333
- Z = !0, l("STT Failed"), g(!1);
1375
+ ie = !0, b("STT Failed"), f(!1);
1334
1376
  break;
1335
1377
  }
1336
1378
  default:
@@ -1338,226 +1380,227 @@ const Cn = ({
1338
1380
  }
1339
1381
  };
1340
1382
  for (; ; ) {
1341
- const { done: ce, value: C } = await w.read();
1342
- C && (G += A.decode(C, { stream: !0 }));
1343
- const ue = G.split(`
1383
+ const { done: pe, value: B } = await R.read();
1384
+ B && (X += C.decode(B, { stream: !0 }));
1385
+ const ge = X.split(`
1344
1386
 
1345
1387
  `);
1346
- G = ue.pop() ?? "";
1347
- for (const me of ue) {
1348
- const Fe = Ve(me);
1349
- Fe && await P(Fe.event, Fe.data);
1388
+ X = ge.pop() ?? "";
1389
+ for (const Le of ge) {
1390
+ const Qe = Ze(Le);
1391
+ Qe && await $(Qe.event, Qe.data);
1350
1392
  }
1351
- if (ce) {
1352
- if (G.trim()) {
1353
- const me = Ve(G.trim());
1354
- me && await P(me.event, me.data);
1393
+ if (pe) {
1394
+ if (X.trim()) {
1395
+ const Le = Ze(X.trim());
1396
+ Le && await $(Le.event, Le.data);
1355
1397
  }
1356
- Z || (l("Ready"), g(!1));
1398
+ ie || (b("Ready"), f(!1));
1357
1399
  break;
1358
1400
  }
1359
1401
  }
1360
1402
  };
1361
- } catch (t) {
1362
- console.error("Audio Submission Error:", t), l("STT Failed"), g(!1);
1403
+ } catch (n) {
1404
+ console.error("Audio Submission Error:", n), b("STT Failed"), f(!1);
1363
1405
  }
1364
- }, en = async (e) => {
1365
- e && e.preventDefault(), qe(!1), be.current = "", K(""), !(!se || Q) && await tn(se);
1366
- }, Ve = (e) => {
1367
- const t = e.split(/\r?\n/);
1368
- let n = "", i = "";
1369
- for (const c of t)
1370
- c.startsWith("event:") ? n = c.slice(6).trim() : c.startsWith("data:") && (i = c.slice(5).trim());
1371
- if (!n) return null;
1372
- let r = {};
1406
+ }, bn = async (e) => {
1407
+ e && e.preventDefault(), K(!1), ue.current = "", _e(""), !(!q || ae) && await _n(q);
1408
+ }, Ze = (e) => {
1409
+ const n = e.split(/\r?\n/);
1410
+ let r = "", i = "";
1411
+ for (const u of n)
1412
+ u.startsWith("event:") ? r = u.slice(6).trim() : u.startsWith("data:") && (i = u.slice(5).trim());
1413
+ if (!r) return null;
1414
+ let t = {};
1373
1415
  if (i)
1374
1416
  try {
1375
- r = JSON.parse(i);
1417
+ t = JSON.parse(i);
1376
1418
  } catch {
1377
- r = { raw: i };
1419
+ t = { raw: i };
1378
1420
  }
1379
- return { event: n, data: r };
1380
- }, tt = (e, t) => {
1421
+ return { event: r, data: t };
1422
+ }, gt = (e, n) => {
1381
1423
  switch (e) {
1382
1424
  case "connected":
1383
- ie.current = "", ge.current = !1;
1425
+ k.current = "", ce.current = !1;
1384
1426
  break;
1385
1427
  case "text": {
1386
- const n = t.delta ?? "";
1387
- n && kt(n);
1428
+ const r = n.delta ?? "";
1429
+ r && Ft(r);
1388
1430
  break;
1389
1431
  }
1390
1432
  case "audio": {
1391
- const n = t.chunk, i = t.visemes ?? [];
1392
- n && ht(n, i);
1433
+ const r = n.chunk, i = n.visemes ?? [];
1434
+ r && At(r, i);
1393
1435
  break;
1394
1436
  }
1395
1437
  case "done": {
1396
- const n = Rt(), i = be.current.trim(), r = [
1397
- ...n,
1398
- { role: "user", content: se || "..." },
1438
+ const r = Nt(), i = ue.current.trim(), t = [
1439
+ ...r,
1440
+ { role: "user", content: q || "..." },
1399
1441
  { role: "assistant", content: i }
1400
1442
  ];
1401
- qt(r), Ne.current = [...N.current], l("Ready"), g(!1), R("");
1443
+ un(t), ct.current = [...Me.current], b("Ready"), f(!1), se("");
1402
1444
  break;
1403
1445
  }
1404
1446
  case "error": {
1405
- const n = t.message ?? "Unknown error";
1406
- be.current = n, K(n), l("Agent Failed"), g(!1);
1447
+ const r = n.message ?? "Unknown error";
1448
+ ue.current = r, _e(r), b("Agent Failed"), f(!1);
1407
1449
  break;
1408
1450
  }
1409
1451
  }
1410
- }, Et = async (e, t) => {
1411
- g(!0), l("Thinking..."), be.current = "", ie.current = "", ge.current = !1, Ge(), pe.current = 0, u(0);
1452
+ }, Vt = async (e, n) => {
1453
+ f(!0), b("Thinking..."), ue.current = "", k.current = "", ce.current = !1, st(), de.current = 0, it(0);
1412
1454
  try {
1413
- const n = await fetch(e, {
1455
+ const r = await fetch(e, {
1414
1456
  method: "POST",
1415
1457
  headers: { "Content-Type": "application/json" },
1416
- body: JSON.stringify(t)
1458
+ body: JSON.stringify(n)
1417
1459
  });
1418
- if (n.status === 429) {
1419
- l("Busy"), g(!1);
1460
+ if (r.status === 429) {
1461
+ b("Busy"), f(!1);
1420
1462
  return;
1421
1463
  }
1422
- if (!n.ok) throw new Error("Request failed");
1423
- const i = n.body;
1464
+ if (!r.ok) throw new Error("Request failed");
1465
+ const i = r.body;
1424
1466
  if (!i) {
1425
- l("Failed"), g(!1);
1467
+ b("Failed"), f(!1);
1426
1468
  return;
1427
1469
  }
1428
- const r = i.getReader();
1429
- xe.current = !1;
1430
- const c = new TextDecoder();
1431
- let p = "";
1470
+ const t = i.getReader();
1471
+ ve.current = !1;
1472
+ const u = new TextDecoder();
1473
+ let g = "";
1432
1474
  for (; ; ) {
1433
- const { done: _, value: v } = await r.read();
1434
- v && (p += c.decode(v, { stream: !0 }));
1435
- const L = p.split(`
1475
+ const { done: v, value: x } = await t.read();
1476
+ x && (g += u.decode(x, { stream: !0 }));
1477
+ const A = g.split(`
1436
1478
 
1437
1479
  `);
1438
- p = L.pop() ?? "";
1439
- for (const w of L) {
1440
- const A = Ve(w);
1441
- A && tt(A.event, A.data);
1480
+ g = A.pop() ?? "";
1481
+ for (const R of A) {
1482
+ const C = Ze(R);
1483
+ C && gt(C.event, C.data);
1442
1484
  }
1443
- if (_) {
1444
- if (p.trim()) {
1445
- const w = Ve(p.trim());
1446
- w && tt(w.event, w.data);
1485
+ if (v) {
1486
+ if (g.trim()) {
1487
+ const R = Ze(g.trim());
1488
+ R && gt(R.event, R.data);
1447
1489
  }
1448
- l("Ready"), g(!1);
1490
+ b("Ready"), f(!1);
1449
1491
  break;
1450
1492
  }
1451
1493
  }
1452
- } catch (n) {
1453
- console.error("Streaming Error:", n), l("Failed"), g(!1);
1494
+ } catch (r) {
1495
+ console.error("Streaming Error:", r), b("Failed"), f(!1);
1454
1496
  }
1455
- }, It = $e(async (e, t, n) => {
1456
- const i = `${Ye}/avatar_tts`;
1457
- await Et(i, { text: e, userQuery: t, llmPrompt: n });
1458
- }, []), Dt = $e(async (e, t, n, i) => {
1459
- const r = `${Ye}/avatar_ttsWithKnowledge`;
1460
- await Et(r, { userQuery: e, llmPrompt: t, knowledge: n, history: i });
1461
- }, []), Ot = a(!1);
1497
+ }, $t = et(async (e, n, r) => {
1498
+ const i = `${tt}/avatar_tts`;
1499
+ await Vt(i, { text: e, userQuery: n, llmPrompt: r });
1500
+ }, []), Ht = et(async (e, n, r, i) => {
1501
+ const t = `${tt}/avatar_ttsWithKnowledge`;
1502
+ await Vt(t, { userQuery: e, llmPrompt: n, knowledge: r, history: i });
1503
+ }, []), jt = a(!1);
1462
1504
  W(() => {
1463
- H && !Ot.current && (H({ avatarSpeak: It, avatarRespond: Dt }), Ot.current = !0);
1464
- }, [H, It, Dt]);
1465
- const tn = async (e) => {
1466
- g(!0), l("Thinking..."), be.current = "", ie.current = "", ge.current = !1, Ge(), pe.current = 0, u(0);
1467
- const t = `${Ye}/agent/chat?token=${encodeURIComponent(
1468
- I
1505
+ y && !jt.current && (y({ avatarSpeak: $t, avatarRespond: Ht }), jt.current = !0);
1506
+ }, [y, $t, Ht]);
1507
+ const _n = async (e) => {
1508
+ f(!0), b("Thinking..."), ue.current = "", k.current = "", ce.current = !1, st(), de.current = 0, it(0);
1509
+ const n = `${tt}/agent/chat?token=${encodeURIComponent(
1510
+ We
1469
1511
  )}`;
1470
1512
  try {
1471
- const n = Rt();
1513
+ const r = Nt();
1472
1514
  let i = sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID");
1473
- i || (mn(
1515
+ i || (Mn(
1474
1516
  "[CHAT] Session UID missing at send time! Generating emergency backup."
1475
1517
  ), i = "emergency-" + Math.random().toString(36).substring(7), sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID", i));
1476
- const r = {
1477
- history: n,
1518
+ const t = {
1519
+ history: r,
1478
1520
  question: e,
1479
- lead_id: i
1521
+ lead_id: i,
1522
+ agentId: E
1480
1523
  };
1481
- B("[CHAT] Sending payload:", r);
1482
- const c = await fetch(t, {
1524
+ U("[CHAT] Sending payload:", t);
1525
+ const u = await fetch(n, {
1483
1526
  method: "POST",
1484
1527
  headers: {
1485
1528
  "Content-Type": "application/json"
1486
1529
  },
1487
- body: JSON.stringify(r),
1530
+ body: JSON.stringify(t),
1488
1531
  cache: "default"
1489
1532
  });
1490
- if (c.status === 429) {
1533
+ if (u.status === 429) {
1491
1534
  try {
1492
- const w = await c.json();
1493
- B("[CHAT] 429 agent at capacity:", w?.detail);
1535
+ const R = await u.json();
1536
+ U("[CHAT] 429 agent at capacity:", R?.detail);
1494
1537
  } catch {
1495
1538
  }
1496
- R(""), l("Busy"), g(!1);
1539
+ se(""), b("Busy"), f(!1);
1497
1540
  return;
1498
1541
  }
1499
- if (!c.ok)
1542
+ if (!u.ok)
1500
1543
  throw new Error("Agent request failed");
1501
- const p = c.body;
1502
- if (!p) {
1503
- l("Agent Failed"), g(!1);
1544
+ const g = u.body;
1545
+ if (!g) {
1546
+ b("Agent Failed"), f(!1);
1504
1547
  return;
1505
1548
  }
1506
- const _ = p.getReader();
1507
- xe.current = !1;
1508
- const v = new TextDecoder();
1509
- let L = "";
1549
+ const v = g.getReader();
1550
+ ve.current = !1;
1551
+ const x = new TextDecoder();
1552
+ let A = "";
1510
1553
  for (; ; ) {
1511
- const { done: w, value: A } = await _.read();
1512
- B(
1513
- `[SSE] Chunk received. done=${w}, length=${A?.length || 0}`
1514
- ), A && (L += v.decode(A, { stream: !0 }));
1515
- const G = L.split(`
1554
+ const { done: R, value: C } = await v.read();
1555
+ U(
1556
+ `[SSE] Chunk received. done=${R}, length=${C?.length || 0}`
1557
+ ), C && (A += x.decode(C, { stream: !0 }));
1558
+ const X = A.split(`
1516
1559
 
1517
1560
  `);
1518
- L = G.pop() ?? "";
1519
- for (const Z of G) {
1520
- B(`[SSE] Processing block: ${Z.slice(0, 50)}...`);
1521
- const P = Ve(Z);
1522
- P && (B(`[SSE] Event: ${P.event}`), tt(P.event, P.data));
1561
+ A = X.pop() ?? "";
1562
+ for (const ie of X) {
1563
+ U(`[SSE] Processing block: ${ie.slice(0, 50)}...`);
1564
+ const $ = Ze(ie);
1565
+ $ && (U(`[SSE] Event: ${$.event}`), gt($.event, $.data));
1523
1566
  }
1524
- if (w) {
1525
- if (B("[SSE] Stream finished"), L.trim()) {
1526
- const Z = Ve(L.trim());
1527
- Z && tt(Z.event, Z.data);
1567
+ if (R) {
1568
+ if (U("[SSE] Stream finished"), A.trim()) {
1569
+ const ie = Ze(A.trim());
1570
+ ie && gt(ie.event, ie.data);
1528
1571
  }
1529
- l("Ready"), g(!1), R("");
1572
+ b("Ready"), f(!1), se("");
1530
1573
  break;
1531
1574
  }
1532
1575
  }
1533
- } catch (n) {
1534
- console.error("Chat Error:", n), l("Agent Failed"), g(!1);
1576
+ } catch (r) {
1577
+ console.error("Chat Error:", r), b("Agent Failed"), f(!1);
1535
1578
  }
1536
- }, nn = we.trim(), Ct = Wt(nn), ft = Ct && ee ? Ct.slice(
1579
+ }, wn = M.trim(), Jt = rn(wn), Et = Jt && O ? Jt.slice(
1537
1580
  0,
1538
- m != null && m > 0 ? m : 0
1581
+ ot != null && ot > 0 ? ot : 0
1539
1582
  ) : "";
1540
1583
  W(() => {
1541
- const e = it.current;
1542
- e !== "exiting" && (ft ? (Vt(ft), e === "hidden" && Xe("entering")) : (e === "visible" || e === "entering") && Xe("exiting"));
1543
- }, [ft, he]);
1544
- const rn = $e(() => {
1545
- const e = it.current;
1546
- e === "entering" ? Xe("visible") : e === "exiting" && Xe("hidden");
1584
+ const e = Ne.current;
1585
+ e !== "exiting" && (Et ? (Lt(Et), e === "hidden" && ze("entering")) : (e === "visible" || e === "entering") && ze("exiting"));
1586
+ }, [Et, oe]);
1587
+ const yn = et(() => {
1588
+ const e = Ne.current;
1589
+ e === "entering" ? ze("visible") : e === "exiting" && ze("hidden");
1547
1590
  }, []);
1548
- dn(() => {
1549
- const e = wt.current;
1591
+ Tn(() => {
1592
+ const e = dt.current;
1550
1593
  e && (e.scrollTop = e.scrollHeight);
1551
- }, [St]);
1552
- const sn = b === "female" ? kn : Ln;
1553
- return /* @__PURE__ */ le("div", { className: "avatar-widget-container", children: [
1554
- /* @__PURE__ */ le("div", { className: "avatar-input-area", children: [
1555
- oe !== "hidden" ? /* @__PURE__ */ d(
1594
+ }, [ft]);
1595
+ const Sn = J === "female" ? Wn : Bn;
1596
+ return rt ? /* @__PURE__ */ be("div", { className: "avatar-widget-container", children: [
1597
+ /* @__PURE__ */ be("div", { className: "avatar-input-area", children: [
1598
+ Ce !== "hidden" ? /* @__PURE__ */ l(
1556
1599
  "div",
1557
1600
  {
1558
- className: `avatar-thinking-tab${oe === "exiting" ? " avatar-thinking-tab--exiting" : oe === "entering" ? " avatar-thinking-tab--entering" : ""}`,
1559
- onAnimationEnd: $t,
1560
- children: Le === Bt ? /* @__PURE__ */ d(
1601
+ className: `avatar-thinking-tab${Ce === "exiting" ? " avatar-thinking-tab--exiting" : Ce === "entering" ? " avatar-thinking-tab--entering" : ""}`,
1602
+ onAnimationEnd: on,
1603
+ children: L === nn ? /* @__PURE__ */ l(
1561
1604
  "a",
1562
1605
  {
1563
1606
  href: "https://leads.streamoji.com",
@@ -1565,10 +1608,10 @@ const Cn = ({
1565
1608
  rel: "noopener noreferrer",
1566
1609
  children: "Made by Streamoji Leads"
1567
1610
  }
1568
- ) : Le
1611
+ ) : L
1569
1612
  }
1570
1613
  ) : null,
1571
- /* @__PURE__ */ d("div", { className: "avatar-input-container", children: /* @__PURE__ */ d(
1614
+ /* @__PURE__ */ l("div", { className: "avatar-input-container", children: /* @__PURE__ */ l(
1572
1615
  "div",
1573
1616
  {
1574
1617
  style: {
@@ -1577,15 +1620,15 @@ const Cn = ({
1577
1620
  width: "100%",
1578
1621
  height: "100%"
1579
1622
  },
1580
- children: ct ? /* @__PURE__ */ le("div", { className: "avatar-input-recording", children: [
1581
- /* @__PURE__ */ d(
1623
+ children: kt ? /* @__PURE__ */ be("div", { className: "avatar-input-recording", children: [
1624
+ /* @__PURE__ */ l(
1582
1625
  "button",
1583
1626
  {
1584
1627
  type: "button",
1585
1628
  className: "avatar-recording-cancel",
1586
- onClick: Qt,
1629
+ onClick: mn,
1587
1630
  title: "Cancel",
1588
- children: /* @__PURE__ */ le(
1631
+ children: /* @__PURE__ */ be(
1589
1632
  "svg",
1590
1633
  {
1591
1634
  width: "18",
@@ -1598,14 +1641,14 @@ const Cn = ({
1598
1641
  strokeLinejoin: "round",
1599
1642
  style: { display: "block" },
1600
1643
  children: [
1601
- /* @__PURE__ */ d("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1602
- /* @__PURE__ */ d("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1644
+ /* @__PURE__ */ l("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1645
+ /* @__PURE__ */ l("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1603
1646
  ]
1604
1647
  }
1605
1648
  )
1606
1649
  }
1607
1650
  ),
1608
- /* @__PURE__ */ le(
1651
+ /* @__PURE__ */ be(
1609
1652
  "div",
1610
1653
  {
1611
1654
  style: {
@@ -1617,8 +1660,8 @@ const Cn = ({
1617
1660
  minWidth: 0
1618
1661
  },
1619
1662
  children: [
1620
- /* @__PURE__ */ d("div", { style: { flex: 1, height: "100%" }, children: /* @__PURE__ */ d(Nt, { analyser: zt }) }),
1621
- /* @__PURE__ */ le(
1663
+ /* @__PURE__ */ l("div", { style: { flex: 1, height: "100%" }, children: /* @__PURE__ */ l(zt, { analyser: hn }) }),
1664
+ /* @__PURE__ */ be(
1622
1665
  "span",
1623
1666
  {
1624
1667
  style: {
@@ -1631,23 +1674,23 @@ const Cn = ({
1631
1674
  fontVariantNumeric: "tabular-nums"
1632
1675
  },
1633
1676
  children: [
1634
- Math.floor(At / 60),
1677
+ Math.floor(Pt / 60),
1635
1678
  ":",
1636
- String(At % 60).padStart(2, "0")
1679
+ String(Pt % 60).padStart(2, "0")
1637
1680
  ]
1638
1681
  }
1639
1682
  )
1640
1683
  ]
1641
1684
  }
1642
1685
  ),
1643
- /* @__PURE__ */ d(
1686
+ /* @__PURE__ */ l(
1644
1687
  "button",
1645
1688
  {
1646
1689
  type: "button",
1647
1690
  className: "avatar-recording-confirm",
1648
- onClick: Kt,
1691
+ onClick: fn,
1649
1692
  title: "Send",
1650
- children: /* @__PURE__ */ d(
1693
+ children: /* @__PURE__ */ l(
1651
1694
  "svg",
1652
1695
  {
1653
1696
  width: "18",
@@ -1659,13 +1702,13 @@ const Cn = ({
1659
1702
  strokeLinecap: "round",
1660
1703
  strokeLinejoin: "round",
1661
1704
  style: { display: "block" },
1662
- children: /* @__PURE__ */ d("polyline", { points: "20 6 9 17 4 12" })
1705
+ children: /* @__PURE__ */ l("polyline", { points: "20 6 9 17 4 12" })
1663
1706
  }
1664
1707
  )
1665
1708
  }
1666
1709
  )
1667
- ] }) : ee && !ot ? /* @__PURE__ */ le("div", { className: "avatar-input-speaking", children: [
1668
- /* @__PURE__ */ d(
1710
+ ] }) : O && !_ ? /* @__PURE__ */ be("div", { className: "avatar-input-speaking", children: [
1711
+ /* @__PURE__ */ l(
1669
1712
  "div",
1670
1713
  {
1671
1714
  style: {
@@ -1675,20 +1718,20 @@ const Cn = ({
1675
1718
  alignItems: "center",
1676
1719
  paddingRight: "8px"
1677
1720
  },
1678
- children: /* @__PURE__ */ d(Nt, { analyser: Mt })
1721
+ children: /* @__PURE__ */ l(zt, { analyser: Wt })
1679
1722
  }
1680
1723
  ),
1681
- /* @__PURE__ */ d(
1724
+ /* @__PURE__ */ l(
1682
1725
  "button",
1683
1726
  {
1684
1727
  type: "button",
1685
1728
  className: "avatar-speaking-stop",
1686
- onClick: () => Ge(!0),
1729
+ onClick: () => st(!0),
1687
1730
  title: "Stop",
1688
- children: /* @__PURE__ */ d("span", { className: "avatar-speaking-stop__icon", "aria-hidden": !0 })
1731
+ children: /* @__PURE__ */ l("span", { className: "avatar-speaking-stop__icon", "aria-hidden": !0 })
1689
1732
  }
1690
1733
  )
1691
- ] }) : Q ? /* @__PURE__ */ d(
1734
+ ] }) : ae ? /* @__PURE__ */ l(
1692
1735
  "div",
1693
1736
  {
1694
1737
  style: {
@@ -1698,12 +1741,12 @@ const Cn = ({
1698
1741
  alignItems: "center",
1699
1742
  justifyContent: "center"
1700
1743
  },
1701
- children: /* @__PURE__ */ d("div", { className: "avatar-input-loader" })
1744
+ children: /* @__PURE__ */ l("div", { className: "avatar-input-loader" })
1702
1745
  }
1703
- ) : /* @__PURE__ */ le(
1746
+ ) : /* @__PURE__ */ be(
1704
1747
  "form",
1705
1748
  {
1706
- onSubmit: en,
1749
+ onSubmit: bn,
1707
1750
  style: {
1708
1751
  flex: 1,
1709
1752
  display: "flex",
@@ -1711,20 +1754,20 @@ const Cn = ({
1711
1754
  alignItems: "center"
1712
1755
  },
1713
1756
  children: [
1714
- /* @__PURE__ */ d(
1757
+ /* @__PURE__ */ l(
1715
1758
  "input",
1716
1759
  {
1717
1760
  id: "avatar-text-input",
1718
1761
  type: "text",
1719
- value: se,
1720
- onChange: (e) => R(e.target.value),
1721
- placeholder: j === "Busy" ? "Assisting another user" : te || "Ask me anything",
1722
- disabled: Q || j === "Busy",
1762
+ value: q,
1763
+ onChange: (e) => se(e.target.value),
1764
+ placeholder: H === "Busy" ? "Assisting another user" : N || "Ask me anything",
1765
+ disabled: ae || H === "Busy",
1723
1766
  autoComplete: "off",
1724
1767
  style: { width: "100%", height: "100%" }
1725
1768
  }
1726
1769
  ),
1727
- j === "Busy" ? /* @__PURE__ */ d(
1770
+ H === "Busy" ? /* @__PURE__ */ l(
1728
1771
  "button",
1729
1772
  {
1730
1773
  type: "button",
@@ -1732,7 +1775,7 @@ const Cn = ({
1732
1775
  disabled: !0,
1733
1776
  style: { backgroundColor: "#1e4a5e" },
1734
1777
  title: "Agent at capacity",
1735
- children: /* @__PURE__ */ d(
1778
+ children: /* @__PURE__ */ l(
1736
1779
  "svg",
1737
1780
  {
1738
1781
  width: "24",
@@ -1741,7 +1784,7 @@ const Cn = ({
1741
1784
  fill: "none",
1742
1785
  xmlns: "http://www.w3.org/2000/svg",
1743
1786
  "aria-hidden": "true",
1744
- children: /* @__PURE__ */ d(
1787
+ children: /* @__PURE__ */ l(
1745
1788
  "path",
1746
1789
  {
1747
1790
  d: "M4 2L20 2L12 10L4 2z M12 14L4 22L20 22L12 14z",
@@ -1751,15 +1794,15 @@ const Cn = ({
1751
1794
  }
1752
1795
  )
1753
1796
  }
1754
- ) : se.trim() === "" ? /* @__PURE__ */ d(
1797
+ ) : q.trim() === "" ? /* @__PURE__ */ l(
1755
1798
  "button",
1756
1799
  {
1757
1800
  type: "button",
1758
1801
  className: "mic-button",
1759
- onClick: Yt,
1760
- disabled: Q,
1802
+ onClick: dn,
1803
+ disabled: ae,
1761
1804
  style: { backgroundColor: "#1e4a5e" },
1762
- children: /* @__PURE__ */ le(
1805
+ children: /* @__PURE__ */ be(
1763
1806
  "svg",
1764
1807
  {
1765
1808
  width: "28",
@@ -1768,14 +1811,14 @@ const Cn = ({
1768
1811
  fill: "none",
1769
1812
  xmlns: "http://www.w3.org/2000/svg",
1770
1813
  children: [
1771
- /* @__PURE__ */ d(
1814
+ /* @__PURE__ */ l(
1772
1815
  "path",
1773
1816
  {
1774
1817
  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",
1775
1818
  fill: "white"
1776
1819
  }
1777
1820
  ),
1778
- /* @__PURE__ */ d(
1821
+ /* @__PURE__ */ l(
1779
1822
  "path",
1780
1823
  {
1781
1824
  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",
@@ -1786,15 +1829,15 @@ const Cn = ({
1786
1829
  }
1787
1830
  )
1788
1831
  }
1789
- ) : /* @__PURE__ */ d(
1832
+ ) : /* @__PURE__ */ l(
1790
1833
  "button",
1791
1834
  {
1792
1835
  type: "submit",
1793
1836
  className: "mic-button",
1794
- disabled: Q,
1837
+ disabled: ae,
1795
1838
  style: { backgroundColor: "#1e4a5e" },
1796
1839
  title: "Send",
1797
- children: /* @__PURE__ */ d(
1840
+ children: /* @__PURE__ */ l(
1798
1841
  "svg",
1799
1842
  {
1800
1843
  width: 24,
@@ -1802,7 +1845,7 @@ const Cn = ({
1802
1845
  viewBox: "0 0 24 24",
1803
1846
  fill: "none",
1804
1847
  "aria-hidden": "true",
1805
- children: /* @__PURE__ */ d(
1848
+ children: /* @__PURE__ */ l(
1806
1849
  "path",
1807
1850
  {
1808
1851
  d: "M19 12H5M19 12L14 17M19 12L14 7",
@@ -1822,22 +1865,22 @@ const Cn = ({
1822
1865
  }
1823
1866
  ) })
1824
1867
  ] }),
1825
- /* @__PURE__ */ d("div", { className: "avatar-wrapper", children: /* @__PURE__ */ le("div", { className: "avatar-scene-wrapper", children: [
1826
- he !== "hidden" && /* @__PURE__ */ d(
1868
+ /* @__PURE__ */ l("div", { className: "avatar-wrapper", children: /* @__PURE__ */ be("div", { className: "avatar-scene-wrapper", children: [
1869
+ oe !== "hidden" && /* @__PURE__ */ l(
1827
1870
  "div",
1828
1871
  {
1829
- className: `avatar-bubble${he === "entering" ? " avatar-bubble--entering" : he === "exiting" ? " avatar-bubble--exiting" : ""}`,
1830
- onAnimationEnd: rn,
1831
- children: /* @__PURE__ */ d("div", { ref: wt, className: `avatar-bubble__content${ot ? " avatar-bubble__content--nudge" : ""}`, children: St })
1872
+ className: `avatar-bubble${oe === "entering" ? " avatar-bubble--entering" : oe === "exiting" ? " avatar-bubble--exiting" : ""}`,
1873
+ onAnimationEnd: yn,
1874
+ children: /* @__PURE__ */ l("div", { ref: dt, className: `avatar-bubble__content${_ ? " avatar-bubble__content--nudge" : ""}`, children: ft })
1832
1875
  }
1833
1876
  ),
1834
- /* @__PURE__ */ d(
1877
+ /* @__PURE__ */ l(
1835
1878
  "div",
1836
1879
  {
1837
1880
  className: "avatar-canvas-layer",
1838
- style: { width: F, height: F },
1839
- children: /* @__PURE__ */ le(
1840
- cn,
1881
+ style: { width: G, height: G },
1882
+ children: /* @__PURE__ */ be(
1883
+ kn,
1841
1884
  {
1842
1885
  shadows: !0,
1843
1886
  camera: { position: [0.2, 1.4, 3], fov: 42 },
@@ -1845,30 +1888,30 @@ const Cn = ({
1845
1888
  dpr: 1.8,
1846
1889
  style: { pointerEvents: "none", width: "100%", height: "100%" },
1847
1890
  children: [
1848
- /* @__PURE__ */ d(In, { target: sn }),
1849
- /* @__PURE__ */ d("ambientLight", { intensity: 0.7 }),
1850
- /* @__PURE__ */ d("directionalLight", { position: [0, 2, 2], intensity: 1 }),
1851
- /* @__PURE__ */ d(on, { preset: "city" }),
1852
- /* @__PURE__ */ d(hn, { fallback: null, children: Ue !== null && /* @__PURE__ */ d(
1853
- Dn,
1891
+ /* @__PURE__ */ l(zn, { target: Sn }),
1892
+ /* @__PURE__ */ l("ambientLight", { intensity: 0.7 }),
1893
+ /* @__PURE__ */ l("directionalLight", { position: [0, 2, 2], intensity: 1 }),
1894
+ /* @__PURE__ */ l(Ln, { preset: "city" }),
1895
+ /* @__PURE__ */ l(An, { fallback: null, children: Ae !== null && /* @__PURE__ */ l(
1896
+ Yn,
1854
1897
  {
1855
- avatarUrl: Ue,
1856
- isPlayingRef: U,
1857
- visemeQueueRef: N,
1858
- audioContextRef: O,
1859
- responseAudioStartTimeRef: ye,
1860
- adjustments: xn,
1861
- mood: o,
1862
- expression: M,
1863
- agentResponse: we,
1864
- isSpeaking: ee,
1865
- nextStartTimeRef: de,
1866
- stopPlayback: Ge,
1867
- setIsSpeaking: k,
1868
- expressionUrl: rt,
1869
- onExpressionFinished: Jt,
1870
- isNudgeResponse: ot,
1871
- avatarGender: b
1898
+ avatarUrl: Ae,
1899
+ isPlayingRef: Ve,
1900
+ visemeQueueRef: Me,
1901
+ audioContextRef: we,
1902
+ responseAudioStartTimeRef: De,
1903
+ adjustments: Pn,
1904
+ mood: h,
1905
+ expression: o,
1906
+ agentResponse: M,
1907
+ isSpeaking: O,
1908
+ nextStartTimeRef: $e,
1909
+ stopPlayback: st,
1910
+ setIsSpeaking: z,
1911
+ expressionUrl: D,
1912
+ onExpressionFinished: cn,
1913
+ isNudgeResponse: _,
1914
+ avatarGender: J
1872
1915
  }
1873
1916
  ) })
1874
1917
  ]
@@ -1877,23 +1920,21 @@ const Cn = ({
1877
1920
  }
1878
1921
  )
1879
1922
  ] }) })
1880
- ] });
1881
- }, Wn = ({
1882
- token: f,
1883
- avatarGender: T,
1884
- onNavigationRequested: x,
1885
- presetUserDetails: b,
1886
- onAvatarReady: S
1887
- }) => /* @__PURE__ */ d(
1888
- Cn,
1923
+ ] }) : null;
1924
+ }, rr = ({
1925
+ agentId: p,
1926
+ onNavigationRequested: E,
1927
+ presetUserDetails: w,
1928
+ onAvatarReady: y
1929
+ }) => /* @__PURE__ */ l(
1930
+ Qn,
1889
1931
  {
1890
- token: f,
1891
- onNavigationRequested: x,
1892
- avatarGender: T,
1893
- presetUserDetails: b,
1894
- onAvatarReady: S
1932
+ agentId: p,
1933
+ onNavigationRequested: E,
1934
+ presetUserDetails: w,
1935
+ onAvatarReady: y
1895
1936
  }
1896
1937
  );
1897
1938
  export {
1898
- Wn as AvatarWidget
1939
+ rr as AvatarWidget
1899
1940
  };