@makemore/agent-frontend 2.2.0 → 2.4.0

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,10 +1,10 @@
1
- var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Tt=Object.prototype.hasOwnProperty;var xt=(e,t)=>{for(var n in t)ye(e,n,{get:t[n],enumerable:!0})},It=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Mt(t))!Tt.call(e,r)&&r!==n&&ye(e,r,{get:()=>t[r],enumerable:!(o=St(t,r))||o.enumerable});return e};var Et=e=>It(ye({},"__esModule",{value:!0}),e);var tn={};xt(tn,{ChatWidget:()=>ge,default:()=>en});var ie,P,Ne,Pt,Q,De,Fe,Oe,Ue,be,ve,we,Dt,ee={},We=[],At=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,le=Array.isArray;function X(e,t){for(var n in t)e[n]=t[n];return e}function ke(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function ce(e,t,n){var o,r,s,i={};for(s in t)s=="key"?o=t[s]:s=="ref"?r=t[s]:i[s]=t[s];if(arguments.length>2&&(i.children=arguments.length>3?ie.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(s in e.defaultProps)i[s]===void 0&&(i[s]=e.defaultProps[s]);return re(e,i,o,r,null)}function re(e,t,n,o,r){var s={type:e,props:t,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:r??++Ne,__i:-1,__u:0};return r==null&&P.vnode!=null&&P.vnode(s),s}function ue(e){return e.children}function Z(e,t){this.props=e,this.context=t}function Y(e,t){if(t==null)return e.__?Y(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?Y(e):null}function Ke(e){var t,n;if((e=e.__)!=null&&e.__c!=null){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null){e.__e=e.__c.base=n.__e;break}return Ke(e)}}function Ae(e){(!e.__d&&(e.__d=!0)&&Q.push(e)&&!ae.__r++||De!=P.debounceRendering)&&((De=P.debounceRendering)||Fe)(ae)}function ae(){for(var e,t,n,o,r,s,i,c=1;Q.length;)Q.length>c&&Q.sort(Oe),e=Q.shift(),c=Q.length,e.__d&&(n=void 0,o=void 0,r=(o=(t=e).__v).__e,s=[],i=[],t.__P&&((n=X({},o)).__v=o.__v+1,P.vnode&&P.vnode(n),Ce(t.__P,n,o,t.__n,t.__P.namespaceURI,32&o.__u?[r]:null,s,r??Y(o),!!(32&o.__u),i),n.__v=o.__v,n.__.__k[n.__i]=n,je(s,n,i),o.__e=o.__=null,n.__e!=r&&Ke(n)));ae.__r=0}function Le(e,t,n,o,r,s,i,c,d,l,u){var a,h,p,v,T,$,y,w=o&&o.__k||We,H=t.length;for(d=Ht(n,t,w,d,H),a=0;a<H;a++)(p=n.__k[a])!=null&&(h=p.__i==-1?ee:w[p.__i]||ee,p.__i=a,$=Ce(e,p,h,r,s,i,c,d,l,u),v=p.__e,p.ref&&h.ref!=p.ref&&(h.ref&&Se(h.ref,null,p),u.push(p.ref,p.__c||v,p)),T==null&&v!=null&&(T=v),(y=!!(4&p.__u))||h.__k===p.__k?d=Be(p,d,e,y):typeof p.type=="function"&&$!==void 0?d=$:v&&(d=v.nextSibling),p.__u&=-7);return n.__e=T,d}function Ht(e,t,n,o,r){var s,i,c,d,l,u=n.length,a=u,h=0;for(e.__k=new Array(r),s=0;s<r;s++)(i=t[s])!=null&&typeof i!="boolean"&&typeof i!="function"?(typeof i=="string"||typeof i=="number"||typeof i=="bigint"||i.constructor==String?i=e.__k[s]=re(null,i,null,null,null):le(i)?i=e.__k[s]=re(ue,{children:i},null,null,null):i.constructor===void 0&&i.__b>0?i=e.__k[s]=re(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):e.__k[s]=i,d=s+h,i.__=e,i.__b=e.__b+1,c=null,(l=i.__i=Rt(i,n,d,a))!=-1&&(a--,(c=n[l])&&(c.__u|=2)),c==null||c.__v==null?(l==-1&&(r>u?h--:r<u&&h++),typeof i.type!="function"&&(i.__u|=4)):l!=d&&(l==d-1?h--:l==d+1?h++:(l>d?h--:h++,i.__u|=4))):e.__k[s]=null;if(a)for(s=0;s<u;s++)(c=n[s])!=null&&!(2&c.__u)&&(c.__e==o&&(o=Y(c)),Je(c,c));return o}function Be(e,t,n,o){var r,s;if(typeof e.type=="function"){for(r=e.__k,s=0;r&&s<r.length;s++)r[s]&&(r[s].__=e,t=Be(r[s],t,n,o));return t}e.__e!=t&&(o&&(t&&e.type&&!t.parentNode&&(t=Y(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function Rt(e,t,n,o){var r,s,i,c=e.key,d=e.type,l=t[n],u=l!=null&&(2&l.__u)==0;if(l===null&&c==null||u&&c==l.key&&d==l.type)return n;if(o>(u?1:0)){for(r=n-1,s=n+1;r>=0||s<t.length;)if((l=t[i=r>=0?r--:s++])!=null&&!(2&l.__u)&&c==l.key&&d==l.type)return i}return-1}function He(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||At.test(t)?n:n+"px"}function se(e,t,n,o,r){var s,i;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof o=="string"&&(e.style.cssText=o=""),o)for(t in o)n&&t in n||He(e.style,t,"");if(n)for(t in n)o&&n[t]==o[t]||He(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")s=t!=(t=t.replace(Ue,"$1")),i=t.toLowerCase(),t=i in e||t=="onFocusOut"||t=="onFocusIn"?i.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=n,n?o?n.u=o.u:(n.u=be,e.addEventListener(t,s?we:ve,s)):e.removeEventListener(t,s?we:ve,s);else{if(r=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Re(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t.t==null)t.t=be++;else if(t.t<n.u)return;return n(P.event?P.event(t):t)}}}function Ce(e,t,n,o,r,s,i,c,d,l){var u,a,h,p,v,T,$,y,w,H,S,K,D,z,J,L,m,b=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(d=!!(32&n.__u),s=[c=t.__e=n.__e]),(u=P.__b)&&u(t);e:if(typeof b=="function")try{if(y=t.props,w="prototype"in b&&b.prototype.render,H=(u=b.contextType)&&o[u.__c],S=u?H?H.props.value:u.__:o,n.__c?$=(a=t.__c=n.__c).__=a.__E:(w?t.__c=a=new b(y,S):(t.__c=a=new Z(y,S),a.constructor=b,a.render=Ft),H&&H.sub(a),a.state||(a.state={}),a.__n=o,h=a.__d=!0,a.__h=[],a._sb=[]),w&&a.__s==null&&(a.__s=a.state),w&&b.getDerivedStateFromProps!=null&&(a.__s==a.state&&(a.__s=X({},a.__s)),X(a.__s,b.getDerivedStateFromProps(y,a.__s))),p=a.props,v=a.state,a.__v=t,h)w&&b.getDerivedStateFromProps==null&&a.componentWillMount!=null&&a.componentWillMount(),w&&a.componentDidMount!=null&&a.__h.push(a.componentDidMount);else{if(w&&b.getDerivedStateFromProps==null&&y!==p&&a.componentWillReceiveProps!=null&&a.componentWillReceiveProps(y,S),t.__v==n.__v||!a.__e&&a.shouldComponentUpdate!=null&&a.shouldComponentUpdate(y,a.__s,S)===!1){for(t.__v!=n.__v&&(a.props=y,a.state=a.__s,a.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(A){A&&(A.__=t)}),K=0;K<a._sb.length;K++)a.__h.push(a._sb[K]);a._sb=[],a.__h.length&&i.push(a);break e}a.componentWillUpdate!=null&&a.componentWillUpdate(y,a.__s,S),w&&a.componentDidUpdate!=null&&a.__h.push(function(){a.componentDidUpdate(p,v,T)})}if(a.context=S,a.props=y,a.__P=e,a.__e=!1,D=P.__r,z=0,w){for(a.state=a.__s,a.__d=!1,D&&D(t),u=a.render(a.props,a.state,a.context),J=0;J<a._sb.length;J++)a.__h.push(a._sb[J]);a._sb=[]}else do a.__d=!1,D&&D(t),u=a.render(a.props,a.state,a.context),a.state=a.__s;while(a.__d&&++z<25);a.state=a.__s,a.getChildContext!=null&&(o=X(X({},o),a.getChildContext())),w&&!h&&a.getSnapshotBeforeUpdate!=null&&(T=a.getSnapshotBeforeUpdate(p,v)),L=u,u!=null&&u.type===ue&&u.key==null&&(L=ze(u.props.children)),c=Le(e,le(L)?L:[L],t,n,o,r,s,i,c,d,l),a.base=t.__e,t.__u&=-161,a.__h.length&&i.push(a),$&&(a.__E=a.__=null)}catch(A){if(t.__v=null,d||s!=null)if(A.then){for(t.__u|=d?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;s[s.indexOf(c)]=null,t.__e=c}else{for(m=s.length;m--;)ke(s[m]);$e(t)}else t.__e=n.__e,t.__k=n.__k,A.then||$e(t);P.__e(A,t,n)}else s==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):c=t.__e=Nt(n.__e,t,n,o,r,s,i,d,l);return(u=P.diffed)&&u(t),128&t.__u?void 0:c}function $e(e){e&&e.__c&&(e.__c.__e=!0),e&&e.__k&&e.__k.forEach($e)}function je(e,t,n){for(var o=0;o<n.length;o++)Se(n[o],n[++o],n[++o]);P.__c&&P.__c(t,e),e.some(function(r){try{e=r.__h,r.__h=[],e.some(function(s){s.call(r)})}catch(s){P.__e(s,r.__v)}})}function ze(e){return typeof e!="object"||e==null||e.__b&&e.__b>0?e:le(e)?e.map(ze):X({},e)}function Nt(e,t,n,o,r,s,i,c,d){var l,u,a,h,p,v,T,$=n.props||ee,y=t.props,w=t.type;if(w=="svg"?r="http://www.w3.org/2000/svg":w=="math"?r="http://www.w3.org/1998/Math/MathML":r||(r="http://www.w3.org/1999/xhtml"),s!=null){for(l=0;l<s.length;l++)if((p=s[l])&&"setAttribute"in p==!!w&&(w?p.localName==w:p.nodeType==3)){e=p,s[l]=null;break}}if(e==null){if(w==null)return document.createTextNode(y);e=document.createElementNS(r,w,y.is&&y),c&&(P.__m&&P.__m(t,s),c=!1),s=null}if(w==null)$===y||c&&e.data==y||(e.data=y);else{if(s=s&&ie.call(e.childNodes),!c&&s!=null)for($={},l=0;l<e.attributes.length;l++)$[(p=e.attributes[l]).name]=p.value;for(l in $)if(p=$[l],l!="children"){if(l=="dangerouslySetInnerHTML")a=p;else if(!(l in y)){if(l=="value"&&"defaultValue"in y||l=="checked"&&"defaultChecked"in y)continue;se(e,l,null,p,r)}}for(l in y)p=y[l],l=="children"?h=p:l=="dangerouslySetInnerHTML"?u=p:l=="value"?v=p:l=="checked"?T=p:c&&typeof p!="function"||$[l]===p||se(e,l,p,$[l],r);if(u)c||a&&(u.__html==a.__html||u.__html==e.innerHTML)||(e.innerHTML=u.__html),t.__k=[];else if(a&&(e.innerHTML=""),Le(t.type=="template"?e.content:e,le(h)?h:[h],t,n,o,w=="foreignObject"?"http://www.w3.org/1999/xhtml":r,s,i,s?s[0]:n.__k&&Y(n,0),c,d),s!=null)for(l=s.length;l--;)ke(s[l]);c||(l="value",w=="progress"&&v==null?e.removeAttribute("value"):v!=null&&(v!==e[l]||w=="progress"&&!v||w=="option"&&v!=$[l])&&se(e,l,v,$[l],r),l="checked",T!=null&&T!=e[l]&&se(e,l,T,$[l],r))}return e}function Se(e,t,n){try{if(typeof e=="function"){var o=typeof e.__u=="function";o&&e.__u(),o&&t==null||(e.__u=e(t))}else e.current=t}catch(r){P.__e(r,n)}}function Je(e,t,n){var o,r;if(P.unmount&&P.unmount(e),(o=e.ref)&&(o.current&&o.current!=e.__e||Se(o,null,t)),(o=e.__c)!=null){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(s){P.__e(s,t)}o.base=o.__P=null}if(o=e.__k)for(r=0;r<o.length;r++)o[r]&&Je(o[r],t,n||typeof e.type!="function");n||ke(e.__e),e.__c=e.__=e.__e=void 0}function Ft(e,t,n){return this.constructor(e,n)}function de(e,t,n){var o,r,s,i;t==document&&(t=document.documentElement),P.__&&P.__(e,t),r=(o=typeof n=="function")?null:n&&n.__k||t.__k,s=[],i=[],Ce(t,e=(!o&&n||t).__k=ce(ue,null,[e]),r||ee,ee,t.namespaceURI,!o&&n?[n]:r?null:t.firstChild?ie.call(t.childNodes):null,s,!o&&n?n:r?r.__e:t.firstChild,o,i),je(s,e,i)}ie=We.slice,P={__e:function(e,t,n,o){for(var r,s,i;t=t.__;)if((r=t.__c)&&!r.__)try{if((s=r.constructor)&&s.getDerivedStateFromError!=null&&(r.setState(s.getDerivedStateFromError(e)),i=r.__d),r.componentDidCatch!=null&&(r.componentDidCatch(e,o||{}),i=r.__d),i)return r.__E=r}catch(c){e=c}throw e}},Ne=0,Pt=function(e){return e!=null&&e.constructor===void 0},Z.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=X({},this.state),typeof e=="function"&&(e=e(X({},n),this.props)),e&&X(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Ae(this))},Z.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Ae(this))},Z.prototype.render=ue,Q=[],Fe=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Oe=function(e,t){return e.__v.__b-t.__v.__b},ae.__r=0,Ue=/(PointerCapture)$|Capture$/i,be=0,ve=Re(!1),we=Re(!0),Dt=0;var qe=function(e,t,n,o){var r;t[0]=0;for(var s=1;s<t.length;s++){var i=t[s++],c=t[s]?(t[0]|=i?1:2,n[t[s++]]):t[++s];i===3?o[0]=c:i===4?o[1]=Object.assign(o[1]||{},c):i===5?(o[1]=o[1]||{})[t[++s]]=c:i===6?o[1][t[++s]]+=c+"":i?(r=e.apply(c,qe(e,c,n,["",null])),o.push(r),c[0]?t[0]|=2:(t[s-2]=0,t[s]=r)):o.push(c)}return o},Ve=new Map;function Ge(e){var t=Ve.get(this);return t||(t=new Map,Ve.set(this,t)),(t=qe(this,t.get(e)||(t.set(e,t=function(n){for(var o,r,s=1,i="",c="",d=[0],l=function(h){s===1&&(h||(i=i.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?d.push(0,h,i):s===3&&(h||i)?(d.push(3,h,i),s=2):s===2&&i==="..."&&h?d.push(4,h,0):s===2&&i&&!h?d.push(5,0,!0,i):s>=5&&((i||!h&&s===5)&&(d.push(s,0,i,r),s=6),h&&(d.push(s,h,0,r),s=6)),i=""},u=0;u<n.length;u++){u&&(s===1&&l(),l(u));for(var a=0;a<n[u].length;a++)o=n[u][a],s===1?o==="<"?(l(),d=[d],s=3):i+=o:s===4?i==="--"&&o===">"?(s=1,i=""):i=o+i[0]:c?o===c?c="":i+=o:o==='"'||o==="'"?c=o:o===">"?(l(),s=1):s&&(o==="="?(s=5,r=i,i=""):o==="/"&&(s<5||n[u][a+1]===">")?(l(),s===3&&(d=d[0]),s=d,(d=d[0]).push(2,0,s),s=0):o===" "||o===" "||o===`
2
- `||o==="\r"?(l(),s=2):i+=o),s===3&&i==="!--"&&(s=4,d=d[0])}return l(),d}(e)),t),arguments,[])).length>1?t:t[0]}var g=Ge.bind(ce);var te,N,Me,Xe,ne=0,st=[],F=P,Qe=F.__b,Ye=F.__r,Ze=F.diffed,et=F.__c,tt=F.unmount,nt=F.__;function xe(e,t){F.__h&&F.__h(N,e,ne||t),ne=0;var n=N.__H||(N.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function C(e){return ne=1,Ot(at,e)}function Ot(e,t,n){var o=xe(te++,2);if(o.t=e,!o.__c&&(o.__=[n?n(t):at(void 0,t),function(c){var d=o.__N?o.__N[0]:o.__[0],l=o.t(d,c);d!==l&&(o.__N=[l,o.__[1]],o.__c.setState({}))}],o.__c=N,!N.__f)){var r=function(c,d,l){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(h){return!!h.__c});if(u.every(function(h){return!h.__N}))return!s||s.call(this,c,d,l);var a=o.__c.props!==c;return u.forEach(function(h){if(h.__N){var p=h.__[0];h.__=h.__N,h.__N=void 0,p!==h.__[0]&&(a=!0)}}),s&&s.call(this,c,d,l)||a};N.__f=!0;var s=N.shouldComponentUpdate,i=N.componentWillUpdate;N.componentWillUpdate=function(c,d,l){if(this.__e){var u=s;s=void 0,r(c,d,l),s=u}i&&i.call(this,c,d,l)},N.shouldComponentUpdate=r}return o.__N||o.__}function U(e,t){var n=xe(te++,3);!F.__s&&rt(n.__H,t)&&(n.__=e,n.u=t,N.__H.__h.push(n))}function q(e){return ne=5,oe(function(){return{current:e}},[])}function oe(e,t){var n=xe(te++,7);return rt(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function B(e,t){return ne=8,oe(function(){return e},t)}function Ut(){for(var e;e=st.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(_e),e.__H.__h.forEach(Te),e.__H.__h=[]}catch(t){e.__H.__h=[],F.__e(t,e.__v)}}F.__b=function(e){N=null,Qe&&Qe(e)},F.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),nt&&nt(e,t)},F.__r=function(e){Ye&&Ye(e),te=0;var t=(N=e.__c).__H;t&&(Me===N?(t.__h=[],N.__h=[],t.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.forEach(_e),t.__h.forEach(Te),t.__h=[],te=0)),Me=N},F.diffed=function(e){Ze&&Ze(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(st.push(t)!==1&&Xe===F.requestAnimationFrame||((Xe=F.requestAnimationFrame)||Wt)(Ut)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Me=N=null},F.__c=function(e,t){t.some(function(n){try{n.__h.forEach(_e),n.__h=n.__h.filter(function(o){return!o.__||Te(o)})}catch(o){t.some(function(r){r.__h&&(r.__h=[])}),t=[],F.__e(o,n.__v)}}),et&&et(e,t)},F.unmount=function(e){tt&&tt(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach(function(o){try{_e(o)}catch(r){t=r}}),n.__H=void 0,t&&F.__e(t,n.__v))};var ot=typeof requestAnimationFrame=="function";function Wt(e){var t,n=function(){clearTimeout(o),ot&&cancelAnimationFrame(t),setTimeout(e)},o=setTimeout(n,35);ot&&(t=requestAnimationFrame(n))}function _e(e){var t=N,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),N=t}function Te(e){var t=N;e.__c=e.__(),N=t}function rt(e,t){return!e||e.length!==t.length||t.some(function(n,o){return n!==e[o]})}function at(e,t){return typeof t=="function"?t(e):t}function pe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function O(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function it(e){if(!e)return"";try{let t=new Date(e),o=new Date-t,r=Math.floor(o/6e4),s=Math.floor(o/36e5),i=Math.floor(o/864e5);return r<1?"Just now":r<60?`${r}m ago`:s<24?`${s}h ago`:i<7?`${i}d ago`:t.toLocaleDateString()}catch{return""}}function lt(e,t=null){if(t)return t(e);let n=O(e);return n=n.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),n=n.replace(/__(.+?)__/g,"<strong>$1</strong>"),n=n.replace(/\*(.+?)\*/g,"<em>$1</em>"),n=n.replace(/_(.+?)_/g,"<em>$1</em>"),n=n.replace(/`(.+?)`/g,"<code>$1</code>"),n=n.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),n=n.replace(/\n/g,"<br>"),n}function ct(e=""){let t=n=>e?`${n}_${e}`:n;return{get(n){try{return localStorage.getItem(t(n))}catch{return null}},set(n,o){try{let r=t(n);o===null?localStorage.removeItem(r):localStorage.setItem(r,o)}catch{}}}}function ut(e="csrftoken"){let t=document.cookie.split(";");for(let o of t){let[r,s]=o.trim().split("=");if(r===e)return decodeURIComponent(s)}let n=document.querySelector('meta[name="csrf-token"]');return n?n.getAttribute("content"):null}function fe(e){if(e===0)return"0 B";let t=1024,n=["B","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,o)).toFixed(1))+" "+n[o]}function he(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function dt({config:e,debugMode:t,isExpanded:n,isSpeaking:o,messagesCount:r,isLoading:s,currentAgent:i,onClose:c,onToggleExpand:d,onToggleDebug:l,onToggleTTS:u,onClear:a,onToggleSidebar:h}){let{title:p,primaryColor:v,embedded:T,showConversationSidebar:$,showClearButton:y,showDebugButton:w,enableDebugMode:H,showTTSButton:S,showExpandButton:K,enableTTS:D,elevenLabsApiKey:z,ttsProxyUrl:J}=e,L=z||J;return g`
1
+ var ChatWidgetModule=(()=>{var be=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var At=Object.getOwnPropertyNames;var Pt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)be(e,n,{get:t[n],enumerable:!0})},Rt=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of At(t))!Pt.call(e,r)&&r!==n&&be(e,r,{get:()=>t[r],enumerable:!(s=Et(t,r))||s.enumerable});return e};var Ht=e=>Rt(be({},"__esModule",{value:!0}),e);var ln={};Dt(ln,{ChatWidget:()=>$e,default:()=>an});var ce,A,Be,Nt,Z,Fe,Ke,ze,Je,Te,ke,Ce,Ot,te={},Ve=[],Ft=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ue=Array.isArray;function X(e,t){for(var n in t)e[n]=t[n];return e}function Me(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function de(e,t,n){var s,r,o,i={};for(o in t)o=="key"?s=t[o]:o=="ref"?r=t[o]:i[o]=t[o];if(arguments.length>2&&(i.children=arguments.length>3?ce.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(o in e.defaultProps)i[o]===void 0&&(i[o]=e.defaultProps[o]);return ie(e,i,s,r,null)}function ie(e,t,n,s,r){var o={type:e,props:t,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:r??++Be,__i:-1,__u:0};return r==null&&A.vnode!=null&&A.vnode(o),o}function _e(e){return e.children}function ee(e,t){this.props=e,this.context=t}function Y(e,t){if(t==null)return e.__?Y(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?Y(e):null}function je(e){var t,n;if((e=e.__)!=null&&e.__c!=null){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null){e.__e=e.__c.base=n.__e;break}return je(e)}}function We(e){(!e.__d&&(e.__d=!0)&&Z.push(e)&&!le.__r++||Fe!=A.debounceRendering)&&((Fe=A.debounceRendering)||Ke)(le)}function le(){for(var e,t,n,s,r,o,i,c=1;Z.length;)Z.length>c&&Z.sort(ze),e=Z.shift(),c=Z.length,e.__d&&(n=void 0,s=void 0,r=(s=(t=e).__v).__e,o=[],i=[],t.__P&&((n=X({},s)).__v=s.__v+1,A.vnode&&A.vnode(n),xe(t.__P,n,s,t.__n,t.__P.namespaceURI,32&s.__u?[r]:null,o,r??Y(s),!!(32&s.__u),i),n.__v=s.__v,n.__.__k[n.__i]=n,Xe(o,n,i),s.__e=s.__=null,n.__e!=r&&je(n)));le.__r=0}function qe(e,t,n,s,r,o,i,c,h,l,u){var a,p,d,v,S,w,y,$=s&&s.__k||Ve,R=t.length;for(h=Wt(n,t,$,h,R),a=0;a<R;a++)(d=n.__k[a])!=null&&(p=d.__i==-1?te:$[d.__i]||te,d.__i=a,w=xe(e,d,p,r,o,i,c,h,l,u),v=d.__e,d.ref&&p.ref!=d.ref&&(p.ref&&Ie(p.ref,null,d),u.push(d.ref,d.__c||v,d)),S==null&&v!=null&&(S=v),(y=!!(4&d.__u))||p.__k===d.__k?h=Ge(d,h,e,y):typeof d.type=="function"&&w!==void 0?h=w:v&&(h=v.nextSibling),d.__u&=-7);return n.__e=S,h}function Wt(e,t,n,s,r){var o,i,c,h,l,u=n.length,a=u,p=0;for(e.__k=new Array(r),o=0;o<r;o++)(i=t[o])!=null&&typeof i!="boolean"&&typeof i!="function"?(typeof i=="string"||typeof i=="number"||typeof i=="bigint"||i.constructor==String?i=e.__k[o]=ie(null,i,null,null,null):ue(i)?i=e.__k[o]=ie(_e,{children:i},null,null,null):i.constructor===void 0&&i.__b>0?i=e.__k[o]=ie(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):e.__k[o]=i,h=o+p,i.__=e,i.__b=e.__b+1,c=null,(l=i.__i=Ut(i,n,h,a))!=-1&&(a--,(c=n[l])&&(c.__u|=2)),c==null||c.__v==null?(l==-1&&(r>u?p--:r<u&&p++),typeof i.type!="function"&&(i.__u|=4)):l!=h&&(l==h-1?p--:l==h+1?p++:(l>h?p--:p++,i.__u|=4))):e.__k[o]=null;if(a)for(o=0;o<u;o++)(c=n[o])!=null&&!(2&c.__u)&&(c.__e==s&&(s=Y(c)),Ze(c,c));return s}function Ge(e,t,n,s){var r,o;if(typeof e.type=="function"){for(r=e.__k,o=0;r&&o<r.length;o++)r[o]&&(r[o].__=e,t=Ge(r[o],t,n,s));return t}e.__e!=t&&(s&&(t&&e.type&&!t.parentNode&&(t=Y(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function Ut(e,t,n,s){var r,o,i,c=e.key,h=e.type,l=t[n],u=l!=null&&(2&l.__u)==0;if(l===null&&c==null||u&&c==l.key&&h==l.type)return n;if(s>(u?1:0)){for(r=n-1,o=n+1;r>=0||o<t.length;)if((l=t[i=r>=0?r--:o++])!=null&&!(2&l.__u)&&c==l.key&&h==l.type)return i}return-1}function Ue(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||Ft.test(t)?n:n+"px"}function ae(e,t,n,s,r){var o,i;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof s=="string"&&(e.style.cssText=s=""),s)for(t in s)n&&t in n||Ue(e.style,t,"");if(n)for(t in n)s&&n[t]==s[t]||Ue(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")o=t!=(t=t.replace(Je,"$1")),i=t.toLowerCase(),t=i in e||t=="onFocusOut"||t=="onFocusIn"?i.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+o]=n,n?s?n.u=s.u:(n.u=Te,e.addEventListener(t,o?Ce:ke,o)):e.removeEventListener(t,o?Ce:ke,o);else{if(r=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Le(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t.t==null)t.t=Te++;else if(t.t<n.u)return;return n(A.event?A.event(t):t)}}}function xe(e,t,n,s,r,o,i,c,h,l){var u,a,p,d,v,S,w,y,$,R,T,L,P,J,V,B,m,b=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(h=!!(32&n.__u),o=[c=t.__e=n.__e]),(u=A.__b)&&u(t);e:if(typeof b=="function")try{if(y=t.props,$="prototype"in b&&b.prototype.render,R=(u=b.contextType)&&s[u.__c],T=u?R?R.props.value:u.__:s,n.__c?w=(a=t.__c=n.__c).__=a.__E:($?t.__c=a=new b(y,T):(t.__c=a=new ee(y,T),a.constructor=b,a.render=Bt),R&&R.sub(a),a.state||(a.state={}),a.__n=s,p=a.__d=!0,a.__h=[],a._sb=[]),$&&a.__s==null&&(a.__s=a.state),$&&b.getDerivedStateFromProps!=null&&(a.__s==a.state&&(a.__s=X({},a.__s)),X(a.__s,b.getDerivedStateFromProps(y,a.__s))),d=a.props,v=a.state,a.__v=t,p)$&&b.getDerivedStateFromProps==null&&a.componentWillMount!=null&&a.componentWillMount(),$&&a.componentDidMount!=null&&a.__h.push(a.componentDidMount);else{if($&&b.getDerivedStateFromProps==null&&y!==d&&a.componentWillReceiveProps!=null&&a.componentWillReceiveProps(y,T),t.__v==n.__v||!a.__e&&a.shouldComponentUpdate!=null&&a.shouldComponentUpdate(y,a.__s,T)===!1){for(t.__v!=n.__v&&(a.props=y,a.state=a.__s,a.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(D){D&&(D.__=t)}),L=0;L<a._sb.length;L++)a.__h.push(a._sb[L]);a._sb=[],a.__h.length&&i.push(a);break e}a.componentWillUpdate!=null&&a.componentWillUpdate(y,a.__s,T),$&&a.componentDidUpdate!=null&&a.__h.push(function(){a.componentDidUpdate(d,v,S)})}if(a.context=T,a.props=y,a.__P=e,a.__e=!1,P=A.__r,J=0,$){for(a.state=a.__s,a.__d=!1,P&&P(t),u=a.render(a.props,a.state,a.context),V=0;V<a._sb.length;V++)a.__h.push(a._sb[V]);a._sb=[]}else do a.__d=!1,P&&P(t),u=a.render(a.props,a.state,a.context),a.state=a.__s;while(a.__d&&++J<25);a.state=a.__s,a.getChildContext!=null&&(s=X(X({},s),a.getChildContext())),$&&!p&&a.getSnapshotBeforeUpdate!=null&&(S=a.getSnapshotBeforeUpdate(d,v)),B=u,u!=null&&u.type===_e&&u.key==null&&(B=Qe(u.props.children)),c=qe(e,ue(B)?B:[B],t,n,s,r,o,i,c,h,l),a.base=t.__e,t.__u&=-161,a.__h.length&&i.push(a),w&&(a.__E=a.__=null)}catch(D){if(t.__v=null,h||o!=null)if(D.then){for(t.__u|=h?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o[o.indexOf(c)]=null,t.__e=c}else{for(m=o.length;m--;)Me(o[m]);Se(t)}else t.__e=n.__e,t.__k=n.__k,D.then||Se(t);A.__e(D,t,n)}else o==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):c=t.__e=Lt(n.__e,t,n,s,r,o,i,h,l);return(u=A.diffed)&&u(t),128&t.__u?void 0:c}function Se(e){e&&e.__c&&(e.__c.__e=!0),e&&e.__k&&e.__k.forEach(Se)}function Xe(e,t,n){for(var s=0;s<n.length;s++)Ie(n[s],n[++s],n[++s]);A.__c&&A.__c(t,e),e.some(function(r){try{e=r.__h,r.__h=[],e.some(function(o){o.call(r)})}catch(o){A.__e(o,r.__v)}})}function Qe(e){return typeof e!="object"||e==null||e.__b&&e.__b>0?e:ue(e)?e.map(Qe):X({},e)}function Lt(e,t,n,s,r,o,i,c,h){var l,u,a,p,d,v,S,w=n.props||te,y=t.props,$=t.type;if($=="svg"?r="http://www.w3.org/2000/svg":$=="math"?r="http://www.w3.org/1998/Math/MathML":r||(r="http://www.w3.org/1999/xhtml"),o!=null){for(l=0;l<o.length;l++)if((d=o[l])&&"setAttribute"in d==!!$&&($?d.localName==$:d.nodeType==3)){e=d,o[l]=null;break}}if(e==null){if($==null)return document.createTextNode(y);e=document.createElementNS(r,$,y.is&&y),c&&(A.__m&&A.__m(t,o),c=!1),o=null}if($==null)w===y||c&&e.data==y||(e.data=y);else{if(o=o&&ce.call(e.childNodes),!c&&o!=null)for(w={},l=0;l<e.attributes.length;l++)w[(d=e.attributes[l]).name]=d.value;for(l in w)if(d=w[l],l!="children"){if(l=="dangerouslySetInnerHTML")a=d;else if(!(l in y)){if(l=="value"&&"defaultValue"in y||l=="checked"&&"defaultChecked"in y)continue;ae(e,l,null,d,r)}}for(l in y)d=y[l],l=="children"?p=d:l=="dangerouslySetInnerHTML"?u=d:l=="value"?v=d:l=="checked"?S=d:c&&typeof d!="function"||w[l]===d||ae(e,l,d,w[l],r);if(u)c||a&&(u.__html==a.__html||u.__html==e.innerHTML)||(e.innerHTML=u.__html),t.__k=[];else if(a&&(e.innerHTML=""),qe(t.type=="template"?e.content:e,ue(p)?p:[p],t,n,s,$=="foreignObject"?"http://www.w3.org/1999/xhtml":r,o,i,o?o[0]:n.__k&&Y(n,0),c,h),o!=null)for(l=o.length;l--;)Me(o[l]);c||(l="value",$=="progress"&&v==null?e.removeAttribute("value"):v!=null&&(v!==e[l]||$=="progress"&&!v||$=="option"&&v!=w[l])&&ae(e,l,v,w[l],r),l="checked",S!=null&&S!=e[l]&&ae(e,l,S,w[l],r))}return e}function Ie(e,t,n){try{if(typeof e=="function"){var s=typeof e.__u=="function";s&&e.__u(),s&&t==null||(e.__u=e(t))}else e.current=t}catch(r){A.__e(r,n)}}function Ze(e,t,n){var s,r;if(A.unmount&&A.unmount(e),(s=e.ref)&&(s.current&&s.current!=e.__e||Ie(s,null,t)),(s=e.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(o){A.__e(o,t)}s.base=s.__P=null}if(s=e.__k)for(r=0;r<s.length;r++)s[r]&&Ze(s[r],t,n||typeof e.type!="function");n||Me(e.__e),e.__c=e.__=e.__e=void 0}function Bt(e,t,n){return this.constructor(e,n)}function pe(e,t,n){var s,r,o,i;t==document&&(t=document.documentElement),A.__&&A.__(e,t),r=(s=typeof n=="function")?null:n&&n.__k||t.__k,o=[],i=[],xe(t,e=(!s&&n||t).__k=de(_e,null,[e]),r||te,te,t.namespaceURI,!s&&n?[n]:r?null:t.firstChild?ce.call(t.childNodes):null,o,!s&&n?n:r?r.__e:t.firstChild,s,i),Xe(o,e,i)}ce=Ve.slice,A={__e:function(e,t,n,s){for(var r,o,i;t=t.__;)if((r=t.__c)&&!r.__)try{if((o=r.constructor)&&o.getDerivedStateFromError!=null&&(r.setState(o.getDerivedStateFromError(e)),i=r.__d),r.componentDidCatch!=null&&(r.componentDidCatch(e,s||{}),i=r.__d),i)return r.__E=r}catch(c){e=c}throw e}},Be=0,Nt=function(e){return e!=null&&e.constructor===void 0},ee.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=X({},this.state),typeof e=="function"&&(e=e(X({},n),this.props)),e&&X(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),We(this))},ee.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),We(this))},ee.prototype.render=_e,Z=[],Ke=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,ze=function(e,t){return e.__v.__b-t.__v.__b},le.__r=0,Je=/(PointerCapture)$|Capture$/i,Te=0,ke=Le(!1),Ce=Le(!0),Ot=0;var et=function(e,t,n,s){var r;t[0]=0;for(var o=1;o<t.length;o++){var i=t[o++],c=t[o]?(t[0]|=i?1:2,n[t[o++]]):t[++o];i===3?s[0]=c:i===4?s[1]=Object.assign(s[1]||{},c):i===5?(s[1]=s[1]||{})[t[++o]]=c:i===6?s[1][t[++o]]+=c+"":i?(r=e.apply(c,et(e,c,n,["",null])),s.push(r),c[0]?t[0]|=2:(t[o-2]=0,t[o]=r)):s.push(c)}return s},Ye=new Map;function tt(e){var t=Ye.get(this);return t||(t=new Map,Ye.set(this,t)),(t=et(this,t.get(e)||(t.set(e,t=function(n){for(var s,r,o=1,i="",c="",h=[0],l=function(p){o===1&&(p||(i=i.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,p,i):o===3&&(p||i)?(h.push(3,p,i),o=2):o===2&&i==="..."&&p?h.push(4,p,0):o===2&&i&&!p?h.push(5,0,!0,i):o>=5&&((i||!p&&o===5)&&(h.push(o,0,i,r),o=6),p&&(h.push(o,p,0,r),o=6)),i=""},u=0;u<n.length;u++){u&&(o===1&&l(),l(u));for(var a=0;a<n[u].length;a++)s=n[u][a],o===1?s==="<"?(l(),h=[h],o=3):i+=s:o===4?i==="--"&&s===">"?(o=1,i=""):i=s+i[0]:c?s===c?c="":i+=s:s==='"'||s==="'"?c=s:s===">"?(l(),o=1):o&&(s==="="?(o=5,r=i,i=""):s==="/"&&(o<5||n[u][a+1]===">")?(l(),o===3&&(h=h[0]),o=h,(h=h[0]).push(2,0,o),o=0):s===" "||s===" "||s===`
2
+ `||s==="\r"?(l(),o=2):i+=s),o===3&&i==="!--"&&(o=4,h=h[0])}return l(),h}(e)),t),arguments,[])).length>1?t:t[0]}var g=tt.bind(de);var ne,H,Ee,nt,oe=0,ut=[],O=A,ot=O.__b,st=O.__r,rt=O.diffed,at=O.__c,it=O.unmount,lt=O.__;function Pe(e,t){O.__h&&O.__h(H,e,oe||t),oe=0;var n=H.__H||(H.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function C(e){return oe=1,Kt(_t,e)}function Kt(e,t,n){var s=Pe(ne++,2);if(s.t=e,!s.__c&&(s.__=[n?n(t):_t(void 0,t),function(c){var h=s.__N?s.__N[0]:s.__[0],l=s.t(h,c);h!==l&&(s.__N=[l,s.__[1]],s.__c.setState({}))}],s.__c=H,!H.__f)){var r=function(c,h,l){if(!s.__c.__H)return!0;var u=s.__c.__H.__.filter(function(p){return!!p.__c});if(u.every(function(p){return!p.__N}))return!o||o.call(this,c,h,l);var a=s.__c.props!==c;return u.forEach(function(p){if(p.__N){var d=p.__[0];p.__=p.__N,p.__N=void 0,d!==p.__[0]&&(a=!0)}}),o&&o.call(this,c,h,l)||a};H.__f=!0;var o=H.shouldComponentUpdate,i=H.componentWillUpdate;H.componentWillUpdate=function(c,h,l){if(this.__e){var u=o;o=void 0,r(c,h,l),o=u}i&&i.call(this,c,h,l)},H.shouldComponentUpdate=r}return s.__N||s.__}function W(e,t){var n=Pe(ne++,3);!O.__s&&dt(n.__H,t)&&(n.__=e,n.u=t,H.__H.__h.push(n))}function q(e){return oe=5,se(function(){return{current:e}},[])}function se(e,t){var n=Pe(ne++,7);return dt(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function K(e,t){return oe=8,se(function(){return e},t)}function zt(){for(var e;e=ut.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(fe),e.__H.__h.forEach(Ae),e.__H.__h=[]}catch(t){e.__H.__h=[],O.__e(t,e.__v)}}O.__b=function(e){H=null,ot&&ot(e)},O.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),lt&&lt(e,t)},O.__r=function(e){st&&st(e),ne=0;var t=(H=e.__c).__H;t&&(Ee===H?(t.__h=[],H.__h=[],t.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.forEach(fe),t.__h.forEach(Ae),t.__h=[],ne=0)),Ee=H},O.diffed=function(e){rt&&rt(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ut.push(t)!==1&&nt===O.requestAnimationFrame||((nt=O.requestAnimationFrame)||Jt)(zt)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Ee=H=null},O.__c=function(e,t){t.some(function(n){try{n.__h.forEach(fe),n.__h=n.__h.filter(function(s){return!s.__||Ae(s)})}catch(s){t.some(function(r){r.__h&&(r.__h=[])}),t=[],O.__e(s,n.__v)}}),at&&at(e,t)},O.unmount=function(e){it&&it(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach(function(s){try{fe(s)}catch(r){t=r}}),n.__H=void 0,t&&O.__e(t,n.__v))};var ct=typeof requestAnimationFrame=="function";function Jt(e){var t,n=function(){clearTimeout(s),ct&&cancelAnimationFrame(t),setTimeout(e)},s=setTimeout(n,35);ct&&(t=requestAnimationFrame(n))}function fe(e){var t=H,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),H=t}function Ae(e){var t=H;e.__c=e.__(),H=t}function dt(e,t){return!e||e.length!==t.length||t.some(function(n,s){return n!==e[s]})}function _t(e,t){return typeof t=="function"?t(e):t}function Vt(e){return e.replace(/_([a-z])/g,(t,n)=>n.toUpperCase())}function De(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function he(e){return Array.isArray(e)?e.map(he):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[Vt(t),he(n)])):e}function me(e){return Array.isArray(e)?e.map(me):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[De(t),me(n)])):e}function ge(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function F(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function pt(e){if(!e)return"";try{let t=new Date(e),s=new Date-t,r=Math.floor(s/6e4),o=Math.floor(s/36e5),i=Math.floor(s/864e5);return r<1?"Just now":r<60?`${r}m ago`:o<24?`${o}h ago`:i<7?`${i}d ago`:t.toLocaleDateString()}catch{return""}}function ft(e,t=null){if(t)return t(e);let n=F(e);return n=n.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),n=n.replace(/__(.+?)__/g,"<strong>$1</strong>"),n=n.replace(/\*(.+?)\*/g,"<em>$1</em>"),n=n.replace(/_(.+?)_/g,"<em>$1</em>"),n=n.replace(/`(.+?)`/g,"<code>$1</code>"),n=n.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),n=n.replace(/\n/g,"<br>"),n}function ht(e=""){let t=n=>e?`${n}_${e}`:n;return{get(n){try{return localStorage.getItem(t(n))}catch{return null}},set(n,s){try{let r=t(n);s===null?localStorage.removeItem(r):localStorage.setItem(r,s)}catch{}}}}function mt(e="csrftoken"){let t=document.cookie.split(";");for(let s of t){let[r,o]=s.trim().split("=");if(r===e)return decodeURIComponent(o)}let n=document.querySelector('meta[name="csrf-token"]');return n?n.getAttribute("content"):null}function ye(e){if(e===0)return"0 B";let t=1024,n=["B","KB","MB","GB"],s=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,s)).toFixed(1))+" "+n[s]}function ve(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function gt({config:e,debugMode:t,isExpanded:n,isSpeaking:s,messagesCount:r,isLoading:o,currentAgent:i,onClose:c,onToggleExpand:h,onToggleDebug:l,onToggleTTS:u,onClear:a,onToggleSidebar:p}){let{title:d,primaryColor:v,embedded:S,showConversationSidebar:w,showClearButton:y,showDebugButton:$,enableDebugMode:R,showTTSButton:T,showExpandButton:L,enableTTS:P,elevenLabsApiKey:J,ttsProxyUrl:V}=e,B=J||V;return g`
3
3
  <div class="cw-header" style=${{backgroundColor:v}}>
4
- ${$&&g`
4
+ ${w&&g`
5
5
  <button
6
6
  class="cw-header-btn cw-hamburger"
7
- onClick=${h}
7
+ onClick=${p}
8
8
  title="Conversations"
9
9
  >
10
10
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="16" height="16">
@@ -16,11 +16,11 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
16
16
  `}
17
17
 
18
18
  <div class="cw-title-container">
19
- <span class="cw-title">${O(p)}</span>
19
+ <span class="cw-title">${F(d)}</span>
20
20
  ${i&&g`
21
21
  <span class="cw-current-agent" title="Currently active agent">
22
22
  <span class="cw-agent-indicator">🤖</span>
23
- <span class="cw-agent-name">${O(i.name||i.key)}</span>
23
+ <span class="cw-agent-name">${F(i.name||i.key)}</span>
24
24
  </span>
25
25
  `}
26
26
  </div>
@@ -31,11 +31,11 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
31
31
  class="cw-header-btn"
32
32
  onClick=${a}
33
33
  title="Clear"
34
- disabled=${s||r===0}
34
+ disabled=${o||r===0}
35
35
  >🗑️</button>
36
36
  `}
37
37
 
38
- ${w&&H&&g`
38
+ ${$&&R&&g`
39
39
  <button
40
40
  class="cw-header-btn ${t?"cw-btn-active":""}"
41
41
  onClick=${l}
@@ -43,23 +43,23 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
43
43
  >🐛</button>
44
44
  `}
45
45
 
46
- ${S&&L&&g`
46
+ ${T&&B&&g`
47
47
  <button
48
- class="cw-header-btn ${D?"cw-btn-active":""}"
48
+ class="cw-header-btn ${P?"cw-btn-active":""}"
49
49
  onClick=${u}
50
50
  title="TTS"
51
- >${D?"\u{1F50A}":"\u{1F507}"}</button>
51
+ >${P?"\u{1F50A}":"\u{1F507}"}</button>
52
52
  `}
53
53
 
54
- ${K&&!T&&g`
54
+ ${L&&!S&&g`
55
55
  <button
56
56
  class="cw-header-btn"
57
- onClick=${d}
57
+ onClick=${h}
58
58
  title=${n?"Minimize":"Expand"}
59
59
  >${n?"\u2296":"\u2295"}</button>
60
60
  `}
61
61
 
62
- ${!T&&g`
62
+ ${!S&&g`
63
63
  <button
64
64
  class="cw-header-btn"
65
65
  onClick=${c}
@@ -68,7 +68,7 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
68
68
  `}
69
69
  </div>
70
70
  </div>
71
- `}function Ie({msg:e,show:t,onToggle:n}){return t?g`
71
+ `}function Re({msg:e,show:t,onToggle:n}){return t?g`
72
72
  <div class="cw-debug-payload">
73
73
  <button class="cw-debug-payload-close" onClick=${n}>×</button>
74
74
  <pre class="cw-debug-payload-content">${JSON.stringify(e,null,2)}</pre>
@@ -79,71 +79,71 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
79
79
  onClick=${n}
80
80
  title="Show message payload"
81
81
  >{ }</button>
82
- `}function _t({msg:e,debugMode:t,markdownParser:n}){let[o,r]=C(!1),[s,i]=C(!1),c=e.role==="user",d=e.role==="system",l=e.type==="tool_call",u=e.type==="tool_result",a=e.type==="error",h=e.type==="sub_agent_start",p=e.type==="sub_agent_end",v=e.type==="agent_context";if(d&&!t)return null;if(h||p||v)return g`
83
- <div class="cw-agent-context ${h?"cw-agent-delegating":""} ${p?"cw-agent-returned":""}" style="position: relative;">
84
- <span class="cw-agent-context-icon">${h?"\u{1F517}":p?"\u2713":"\u{1F916}"}</span>
82
+ `}function yt({msg:e,debugMode:t,markdownParser:n}){let[s,r]=C(!1),[o,i]=C(!1),c=e.role==="user",h=e.role==="system",l=e.type==="tool_call",u=e.type==="tool_result",a=e.type==="error",p=e.type==="sub_agent_start",d=e.type==="sub_agent_end",v=e.type==="agent_context";if(h&&!t)return null;if(p||d||v)return g`
83
+ <div class="cw-agent-context ${p?"cw-agent-delegating":""} ${d?"cw-agent-returned":""}" style="position: relative;">
84
+ <span class="cw-agent-context-icon">${p?"\u{1F517}":d?"\u2713":"\u{1F916}"}</span>
85
85
  <span class="cw-agent-context-text">${e.content}</span>
86
86
  ${e.metadata?.agentName&&g`
87
87
  <span class="cw-agent-context-name">${e.metadata.agentName}</span>
88
88
  `}
89
- ${t&&g`<${Ie} msg=${e} show=${s} onToggle=${()=>i(!s)} />`}
89
+ ${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
90
90
  </div>
91
- `;if(l||u){let S=e.metadata?.arguments||e.metadata?.result,K=D=>{if(typeof D=="string")try{return JSON.stringify(JSON.parse(D),null,2)}catch{return D}return JSON.stringify(D,null,2)};return g`
91
+ `;if(l||u){let T=e.metadata?.arguments||e.metadata?.result,L=P=>{if(typeof P=="string")try{return JSON.stringify(JSON.parse(P),null,2)}catch{return P}return JSON.stringify(P,null,2)};return g`
92
92
  <div class="cw-tool-message ${u?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
93
- <span class="cw-tool-label" onClick=${()=>S&&r(!o)}>
93
+ <span class="cw-tool-label" onClick=${()=>T&&r(!s)}>
94
94
  ${e.content}
95
- ${S&&g`<span class="cw-tool-expand">${o?"\u25BC":"\u25B6"}</span>`}
95
+ ${T&&g`<span class="cw-tool-expand">${s?"\u25BC":"\u25B6"}</span>`}
96
96
  </span>
97
- ${o&&S&&g`
98
- <pre class="cw-tool-details">${O(K(l?e.metadata.arguments:e.metadata.result))}</pre>
97
+ ${s&&T&&g`
98
+ <pre class="cw-tool-details">${F(L(l?e.metadata.arguments:e.metadata.result))}</pre>
99
99
  `}
100
- ${t&&g`<${Ie} msg=${e} show=${s} onToggle=${()=>i(!s)} />`}
100
+ ${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
101
101
  </div>
102
- `}let T=["cw-message",c&&"cw-message-user",a&&"cw-message-error"].filter(Boolean).join(" "),$=`cw-message-row ${c?"cw-message-row-user":""}`,y=e.role==="assistant"?lt(e.content,n):O(e.content),w=e.files&&e.files.length>0;return g`
103
- <div class=${$} style="position: relative;">
104
- ${w?g`
102
+ `}let S=["cw-message",c&&"cw-message-user",a&&"cw-message-error"].filter(Boolean).join(" "),w=`cw-message-row ${c?"cw-message-row-user":""}`,y=e.role==="assistant"?ft(e.content,n):F(e.content),$=e.files&&e.files.length>0;return g`
103
+ <div class=${w} style="position: relative;">
104
+ ${$?g`
105
105
  <div class="cw-message-attachments">
106
- ${e.files.map(S=>S.type&&S.type.startsWith("image/")?g`
107
- <a class="cw-attachment-thumbnail" href=${S.url} target="_blank" title=${S.name}>
108
- <img src=${S.url} alt=${S.name} />
106
+ ${e.files.map(T=>T.type&&T.type.startsWith("image/")?g`
107
+ <a class="cw-attachment-thumbnail" href=${T.url} target="_blank" title=${T.name}>
108
+ <img src=${T.url} alt=${T.name} />
109
109
  </a>
110
110
  `:g`
111
- <a class="cw-attachment-file" href=${S.url} target="_blank" title=${S.name}>
112
- <span class="cw-attachment-icon">${he(S.type)}</span>
111
+ <a class="cw-attachment-file" href=${T.url} target="_blank" title=${T.name}>
112
+ <span class="cw-attachment-icon">${ve(T.type)}</span>
113
113
  <span class="cw-attachment-info">
114
- <span class="cw-attachment-name">${S.name}</span>
115
- <span class="cw-attachment-size">${fe(S.size)}</span>
114
+ <span class="cw-attachment-name">${T.name}</span>
115
+ <span class="cw-attachment-size">${ye(T.size)}</span>
116
116
  </span>
117
117
  </a>
118
118
  `)}
119
119
  </div>
120
120
  `:null}
121
- <div class=${T} dangerouslySetInnerHTML=${{__html:y}} />
122
- ${t&&g`<${Ie} msg=${e} show=${s} onToggle=${()=>i(!s)} />`}
121
+ <div class=${S} dangerouslySetInnerHTML=${{__html:y}} />
122
+ ${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
123
123
  </div>
124
- `}function pt({messages:e,isLoading:t,hasMoreMessages:n,loadingMoreMessages:o,onLoadMore:r,debugMode:s,markdownParser:i,emptyStateTitle:c,emptyStateMessage:d}){let l=q(null),u=q(!0),a=p=>{let v=p.target,T=v.scrollHeight-v.scrollTop-v.clientHeight<100;if(u.current=T,v.scrollTop<50&&n&&!o){let $=v.scrollHeight;r().then(()=>{let y=v.scrollHeight;v.scrollTop=y-$+v.scrollTop})}};U(()=>{let p=l.current;p&&u.current&&requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight})},[e,t]),U(()=>{let p=l.current;p&&e.length<=2&&(u.current=!0,requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight}))},[e.length]);let h=e.length===0;return g`
124
+ `}function vt({messages:e,isLoading:t,hasMoreMessages:n,loadingMoreMessages:s,onLoadMore:r,debugMode:o,markdownParser:i,emptyStateTitle:c,emptyStateMessage:h}){let l=q(null),u=q(!0),a=d=>{let v=d.target,S=v.scrollHeight-v.scrollTop-v.clientHeight<100;if(u.current=S,v.scrollTop<50&&n&&!s){let w=v.scrollHeight;r().then(()=>{let y=v.scrollHeight;v.scrollTop=y-w+v.scrollTop})}};W(()=>{let d=l.current;d&&u.current&&requestAnimationFrame(()=>{d.scrollTop=d.scrollHeight})},[e,t]),W(()=>{let d=l.current;d&&e.length<=2&&(u.current=!0,requestAnimationFrame(()=>{d.scrollTop=d.scrollHeight}))},[e.length]);let p=e.length===0;return g`
125
125
  <div class="cw-messages" ref=${l} onScroll=${a}>
126
- ${h&&g`
126
+ ${p&&g`
127
127
  <div class="cw-empty-state">
128
128
  <svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
129
129
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
130
130
  </svg>
131
- <h3>${O(c)}</h3>
132
- <p>${O(d)}</p>
131
+ <h3>${F(c)}</h3>
132
+ <p>${F(h)}</p>
133
133
  </div>
134
134
  `}
135
135
 
136
- ${!h&&n&&g`
136
+ ${!p&&n&&g`
137
137
  <div class="cw-load-more" onClick=${r}>
138
- ${o?g`<span class="cw-spinner"></span><span>Loading...</span>`:g`<span>↑ Scroll up or click to load older messages</span>`}
138
+ ${s?g`<span class="cw-spinner"></span><span>Loading...</span>`:g`<span>↑ Scroll up or click to load older messages</span>`}
139
139
  </div>
140
140
  `}
141
141
 
142
- ${e.map(p=>g`
143
- <${_t}
144
- key=${p.id}
145
- msg=${p}
146
- debugMode=${s}
142
+ ${e.map(d=>g`
143
+ <${yt}
144
+ key=${d.id}
145
+ msg=${d}
146
+ debugMode=${o}
147
147
  markdownParser=${i}
148
148
  />
149
149
  `)}
@@ -157,11 +157,11 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
157
157
  </div>
158
158
  `}
159
159
  </div>
160
- `}var Ee=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function ft({onSend:e,onCancel:t,isLoading:n,placeholder:o,primaryColor:r,enableVoice:s=!0,enableFiles:i=!0}){let[c,d]=C(""),[l,u]=C([]),[a,h]=C(!1),[p,v]=C(!1),[T]=C(()=>!!Ee),$=q(null),y=q(null),w=q(null),H=q(!1);U(()=>{!n&&$.current&&$.current.focus()},[n]),U(()=>{$.current&&($.current.style.height="auto",$.current.style.height=Math.min($.current.scrollHeight,150)+"px")},[c]),U(()=>()=>{H.current=!1,w.current&&w.current.abort()},[]);let S=_=>{_.preventDefault(),(c.trim()||l.length>0)&&!n&&(e(c,l),d(""),u([]),$.current&&($.current.style.height="auto"),y.current&&(y.current.value=""))},K=_=>{let f=Array.from(_.target.files||[]);f.length>0&&u(k=>[...k,...f])},D=_=>{u(f=>f.filter((k,x)=>x!==_))},z=_=>{_.preventDefault(),y.current&&!n&&y.current.click()},J=_=>{_.key==="Enter"&&!_.shiftKey&&(_.preventDefault(),S(_))},L=_=>{n&&t&&(_.preventDefault(),t())},m=()=>{if(!Ee||n)return;H.current=!0;let _=new Ee;_.continuous=!0,_.interimResults=!0,_.lang=navigator.language||"en-US";let f=c,k="";_.onstart=()=>{v(!0)},_.onresult=x=>{k="";for(let V=x.resultIndex;V<x.results.length;V++){let j=x.results[V][0].transcript;x.results[V].isFinal?f+=(f?" ":"")+j:k+=j}d(f+(k?" "+k:""))},_.onerror=x=>{if(x.error==="no-speech"||x.error==="aborted"){console.log("[ChatWidget] Speech recognition:",x.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",x.error),H.current=!1,v(!1),d(f||c)},_.onend=()=>{if(H.current){console.log("[ChatWidget] Recognition paused, restarting...");try{_.start();return}catch(x){console.warn("[ChatWidget] Could not restart recognition:",x)}}v(!1),f&&d(f),w.current=null},w.current=_,_.start()},b=()=>{H.current=!1,w.current&&w.current.stop()},A=_=>{_.preventDefault(),p?b():m()},E=g`
160
+ `}var He=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function wt({onSend:e,onCancel:t,isLoading:n,placeholder:s,primaryColor:r,enableVoice:o=!0,enableFiles:i=!0}){let[c,h]=C(""),[l,u]=C([]),[a,p]=C(!1),[d,v]=C(!1),[S]=C(()=>!!He),w=q(null),y=q(null),$=q(null),R=q(!1);W(()=>{!n&&w.current&&w.current.focus()},[n]),W(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[c]),W(()=>()=>{R.current=!1,$.current&&$.current.abort()},[]);let T=_=>{_.preventDefault(),(c.trim()||l.length>0)&&!n&&(e(c,l),h(""),u([]),w.current&&(w.current.style.height="auto"),y.current&&(y.current.value=""))},L=_=>{let f=Array.from(_.target.files||[]);f.length>0&&u(k=>[...k,...f])},P=_=>{u(f=>f.filter((k,x)=>x!==_))},J=_=>{_.preventDefault(),y.current&&!n&&y.current.click()},V=_=>{_.key==="Enter"&&!_.shiftKey&&(_.preventDefault(),T(_))},B=_=>{n&&t&&(_.preventDefault(),t())},m=()=>{if(!He||n)return;R.current=!0;let _=new He;_.continuous=!0,_.interimResults=!0,_.lang=navigator.language||"en-US";let f=c,k="";_.onstart=()=>{v(!0)},_.onresult=x=>{k="";for(let z=x.resultIndex;z<x.results.length;z++){let G=x.results[z][0].transcript;x.results[z].isFinal?f+=(f?" ":"")+G:k+=G}h(f+(k?" "+k:""))},_.onerror=x=>{if(x.error==="no-speech"||x.error==="aborted"){console.log("[ChatWidget] Speech recognition:",x.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",x.error),R.current=!1,v(!1),h(f||c)},_.onend=()=>{if(R.current){console.log("[ChatWidget] Recognition paused, restarting...");try{_.start();return}catch(x){console.warn("[ChatWidget] Could not restart recognition:",x)}}v(!1),f&&h(f),$.current=null},$.current=_,_.start()},b=()=>{R.current=!1,$.current&&$.current.stop()},D=_=>{_.preventDefault(),d?b():m()},E=g`
161
161
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
162
162
  <rect x="2" y="2" width="10" height="10" rx="1" />
163
163
  </svg>
164
- `,R=g`
164
+ `,U=g`
165
165
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
166
166
  <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
167
167
  <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
@@ -172,26 +172,26 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
172
172
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
173
173
  <path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
174
174
  </svg>
175
- `,W=s&&T,G=i;return g`
176
- <form class="cw-input-form" onSubmit=${S}>
175
+ `,N=o&&S,j=i;return g`
176
+ <form class="cw-input-form" onSubmit=${T}>
177
177
  <input
178
178
  type="file"
179
179
  ref=${y}
180
180
  style="display: none"
181
181
  multiple
182
- onChange=${K}
182
+ onChange=${L}
183
183
  />
184
184
  ${l.length>0&&g`
185
185
  <div class="cw-file-chips">
186
186
  ${l.map((_,f)=>g`
187
187
  <div class="cw-file-chip" key=${f}>
188
- <span class="cw-file-chip-icon">${he(_.type)}</span>
188
+ <span class="cw-file-chip-icon">${ve(_.type)}</span>
189
189
  <span class="cw-file-chip-name" title=${_.name}>${_.name.length>20?_.name.substring(0,17)+"...":_.name}</span>
190
- <span class="cw-file-chip-size">(${fe(_.size)})</span>
190
+ <span class="cw-file-chip-size">(${ye(_.size)})</span>
191
191
  <button
192
192
  type="button"
193
193
  class="cw-file-chip-remove"
194
- onClick=${()=>D(f)}
194
+ onClick=${()=>P(f)}
195
195
  title="Remove file"
196
196
  >×</button>
197
197
  </div>
@@ -199,57 +199,57 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
199
199
  </div>
200
200
  `}
201
201
  <textarea
202
- ref=${$}
202
+ ref=${w}
203
203
  class="cw-input"
204
- placeholder=${O(o)}
204
+ placeholder=${F(s)}
205
205
  value=${c}
206
- onInput=${_=>d(_.target.value)}
207
- onKeyDown=${J}
206
+ onInput=${_=>h(_.target.value)}
207
+ onKeyDown=${V}
208
208
  disabled=${n}
209
209
  rows="1"
210
210
  />
211
- ${G&&g`
211
+ ${j&&g`
212
212
  <button
213
213
  type="button"
214
214
  class="cw-attach-btn"
215
- onClick=${z}
215
+ onClick=${J}
216
216
  disabled=${n}
217
217
  title="Attach files"
218
218
  >
219
219
  ${M}
220
220
  </button>
221
221
  `}
222
- ${W&&g`
222
+ ${N&&g`
223
223
  <button
224
224
  type="button"
225
- class=${`cw-voice-btn ${p?"cw-voice-btn-recording":""}`}
226
- onClick=${A}
225
+ class=${`cw-voice-btn ${d?"cw-voice-btn-recording":""}`}
226
+ onClick=${D}
227
227
  disabled=${n}
228
- title=${p?"Stop recording":"Voice input"}
228
+ title=${d?"Stop recording":"Voice input"}
229
229
  >
230
- ${R}
230
+ ${U}
231
231
  </button>
232
232
  `}
233
233
  <button
234
234
  type=${n?"button":"submit"}
235
235
  class=${`cw-send-btn ${n?"cw-send-btn-loading":""} ${n&&a?"cw-send-btn-stop":""}`}
236
236
  style=${{backgroundColor:n&&a?"#dc2626":r}}
237
- onClick=${L}
238
- onMouseEnter=${()=>h(!0)}
239
- onMouseLeave=${()=>h(!1)}
237
+ onClick=${B}
238
+ onMouseEnter=${()=>p(!0)}
239
+ onMouseLeave=${()=>p(!1)}
240
240
  title=${n?"Stop":"Send"}
241
241
  >
242
242
  ${n?a?E:g`<span class="cw-spinner"></span>`:"\u27A4"}
243
243
  </button>
244
244
  </form>
245
- `}function ht({isOpen:e,conversations:t,conversationsLoading:n,currentConversationId:o,onClose:r,onNewConversation:s,onSwitchConversation:i}){return g`
245
+ `}function $t({isOpen:e,conversations:t,conversationsLoading:n,currentConversationId:s,onClose:r,onNewConversation:o,onSwitchConversation:i}){return g`
246
246
  <div class="cw-sidebar ${e?"cw-sidebar-open":""}">
247
247
  <div class="cw-sidebar-header">
248
248
  <span>Conversations</span>
249
249
  <button class="cw-sidebar-close" onClick=${r}>✕</button>
250
250
  </div>
251
251
 
252
- <button class="cw-new-conversation" onClick=${s}>
252
+ <button class="cw-new-conversation" onClick=${o}>
253
253
  <span>+ New Conversation</span>
254
254
  </button>
255
255
 
@@ -267,11 +267,11 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
267
267
  ${t.map(c=>g`
268
268
  <div
269
269
  key=${c.id}
270
- class="cw-conversation-item ${c.id===o?"cw-conversation-active":""}"
270
+ class="cw-conversation-item ${c.id===s?"cw-conversation-active":""}"
271
271
  onClick=${()=>i(c.id)}
272
272
  >
273
- <div class="cw-conversation-title">${O(c.title||"Untitled")}</div>
274
- <div class="cw-conversation-date">${it(c.updatedAt||c.createdAt)}</div>
273
+ <div class="cw-conversation-title">${F(c.title||"Untitled")}</div>
274
+ <div class="cw-conversation-date">${pt(c.updatedAt||c.createdAt)}</div>
275
275
  </div>
276
276
  `)}
277
277
  </div>
@@ -281,16 +281,16 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
281
281
  class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
282
282
  onClick=${r}
283
283
  />
284
- `}function mt({availableModels:e,selectedModel:t,onSelectModel:n,disabled:o}){let[r,s]=C(!1);if(!e||e.length===0)return null;let c=e.find(u=>u.id===t)?.name||"Select Model",d=()=>{o||s(!r)},l=u=>{n(u),s(!1)};return g`
284
+ `}function bt({availableModels:e,selectedModel:t,onSelectModel:n,disabled:s}){let[r,o]=C(!1);if(!e||e.length===0)return null;let c=e.find(u=>u.id===t)?.name||"Select Model",h=()=>{s||o(!r)},l=u=>{n(u),o(!1)};return g`
285
285
  <div class="cw-model-selector">
286
286
  <button
287
287
  class="cw-model-btn"
288
- onClick=${d}
289
- disabled=${o}
288
+ onClick=${h}
289
+ disabled=${s}
290
290
  title="Select Model"
291
291
  >
292
292
  <span class="cw-model-icon">🤖</span>
293
- <span class="cw-model-name">${O(c)}</span>
293
+ <span class="cw-model-name">${F(c)}</span>
294
294
  <span class="cw-model-chevron">${r?"\u25B2":"\u25BC"}</span>
295
295
  </button>
296
296
 
@@ -302,65 +302,65 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
302
302
  class="cw-model-option ${u.id===t?"cw-model-option-selected":""}"
303
303
  onClick=${()=>l(u.id)}
304
304
  >
305
- <span class="cw-model-option-name">${O(u.name)}</span>
306
- <span class="cw-model-option-provider">${O(u.provider)}</span>
305
+ <span class="cw-model-option-name">${F(u.name)}</span>
306
+ <span class="cw-model-option-provider">${F(u.provider)}</span>
307
307
  ${u.description&&g`
308
- <span class="cw-model-option-desc">${O(u.description)}</span>
308
+ <span class="cw-model-option-desc">${F(u.description)}</span>
309
309
  `}
310
310
  </button>
311
311
  `)}
312
312
  </div>
313
313
  `}
314
314
  </div>
315
- `}function gt(e,t,n){let[o,r]=C([]),[s,i]=C(!1),[c,d]=C(null),[l,u]=C(()=>n?.get(e.conversationIdKey)||null),[a,h]=C(!1),[p,v]=C(!1),[T,$]=C(0),y=q(null),w=q(null);U(()=>{l&&n?.set(e.conversationIdKey,l)},[l,e.conversationIdKey,n]);let H=B(async(m,b,A)=>{y.current&&y.current.close();let E=e.apiPaths.runEvents.replace("{runId}",m),R=`${e.backendUrl}${E}`;b&&(R+=`?anonymous_token=${encodeURIComponent(b)}`);let M=new EventSource(R);y.current=M;let W="";M.addEventListener("assistant.message",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("assistant.message",f.payload);let k=f.payload.content;k&&(W+=k,r(x=>{let V=x[x.length-1];return V?.role==="assistant"&&V.id.startsWith("assistant-stream-")?[...x.slice(0,-1),{...V,content:W}]:[...x,{id:"assistant-stream-"+Date.now(),role:"assistant",content:W,timestamp:new Date,type:"message"}]}))}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("tool.call",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("tool.call",f.payload),r(k=>[...k,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${f.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:f.payload.name,arguments:f.payload.arguments,toolCallId:f.payload.id}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("tool.result",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("tool.result",f.payload);let k=f.payload.result,x=k?.error;r(V=>[...V,{id:"tool-result-"+Date.now(),role:"system",content:x?`\u274C ${k.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:f.payload.name,result:k,toolCallId:f.payload.tool_call_id}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("custom",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("custom",f.payload),f.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(f.payload),f.payload?.type==="agent_context"&&r(k=>[...k,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${f.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:f.payload.agent_key,agentName:f.payload.agent_name,action:f.payload.action}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("sub_agent.start",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("sub_agent.start",f.payload),r(k=>[...k,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${f.payload.agent_name||f.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:f.payload.sub_agent_key,agentName:f.payload.agent_name,invocationMode:f.payload.invocation_mode}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("sub_agent.end",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("sub_agent.end",f.payload),r(k=>[...k,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${f.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:f.payload.sub_agent_key,agentName:f.payload.agent_name}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}});let G=_=>{try{let f=JSON.parse(_.data);if(e.onEvent&&e.onEvent(f.type,f.payload),f.type==="run.failed"){let k=f.payload.error||"Agent run failed";d(k),r(x=>[...x,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${k}`,timestamp:new Date,type:"error"}])}}catch(f){console.error("[ChatWidget] Parse error:",f)}i(!1),M.close(),y.current=null,W&&A&&A(W)};M.addEventListener("run.succeeded",G),M.addEventListener("run.failed",G),M.addEventListener("run.cancelled",G),M.addEventListener("run.timed_out",G),M.onerror=()=>{i(!1),M.close(),y.current=null}},[e]),S=B(async(m,b={},A={})=>{if(!m.trim()||s)return;let E=[],R={};typeof b=="function"?R={onAssistantMessage:b}:Array.isArray(b)?(E=b,R=A):R=b||{};let{model:M,onAssistantMessage:W}=R;i(!0),d(null);let G={id:pe(),role:"user",content:m.trim(),timestamp:new Date,type:"message",files:E.length>0?E.map(_=>({name:_.name,size:_.size,type:_.type})):void 0};r(_=>[..._,G]);try{let _=await t.getOrCreateSession(),f;if(E.length>0){let j=new FormData;j.append("agentKey",e.agentKey),l&&j.append("conversationId",l),j.append("messages",JSON.stringify([{role:"user",content:m.trim()}])),j.append("metadata",JSON.stringify({...e.metadata,journeyType:e.defaultJourneyType})),M&&j.append("model",M),E.forEach(Ct=>{j.append("files",Ct)}),f=t.getFetchOptions({method:"POST",body:j},_)}else{let j={agentKey:e.agentKey,conversationId:l,messages:[{role:"user",content:m.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType}};M&&(j.model=M),f=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(j)},_)}let k=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,f);if(!k.ok){let j=await k.json().catch(()=>({}));throw new Error(j.error||`HTTP ${k.status}`)}let x=await k.json();w.current=x.id;let V=x.conversationId||x.conversation_id;!l&&V&&u(V),await H(x.id,_,W)}catch(_){d(_.message||"Failed to send message"),i(!1)}finally{w.current=null}},[e,t,l,s,H]),K=B(async()=>{let m=w.current;if(!(!m||!s))try{let b=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",m):`${e.apiPaths.runs}${m}/cancel/`;(await fetch(`${e.backendUrl}${b}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(y.current&&(y.current.close(),y.current=null),i(!1),w.current=null,r(E=>[...E,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(b){console.error("[ChatWidget] Failed to cancel run:",b)}},[e,t,s]),D=B(()=>{r([]),u(null),d(null),h(!1),$(0),n?.set(e.conversationIdKey,null)},[e.conversationIdKey,n]),z=m=>{let b={id:pe(),role:m.role,timestamp:m.timestamp?new Date(m.timestamp):new Date};if(m.role==="tool")return{...b,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:m.content,toolCallId:m.tool_call_id}};if(m.role==="assistant"&&m.tool_calls&&m.tool_calls.length>0)return m.tool_calls.map(E=>({id:pe(),role:"assistant",content:`\u{1F527} ${E.function?.name||E.name||"tool"}`,timestamp:b.timestamp,type:"tool_call",metadata:{toolName:E.function?.name||E.name,arguments:E.function?.arguments||E.arguments,toolCallId:E.id}}));let A=typeof m.content=="string"?m.content:JSON.stringify(m.content);return m.role==="assistant"&&!A?.trim()?null:{...b,content:A,type:"message"}},J=B(async m=>{i(!0),r([]),u(m);try{let b=await t.getOrCreateSession(),E=`${e.backendUrl}${e.apiPaths.conversations}${m}/?limit=10&offset=0`,R=await fetch(E,t.getFetchOptions({method:"GET"},b));if(R.ok){let M=await R.json();M.messages&&r(M.messages.flatMap(z).filter(Boolean)),h(M.has_more||M.hasMore||!1),$(M.messages?.length||0)}else R.status===404&&(u(null),n?.set(e.conversationIdKey,null))}catch(b){console.error("[ChatWidget] Failed to load conversation:",b)}finally{i(!1)}},[e,t,n]),L=B(async()=>{if(!(!l||p||!a)){v(!0);try{let m=await t.getOrCreateSession(),A=`${e.backendUrl}${e.apiPaths.conversations}${l}/?limit=10&offset=${T}`,E=await fetch(A,t.getFetchOptions({method:"GET"},m));if(E.ok){let R=await E.json();if(R.messages?.length>0){let M=R.messages.flatMap(z).filter(Boolean);r(W=>[...M,...W]),$(W=>W+R.messages.length),h(R.has_more||R.hasMore||!1)}else h(!1)}}catch(m){console.error("[ChatWidget] Failed to load more messages:",m)}finally{v(!1)}}},[e,t,l,T,p,a]);return U(()=>()=>{y.current&&y.current.close()},[]),{messages:o,isLoading:s,error:c,conversationId:l,hasMoreMessages:a,loadingMoreMessages:p,sendMessage:S,cancelRun:K,clearMessages:D,loadConversation:J,loadMoreMessages:L,setConversationId:u}}function yt(e,t,n){let[o,r]=C([]),[s,i]=C(null),[c,d]=C(null),[l,u]=C(!1);U(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let v=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(v.ok){let T=await v.json(),$=T.models||[];r($),d(T.default);let y=n?.get(e.modelKey);y&&$.some(w=>w.id===y)?i(y):i(T.default)}}catch(v){console.warn("[ChatWidget] Failed to load models:",v)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,n]);let a=B(p=>{i(p),n?.set(e.modelKey,p)},[e.modelKey,n]),h=B(()=>o.find(p=>p.id===s)||null,[o,s]);return{availableModels:o,selectedModel:s,defaultModel:c,isLoading:l,selectModel:a,getSelectedModelInfo:h}}function vt(e,t,n){let o=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",r=(c=null)=>{let d=o(),l={},u=c||e.authToken||t().authToken;if(d==="token"&&u){let a=e.authHeader||"Authorization",h=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";l[a]=h?`${h} ${u}`:u}else if(d==="jwt"&&u){let a=e.authHeader||"Authorization",h=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";l[a]=h?`${h} ${u}`:u}else if(d==="anonymous"&&u){let a=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";l[a]=u}if(d==="session"){let a=ut(e.csrfCookieName);a&&(l["X-CSRFToken"]=a)}return l};return{getAuthStrategy:o,getAuthHeaders:r,getFetchOptions:(c={},d=null)=>{let l=o(),u={...c};return u.headers={...u.headers,...r(d)},l==="session"&&(u.credentials="include"),u},getOrCreateSession:async()=>{let c=o(),d=t();if(c!=="anonymous")return e.authToken||d.authToken;if(d.authToken)return d.authToken;let l=e.anonymousTokenKey||e.sessionTokenKey,u=d.storage?.get(l);if(u)return n(a=>({...a,authToken:u})),u;try{let a=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,h=await fetch(`${e.backendUrl}${a}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(h.ok){let p=await h.json();return n(v=>({...v,authToken:p.token})),d.storage?.set(l,p.token),p.token}}catch(a){console.warn("[ChatWidget] Failed to create session:",a)}return null}}}function wt({config:e,onStateChange:t,markdownParser:n,apiRef:o}){let[r,s]=C(e.embedded||e.forceOpen===!0),[i,c]=C(!1),[d,l]=C(!1),[u,a]=C(!1),[h,p]=C([]),[v,T]=C(!1),[$,y]=C(e.enableTTS),[w,H]=C(!1),[S,K]=C(null);U(()=>{e.forceOpen!==void 0&&s(e.forceOpen)},[e.forceOpen]);let D=oe(()=>ct(e.containerId),[e.containerId]),[z,J]=C(e.authToken||null),L=oe(()=>vt(e,()=>({authToken:z,storage:D}),k=>{let x=k({authToken:z,storage:D});x.authToken!==z&&J(x.authToken)}),[e,z,D]),m=gt(e,L,D),b=yt(e,L,D);U(()=>{for(let _=m.messages.length-1;_>=0;_--){let f=m.messages[_];if(f.type==="sub_agent_start"){K({key:f.metadata?.subAgentKey,name:f.metadata?.agentName});return}if(f.type==="sub_agent_end"){K(null);return}}},[m.messages]),U(()=>{let _=D.get(e.conversationIdKey);_&&m.loadConversation(_)},[]),U(()=>{t&&t({isOpen:r,isExpanded:i,debugMode:d,messages:m.messages,conversationId:m.conversationId,isLoading:m.isLoading,error:m.error})},[r,i,d,m.messages,m.conversationId,m.isLoading,m.error]);let A=B(async()=>{if(e.showConversationSidebar){T(!0);try{let _=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(e.agentKey)}`,f=await fetch(_,L.getFetchOptions({method:"GET"}));if(f.ok){let k=await f.json();p(k.results||k)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),p([])}finally{T(!1)}}},[e,L]),E=B(()=>{let _=!u;a(_),_&&A()},[u,A]),R=B(_=>{_!==m.conversationId&&m.loadConversation(_),a(!1)},[m]),M=B(()=>{m.clearMessages(),a(!1)},[m]),W=B(_=>{m.sendMessage(_,{model:b.selectedModel,onAssistantMessage:f=>{}})},[m,$,b.selectedModel]);if(U(()=>{o&&(o.current={open:()=>s(!0),close:()=>s(!1),send:_=>W(_),clearMessages:()=>m.clearMessages(),toggleTTS:()=>y(_=>!_),stopSpeech:()=>H(!1),setAuth:_=>{_.token!==void 0&&J(_.token)},clearAuth:()=>J(null)})},[m,o,W]),!e.embedded&&!r)return g`
315
+ `}function kt(e,t,n){let[s,r]=C([]),[o,i]=C(!1),[c,h]=C(null),[l,u]=C(()=>n?.get(e.conversationIdKey)||null),[a,p]=C(!1),[d,v]=C(!1),[S,w]=C(0),y=q(null),$=q(null);W(()=>{l&&n?.set(e.conversationIdKey,l)},[l,e.conversationIdKey,n]);let R=K(async(m,b,D)=>{y.current&&y.current.close();let E=e.apiPaths.runEvents.replace("{runId}",m),U=`${e.backendUrl}${E}`;b&&(U+=`?anonymous_token=${encodeURIComponent(b)}`);let M=new EventSource(U);y.current=M;let N="";M.addEventListener("assistant.message",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("assistant.message",f.payload);let k=f.payload.content;k&&(N+=k,r(x=>{let z=x[x.length-1];return z?.role==="assistant"&&z.id.startsWith("assistant-stream-")?[...x.slice(0,-1),{...z,content:N}]:[...x,{id:"assistant-stream-"+Date.now(),role:"assistant",content:N,timestamp:new Date,type:"message"}]}))}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("tool.call",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("tool.call",f.payload),r(k=>[...k,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${f.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:f.payload.name,arguments:f.payload.arguments,toolCallId:f.payload.id}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("tool.result",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("tool.result",f.payload);let k=f.payload.result,x=k?.error;r(z=>[...z,{id:"tool-result-"+Date.now(),role:"system",content:x?`\u274C ${k.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:f.payload.name,result:k,toolCallId:f.payload.tool_call_id}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("custom",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("custom",f.payload),f.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(f.payload),f.payload?.type==="agent_context"&&r(k=>[...k,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${f.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:f.payload.agent_key,agentName:f.payload.agent_name,action:f.payload.action}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("sub_agent.start",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("sub_agent.start",f.payload),r(k=>[...k,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${f.payload.agent_name||f.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:f.payload.sub_agent_key,agentName:f.payload.agent_name,invocationMode:f.payload.invocation_mode}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}}),M.addEventListener("sub_agent.end",_=>{try{let f=JSON.parse(_.data);e.onEvent&&e.onEvent("sub_agent.end",f.payload),r(k=>[...k,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${f.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:f.payload.sub_agent_key,agentName:f.payload.agent_name}}])}catch(f){console.error("[ChatWidget] Parse error:",f)}});let j=_=>{try{let f=JSON.parse(_.data);if(e.onEvent&&e.onEvent(f.type,f.payload),f.type==="run.failed"){let k=f.payload.error||"Agent run failed";h(k),r(x=>[...x,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${k}`,timestamp:new Date,type:"error"}])}}catch(f){console.error("[ChatWidget] Parse error:",f)}i(!1),M.close(),y.current=null,N&&D&&D(N)};M.addEventListener("run.succeeded",j),M.addEventListener("run.failed",j),M.addEventListener("run.cancelled",j),M.addEventListener("run.timed_out",j),M.onerror=()=>{i(!1),M.close(),y.current=null}},[e]),T=K(async(m,b={},D={})=>{if(!m.trim()||o)return;let E=[],U={};typeof b=="function"?U={onAssistantMessage:b}:Array.isArray(b)?(E=b,U=D):U=b||{};let{model:M,onAssistantMessage:N}=U;i(!0),h(null);let j={id:ge(),role:"user",content:m.trim(),timestamp:new Date,type:"message",files:E.length>0?E.map(_=>({name:_.name,size:_.size,type:_.type})):void 0};r(_=>[..._,j]);try{let _=await t.getOrCreateSession(),f;if(E.length>0){let G=e.apiCaseStyle!=="camel",Oe=re=>G?De(re):re,Q=new FormData;Q.append(Oe("agentKey"),e.agentKey),l&&Q.append(Oe("conversationId"),l),Q.append("messages",JSON.stringify([{role:"user",content:m.trim()}])),Q.append("metadata",JSON.stringify(G?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),M&&Q.append("model",M),E.forEach(re=>{Q.append("files",re)}),f=t.getFetchOptions({method:"POST",body:Q},_)}else{let G=t.transformRequest({agentKey:e.agentKey,conversationId:l,messages:[{role:"user",content:m.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...M&&{model:M}});f=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(G)},_)}let k=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,f);if(!k.ok){let G=await k.json().catch(()=>({}));throw new Error(G.error||`HTTP ${k.status}`)}let x=await k.json(),z=t.transformResponse(x);$.current=z.id,!l&&z.conversationId&&u(z.conversationId),await R(z.id,_,N)}catch(_){h(_.message||"Failed to send message"),i(!1)}finally{$.current=null}},[e,t,l,o,R]),L=K(async()=>{let m=$.current;if(!(!m||!o))try{let b=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",m):`${e.apiPaths.runs}${m}/cancel/`;(await fetch(`${e.backendUrl}${b}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(y.current&&(y.current.close(),y.current=null),i(!1),$.current=null,r(E=>[...E,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(b){console.error("[ChatWidget] Failed to cancel run:",b)}},[e,t,o]),P=K(()=>{r([]),u(null),h(null),p(!1),w(0),n?.set(e.conversationIdKey,null)},[e.conversationIdKey,n]),J=m=>{let b={id:ge(),role:m.role,timestamp:m.timestamp?new Date(m.timestamp):new Date};if(m.role==="tool")return{...b,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:m.content,toolCallId:m.toolCallId}};if(m.role==="assistant"&&m.toolCalls&&m.toolCalls.length>0)return m.toolCalls.map(E=>({id:ge(),role:"assistant",content:`\u{1F527} ${E.function?.name||E.name||"tool"}`,timestamp:b.timestamp,type:"tool_call",metadata:{toolName:E.function?.name||E.name,arguments:E.function?.arguments||E.arguments,toolCallId:E.id}}));let D=typeof m.content=="string"?m.content:JSON.stringify(m.content);return m.role==="assistant"&&!D?.trim()?null:{...b,content:D,type:"message"}},V=K(async m=>{i(!0),r([]),u(m);try{let b=await t.getOrCreateSession(),E=`${e.backendUrl}${e.apiPaths.conversations}${m}/?limit=10&offset=0`,U=await fetch(E,t.getFetchOptions({method:"GET"},b));if(U.ok){let M=await U.json(),N=t.transformResponse(M);N.messages&&r(N.messages.flatMap(J).filter(Boolean)),p(N.hasMore||!1),w(N.messages?.length||0)}else U.status===404&&(u(null),n?.set(e.conversationIdKey,null))}catch(b){console.error("[ChatWidget] Failed to load conversation:",b)}finally{i(!1)}},[e,t,n]),B=K(async()=>{if(!(!l||d||!a)){v(!0);try{let m=await t.getOrCreateSession(),D=`${e.backendUrl}${e.apiPaths.conversations}${l}/?limit=10&offset=${S}`,E=await fetch(D,t.getFetchOptions({method:"GET"},m));if(E.ok){let U=await E.json(),M=t.transformResponse(U);if(M.messages?.length>0){let N=M.messages.flatMap(J).filter(Boolean);r(j=>[...N,...j]),w(j=>j+M.messages.length),p(M.hasMore||!1)}else p(!1)}}catch(m){console.error("[ChatWidget] Failed to load more messages:",m)}finally{v(!1)}}},[e,t,l,S,d,a]);return W(()=>()=>{y.current&&y.current.close()},[]),{messages:s,isLoading:o,error:c,conversationId:l,hasMoreMessages:a,loadingMoreMessages:d,sendMessage:T,cancelRun:L,clearMessages:P,loadConversation:V,loadMoreMessages:B,setConversationId:u}}function Ct(e,t,n){let[s,r]=C([]),[o,i]=C(null),[c,h]=C(null),[l,u]=C(!1);W(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let v=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(v.ok){let S=await v.json(),w=S.models||[];r(w),h(S.default);let y=n?.get(e.modelKey);y&&w.some($=>$.id===y)?i(y):i(S.default)}}catch(v){console.warn("[ChatWidget] Failed to load models:",v)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,n]);let a=K(d=>{i(d),n?.set(e.modelKey,d)},[e.modelKey,n]),p=K(()=>s.find(d=>d.id===o)||null,[s,o]);return{availableModels:s,selectedModel:o,defaultModel:c,isLoading:l,selectModel:a,getSelectedModelInfo:p}}function St(e,t,n){let s=l=>!l||typeof l!="object"||e.apiCaseStyle==="camel"?l:me(l),r=l=>!l||typeof l!="object"||e.apiCaseStyle==="snake"?l:he(l),o=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",i=(l=null)=>{let u=o(),a={},p=l||e.authToken||t().authToken;if(u==="token"&&p){let d=e.authHeader||"Authorization",v=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";a[d]=v?`${v} ${p}`:p}else if(u==="jwt"&&p){let d=e.authHeader||"Authorization",v=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";a[d]=v?`${v} ${p}`:p}else if(u==="anonymous"&&p){let d=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";a[d]=p}if(u==="session"){let d=mt(e.csrfCookieName);d&&(a["X-CSRFToken"]=d)}return a};return{getAuthStrategy:o,getAuthHeaders:i,getFetchOptions:(l={},u=null)=>{let a=o(),p={...l};return p.headers={...p.headers,...i(u)},a==="session"&&(p.credentials="include"),p},getOrCreateSession:async()=>{let l=o(),u=t();if(l!=="anonymous")return e.authToken||u.authToken;if(u.authToken)return u.authToken;let a=e.anonymousTokenKey||e.sessionTokenKey,p=u.storage?.get(a);if(p)return n(d=>({...d,authToken:p})),p;try{let d=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,v=await fetch(`${e.backendUrl}${d}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(v.ok){let S=await v.json();return n(w=>({...w,authToken:S.token})),u.storage?.set(a,S.token),S.token}}catch(d){console.warn("[ChatWidget] Failed to create session:",d)}return null},transformRequest:s,transformResponse:r}}function Tt({config:e,onStateChange:t,markdownParser:n,apiRef:s}){let[r,o]=C(e.embedded||e.forceOpen===!0),[i,c]=C(!1),[h,l]=C(!1),[u,a]=C(!1),[p,d]=C([]),[v,S]=C(!1),[w,y]=C(e.enableTTS),[$,R]=C(!1),[T,L]=C(null);W(()=>{e.forceOpen!==void 0&&o(e.forceOpen)},[e.forceOpen]);let P=se(()=>ht(e.containerId),[e.containerId]),[J,V]=C(e.authToken||null),B=se(()=>St(e,()=>({authToken:J,storage:P}),k=>{let x=k({authToken:J,storage:P});x.authToken!==J&&V(x.authToken)}),[e,J,P]),m=kt(e,B,P),b=Ct(e,B,P);W(()=>{for(let _=m.messages.length-1;_>=0;_--){let f=m.messages[_];if(f.type==="sub_agent_start"){L({key:f.metadata?.subAgentKey,name:f.metadata?.agentName});return}if(f.type==="sub_agent_end"){L(null);return}}},[m.messages]),W(()=>{let _=P.get(e.conversationIdKey);_&&m.loadConversation(_)},[]),W(()=>{t&&t({isOpen:r,isExpanded:i,debugMode:h,messages:m.messages,conversationId:m.conversationId,isLoading:m.isLoading,error:m.error})},[r,i,h,m.messages,m.conversationId,m.isLoading,m.error]);let D=K(async()=>{if(e.showConversationSidebar){S(!0);try{let _=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(e.agentKey)}`,f=await fetch(_,B.getFetchOptions({method:"GET"}));if(f.ok){let k=await f.json();d(k.results||k)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),d([])}finally{S(!1)}}},[e,B]),E=K(()=>{let _=!u;a(_),_&&D()},[u,D]),U=K(_=>{_!==m.conversationId&&m.loadConversation(_),a(!1)},[m]),M=K(()=>{m.clearMessages(),a(!1)},[m]),N=K(_=>{m.sendMessage(_,{model:b.selectedModel,onAssistantMessage:f=>{}})},[m,w,b.selectedModel]);if(W(()=>{s&&(s.current={open:()=>o(!0),close:()=>o(!1),send:_=>N(_),clearMessages:()=>m.clearMessages(),toggleTTS:()=>y(_=>!_),stopSpeech:()=>R(!1),setAuth:_=>{_.token!==void 0&&V(_.token)},clearAuth:()=>V(null)})},[m,s,N]),!e.embedded&&!r)return g`
316
316
  <button
317
317
  class="cw-fab"
318
318
  style=${{backgroundColor:e.primaryColor}}
319
- onClick=${()=>s(!0)}
319
+ onClick=${()=>o(!0)}
320
320
  >
321
321
  <svg class="cw-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
322
322
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
323
323
  </svg>
324
324
  </button>
325
- `;let G=["cw-widget",i&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" ");return g`
326
- <div class=${G} style=${{"--cw-primary":e.primaryColor}}>
325
+ `;let j=["cw-widget",i&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" ");return g`
326
+ <div class=${j} style=${{"--cw-primary":e.primaryColor}}>
327
327
  ${e.showConversationSidebar&&g`
328
- <${ht}
328
+ <${$t}
329
329
  isOpen=${u}
330
- conversations=${h}
330
+ conversations=${p}
331
331
  conversationsLoading=${v}
332
332
  currentConversationId=${m.conversationId}
333
333
  onClose=${()=>a(!1)}
334
334
  onNewConversation=${M}
335
- onSwitchConversation=${R}
335
+ onSwitchConversation=${U}
336
336
  />
337
337
  `}
338
338
 
339
- <${dt}
339
+ <${gt}
340
340
  config=${e}
341
- debugMode=${d}
341
+ debugMode=${h}
342
342
  isExpanded=${i}
343
- isSpeaking=${w}
343
+ isSpeaking=${$}
344
344
  messagesCount=${m.messages.length}
345
345
  isLoading=${m.isLoading}
346
- currentAgent=${S}
347
- onClose=${()=>s(!1)}
346
+ currentAgent=${T}
347
+ onClose=${()=>o(!1)}
348
348
  onToggleExpand=${()=>c(!i)}
349
- onToggleDebug=${()=>l(!d)}
350
- onToggleTTS=${()=>y(!$)}
349
+ onToggleDebug=${()=>l(!h)}
350
+ onToggleTTS=${()=>y(!w)}
351
351
  onClear=${m.clearMessages}
352
352
  onToggleSidebar=${E}
353
353
  />
354
354
 
355
- ${d&&g`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
355
+ ${h&&g`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
356
356
 
357
- <${pt}
357
+ <${vt}
358
358
  messages=${m.messages}
359
359
  isLoading=${m.isLoading}
360
360
  hasMoreMessages=${m.hasMoreMessages}
361
361
  loadingMoreMessages=${m.loadingMoreMessages}
362
362
  onLoadMore=${m.loadMoreMessages}
363
- debugMode=${d}
363
+ debugMode=${h}
364
364
  markdownParser=${n}
365
365
  emptyStateTitle=${e.emptyStateTitle}
366
366
  emptyStateMessage=${e.emptyStateMessage}
@@ -369,7 +369,7 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
369
369
  ${m.error&&g`<div class="cw-error-bar">${m.error}</div>`}
370
370
 
371
371
  ${e.showModelSelector&&b.availableModels.length>0&&g`
372
- <${mt}
372
+ <${bt}
373
373
  availableModels=${b.availableModels}
374
374
  selectedModel=${b.selectedModel}
375
375
  onSelectModel=${b.selectModel}
@@ -377,8 +377,8 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
377
377
  />
378
378
  `}
379
379
 
380
- <${ft}
381
- onSend=${W}
380
+ <${wt}
381
+ onSend=${N}
382
382
  onCancel=${m.cancelRun}
383
383
  isLoading=${m.isLoading}
384
384
  placeholder=${e.placeholder}
@@ -386,9 +386,9 @@ var ChatWidgetModule=(()=>{var ye=Object.defineProperty;var St=Object.getOwnProp
386
386
  enableVoice=${e.enableVoice}
387
387
  />
388
388
  </div>
389
- `}var $t={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/"},showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function bt(e){let t={...$t.apiPaths,...e.apiPaths||{}};return{...$t,...e,apiPaths:t}}var me=new Map,Kt=0,I=null,Pe=class{constructor(t={}){this.instanceId=`cw-${++Kt}`,this.config=bt(t),this.container=null,this._state={},this._apiRef={current:null},me.set(this.instanceId,this)}_handleStateChange=t=>{this._state=t};init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_render(t={}){this.container&&de(g`<${wt}
389
+ `}var Mt={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/"},apiCaseStyle:"auto",showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function xt(e){let t={...Mt.apiPaths,...e.apiPaths||{}};return{...Mt,...e,apiPaths:t}}var we=new Map,jt=0,I=null,Ne=class{constructor(t={}){this.instanceId=`cw-${++jt}`,this.config=xt(t),this.container=null,this._state={},this._apiRef={current:null},we.set(this.instanceId,this)}_handleStateChange=t=>{this._state=t};init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_render(t={}){this.container&&pe(g`<${Tt}
390
390
  config=${{...this.config,...t}}
391
391
  onStateChange=${this._handleStateChange}
392
- markdownParser=${ge._enhancedMarkdownParser}
392
+ markdownParser=${$e._enhancedMarkdownParser}
393
393
  apiRef=${this._apiRef}
394
- />`,this.container)}destroy(){this.container&&(de(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),me.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}};function kt(e={}){return new Pe(e).init()}function Lt(e={}){return I&&I.destroy(),I=kt(e),I}function Bt(){I&&(I.destroy(),I=null)}function jt(){I&&I.open()}function zt(){I&&I.close()}function Jt(e){I&&I.send(e)}function Vt(){I&&I.clearMessages()}function qt(){I&&I.toggleTTS()}function Gt(){I&&I.stopSpeech()}function Xt(e){I&&I.setAuth(e)}function Qt(){I&&I.clearAuth()}function Yt(){return I?I.getState():null}function Zt(){return I?I.getConfig():null}var ge={createInstance:kt,getInstance:e=>me.get(e),getAllInstances:()=>Array.from(me.values()),init:Lt,destroy:Bt,open:jt,close:zt,send:Jt,clearMessages:Vt,toggleTTS:qt,stopSpeech:Gt,setAuth:Xt,clearAuth:Qt,getState:Yt,getConfig:Zt,_enhancedMarkdownParser:null};var en=ge;typeof window<"u"&&(window.ChatWidget=ge);return Et(tn);})();
394
+ />`,this.container)}destroy(){this.container&&(pe(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),we.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}updateMetadata(t){this.config.metadata={...this.config.metadata,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`,t)}updateConfig(t){this.config={...this.config,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function It(e={}){return new Ne(e).init()}function qt(e={}){return I&&I.destroy(),I=It(e),I}function Gt(){I&&(I.destroy(),I=null)}function Xt(){I&&I.open()}function Qt(){I&&I.close()}function Zt(e){I&&I.send(e)}function Yt(){I&&I.clearMessages()}function en(){I&&I.toggleTTS()}function tn(){I&&I.stopSpeech()}function nn(e){I&&I.setAuth(e)}function on(){I&&I.clearAuth()}function sn(){return I?I.getState():null}function rn(){return I?I.getConfig():null}var $e={createInstance:It,getInstance:e=>we.get(e),getAllInstances:()=>Array.from(we.values()),init:qt,destroy:Gt,open:Xt,close:Qt,send:Zt,clearMessages:Yt,toggleTTS:en,stopSpeech:tn,setAuth:nn,clearAuth:on,getState:sn,getConfig:rn,_enhancedMarkdownParser:null};var an=$e;typeof window<"u"&&(window.ChatWidget=$e);return Ht(ln);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makemore/agent-frontend",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "A lightweight chat widget for AI agents built with Preact. Embed conversational AI into any website with a single script tag.",
5
5
  "type": "module",
6
6
  "main": "dist/chat-widget.js",
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { useState, useCallback, useRef, useEffect } from 'preact/hooks';
6
- import { generateId } from '../utils/helpers.js';
6
+ import { generateId, camelToSnake } from '../utils/helpers.js';
7
7
 
8
8
  export function useChat(config, api, storage) {
9
9
  const [messages, setMessages] = useState([]);
@@ -251,13 +251,21 @@ export function useChat(config, api, storage) {
251
251
 
252
252
  if (files.length > 0) {
253
253
  // Use FormData for file uploads
254
+ // Transform keys based on apiCaseStyle config
255
+ const useSnake = config.apiCaseStyle !== 'camel';
256
+ const key = (k) => useSnake ? camelToSnake(k) : k;
257
+
254
258
  const formData = new FormData();
255
- formData.append('agentKey', config.agentKey);
259
+ formData.append(key('agentKey'), config.agentKey);
256
260
  if (conversationId) {
257
- formData.append('conversationId', conversationId);
261
+ formData.append(key('conversationId'), conversationId);
258
262
  }
259
263
  formData.append('messages', JSON.stringify([{ role: 'user', content: content.trim() }]));
260
- formData.append('metadata', JSON.stringify({ ...config.metadata, journeyType: config.defaultJourneyType }));
264
+ formData.append('metadata', JSON.stringify(
265
+ useSnake
266
+ ? { ...config.metadata, journey_type: config.defaultJourneyType }
267
+ : { ...config.metadata, journeyType: config.defaultJourneyType }
268
+ ));
261
269
 
262
270
  if (model) {
263
271
  formData.append('model', model);
@@ -275,16 +283,13 @@ export function useChat(config, api, storage) {
275
283
  }, token);
276
284
  } else {
277
285
  // Use JSON for text-only messages
278
- const requestBody = {
286
+ const requestBody = api.transformRequest({
279
287
  agentKey: config.agentKey,
280
288
  conversationId: conversationId,
281
289
  messages: [{ role: 'user', content: content.trim() }],
282
290
  metadata: { ...config.metadata, journeyType: config.defaultJourneyType },
283
- };
284
-
285
- if (model) {
286
- requestBody.model = model;
287
- }
291
+ ...(model && { model }),
292
+ });
288
293
 
289
294
  fetchOptions = api.getFetchOptions({
290
295
  method: 'POST',
@@ -300,11 +305,11 @@ export function useChat(config, api, storage) {
300
305
  throw new Error(errorData.error || `HTTP ${response.status}`);
301
306
  }
302
307
 
303
- const run = await response.json();
308
+ const rawRun = await response.json();
309
+ const run = api.transformResponse(rawRun);
304
310
  currentRunIdRef.current = run.id;
305
- const runConversationId = run.conversationId || run.conversation_id;
306
- if (!conversationId && runConversationId) {
307
- setConversationId(runConversationId);
311
+ if (!conversationId && run.conversationId) {
312
+ setConversationId(run.conversationId);
308
313
  }
309
314
 
310
315
  await subscribeToEvents(run.id, token, onAssistantMessage);
@@ -364,6 +369,7 @@ export function useChat(config, api, storage) {
364
369
  }, [config.conversationIdKey, storage]);
365
370
 
366
371
  // Map API message format to internal message format with proper types
372
+ // Note: Input is already transformed to camelCase by api.transformResponse()
367
373
  const mapApiMessage = (m) => {
368
374
  const base = {
369
375
  id: generateId(),
@@ -380,15 +386,15 @@ export function useChat(config, api, storage) {
380
386
  type: 'tool_result',
381
387
  metadata: {
382
388
  result: m.content,
383
- toolCallId: m.tool_call_id,
389
+ toolCallId: m.toolCallId,
384
390
  },
385
391
  };
386
392
  }
387
393
 
388
394
  // Assistant messages with tool calls
389
- if (m.role === 'assistant' && m.tool_calls && m.tool_calls.length > 0) {
395
+ if (m.role === 'assistant' && m.toolCalls && m.toolCalls.length > 0) {
390
396
  // Return an array of tool call messages (will be flattened)
391
- return m.tool_calls.map(tc => ({
397
+ return m.toolCalls.map(tc => ({
392
398
  id: generateId(),
393
399
  role: 'assistant',
394
400
  content: `🔧 ${tc.function?.name || tc.name || 'tool'}`,
@@ -429,12 +435,13 @@ export function useChat(config, api, storage) {
429
435
  const response = await fetch(url, api.getFetchOptions({ method: 'GET' }, token));
430
436
 
431
437
  if (response.ok) {
432
- const conversation = await response.json();
438
+ const rawConversation = await response.json();
439
+ const conversation = api.transformResponse(rawConversation);
433
440
  if (conversation.messages) {
434
441
  // Use flatMap to handle tool_calls which return arrays, filter out nulls (empty messages)
435
442
  setMessages(conversation.messages.flatMap(mapApiMessage).filter(Boolean));
436
443
  }
437
- setHasMoreMessages(conversation.has_more || conversation.hasMore || false);
444
+ setHasMoreMessages(conversation.hasMore || false);
438
445
  setMessagesOffset(conversation.messages?.length || 0);
439
446
  } else if (response.status === 404) {
440
447
  setConversationId(null);
@@ -460,14 +467,15 @@ export function useChat(config, api, storage) {
460
467
  const response = await fetch(url, api.getFetchOptions({ method: 'GET' }, token));
461
468
 
462
469
  if (response.ok) {
463
- const conversation = await response.json();
470
+ const rawConversation = await response.json();
471
+ const conversation = api.transformResponse(rawConversation);
464
472
  if (conversation.messages?.length > 0) {
465
473
  // Use flatMap to handle tool_calls which return arrays, filter out nulls (empty messages)
466
474
  const olderMessages = conversation.messages.flatMap(mapApiMessage).filter(Boolean);
467
475
  setMessages(prev => [...olderMessages, ...prev]);
468
476
  // Use original message count for offset, not flattened count
469
477
  setMessagesOffset(prev => prev + conversation.messages.length);
470
- setHasMoreMessages(conversation.has_more || conversation.hasMore || false);
478
+ setHasMoreMessages(conversation.hasMore || false);
471
479
  } else {
472
480
  setHasMoreMessages(false);
473
481
  }
package/src/index.js CHANGED
@@ -148,6 +148,34 @@ class ChatWidgetInstance {
148
148
  getConfig() {
149
149
  return { ...this.config };
150
150
  }
151
+
152
+ /**
153
+ * Update metadata without destroying the widget.
154
+ * This allows changing the agent_id or other metadata while preserving the chat history.
155
+ */
156
+ updateMetadata(newMetadata) {
157
+ this.config.metadata = {
158
+ ...this.config.metadata,
159
+ ...newMetadata,
160
+ };
161
+ // Re-render with updated config
162
+ this._render();
163
+ console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`, newMetadata);
164
+ }
165
+
166
+ /**
167
+ * Update config without destroying the widget.
168
+ * Useful for changing settings like title, colors, etc.
169
+ */
170
+ updateConfig(configUpdates) {
171
+ this.config = {
172
+ ...this.config,
173
+ ...configUpdates,
174
+ };
175
+ // Re-render with updated config
176
+ this._render();
177
+ console.log(`[ChatWidget] Instance ${this.instanceId} config updated`);
178
+ }
151
179
  }
152
180
 
153
181
  // ============================================================================
package/src/utils/api.js CHANGED
@@ -2,9 +2,31 @@
2
2
  * API utilities for the chat widget
3
3
  */
4
4
 
5
- import { getCSRFToken } from './helpers.js';
5
+ import { getCSRFToken, keysToSnake, keysToCamel } from './helpers.js';
6
6
 
7
7
  export function createApiClient(config, getState, setState) {
8
+ /**
9
+ * Transform request body based on apiCaseStyle config
10
+ */
11
+ const transformRequest = (body) => {
12
+ if (!body || typeof body !== 'object') return body;
13
+ // For 'snake' or 'auto', convert to snake_case
14
+ // For 'camel', keep as-is (frontend already uses camelCase)
15
+ if (config.apiCaseStyle === 'camel') return body;
16
+ return keysToSnake(body);
17
+ };
18
+
19
+ /**
20
+ * Transform response data based on apiCaseStyle config
21
+ * For 'auto', we normalize to camelCase for consistent internal use
22
+ */
23
+ const transformResponse = (data) => {
24
+ if (!data || typeof data !== 'object') return data;
25
+ // For 'camel' or 'auto', normalize to camelCase
26
+ // For 'snake', keep as-is (but this is unusual for frontend)
27
+ if (config.apiCaseStyle === 'snake') return data;
28
+ return keysToCamel(data);
29
+ };
8
30
  const getAuthStrategy = () => {
9
31
  if (config.authStrategy) return config.authStrategy;
10
32
  if (config.authToken) return 'token';
@@ -86,6 +108,8 @@ export function createApiClient(config, getState, setState) {
86
108
  getAuthHeaders,
87
109
  getFetchOptions,
88
110
  getOrCreateSession,
111
+ transformRequest,
112
+ transformResponse,
89
113
  };
90
114
  }
91
115
 
@@ -42,6 +42,12 @@ export const DEFAULT_CONFIG = {
42
42
  models: '/api/agent-runtime/models/',
43
43
  },
44
44
 
45
+ // API case style: 'camel', 'snake', or 'auto' (accepts both, sends camelCase)
46
+ // - 'camel': Backend uses camelCase (e.g., with djangorestframework-camel-case)
47
+ // - 'snake': Backend uses snake_case (standard Django REST Framework)
48
+ // - 'auto': Accept both in responses, send snake_case in requests (default)
49
+ apiCaseStyle: 'auto',
50
+
45
51
  // UI options
46
52
  showConversationSidebar: true,
47
53
  showClearButton: true,
@@ -2,6 +2,75 @@
2
2
  * Utility functions for the chat widget
3
3
  */
4
4
 
5
+ // =============================================================================
6
+ // Case Conversion Utilities
7
+ // =============================================================================
8
+
9
+ /**
10
+ * Convert a string from snake_case to camelCase
11
+ */
12
+ export function snakeToCamel(str) {
13
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
14
+ }
15
+
16
+ /**
17
+ * Convert a string from camelCase to snake_case
18
+ */
19
+ export function camelToSnake(str) {
20
+ return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
21
+ }
22
+
23
+ /**
24
+ * Recursively convert all keys in an object from snake_case to camelCase
25
+ */
26
+ export function keysToCamel(obj) {
27
+ if (Array.isArray(obj)) {
28
+ return obj.map(keysToCamel);
29
+ }
30
+ if (obj !== null && typeof obj === 'object') {
31
+ return Object.fromEntries(
32
+ Object.entries(obj).map(([key, value]) => [
33
+ snakeToCamel(key),
34
+ keysToCamel(value)
35
+ ])
36
+ );
37
+ }
38
+ return obj;
39
+ }
40
+
41
+ /**
42
+ * Recursively convert all keys in an object from camelCase to snake_case
43
+ */
44
+ export function keysToSnake(obj) {
45
+ if (Array.isArray(obj)) {
46
+ return obj.map(keysToSnake);
47
+ }
48
+ if (obj !== null && typeof obj === 'object') {
49
+ return Object.fromEntries(
50
+ Object.entries(obj).map(([key, value]) => [
51
+ camelToSnake(key),
52
+ keysToSnake(value)
53
+ ])
54
+ );
55
+ }
56
+ return obj;
57
+ }
58
+
59
+ /**
60
+ * Get a value from an object supporting both camelCase and snake_case keys
61
+ */
62
+ export function getAnyCase(obj, camelKey) {
63
+ if (!obj || typeof obj !== 'object') return undefined;
64
+ if (camelKey in obj) return obj[camelKey];
65
+ const snakeKey = camelToSnake(camelKey);
66
+ if (snakeKey in obj) return obj[snakeKey];
67
+ return undefined;
68
+ }
69
+
70
+ // =============================================================================
71
+ // ID Generation
72
+ // =============================================================================
73
+
5
74
  export function generateId() {
6
75
  return 'msg-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
7
76
  }