var ServiceAI=function(n){"use strict";var e,t,o,r,i,_,l,a,s,c,u,d,p,f,h={},g=[],m=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function b(n,e){for(var t in e)n[t]=e[t];return n}function y(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function x(n,e,r,i,_){var l={type:n,props:e,key:r,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==_?++o:_,__i:-1,__u:0};return null==_&&null!=t.vnode&&t.vnode(l),l}function w(n){return n.children}function k(n,e){this.props=n,this.context=e}function S(n,e){if(null==e)return n.__?S(n.__,n.__i+1):null;for(var t;ee&&r.sort(l),n=r.shift(),e=r.length,C(n)}finally{r.length=U.__r=0}}function $(n,e,t,o,r,i,_,l,a,s,c){var u,d,p,f,m,b,y,k=o&&o.__k||g,C=e.length;for(a=function(n,e,t,o,r){var i,_,l,a,s,c=t.length,u=c,d=0;for(n.__k=new Array(r),i=0;i0?_=n.__k[i]=x(_.type,_.props,_.key,_.ref?_.ref:null,_.__v):n.__k[i]=_,a=i+d,_.__=n,_.__b=n.__b+1,l=null,-1!=(s=_.__i=H(_,t,a,u))&&(u--,(l=t[s])&&(l.__u|=2)),null==l||null==l.__v?(-1==s&&(r>c?d--:ra?d--:d++,_.__u|=4))):n.__k[i]=null;if(u)for(i=0;i(c?1:0))for(r=t-1,i=t+1;r>=0||i=0?r--:i++])&&!(2&s.__u)&&l==s.key&&a==s.type)return _;return-1}function z(n,e,t){"-"==e[0]?n.setProperty(e,null==t?"":t):n[e]=null==t?"":"number"!=typeof t||m.test(e)?t:t+"px"}function I(n,e,t,o,r){var i,_;n:if("style"==e)if("string"==typeof t)n.style.cssText=t;else{if("string"==typeof o&&(n.style.cssText=o=""),o)for(e in o)t&&e in t||z(n.style,e,"");if(t)for(e in t)o&&t[e]==o[e]||z(n.style,e,t[e])}else if("o"==e[0]&&"n"==e[1])i=e!=(e=e.replace(u,"$1")),_=e.toLowerCase(),e=_ in n||"onFocusOut"==e||"onFocusIn"==e?_.slice(2):e.slice(2),n.l||(n.l={}),n.l[e+i]=t,t?o?t[c]=o[c]:(t[c]=d,n.addEventListener(e,i?f:p,i)):n.removeEventListener(e,i?f:p,i);else{if("http://www.w3.org/2000/svg"==r)e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!=e&&"height"!=e&&"href"!=e&&"list"!=e&&"form"!=e&&"tabIndex"!=e&&"download"!=e&&"rowSpan"!=e&&"colSpan"!=e&&"role"!=e&&"popover"!=e&&e in n)try{n[e]=null==t?"":t;break n}catch(l){}"function"==typeof t||(null==t||!1===t&&"-"!=e[4]?n.removeAttribute(e):n.setAttribute(e,"popover"==e&&1==t?"":t))}}function M(n){return function(e){if(this.l){var o=this.l[e.type+n];if(null==e[s])e[s]=d++;else if(e[s]0?n:v(n)?n.map(E):void 0!==n.constructor?null:b({},n)}function O(n,e,o){try{if("function"==typeof n){var r="function"==typeof n.__u;r&&n.__u(),r&&null==e||(n.__u=n(e))}else n.current=e}catch(i){t.__e(i,o)}}function F(n,e,o){var r,i;if(t.unmount&&t.unmount(n),(r=n.ref)&&(r.current&&r.current!=n.__e||O(r,null,e)),null!=(r=n.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(_){t.__e(_,e)}r.base=r.__P=null}if(r=n.__k)for(i=0;i2&&(l.children=arguments.length>3?e.call(arguments,2):o),"function"==typeof n&&null!=n.defaultProps)for(_ in n.defaultProps)void 0===l[_]&&(l[_]=n.defaultProps[_]);return x(n,l,r,i,null)}(w,null,[n]),i||h,h,o.namespaceURI,i?null:o.firstChild?e.call(o.childNodes):null,_,i?i.__e:o.firstChild,false,l),j(_,n,l)}e=g.slice,t={__e:function(n,e,t,o){for(var r,i,_;e=e.__;)if((r=e.__c)&&!r.__)try{if((i=r.constructor)&&null!=i.getDerivedStateFromError&&(r.setState(i.getDerivedStateFromError(n)),_=r.__d),null!=r.componentDidCatch&&(r.componentDidCatch(n,o||{}),_=r.__d),_)return r.__E=r}catch(l){n=l}throw n}},o=0,k.prototype.setState=function(n,e){var t;t=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=b({},this.state),"function"==typeof n&&(n=n(b({},t),this.props)),n&&b(t,n),null!=n&&this.__v&&(e&&this._sb.push(e),P(this))},k.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),P(this))},k.prototype.render=w,r=[],_="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,l=function(n,e){return n.__v.__b-e.__v.__b},U.__r=0,a=Math.random().toString(8),s="__d"+a,c="__a"+a,u=/(PointerCapture)$|Capture$/i,d=0,p=M(!1),f=M(!0);var W=0;function R(n,e,o,r,i,_){e||(e={});var l,a,s=e;if("ref"in s)for(a in s={},e)"ref"==a?l=e[a]:s[a]=e[a];var c={type:n,props:s,key:o,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--W,__i:-1,__u:0,__source:i,__self:_};if("function"==typeof n&&(l=n.defaultProps))for(a in l)void 0===s[a]&&(s[a]=l[a]);return t.vnode&&t.vnode(c),c}var J,q,K,V,Y=0,G=[],Q=t,X=Q.__b,Z=Q.__r,nn=Q.diffed,en=Q.__c,tn=Q.unmount,on=Q.__;function rn(n,e){Q.__h&&Q.__h(q,n,Y||e),Y=0;var t=q.__H||(q.__H={__:[],__h:[]});return n>=t.__.length&&t.__.push({}),t.__[n]}function _n(n){return Y=1,function(n,e){var t=rn(J++,2);if(t.t=n,!t.__c&&(t.__=[gn(void 0,e),function(n){var e=t.__N?t.__N[0]:t.__[0],o=t.t(e,n);e!==o&&(t.__N=[o,t.__[1]],t.__c.setState({}))}],t.__c=q,!q.__f)){var o=function(n,e,o){if(!t.__c.__H)return!0;var i=t.__c.__H.__.filter(function(n){return n.__c});if(i.every(function(n){return!n.__N}))return!r||r.call(this,n,e,o);var _=t.__c.props!==n;return i.some(function(n){if(n.__N){var e=n.__[0];n.__=n.__N,n.__N=void 0,e!==n.__[0]&&(_=!0)}}),r&&r.call(this,n,e,o)||_};q.__f=!0;var r=q.shouldComponentUpdate,i=q.componentWillUpdate;q.componentWillUpdate=function(n,e,t){if(this.__e){var _=r;r=void 0,o(n,e,t),r=_}i&&i.call(this,n,e,t)},q.shouldComponentUpdate=o}return t.__N||t.__}(gn,n)}function ln(n,e){var t=rn(J++,3);!Q.__s&&hn(t.__H,e)&&(t.__=n,t.u=e,q.__H.__h.push(t))}function an(n){return Y=5,sn(function(){return{current:n}},[])}function sn(n,e){var t=rn(J++,7);return hn(t.__H,e)&&(t.__=n(),t.__H=e,t.__h=n),t.__}function cn(){for(var n;n=G.shift();){var e=n.__H;if(n.__P&&e)try{e.__h.some(pn),e.__h.some(fn),e.__h=[]}catch(t){e.__h=[],Q.__e(t,n.__v)}}}Q.__b=function(n){q=null,X&&X(n)},Q.__=function(n,e){n&&e.__k&&e.__k.__m&&(n.__m=e.__k.__m),on&&on(n,e)},Q.__r=function(n){Z&&Z(n),J=0;var e=(q=n.__c).__H;e&&(K===q?(e.__h=[],q.__h=[],e.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.some(pn),e.__h.some(fn),e.__h=[],J=0)),K=q},Q.diffed=function(n){nn&&nn(n);var e=n.__c;e&&e.__H&&(e.__H.__h.length&&(1!==G.push(e)&&V===Q.requestAnimationFrame||((V=Q.requestAnimationFrame)||dn)(cn)),e.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),K=q=null},Q.__c=function(n,e){e.some(function(n){try{n.__h.some(pn),n.__h=n.__h.filter(function(n){return!n.__||fn(n)})}catch(t){e.some(function(n){n.__h&&(n.__h=[])}),e=[],Q.__e(t,n.__v)}}),en&&en(n,e)},Q.unmount=function(n){tn&&tn(n);var e,t=n.__c;t&&t.__H&&(t.__H.__.some(function(n){try{pn(n)}catch(t){e=t}}),t.__H=void 0,e&&Q.__e(e,t.__v))};var un="function"==typeof requestAnimationFrame;function dn(n){var e,t=function(){clearTimeout(o),un&&cancelAnimationFrame(e),setTimeout(n)},o=setTimeout(t,35);un&&(e=requestAnimationFrame(t))}function pn(n){var e=q,t=n.__c;"function"==typeof t&&(n.__c=void 0,t()),q=e}function fn(n){var e=q;n.__c=n.__(),q=e}function hn(n,e){return!n||n.length!==e.length||e.some(function(e,t){return e!==n[t]})}function gn(n,e){return"function"==typeof e?e(n):e}function mn({config:n,token:e,apiUrl:t}){var o;const[r,i]=_n(!1),[_,l]=_n([{id:"0",role:"assistant",content:n.greeting}]),[a,s]=_n(""),[c,u]=_n(!1),[d,p]=_n(null),[f,h]=_n(1),[g,m]=_n(!1),[v,b]=_n(0),[y,x]=_n(!1),k=an(null),S=an(null),C=n.primaryColor||"#2563eb";ln(()=>{var n;null==(n=k.current)||n.scrollIntoView({behavior:"smooth"})},[_]),ln(()=>{r&&(h(0),setTimeout(()=>{var n;return null==(n=S.current)?void 0:n.focus()},100))},[r]),ln(()=>{const n=()=>{d&&navigator.sendBeacon(`${t}/api/v1/chat/sessions/${d}/end`,JSON.stringify({}))};return window.addEventListener("beforeunload",n),()=>window.removeEventListener("beforeunload",n)},[d,t]);const T=(P=async()=>{if(d)return d;const n=await fetch(`${t}/api/v1/chat/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({visitorId:"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})})}),o=await n.json();return p(o.sessionId),o.sessionId},Y=8,sn(function(){return P},[d,t,e]));var P;async function U(){var n,o;const i=a.trim();if(!i||c)return;const _={id:Date.now().toString(),role:"user",content:i};l(n=>[...n,_]),s(""),u(!0);try{const _=await T(),a=`a-${Date.now()}`;l(n=>[...n,{id:a,role:"assistant",content:""}]);const s=null==(n=(await fetch(`${t}/api/v1/chat/sessions/${_}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({content:i})})).body)?void 0:n.getReader();if(!s)return;const c=new TextDecoder;let u="",p=!1;for(;;){const{done:n,value:e}=await s.read();if(n)break;u+=c.decode(e,{stream:!0});const t=u.split("\n");u=null!=(o=t.pop())?o:"";for(const o of t)if(o.startsWith("data: "))try{const n=JSON.parse(o.slice(6));"token"===n.type&&(p=!0,l(e=>e.map(e=>e.id===a?{...e,content:e.content+n.content}:e)))}catch(d){}}r||h(n=>n+1)}catch(p){console.error("[ServiceAI]",p),l(n=>n.map(n=>n.id==="a-"+(Date.now()-1)?{...n,content:"⚠️ Something went wrong. Please try again."}:n))}finally{u(!1)}}async function $(n){if(d)try{await fetch(`${t}/api/v1/chat/sessions/${d}/end`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n?{rating:n}:{})})}catch(o){}x(!0),setTimeout(()=>i(!1),800)}return R(w,{children:[R("style",{children:"\n * { box-sizing: border-box; margin: 0; padding: 0; }\n \n .widget-root {\n position: fixed;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .widget-root.bottom-right { bottom: 20px; right: 20px; }\n .widget-root.bottom-left { bottom: 20px; left: 20px; }\n\n /* Launcher button */\n .launcher {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n box-shadow: 0 4px 16px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform .15s, box-shadow .15s;\n position: relative;\n color: #fff;\n }\n .launcher:hover { transform: scale(1.08); box-shadow: 0 6px 20px rgba(0,0,0,0.25); }\n .launcher svg { width: 24px; height: 24px; fill: currentColor; }\n\n /* Unread badge */\n .unread-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n background: #ef4444;\n color: #fff;\n border-radius: 50%;\n width: 18px;\n height: 18px;\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid #fff;\n }\n\n /* Chat window */\n .chat-window {\n width: 360px;\n max-width: calc(100vw - 32px);\n height: 520px;\n max-height: calc(100vh - 100px);\n background: #ffffff;\n border-radius: 16px;\n box-shadow: 0 8px 40px rgba(0,0,0,0.18);\n display: flex;\n flex-direction: column;\n margin-bottom: 12px;\n overflow: hidden;\n animation: slideUp .2s ease-out;\n }\n\n @keyframes slideUp {\n from { opacity: 0; transform: translateY(12px) scale(.97); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n\n /* Header */\n .chat-header {\n padding: 14px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #fff;\n flex-shrink: 0;\n }\n .chat-header-left { display: flex; align-items: center; gap: 10px; }\n .avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: rgba(255,255,255,0.25);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n }\n .company-name { font-weight: 600; font-size: 15px; }\n .status-line { font-size: 11px; opacity: .85; margin-top: 1px; }\n .close-btn {\n background: rgba(255,255,255,0.2);\n border: none;\n color: #fff;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: background .15s;\n }\n .close-btn:hover { background: rgba(255,255,255,0.35); }\n\n /* Messages */\n .messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n scroll-behavior: smooth;\n }\n .messages::-webkit-scrollbar { width: 4px; }\n .messages::-webkit-scrollbar-track { background: transparent; }\n .messages::-webkit-scrollbar-thumb { background: #e2e8f0; border-radius: 4px; }\n\n .msg-group { display: flex; flex-direction: column; gap: 4px; }\n .msg-group.user { align-items: flex-end; }\n .msg-group.assistant { align-items: flex-start; }\n\n .bubble {\n max-width: 78%;\n padding: 9px 13px;\n border-radius: 14px;\n font-size: 14px;\n line-height: 1.5;\n word-break: break-word;\n white-space: pre-wrap;\n }\n .bubble.user { color: #fff; border-bottom-right-radius: 4px; }\n .bubble.assistant {\n background: #f1f5f9;\n color: #1e293b;\n border-bottom-left-radius: 4px;\n }\n .bubble.empty { min-width: 48px; min-height: 36px; }\n\n /* Typing indicator */\n .typing-dots {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 12px 14px;\n }\n .typing-dots span {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #94a3b8;\n animation: bounce 1.2s infinite;\n }\n .typing-dots span:nth-child(2) { animation-delay: .2s; }\n .typing-dots span:nth-child(3) { animation-delay: .4s; }\n @keyframes bounce {\n 0%, 60%, 100% { transform: translateY(0); }\n 30% { transform: translateY(-6px); }\n }\n\n /* Input area */\n .input-area {\n padding: 10px 12px;\n border-top: 1px solid #e2e8f0;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n background: #fff;\n }\n .msg-input {\n flex: 1;\n padding: 8px 12px;\n border: 1.5px solid #e2e8f0;\n border-radius: 20px;\n font-size: 14px;\n font-family: inherit;\n outline: none;\n resize: none;\n max-height: 80px;\n overflow-y: auto;\n line-height: 1.4;\n transition: border-color .15s;\n background: #f8fafc;\n color: #1e293b;\n }\n .msg-input:focus { border-color: var(--primary); background: #fff; }\n .msg-input::placeholder { color: #94a3b8; }\n\n .send-btn {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: #fff;\n transition: opacity .15s, transform .1s;\n }\n .send-btn:disabled { opacity: .45; cursor: not-allowed; }\n .send-btn:not(:disabled):hover { transform: scale(1.08); }\n .send-btn svg { width: 18px; height: 18px; fill: currentColor; }\n\n /* Branding */\n .branding {\n text-align: center;\n padding: 6px;\n font-size: 11px;\n color: #94a3b8;\n flex-shrink: 0;\n }\n .branding a { color: inherit; text-decoration: none; }\n .branding a:hover { text-decoration: underline; }\n"}),R("div",{class:`widget-root ${null!=(o=n.position)?o:"bottom-right"}`,style:`--primary:${C};`,children:[r&&R("div",{class:"chat-window",children:[R("div",{class:"chat-header",style:`background:${C};`,children:[R("div",{class:"chat-header-left",children:[R("div",{class:"avatar",children:"🤖"}),R("div",{children:[R("div",{class:"company-name",children:n.companyName}),R("div",{class:"status-line",children:c?"Typing…":"● Online"})]})]}),R("button",{class:"close-btn",onClick:async function(){g||!d?i(!1):m(!0)},"aria-label":"Close",children:"✕"})]}),R("div",{class:"messages",children:[_.map(n=>R("div",{class:`msg-group ${n.role}`,children:R("div",{class:`bubble ${n.role}${n.content?"":" empty"}`,style:"user"===n.role?`background:${C};`:"",children:n.content||"assistant"!==n.role?n.content:R("div",{class:"typing-dots",children:[R("span",{}),R("span",{}),R("span",{})]})})},n.id)),R("div",{ref:k})]}),g&&!y&&R("div",{style:"padding:16px;border-top:1px solid #e2e8f0;background:#f8fafc;text-align:center;",children:[R("p",{style:"font-size:13px;color:#475569;margin-bottom:10px;font-weight:500;",children:"How was your experience?"}),R("div",{style:"display:flex;justify-content:center;gap:6px;margin-bottom:10px;",children:[1,2,3,4,5].map(n=>R("button",{onClick:()=>$(n),onMouseEnter:()=>b(n),onMouseLeave:()=>b(0),style:`background:none;border:none;cursor:pointer;font-size:28px;padding:0;line-height:1;opacity:${n<=v?1:.25};transition:opacity .1s,transform .1s;transform:${n<=v?"scale(1.2)":"scale(1)"};`,children:"★"},n))}),R("button",{onClick:()=>$(),style:"font-size:11px;color:#94a3b8;background:none;border:none;cursor:pointer;text-decoration:underline;",children:"Skip"})]}),y&&R("div",{style:"padding:14px 16px;border-top:1px solid #e2e8f0;background:#f0fdf4;text-align:center;",children:R("p",{style:"font-size:13px;color:#15803d;font-weight:500;",children:"Thanks for your feedback! 👋"})}),!g&&R("div",{class:"input-area",children:[R("textarea",{ref:S,class:"msg-input",placeholder:"Type a message…",value:a,onInput:n=>s(n.target.value),onKeyDown:function(n){"Enter"!==n.key||n.shiftKey||(n.preventDefault(),U())},disabled:c,rows:1}),R("button",{class:"send-btn",style:`background:${C};`,onClick:U,disabled:c||!a.trim(),"aria-label":"Send",children:R("svg",{viewBox:"0 0 24 24",children:R("path",{d:"M2 21l21-9L2 3v7l15 2-15 2v7z"})})}),_.length>1&&R("button",{onClick:()=>m(!0),title:"End conversation",style:"background:none;border:1.5px solid #e2e8f0;border-radius:50%;width:36px;height:36px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#94a3b8;font-size:13px;transition:all .15s;","aria-label":"End conversation",children:"✕"})]}),!1!==n.showBranding&&R("div",{class:"branding",children:["Powered by ",R("a",{href:"https://serviceai.app",target:"_blank",rel:"noopener",children:"ServiceAI"})]})]}),!r&&R("button",{class:"launcher",style:`background:${C};`,onClick:()=>i(!0),"aria-label":"Open chat",children:[R("svg",{viewBox:"0 0 24 24",children:R("path",{d:"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"})}),f>0&&R("span",{class:"unread-badge",children:f})]})]})]})}let vn=!1;async function bn(n){var e;if(vn)return;vn=!0;const t=null!=(e=n.apiUrl)?e:"http://localhost:3001",o=await fetch(`${t}/api/v1/widget/init`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tenantId:n.tenantId,apiKey:n.apiKey,origin:window.location.origin})});if(!o.ok)return void console.error("[ServiceAI] Failed to initialize widget");const{token:r,config:i}=await o.json(),_=document.createElement("div");_.id="serviceai-widget-root",document.body.appendChild(_);const l=_.attachShadow({mode:"open"}),a=document.createElement("div");l.appendChild(a),B(R(mn,{config:i,token:r,apiUrl:t,tenantId:n.tenantId}),a)}return window.ServiceAI={init:bn},n.init=bn,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),n}({});