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