@streamoji/avatar-widget 0.4.2 → 0.4.4

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