@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.
- package/dist/chat-widget.js +105 -105
- package/package.json +1 -1
- package/src/hooks/useChat.js +29 -21
- package/src/index.js +28 -0
- package/src/utils/api.js +25 -1
- package/src/utils/config.js +6 -0
- package/src/utils/helpers.js +69 -0
package/dist/chat-widget.js
CHANGED
|
@@ -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
|
-
`||
|
|
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&<(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
|
-
${
|
|
4
|
+
${w&&g`
|
|
5
5
|
<button
|
|
6
6
|
class="cw-header-btn cw-hamburger"
|
|
7
|
-
onClick=${
|
|
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">${
|
|
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">${
|
|
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=${
|
|
34
|
+
disabled=${o||r===0}
|
|
35
35
|
>🗑️</button>
|
|
36
36
|
`}
|
|
37
37
|
|
|
38
|
-
${
|
|
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
|
-
${
|
|
46
|
+
${T&&B&&g`
|
|
47
47
|
<button
|
|
48
|
-
class="cw-header-btn ${
|
|
48
|
+
class="cw-header-btn ${P?"cw-btn-active":""}"
|
|
49
49
|
onClick=${u}
|
|
50
50
|
title="TTS"
|
|
51
|
-
>${
|
|
51
|
+
>${P?"\u{1F50A}":"\u{1F507}"}</button>
|
|
52
52
|
`}
|
|
53
53
|
|
|
54
|
-
${
|
|
54
|
+
${L&&!S&&g`
|
|
55
55
|
<button
|
|
56
56
|
class="cw-header-btn"
|
|
57
|
-
onClick=${
|
|
57
|
+
onClick=${h}
|
|
58
58
|
title=${n?"Minimize":"Expand"}
|
|
59
59
|
>${n?"\u2296":"\u2295"}</button>
|
|
60
60
|
`}
|
|
61
61
|
|
|
62
|
-
${!
|
|
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
|
|
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
|
|
83
|
-
<div class="cw-agent-context ${
|
|
84
|
-
<span class="cw-agent-context-icon">${
|
|
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`<${
|
|
89
|
+
${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
|
|
90
90
|
</div>
|
|
91
|
-
`;if(l||u){let
|
|
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=${()=>
|
|
93
|
+
<span class="cw-tool-label" onClick=${()=>T&&r(!s)}>
|
|
94
94
|
${e.content}
|
|
95
|
-
${
|
|
95
|
+
${T&&g`<span class="cw-tool-expand">${s?"\u25BC":"\u25B6"}</span>`}
|
|
96
96
|
</span>
|
|
97
|
-
${
|
|
98
|
-
<pre class="cw-tool-details">${
|
|
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`<${
|
|
100
|
+
${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
|
|
101
101
|
</div>
|
|
102
|
-
`}let
|
|
103
|
-
<div class=${
|
|
104
|
-
${
|
|
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(
|
|
107
|
-
<a class="cw-attachment-thumbnail" href=${
|
|
108
|
-
<img src=${
|
|
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=${
|
|
112
|
-
<span class="cw-attachment-icon">${
|
|
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">${
|
|
115
|
-
<span class="cw-attachment-size">${
|
|
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=${
|
|
122
|
-
${t&&g`<${
|
|
121
|
+
<div class=${S} dangerouslySetInnerHTML=${{__html:y}} />
|
|
122
|
+
${t&&g`<${Re} msg=${e} show=${o} onToggle=${()=>i(!o)} />`}
|
|
123
123
|
</div>
|
|
124
|
-
`}function
|
|
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
|
-
${
|
|
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>${
|
|
132
|
-
<p>${
|
|
131
|
+
<h3>${F(c)}</h3>
|
|
132
|
+
<p>${F(h)}</p>
|
|
133
133
|
</div>
|
|
134
134
|
`}
|
|
135
135
|
|
|
136
|
-
${!
|
|
136
|
+
${!p&&n&&g`
|
|
137
137
|
<div class="cw-load-more" onClick=${r}>
|
|
138
|
-
${
|
|
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(
|
|
143
|
-
<${
|
|
144
|
-
key=${
|
|
145
|
-
msg=${
|
|
146
|
-
debugMode=${
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
176
|
-
<form class="cw-input-form" onSubmit=${
|
|
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=${
|
|
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">${
|
|
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">(${
|
|
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=${()=>
|
|
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=${
|
|
204
|
+
placeholder=${F(s)}
|
|
205
205
|
value=${c}
|
|
206
|
-
onInput=${_=>
|
|
207
|
-
onKeyDown=${
|
|
206
|
+
onInput=${_=>h(_.target.value)}
|
|
207
|
+
onKeyDown=${V}
|
|
208
208
|
disabled=${n}
|
|
209
209
|
rows="1"
|
|
210
210
|
/>
|
|
211
|
-
${
|
|
211
|
+
${j&&g`
|
|
212
212
|
<button
|
|
213
213
|
type="button"
|
|
214
214
|
class="cw-attach-btn"
|
|
215
|
-
onClick=${
|
|
215
|
+
onClick=${J}
|
|
216
216
|
disabled=${n}
|
|
217
217
|
title="Attach files"
|
|
218
218
|
>
|
|
219
219
|
${M}
|
|
220
220
|
</button>
|
|
221
221
|
`}
|
|
222
|
-
${
|
|
222
|
+
${N&&g`
|
|
223
223
|
<button
|
|
224
224
|
type="button"
|
|
225
|
-
class=${`cw-voice-btn ${
|
|
226
|
-
onClick=${
|
|
225
|
+
class=${`cw-voice-btn ${d?"cw-voice-btn-recording":""}`}
|
|
226
|
+
onClick=${D}
|
|
227
227
|
disabled=${n}
|
|
228
|
-
title=${
|
|
228
|
+
title=${d?"Stop recording":"Voice input"}
|
|
229
229
|
>
|
|
230
|
-
${
|
|
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=${
|
|
238
|
-
onMouseEnter=${()=>
|
|
239
|
-
onMouseLeave=${()=>
|
|
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
|
|
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=${
|
|
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===
|
|
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">${
|
|
274
|
-
<div class="cw-conversation-date">${
|
|
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
|
|
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=${
|
|
289
|
-
disabled=${
|
|
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">${
|
|
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">${
|
|
306
|
-
<span class="cw-model-option-provider">${
|
|
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">${
|
|
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=${()=>
|
|
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
|
|
326
|
-
<div class=${
|
|
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
|
-
<${
|
|
328
|
+
<${$t}
|
|
329
329
|
isOpen=${u}
|
|
330
|
-
conversations=${
|
|
330
|
+
conversations=${p}
|
|
331
331
|
conversationsLoading=${v}
|
|
332
332
|
currentConversationId=${m.conversationId}
|
|
333
333
|
onClose=${()=>a(!1)}
|
|
334
334
|
onNewConversation=${M}
|
|
335
|
-
onSwitchConversation=${
|
|
335
|
+
onSwitchConversation=${U}
|
|
336
336
|
/>
|
|
337
337
|
`}
|
|
338
338
|
|
|
339
|
-
<${
|
|
339
|
+
<${gt}
|
|
340
340
|
config=${e}
|
|
341
|
-
debugMode=${
|
|
341
|
+
debugMode=${h}
|
|
342
342
|
isExpanded=${i}
|
|
343
|
-
isSpeaking=${
|
|
343
|
+
isSpeaking=${$}
|
|
344
344
|
messagesCount=${m.messages.length}
|
|
345
345
|
isLoading=${m.isLoading}
|
|
346
|
-
currentAgent=${
|
|
347
|
-
onClose=${()=>
|
|
346
|
+
currentAgent=${T}
|
|
347
|
+
onClose=${()=>o(!1)}
|
|
348
348
|
onToggleExpand=${()=>c(!i)}
|
|
349
|
-
onToggleDebug=${()=>l(!
|
|
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
|
-
${
|
|
355
|
+
${h&&g`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
|
|
356
356
|
|
|
357
|
-
<${
|
|
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=${
|
|
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
|
-
<${
|
|
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
|
-
<${
|
|
381
|
-
onSend=${
|
|
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
|
|
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=${
|
|
392
|
+
markdownParser=${$e._enhancedMarkdownParser}
|
|
393
393
|
apiRef=${this._apiRef}
|
|
394
|
-
/>`,this.container)}destroy(){this.container&&(
|
|
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.
|
|
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",
|
package/src/hooks/useChat.js
CHANGED
|
@@ -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(
|
|
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
|
|
308
|
+
const rawRun = await response.json();
|
|
309
|
+
const run = api.transformResponse(rawRun);
|
|
304
310
|
currentRunIdRef.current = run.id;
|
|
305
|
-
|
|
306
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
package/src/utils/config.js
CHANGED
|
@@ -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,
|
package/src/utils/helpers.js
CHANGED
|
@@ -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
|
}
|