@vanira/sdk 0.0.43 → 0.0.44
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/vanira-sdk.es.js +11 -4
- package/dist/vanira-sdk.js +1 -1
- package/dist/vanira-sdk.js.map +1 -1
- package/dist/vanira-sdk.umd.js +2 -2
- package/package.json +1 -1
package/dist/vanira-sdk.umd.js
CHANGED
|
@@ -1442,7 +1442,7 @@ overflow: hidden;
|
|
|
1442
1442
|
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
|
1443
1443
|
</button>
|
|
1444
1444
|
</div>
|
|
1445
|
-
`,p.querySelector("#vnr-remove-file").addEventListener("click",()=>{r=null,p.style.display="none",c.style.display="block",u.disabled=!0}),u.disabled=!1};c.addEventListener("click",()=>m.click()),c.addEventListener("dragover",v=>{v.preventDefault(),c.classList.add("drag")}),c.addEventListener("dragleave",()=>c.classList.remove("drag")),c.addEventListener("drop",v=>{var y;v.preventDefault(),c.classList.remove("drag");const x=(y=v.dataTransfer)==null?void 0:y.files[0];x&&f(x)}),m.addEventListener("change",()=>{var x;const v=(x=m.files)==null?void 0:x[0];v&&f(v)}),u.addEventListener("click",async()=>{if(!r)return;const v=r;c.style.display="none",p.style.display="none",b.style.display="block",b.innerHTML='<div class="vnr-center"><div class="vnr-spinner" style="margin:0 auto 8px"></div>Uploading…</div>',u.disabled=!0;try{if(s&&typeof s.uploadMedia=="function"){const{media_id:x,url:y}=await s.uploadMedia(v,d,`User uploaded: ${v.name}`);b.innerHTML='<div class="vnr-center" style="color:#22c55e">✓ File sent!</div>',setTimeout(()=>{this.dismiss(),e({file_name:v.name,file_type:v.type,file_size:v.size,media_id:x,url:y,message:`User uploaded: ${v.name}`})},400)}else{const x=new FileReader;x.onload=y=>{b.innerHTML='<div class="vnr-center" style="color:#22c55e">✓ File ready!</div>',setTimeout(()=>{this.dismiss(),e({file_name:v.name,file_type:v.type,file_size:v.size,data_url:y.target.result,message:`User uploaded: ${v.name}`})},400)},x.readAsDataURL(v)}}catch(x){b.innerHTML=`<div class="vnr-center" style="color:#ef4444">${(x==null?void 0:x.message)||"Upload failed. Please try again."}</div>`,u.disabled=!1}})}renderNavigate(t,e,i){var o,d;const s=String(((o=t.clientFields)==null?void 0:o.target_url)||((d=t.args)==null?void 0:d.target_url)||"/");if(console.log(`🚀 [WidgetPresetRenderer] Navigating to: ${s}`),s.startsWith("http://")||s.startsWith("https://"))window.open(s,"_blank","noopener,noreferrer");else{const A=window.location.href;window.dispatchEvent(new CustomEvent("vanira:navigate",{detail:{url:s}})),setTimeout(()=>{window.location.href===A&&(window.location.href=s)},150)}e({navigated_to:s,status:"success"})}renderHighlight(t,e,i){const s=t.args||{},n=t.clientFields||{},o=String(s.css_selector||n.css_selector||s.selector||n.selector||""),d=String(s.highlight_color||n.highlight_color||"#a855f7"),A=Number(s.duration_ms||n.duration_ms||3e3);if(console.log("🔦 [WidgetPresetRenderer] renderHighlight triggered"),console.log(` → selector: "${o}"`),console.log(` → color: "${d}"`),console.log(` → duration: ${A}ms`),!o){console.warn("⚠️ [WidgetPresetRenderer] No css_selector provided for highlight"),i("No css_selector provided for highlight");return}const r=document.querySelector(o);if(console.log(`🔦 [WidgetPresetRenderer] querySelector("${o}") →`,r),!r){console.warn(`⚠️ [WidgetPresetRenderer] Element not found for selector: "${o}"`),i(`Element not found for selector: "${o}"`);return}const h=r.style.outline,l=r.style.outlineOffset,c=r.style.boxShadow,m=r.style.transition,p=r.style.scrollMarginTop;r.style.transition="outline 0.2s ease, box-shadow 0.2s ease",r.style.outline=`3px solid ${d}`,r.style.outlineOffset="6px",r.style.boxShadow=`0 0 0 8px ${d}33, 0 0 32px ${d}88`,r.style.scrollMarginTop="100px",console.log("✅ [WidgetPresetRenderer] Highlight applied to:",r),r.scrollIntoView({behavior:"smooth",block:"center"}),setTimeout(()=>{r.style.outline=h,r.style.outlineOffset=l,r.style.boxShadow=c,r.style.transition=m,r.style.scrollMarginTop=p,console.log(`🔦 [WidgetPresetRenderer] Highlight removed from: "${o}"`)},A),e({status:"success",message:`Element highlighted: ${o}`})}renderTypeText(t,e,i){const s=t.args||{},n=t.clientFields||{},o=String(s.element_id||n.element_id||s.css_selector||n.css_selector||s.selector||n.selector||"").trim(),d=String(s.text_to_type||n.text_to_type||""),A=Number(s.delay_ms!==void 0?s.delay_ms:n.delay_ms!==void 0?n.delay_ms:50);console.log("✍️ [WidgetPresetRenderer] renderTypeText triggered"),console.log(` → idOrSelector: "${o}"`),console.log(` → text_to_type: "${d}"`),console.log(` → delayMs: ${A}ms`);let r=null;if(o){try{r=document.querySelector(o)}catch{}r||(r=document.getElementById(o))}const h=()=>{console.log("ℹ️ [WidgetPresetRenderer] Target element not found or selector not provided. Displaying fallback popup.");const u="Text Input Simulation",f=o?`Target element "${o}" not found on the page. Typing is simulated below:`:"No target input ID/selector was provided. Typing is simulated below:",v=this.createOverlay(),x=this.createModal(v,u,f),y=document.createElement("div");y.style.marginTop="14px",y.style.display="flex",y.style.flexDirection="column",y.style.gap="12px";const w=document.createElement("textarea");w.style.width="100%",w.style.height="120px",w.style.background="#f9fafb",w.style.border="1px solid #e5e7eb",w.style.borderRadius="10px",w.style.padding="12px",w.style.fontSize="14px",w.style.color="#111",w.style.outline="none",w.style.resize="none",w.style.boxSizing="border-box",w.placeholder="Simulating typing...",y.appendChild(w);const C=document.createElement("button");C.style.width="100%",C.style.padding="10px 16px",C.style.background="#111",C.style.color="#fff",C.style.border="none",C.style.borderRadius="10px",C.style.fontSize="14px",C.style.fontWeight="600",C.style.cursor="pointer",C.style.transition="background 0.2s",C.textContent="Submit",y.appendChild(C),x.appendChild(y);const Q=x.querySelector(".vnr-close-btn");if(Q&&(Q.onclick=()=>{this.dismiss(),i("User dismissed typing popup")}),C.onclick=()=>{const M=w.value;this.dismiss(),e({status:"success",text:M,message:"Text submitted via popup simulation"})},w.focus(),A<=0)w.value=d;else{let M="",k=0;const I=()=>{this.overlay&&k<d.length&&(M+=d[k],w.value=M,k++,setTimeout(I,A))};I()}};if(!r){h();return}if(r.focus(),!(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||"value"in r)){console.log("ℹ️ [WidgetPresetRenderer] Target is not a form input. Setting textContent directly."),r.textContent=d,e({status:"success",message:`Text set on element: ${o}`});return}const c=r;if(A<=0){c.value=d,c.dispatchEvent(new Event("input",{bubbles:!0})),c.dispatchEvent(new Event("change",{bubbles:!0})),e({status:"success",message:`Text entered instantly in: ${o}`});return}let m="",p=0;const b=()=>{p<d.length?(m+=d[p],c.value=m,c.dispatchEvent(new Event("input",{bubbles:!0})),p++,setTimeout(b,A)):(c.dispatchEvent(new Event("change",{bubbles:!0})),e({status:"success",message:`Text typed completely in: ${o}`}))};b()}}const D=class D extends q{constructor(e){super(e);a(this,"vaniraClient",null);a(this,"currentView",null);a(this,"presetRenderer",null);a(this,"isPanelOpen",!1);a(this,"callActive",!1);a(this,"eventSource",null);a(this,"floatingButton",null);a(this,"floatingWelcomeChips",null);a(this,"panel",null);a(this,"welcomeChipsData",[]);a(this,"chatAdapter");a(this,"sessionManager",null);a(this,"sessionActive",!1);a(this,"widgetMode","voice_only");a(this,"agentId","");a(this,"prospectGroupId","");a(this,"chatServerUrl","");a(this,"prospectId","");a(this,"chatId",null);a(this,"conversationId",null);a(this,"widgetId","");a(this,"pkKey","");a(this,"chatInitialized",!1);a(this,"primaryColor","#000000");a(this,"secondaryColor","#111111");a(this,"gradient",null);a(this,"positionType","fixed");a(this,"position","bottom-right");a(this,"widgetIcon",null);a(this,"iconConfig",null);a(this,"chatWelcomeMessage",null);this.chatAdapter=new ae,this.processConfig(e)}initSessionManager(){const e=this.widgetId||this.agentId||"default";this.sessionManager=new B.SessionManager(e),this.sessionManager.on("tab_took_over",()=>{console.warn("[VaniraAI] Session taken over by another tab."),this.sessionActive=!1,this.showTabConflictBanner("taken_over")}),this.sessionManager.on("session_cleared",()=>{console.log("[VaniraAI] Session cleared externally.")});const i=this.sessionManager.claimSession();return this.sessionActive=i,i}restoreSessionMessages(){var A,r,h;const e=(A=this.sessionManager)==null?void 0:A.getSession();if(!e)return;const i=(h=(r=this.currentView)==null?void 0:r.getChatWindow)==null?void 0:h.call(r);if(!i)return;const s=e.messages.filter(l=>l.content.trim()!==""),n=`vanira_calls_${this.widgetId||this.agentId}`,o=JSON.parse(localStorage.getItem(n)||"[]");if(s.length===0&&o.length===0)return;i.clearMessages();const d=[...s.map((l,c)=>({type:"msg",role:l.role,content:l.content,ts:l.timestamp??c})),...o.map(l=>({type:"call",durationMs:l.durationMs,startedAt:l.startedAt,ts:l.startedAt}))];d.sort((l,c)=>l.ts-c.ts),d.forEach(l=>{l.type==="msg"?i.addMessage(l.role,l.content,l.ts):i.addCallRecord(l.durationMs,l.startedAt)}),console.log(`[VaniraAI] Restored ${s.length} messages + ${o.length} call records from session.`)}showTabConflictBanner(e){var i,s;this.root&&((i=this.root.querySelector(".vanira-tab-conflict-banner"))==null||i.remove(),e==="conflict"&&((s=this.sessionManager)==null||s.forceClaimSession(),this.sessionActive=!0,this.widgetMode.includes("chat")&&this.initializeChatSession(!1)))}playMessageSound(e){try{if(!D.audioContext){const d=window.AudioContext||window.webkitAudioContext;if(!d)return;D.audioContext=new d}const i=D.audioContext;i.state==="suspended"&&i.resume().catch(()=>{});const s=i.createOscillator(),n=i.createGain();s.connect(n),n.connect(i.destination);const o=i.currentTime;e==="send"?(s.type="sine",s.frequency.setValueAtTime(300,o),s.frequency.exponentialRampToValueAtTime(500,o+.05),n.gain.setValueAtTime(0,o),n.gain.linearRampToValueAtTime(.1,o+.01),n.gain.exponentialRampToValueAtTime(.001,o+.1),s.start(o),s.stop(o+.1)):(s.type="sine",s.frequency.setValueAtTime(500,o),s.frequency.exponentialRampToValueAtTime(800,o+.1),n.gain.setValueAtTime(0,o),n.gain.linearRampToValueAtTime(.15,o+.02),n.gain.exponentialRampToValueAtTime(.001,o+.2),s.start(o),s.stop(o+.2))}catch(i){console.warn("[VaniraAI] Audio feedback failed",i)}}handleWelcomePayload(e,i="assistant"){var o,d,A,r,h,l,c,m;if(!e||this.widgetMode==="voice_only")return;e.buttons&&Array.isArray(e.buttons)?this.welcomeChipsData=e.buttons:((o=e.widget)==null?void 0:o.type)==="button_list"&&((d=e.widget.data)!=null&&d.buttons)&&(this.welcomeChipsData=e.widget.data.buttons),this.updateWelcomeChipsVisibility();const s=(r=(A=this.currentView)==null?void 0:A.getChatWindow)==null?void 0:r.call(A);let n=e.text||e.response||e.content||e.message||"";if(!n&&!this.welcomeChipsData.length&&(n="Hey! how can I help you ?"),!n&&typeof e=="string"&&e.trim().startsWith("{"))try{const p=JSON.parse(e);n=p.text||p.response||p.content||p.message||"",((h=p.widget)==null?void 0:h.type)==="button_list"&&((l=p.widget.data)!=null&&l.buttons)&&(this.welcomeChipsData=p.widget.data.buttons)}catch{}if(console.log("[VaniraAI] Processing Welcome Payload:",{hasText:!!n,chipsCount:this.welcomeChipsData.length,hasChatWindow:!!s,mode:this.widgetMode}),s){if(!n&&this.welcomeChipsData.length===0)return;const p=(c=this.sessionManager)==null?void 0:c.getSession();(p==null?void 0:p.messages.some(u=>u.content===n&&u.role===i))||(n&&(s.addMessage(i,n),(m=this.sessionManager)==null||m.pushMessage(i,n)),this.welcomeChipsData.length>0&&s.addButtons(this.welcomeChipsData))}}async initializeChatSession(e=!1){var i,s,n,o,d,A;if(this.sessionActive&&!this.chatInitialized){this.chatInitialized=!0;try{B.ChatService.setChatUrl(this.chatServerUrl);const r=(i=this.sessionManager)==null?void 0:i.getSession();if(!e&&(r!=null&&r.prospectId)){this.prospectId=r.prospectId,this.chatId=r.chatId,this.conversationId=r.conversationId||null,console.log(`[VaniraAI] Session restored — tab: ${(s=this.sessionManager)==null?void 0:s.getTabId()}, prospect: ${this.prospectId}`),this.restoreSessionMessages(),this.chatId&&!this.eventSource&&(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,l=>{var c,m,p;(m=(c=this.currentView)==null?void 0:c.getChatWindow)==null||m.call(c).addMessage("assistant",l),(p=this.sessionManager)==null||p.pushMessage("assistant",l),this.playMessageSound("receive")}));return}this.prospectId||(this.prospectGroupId?this.prospectId=await B.ChatService.createChatProspect(this.prospectGroupId):this.prospectId=`anon_${Date.now()}_${Math.random().toString(36).substr(2,9)}`);const h=await B.ChatService.fetchWelcomeMessage(this.agentId,this.prospectId,this.widgetId||void 0,this.pkKey||void 0);h&&(this.handleWelcomePayload(h),h.chatId&&!this.chatId&&(this.chatId=h.chatId,this.eventSource||(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,l=>{var c,m,p;(m=(c=this.currentView)==null?void 0:c.getChatWindow)==null||m.call(c).addMessage("assistant",l),(p=this.sessionManager)==null||p.pushMessage("assistant",l),this.playMessageSound("receive")}))),h.conversationId&&(this.conversationId=h.conversationId)),(n=this.sessionManager)==null||n.saveIds(this.prospectId,this.chatId,this.conversationId)}catch(r){console.error("[VaniraAI] Chat init failed",r);const h="Hey! how can I help you ?";(d=(o=this.currentView)==null?void 0:o.getChatWindow)==null||d.call(o).addMessage("assistant",h),(A=this.sessionManager)==null||A.pushMessage("assistant",h)}}}async initialize(e){await super.initialize(e),this.processConfig(e),this.root&&this.ui_renderer(this.root)}processConfig(e){var i,s;if(this.widgetId=e.widgetId||e.widget_id||this.widgetId||"",this.agentId=e.agentId||e.agent_id||this.agentId||"",this.prospectGroupId=e.prospectGroupId||((i=e.client)==null?void 0:i.base_prospect_group_id)||this.prospectGroupId||"",this.widgetMode=e.widgetMode||e.mode||this.widgetMode||"voice_only",this.pkKey=e.pkKey||e.pk_key||e.publicKey||e.public_key||this.pkKey||"",this.primaryColor=e.primaryColor||e.primary_color||"#000000",this.secondaryColor=e.secondaryColor||e.secondary_color||"#111111",this.gradient=e.gradient||null,this.position=e.position||"bottom-right",this.positionType=e.positionType||"fixed",this.widgetIcon=e.widgetIcon||e.icon||null,this.iconConfig=e.iconConfig||e.icon_config||null,this.chatWelcomeMessage=e.chatWelcomeMessage||e.chat_welcome_message||((s=e.agent)==null?void 0:s.chat_welcome_message)||null,console.log("[VaniraAI] processConfig:",{hasPrimary:!!this.primaryColor,hasSecondary:!!this.secondaryColor,hasWelcome:!!this.chatWelcomeMessage}),typeof this.chatWelcomeMessage=="string")try{this.chatWelcomeMessage=JSON.parse(this.chatWelcomeMessage)}catch(n){console.warn("[VaniraAI] Failed to parse chatWelcomeMessage string",n)}this.chatServerUrl=e.serverUrl||e.chatServerUrl||"https://inboxapi.travelr.club",this.updateWelcomeChipsVisibility()}async create_call(e="continue"){var i,s,n;if(!(this.callActive||!this.agentId)){this.sessionActive||((i=this.sessionManager)==null||i.forceClaimSession(),this.sessionActive=!0);try{this.callActive=!0,this.updateViewCallState(!0),this.updateViewStatus("connecting");const o=((s=this.config)==null?void 0:s.serverUrl)||((n=this.config)==null?void 0:n.chatServerUrl),d=o&&!o.includes("travelr.club")?o:"https://api.vanira.io",A=new Y.VaniraAI({agentId:this.agentId,apiKey:this.pkKey||void 0,sessionBehavior:e,prospectId:this.prospectId||void 0,backendUrl:d});A.on("session_started",({prospectId:r})=>{var h;r&&(this.prospectId=r,(h=this.sessionManager)==null||h.saveIds(r,this.chatId))}),A.on("connected",()=>this.updateViewStatus("connected")).on("disconnected",()=>this.end_call()).on("error",r=>{console.error("[VaniraAI Widget] Call error:",r),this.updateViewStatus("error",r)}).on("transcription",({text:r,isFinal:h})=>{var l,c;(c=(l=this.currentView)==null?void 0:l.setTranscription)==null||c.call(l,r,h)}).on("track",({track:r})=>{var h;this.widgetMode.includes("avatar")&&r.kind==="video"&&((h=this.currentView)!=null&&h.setVideoTrack)&&this.currentView.setVideoTrack(r)}).on("tool_call",r=>{var c,m,p;if(console.log("[VaniraAI Widget] Tool call received:",r.name,r.arguments),(c=this.presetRenderer)==null?void 0:c.handle(r,b=>{var f;const u=((f=r.client_fields)==null?void 0:f.action_name)||`user_submitted_${r.name}`;A.triggerInterrupt(u,b)},b=>{const u=r.tool_call_id;try{A.sendToolResult(u,{status:"cancelled",reason:"User dismissed"})}catch{}},A))return;const l=new CustomEvent("vaniraai:tool_call",{detail:r,bubbles:!0,composed:!0});(p=(m=this.root)==null?void 0:m.host)==null||p.dispatchEvent(l)}),this.vaniraClient=A,await A.start()}catch(o){console.error("[VaniraAI Widget] Call failed",o),this.updateViewStatus("error",(o==null?void 0:o.message)||String(o))}}}end_call(){var i;this.callActive=!1;const e=this.vaniraClient;this.vaniraClient=null,e&&e.stop(),(i=this.presetRenderer)==null||i.dismiss(),this.updateViewCallState(!1)}updateViewCallState(e){var i;(i=this.currentView)!=null&&i.setCallActive&&this.currentView.setCallActive(e)}updateViewStatus(e,i){var s;(s=this.currentView)!=null&&s.setStatus&&this.currentView.setStatus(e,i)}ui_renderer(e){var r,h,l;this.root=e,this.root.innerHTML="",this.presetRenderer=new X(e),this.root.host&&(this.positionType==="fixed"?this.root.host.classList.add("vanira-portal"):this.root.host.classList.remove("vanira-portal"));const i=document.createElement("style");i.textContent=`@keyframes vanira-slide-up {
|
|
1445
|
+
`,p.querySelector("#vnr-remove-file").addEventListener("click",()=>{r=null,p.style.display="none",c.style.display="block",u.disabled=!0}),u.disabled=!1};c.addEventListener("click",()=>m.click()),c.addEventListener("dragover",v=>{v.preventDefault(),c.classList.add("drag")}),c.addEventListener("dragleave",()=>c.classList.remove("drag")),c.addEventListener("drop",v=>{var y;v.preventDefault(),c.classList.remove("drag");const x=(y=v.dataTransfer)==null?void 0:y.files[0];x&&f(x)}),m.addEventListener("change",()=>{var x;const v=(x=m.files)==null?void 0:x[0];v&&f(v)}),u.addEventListener("click",async()=>{if(!r)return;const v=r;c.style.display="none",p.style.display="none",b.style.display="block",b.innerHTML='<div class="vnr-center"><div class="vnr-spinner" style="margin:0 auto 8px"></div>Uploading…</div>',u.disabled=!0;try{if(s&&typeof s.uploadMedia=="function"){const{media_id:x,url:y}=await s.uploadMedia(v,d,`User uploaded: ${v.name}`);b.innerHTML='<div class="vnr-center" style="color:#22c55e">✓ File sent!</div>',setTimeout(()=>{this.dismiss(),e({file_name:v.name,file_type:v.type,file_size:v.size,media_id:x,url:y,message:`User uploaded: ${v.name}`})},400)}else{const x=new FileReader;x.onload=y=>{b.innerHTML='<div class="vnr-center" style="color:#22c55e">✓ File ready!</div>',setTimeout(()=>{this.dismiss(),e({file_name:v.name,file_type:v.type,file_size:v.size,data_url:y.target.result,message:`User uploaded: ${v.name}`})},400)},x.readAsDataURL(v)}}catch(x){b.innerHTML=`<div class="vnr-center" style="color:#ef4444">${(x==null?void 0:x.message)||"Upload failed. Please try again."}</div>`,u.disabled=!1}})}renderNavigate(t,e,i){var o,d;const s=String(((o=t.clientFields)==null?void 0:o.target_url)||((d=t.args)==null?void 0:d.target_url)||"/");if(console.log(`🚀 [WidgetPresetRenderer] Navigating to: ${s}`),s.startsWith("http://")||s.startsWith("https://"))window.open(s,"_blank","noopener,noreferrer");else{const A=window.location.href;window.dispatchEvent(new CustomEvent("vanira:navigate",{detail:{url:s}})),setTimeout(()=>{window.location.href===A&&(window.location.href=s)},150)}e({navigated_to:s,status:"success"})}renderHighlight(t,e,i){const s=t.args||{},n=t.clientFields||{},o=String(s.css_selector||n.css_selector||s.selector||n.selector||""),d=String(s.highlight_color||n.highlight_color||"#a855f7"),A=Number(s.duration_ms||n.duration_ms||3e3);if(console.log("🔦 [WidgetPresetRenderer] renderHighlight triggered"),console.log(` → selector: "${o}"`),console.log(` → color: "${d}"`),console.log(` → duration: ${A}ms`),!o){console.warn("⚠️ [WidgetPresetRenderer] No css_selector provided for highlight"),i("No css_selector provided for highlight");return}const r=document.querySelector(o);if(console.log(`🔦 [WidgetPresetRenderer] querySelector("${o}") →`,r),!r){console.warn(`⚠️ [WidgetPresetRenderer] Element not found for selector: "${o}"`),i(`Element not found for selector: "${o}"`);return}const h=r.style.outline,l=r.style.outlineOffset,c=r.style.boxShadow,m=r.style.transition,p=r.style.scrollMarginTop;r.style.transition="outline 0.2s ease, box-shadow 0.2s ease",r.style.outline=`3px solid ${d}`,r.style.outlineOffset="6px",r.style.boxShadow=`0 0 0 8px ${d}33, 0 0 32px ${d}88`,r.style.scrollMarginTop="100px",console.log("✅ [WidgetPresetRenderer] Highlight applied to:",r),r.scrollIntoView({behavior:"smooth",block:"center"}),setTimeout(()=>{r.style.outline=h,r.style.outlineOffset=l,r.style.boxShadow=c,r.style.transition=m,r.style.scrollMarginTop=p,console.log(`🔦 [WidgetPresetRenderer] Highlight removed from: "${o}"`)},A),e({status:"success",message:`Element highlighted: ${o}`})}renderTypeText(t,e,i){const s=t.args||{},n=t.clientFields||{},o=String(s.element_id||n.element_id||s.css_selector||n.css_selector||s.selector||n.selector||"").trim(),d=String(s.text_to_type||n.text_to_type||""),A=Number(s.delay_ms!==void 0?s.delay_ms:n.delay_ms!==void 0?n.delay_ms:50);console.log("✍️ [WidgetPresetRenderer] renderTypeText triggered"),console.log(` → idOrSelector: "${o}"`),console.log(` → text_to_type: "${d}"`),console.log(` → delayMs: ${A}ms`);let r=null;if(o){try{r=document.querySelector(o)}catch{}r||(r=document.getElementById(o))}const h=()=>{console.log("ℹ️ [WidgetPresetRenderer] Target element not found or selector not provided. Displaying fallback popup.");const u="Text Input Simulation",f=o?`Target element "${o}" not found on the page. Typing is simulated below:`:"No target input ID/selector was provided. Typing is simulated below:",v=this.createOverlay(),x=this.createModal(v,u,f),y=document.createElement("div");y.style.marginTop="14px",y.style.display="flex",y.style.flexDirection="column",y.style.gap="12px";const w=document.createElement("textarea");w.style.width="100%",w.style.height="120px",w.style.background="#f9fafb",w.style.border="1px solid #e5e7eb",w.style.borderRadius="10px",w.style.padding="12px",w.style.fontSize="14px",w.style.color="#111",w.style.outline="none",w.style.resize="none",w.style.boxSizing="border-box",w.placeholder="Simulating typing...",y.appendChild(w);const C=document.createElement("button");C.style.width="100%",C.style.padding="10px 16px",C.style.background="#111",C.style.color="#fff",C.style.border="none",C.style.borderRadius="10px",C.style.fontSize="14px",C.style.fontWeight="600",C.style.cursor="pointer",C.style.transition="background 0.2s",C.textContent="Submit",y.appendChild(C),x.appendChild(y);const Q=x.querySelector(".vnr-close-btn");if(Q&&(Q.onclick=()=>{this.dismiss(),i("User dismissed typing popup")}),C.onclick=()=>{const M=w.value;this.dismiss(),e({status:"success",text:M,message:"Text submitted via popup simulation"})},w.focus(),A<=0)w.value=d;else{let M="",k=0;const I=()=>{this.overlay&&k<d.length&&(M+=d[k],w.value=M,k++,setTimeout(I,A))};I()}};if(!r){h();return}if(r.focus(),!(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||"value"in r)){console.log("ℹ️ [WidgetPresetRenderer] Target is not a form input. Setting textContent directly."),r.textContent=d,e({status:"success",message:`Text set on element: ${o}`});return}const c=r;if(A<=0){c.value=d,c.dispatchEvent(new Event("input",{bubbles:!0})),c.dispatchEvent(new Event("change",{bubbles:!0})),e({status:"success",message:`Text entered instantly in: ${o}`});return}let m="",p=0;const b=()=>{p<d.length?(m+=d[p],c.value=m,c.dispatchEvent(new Event("input",{bubbles:!0})),p++,setTimeout(b,A)):(c.dispatchEvent(new Event("change",{bubbles:!0})),e({status:"success",message:`Text typed completely in: ${o}`}))};b()}}const D=class D extends q{constructor(e){super(e);a(this,"vaniraClient",null);a(this,"currentView",null);a(this,"presetRenderer",null);a(this,"isPanelOpen",!1);a(this,"callActive",!1);a(this,"eventSource",null);a(this,"floatingButton",null);a(this,"floatingWelcomeChips",null);a(this,"panel",null);a(this,"welcomeChipsData",[]);a(this,"chatAdapter");a(this,"sessionManager",null);a(this,"sessionActive",!1);a(this,"widgetMode","voice_only");a(this,"agentId","");a(this,"prospectGroupId","");a(this,"chatServerUrl","");a(this,"prospectId","");a(this,"chatId",null);a(this,"conversationId",null);a(this,"widgetId","");a(this,"pkKey","");a(this,"chatInitialized",!1);a(this,"primaryColor","#000000");a(this,"secondaryColor","#111111");a(this,"gradient",null);a(this,"positionType","fixed");a(this,"position","bottom-right");a(this,"widgetIcon",null);a(this,"iconConfig",null);a(this,"chatWelcomeMessage",null);this.chatAdapter=new ae,this.processConfig(e)}initSessionManager(){const e=this.widgetId||this.agentId||"default";this.sessionManager=new B.SessionManager(e),this.sessionManager.on("tab_took_over",()=>{console.warn("[VaniraAI] Session taken over by another tab."),this.sessionActive=!1,this.showTabConflictBanner("taken_over")}),this.sessionManager.on("session_cleared",()=>{console.log("[VaniraAI] Session cleared externally.")});const i=this.sessionManager.claimSession();return this.sessionActive=i,i}restoreSessionMessages(){var A,r,h;const e=(A=this.sessionManager)==null?void 0:A.getSession();if(!e)return;const i=(h=(r=this.currentView)==null?void 0:r.getChatWindow)==null?void 0:h.call(r);if(!i)return;const s=e.messages.filter(l=>l.content.trim()!==""),n=`vanira_calls_${this.widgetId||this.agentId}`,o=JSON.parse(localStorage.getItem(n)||"[]");if(s.length===0&&o.length===0)return;i.clearMessages();const d=[...s.map((l,c)=>({type:"msg",role:l.role,content:l.content,ts:l.timestamp??c})),...o.map(l=>({type:"call",durationMs:l.durationMs,startedAt:l.startedAt,ts:l.startedAt}))];d.sort((l,c)=>l.ts-c.ts),d.forEach(l=>{l.type==="msg"?i.addMessage(l.role,l.content,l.ts):i.addCallRecord(l.durationMs,l.startedAt)}),console.log(`[VaniraAI] Restored ${s.length} messages + ${o.length} call records from session.`)}showTabConflictBanner(e){var i,s;this.root&&((i=this.root.querySelector(".vanira-tab-conflict-banner"))==null||i.remove(),e==="conflict"&&((s=this.sessionManager)==null||s.forceClaimSession(),this.sessionActive=!0,this.widgetMode.includes("chat")&&this.initializeChatSession(!1)))}playMessageSound(e){try{if(!D.audioContext){const d=window.AudioContext||window.webkitAudioContext;if(!d)return;D.audioContext=new d}const i=D.audioContext;i.state==="suspended"&&i.resume().catch(()=>{});const s=i.createOscillator(),n=i.createGain();s.connect(n),n.connect(i.destination);const o=i.currentTime;e==="send"?(s.type="sine",s.frequency.setValueAtTime(300,o),s.frequency.exponentialRampToValueAtTime(500,o+.05),n.gain.setValueAtTime(0,o),n.gain.linearRampToValueAtTime(.1,o+.01),n.gain.exponentialRampToValueAtTime(.001,o+.1),s.start(o),s.stop(o+.1)):(s.type="sine",s.frequency.setValueAtTime(500,o),s.frequency.exponentialRampToValueAtTime(800,o+.1),n.gain.setValueAtTime(0,o),n.gain.linearRampToValueAtTime(.15,o+.02),n.gain.exponentialRampToValueAtTime(.001,o+.2),s.start(o),s.stop(o+.2))}catch(i){console.warn("[VaniraAI] Audio feedback failed",i)}}handleWelcomePayload(e,i="assistant"){var o,d,A,r,h,l,c,m;if(!e||this.widgetMode==="voice_only")return;e.buttons&&Array.isArray(e.buttons)?this.welcomeChipsData=e.buttons:((o=e.widget)==null?void 0:o.type)==="button_list"&&((d=e.widget.data)!=null&&d.buttons)&&(this.welcomeChipsData=e.widget.data.buttons),this.updateWelcomeChipsVisibility();const s=(r=(A=this.currentView)==null?void 0:A.getChatWindow)==null?void 0:r.call(A);let n=e.text||e.response||e.content||e.message||"";if(!n&&!this.welcomeChipsData.length&&(n="Hey! how can I help you ?"),!n&&typeof e=="string"&&e.trim().startsWith("{"))try{const p=JSON.parse(e);n=p.text||p.response||p.content||p.message||"",((h=p.widget)==null?void 0:h.type)==="button_list"&&((l=p.widget.data)!=null&&l.buttons)&&(this.welcomeChipsData=p.widget.data.buttons)}catch{}if(console.log("[VaniraAI] Processing Welcome Payload:",{hasText:!!n,chipsCount:this.welcomeChipsData.length,hasChatWindow:!!s,mode:this.widgetMode}),s){if(!n&&this.welcomeChipsData.length===0)return;const p=(c=this.sessionManager)==null?void 0:c.getSession();(p==null?void 0:p.messages.some(u=>u.content===n&&u.role===i))||(n&&(s.addMessage(i,n),(m=this.sessionManager)==null||m.pushMessage(i,n)),this.welcomeChipsData.length>0&&s.addButtons(this.welcomeChipsData))}}async initializeChatSession(e=!1){var i,s,n,o,d,A;if(this.sessionActive&&!this.chatInitialized){this.chatInitialized=!0;try{B.ChatService.setChatUrl(this.chatServerUrl);const r=(i=this.sessionManager)==null?void 0:i.getSession();if(!e&&(r!=null&&r.prospectId)){this.prospectId=r.prospectId,this.chatId=r.chatId,this.conversationId=r.conversationId||null,console.log(`[VaniraAI] Session restored — tab: ${(s=this.sessionManager)==null?void 0:s.getTabId()}, prospect: ${this.prospectId}`),this.restoreSessionMessages(),this.chatId&&!this.eventSource&&(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,l=>{var c,m,p;(m=(c=this.currentView)==null?void 0:c.getChatWindow)==null||m.call(c).addMessage("assistant",l),(p=this.sessionManager)==null||p.pushMessage("assistant",l),this.playMessageSound("receive")}));return}this.prospectId||(this.prospectGroupId?this.prospectId=await B.ChatService.createChatProspect(this.prospectGroupId):this.prospectId=`anon_${Date.now()}_${Math.random().toString(36).substr(2,9)}`);const h=await B.ChatService.fetchWelcomeMessage(this.agentId,this.prospectId,this.widgetId||void 0,this.pkKey||void 0);h&&(this.handleWelcomePayload(h),h.chatId&&!this.chatId&&(this.chatId=h.chatId,this.eventSource||(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,l=>{var c,m,p;(m=(c=this.currentView)==null?void 0:c.getChatWindow)==null||m.call(c).addMessage("assistant",l),(p=this.sessionManager)==null||p.pushMessage("assistant",l),this.playMessageSound("receive")}))),h.conversationId&&(this.conversationId=h.conversationId)),(n=this.sessionManager)==null||n.saveIds(this.prospectId,this.chatId,this.conversationId)}catch(r){console.error("[VaniraAI] Chat init failed",r);const h="Hey! how can I help you ?";(d=(o=this.currentView)==null?void 0:o.getChatWindow)==null||d.call(o).addMessage("assistant",h),(A=this.sessionManager)==null||A.pushMessage("assistant",h)}}}async initialize(e){await super.initialize(e),this.processConfig(e),this.root&&this.ui_renderer(this.root)}processConfig(e){var i,s;if(this.widgetId=e.widgetId||e.widget_id||this.widgetId||"",this.agentId=e.agentId||e.agent_id||this.agentId||"",this.prospectGroupId=e.prospectGroupId||((i=e.client)==null?void 0:i.base_prospect_group_id)||this.prospectGroupId||"",this.widgetMode=e.widgetMode||e.mode||this.widgetMode||"voice_only",this.pkKey=e.pkKey||e.pk_key||e.publicKey||e.public_key||this.pkKey||"",this.primaryColor=e.primaryColor||e.primary_color||"#000000",this.secondaryColor=e.secondaryColor||e.secondary_color||"#111111",this.gradient=e.gradient||null,this.position=e.position||"bottom-right",this.positionType=e.positionType||"fixed",this.widgetIcon=e.widgetIcon||e.icon||null,this.iconConfig=e.iconConfig||e.icon_config||null,this.chatWelcomeMessage=e.chatWelcomeMessage||e.chat_welcome_message||((s=e.agent)==null?void 0:s.chat_welcome_message)||null,console.log("[VaniraAI] processConfig:",{hasPrimary:!!this.primaryColor,hasSecondary:!!this.secondaryColor,hasWelcome:!!this.chatWelcomeMessage}),typeof this.chatWelcomeMessage=="string")try{this.chatWelcomeMessage=JSON.parse(this.chatWelcomeMessage)}catch(n){console.warn("[VaniraAI] Failed to parse chatWelcomeMessage string",n)}this.chatServerUrl=e.serverUrl||e.chatServerUrl||"https://inboxapi.travelr.club",this.updateWelcomeChipsVisibility()}async create_call(e="continue"){var i,s,n;if(!(this.callActive||!this.agentId)){this.sessionActive||((i=this.sessionManager)==null||i.forceClaimSession(),this.sessionActive=!0);try{this.callActive=!0,this.updateViewCallState(!0),this.updateViewStatus("connecting");const o=((s=this.config)==null?void 0:s.serverUrl)||((n=this.config)==null?void 0:n.chatServerUrl),d=o&&!o.includes("travelr.club")?o:"https://api.vanira.io",A=new Y.VaniraAI({agentId:this.agentId,apiKey:this.pkKey||void 0,sessionBehavior:e,prospectId:this.prospectId||void 0,backendUrl:d});A.on("session_started",({prospectId:r})=>{var h;r&&(this.prospectId=r,(h=this.sessionManager)==null||h.saveIds(r,this.chatId))}),A.on("connected",()=>this.updateViewStatus("connected")).on("disconnected",()=>this.end_call()).on("error",r=>{console.error("[VaniraAI Widget] Call error:",r),this.updateViewStatus("error",r)}).on("transcription",({text:r,isFinal:h})=>{var l,c;(c=(l=this.currentView)==null?void 0:l.setTranscription)==null||c.call(l,r,h)}).on("track",({track:r})=>{var h;this.widgetMode.includes("avatar")&&r.kind==="video"&&((h=this.currentView)!=null&&h.setVideoTrack)&&this.currentView.setVideoTrack(r)}).on("tool_call",r=>{var c,m,p;if(console.log("[VaniraAI Widget] Tool call received:",r.name,r.arguments),(c=this.presetRenderer)==null?void 0:c.handle(r,b=>{var y,w;const u=r.arguments||r.args||{};let f=u;if(typeof u=="string")try{f=JSON.parse(u)}catch{}const v=((y=r.client_fields)==null?void 0:y.preset_id)||(f==null?void 0:f.preset_id),x=((w=r.client_fields)==null?void 0:w.action_name)||(v==="vanira_calendar"?"calendar_slot_selected":`user_submitted_${r.name}`);A.triggerInterrupt(x,b)},b=>{const u=r.tool_call_id;try{A.sendToolResult(u,{status:"cancelled",reason:"User dismissed"})}catch{}},A))return;const l=new CustomEvent("vaniraai:tool_call",{detail:r,bubbles:!0,composed:!0});(p=(m=this.root)==null?void 0:m.host)==null||p.dispatchEvent(l)}),this.vaniraClient=A,await A.start()}catch(o){console.error("[VaniraAI Widget] Call failed",o),this.updateViewStatus("error",(o==null?void 0:o.message)||String(o))}}}end_call(){var i;this.callActive=!1;const e=this.vaniraClient;this.vaniraClient=null,e&&e.stop(),(i=this.presetRenderer)==null||i.dismiss(),this.updateViewCallState(!1)}updateViewCallState(e){var i;(i=this.currentView)!=null&&i.setCallActive&&this.currentView.setCallActive(e)}updateViewStatus(e,i){var s;(s=this.currentView)!=null&&s.setStatus&&this.currentView.setStatus(e,i)}ui_renderer(e){var r,h,l;this.root=e,this.root.innerHTML="",this.presetRenderer=new X(e),this.root.host&&(this.positionType==="fixed"?this.root.host.classList.add("vanira-portal"):this.root.host.classList.remove("vanira-portal"));const i=document.createElement("style");i.textContent=`@keyframes vanira-slide-up {
|
|
1446
1446
|
from { opacity:0; transform:translateY(16px); }
|
|
1447
1447
|
to { opacity:1; transform:translateY(0); }
|
|
1448
1448
|
}`,this.root.appendChild(i);const s=document.createElement("style");s.textContent=`
|
|
@@ -1535,4 +1535,4 @@ overflow: hidden;
|
|
|
1535
1535
|
</svg>
|
|
1536
1536
|
${p}
|
|
1537
1537
|
</button>
|
|
1538
|
-
`;const v=f.querySelectorAll(".session-option");v.forEach(w=>{w.addEventListener("click",C=>{C.stopPropagation(),v.forEach(Q=>Q.classList.remove("active")),w.classList.add("active"),u=w.getAttribute("data-behavior")})});const x=w=>{w.stopPropagation(),f.style.display="none",this.openPanel(),this.create_call(u)};f.addEventListener("click",x);const y=f.querySelector(".clean-card-btn");y==null||y.addEventListener("click",w=>{w.stopPropagation(),x(w)}),this.root.appendChild(f)}else this.root.appendChild(this.floatingButton.getElement());this.root.appendChild(this.panel.getElement()),this.setupPanelContent(),this.chatWelcomeMessage&&!this.widgetMode.includes("chat")&&this.handleWelcomePayload(this.chatWelcomeMessage),this.initSessionManager()?this.widgetMode.includes("chat")&&this.initializeChatSession():this.showTabConflictBanner("conflict")}getFabIcon(){return this.widgetIcon&&S[this.widgetIcon]?S[this.widgetIcon]:this.widgetMode.includes("chat")?E.chat:E.voice_orb}getPanelTitle(){return"Assistant"}getPosStyle(){const e={"bottom-right":"bottom: 24px; right: 24px;","bottom-left":"bottom: 24px; left: 24px;","top-right":"top: 24px; right: 24px;","top-left":"top: 24px; left: 24px;"};return e[this.position]||e["bottom-right"]}setupPanelContent(){var i,s;const e=(n,o)=>{var h,l;const d=(l=(h=this.currentView)==null?void 0:h.getChatWindow)==null?void 0:l.call(h);d&&d.addCallRecord(n,o);const A=`vanira_calls_${this.widgetId||this.agentId}`,r=JSON.parse(localStorage.getItem(A)||"[]");r.push({durationMs:n,startedAt:o}),r.length>50&&r.splice(0,r.length-50),localStorage.setItem(A,JSON.stringify(r))};switch(this.widgetMode){case"chat_only":this.currentView=new se(n=>this.handleChatSend(n));break;case"chat_voice":this.currentView=new ne(n=>this.handleChatSend(n),()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"avatar_only":this.currentView=new oe(()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"chat_avatar":this.currentView=new re(n=>this.handleChatSend(n),()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"voice_only":default:this.currentView=new ie(n=>this.create_call(n),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break}if(this.currentView&&this.panel){this.panel.setContent(this.currentView.getElement());const n=(s=(i=this.currentView).getChatWindow)==null?void 0:s.call(i);n&&n.setResolveCallback(()=>this.resolveActiveConversation())}}async handleChatSend(e){var s,n,o,d,A;if(!e)return;this.sessionActive||((s=this.sessionManager)==null||s.forceClaimSession(),this.sessionActive=!0,this.widgetMode.includes("chat")&&await this.initializeChatSession(!1));const i=(o=(n=this.currentView)==null?void 0:n.getChatWindow)==null?void 0:o.call(n);if(i){this.chatId&&!this.eventSource&&(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,r=>{var h,l,c;(l=(h=this.currentView)==null?void 0:h.getChatWindow)==null||l.call(h).addMessage("assistant",r),(c=this.sessionManager)==null||c.pushMessage("assistant",r),this.playMessageSound("receive")})),i.addMessage("user",e),(d=this.sessionManager)==null||d.pushMessage("user",e),i.setTyping(!0),(A=this.sessionManager)==null||A.pushMessage("assistant","");try{let r=!1;await this.chatAdapter.sendMessage(e,this.agentId,this.prospectId,this.chatId,h=>{var l;r||(this.playMessageSound("receive"),r=!0),i.setTyping(!1),(h==null?void 0:h.type)==="button_list"&&((l=h.data)!=null&&l.buttons)&&(i.addButtons(h.data.buttons),this.welcomeChipsData=h.data.buttons,this.updateWelcomeChipsVisibility())},h=>{var l;r||(this.playMessageSound("receive"),r=!0),i.setTyping(!1),i.updateLastAssistantMessage(h),(l=this.sessionManager)==null||l.updateLastAssistantMessage(h)},(h,l)=>{var c;h&&(this.chatId=h),l&&(this.conversationId=l),(h||l)&&((c=this.sessionManager)==null||c.saveIds(this.prospectId,this.chatId,this.conversationId))},this.widgetId||void 0,this.pkKey||void 0)}catch(r){i.setTyping(!1),console.error("[VaniraAI] Send message failed",r),i.addMessage("assistant","Error sending message.")}}}togglePanel(){this.isPanelOpen?this.closePanel():this.openPanel()}openPanel(){var s,n,o,d;this.isPanelOpen=!0,this.updateWelcomeChipsVisibility();const e=(s=this.floatingButton)==null?void 0:s.getElement().getBoundingClientRect();if(e&&e.width>0){const A=e.top>window.innerHeight/2;(n=this.panel)==null||n.open({left:`${Math.max(20,Math.min(e.left-170,window.innerWidth-420))}px`,bottom:A?`${window.innerHeight-e.top+20}px`:void 0,top:A?void 0:`${e.top+80}px`})}else(o=this.panel)==null||o.open({bottom:"90px",right:"20px",left:"auto",top:"auto"});(d=this.root)!=null&&d.host&&this.root.host.classList.add("vanira-panel-open")}closePanel(){var e,i;this.isPanelOpen=!1,this.updateWelcomeChipsVisibility(),(e=this.panel)==null||e.close(),(i=this.root)!=null&&i.host&&this.root.host.classList.remove("vanira-panel-open")}updateWelcomeChipsVisibility(){if(!this.floatingWelcomeChips)return;const e=!this.isPanelOpen&&this.welcomeChipsData.length>0;console.log("[VaniraAI] updateWelcomeChipsVisibility:",{visible:e,isPanelOpen:this.isPanelOpen,chipsCount:this.welcomeChipsData.length}),e?(this.floatingWelcomeChips.setChips(this.welcomeChipsData),this.floatingWelcomeChips.getElement().style.display="flex"):this.floatingWelcomeChips.getElement().style.display="none"}handleFloatingChipClick(e){this.openPanel(),this.handleChatSend(e)}async resolveActiveConversation(){var i,s,n;if(this.eventSource&&(this.eventSource.close(),this.eventSource=null),this.conversationId)try{await B.ChatService.resolveConversation(this.conversationId)}catch(o){console.error("[VaniraAI] Failed to resolve conversation on backend:",o)}else console.warn("[VaniraAI] Cannot resolve — conversation_id not yet received from /widget/chat");(i=this.sessionManager)==null||i.clearChatKeepProspect(),this.conversationId=null,this.chatId=null;const e=(n=(s=this.currentView)==null?void 0:s.getChatWindow)==null?void 0:n.call(s);e&&e.clearMessages(),this.chatInitialized=!1,await this.initializeChatSession(!0)}};a(D,"audioContext",null);let z=D;class de{static getProvider(t){return new z(t)}}class ce extends HTMLElement{constructor(){super();a(this,"shadow");a(this,"provider",null);a(this,"widgetId","");a(this,"agentId","");a(this,"pkKey","");a(this,"serverUrl","https://inboxapi.travelr.club");a(this,"position","bottom-right");a(this,"primaryColor","#000000");a(this,"secondaryColor","#000000");a(this,"gradient",null);a(this,"positionType","fixed");this.shadow=this.attachShadow({mode:"open"})}static get observedAttributes(){return["widget-id","agent-id","position","primary-color","secondary-color","server-url","gradient","position-type","pk-key"]}connectedCallback(){console.log("[VaniraAI Widget] Initializing..."),this.readAttributes();const e={widgetId:this.widgetId,agentId:this.agentId,pkKey:this.pkKey,serverUrl:this.serverUrl,position:this.position,primaryColor:this.primaryColor,secondaryColor:this.secondaryColor,gradient:this.gradient,positionType:this.positionType};this.provider=de.getProvider(e),this.provider&&this.provider.ui_renderer(this.shadow),this.widgetId&&!this.agentId&&this.initializeExpandedConfig()}readAttributes(){this.widgetId=this.getAttribute("widget-id")||"",this.agentId=this.getAttribute("agent-id")||"",this.pkKey=this.getAttribute("pk-key")||"",this.serverUrl=this.getAttribute("server-url")||"https://inboxapi.travelr.club",this.position=this.getAttribute("position")||"bottom-right",this.primaryColor=this.getAttribute("primary-color")||"#000000",this.secondaryColor=this.getAttribute("secondary-color")||this.primaryColor,this.gradient=this.getAttribute("gradient"),this.positionType=this.getAttribute("position-type")||"fixed"}async initializeExpandedConfig(){try{const e=await B.ConfigService.fetchWidgetConfig(this.widgetId,this.pkKey||void 0);this.provider&&await this.provider.initialize(e)}catch(e){console.error("[VaniraAI Widget] Config failed:",e)}}}const Ae=({client:g,toolCall:t,onCustomTool:e})=>{const i=T.useRef(null);return T.useEffect(()=>(i.current=new X(null),()=>{var s;(s=i.current)==null||s.dismiss()}),[]),T.useEffect(()=>{if(!t||!i.current)return;const s=t.data||t;let n={};const o=s.arguments||s.args;if(typeof o=="string")try{n=JSON.parse(o)}catch{n={}}else o&&typeof o=="object"&&(n=o);const d=s.client_fields||{},A=(d==null?void 0:d.preset_id)||(n==null?void 0:n.preset_id),r=s.tool_call_id||s.call_id||"";A&&["vanira_form","vanira_calendar","vanira_navigate","vanira_upload","vanira_camera","vanira_highlight_element","vanira_type_text"].includes(A)?(!(A==="vanira_highlight_element"||A==="vanira_type_text")&&g&&g.sendContextUpdate&&r&&(g.sendToolResult(r,{status:"popup_shown",message:`The UI preset ${A} is now visible. I am waiting for the user to complete it. STAY SILENT.`}),g.sendContextUpdate({ui_state:"waiting_for_preset_data",tool_status:"active_waiting",visible_preset:A})),i.current.handle(t,c=>{if(console.log(`🎯 [PresetRenderer Wrapper] Preset ${A} completed! Result:`,c),g){g.triggerActionInterrupt&&(console.log("⚡ [PresetRenderer Wrapper] Triggering action interrupt to wake AI..."),g.triggerActionInterrupt());const m=typeof c=="string"?{response:c}:c;if(g.sendActionTrigger){const p=d.action_name||`user_submitted_${s.name}`;console.log(`📤 [PresetRenderer Wrapper] Submitting preset data via sendActionTrigger (${p})...`),g.sendActionTrigger(p,m)}else console.log(`📤 [PresetRenderer Wrapper] Submitting tool result for ID: ${r}`),g.sendToolResult(r,m)}},c=>{if(console.log(`❌ [PresetRenderer Wrapper] Preset ${A} cancelled:`,c),g)if(typeof g.sendToolError=="function")g.sendToolError(r,c||"User cancelled the action");else try{g.sendToolResult(r,{status:"cancelled",reason:c||"User dismissed"})}catch{}},g)):e&&e(t)},[t,g,e]),null};exports.VaniraAI=Y.VaniraAI;exports.WebRTCClient=Y.WebRTCClient;exports.BrowserAudioAdapter=B.BrowserAudioAdapter;exports.BrowserDataChannelAdapter=B.BrowserDataChannelAdapter;exports.BrowserMediaAdapter=B.BrowserMediaAdapter;exports.BrowserPeerAdapter=B.BrowserPeerAdapter;exports.ChatService=B.ChatService;exports.ConfigService=B.ConfigService;exports.SessionManager=B.SessionManager;exports.browserCapabilities=B.browserCapabilities;exports.browserRuntime=B.browserRuntime;exports.createBrowserAI=B.createBrowserAI;exports.createBrowserClient=B.createBrowserClient;exports.PresetRenderer=Ae;exports.VaniraWidget=ce;
|
|
1538
|
+
`;const v=f.querySelectorAll(".session-option");v.forEach(w=>{w.addEventListener("click",C=>{C.stopPropagation(),v.forEach(Q=>Q.classList.remove("active")),w.classList.add("active"),u=w.getAttribute("data-behavior")})});const x=w=>{w.stopPropagation(),f.style.display="none",this.openPanel(),this.create_call(u)};f.addEventListener("click",x);const y=f.querySelector(".clean-card-btn");y==null||y.addEventListener("click",w=>{w.stopPropagation(),x(w)}),this.root.appendChild(f)}else this.root.appendChild(this.floatingButton.getElement());this.root.appendChild(this.panel.getElement()),this.setupPanelContent(),this.chatWelcomeMessage&&!this.widgetMode.includes("chat")&&this.handleWelcomePayload(this.chatWelcomeMessage),this.initSessionManager()?this.widgetMode.includes("chat")&&this.initializeChatSession():this.showTabConflictBanner("conflict")}getFabIcon(){return this.widgetIcon&&S[this.widgetIcon]?S[this.widgetIcon]:this.widgetMode.includes("chat")?E.chat:E.voice_orb}getPanelTitle(){return"Assistant"}getPosStyle(){const e={"bottom-right":"bottom: 24px; right: 24px;","bottom-left":"bottom: 24px; left: 24px;","top-right":"top: 24px; right: 24px;","top-left":"top: 24px; left: 24px;"};return e[this.position]||e["bottom-right"]}setupPanelContent(){var i,s;const e=(n,o)=>{var h,l;const d=(l=(h=this.currentView)==null?void 0:h.getChatWindow)==null?void 0:l.call(h);d&&d.addCallRecord(n,o);const A=`vanira_calls_${this.widgetId||this.agentId}`,r=JSON.parse(localStorage.getItem(A)||"[]");r.push({durationMs:n,startedAt:o}),r.length>50&&r.splice(0,r.length-50),localStorage.setItem(A,JSON.stringify(r))};switch(this.widgetMode){case"chat_only":this.currentView=new se(n=>this.handleChatSend(n));break;case"chat_voice":this.currentView=new ne(n=>this.handleChatSend(n),()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"avatar_only":this.currentView=new oe(()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"chat_avatar":this.currentView=new re(n=>this.handleChatSend(n),()=>this.create_call(),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break;case"voice_only":default:this.currentView=new ie(n=>this.create_call(n),()=>this.end_call(),this.primaryColor,this.secondaryColor,e);break}if(this.currentView&&this.panel){this.panel.setContent(this.currentView.getElement());const n=(s=(i=this.currentView).getChatWindow)==null?void 0:s.call(i);n&&n.setResolveCallback(()=>this.resolveActiveConversation())}}async handleChatSend(e){var s,n,o,d,A;if(!e)return;this.sessionActive||((s=this.sessionManager)==null||s.forceClaimSession(),this.sessionActive=!0,this.widgetMode.includes("chat")&&await this.initializeChatSession(!1));const i=(o=(n=this.currentView)==null?void 0:n.getChatWindow)==null?void 0:o.call(n);if(i){this.chatId&&!this.eventSource&&(this.eventSource=B.ChatService.listenForAdminReplies(this.chatId,this.prospectId,r=>{var h,l,c;(l=(h=this.currentView)==null?void 0:h.getChatWindow)==null||l.call(h).addMessage("assistant",r),(c=this.sessionManager)==null||c.pushMessage("assistant",r),this.playMessageSound("receive")})),i.addMessage("user",e),(d=this.sessionManager)==null||d.pushMessage("user",e),i.setTyping(!0),(A=this.sessionManager)==null||A.pushMessage("assistant","");try{let r=!1;await this.chatAdapter.sendMessage(e,this.agentId,this.prospectId,this.chatId,h=>{var l;r||(this.playMessageSound("receive"),r=!0),i.setTyping(!1),(h==null?void 0:h.type)==="button_list"&&((l=h.data)!=null&&l.buttons)&&(i.addButtons(h.data.buttons),this.welcomeChipsData=h.data.buttons,this.updateWelcomeChipsVisibility())},h=>{var l;r||(this.playMessageSound("receive"),r=!0),i.setTyping(!1),i.updateLastAssistantMessage(h),(l=this.sessionManager)==null||l.updateLastAssistantMessage(h)},(h,l)=>{var c;h&&(this.chatId=h),l&&(this.conversationId=l),(h||l)&&((c=this.sessionManager)==null||c.saveIds(this.prospectId,this.chatId,this.conversationId))},this.widgetId||void 0,this.pkKey||void 0)}catch(r){i.setTyping(!1),console.error("[VaniraAI] Send message failed",r),i.addMessage("assistant","Error sending message.")}}}togglePanel(){this.isPanelOpen?this.closePanel():this.openPanel()}openPanel(){var s,n,o,d;this.isPanelOpen=!0,this.updateWelcomeChipsVisibility();const e=(s=this.floatingButton)==null?void 0:s.getElement().getBoundingClientRect();if(e&&e.width>0){const A=e.top>window.innerHeight/2;(n=this.panel)==null||n.open({left:`${Math.max(20,Math.min(e.left-170,window.innerWidth-420))}px`,bottom:A?`${window.innerHeight-e.top+20}px`:void 0,top:A?void 0:`${e.top+80}px`})}else(o=this.panel)==null||o.open({bottom:"90px",right:"20px",left:"auto",top:"auto"});(d=this.root)!=null&&d.host&&this.root.host.classList.add("vanira-panel-open")}closePanel(){var e,i;this.isPanelOpen=!1,this.updateWelcomeChipsVisibility(),(e=this.panel)==null||e.close(),(i=this.root)!=null&&i.host&&this.root.host.classList.remove("vanira-panel-open")}updateWelcomeChipsVisibility(){if(!this.floatingWelcomeChips)return;const e=!this.isPanelOpen&&this.welcomeChipsData.length>0;console.log("[VaniraAI] updateWelcomeChipsVisibility:",{visible:e,isPanelOpen:this.isPanelOpen,chipsCount:this.welcomeChipsData.length}),e?(this.floatingWelcomeChips.setChips(this.welcomeChipsData),this.floatingWelcomeChips.getElement().style.display="flex"):this.floatingWelcomeChips.getElement().style.display="none"}handleFloatingChipClick(e){this.openPanel(),this.handleChatSend(e)}async resolveActiveConversation(){var i,s,n;if(this.eventSource&&(this.eventSource.close(),this.eventSource=null),this.conversationId)try{await B.ChatService.resolveConversation(this.conversationId)}catch(o){console.error("[VaniraAI] Failed to resolve conversation on backend:",o)}else console.warn("[VaniraAI] Cannot resolve — conversation_id not yet received from /widget/chat");(i=this.sessionManager)==null||i.clearChatKeepProspect(),this.conversationId=null,this.chatId=null;const e=(n=(s=this.currentView)==null?void 0:s.getChatWindow)==null?void 0:n.call(s);e&&e.clearMessages(),this.chatInitialized=!1,await this.initializeChatSession(!0)}};a(D,"audioContext",null);let z=D;class de{static getProvider(t){return new z(t)}}class ce extends HTMLElement{constructor(){super();a(this,"shadow");a(this,"provider",null);a(this,"widgetId","");a(this,"agentId","");a(this,"pkKey","");a(this,"serverUrl","https://inboxapi.travelr.club");a(this,"position","bottom-right");a(this,"primaryColor","#000000");a(this,"secondaryColor","#000000");a(this,"gradient",null);a(this,"positionType","fixed");this.shadow=this.attachShadow({mode:"open"})}static get observedAttributes(){return["widget-id","agent-id","position","primary-color","secondary-color","server-url","gradient","position-type","pk-key"]}connectedCallback(){console.log("[VaniraAI Widget] Initializing..."),this.readAttributes();const e={widgetId:this.widgetId,agentId:this.agentId,pkKey:this.pkKey,serverUrl:this.serverUrl,position:this.position,primaryColor:this.primaryColor,secondaryColor:this.secondaryColor,gradient:this.gradient,positionType:this.positionType};this.provider=de.getProvider(e),this.provider&&this.provider.ui_renderer(this.shadow),this.widgetId&&!this.agentId&&this.initializeExpandedConfig()}readAttributes(){this.widgetId=this.getAttribute("widget-id")||"",this.agentId=this.getAttribute("agent-id")||"",this.pkKey=this.getAttribute("pk-key")||"",this.serverUrl=this.getAttribute("server-url")||"https://inboxapi.travelr.club",this.position=this.getAttribute("position")||"bottom-right",this.primaryColor=this.getAttribute("primary-color")||"#000000",this.secondaryColor=this.getAttribute("secondary-color")||this.primaryColor,this.gradient=this.getAttribute("gradient"),this.positionType=this.getAttribute("position-type")||"fixed"}async initializeExpandedConfig(){try{const e=await B.ConfigService.fetchWidgetConfig(this.widgetId,this.pkKey||void 0);this.provider&&await this.provider.initialize(e)}catch(e){console.error("[VaniraAI Widget] Config failed:",e)}}}const Ae=({client:g,toolCall:t,onCustomTool:e})=>{const i=T.useRef(null);return T.useEffect(()=>(i.current=new X(null),()=>{var s;(s=i.current)==null||s.dismiss()}),[]),T.useEffect(()=>{if(!t||!i.current)return;const s=t.data||t;let n={};const o=s.arguments||s.args;if(typeof o=="string")try{n=JSON.parse(o)}catch{n={}}else o&&typeof o=="object"&&(n=o);const d=s.client_fields||{},A=(d==null?void 0:d.preset_id)||(n==null?void 0:n.preset_id),r=s.tool_call_id||s.call_id||"";A&&["vanira_form","vanira_calendar","vanira_navigate","vanira_upload","vanira_camera","vanira_highlight_element","vanira_type_text"].includes(A)?(!(A==="vanira_highlight_element"||A==="vanira_type_text")&&g&&g.sendContextUpdate&&r&&(g.sendToolResult(r,{status:"popup_shown",message:`The UI preset ${A} is now visible. I am waiting for the user to complete it. STAY SILENT.`}),g.sendContextUpdate({ui_state:"waiting_for_preset_data",tool_status:"active_waiting",visible_preset:A})),i.current.handle(t,c=>{if(console.log(`🎯 [PresetRenderer Wrapper] Preset ${A} completed! Result:`,c),g){g.triggerActionInterrupt&&(console.log("⚡ [PresetRenderer Wrapper] Triggering action interrupt to wake AI..."),g.triggerActionInterrupt());const m=typeof c=="string"?{response:c}:c;if(g.sendActionTrigger){const p=d.action_name||(A==="vanira_calendar"?"calendar_slot_selected":`user_submitted_${s.name}`);console.log(`📤 [PresetRenderer Wrapper] Submitting preset data via sendActionTrigger (${p})...`),g.sendActionTrigger(p,m)}else console.log(`📤 [PresetRenderer Wrapper] Submitting tool result for ID: ${r}`),g.sendToolResult(r,m)}},c=>{if(console.log(`❌ [PresetRenderer Wrapper] Preset ${A} cancelled:`,c),g)if(typeof g.sendToolError=="function")g.sendToolError(r,c||"User cancelled the action");else try{g.sendToolResult(r,{status:"cancelled",reason:c||"User dismissed"})}catch{}},g)):e&&e(t)},[t,g,e]),null};exports.VaniraAI=Y.VaniraAI;exports.WebRTCClient=Y.WebRTCClient;exports.BrowserAudioAdapter=B.BrowserAudioAdapter;exports.BrowserDataChannelAdapter=B.BrowserDataChannelAdapter;exports.BrowserMediaAdapter=B.BrowserMediaAdapter;exports.BrowserPeerAdapter=B.BrowserPeerAdapter;exports.ChatService=B.ChatService;exports.ConfigService=B.ConfigService;exports.SessionManager=B.SessionManager;exports.browserCapabilities=B.browserCapabilities;exports.browserRuntime=B.browserRuntime;exports.createBrowserAI=B.createBrowserAI;exports.createBrowserClient=B.createBrowserClient;exports.PresetRenderer=Ae;exports.VaniraWidget=ce;
|
package/package.json
CHANGED