@molin.ai/shop-ai 0.9.1 → 0.9.2
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.
|
@@ -1909,7 +1909,7 @@ var $c=Object.defineProperty;var ea=e=>{throw TypeError(e)};var Sc=(e,t,r)=>t in
|
|
|
1909
1909
|
stroke-linecap="round"></path>
|
|
1910
1910
|
</svg>
|
|
1911
1911
|
</div>
|
|
1912
|
-
`);this.positionClasses="",this.text="Try it out"}};g(zi,"properties",{positionClasses:{type:String,attribute:"position"},text:{type:String}});customElements.get("mw-try-it-out")||customElements.define("mw-try-it-out",zi);var Ge,Ie,Bo,gn,Vo=class{constructor(t=window.localStorage){f(this,Ie);f(this,Ge);m(this,Ge,t)}setex(t,r,n){return a(this,Ge).setItem(t,y(this,Ie,gn).call(this,{value:y(this,Ie,gn).call(this,r),expiresAt:Date.now()+n*1e3})||"")}set(t,r){return a(this,Ge).setItem(t,y(this,Ie,gn).call(this,{value:y(this,Ie,gn).call(this,r)})||"")}get(t){let r=a(this,Ge).getItem(t);if(!r)return;let n=y(this,Ie,Bo).call(this,r);if(n){if(n.expiresAt&&n.expiresAt<Date.now()){a(this,Ge).removeItem(t);return}return y(this,Ie,Bo).call(this,n.value)}}get molin_shop_assistant_distinct_id(){return localStorage.getItem("molin_shop_assistant_distinct_id")}set molin_shop_assistant_distinct_id(t){t===null?localStorage.removeItem("molin_shop_assistant_distinct_id"):localStorage.setItem("molin_shop_assistant_distinct_id",t)}get molin_widget_open_state(){return fe.get("molin-shop-ai-widget-open")??null}set molin_widget_open_state(t){fe.set("molin-shop-ai-widget-open",t)}resetWidgetData(){fe.molin_shop_assistant_distinct_id=null,fe.molin_widget_open_state=null}};Ge=new WeakMap,Ie=new WeakSet,Bo=function(t){if(!(typeof t!="string"||t===""))try{return JSON.parse(t)}catch{return}},gn=function(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return}};var fe=new Vo;var se,Ue,qi,yn,pr,No=class{constructor(){f(this,se,[]);f(this,Ue);f(this,qi,10);f(this,yn,5e3);f(this,pr,!1)}async add(t,r){if(a(this,se).push(ac(t,r)),a(this,se).length>=a(this,qi))return this.flush();a(this,Ue)||m(this,Ue,setTimeout(()=>{this.flush().catch(console.error)},a(this,yn)))}async flush(){if(a(this,pr)||a(this,se).length===0)return;let t=[...a(this,se)];try{m(this,pr,!0),clearTimeout(a(this,Ue)),m(this,Ue,void 0),m(this,se,[]);let r=new AbortController,n=setTimeout(()=>r.abort(),5e3);await oc(t,{signal:r.signal}),clearTimeout(n)}catch(r){if(r.name==="AbortError")console.error("Request timed out, retrying events"),m(this,se,[...t,...a(this,se)]);else{console.error("Failed to send events to backend:",r);let n=t.filter(i=>i.event.includes("error"));m(this,se,[...n,...a(this,se)])}}finally{m(this,pr,!1),a(this,se).length>0&&!a(this,Ue)&&m(this,Ue,setTimeout(()=>{this.flush().catch(console.error)},a(this,yn)))}}async flushBeforeUnload(){if(a(this,se).length>0)try{let t=new FormData;t.set("events",JSON.stringify(a(this,se))),navigator.sendBeacon(new URL("/widgets/data/collect",lc()).href,t)}catch(t){console.error("Failed to send final events:",t)}}};se=new WeakMap,Ue=new WeakMap,qi=new WeakMap,yn=new WeakMap,pr=new WeakMap;var sc=new No;window.addEventListener("beforeunload",()=>{sc.flushBeforeUnload().catch(console.error)});async function F(e,t,r){if(typeof e!="string")throw new TypeError("Event name must be a string");if(typeof t!="object"||t===null)throw new TypeError("Properties must be an object");try{if(e==="ShopAssistant: user clicked link"&&N1("molin_link_click",t),r?.immediate){await oc([ac(e,t)]);return}else return sc.add(e,t)}catch(n){console.error("Failed to send event:",n)}}async function oc(e,{signal:t}={}){let r=new FormData;r.set("events",JSON.stringify(e));let n=await fetch(new URL("/widgets/data/collect",lc()),{method:"POST",body:r,signal:t});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);n.body?.cancel().catch(console.warn)}function ac(e,t){return{event:e,widget_id:t.widgetId,properties:Object.assign({},t,B1()),distinct_id:V1(),timestamp:new Date().toISOString()}}function V1(){try{let e=fe.molin_shop_assistant_distinct_id;return e||(e=crypto.randomUUID(),fe.molin_shop_assistant_distinct_id=e),e}catch(e){console.error("Failed to deserialize distinct_id:",e);let t=crypto.randomUUID();try{fe.molin_shop_assistant_distinct_id=t}catch(r){console.error("Failed to store new distinct_id:",r)}return t}}function B1(){return{referrer:document.referrer,userAgent:navigator.userAgent,language:navigator.language,screenWidth:window.innerWidth,screenHeight:window.innerHeight,timestamp:new Date().toISOString(),timezoneOffset:new Date().getTimezoneOffset(),doNotTrack:navigator.doNotTrack??void 0}}function lc(){let e=new URL(import.meta.url).hostname;return{localhost:"http://localhost:8787","molin.localhost":"http://molin.localhost:8787","widget.molin.foo":"https://molin.foo","widget.molin.ai":"https://molin.ai","molin.ai":"https://molin.ai","molin.foo":"https://molin.foo"}[e]||"https://molin.ai"}function N1(e,t){try{window.dataLayer=window.dataLayer||[];let r={event:e,link_url:t.url};window.dataLayer.push(r)
|
|
1912
|
+
`);this.positionClasses="",this.text="Try it out"}};g(zi,"properties",{positionClasses:{type:String,attribute:"position"},text:{type:String}});customElements.get("mw-try-it-out")||customElements.define("mw-try-it-out",zi);var Ge,Ie,Bo,gn,Vo=class{constructor(t=window.localStorage){f(this,Ie);f(this,Ge);m(this,Ge,t)}setex(t,r,n){return a(this,Ge).setItem(t,y(this,Ie,gn).call(this,{value:y(this,Ie,gn).call(this,r),expiresAt:Date.now()+n*1e3})||"")}set(t,r){return a(this,Ge).setItem(t,y(this,Ie,gn).call(this,{value:y(this,Ie,gn).call(this,r)})||"")}get(t){let r=a(this,Ge).getItem(t);if(!r)return;let n=y(this,Ie,Bo).call(this,r);if(n){if(n.expiresAt&&n.expiresAt<Date.now()){a(this,Ge).removeItem(t);return}return y(this,Ie,Bo).call(this,n.value)}}get molin_shop_assistant_distinct_id(){return localStorage.getItem("molin_shop_assistant_distinct_id")}set molin_shop_assistant_distinct_id(t){t===null?localStorage.removeItem("molin_shop_assistant_distinct_id"):localStorage.setItem("molin_shop_assistant_distinct_id",t)}get molin_widget_open_state(){return fe.get("molin-shop-ai-widget-open")??null}set molin_widget_open_state(t){fe.set("molin-shop-ai-widget-open",t)}resetWidgetData(){fe.molin_shop_assistant_distinct_id=null,fe.molin_widget_open_state=null}};Ge=new WeakMap,Ie=new WeakSet,Bo=function(t){if(!(typeof t!="string"||t===""))try{return JSON.parse(t)}catch{return}},gn=function(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return}};var fe=new Vo;var se,Ue,qi,yn,pr,No=class{constructor(){f(this,se,[]);f(this,Ue);f(this,qi,10);f(this,yn,5e3);f(this,pr,!1)}async add(t,r){if(a(this,se).push(ac(t,r)),a(this,se).length>=a(this,qi))return this.flush();a(this,Ue)||m(this,Ue,setTimeout(()=>{this.flush().catch(console.error)},a(this,yn)))}async flush(){if(a(this,pr)||a(this,se).length===0)return;let t=[...a(this,se)];try{m(this,pr,!0),clearTimeout(a(this,Ue)),m(this,Ue,void 0),m(this,se,[]);let r=new AbortController,n=setTimeout(()=>r.abort(),5e3);await oc(t,{signal:r.signal}),clearTimeout(n)}catch(r){if(r.name==="AbortError")console.error("Request timed out, retrying events"),m(this,se,[...t,...a(this,se)]);else{console.error("Failed to send events to backend:",r);let n=t.filter(i=>i.event.includes("error"));m(this,se,[...n,...a(this,se)])}}finally{m(this,pr,!1),a(this,se).length>0&&!a(this,Ue)&&m(this,Ue,setTimeout(()=>{this.flush().catch(console.error)},a(this,yn)))}}async flushBeforeUnload(){if(a(this,se).length>0)try{let t=new FormData;t.set("events",JSON.stringify(a(this,se))),navigator.sendBeacon(new URL("/widgets/data/collect",lc()).href,t)}catch(t){console.error("Failed to send final events:",t)}}};se=new WeakMap,Ue=new WeakMap,qi=new WeakMap,yn=new WeakMap,pr=new WeakMap;var sc=new No;window.addEventListener("beforeunload",()=>{sc.flushBeforeUnload().catch(console.error)});async function F(e,t,r){if(typeof e!="string")throw new TypeError("Event name must be a string");if(typeof t!="object"||t===null)throw new TypeError("Properties must be an object");try{if(e==="ShopAssistant: user clicked link"&&N1("molin_link_click",t),r?.immediate){await oc([ac(e,t)]);return}else return sc.add(e,t)}catch(n){console.error("Failed to send event:",n)}}async function oc(e,{signal:t}={}){let r=new FormData;r.set("events",JSON.stringify(e));let n=await fetch(new URL("/widgets/data/collect",lc()),{method:"POST",body:r,signal:t});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);n.body?.cancel().catch(console.warn)}function ac(e,t){return{event:e,widget_id:t.widgetId,properties:Object.assign({},t,B1()),distinct_id:V1(),timestamp:new Date().toISOString()}}function V1(){try{let e=fe.molin_shop_assistant_distinct_id;return e||(e=crypto.randomUUID(),fe.molin_shop_assistant_distinct_id=e),e}catch(e){console.error("Failed to deserialize distinct_id:",e);let t=crypto.randomUUID();try{fe.molin_shop_assistant_distinct_id=t}catch(r){console.error("Failed to store new distinct_id:",r)}return t}}function B1(){return{referrer:document.referrer,userAgent:navigator.userAgent,language:navigator.language,screenWidth:window.innerWidth,screenHeight:window.innerHeight,timestamp:new Date().toISOString(),timezoneOffset:new Date().getTimezoneOffset(),doNotTrack:navigator.doNotTrack??void 0}}function lc(){let e=new URL(import.meta.url).hostname;return{localhost:"http://localhost:8787","molin.localhost":"http://molin.localhost:8787","widget.molin.foo":"https://molin.foo","widget.molin.ai":"https://molin.ai","molin.ai":"https://molin.ai","molin.foo":"https://molin.foo"}[e]||"https://molin.ai"}function N1(e,t){try{window.dataLayer=window.dataLayer||[];let r={event:e,link_url:t.url};window.dataLayer.push(r)}catch(r){console.error("Failed to send event to dataLayer:",r)}}var $t,wn,Je,St,Zi,cc,Wi=class{constructor(t,r,n){f(this,Zi);f(this,$t);f(this,wn);f(this,Je);f(this,St);g(this,"isLoading",!1);g(this,"data");m(this,$t,t),m(this,wn,r),m(this,Je,n),t.addController(this)}fetch(){if(this.isLoading)return;a(this,St)?.abort();let t=new AbortController;m(this,St,t),this.isLoading=!0,this.data=void 0,a(this,$t).requestUpdate(),(async()=>{let r=y(this,Zi,cc).call(this);return r.signal?.addEventListener("abort",()=>t.abort(),{signal:t.signal}),fetch(r,{signal:t.signal})})().then(async r=>{if(!r.ok)throw new Error(`${r.statusText}: ${await r.text()}`);this.isLoading=!1,this.data=typeof a(this,Je)?.transform=="function"?await a(this,Je).transform(r):r,a(this,$t).requestUpdate()}).catch(r=>{a(this,Je)?.onError?.(r),this.isLoading=!1,this.data=void 0,a(this,$t).requestUpdate()}).finally(()=>{t.abort()})}hostConnected(){this.isLoading||a(this,Je)?.fetchWhenConnected&&this.fetch()}hostDisconnected(){a(this,St)?.abort(),m(this,St,void 0)}};$t=new WeakMap,wn=new WeakMap,Je=new WeakMap,St=new WeakMap,Zi=new WeakSet,cc=function(){let t=a(this,wn);if(typeof t=="function"&&(t=t()),!t)throw new Error("missing request");return new Request(t)};var ve,vn,hr,dr,Ke=class{constructor(t,r){f(this,ve);f(this,vn);f(this,hr);f(this,dr);m(this,ve,t),m(this,vn,r),t.addController(this)}get data(){return a(this,dr)||a(this,hr)?.data}hostConnected(){if(a(this,hr)||a(this,dr))return;let t=pc();t&&t.widgetId===a(this,ve).widgetId?m(this,dr,t.config):m(this,hr,new Wi(a(this,ve),()=>{if(a(this,ve).cdn&&a(this,ve).widgetId)return`${a(this,ve).cdn}/config?w=${a(this,ve).widgetId}`;throw new Error("missing cdn or widgetId")},{fetchWhenConnected:!0,transform:async r=>{let n=await r.json();return n&&!t&&window.__INIT_MOLIN_SHOP_AI({cdn:a(this,ve).cdn,widgetId:a(this,ve).widgetId,config:n}),n},onError:a(this,vn)?.onError}))}};ve=new WeakMap,vn=new WeakMap,hr=new WeakMap,dr=new WeakMap;function Xe(){return window.molinSettings&&typeof window.molinSettings=="object"?window.molinSettings:null}var Gi,kn,Ji,Ve,hc,xn,bn=class bn extends I(_){constructor(){super();f(this,Ve);f(this,Gi,new Ke(this,{onError:console.error}));f(this,kn);f(this,Ji,{onError:r=>{alert(r.error),console.error(r.widgetId,r.error),F("ShopAssistant: error",{...r},{immediate:!0})},onNewMessageStartedStreaming:r=>{F("ShopAssistant: user received bot message (streaming started)",r)},onMessageEndedStreaming:r=>{F("ShopAssistant: user received bot message (streaming ended)",r)},onUserCanceledStreaming:r=>{F("ShopAssistant: user canceled streaming",r)},onUserClickedLink:r=>{F("ShopAssistant: user clicked link",r)},onUserSentInput:r=>{F("ShopAssistant: user sent input",r)}});this.cdn="https://widget.molin.ai",this.widgetId="",this.showClose=!1,this.xUserData=Xe()?.userData,this.xCustomInstructions=Xe()?.customInstructions}get config(){return a(this,kn)||a(this,Gi).data}render(){return this.config?d`
|
|
1913
1913
|
<mw-context-widget .widgetId="${this.widgetId}" .config="${this.config}" .callbacks="${a(this,Ji)}" .xUserData="${this.xUserData}" .xCustomInstructions="${this.xCustomInstructions}">
|
|
1914
1914
|
<!-- embed our chat component forwarding props -->
|
|
1915
1915
|
<mw-chat ?show-close="${this.showClose}" @mw:close-click="${y(this,Ve,hc)}">
|