@streamoji/avatar-widget 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),Be=require("@react-three/drei"),Ke=require("@react-three/fiber"),e=require("react"),Tt=require("three"),Et=require("three/examples/jsm/loaders/GLTFLoader.js");function Mt(c){const w=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const m in c)if(m!=="default"){const h=Object.getOwnPropertyDescriptor(c,m);Object.defineProperty(w,m,h.get?h:{enumerable:!0,get:()=>c[m]})}}return w.default=c,Object.freeze(w)}const Ce=Mt(Tt),U=(...c)=>{},It=(...c)=>{},ct=({analyser:c})=>{const w=e.useRef(null),m=e.useRef(null);return e.useEffect(()=>{const h=w.current;if(!h)return;const F=h.getContext("2d",{alpha:!0});if(!F)return;let M,k=null;c&&(c.fftSize=128,k=new Uint8Array(c.frequencyBinCount));const de=()=>{M=requestAnimationFrame(de),(h.width!==h.offsetWidth||h.height!==h.offsetHeight)&&(h.width=h.offsetWidth,h.height=h.offsetHeight);const re=h.width,v=h.height;if(re===0||v===0)return;const S=v/2;F.clearRect(0,0,re,v),F.fillStyle="#1e293b";const Q=2,T=Q+2,oe=re*.95,b=Math.floor(oe/T);(!m.current||m.current.length!==b)&&(m.current=new Float32Array(b).fill(2));const Se=b*T,Z=(re-Se)/2;c&&k&&c.getByteFrequencyData(k);const fe=k?k.length:0,$=Math.floor(fe*.7)/b,D=new Float32Array(b);for(let g=0;g<b;g++){let B=0;if(k&&$>0){const _=Math.floor(g*$),X=Math.floor((g+1)*$);for(let q=_;q<X;q++){const ce=k[q]||0;ce>B&&(B=ce)}}B<10&&(B=0);const A=B/255,y=B>0?Math.max(2,Math.pow(A,1.4)*v*.25):2;D[g]=y}for(let g=0;g<b;g++){const B=b-1-g,A=Math.max(D[g],D[B]),y=m.current[g]+(A-m.current[g])*.3;m.current[g]=y;const _=Z+g*T,X=S-y/2;F.beginPath(),F.roundRect?F.roundRect(_,X,Q,y,4):F.fillRect(_,X,Q,y),F.fill()}};return de(),()=>{cancelAnimationFrame(M)}},[c]),i.jsx("canvas",{ref:w,style:{width:"100%",height:"100%",display:"block"}})},ut="https://ai.streamoji.com",Ct="https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev",lt="https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/fullbodyavatarmale.glb";async function Ot(c){const w=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(c));return Array.from(new Uint8Array(w)).map(m=>m.toString(16).padStart(2,"0")).join("")}function Dt(c){const[w,m]=e.useState(null);return e.useEffect(()=>{if(!c){m(null);return}let h=!1;return Ot(c).then(F=>{if(h)return;const M=`${Ct}/${F}.glb`;fetch(M,{method:"HEAD"}).then(k=>{h||m(k.ok?M:lt)}).catch(()=>{h||m(lt)})}),()=>{h=!0}},[c]),w}const Ft=["https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_001.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_002.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_002.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_005.glb"],jt=[{id:"m_expr_01",name:"Friendly Wave",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_001.glb"},{id:"m_expr_02",name:"You There",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_002.glb"},{id:"m_expr_04",name:"Awkward Agreement",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_004.glb"},{id:"m_expr_05",name:"What's Going On?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_005.glb"},{id:"m_expr_06",name:"Tired Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_006.glb"},{id:"m_expr_07",name:"Conceilied Laughter",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_007.glb"},{id:"m_expr_08",name:"You Come Here",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_008.glb"},{id:"m_expr_09",name:"Come Here Kid",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_009.glb"},{id:"m_expr_10",name:"Come Here Everyone",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_010.glb"},{id:"m_expr_11",name:"No Freaking Way",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_011.glb"},{id:"m_expr_12",name:"Cheerful Approval",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_012.glb"},{id:"m_expr_13",name:"Waving Hello",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_013.glb"},{id:"m_expr_14",name:"Checking Surroundings",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_014.glb"},{id:"m_expr_15",name:"Referee Warning",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_015.glb"},{id:"m_expr_16",name:"You Thumbs Down",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_016.glb"},{id:"m_expr_17",name:"Side Thumbs Down",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_017.glb"},{id:"m_expr_18",name:"You're Finished",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_018.glb"},{id:"m_talk_01",name:"Oh God, Why Me?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_001.glb"},{id:"m_talk_02",name:"What Are You Doing?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_002.glb"},{id:"m_talk_03",name:"What Am I doing?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_003.glb"},{id:"m_talk_04",name:"No Way",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_004.glb"},{id:"m_talk_05",name:"What's Going On?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb"},{id:"m_talk_06",name:"I have no idea",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_006.glb"},{id:"m_talk_07",name:"What's going on here?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb"},{id:"m_talk_08",name:"Let's stop",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_008.glb"},{id:"m_talk_09",name:"Fed Up Moment",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_009.glb"},{id:"m_talk_10",name:"What's This? Hold On",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_010.glb"},{id:"f_talk_01",name:"Great Job Clap",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_001.glb"},{id:"f_talk_02",name:"Chill Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_002.glb"},{id:"f_talk_03",name:"This Is Me",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_003.glb"},{id:"f_talk_04",name:"Empathize",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_004.glb"},{id:"f_talk_05",name:"Loose Hands Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_005.glb"},{id:"f_talk_06",name:"Take It Easy",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_006.glb"}],Ut=["https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb"],Nt={zoom:.85,position:[.15,-.8,0],scale:1.5,rotation:[.15,.02,0]},Pt=[-.45,1.9,.1],Wt={browInnerUp:.2},Xe=.18,Bt=1,We={neutral:{eyeLookDownLeft:.1,eyeLookDownRight:.1},happy:{mouthSmileLeft:.2,mouthSmileRight:.2,eyeLookDownLeft:.1,eyeLookDownRight:.1},sad:{eyeLookDownLeft:.2,eyeLookDownRight:.2,browDownRight:.1,browInnerUp:.6,browOuterUpRight:.2,eyeSquintLeft:.7,eyeSquintRight:.7,mouthFrownLeft:.8,mouthFrownRight:.8,mouthLeft:.2,mouthPucker:.5,mouthRollLower:.2,mouthRollUpper:.2,mouthShrugLower:.2,mouthShrugUpper:.2,mouthStretchLeft:.4},angry:{eyeLookDownLeft:.1,eyeLookDownRight:.1,browDownLeft:.6,browDownRight:.6,jawForward:.3,mouthFrownLeft:.7,mouthFrownRight:.7,mouthRollLower:.2,mouthShrugLower:.3},fear:{browInnerUp:.7,eyeSquintLeft:.5,eyeSquintRight:.5,eyeWideLeft:.6,eyeWideRight:.6,mouthClose:.1,mouthFunnel:.3,mouthShrugLower:.5,mouthShrugUpper:.5},disgust:{browDownLeft:.7,browDownRight:.1,browInnerUp:.3,eyeSquintLeft:1,eyeSquintRight:1,eyeWideLeft:.5,eyeWideRight:.5,mouthLeft:.4,mouthPressLeft:.3,mouthRollLower:.3,mouthShrugLower:.3,mouthShrugUpper:.8,mouthUpperUpLeft:.3,noseSneerLeft:1,noseSneerRight:.7},love:{browInnerUp:.4,browOuterUpLeft:.2,browOuterUpRight:.2,mouthSmileLeft:.2,mouthSmileRight:.2,eyeBlinkLeft:.6,eyeBlinkRight:.6,eyeWideLeft:.7,eyeWideRight:.7,mouthDimpleLeft:.1,mouthDimpleRight:.1,mouthPressLeft:.2,mouthShrugUpper:.2,mouthUpperUpLeft:.1,mouthUpperUpRight:.1}},Ht=[{key:"viseme_aa",mix:{jawOpen:.6}},{key:"viseme_E",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthDimpleLeft:1,mouthDimpleRight:1,jawOpen:.3}},{key:"viseme_I",mix:{mouthPressLeft:.6,mouthPressRight:.6,mouthDimpleLeft:.6,mouthDimpleRight:.6,jawOpen:.2}},{key:"viseme_O",mix:{mouthPucker:1,jawForward:.6,jawOpen:.2}},{key:"viseme_U",mix:{mouthFunnel:1}},{key:"viseme_PP",mix:{mouthRollLower:.3,mouthRollUpper:.3,mouthUpperUpLeft:.3,mouthUpperUpRight:.3}},{key:"viseme_FF",mix:{mouthPucker:1,mouthShrugUpper:1,mouthLowerDownLeft:.2,mouthLowerDownRight:.2,mouthDimpleLeft:1,mouthDimpleRight:1,mouthRollLower:.3}},{key:"viseme_DD",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthFunnel:.5,jawOpen:.2}},{key:"viseme_SS",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthLowerDownLeft:.5,mouthLowerDownRight:.5,jawOpen:.1}},{key:"viseme_TH",mix:{mouthRollUpper:.3,jawOpen:.2,tongueOut:.4}},{key:"viseme_CH",mix:{mouthPucker:.5,jawOpen:.2}},{key:"viseme_RR",mix:{mouthPucker:.5,jawOpen:.2}},{key:"viseme_kk",mix:{mouthLowerDownLeft:.4,mouthLowerDownRight:.4,mouthDimpleLeft:.3,mouthDimpleRight:.3,mouthFunnel:.3,mouthPucker:.3,jawOpen:.15}},{key:"viseme_nn",mix:{mouthLowerDownLeft:.4,mouthLowerDownRight:.4,mouthDimpleLeft:.3,mouthDimpleRight:.3,mouthFunnel:.3,mouthPucker:.3,jawOpen:.15,tongueOut:.2}},{key:"viseme_sil",mix:{}}],Vt={aei:[{v:"E",w:.8},{v:"I",w:.2}],ee:[{v:"I",w:1}],oo:[{v:"O",w:1}],u:[{v:"U",w:1}],aa:[{v:"aa",w:1}],ah:[{v:"aa",w:.7},{v:"O",w:.3}],bmp:[{v:"PP",w:1}],fv:[{v:"FF",w:1}],th:[{v:"TH",w:1}],l:[{v:"nn",w:1}],r:[{v:"RR",w:1}],qw:[{v:"U",w:.6},{v:"O",w:.4}],chjsh:[{v:"CH",w:1}],cdgknstxyz:[{v:"DD",w:.6},{v:"SS",w:.4}],sil:[{v:"sil",w:1}]};function $t(c){if(!c)return[{v:"sil",w:1}];const w=c.toLowerCase();return Vt[w]??[{v:"sil",w:1}]}function qt({target:c}){const{camera:w}=Ke.useThree();return e.useEffect(()=>{w.lookAt(...c)},[w,c]),null}function G(c,w,m){if(!c||!c.morphTargetDictionary)return;const h=c,F=h.morphTargetDictionary,M=h.morphTargetInfluences;if(M)for(const k in F)k.toLowerCase()===w.toLowerCase()&&(M[F[k]]=m)}function dt(c,w=.97){if(!c)return;const m=c;if(m.morphTargetInfluences)for(let h=0;h<m.morphTargetInfluences.length;h++)m.morphTargetInfluences[h]*=w}const Jt=e.memo(({avatarUrl:c,isPlayingRef:w,visemeQueueRef:m,audioContextRef:h,responseAudioStartTimeRef:F,adjustments:M,mood:k,expression:de,agentResponse:re,isSpeaking:v,nextStartTimeRef:S,stopPlayback:Q,setIsSpeaking:O,expressionUrl:T,onExpressionFinished:oe})=>{const{scene:b}=Be.useGLTF(c),Se=Be.useGLTF(Ft),Z=e.useMemo(()=>Se.flatMap(f=>f.animations),[Se]),fe=Be.useGLTF(Ut),se=e.useMemo(()=>fe.flatMap(f=>f.animations),[fe]),$=e.useRef(null),D=e.useRef(null),g=e.useRef(null),B=e.useRef([]),[A]=e.useState(()=>new Ce.AnimationMixer(b)),y=e.useRef({}),_=e.useRef(null),X=e.useRef(0),q=e.useRef(!1),ce=e.useRef(0),ee=e.useRef(null);e.useEffect(()=>{if(!(!Z||!b)){if(Z.forEach((f,d)=>{const a=`idle_${d}`;if(!y.current[a]){const r=A.clipAction(f,b);r.name=a,r.setLoop(Ce.LoopOnce,1),r.clampWhenFinished=!0,y.current[a]=r}}),se.forEach((f,d)=>{const a=`talk_${d}`;if(!y.current[a]){const r=A.clipAction(f,b);r.name=a,r.setLoop(Ce.LoopOnce,1),r.clampWhenFinished=!0,y.current[a]=r}}),Z.length>0){const f=y.current.idle_0,d=_.current&&A.existingAction(_.current.getClip());f&&!d&&(f.reset().fadeIn(.5).play(),_.current=f)}return()=>{A.stopAllAction(),y.current={},_.current=null}}},[Z,se,b,A]);const xe=e.useRef("");e.useEffect(()=>{if(!T||!b||T===xe.current)return;xe.current=T,ee.current=T,new Et.GLTFLoader().load(T,d=>{if(d.animations&&d.animations.length>0){const a=d.animations[0],r=A.clipAction(a,b);if(r.name=`EXPR_${T}`,r.setLoop(Ce.LoopOnce,1),r.clampWhenFinished=!0,y.current[`EXPR_${T}`]=r,v&&ee.current===T){const p=_.current;r.reset().fadeIn(.3).play(),p&&p!==r&&p.crossFadeTo(r,.3,!0),_.current=r,ee.current=null}}},void 0,d=>{console.error(`[ANIMATION] Failed to load ${T}`,d)})},[T,b,A,v]),e.useEffect(()=>{const f=d=>{const a=d.action,r=a.name||"";if(r.startsWith("idle_")){const H=(parseInt(r.split("_")[1])+1)%Z.length,z=y.current[`idle_${H}`];z&&(z.reset().fadeIn(.5).play(),a.crossFadeTo(z,.5,!0),_.current=z)}else if(r.startsWith("EXPR_")){if(v){const p=y.current.talk_0;p&&(p.reset().fadeIn(.5).play(),a.crossFadeTo(p,.5,!0),_.current=p)}else{const p=y.current.idle_0;p&&(p.reset().fadeIn(.5).play(),a.crossFadeTo(p,.5,!0),_.current=p)}oe&&oe()}else if(r.startsWith("talk_"))if(v){const H=(parseInt(r.split("_")[1])+1)%se.length,z=y.current[`talk_${H}`];z&&(z.reset().fadeIn(.3).play(),a.crossFadeTo(z,.3,!0),_.current=z)}else{const p=y.current.idle_0;p&&(p.reset().fadeIn(.5).play(),a.crossFadeTo(p,.5,!0),_.current=p)}};return A.addEventListener("finished",f),()=>A.removeEventListener("finished",f)},[A,Z,se,v,oe]),e.useEffect(()=>{if(v&&b){const f=_.current,d=f?.name||"";if(d.startsWith("idle_")||d.startsWith("talk_")||d===""){const a=ee.current;if(a){const r=y.current[`EXPR_${a}`];if(r){r.reset().fadeIn(.3).play(),f&&f!==r&&f.crossFadeTo(r,.3,!0),_.current=r,ee.current=null;return}}if(d.startsWith("idle_")||d===""){const r=y.current.talk_0;r&&(r.reset().fadeIn(.5).play(),f&&f.crossFadeTo(r,.5,!0),_.current=r)}}}else if(!v&&b){const f=_.current,d=f?.name||"";if(d.startsWith("talk_")||d.startsWith("EXPR_")){const a=y.current.idle_0;a&&(a.reset().fadeIn(.5).play(),f&&f.crossFadeTo(a,.5,!0),_.current=a)}}},[v,b,T]),e.useEffect(()=>{if(!b)return;b.traverse(a=>{if(a.isMesh&&a.morphTargetDictionary){const r=a.name.toLowerCase();(r.includes("head")||r.includes("avatar"))&&(D.current=a,U(`[ANIMATION] Found head mesh: ${a.name}`)),r.includes("teeth")&&(g.current=a,U(`[ANIMATION] Found teeth mesh: ${a.name}`))}});const f=D.current?.morphTargetDictionary;f&&Object.keys(f).filter(a=>a.toLowerCase().includes("brow"));const d=[];b.traverse(a=>{if(a.isMesh){const p=a.morphTargetDictionary;p&&Object.keys(p).some(H=>H.toLowerCase().includes("brow"))&&d.push(a)}}),B.current=d,d.length>0&&U("[ANIMATION] Meshes with brow morphs:",d.length)},[b]);const Oe=(f,d=1)=>{const a=`viseme_${f}`.toLowerCase(),r=Ht.find(p=>p.key.toLowerCase()===a);if(r)for(const p in r.mix){const H=r.mix[p]*d;G(D.current,p,H),G(g.current,p,H)}},Te=f=>{const d=We[f]??We.neutral;for(const a in d)G(D.current,a,d[a]),G(g.current,a,d[a])};return Ke.useFrame((f,d)=>{const a=Math.pow(.88,60*d);dt(D.current,a),dt(g.current,a),Te(k);const r=f.clock.elapsedTime;let p=0;if(Math.floor(r)%5===0&&Math.floor((r-d)%5)!==0){let V=null;b.traverse(J=>{J.name.toLowerCase().includes("hips")&&(V=J)});const P=V?`Hips Y: ${V.position.y.toFixed(4)}`:"Hips not found";U(`[ANIMATION] Mixer Time: ${A.time.toFixed(2)}, ${P}`)}if(A.update(d),r>X.current&&!q.current&&(q.current=!0,ce.current=r),q.current){const P=(r-ce.current)/.3;if(P>=1)q.current=!1,X.current=r+2+Math.random()*5;else{const J=P<.5?P*2:(1-P)*2;G(D.current,"eyeBlinkLeft",J),G(D.current,"eyeBlinkRight",J),G(g.current,"eyeBlinkLeft",J),G(g.current,"eyeBlinkRight",J),p=J*Wt.browInnerUp}}const H=We[k]??We.neutral,z=H.browInnerUp??0,me=H.browOuterUpLeft??0,he=H.browOuterUpRight??0,ve=r*Bt,pe=Xe*Math.sin(ve),ge=Xe*.7*Math.sin(ve+.7),Ee=Xe*.7*Math.sin(ve+1.3),be=V=>Math.max(0,Math.min(1,V)),Me=be(z+pe),ye=be(me+ge),He=be(he+Ee),De=be(Me+p);if(G(D.current,"browInnerUp",De),G(g.current,"browInnerUp",De),G(D.current,"browOuterUpLeft",ye),G(g.current,"browOuterUpLeft",ye),G(D.current,"browOuterUpRight",He),G(g.current,"browOuterUpRight",He),$.current){const V=w.current?0:M.rotation[1];$.current.rotation.y=Ce.MathUtils.lerp($.current.rotation.y,V,.1),$.current.position.set(...M.position),$.current.scale.setScalar(M.scale),$.current.rotation.x=M.rotation[0],$.current.rotation.z=M.rotation[2]}if(w.current&&h.current){const V=h.current.currentTime,Ie=(V-F.current)*1e3- -150;for(let Re=0;Re<m.current.length;Re++){const K=m.current[Re];Ie>=K.vtime&&Ie<K.vtime+K.vduration&&Oe(K.viseme,K.weight??1)}V>S.current+.5&&(Q(),O(!1))}}),i.jsx("group",{ref:$,children:i.jsx("primitive",{object:b})})});function Gt(c){return c?c.charAt(0).toUpperCase()+c.slice(1).toLowerCase():""}const zt=({token:c,agentToken:w,onNavigationRequested:m}={})=>{const h=c??w??"",F=Dt(h||void 0),[M,k]=e.useState(""),[de,re]=e.useState(""),[v,S]=e.useState("Ready"),[Q,O]=e.useState(!1),[T,oe]=e.useState(!1),[b,Se]=e.useState(()=>typeof window<"u"?window.matchMedia("(max-width: 480px)").matches:!1);e.useEffect(()=>{const t=window.matchMedia("(max-width: 480px)"),n=()=>Se(t.matches);return t.addEventListener("change",n),()=>t.removeEventListener("change",n)},[]);const Z=b?80:600,fe=e.useRef(!1),se=e.useRef([]),$=e.useRef(0),D=e.useRef(!1),g=e.useRef([]),B=e.useRef(null),A=e.useRef([]);e.useRef([]);const y=e.useRef([]),_=e.useRef(0),X=e.useRef(0),q=e.useRef(0),ce=e.useRef(0),ee=e.useRef(!1),[xe,Oe]=e.useState(null),Te=e.useRef(null),[f,d]=e.useState("neutral"),[a,r]=e.useState(""),[p,H]=e.useState(""),[z,me]=e.useState("Chat with us"),[he,ve]=e.useState(null),[pe,ge]=e.useState("hidden"),[Ee,be]=e.useState(""),Me=e.useRef(null),ye=e.useRef(pe);ye.current=pe;const[He,De]=e.useState(null),V=e.useRef(null),P=e.useRef(null),[J,Ie]=e.useState(!1),Re=e.useRef(null),[K,Fe]=e.useState("hidden"),[Qe,ft]=e.useState(""),Ve=e.useRef(K);Ve.current=K;const ue=e.useRef(""),ke=e.useRef(!1),Ae=e.useRef(""),Le=e.useMemo(()=>J?"Try again":v==="Busy"?"Busy":v==="Thinking..."||v==="Processing Voice..."?v:he!=null&&he!==""&&he!=="none"&&he!=="<none>"?`Enter ${Gt(he)}`:null,[v,he,J]),je=Le!=null&&Le!=="";e.useEffect(()=>{const t=ye.current;if(!(t==="exiting"||t==="entering")){if(t==="hidden"){je&&(be(Le??""),ge("entering"));return}t==="visible"&&(!je||Le!==Ee)&&(Me.current=je?Le:null,ge("exiting"))}},[je,Le,pe,Ee]),e.useEffect(()=>{if(v!=="Busy"){P.current!=null&&(clearTimeout(P.current),P.current=null);return}return P.current=setTimeout(()=>{P.current=null,S("Ready"),Ie(!0)},12e3),()=>{P.current!=null&&(clearTimeout(P.current),P.current=null)}},[v]),e.useEffect(()=>{if(!J)return;const t=setTimeout(()=>Ie(!1),2500);return()=>clearTimeout(t)},[J]);const ht=e.useCallback(()=>{const t=ye.current;if(t==="exiting"){ge("hidden");const n=Me.current;Me.current=null,n!=null&&n!==""&&(be(n),ge("entering"))}else t==="entering"&&ge("visible")},[]),pt=t=>{if(!t)return;if(t.mood!=null){const s=String(t.mood).toLowerCase();d(s)}if(t.expression!=null){const s=String(t.expression).trim();r(s);const u=jt.find(x=>x.name.toLowerCase()===s.toLowerCase());U(`[STREAM] Animation match for "${s}": ${u?u.name:"NONE"}`),H(u?.url??"")}if(t.navigation!=null){const s=String(t.navigation).trim();s!==""&&(m?m(s):window.open(s,"_blank"))}const n=t.ask_for||t.lead_capture?.ask_for,o=n?String(n).trim().toLowerCase():"",l=o==="none"||o==="<none>";if(n&&!l){const s=o;ve(s||null),me(s==="email"?"Enter your email":s==="name"?"Enter your name":s==="phone"?"Enter your phone number":"Chat with us")}else(l||t.ask_for===null||t.lead_capture&&t.lead_capture.ask_for===null||t.ask_for==="none")&&(ve(null),z!=="Chat with us"&&me("Chat with us"));t.collected,t.valid},mt=t=>{const n=t.trim();if(!n)return null;if(n.startsWith("{"))try{return JSON.parse(n)}catch{return null}if(n.includes(":")){const o=n.split(":"),l=o[0].trim().toLowerCase(),s=o.slice(1).join(":").trim();return{[l]:s}}return null},gt=e.useCallback(()=>{},[]),Ze=t=>{if(ke.current)t==="§"?ke.current=!1:(Ae.current+=t,re(n=>n+t));else if(t==="§"){ke.current=!0;return}else for(ue.current+=t;ue.current.includes(`
2
- `);){const n=ue.current.indexOf(`
3
- `),o=ue.current.slice(0,n).trim();ue.current=ue.current.slice(n+1);const l=mt(o);l&&pt(l)}};e.useEffect(()=>{(async()=>{if(!sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID")){const o="secret",l=Math.floor(Date.now()/1e3).toString();try{const s=new TextEncoder,u=await crypto.subtle.importKey("raw",s.encode(o),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),x=await crypto.subtle.sign("HMAC",u,s.encode(l)),j=Array.from(new Uint8Array(x)).map(R=>R.toString(16).padStart(2,"0")).join("");sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",j),U("[SESSION] New HMAC UID generated and saved:",j)}catch(s){console.error("[SESSION] HMAC generation failed:",s);const u=Math.random().toString(36)+Date.now().toString();sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",u)}}sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES")||sessionStorage.setItem("STREAMOJI_LEADS_SESSION_MESSAGES",JSON.stringify([]))})()},[]);const et=()=>{try{return JSON.parse(sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES")||"[]")}catch{return[]}},bt=t=>{sessionStorage.setItem("STREAMOJI_LEADS_SESSION_MESSAGES",JSON.stringify(t))},[$e,qe]=e.useState(!1),[tt,Je]=e.useState(0),ie=e.useRef(null),Ue=e.useRef([]),nt=e.useRef(0),[rt,_t]=e.useState(null),[wt,Ge]=e.useState(null),le=e.useRef(null),_e=e.useRef(null),Ne=e.useCallback((t=!1)=>{t&&(ee.current=!0,O(!1),S("Ready")),g.current=[],se.current=[],D.current=!1,oe(!1),_.current=0,X.current=0,q.current=0,A.current.forEach(n=>{try{n.stop()}catch{}}),V.current&&(clearTimeout(V.current),V.current=null),De(null),H(""),A.current=[]},[]),St=async()=>{try{const t=await navigator.mediaDevices.getUserMedia({audio:!0}),n=window.AudioContext||window.webkitAudioContext,o=new n,l=o.createMediaStreamSource(t),s=o.createAnalyser();s.fftSize=64,l.connect(s),le.current=o,_e.current=l,Ge(s);const u=new MediaRecorder(t);ie.current=u,Ue.current=[],u.ondataavailable=x=>{x.data.size>0&&Ue.current.push(x.data)},u.onstop=async()=>{const x=Date.now()-nt.current;if(Ge(null),_e.current&&(_e.current.disconnect(),_e.current=null),le.current&&le.current.state!=="closed"&&(le.current.close(),le.current=null),x<1e3){S("Recording too short. Hold or click longer."),O(!1);return}const L=new Blob(Ue.current,{type:"audio/wav"});await Rt(L)},nt.current=Date.now(),u.start(100),qe(!0),S("Listening...")}catch(t){console.error("Error accessing microphone:",t),S("Mic Access Error")}},xt=()=>{ie.current&&ie.current.state!=="inactive"&&(ie.current.stop(),ie.current.stream.getTracks().forEach(t=>t.stop()),qe(!1))},vt=()=>{ie.current&&ie.current.state!=="inactive"&&(ie.current.onstop=null,ie.current.stop(),ie.current.stream.getTracks().forEach(t=>t.stop()),Ge(null),_e.current&&(_e.current.disconnect(),_e.current=null),le.current&&le.current.state!=="closed"&&(le.current.close(),le.current=null),qe(!1),Ue.current=[],S("Ready"))};e.useEffect(()=>{if(!T)return;const t=()=>{const n=q.current;if(n<=0)return;const o=B.current,l=_.current;if(!o)return;const s=o.currentTime-l,u=Math.min(Math.max(0,s),n),x=de.trim().length;if(x<=0)return;const L=Math.min(Math.round(u/n*x),x);Oe(L)};return clearInterval(Te.current??void 0),Te.current=setInterval(t,90),()=>clearInterval(Te.current??void 0)},[T,de,q.current]),e.useEffect(()=>{let t;return $e?(Je(0),t=window.setInterval(()=>{Je(n=>n+1)},1e3)):Je(0),()=>clearInterval(t)},[$e]);const yt=t=>{const n=t.numberOfChannels,o=t.length*n*2+44,l=new ArrayBuffer(o),s=new DataView(l);let u=0;const x=I=>{s.setUint16(u,I,!0),u+=2},L=I=>{s.setUint32(u,I,!0),u+=4};L(1179011410),L(o-8),L(1163280727),L(544501094),L(16),x(1),x(n),L(t.sampleRate),L(t.sampleRate*2*n),x(n*2),x(16),L(1635017060),L(o-u-4);const j=[];for(let I=0;I<n;I++)j.push(t.getChannelData(I));let R=0;for(;u<o;){for(let I=0;I<n;I++){let N=Math.max(-1,Math.min(1,j[I][R]));N=N<0?N*32768:N*32767,s.setInt16(u,N,!0),u+=2}R++}return new Blob([l],{type:"audio/wav"})},ze=async(t,n,o=!1)=>{if(!ee.current){if(fe.current){se.current.push({audio:t,visemes:n,isNewSegment:o});return}fe.current=!0;try{const l=window.AudioContext||window.webkitAudioContext,s=B.current??new l;s.state==="suspended"&&await s.resume(),B.current=s;const u=window.atob(t),x=new Uint8Array(u.length);for(let C=0;C<u.length;C++)x[C]=u.charCodeAt(C);const L=await s.decodeAudioData(x.buffer.slice(0));q.current+=L.duration;const j=s.currentTime;let R=X.current;const I=!D.current;R<j&&(R=j+.1),X.current=R+L.duration;const N=s.createBufferSource();N.buffer=L;let W=rt;if((!W||W.context!==s)&&(W=s.createAnalyser(),W.fftSize=64,W.connect(s.destination),_t(W)),N.connect(W),A.current.push(N),ee.current){A.current=A.current.filter(C=>C!==N);return}if(I){D.current=!0,oe(!0),U(`[AUDIO] setIsSpeaking(true) - First chunk starting at ${R.toFixed(3)}`),_.current=R;const C=(R-j)*1e3;$.current=performance.now()+C,U(`[AUDIO] Response started. Initial startTime: ${R.toFixed(3)}, CT: ${j.toFixed(3)}`)}N.start(R);const Y=(R-_.current)*1e3;o&&(ce.current=Y,U(`[AUDIO] New segment detected at +${Y.toFixed(0)}ms. Resetting segment offset.`)),n.forEach((C,te)=>{const E=C.symbol??"";if(E){const ne=$t(E),ae=Math.round(C.start*1e3),we=Math.round((C.duration??0)*1e3),at=ce.current+ae;te<3&&U(`[AUDIO] Viseme "${E}": segment_relative=${ae}ms, segment_offset=${ce.current.toFixed(0)}ms => vtime=${at}ms`),ne.forEach(ot=>{g.current.push({viseme:ot.v,weight:ot.w,vtime:at,vduration:we})})}}),S("Speaking...")}finally{if(fe.current=!1,se.current.length>0){const l=se.current.shift();l&&ze(l.audio,l.visemes,l.isNewSegment)}}}},Rt=async t=>{try{O(!0),Ae.current="",re(""),S("Processing Voice...");const n=await t.arrayBuffer(),l=await new(window.AudioContext||window.webkitAudioContext)().decodeAudioData(n),s=yt(l),u=new FileReader;u.readAsDataURL(s),u.onloadend=async()=>{const x=u.result.split(",")[1];Ne(),k(""),ue.current="",ke.current=!1;const L=`${ut}/stt?token=${encodeURIComponent(h)}`,j=await fetch(L,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({audio_base64:x,audio_format:"wav"})});if(j.status===429){try{const te=await j.text(),E=JSON.parse(te);U("[STT] 429 agent at capacity:",E?.detail)}catch{}k(""),S("Busy"),O(!1);return}if(!j.ok){const te=await j.text();let E="STT Failed";try{E=JSON.parse(te).error||E}catch{te&&(E=te.slice(0,200))}throw new Error(E)}const R=j.body;if(U("this is body"+R),!R){S("STT Failed"),O(!1);return}const I=R.getReader();ee.current=!1;const N=new TextDecoder;let W="",Y=!1;const C=async(te,E)=>{switch(te){case"transcript":E.transcript!=null&&k(String(E.transcript));break;case"text":{const ne=E.delta??E.text??"";ne&&Ze(ne);break}case"audio":{const ne=E.chunk,ae=E.visemes??[],we=!!E.is_new_segment;ne&&await ze(ne,ae,we);break}case"done":{Y=!0,S("Ready"),O(!1);break}case"error":{Y=!0,S("STT Failed"),O(!1);break}default:break}};for(;;){const{done:te,value:E}=await I.read();E&&(W+=N.decode(E,{stream:!0}));const ne=W.split(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),ze=require("@react-three/drei"),ot=require("@react-three/fiber"),e=require("react"),$t=require("three"),qt=require("three/examples/jsm/loaders/GLTFLoader.js");function Gt(l){const w=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const b in l)if(b!=="default"){const p=Object.getOwnPropertyDescriptor(l,b);Object.defineProperty(w,b,p.get?p:{enumerable:!0,get:()=>l[b]})}}return w.default=l,Object.freeze(w)}const Be=Gt($t),it="https://ai.streamoji.com",U=(...l)=>{},Jt=(...l)=>{},Rt=({analyser:l})=>{const w=e.useRef(null),b=e.useRef(null);return e.useEffect(()=>{const p=w.current;if(!p)return;const T=p.getContext("2d",{alpha:!0});if(!T)return;let B,A=null;l&&(l.fftSize=128,A=new Uint8Array(l.frequencyBinCount));const K=()=>{B=requestAnimationFrame(K),(p.width!==p.offsetWidth||p.height!==p.offsetHeight)&&(p.width=p.offsetWidth,p.height=p.offsetHeight);const se=p.width,F=p.height;if(se===0||F===0)return;const N=F/2;T.clearRect(0,0,se,F),T.fillStyle="#1e293b";const _=2,m=_+2,J=se*.95,W=Math.floor(J/m);(!b.current||b.current.length!==W)&&(b.current=new Float32Array(W).fill(2));const fe=W*m,R=(se-fe)/2;l&&A&&l.getByteFrequencyData(A);const Ce=A?A.length:0,$=Math.floor(Ce*.7)/W,he=new Float32Array(W);for(let E=0;E<W;E++){let D=0;if(A&&$>0){const pe=Math.floor(E*$),L=Math.floor((E+1)*$);for(let v=pe;v<L;v++){const S=A[v]||0;S>D&&(D=S)}}D<10&&(D=0);const j=D/255,I=D>0?Math.max(2,Math.pow(j,1.4)*F*.25):2;he[E]=I}for(let E=0;E<W;E++){const D=W-1-E,j=Math.max(he[E],he[D]),I=b.current[E]+(j-b.current[E])*.3;b.current[E]=I;const pe=R+E*m,L=N-I/2;T.beginPath(),T.roundRect?T.roundRect(pe,L,_,I,4):T.fillRect(pe,L,_,I),T.fill()}};return K(),()=>{cancelAnimationFrame(B)}},[l]),a.jsx("canvas",{ref:w,style:{width:"100%",height:"100%",display:"block"}})},zt="https://pub-48df6f7d60d6440bbd01676ea5d90e55.r2.dev",kt="https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/default-models/fullbodyavatarmale.glb";async function Yt(l){const w=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(l));return Array.from(new Uint8Array(w)).map(b=>b.toString(16).padStart(2,"0")).join("")}function Qt(l){const[w,b]=e.useState(null);return e.useEffect(()=>{if(!l){b(null);return}let p=!1;return Yt(l).then(T=>{if(p)return;const B=`${zt}/${T}.glb`;fetch(B,{method:"HEAD"}).then(A=>{p||b(A.ok?B:kt)}).catch(()=>{p||b(kt)})}),()=>{p=!0}},[l]),w}const Xt=["https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_001.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_002.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_002.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/M_Standing_Idle_Variations_005.glb"],Kt=["https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_001.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/idle/F_Standing_Idle_Variations_003.glb"],Zt=[{id:"m_expr_01",name:"Friendly Wave",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_001.glb"},{id:"m_expr_02",name:"You There",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_002.glb"},{id:"m_expr_04",name:"Awkward Agreement",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_004.glb"},{id:"m_expr_05",name:"What's Going On?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_005.glb"},{id:"m_expr_06",name:"Tired Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_006.glb"},{id:"m_expr_07",name:"Conceilied Laughter",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_007.glb"},{id:"m_expr_08",name:"You Come Here",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_008.glb"},{id:"m_expr_09",name:"Come Here Kid",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_009.glb"},{id:"m_expr_10",name:"Come Here Everyone",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_010.glb"},{id:"m_expr_11",name:"No Freaking Way",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_011.glb"},{id:"m_expr_12",name:"Cheerful Approval",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_012.glb"},{id:"m_expr_13",name:"Waving Hello",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_013.glb"},{id:"m_expr_14",name:"Checking Surroundings",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_014.glb"},{id:"m_expr_15",name:"Referee Warning",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_015.glb"},{id:"m_expr_16",name:"You Thumbs Down",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_016.glb"},{id:"m_expr_17",name:"Side Thumbs Down",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_017.glb"},{id:"m_expr_18",name:"You're Finished",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Standing_Expressions_018.glb"},{id:"m_talk_01",name:"Oh God, Why Me?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_001.glb"},{id:"m_talk_02",name:"What Are You Doing?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_002.glb"},{id:"m_talk_03",name:"What Am I doing?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_003.glb"},{id:"m_talk_04",name:"No Way",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_004.glb"},{id:"m_talk_05",name:"What's Going On?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb"},{id:"m_talk_06",name:"I have no idea",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_006.glb"},{id:"m_talk_07",name:"What's going on here?",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb"},{id:"m_talk_08",name:"Let's stop",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_008.glb"},{id:"m_talk_09",name:"Fed Up Moment",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_009.glb"},{id:"m_talk_10",name:"What's This? Hold On",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_010.glb"},{id:"f_talk_01",name:"Great Job Clap",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_001.glb"},{id:"f_talk_02",name:"Chill Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_002.glb"},{id:"f_talk_03",name:"This Is Me",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_003.glb"},{id:"f_talk_04",name:"Empathize",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_004.glb"},{id:"f_talk_05",name:"Loose Hands Stretch",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_005.glb"},{id:"f_talk_06",name:"Take It Easy",url:"https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/F_Talking_Variations_006.glb"}],en=["https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_005.glb","https://pub-be53cae7bd99457a8c1f11b4d38f1672.r2.dev/masculine/expression/M_Talking_Variations_007.glb"],tn={zoom:.85,position:[.15,-.8,0],scale:1.5,rotation:[.15,.02,0]},nn=[-.45,1.9,.1],rn={browInnerUp:.2},at=.18,sn=1,Lt="__branding__",Je={neutral:{eyeLookDownLeft:.1,eyeLookDownRight:.1},happy:{mouthSmileLeft:.2,mouthSmileRight:.2,eyeLookDownLeft:.1,eyeLookDownRight:.1},sad:{eyeLookDownLeft:.2,eyeLookDownRight:.2,browDownRight:.1,browInnerUp:.6,browOuterUpRight:.2,eyeSquintLeft:.7,eyeSquintRight:.7,mouthFrownLeft:.8,mouthFrownRight:.8,mouthLeft:.2,mouthPucker:.5,mouthRollLower:.2,mouthRollUpper:.2,mouthShrugLower:.2,mouthShrugUpper:.2,mouthStretchLeft:.4},angry:{eyeLookDownLeft:.1,eyeLookDownRight:.1,browDownLeft:.6,browDownRight:.6,jawForward:.3,mouthFrownLeft:.7,mouthFrownRight:.7,mouthRollLower:.2,mouthShrugLower:.3},fear:{browInnerUp:.7,eyeSquintLeft:.5,eyeSquintRight:.5,eyeWideLeft:.6,eyeWideRight:.6,mouthClose:.1,mouthFunnel:.3,mouthShrugLower:.5,mouthShrugUpper:.5},disgust:{browDownLeft:.7,browDownRight:.1,browInnerUp:.3,eyeSquintLeft:1,eyeSquintRight:1,eyeWideLeft:.5,eyeWideRight:.5,mouthLeft:.4,mouthPressLeft:.3,mouthRollLower:.3,mouthShrugLower:.3,mouthShrugUpper:.8,mouthUpperUpLeft:.3,noseSneerLeft:1,noseSneerRight:.7},love:{browInnerUp:.4,browOuterUpLeft:.2,browOuterUpRight:.2,mouthSmileLeft:.2,mouthSmileRight:.2,eyeBlinkLeft:.6,eyeBlinkRight:.6,eyeWideLeft:.7,eyeWideRight:.7,mouthDimpleLeft:.1,mouthDimpleRight:.1,mouthPressLeft:.2,mouthShrugUpper:.2,mouthUpperUpLeft:.1,mouthUpperUpRight:.1}},an=[{key:"viseme_aa",mix:{jawOpen:.6}},{key:"viseme_E",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthDimpleLeft:1,mouthDimpleRight:1,jawOpen:.3}},{key:"viseme_I",mix:{mouthPressLeft:.6,mouthPressRight:.6,mouthDimpleLeft:.6,mouthDimpleRight:.6,jawOpen:.2}},{key:"viseme_O",mix:{mouthPucker:1,jawForward:.6,jawOpen:.2}},{key:"viseme_U",mix:{mouthFunnel:1}},{key:"viseme_PP",mix:{mouthRollLower:.3,mouthRollUpper:.3,mouthUpperUpLeft:.3,mouthUpperUpRight:.3}},{key:"viseme_FF",mix:{mouthPucker:1,mouthShrugUpper:1,mouthLowerDownLeft:.2,mouthLowerDownRight:.2,mouthDimpleLeft:1,mouthDimpleRight:1,mouthRollLower:.3}},{key:"viseme_DD",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthFunnel:.5,jawOpen:.2}},{key:"viseme_SS",mix:{mouthPressLeft:.8,mouthPressRight:.8,mouthLowerDownLeft:.5,mouthLowerDownRight:.5,jawOpen:.1}},{key:"viseme_TH",mix:{mouthRollUpper:.3,jawOpen:.2,tongueOut:.4}},{key:"viseme_CH",mix:{mouthPucker:.5,jawOpen:.2}},{key:"viseme_RR",mix:{mouthPucker:.5,jawOpen:.2}},{key:"viseme_kk",mix:{mouthLowerDownLeft:.4,mouthLowerDownRight:.4,mouthDimpleLeft:.3,mouthDimpleRight:.3,mouthFunnel:.3,mouthPucker:.3,jawOpen:.15}},{key:"viseme_nn",mix:{mouthLowerDownLeft:.4,mouthLowerDownRight:.4,mouthDimpleLeft:.3,mouthDimpleRight:.3,mouthFunnel:.3,mouthPucker:.3,jawOpen:.15,tongueOut:.2}},{key:"viseme_sil",mix:{}}],on={aei:[{v:"E",w:.8},{v:"I",w:.2}],ee:[{v:"I",w:1}],oo:[{v:"O",w:1}],u:[{v:"U",w:1}],aa:[{v:"aa",w:1}],ah:[{v:"aa",w:.7},{v:"O",w:.3}],bmp:[{v:"PP",w:1}],fv:[{v:"FF",w:1}],th:[{v:"TH",w:1}],l:[{v:"nn",w:1}],r:[{v:"RR",w:1}],qw:[{v:"U",w:.6},{v:"O",w:.4}],chjsh:[{v:"CH",w:1}],cdgknstxyz:[{v:"DD",w:.6},{v:"SS",w:.4}],sil:[{v:"sil",w:1}]};function cn(l){if(!l)return[{v:"sil",w:1}];const w=l.toLowerCase();return on[w]??[{v:"sil",w:1}]}function un({target:l}){const{camera:w}=ot.useThree();return e.useEffect(()=>{w.lookAt(...l)},[w,l]),null}function G(l,w,b){if(!l||!l.morphTargetDictionary)return;const p=l,T=p.morphTargetDictionary,B=p.morphTargetInfluences;if(B)for(const A in T)A.toLowerCase()===w.toLowerCase()&&(B[T[A]]=b)}function Tt(l,w=.97){if(!l)return;const b=l;if(b.morphTargetInfluences)for(let p=0;p<b.morphTargetInfluences.length;p++)b.morphTargetInfluences[p]*=w}const ln=e.memo(({avatarUrl:l,isPlayingRef:w,visemeQueueRef:b,audioContextRef:p,responseAudioStartTimeRef:T,adjustments:B,mood:A,expression:K,agentResponse:se,isSpeaking:F,nextStartTimeRef:N,stopPlayback:_,setIsSpeaking:ie,expressionUrl:m,onExpressionFinished:J,isNudgeResponse:W,avatarGender:fe})=>{const{scene:R}=ze.useGLTF(l),Ce=fe==="female"?Kt:Xt,ve=ze.useGLTF(Ce),$=e.useMemo(()=>ve.flatMap(f=>f.animations),[ve]),he=ze.useGLTF(en),E=e.useMemo(()=>he.flatMap(f=>f.animations),[he]),D=e.useRef(null),j=e.useRef(null),I=e.useRef(null),pe=e.useRef([]),[L]=e.useState(()=>new Be.AnimationMixer(R)),v=e.useRef({}),S=e.useRef(null),me=e.useRef(0),Te=e.useRef(!1),ge=e.useRef(0),ae=e.useRef(null);e.useEffect(()=>{if(!(!$||!R)){if($.forEach((f,d)=>{const o=`idle_${d}`;if(!v.current[o]){const s=L.clipAction(f,R);s.name=o,s.setLoop(Be.LoopOnce,1),s.clampWhenFinished=!0,v.current[o]=s}}),E.forEach((f,d)=>{const o=`talk_${d}`;if(!v.current[o]){const s=L.clipAction(f,R);s.name=o,s.setLoop(Be.LoopOnce,1),s.clampWhenFinished=!0,v.current[o]=s}}),$.length>0){const f=v.current.idle_0,d=S.current&&L.existingAction(S.current.getClip());f&&!d&&(f.reset().fadeIn(.5).play(),S.current=f)}return()=>{L.stopAllAction(),v.current={},S.current=null}}},[$,E,R,L]);const be=e.useRef("");e.useEffect(()=>{if(!m||!R||m===be.current)return;be.current=m,ae.current=m,new qt.GLTFLoader().load(m,d=>{if(d.animations&&d.animations.length>0){const o=d.animations[0],s=L.clipAction(o,R);if(s.name=`EXPR_${m}`,s.setLoop(Be.LoopOnce,1),s.clampWhenFinished=!0,v.current[`EXPR_${m}`]=s,F&&ae.current===m){const h=S.current;s.reset().fadeIn(.3).play(),h&&h!==s&&h.crossFadeTo(s,.3,!0),S.current=s,ae.current=null}}},void 0,d=>{console.error(`[ANIMATION] Failed to load ${m}`,d)})},[m,R,L,F]),e.useEffect(()=>{const f=d=>{const o=d.action,s=o.name||"";if(s.startsWith("idle_")){const q=(parseInt(s.split("_")[1])+1)%$.length,z=v.current[`idle_${q}`];z&&(z.reset().fadeIn(.5).play(),o.crossFadeTo(z,.5,!0),S.current=z)}else if(s.startsWith("EXPR_")){if(F){const h=v.current.talk_0;h&&(h.reset().fadeIn(.5).play(),o.crossFadeTo(h,.5,!0),S.current=h)}else{const h=v.current.idle_0;h&&(h.reset().fadeIn(.5).play(),o.crossFadeTo(h,.5,!0),S.current=h)}J&&J()}else if(s.startsWith("talk_"))if(F&&!W){const q=(parseInt(s.split("_")[1])+1)%E.length,z=v.current[`talk_${q}`];z&&(z.reset().fadeIn(.3).play(),o.crossFadeTo(z,.3,!0),S.current=z)}else{const h=v.current.idle_0;h&&(h.reset().fadeIn(.5).play(),o.crossFadeTo(h,.5,!0),S.current=h)}};return L.addEventListener("finished",f),()=>L.removeEventListener("finished",f)},[L,$,E,F,W,J]),e.useEffect(()=>{if(F&&R){const f=S.current,d=f?.name||"";if(d.startsWith("idle_")||d.startsWith("talk_")||d===""){const o=ae.current;if(o){const s=v.current[`EXPR_${o}`];if(s){s.reset().fadeIn(.3).play(),f&&f!==s&&f.crossFadeTo(s,.3,!0),S.current=s,ae.current=null;return}}if(d.startsWith("idle_")||d===""){const s=v.current.talk_0;s&&(s.reset().fadeIn(.5).play(),f&&f.crossFadeTo(s,.5,!0),S.current=s)}}}else if(!F&&R){const f=S.current,d=f?.name||"";if(d.startsWith("talk_")||d.startsWith("EXPR_")){const o=v.current.idle_0;o&&(o.reset().fadeIn(.5).play(),f&&f.crossFadeTo(o,.5,!0),S.current=o)}}},[F,R,m]),e.useEffect(()=>{if(!R)return;R.traverse(o=>{if(o.isMesh&&o.morphTargetDictionary){const s=o.name.toLowerCase();(s.includes("head")||s.includes("avatar"))&&(j.current=o,U(`[ANIMATION] Found head mesh: ${o.name}`)),s.includes("teeth")&&(I.current=o,U(`[ANIMATION] Found teeth mesh: ${o.name}`))}});const f=j.current?.morphTargetDictionary;f&&Object.keys(f).filter(o=>o.toLowerCase().includes("brow"));const d=[];R.traverse(o=>{if(o.isMesh){const h=o.morphTargetDictionary;h&&Object.keys(h).some(q=>q.toLowerCase().includes("brow"))&&d.push(o)}}),pe.current=d,d.length>0&&U("[ANIMATION] Meshes with brow morphs:",d.length)},[R]);const Oe=(f,d=1)=>{const o=`viseme_${f}`.toLowerCase(),s=an.find(h=>h.key.toLowerCase()===o);if(s)for(const h in s.mix){const q=s.mix[h]*d;G(j.current,h,q),G(I.current,h,q)}},Se=f=>{const d=Je[f]??Je.neutral;for(const o in d)G(j.current,o,d[o]),G(I.current,o,d[o])};return ot.useFrame((f,d)=>{const o=Math.pow(.88,60*d);Tt(j.current,o),Tt(I.current,o),Se(A);const s=f.clock.elapsedTime;let h=0;if(Math.floor(s)%5===0&&Math.floor((s-d)%5)!==0){let H=null;R.traverse(ee=>{ee.name.toLowerCase().includes("hips")&&(H=ee)});const _e=H?`Hips Y: ${H.position.y.toFixed(4)}`:"Hips not found";U(`[ANIMATION] Mixer Time: ${L.time.toFixed(2)}, ${_e}`)}if(L.update(d),s>me.current&&!Te.current&&(Te.current=!0,ge.current=s),Te.current){const _e=(s-ge.current)/.3;if(_e>=1)Te.current=!1,me.current=s+2+Math.random()*5;else{const ee=_e<.5?_e*2:(1-_e)*2;G(j.current,"eyeBlinkLeft",ee),G(j.current,"eyeBlinkRight",ee),G(I.current,"eyeBlinkLeft",ee),G(I.current,"eyeBlinkRight",ee),h=ee*rn.browInnerUp}}const q=Je[A]??Je.neutral,z=q.browInnerUp??0,Ye=q.browOuterUpLeft??0,Pe=q.browOuterUpRight??0,Fe=s*sn,xe=at*Math.sin(Fe),Q=at*.7*Math.sin(Fe+.7),We=at*.7*Math.sin(Fe+1.3),Z=H=>Math.max(0,Math.min(1,H)),ye=Z(z+xe),Re=Z(Ye+Q),Ne=Z(Pe+We),Ae=Z(ye+h);if(G(j.current,"browInnerUp",Ae),G(I.current,"browInnerUp",Ae),G(j.current,"browOuterUpLeft",Re),G(I.current,"browOuterUpLeft",Re),G(j.current,"browOuterUpRight",Ne),G(I.current,"browOuterUpRight",Ne),D.current){const H=w.current?0:B.rotation[1];D.current.rotation.y=Be.MathUtils.lerp(D.current.rotation.y,H,.1),D.current.position.set(...B.position),D.current.scale.setScalar(B.scale),D.current.rotation.x=B.rotation[0],D.current.rotation.z=B.rotation[2]}if(w.current&&p.current){const H=p.current.currentTime,Ee=(H-T.current)*1e3- -150;for(let X=0;X<b.current.length;X++){const te=b.current[X];Ee>=te.vtime&&Ee<te.vtime+te.vduration&&Oe(te.viseme,te.weight??1)}H>N.current+.5&&(_(),ie(!1))}}),a.jsx("group",{ref:D,children:a.jsx("primitive",{object:R})})});function dn(l){return l?l.charAt(0).toUpperCase()+l.slice(1).toLowerCase():""}const fn=({token:l,agentToken:w,onNavigationRequested:b,avatarGender:p}={})=>{const T=l??w??"",B=Qt(T||void 0),[A,K]=e.useState(""),[se,F]=e.useState(""),[N,_]=e.useState("Ready"),[ie,m]=e.useState(!1),[J,W]=e.useState(!1),[fe,R]=e.useState([]),[Ce,ve]=e.useState(""),$=e.useRef(null),[he,E]=e.useState(()=>typeof window<"u"?window.matchMedia("(max-width: 480px)").matches:!1);e.useEffect(()=>{const t=window.matchMedia("(max-width: 480px)"),n=()=>E(t.matches);return t.addEventListener("change",n),()=>t.removeEventListener("change",n)},[]);const D=he?80:600,j=e.useRef(!1),I=e.useRef([]),pe=e.useRef(0),L=e.useRef(!1),v=e.useRef([]),S=e.useRef(null),me=e.useRef([]);e.useRef([]);const Te=e.useRef([]),ge=e.useRef(0),ae=e.useRef(0),be=e.useRef(0),Oe=e.useRef(0),Se=e.useRef(!1),[f,d]=e.useState(null),o=e.useRef(null),[s,h]=e.useState("neutral"),[q,z]=e.useState(""),[Ye,Pe]=e.useState(""),[Fe,xe]=e.useState("Chat with us"),[Q,We]=e.useState(null),[Z,ye]=e.useState("hidden"),[Re,Ne]=e.useState(""),Ae=e.useRef(null),H=e.useRef(Z);H.current=Z;const[_e,ee]=e.useState(null),Ee=e.useRef(null),X=e.useRef(null),[te,ct]=e.useState(!1),ut=e.useRef(null),[oe,Ve]=e.useState("hidden"),[lt,At]=e.useState(""),Qe=e.useRef(oe);Qe.current=oe;const le=e.useRef(""),Ie=e.useRef(!1),Me=e.useRef(""),dt=e.useRef(Date.now()),Xe=e.useRef([]),Ue=e.useRef(!1),[Ke,je]=e.useState(!1),[ft,ht]=e.useState(!1),we=e.useRef(null),De=e.useMemo(()=>te?"Try again":N==="Busy"?"Busy":N==="Thinking..."||N==="Processing Voice..."?N:Q!=null&&Q!==""&&Q!=="none"&&Q!=="<none>"?`Enter ${dn(Q)}`:oe!=="hidden"||!ft?null:Lt,[N,Q,te,oe,ft]),pt=!te&&N!=="Busy"&&N!=="Thinking..."&&N!=="Processing Voice..."&&(Q==null||Q===""||Q==="none"||Q==="<none>");e.useEffect(()=>{if(oe!=="hidden"||!pt){ht(!1),we.current!=null&&(clearTimeout(we.current),we.current=null);return}return we.current=setTimeout(()=>{we.current=null,ht(!0)},400),()=>{we.current!=null&&(clearTimeout(we.current),we.current=null)}},[oe,pt]);const He=De!=null&&De!=="";e.useEffect(()=>{const t=H.current;if(!(t==="exiting"||t==="entering")){if(t==="hidden"){He&&(Ne(De??""),ye("entering"));return}t==="visible"&&(!He||De!==Re)&&(Ae.current=He?De:null,ye("exiting"))}},[He,De,Z,Re]),e.useEffect(()=>{if(N!=="Busy"){X.current!=null&&(clearTimeout(X.current),X.current=null);return}return X.current=setTimeout(()=>{X.current=null,_("Ready"),ct(!0)},12e3),()=>{X.current!=null&&(clearTimeout(X.current),X.current=null)}},[N]),e.useEffect(()=>{if(!te)return;const t=setTimeout(()=>ct(!1),2500);return()=>clearTimeout(t)},[te]);const Et=e.useCallback(()=>{const t=H.current;if(t==="exiting"){ye("hidden");const n=Ae.current;Ae.current=null,n!=null&&n!==""&&(Ne(n),ye("entering"))}else t==="entering"&&ye("visible")},[]),It=t=>{if(!t)return;if(t.mood!=null){const r=String(t.mood).toLowerCase();h(r)}if(t.expression!=null){const r=String(t.expression).trim();z(r);const u=Zt.find(g=>g.name.toLowerCase()===r.toLowerCase());U(`[STREAM] Animation match for "${r}": ${u?u.name:"NONE"}`),Pe(u?.url??"")}if(t.navigation!=null){const r=String(t.navigation).trim();r!==""&&(b?b(r):window.open(r,"_blank"))}const n=t.ask_for||t.lead_capture?.ask_for,i=n?String(n).trim().toLowerCase():"",c=i==="none"||i==="<none>";if(n&&!c){const r=i;We(r||null),xe(r==="email"?"Enter your email":r==="name"?"Enter your name":r==="phone"?"Enter your phone number":"Chat with us")}else(c||t.ask_for===null||t.lead_capture&&t.lead_capture.ask_for===null||t.ask_for==="none")&&(We(null),Fe!=="Chat with us"&&xe("Chat with us"));t.collected,t.valid},Mt=t=>{const n=t.trim();if(!n)return null;if(n.startsWith("{"))try{return JSON.parse(n)}catch{return null}if(n.includes(":")){const i=n.split(":"),c=i[0].trim().toLowerCase(),r=i.slice(1).join(":").trim();return{[c]:r}}return null},Dt=e.useCallback(()=>{},[]),mt=t=>{if(Ie.current)t==="§"?Ie.current=!1:(Me.current+=t,F(n=>n+t));else if(t==="§"){Ie.current=!0;return}else for(le.current+=t;le.current.includes(`
2
+ `);){const n=le.current.indexOf(`
3
+ `),i=le.current.slice(0,n).trim();le.current=le.current.slice(n+1);const c=Mt(i);c&&It(c)}};e.useEffect(()=>{(async()=>{if(!sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID")){const i="secret",c=Math.floor(Date.now()/1e3).toString();try{const r=new TextEncoder,u=await crypto.subtle.importKey("raw",r.encode(i),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),g=await crypto.subtle.sign("HMAC",u,r.encode(c)),x=Array.from(new Uint8Array(g)).map(y=>y.toString(16).padStart(2,"0")).join("");sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",x),U("[SESSION] New HMAC UID generated and saved:",x)}catch(r){console.error("[SESSION] HMAC generation failed:",r);const u=Math.random().toString(36)+Date.now().toString();sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",u)}}sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES")||sessionStorage.setItem("STREAMOJI_LEADS_SESSION_MESSAGES",JSON.stringify([]))})()},[]),e.useEffect(()=>{const t=()=>{dt.current=Date.now(),Ue.current&&(Ue.current=!1,je(!1),R([]),ve(""),F(""),W(!1))};window.addEventListener("mousemove",t),window.addEventListener("keydown",t),window.addEventListener("mousedown",t),window.addEventListener("touchstart",t);const n=setInterval(async()=>{if(Date.now()-dt.current>=3e4&&!J&&!ie&&N==="Ready"&&!Ue.current)if(Ue.current=!0,Xe.current.length>0)je(!0),R(Xe.current);else try{const r=`${it}/nudgeUser`,u={navigationUrl:window.location.href,token:T},g=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(g.ok){const x=(await g.json()).nudge_questions;x&&x.length>0&&(U("[NUDGE] Received nudge questions from API:",x),Xe.current=x,je(!0),R(x))}}catch(r){console.error("[NUDGE] Error calling /nudgeUser:",r),Ue.current=!1}},1e3);return()=>{window.removeEventListener("mousemove",t),window.removeEventListener("keydown",t),window.removeEventListener("mousedown",t),window.removeEventListener("touchstart",t),clearInterval(n)}},[T,J,ie,N]),e.useEffect(()=>{if(fe.length===0)return;let t=0,n=0,i=!1,c=100;const r=()=>{const u=fe[t];if(i){const g=u.substring(0,n-1);ve(g),n--,c=50}else{const g=u.substring(0,n+1);ve(g),n++,c=100}!i&&n===u.length?(i=!0,c=3e3):i&&n===0&&(i=!1,t=(t+1)%fe.length,c=500),$.current=setTimeout(r,c)};return r(),()=>{$.current&&clearTimeout($.current)}},[fe]);const gt=()=>{try{return JSON.parse(sessionStorage.getItem("STREAMOJI_LEADS_SESSION_MESSAGES")||"[]")}catch{return[]}},Ct=t=>{sessionStorage.setItem("STREAMOJI_LEADS_SESSION_MESSAGES",JSON.stringify(t))},[Ze,et]=e.useState(!1),[bt,tt]=e.useState(0),ce=e.useRef(null),$e=e.useRef([]),_t=e.useRef(0),[wt,Ot]=e.useState(null),[Ft,nt]=e.useState(null),de=e.useRef(null),ke=e.useRef(null),qe=e.useCallback((t=!1)=>{t&&(Se.current=!0,m(!1),_("Ready")),v.current=[],I.current=[],L.current=!1,W(!1),ge.current=0,ae.current=0,be.current=0,me.current.forEach(n=>{try{n.stop()}catch{}}),Ee.current&&(clearTimeout(Ee.current),Ee.current=null),ee(null),Pe(""),me.current=[]},[]),Nt=async()=>{try{const t=await navigator.mediaDevices.getUserMedia({audio:!0}),n=window.AudioContext||window.webkitAudioContext,i=new n,c=i.createMediaStreamSource(t),r=i.createAnalyser();r.fftSize=64,c.connect(r),de.current=i,ke.current=c,nt(r);const u=new MediaRecorder(t);ce.current=u,$e.current=[],u.ondataavailable=g=>{g.data.size>0&&$e.current.push(g.data)},u.onstop=async()=>{const g=Date.now()-_t.current;if(nt(null),ke.current&&(ke.current.disconnect(),ke.current=null),de.current&&de.current.state!=="closed"&&(de.current.close(),de.current=null),g<1e3){_("Recording too short. Hold or click longer."),m(!1);return}const k=new Blob($e.current,{type:"audio/wav"});await Pt(k)},_t.current=Date.now(),u.start(100),et(!0),_("Listening...")}catch(t){console.error("Error accessing microphone:",t),_("Mic Access Error")}},Ut=()=>{ce.current&&ce.current.state!=="inactive"&&(ce.current.stop(),ce.current.stream.getTracks().forEach(t=>t.stop()),et(!1))},jt=()=>{ce.current&&ce.current.state!=="inactive"&&(ce.current.onstop=null,ce.current.stop(),ce.current.stream.getTracks().forEach(t=>t.stop()),nt(null),ke.current&&(ke.current.disconnect(),ke.current=null),de.current&&de.current.state!=="closed"&&(de.current.close(),de.current=null),et(!1),$e.current=[],_("Ready"))};e.useEffect(()=>{if(!J)return;const t=()=>{const n=be.current;if(n<=0)return;const i=S.current,c=ge.current;if(!i)return;const r=i.currentTime-c,u=Math.min(Math.max(0,r),n),g=se.trim().length;if(g<=0)return;const k=Math.min(Math.round(u/n*g),g);d(k)};return clearInterval(o.current??void 0),o.current=setInterval(t,90),()=>clearInterval(o.current??void 0)},[J,se,be.current]),e.useEffect(()=>{let t;return Ze?(tt(0),t=window.setInterval(()=>{tt(n=>n+1)},1e3)):tt(0),()=>clearInterval(t)},[Ze]);const Bt=t=>{const n=t.numberOfChannels,i=t.length*n*2+44,c=new ArrayBuffer(i),r=new DataView(c);let u=0;const g=C=>{r.setUint16(u,C,!0),u+=2},k=C=>{r.setUint32(u,C,!0),u+=4};k(1179011410),k(i-8),k(1163280727),k(544501094),k(16),g(1),g(n),k(t.sampleRate),k(t.sampleRate*2*n),g(n*2),g(16),k(1635017060),k(i-u-4);const x=[];for(let C=0;C<n;C++)x.push(t.getChannelData(C));let y=0;for(;u<i;){for(let C=0;C<n;C++){let P=Math.max(-1,Math.min(1,x[C][y]));P=P<0?P*32768:P*32767,r.setInt16(u,P,!0),u+=2}y++}return new Blob([c],{type:"audio/wav"})},rt=async(t,n,i=!1)=>{if(!Se.current){if(j.current){I.current.push({audio:t,visemes:n,isNewSegment:i});return}j.current=!0;try{const c=window.AudioContext||window.webkitAudioContext,r=S.current??new c;r.state==="suspended"&&await r.resume(),S.current=r;const u=window.atob(t),g=new Uint8Array(u.length);for(let O=0;O<u.length;O++)g[O]=u.charCodeAt(O);const k=await r.decodeAudioData(g.buffer.slice(0));be.current+=k.duration;const x=r.currentTime;let y=ae.current;const C=!L.current;y<x&&(y=x+.1),ae.current=y+k.duration;const P=r.createBufferSource();P.buffer=k;let V=wt;if((!V||V.context!==r)&&(V=r.createAnalyser(),V.fftSize=64,V.connect(r.destination),Ot(V)),P.connect(V),me.current.push(P),Se.current){me.current=me.current.filter(O=>O!==P);return}if(C){L.current=!0,W(!0),U(`[AUDIO] setIsSpeaking(true) - First chunk starting at ${y.toFixed(3)}`),ge.current=y;const O=(y-x)*1e3;pe.current=performance.now()+O,U(`[AUDIO] Response started. Initial startTime: ${y.toFixed(3)}, CT: ${x.toFixed(3)}`)}P.start(y);const Y=(y-ge.current)*1e3;i&&(Oe.current=Y,U(`[AUDIO] New segment detected at +${Y.toFixed(0)}ms. Resetting segment offset.`)),n.forEach((O,ne)=>{const M=O.symbol??"";if(M){const re=cn(M),ue=Math.round(O.start*1e3),Le=Math.round((O.duration??0)*1e3),xt=Oe.current+ue;ne<3&&U(`[AUDIO] Viseme "${M}": segment_relative=${ue}ms, segment_offset=${Oe.current.toFixed(0)}ms => vtime=${xt}ms`),re.forEach(yt=>{v.current.push({viseme:yt.v,weight:yt.w,vtime:xt,vduration:Le})})}}),_("Speaking...")}finally{if(j.current=!1,I.current.length>0){const c=I.current.shift();c&&rt(c.audio,c.visemes,c.isNewSegment)}}}},Pt=async t=>{try{m(!0),je(!1),Me.current="",F(""),_("Processing Voice...");const n=await t.arrayBuffer(),c=await new(window.AudioContext||window.webkitAudioContext)().decodeAudioData(n),r=Bt(c),u=new FileReader;u.readAsDataURL(r),u.onloadend=async()=>{const g=u.result.split(",")[1];qe(),K(""),le.current="",Ie.current=!1;const k=`${it}/stt?token=${encodeURIComponent(T)}`,x=await fetch(k,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({audio_base64:g,audio_format:"wav"})});if(x.status===429){try{const ne=await x.text(),M=JSON.parse(ne);U("[STT] 429 agent at capacity:",M?.detail)}catch{}K(""),_("Busy"),m(!1);return}if(!x.ok){const ne=await x.text();let M="STT Failed";try{M=JSON.parse(ne).error||M}catch{ne&&(M=ne.slice(0,200))}throw new Error(M)}const y=x.body;if(U("this is body"+y),!y){_("STT Failed"),m(!1);return}const C=y.getReader();Se.current=!1;const P=new TextDecoder;let V="",Y=!1;const O=async(ne,M)=>{switch(ne){case"transcript":M.transcript!=null&&K(String(M.transcript));break;case"text":{const re=M.delta??M.text??"";re&&mt(re);break}case"audio":{const re=M.chunk,ue=M.visemes??[],Le=!!M.is_new_segment;re&&await rt(re,ue,Le);break}case"done":{Y=!0,_("Ready"),m(!1);break}case"error":{Y=!0,_("STT Failed"),m(!1);break}default:break}};for(;;){const{done:ne,value:M}=await C.read();M&&(V+=P.decode(M,{stream:!0}));const re=V.split(`
4
4
 
5
- `);W=ne.pop()??"";for(const ae of ne){const we=Pe(ae);we&&await C(we.event,we.data)}if(te){if(W.trim()){const ae=Pe(W.trim());ae&&await C(ae.event,ae.data)}Y||(S("Ready"),O(!1));break}}}}catch(n){console.error("Audio Submission Error:",n),S("STT Failed"),O(!1)}},kt=async t=>{t&&t.preventDefault(),Ae.current="",re(""),!(!M||Q)&&await At(M)},Pe=t=>{const n=t.split(/\r?\n/);let o="",l="";for(const u of n)u.startsWith("event:")?o=u.slice(6).trim():u.startsWith("data:")&&(l=u.slice(5).trim());if(!o)return null;let s={};if(l)try{s=JSON.parse(l)}catch{s={raw:l}}return{event:o,data:s}},st=(t,n)=>{switch(t){case"connected":ue.current="",ke.current=!1;break;case"text":{const o=n.delta??"";o&&Ze(o);break}case"audio":{const o=n.chunk,l=n.visemes??[];o&&ze(o,l);break}case"done":{const o=et(),l=Ae.current.trim(),s=[...o,{role:"user",content:M||"..."},{role:"assistant",content:l}];bt(s),y.current=[...g.current],S("Ready"),O(!1),k("");break}case"error":{const o=n.message??"Unknown error";Ae.current=o,re(o),S("Agent Failed"),O(!1);break}}},At=async t=>{O(!0),S("Thinking..."),Ae.current="",ue.current="",ke.current=!1,Ne(),q.current=0,Oe(0);const n=`${ut}/agent/chat?token=${encodeURIComponent(h)}`;try{const o=et();let l=sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID");l||(It("[CHAT] Session UID missing at send time! Generating emergency backup."),l="emergency-"+Math.random().toString(36).substring(7),sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",l));const s={history:o,question:t,lead_id:l};U("[CHAT] Sending payload:",s);const u=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),cache:"default"});if(u.status===429){try{const I=await u.json();U("[CHAT] 429 agent at capacity:",I?.detail)}catch{}k(""),S("Busy"),O(!1);return}if(!u.ok)throw new Error("Agent request failed");const x=u.body;if(!x){S("Agent Failed"),O(!1);return}const L=x.getReader();ee.current=!1;const j=new TextDecoder;let R="";for(;;){const{done:I,value:N}=await L.read();U(`[SSE] Chunk received. done=${I}, length=${N?.length||0}`),N&&(R+=j.decode(N,{stream:!0}));const W=R.split(`
5
+ `);V=re.pop()??"";for(const ue of re){const Le=Ge(ue);Le&&await O(Le.event,Le.data)}if(ne){if(V.trim()){const ue=Ge(V.trim());ue&&await O(ue.event,ue.data)}Y||(_("Ready"),m(!1));break}}}}catch(n){console.error("Audio Submission Error:",n),_("STT Failed"),m(!1)}},Wt=async t=>{t&&t.preventDefault(),je(!1),Me.current="",F(""),!(!A||ie)&&await Vt(A)},Ge=t=>{const n=t.split(/\r?\n/);let i="",c="";for(const u of n)u.startsWith("event:")?i=u.slice(6).trim():u.startsWith("data:")&&(c=u.slice(5).trim());if(!i)return null;let r={};if(c)try{r=JSON.parse(c)}catch{r={raw:c}}return{event:i,data:r}},vt=(t,n)=>{switch(t){case"connected":le.current="",Ie.current=!1;break;case"text":{const i=n.delta??"";i&&mt(i);break}case"audio":{const i=n.chunk,c=n.visemes??[];i&&rt(i,c);break}case"done":{const i=gt(),c=Me.current.trim(),r=[...i,{role:"user",content:A||"..."},{role:"assistant",content:c}];Ct(r),Te.current=[...v.current],_("Ready"),m(!1),K("");break}case"error":{const i=n.message??"Unknown error";Me.current=i,F(i),_("Agent Failed"),m(!1);break}}},Vt=async t=>{m(!0),_("Thinking..."),Me.current="",le.current="",Ie.current=!1,qe(),be.current=0,d(0);const n=`${it}/agent/chat?token=${encodeURIComponent(T)}`;try{const i=gt();let c=sessionStorage.getItem("STREAMOJI_LEADS_SESSION_LEAD_ID");c||(Jt("[CHAT] Session UID missing at send time! Generating emergency backup."),c="emergency-"+Math.random().toString(36).substring(7),sessionStorage.setItem("STREAMOJI_LEADS_SESSION_LEAD_ID",c));const r={history:i,question:t,lead_id:c};U("[CHAT] Sending payload:",r);const u=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),cache:"default"});if(u.status===429){try{const C=await u.json();U("[CHAT] 429 agent at capacity:",C?.detail)}catch{}K(""),_("Busy"),m(!1);return}if(!u.ok)throw new Error("Agent request failed");const g=u.body;if(!g){_("Agent Failed"),m(!1);return}const k=g.getReader();Se.current=!1;const x=new TextDecoder;let y="";for(;;){const{done:C,value:P}=await k.read();U(`[SSE] Chunk received. done=${C}, length=${P?.length||0}`),P&&(y+=x.decode(P,{stream:!0}));const V=y.split(`
6
6
 
7
- `);R=W.pop()??"";for(const Y of W){U(`[SSE] Processing block: ${Y.slice(0,50)}...`);const C=Pe(Y);C&&(U(`[SSE] Event: ${C.event}`),st(C.event,C.data))}if(I){if(U("[SSE] Stream finished"),R.trim()){const Y=Pe(R.trim());Y&&st(Y.event,Y.data)}S("Ready"),O(!1),k("");break}}}catch(o){console.error("Chat Error:",o),S("Agent Failed"),O(!1)}},it=de.trim(),Ye=it&&T?it.slice(0,xe!=null&&xe>0?xe:0):"";e.useEffect(()=>{const t=Ve.current;t!=="exiting"&&(Ye?(ft(Ye),t==="hidden"&&Fe("entering")):(t==="visible"||t==="entering")&&Fe("exiting"))},[Ye,K]);const Lt=e.useCallback(()=>{const t=Ve.current;t==="entering"?Fe("visible"):t==="exiting"&&Fe("hidden")},[]);return e.useLayoutEffect(()=>{const t=Re.current;t&&(t.scrollTop=t.scrollHeight)},[Qe]),i.jsxs("div",{className:"avatar-widget-container",children:[i.jsxs("div",{className:"avatar-input-area",children:[pe!=="hidden"?i.jsx("div",{className:`avatar-thinking-tab${pe==="exiting"?" avatar-thinking-tab--exiting":pe==="entering"?" avatar-thinking-tab--entering":""}`,onAnimationEnd:ht,children:Ee}):null,i.jsx("div",{className:"avatar-input-container",children:i.jsx("div",{style:{display:"flex",alignItems:"center",width:"100%",height:"100%"},children:$e?i.jsxs("div",{className:"avatar-input-recording",children:[i.jsx("button",{type:"button",className:"avatar-recording-cancel",onClick:vt,title:"Cancel",children:i.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[i.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),i.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),i.jsxs("div",{style:{flex:1,height:"100%",position:"relative",display:"flex",alignItems:"center",minWidth:0},children:[i.jsx("div",{style:{flex:1,height:"100%"},children:i.jsx(ct,{analyser:wt})}),i.jsxs("span",{style:{fontSize:"0.75rem",color:"#64748b",fontWeight:500,marginLeft:"4px",minWidth:"32px",textAlign:"right",fontVariantNumeric:"tabular-nums"},children:[Math.floor(tt/60),":",String(tt%60).padStart(2,"0")]})]}),i.jsx("button",{type:"button",className:"avatar-recording-confirm",onClick:xt,title:"Send",children:i.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:i.jsx("polyline",{points:"20 6 9 17 4 12"})})})]}):T?i.jsxs("div",{className:"avatar-input-speaking",children:[i.jsx("div",{style:{flex:1,height:"100%",display:"flex",alignItems:"center",paddingRight:"8px"},children:i.jsx(ct,{analyser:rt})}),i.jsx("button",{type:"button",className:"avatar-speaking-stop",onClick:()=>Ne(!0),title:"Stop",children:i.jsx("span",{className:"avatar-speaking-stop__icon","aria-hidden":!0})})]}):Q?i.jsx("div",{style:{flex:1,height:"100%",display:"flex",alignItems:"center",justifyContent:"center"},children:i.jsx("div",{className:"avatar-input-loader"})}):i.jsxs("form",{onSubmit:kt,style:{flex:1,display:"flex",height:"100%",alignItems:"center"},children:[i.jsx("input",{id:"avatar-text-input",type:"text",value:M,onChange:t=>k(t.target.value),placeholder:v==="Busy"?"Assisting another user":"Ask me anything",disabled:Q||v==="Busy",autoComplete:"off",style:{width:"100%",height:"100%"}}),v==="Busy"?i.jsx("button",{type:"button",className:"mic-button",disabled:!0,style:{backgroundColor:"#1e4a5e"},title:"Agent at capacity",children:i.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:i.jsx("path",{d:"M4 2L20 2L12 10L4 2z M12 14L4 22L20 22L12 14z",fill:"white"})})}):M.trim()===""?i.jsx("button",{type:"button",className:"mic-button",onClick:St,disabled:Q,style:{backgroundColor:"#1e4a5e"},children:i.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[i.jsx("path",{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",fill:"white"}),i.jsx("path",{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",fill:"white"})]})}):i.jsx("button",{type:"submit",className:"mic-button",disabled:Q,style:{backgroundColor:"#1e4a5e"},title:"Send",children:i.jsx("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:i.jsx("path",{d:"M19 12H5M19 12L14 17M19 12L14 7",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})]})})})]}),i.jsx("div",{className:"avatar-wrapper",children:i.jsxs("div",{className:"avatar-scene-wrapper",children:[K!=="hidden"&&i.jsx("div",{className:`avatar-bubble${K==="entering"?" avatar-bubble--entering":K==="exiting"?" avatar-bubble--exiting":""}`,onAnimationEnd:Lt,children:i.jsx("div",{ref:Re,className:"avatar-bubble__content",children:Qe})}),i.jsx("div",{className:"avatar-canvas-layer",style:{width:Z,height:Z},children:i.jsxs(Ke.Canvas,{shadows:!0,camera:{position:[.2,1.4,3],fov:42},gl:{alpha:!0},dpr:1.8,style:{pointerEvents:"none",width:"100%",height:"100%"},children:[i.jsx(qt,{target:Pt}),i.jsx("ambientLight",{intensity:.7}),i.jsx("directionalLight",{position:[0,2,2],intensity:1}),i.jsx(Be.Environment,{preset:"city"}),i.jsx(e.Suspense,{fallback:null,children:F!==null&&i.jsx(Jt,{avatarUrl:F,isPlayingRef:D,visemeQueueRef:g,audioContextRef:B,responseAudioStartTimeRef:_,adjustments:Nt,mood:f,expression:a,agentResponse:de,isSpeaking:T,nextStartTimeRef:X,stopPlayback:Ne,setIsSpeaking:oe,expressionUrl:p,onExpressionFinished:gt})})]})})]})})]})},Yt=({token:c,onNavigationRequested:w})=>i.jsx(zt,{token:c,onNavigationRequested:w});exports.AvatarWidget=Yt;
7
+ `);y=V.pop()??"";for(const Y of V){U(`[SSE] Processing block: ${Y.slice(0,50)}...`);const O=Ge(Y);O&&(U(`[SSE] Event: ${O.event}`),vt(O.event,O.data))}if(C){if(U("[SSE] Stream finished"),y.trim()){const Y=Ge(y.trim());Y&&vt(Y.event,Y.data)}_("Ready"),m(!1),K("");break}}}catch(i){console.error("Chat Error:",i),_("Agent Failed"),m(!1)}},St=se.trim(),st=St&&J?St.slice(0,f!=null&&f>0?f:0):"";e.useEffect(()=>{const t=Qe.current;t!=="exiting"&&(st?(At(st),t==="hidden"&&Ve("entering")):(t==="visible"||t==="entering")&&Ve("exiting"))},[st,oe]);const Ht=e.useCallback(()=>{const t=Qe.current;t==="entering"?Ve("visible"):t==="exiting"&&Ve("hidden")},[]);return e.useLayoutEffect(()=>{const t=ut.current;t&&(t.scrollTop=t.scrollHeight)},[lt]),a.jsxs("div",{className:"avatar-widget-container",children:[a.jsxs("div",{className:"avatar-input-area",children:[Z!=="hidden"?a.jsx("div",{className:`avatar-thinking-tab${Z==="exiting"?" avatar-thinking-tab--exiting":Z==="entering"?" avatar-thinking-tab--entering":""}`,onAnimationEnd:Et,children:Re===Lt?a.jsx("a",{href:"https://leads.streamoji.com",target:"_blank",rel:"noopener noreferrer",children:"Made by Streamoji Leads"}):Re}):null,a.jsx("div",{className:"avatar-input-container",children:a.jsx("div",{style:{display:"flex",alignItems:"center",width:"100%",height:"100%"},children:Ze?a.jsxs("div",{className:"avatar-input-recording",children:[a.jsx("button",{type:"button",className:"avatar-recording-cancel",onClick:jt,title:"Cancel",children:a.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[a.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),a.jsxs("div",{style:{flex:1,height:"100%",position:"relative",display:"flex",alignItems:"center",minWidth:0},children:[a.jsx("div",{style:{flex:1,height:"100%"},children:a.jsx(Rt,{analyser:Ft})}),a.jsxs("span",{style:{fontSize:"0.75rem",color:"#64748b",fontWeight:500,marginLeft:"4px",minWidth:"32px",textAlign:"right",fontVariantNumeric:"tabular-nums"},children:[Math.floor(bt/60),":",String(bt%60).padStart(2,"0")]})]}),a.jsx("button",{type:"button",className:"avatar-recording-confirm",onClick:Ut,title:"Send",children:a.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:a.jsx("polyline",{points:"20 6 9 17 4 12"})})})]}):J&&!Ke?a.jsxs("div",{className:"avatar-input-speaking",children:[a.jsx("div",{style:{flex:1,height:"100%",display:"flex",alignItems:"center",paddingRight:"8px"},children:a.jsx(Rt,{analyser:wt})}),a.jsx("button",{type:"button",className:"avatar-speaking-stop",onClick:()=>qe(!0),title:"Stop",children:a.jsx("span",{className:"avatar-speaking-stop__icon","aria-hidden":!0})})]}):ie?a.jsx("div",{style:{flex:1,height:"100%",display:"flex",alignItems:"center",justifyContent:"center"},children:a.jsx("div",{className:"avatar-input-loader"})}):a.jsxs("form",{onSubmit:Wt,style:{flex:1,display:"flex",height:"100%",alignItems:"center"},children:[a.jsx("input",{id:"avatar-text-input",type:"text",value:A,onChange:t=>K(t.target.value),placeholder:N==="Busy"?"Assisting another user":Ce||"Ask me anything",disabled:ie||N==="Busy",autoComplete:"off",style:{width:"100%",height:"100%"}}),N==="Busy"?a.jsx("button",{type:"button",className:"mic-button",disabled:!0,style:{backgroundColor:"#1e4a5e"},title:"Agent at capacity",children:a.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:a.jsx("path",{d:"M4 2L20 2L12 10L4 2z M12 14L4 22L20 22L12 14z",fill:"white"})})}):A.trim()===""?a.jsx("button",{type:"button",className:"mic-button",onClick:Nt,disabled:ie,style:{backgroundColor:"#1e4a5e"},children:a.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{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",fill:"white"}),a.jsx("path",{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",fill:"white"})]})}):a.jsx("button",{type:"submit",className:"mic-button",disabled:ie,style:{backgroundColor:"#1e4a5e"},title:"Send",children:a.jsx("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:a.jsx("path",{d:"M19 12H5M19 12L14 17M19 12L14 7",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})]})})})]}),a.jsx("div",{className:"avatar-wrapper",children:a.jsxs("div",{className:"avatar-scene-wrapper",children:[oe!=="hidden"&&a.jsx("div",{className:`avatar-bubble${oe==="entering"?" avatar-bubble--entering":oe==="exiting"?" avatar-bubble--exiting":""}`,onAnimationEnd:Ht,children:a.jsx("div",{ref:ut,className:`avatar-bubble__content${Ke?" avatar-bubble__content--nudge":""}`,children:lt})}),a.jsx("div",{className:"avatar-canvas-layer",style:{width:D,height:D},children:a.jsxs(ot.Canvas,{shadows:!0,camera:{position:[.2,1.4,3],fov:42},gl:{alpha:!0},dpr:1.8,style:{pointerEvents:"none",width:"100%",height:"100%"},children:[a.jsx(un,{target:nn}),a.jsx("ambientLight",{intensity:.7}),a.jsx("directionalLight",{position:[0,2,2],intensity:1}),a.jsx(ze.Environment,{preset:"city"}),a.jsx(e.Suspense,{fallback:null,children:B!==null&&a.jsx(ln,{avatarUrl:B,isPlayingRef:L,visemeQueueRef:v,audioContextRef:S,responseAudioStartTimeRef:ge,adjustments:tn,mood:s,expression:q,agentResponse:se,isSpeaking:J,nextStartTimeRef:ae,stopPlayback:qe,setIsSpeaking:W,expressionUrl:Ye,onExpressionFinished:Dt,isNudgeResponse:Ke,avatarGender:p})})]})})]})})]})},hn=({token:l,onNavigationRequested:w})=>a.jsx(fn,{token:l,onNavigationRequested:w});exports.AvatarWidget=hn;
8
8
  //# sourceMappingURL=avatar-widget.cjs.map