@sentientui/core 0.8.0 → 0.8.1

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.
@@ -0,0 +1 @@
1
+ import{a as R,b as K,c as B,d as G,e as Q,f as F}from"./chunk-QCYVBCUV.mjs";var ne="_snt_uid";var T="_snt_uid";function se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ie(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function re(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(r){}}function oe(e){try{return localStorage.getItem(e)}catch(t){return null}}function ae(e,t){try{return localStorage.setItem(e,t),!0}catch(a){return!1}}function ce(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function le(e,t){try{return sessionStorage.setItem(e,t),!0}catch(a){return!1}}function de(e){try{sessionStorage.removeItem(e)}catch(t){}}function ue(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function ge(e){try{localStorage.removeItem(e)}catch(t){}}function pe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var fe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function H(e){var p,f,m,y,S,v;if(typeof window=="undefined")return fe;let t=(p=e==null?void 0:e.cookieName)!=null?p:ne,r=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,c=(v=(S=(y=(m=ie(t))!=null?m:oe(T))!=null?y:ce(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:se();re(t,c,r);let o=ae(T,c),i=ue(t),n=o?!1:le(T,c),s=!o&&!i&&!n;return{getSessionId:()=>c,isEphemeral:()=>s,destroy:()=>{c=null,pe(t),ge(T),de(T)}}}var me={push:()=>{},flush:()=>{},destroy:()=>{}};function he(e,t){try{let a=localStorage.getItem(t);if(!a)return[];let r=JSON.parse(a);return Array.isArray(r)?(localStorage.removeItem(t),r.slice(-e)):[]}catch(a){return[]}}function z(e,t,a){try{let c=[...(()=>{try{let o=localStorage.getItem(a);if(!o)return[];let i=JSON.parse(o);return Array.isArray(i)?i:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(a,JSON.stringify(c))}catch(r){}}function V(e){var k,_,D;if(typeof window=="undefined")return me;let t=(k=e.flushIntervalMs)!=null?k:5e3,a=(_=e.maxBatchSize)!=null?_:20,r=(D=e.maxRetrySize)!=null?D:100,c=e.ingestUrl,o=e.apiKey,i=`_snt_retry_${o.slice(0,12)}`,n=[],s=new Set,p=[],f=l=>{for(let g of l)m.delete(g),!s.has(g)&&(s.add(g),p.push(g));for(;p.length>500;){let g=p.shift();g&&s.delete(g)}},m=new Set,y=l=>{s.has(l.id)||m.has(l.id)||(m.add(l.id),n.push(l))},S=he(r,i);for(let l of S)y(l);let v=0,x=0,L=l=>{if(l.length===0)return;let g=JSON.stringify(l),w=l.map(b=>b.id),E;try{E=fetch(c,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(b){z(l,r,i);for(let W of w)m.delete(W);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=b=>{if(b.ok||b.status>=400&&b.status<500&&b.status!==429){f(w),x=0,v=0;return}z(l,r,i);for(let W of w)m.delete(W);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{z(l,r,i);for(let b of w)m.delete(b);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},A=typeof TextEncoder!="undefined"?new TextEncoder:null,N=l=>A?A.encode(l).length:l.length,$=l=>{let g=[],w=2;for(let E of l){let O=N(JSON.stringify(E))+1;if(g.length>0&&w+O>57344||g.length>=a)break;g.push(E),w+=O}return g},I=()=>{try{if(Date.now()<v)return;for(;n.length>0;){let l=n.filter(w=>!s.has(w.id));if(n.length=0,l.length===0)break;let g=$(l);if(g.length===0)break;g.length<l.length&&n.push(...l.slice(g.length)),L(g)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&I()},t);let h=()=>{document.visibilityState==="hidden"&&I()},C=()=>{I()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),n.length>=a&&I()},flush:I,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),I()}}}var j="_snt_asgn_";function P(e,t){return`${e}:${t}`}function ye(e,t){return`${j}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function Y(e){let t=e.slice(j.length),a=t.indexOf(":");if(a<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,a)),segment:decodeURIComponent(t.slice(a+1))}}catch(r){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let a=localStorage.key(t);a!=null&&a.startsWith(j)&&e.push(a)}return e}catch(e){return[]}}function q(e=18e5){let t=new Map,a=c=>c.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let c of J())try{let o=localStorage.getItem(c);if(!o)continue;let i=JSON.parse(o);if(a(i)){localStorage.removeItem(c);continue}let n=Y(c);if(!n)continue;t.set(P(n.componentId,n.segment),i)}catch(o){}})(),{get(c,o){let i=t.get(P(c,o));return i?a(i)?(t.delete(P(c,o)),null):i:null},set(c,o,i){let n=P(c,o);t.set(n,i);try{localStorage.setItem(ye(c,o),JSON.stringify(i))}catch(s){}},invalidate(c){let o=`${c}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of J()){let n=Y(i);if((n==null?void 0:n.componentId)===c)try{localStorage.removeItem(i)}catch(s){}}},clear(){t.clear();for(let c of J())try{localStorage.removeItem(c)}catch(o){}}}}function Se(e,t,a){var c;let r=[];{let n=!1,s=[],p=()=>{if(n)return;let f=Date.now();for(s.push(f);s.length>0&&f-s[0]>500;)s.shift();s.length>=3&&(n=!0,e("rage_click"))};t.addEventListener("click",p),r.push(()=>t.removeEventListener("click",p))}{let o=!1,i=n=>{if(o||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;o=!0;let s=typeof window!="undefined"?window.getSelection():null,p=s?s.toString().length:0;e("text_copy",{selectionLength:p})};document.addEventListener("copy",i),r.push(()=>document.removeEventListener("copy",i))}{let o=!1,i=!1,n=null,s=()=>{n!==null&&(clearTimeout(n),n=null)},p=()=>{o||!i||(s(),n=setTimeout(()=>{!o&&i&&(o=!0,e("scroll_hesitation"))},3e3))},f=()=>{s(),p()},m=S=>{for(let v of S)i=v.intersectionRatio>.3,i?p():s()};typeof process!="undefined"&&((c=process.env)==null?void 0:c.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),r.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),s()})}{let o=!1,i=a!=null?a:Date.now(),n=()=>{if(o||document.visibilityState!=="hidden")return;let s=Date.now()-i;s<15e3&&(o=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",n),r.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let o of r)o()}}var Z="https://api.sentient-ui.com/v1/events",M=new Map,ee=null;function X(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var U={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function ve(){try{let e={},t=new URLSearchParams(window.location.search);for(let[a,r]of t)a.startsWith("utm_")&&(e[a]=r);return e}catch(e){return{}}}function te(e){return e.replace(/\/events\/?$/,"")}function Oe(e){if(typeof window=="undefined")return;let t=e!=null?e:ee;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let a=M.get(t);if(!a){console.warn("[sentient] grantConsent() called before init()");return}let{config:r,upgrade:c}=a;if(!c)return;let o=Ee(K(R({},r),{consent:!0}));c(o),M.set(t,{config:K(R({},r),{consent:!0}),upgrade:null})}function we(e){var i;let t=te((i=e.ingestUrl)!=null?i:Z),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(n,s,p){try{let f=new URLSearchParams({componentId:n});for(let S of s!=null?s:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:a});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(f){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},c={track:n=>r.track(n),goal:(n,s,p,f)=>r.goal(n,s,p,f),identify:n=>r.identify(n),getAssignment:(n,s)=>r.getAssignment(n,s),assign:(n,s,p,f)=>r.assign(n,s,p,f),fetchWeights:()=>r.fetchWeights(),getGraph:()=>r.getGraph(),destroy:()=>r.destroy()};function o(n){r=n}return{proxy:c,setInner:o}}function Ee(e){var L,A,N,$,I;if(typeof window=="undefined")return U;if(ee=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;let{proxy:d,setInner:u}=we(e);return M.set(e.apiKey,{config:e,upgrade:u}),d}return M.set(e.apiKey,{config:e,upgrade:null}),U}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),U;let t=(L=e.ingestUrl)!=null?L:Z,a=Date.now(),r=H({ssrSessionId:e.ssrSessionId}),c=q(),o=V({ingestUrl:t,apiKey:e.apiKey}),i=te(t),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=B((A=navigator.userAgent)!=null?A:""),p=typeof window!="undefined"?window.location.origin:void 0,f=G((N=document.referrer)!=null?N:"",p),m=($=e.sessionSegment)!=null?$:`${s}:${f}`,y=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))c.set(d,m,{variantId:u,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=r.getSessionId();if(v){let d=Q((I=document.referrer)!=null?I:""),u=R({sessionId:v,deviceClass:s,trafficSource:f,referrerDomain:d,utmParams:ve(),timeOfDay:F(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:r.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:n}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let x={goal(d,u={},h=1,C=0){let k=r.getSessionId();if(!k)return;let _=X();S.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:d,metadata:u,weight:h,stepIndex:C,goalId:_}),headers:n}).catch(()=>{})})},identify(d){let u=r.getSessionId();u&&S.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:r.isEphemeral()}),headers:n}).catch(()=>{})})},track(d){let u=r.getSessionId();if(!u)return;let h=K(R({},d),{id:X(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-a});o.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(d,u){return c.get(d,u)},async assign(d,u,h,C){let k=r.getSessionId();if(!k)return null;let _=c.get(d,m);if(_&&(u!=null&&u.length||_.content!==void 0))return{variantId:_.variantId,assignmentTtlMs:0,content:_.content};let D=y.get(d);if(D)return D;let l=(async()=>{await S;try{let g={sessionId:k,componentId:d,variantIds:u};C!==void 0?g.agentDataByVariant=C:h!==void 0&&(g.agentData=h);let w=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify(g),headers:n});if(!w.ok)return null;let E=await w.json();return c.set(d,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(g){return null}finally{y.delete(d)}})();return y.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${i}/weights`,{headers:n});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),r.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(M.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=x)}return x}export{Se as a,Oe as b,Ee as c};
@@ -1 +1 @@
1
- "use strict";var W=Object.defineProperty,pe=Object.defineProperties,fe=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols;var te=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ee=(e,t,n)=>t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(e,t)=>{for(var n in t||(t={}))te.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))ye.call(t,n)&&ee(e,n,t[n]);return e},B=(e,t)=>pe(e,me(t));var Se=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of he(t))!te.call(e,s)&&s!==n&&W(e,s,{get:()=>t[s],enumerable:!(d=fe(t,s))||d.enumerable});return e};var we=e=>ve(W({},"__esModule",{value:!0}),e);var it={};Se(it,{deriveSessionSegment:()=>H,detectDeviceClass:()=>O,detectTimeOfDay:()=>U,detectTrafficSource:()=>R,init:()=>st,referrerDomainFromReferer:()=>M});module.exports=we(it);var Ee="_snt_uid";var N="_snt_uid";function Ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function be(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function Ce(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(d){}}function xe(e){try{return localStorage.getItem(e)}catch(t){return null}}function _e(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Te(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function Ae(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function ke(e){try{sessionStorage.removeItem(e)}catch(t){}}function De(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ne(e){try{localStorage.removeItem(e)}catch(t){}}function Oe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Re={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function ne(e){var c,u,g,h,l,y;if(typeof window=="undefined")return Re;let t=(c=e==null?void 0:e.cookieName)!=null?c:Ee,d=((u=e==null?void 0:e.cookieTTLDays)!=null?u:365)*24*60*60,s=(y=(l=(h=(g=be(t))!=null?g:xe(N))!=null?h:Te(N))!=null?l:e==null?void 0:e.ssrSessionId)!=null?y:Ie();Ce(t,s,d);let i=_e(N,s),r=De(t),a=i?!1:Ae(N,s),o=!i&&!r&&!a;return{getSessionId:()=>s,isEphemeral:()=>o,destroy:()=>{s=null,Oe(t),Ne(N),ke(N)}}}var Me={push:()=>{},flush:()=>{},destroy:()=>{}};function Ue(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let d=JSON.parse(n);return Array.isArray(d)?(localStorage.removeItem(t),d.slice(-e)):[]}catch(n){return[]}}function J(e,t,n){try{let s=[...(()=>{try{let i=localStorage.getItem(n);if(!i)return[];let r=JSON.parse(i);return Array.isArray(r)?r:[]}catch(i){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(s))}catch(d){}}function re(e){var A,C,P;if(typeof window=="undefined")return Me;let t=(A=e.flushIntervalMs)!=null?A:5e3,n=(C=e.maxBatchSize)!=null?C:20,d=(P=e.maxRetrySize)!=null?P:100,s=e.ingestUrl,i=e.apiKey,r=`_snt_retry_${i.slice(0,12)}`,a=[],o=new Set,c=[],u=p=>{for(let S of p)g.delete(S),!o.has(S)&&(o.add(S),c.push(S));for(;c.length>500;){let S=c.shift();S&&o.delete(S)}},g=new Set,h=p=>{o.has(p.id)||g.has(p.id)||(g.add(p.id),a.push(p))},l=Ue(d,r);for(let p of l)h(p);let y=0,v=0,_=p=>{if(p.length===0)return;let S=JSON.stringify(p),E=p.map(x=>x.id),I;try{I=fetch(s,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(x){J(p,d,r);for(let z of E)g.delete(z);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let L=x=>{if(x.ok||x.status>=400&&x.status<500&&x.status!==429){u(E),v=0,y=0;return}J(p,d,r);for(let z of E)g.delete(z);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};I instanceof Promise?I.then(L).catch(()=>{J(p,d,r);for(let x of E)g.delete(x);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):L(I)},T=typeof TextEncoder!="undefined"?new TextEncoder:null,G=p=>T?T.encode(p).length:p.length,K=p=>{let S=[],E=2;for(let I of p){let L=G(JSON.stringify(I))+1;if(S.length>0&&E+L>57344||S.length>=n)break;S.push(I),E+=L}return S},b=()=>{try{if(Date.now()<y)return;for(;a.length>0;){let p=a.filter(E=>!o.has(E.id));if(a.length=0,p.length===0)break;let S=K(p);if(S.length===0)break;S.length<p.length&&a.push(...p.slice(S.length)),_(S)}}catch(p){}},f=!0,m=null;m=setInterval(()=>{f&&b()},t);let w=()=>{document.visibilityState==="hidden"&&b()},k=()=>{b()};return document.addEventListener("visibilitychange",w),window.addEventListener("beforeunload",k),{push(p){h(p),a.length>=n&&b()},flush:b,destroy(){f=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",w),window.removeEventListener("beforeunload",k),b()}}}var j="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Pe(e,t){return`${j}${e}_${t}`}function Q(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(j)&&e.push(n)}return e}catch(e){return[]}}function oe(e=18e5){let t=new Map,n=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of Q())try{let i=localStorage.getItem(s);if(!i)continue;let r=JSON.parse(i);if(n(r)){localStorage.removeItem(s);continue}let a=s.slice(j.length),o=a.lastIndexOf("_");if(o<0)continue;let c=a.slice(0,o),u=a.slice(o+1);t.set(F(c,u),r)}catch(i){}})(),{get(s,i){let r=t.get(F(s,i));return r?n(r)?(t.delete(F(s,i)),null):r:null},set(s,i,r){let a=F(s,i);t.set(a,r);try{localStorage.setItem(Pe(s,i),JSON.stringify(r))}catch(o){}},invalidate(s){let i=`${s}:`;for(let r of[...t.keys()])r.startsWith(i)&&t.delete(r);for(let r of Q()){let a=r.slice(j.length),o=a.lastIndexOf("_");if(o<0)continue;if(a.slice(0,o)===s)try{localStorage.removeItem(r)}catch(u){}}},clear(){t.clear();for(let s of Q())try{localStorage.removeItem(s)}catch(i){}}}}function O(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function R(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(s){}let d=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(d)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(d)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function U(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=Le("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Le(e,t){var i,r,a,o,c,u,g;let n=(r=(i=t==null?void 0:t.userAgent)==null?void 0:i.trim())!=null?r:"",d=(o=(a=t==null?void 0:t.referer)==null?void 0:a.trim())!=null?o:"",s=(c=t==null?void 0:t.now)!=null?c:new Date;return{sessionId:e,ephemeral:!1,utmParams:(u=t==null?void 0:t.utmParams)!=null?u:{},deviceClass:n?O(n):"desktop",trafficSource:d?R(d,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(d),timeOfDay:U(s),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?g:"sun"}}var ie="https://api.sentient-ui.com/v1/events",q=new Map,$e=null;function se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var $={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ge(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,d]of t)n.startsWith("utm_")&&(e[n]=d);return e}catch(e){return{}}}function ae(e){return e.replace(/\/events\/?$/,"")}function Ke(e){var r;let t=ae((r=e.ingestUrl)!=null?r:ie),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(a,o,c){try{let u=new URLSearchParams({componentId:a});for(let l of o!=null?o:[])u.append("variantIds[]",l);let g=await fetch(`${t}/winner?${u.toString()}`,{headers:n});return g.ok?{variantId:(await g.json()).variantId,assignmentTtlMs:0}:o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}catch(u){return o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},s={track:a=>d.track(a),goal:(a,o,c,u)=>d.goal(a,o,c,u),identify:a=>d.identify(a),getAssignment:(a,o)=>d.getAssignment(a,o),assign:(a,o,c,u)=>d.assign(a,o,c,u),fetchWeights:()=>d.fetchWeights(),getGraph:()=>d.getGraph(),destroy:()=>d.destroy()};function i(a){d=a}return{proxy:s,setInner:i}}function ce(e){var _,T,G,K,b;if(typeof window=="undefined")return $;if($e=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;let{proxy:f,setInner:m}=Ke(e);return q.set(e.apiKey,{config:e,upgrade:m}),f}return q.set(e.apiKey,{config:e,upgrade:null}),$}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(_=e.ingestUrl)!=null?_:ie,n=Date.now(),d=ne({ssrSessionId:e.ssrSessionId}),s=oe(),i=re({ingestUrl:t,apiKey:e.apiKey}),r=ae(t),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o=O((T=navigator.userAgent)!=null?T:""),c=typeof window!="undefined"?window.location.origin:void 0,u=R((G=document.referrer)!=null?G:"",c),g=(K=e.sessionSegment)!=null?K:`${o}:${u}`,h=new Map;if(e.initialAssignments)for(let[f,m]of Object.entries(e.initialAssignments))s.set(f,g,{variantId:m,assignedAt:Date.now(),segment:g,confidence:1});let l=Promise.resolve(),y=d.getSessionId();if(y){let f=M((b=document.referrer)!=null?b:""),m=D({sessionId:y,deviceClass:o,trafficSource:u,referrerDomain:f,utmParams:Ge(),timeOfDay:U(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:d.isEphemeral()},e.userId?{userId:e.userId}:{});try{l=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:a}).then(w=>{w.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(w){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let v={goal(f,m={},w=1,k=0){let A=d.getSessionId();if(!A)return;let C=se();l.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:A,name:f,metadata:m,weight:w,stepIndex:k,goalId:C}),headers:a}).catch(()=>{})})},identify(f){let m=d.getSessionId();m&&l.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:f,ephemeral:d.isEphemeral()}),headers:a}).catch(()=>{})})},track(f){let m=d.getSessionId();if(!m)return;let w=B(D({},f),{id:se(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});i.push(w),e.debug&&console.log("[sentient] track",w)},getAssignment(f,m){return s.get(f,m)},async assign(f,m,w,k){let A=d.getSessionId();if(!A)return null;let C=s.get(f,g);if(C&&(m!=null&&m.length||C.content!==void 0))return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let P=h.get(f);if(P)return P;let p=(async()=>{await l;try{let S={sessionId:A,componentId:f,variantIds:m};k!==void 0?S.agentDataByVariant=k:w!==void 0&&(S.agentData=w);let E=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(S),headers:a});if(!E.ok)return null;let I=await E.json();return s.set(f,g,{variantId:I.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:I.content}),I}catch(S){return null}finally{h.delete(f)}})();return h.set(f,p),p},async fetchWeights(){var f;try{let m=await fetch(`${r}/weights`,{headers:a});return m.ok?(f=(await m.json()).components)!=null?f:[]:[]}catch(m){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),d.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(q.set(e.apiKey,{config:e,upgrade:null}),e.debug){let f=window;f.__sentient&&(f.__sentient.client=v)}return v}var We=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Be="h1, h2, h3",Fe={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function V(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function je(e){var t,n,d;try{let s=e;for(let i of Object.keys(s)){if(!i.startsWith("__reactFiber")&&!i.startsWith("__reactInternalInstance"))continue;let r=s[i],a=(d=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?d:(n=r==null?void 0:r.type)==null?void 0:n.name;if(a&&a.length>1)return a}}catch(s){}}function ze(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function Je(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function Qe(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function He(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function Y(e,t){var d,s,i;let n=e.querySelector(Be);return{componentId:Qe(e),semanticType:Je(e),ariaLabel:(d=e.getAttribute("aria-label"))!=null?d:void 0,headingText:(i=(s=n==null?void 0:n.textContent)==null?void 0:s.trim())!=null?i:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:He(e),reactComponentName:je(e),dataAttributes:ze(e)}}function de(e){var i;let t=[],n=new Set,d="__root__",s=new Map;for(let[r,a]of e){let o=r.parentElement,c=d;for(;o;){if(e.has(o)){c=e.get(o);let g=e.get(r),h=`${c}->${g}`;!n.has(h)&&c!==g&&(n.add(h),t.push({fromComponentId:c,toComponentId:g,weight:.6}));break}o=o.parentElement}let u=(i=s.get(c))!=null?i:[];u.push(r),s.set(c,u)}for(let r of s.values())if(!(r.length<2))for(let a=0;a<r.length;a++)for(let o=a+1;o<r.length;o++){let c=e.get(r[a]),u=e.get(r[o]);if(c===u)continue;let g=`${c}->${u}::sib`,h=`${u}->${c}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:c,toComponentId:u,weight:.3})),n.has(h)||(n.add(h),t.push({fromComponentId:u,toComponentId:c,weight:.3}))}return t}function qe(e){let t=[],n=new Set,d=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let a=Y(r,e);t.push(a),d.set(r,a.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let a=r.hasAttribute("aria-label"),o=r.hasAttribute("data-sentient-id");if(!a&&!o)return;n.add(r);let c=Y(r,e);t.push(c),d.set(r,c.componentId)}),{nodes:t,edges:de(d)}}function ue(){if(typeof window=="undefined")return Fe;let e=null,t=0,n=null,d=a=>{try{let o=window.getComputedStyle(a),c=parseFloat(o.fontSize)||12,u=parseFloat(o.zIndex)||0,g=a.getBoundingClientRect(),h=Math.max(g.top,0),l=window.innerHeight||1,y=1/(h/l+1),v=V(c,12,48)*.4+V(y,0,1)*.4+V(u,0,100)*.2;return Math.max(0,Math.min(1,v))}catch(o){return .5}};return{scan:()=>new Promise(a=>{let o=()=>{let{nodes:c,edges:u}=qe(d);a({nodes:c,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(o,{timeout:100}):o()}catch(c){o()}}),observe:a=>{n=a;try{e=new MutationObserver(o=>{let c=[],u=new Map;for(let g of o)g.type==="childList"&&g.addedNodes.forEach(h=>{if(!(h instanceof Element)||!We.has(h.tagName))return;let l=h.hasAttribute("data-sentient-id"),y=h.hasAttribute("aria-label");if(!l&&!y)return;let v=Y(h,d);c.push(v),u.set(h,v.componentId)});c.length>0&&n&&n({nodes:c,edges:de(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(o){}},getProminenceScore:d,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(a){}t=0,n=null}}}var X="_snt_graph_nodes",le="_snt_graph_edges",Ve={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Ye(e){var t;return(t=Ve[e])!=null?t:[]}function Xe(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function Ze(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var et=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function tt(e){return et.has(e)?e:"generic"}function nt(e,t,n){let d=`${e}:${t}:${n.join(",")}`,s=5381;for(let i=0;i<d.length;i++)s=(s<<5)+s+d.charCodeAt(i)&4294967295;return(s>>>0).toString(16).padStart(8,"0")}function ge(e){let t=new Map,n=new Map,d=()=>{typeof window!="undefined"&&Ze(X,[...t.values()])},s=i=>{var r;try{let a=JSON.parse(i);t.clear();for(let o of(r=a.pageNodes)!=null?r:[])t.set(o.componentId,o)}catch(a){}};if(typeof window!="undefined"){let i=Xe(X,[]);for(let r of i)t.set(r.componentId,r);try{localStorage.removeItem(le)}catch(r){}}return{addPageNode(i){t.set(i.componentId,i),d()},addStructuralEdge(i){let r=`${i.fromComponentId}->${i.toComponentId}`;n.set(r,i)},syncOnce(){var r,a;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let i=[...t.values()];if(i.length!==0)try{let o=new Map;for(let l of i){let y=(r=o.get(l.semanticType))!=null?r:[];y.push(l),o.set(l.semanticType,y)}let c=[],u=new Set;for(let l of i)for(let y of Ye(l.semanticType)){let v=(a=o.get(y))!=null?a:[];for(let _ of v){if(_.componentId===l.componentId)continue;let T=`semantic:${l.componentId}->${_.componentId}`;u.has(T)||(u.add(T),c.push({fromComponentId:l.componentId,toComponentId:_.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(i.map(l=>l.componentId));for(let l of n.values()){if(!g.has(l.fromComponentId)||!g.has(l.toComponentId))continue;let y=`structural:${l.fromComponentId}->${l.toComponentId}`;u.has(y)||(u.add(y),c.push({fromComponentId:l.fromComponentId,toComponentId:l.toComponentId,type:"structural",weight:l.weight,confidence:1}))}let h={pageUrl:window.location.href,nodes:i.map(l=>{let y=tt(l.semanticType);return{componentId:l.componentId,semanticType:y,answers:l.answers,contentHash:nt(l.componentId,y,l.answers),prominenceScore:l.prominenceScore,depthInPage:l.depth}}),edges:c};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:D({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(h)}).catch(()=>{})}catch(o){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:s,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(X),localStorage.removeItem(le)}catch(i){}}}}var rt="https://api.sentient-ui.com/v1/events";function ot(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function st(e){var a;let t=ce(e);if(!e.graph||typeof window=="undefined")return t;let n=ue(),d=(a=e.ingestUrl)!=null?a:rt,s=ge({syncUrl:d.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:ot()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&s.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}n.scan().then(o=>{for(let c of o.nodes)s.addPageNode({id:c.componentId,componentId:c.componentId,semanticType:c.semanticType,answers:c.headingText?[c.headingText]:[],prominenceScore:c.prominenceScore,depth:c.depth});for(let c of o.edges)s.addStructuralEdge(c);s.syncOnce()});let i=null,r=()=>{i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null,s.syncOnce()},500)};return n.observe(o=>{for(let c of o.nodes)s.addPageNode({id:c.componentId,componentId:c.componentId,semanticType:c.semanticType,answers:c.headingText?[c.headingText]:[],prominenceScore:c.prominenceScore,depth:c.depth});for(let c of o.edges)s.addStructuralEdge(c);r()}),B(D({},t),{getGraph:()=>s.snapshot(),destroy:()=>{i!==null&&clearTimeout(i),n.destroy(),s.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
1
+ "use strict";var W=Object.defineProperty,fe=Object.defineProperties,me=Object.getOwnPropertyDescriptor,he=Object.getOwnPropertyDescriptors,ye=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols;var te=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable;var ee=(e,t,n)=>t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(e,t)=>{for(var n in t||(t={}))te.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))Se.call(t,n)&&ee(e,n,t[n]);return e},B=(e,t)=>fe(e,he(t));var ve=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ye(t))!te.call(e,s)&&s!==n&&W(e,s,{get:()=>t[s],enumerable:!(c=me(t,s))||c.enumerable});return e};var Ee=e=>we(W({},"__esModule",{value:!0}),e);var at={};ve(at,{deriveSessionSegment:()=>H,detectDeviceClass:()=>O,detectTimeOfDay:()=>U,detectTrafficSource:()=>R,init:()=>it,referrerDomainFromReferer:()=>M});module.exports=Ee(at);var Ie="_snt_uid";var N="_snt_uid";function be(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function Ce(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function xe(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(c){}}function _e(e){try{return localStorage.getItem(e)}catch(t){return null}}function Te(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Ae(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ke(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function De(e){try{sessionStorage.removeItem(e)}catch(t){}}function Ne(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Oe(e){try{localStorage.removeItem(e)}catch(t){}}function Re(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Me={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function ne(e){var d,l,g,h,u,y;if(typeof window=="undefined")return Me;let t=(d=e==null?void 0:e.cookieName)!=null?d:Ie,c=((l=e==null?void 0:e.cookieTTLDays)!=null?l:365)*24*60*60,s=(y=(u=(h=(g=Ce(t))!=null?g:_e(N))!=null?h:Ae(N))!=null?u:e==null?void 0:e.ssrSessionId)!=null?y:be();xe(t,s,c);let a=Te(N,s),r=Ne(t),i=a?!1:ke(N,s),o=!a&&!r&&!i;return{getSessionId:()=>s,isEphemeral:()=>o,destroy:()=>{s=null,Re(t),Oe(N),De(N)}}}var Ue={push:()=>{},flush:()=>{},destroy:()=>{}};function Pe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let c=JSON.parse(n);return Array.isArray(c)?(localStorage.removeItem(t),c.slice(-e)):[]}catch(n){return[]}}function z(e,t,n){try{let s=[...(()=>{try{let a=localStorage.getItem(n);if(!a)return[];let r=JSON.parse(a);return Array.isArray(r)?r:[]}catch(a){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(s))}catch(c){}}function re(e){var A,C,P;if(typeof window=="undefined")return Ue;let t=(A=e.flushIntervalMs)!=null?A:5e3,n=(C=e.maxBatchSize)!=null?C:20,c=(P=e.maxRetrySize)!=null?P:100,s=e.ingestUrl,a=e.apiKey,r=`_snt_retry_${a.slice(0,12)}`,i=[],o=new Set,d=[],l=p=>{for(let S of p)g.delete(S),!o.has(S)&&(o.add(S),d.push(S));for(;d.length>500;){let S=d.shift();S&&o.delete(S)}},g=new Set,h=p=>{o.has(p.id)||g.has(p.id)||(g.add(p.id),i.push(p))},u=Pe(c,r);for(let p of u)h(p);let y=0,v=0,_=p=>{if(p.length===0)return;let S=JSON.stringify(p),E=p.map(x=>x.id),I;try{I=fetch(s,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`}})}catch(x){z(p,c,r);for(let j of E)g.delete(j);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let L=x=>{if(x.ok||x.status>=400&&x.status<500&&x.status!==429){l(E),v=0,y=0;return}z(p,c,r);for(let j of E)g.delete(j);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};I instanceof Promise?I.then(L).catch(()=>{z(p,c,r);for(let x of E)g.delete(x);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):L(I)},T=typeof TextEncoder!="undefined"?new TextEncoder:null,K=p=>T?T.encode(p).length:p.length,G=p=>{let S=[],E=2;for(let I of p){let L=K(JSON.stringify(I))+1;if(S.length>0&&E+L>57344||S.length>=n)break;S.push(I),E+=L}return S},b=()=>{try{if(Date.now()<y)return;for(;i.length>0;){let p=i.filter(E=>!o.has(E.id));if(i.length=0,p.length===0)break;let S=G(p);if(S.length===0)break;S.length<p.length&&i.push(...p.slice(S.length)),_(S)}}catch(p){}},f=!0,m=null;m=setInterval(()=>{f&&b()},t);let w=()=>{document.visibilityState==="hidden"&&b()},k=()=>{b()};return document.addEventListener("visibilitychange",w),window.addEventListener("beforeunload",k),{push(p){h(p),i.length>=n&&b()},flush:b,destroy(){f=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",w),window.removeEventListener("beforeunload",k),b()}}}var Q="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Le(e,t){return`${Q}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function oe(e){let t=e.slice(Q.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(c){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(Q)&&e.push(n)}return e}catch(e){return[]}}function se(e=18e5){let t=new Map,n=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of J())try{let a=localStorage.getItem(s);if(!a)continue;let r=JSON.parse(a);if(n(r)){localStorage.removeItem(s);continue}let i=oe(s);if(!i)continue;t.set(F(i.componentId,i.segment),r)}catch(a){}})(),{get(s,a){let r=t.get(F(s,a));return r?n(r)?(t.delete(F(s,a)),null):r:null},set(s,a,r){let i=F(s,a);t.set(i,r);try{localStorage.setItem(Le(s,a),JSON.stringify(r))}catch(o){}},invalidate(s){let a=`${s}:`;for(let r of[...t.keys()])r.startsWith(a)&&t.delete(r);for(let r of J()){let i=oe(r);if((i==null?void 0:i.componentId)===s)try{localStorage.removeItem(r)}catch(o){}}},clear(){t.clear();for(let s of J())try{localStorage.removeItem(s)}catch(a){}}}}function O(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function R(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(s){}let c=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(c)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(c)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function U(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=$e("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function $e(e,t){var a,r,i,o,d,l,g;let n=(r=(a=t==null?void 0:t.userAgent)==null?void 0:a.trim())!=null?r:"",c=(o=(i=t==null?void 0:t.referer)==null?void 0:i.trim())!=null?o:"",s=(d=t==null?void 0:t.now)!=null?d:new Date;return{sessionId:e,ephemeral:!1,utmParams:(l=t==null?void 0:t.utmParams)!=null?l:{},deviceClass:n?O(n):"desktop",trafficSource:c?R(c,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(c),timeOfDay:U(s),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?g:"sun"}}var ae="https://api.sentient-ui.com/v1/events",q=new Map,Ke=null;function ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var $={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ge(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,c]of t)n.startsWith("utm_")&&(e[n]=c);return e}catch(e){return{}}}function ce(e){return e.replace(/\/events\/?$/,"")}function We(e){var r;let t=ce((r=e.ingestUrl)!=null?r:ae),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(i,o,d){try{let l=new URLSearchParams({componentId:i});for(let u of o!=null?o:[])l.append("variantIds[]",u);let g=await fetch(`${t}/winner?${l.toString()}`,{headers:n});return g.ok?{variantId:(await g.json()).variantId,assignmentTtlMs:0}:o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}catch(l){return o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},s={track:i=>c.track(i),goal:(i,o,d,l)=>c.goal(i,o,d,l),identify:i=>c.identify(i),getAssignment:(i,o)=>c.getAssignment(i,o),assign:(i,o,d,l)=>c.assign(i,o,d,l),fetchWeights:()=>c.fetchWeights(),getGraph:()=>c.getGraph(),destroy:()=>c.destroy()};function a(i){c=i}return{proxy:s,setInner:a}}function de(e){var _,T,K,G,b;if(typeof window=="undefined")return $;if(Ke=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;let{proxy:f,setInner:m}=We(e);return q.set(e.apiKey,{config:e,upgrade:m}),f}return q.set(e.apiKey,{config:e,upgrade:null}),$}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(_=e.ingestUrl)!=null?_:ae,n=Date.now(),c=ne({ssrSessionId:e.ssrSessionId}),s=se(),a=re({ingestUrl:t,apiKey:e.apiKey}),r=ce(t),i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o=O((T=navigator.userAgent)!=null?T:""),d=typeof window!="undefined"?window.location.origin:void 0,l=R((K=document.referrer)!=null?K:"",d),g=(G=e.sessionSegment)!=null?G:`${o}:${l}`,h=new Map;if(e.initialAssignments)for(let[f,m]of Object.entries(e.initialAssignments))s.set(f,g,{variantId:m,assignedAt:Date.now(),segment:g,confidence:1});let u=Promise.resolve(),y=c.getSessionId();if(y){let f=M((b=document.referrer)!=null?b:""),m=D({sessionId:y,deviceClass:o,trafficSource:l,referrerDomain:f,utmParams:Ge(),timeOfDay:U(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:c.isEphemeral()},e.userId?{userId:e.userId}:{});try{u=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:i}).then(w=>{w.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(w){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:a});let v={goal(f,m={},w=1,k=0){let A=c.getSessionId();if(!A)return;let C=ie();u.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:A,name:f,metadata:m,weight:w,stepIndex:k,goalId:C}),headers:i}).catch(()=>{})})},identify(f){let m=c.getSessionId();m&&u.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:f,ephemeral:c.isEphemeral()}),headers:i}).catch(()=>{})})},track(f){let m=c.getSessionId();if(!m)return;let w=B(D({},f),{id:ie(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});a.push(w),e.debug&&console.log("[sentient] track",w)},getAssignment(f,m){return s.get(f,m)},async assign(f,m,w,k){let A=c.getSessionId();if(!A)return null;let C=s.get(f,g);if(C&&(m!=null&&m.length||C.content!==void 0))return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let P=h.get(f);if(P)return P;let p=(async()=>{await u;try{let S={sessionId:A,componentId:f,variantIds:m};k!==void 0?S.agentDataByVariant=k:w!==void 0&&(S.agentData=w);let E=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(S),headers:i});if(!E.ok)return null;let I=await E.json();return s.set(f,g,{variantId:I.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:I.content}),I}catch(S){return null}finally{h.delete(f)}})();return h.set(f,p),p},async fetchWeights(){var f;try{let m=await fetch(`${r}/weights`,{headers:i});return m.ok?(f=(await m.json()).components)!=null?f:[]:[]}catch(m){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){a.destroy(),c.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(q.set(e.apiKey,{config:e,upgrade:null}),e.debug){let f=window;f.__sentient&&(f.__sentient.client=v)}return v}var Be=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Fe="h1, h2, h3",je={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function V(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function ze(e){var t,n,c;try{let s=e;for(let a of Object.keys(s)){if(!a.startsWith("__reactFiber")&&!a.startsWith("__reactInternalInstance"))continue;let r=s[a],i=(c=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?c:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(s){}}function Je(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function Qe(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function He(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function qe(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function Y(e,t){var c,s,a;let n=e.querySelector(Fe);return{componentId:He(e),semanticType:Qe(e),ariaLabel:(c=e.getAttribute("aria-label"))!=null?c:void 0,headingText:(a=(s=n==null?void 0:n.textContent)==null?void 0:s.trim())!=null?a:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:qe(e),reactComponentName:ze(e),dataAttributes:Je(e)}}function ue(e){var a;let t=[],n=new Set,c="__root__",s=new Map;for(let[r,i]of e){let o=r.parentElement,d=c;for(;o;){if(e.has(o)){d=e.get(o);let g=e.get(r),h=`${d}->${g}`;!n.has(h)&&d!==g&&(n.add(h),t.push({fromComponentId:d,toComponentId:g,weight:.6}));break}o=o.parentElement}let l=(a=s.get(d))!=null?a:[];l.push(r),s.set(d,l)}for(let r of s.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let o=i+1;o<r.length;o++){let d=e.get(r[i]),l=e.get(r[o]);if(d===l)continue;let g=`${d}->${l}::sib`,h=`${l}->${d}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:d,toComponentId:l,weight:.3})),n.has(h)||(n.add(h),t.push({fromComponentId:l,toComponentId:d,weight:.3}))}return t}function Ve(e){let t=[],n=new Set,c=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=Y(r,e);t.push(i),c.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),o=r.hasAttribute("data-sentient-id");if(!i&&!o)return;n.add(r);let d=Y(r,e);t.push(d),c.set(r,d.componentId)}),{nodes:t,edges:ue(c)}}function le(){if(typeof window=="undefined")return je;let e=null,t=0,n=null,c=i=>{try{let o=window.getComputedStyle(i),d=parseFloat(o.fontSize)||12,l=parseFloat(o.zIndex)||0,g=i.getBoundingClientRect(),h=Math.max(g.top,0),u=window.innerHeight||1,y=1/(h/u+1),v=V(d,12,48)*.4+V(y,0,1)*.4+V(l,0,100)*.2;return Math.max(0,Math.min(1,v))}catch(o){return .5}};return{scan:()=>new Promise(i=>{let o=()=>{let{nodes:d,edges:l}=Ve(c);i({nodes:d,edges:l,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(o,{timeout:100}):o()}catch(d){o()}}),observe:i=>{n=i;try{e=new MutationObserver(o=>{let d=[],l=new Map;for(let g of o)g.type==="childList"&&g.addedNodes.forEach(h=>{if(!(h instanceof Element)||!Be.has(h.tagName))return;let u=h.hasAttribute("data-sentient-id"),y=h.hasAttribute("aria-label");if(!u&&!y)return;let v=Y(h,c);d.push(v),l.set(h,v.componentId)});d.length>0&&n&&n({nodes:d,edges:ue(l),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(o){}},getProminenceScore:c,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var X="_snt_graph_nodes",ge="_snt_graph_edges",Ye={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Xe(e){var t;return(t=Ye[e])!=null?t:[]}function Ze(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function et(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var tt=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function nt(e){return tt.has(e)?e:"generic"}function rt(e,t,n){let c=`${e}:${t}:${n.join(",")}`,s=5381;for(let a=0;a<c.length;a++)s=(s<<5)+s+c.charCodeAt(a)&4294967295;return(s>>>0).toString(16).padStart(8,"0")}function pe(e){let t=new Map,n=new Map,c=()=>{typeof window!="undefined"&&et(X,[...t.values()])},s=a=>{var r;try{let i=JSON.parse(a);t.clear();for(let o of(r=i.pageNodes)!=null?r:[])t.set(o.componentId,o)}catch(i){}};if(typeof window!="undefined"){let a=Ze(X,[]);for(let r of a)t.set(r.componentId,r);try{localStorage.removeItem(ge)}catch(r){}}return{addPageNode(a){t.set(a.componentId,a),c()},addStructuralEdge(a){let r=`${a.fromComponentId}->${a.toComponentId}`;n.set(r,a)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let a=[...t.values()];if(a.length!==0)try{let o=new Map;for(let u of a){let y=(r=o.get(u.semanticType))!=null?r:[];y.push(u),o.set(u.semanticType,y)}let d=[],l=new Set;for(let u of a)for(let y of Xe(u.semanticType)){let v=(i=o.get(y))!=null?i:[];for(let _ of v){if(_.componentId===u.componentId)continue;let T=`semantic:${u.componentId}->${_.componentId}`;l.has(T)||(l.add(T),d.push({fromComponentId:u.componentId,toComponentId:_.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(a.map(u=>u.componentId));for(let u of n.values()){if(!g.has(u.fromComponentId)||!g.has(u.toComponentId))continue;let y=`structural:${u.fromComponentId}->${u.toComponentId}`;l.has(y)||(l.add(y),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let h={pageUrl:window.location.href,nodes:a.map(u=>{let y=nt(u.semanticType);return{componentId:u.componentId,semanticType:y,answers:u.answers,contentHash:rt(u.componentId,y,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:D({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(h)}).catch(()=>{})}catch(o){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:s,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(X),localStorage.removeItem(ge)}catch(a){}}}}var ot="https://api.sentient-ui.com/v1/events";function st(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function it(e){var i;let t=de(e);if(!e.graph||typeof window=="undefined")return t;let n=le(),c=(i=e.ingestUrl)!=null?i:ot,s=pe({syncUrl:c.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:st()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&s.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}n.scan().then(o=>{for(let d of o.nodes)s.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)s.addStructuralEdge(d);s.syncOnce()});let a=null,r=()=>{a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,s.syncOnce()},500)};return n.observe(o=>{for(let d of o.nodes)s.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)s.addStructuralEdge(d);r()}),B(D({},t),{getGraph:()=>s.snapshot(),destroy:()=>{a!==null&&clearTimeout(a),n.destroy(),s.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{c as v}from"./chunk-PXHVZ2OY.mjs";import{a as h,b,c as x,d as _,e as O,f as R,g as M}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let r=d[s],i=(p=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?p:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(d){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,d,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(d=n==null?void 0:n.textContent)==null?void 0:d.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[r,i]of e){let a=r.parentElement,o=p;for(;a;){if(e.has(a)){o=e.get(a);let m=e.get(r),g=`${o}->${m}`;!n.has(g)&&o!==m&&(n.add(g),t.push({fromComponentId:o,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(o))!=null?s:[];u.push(r),d.set(o,u)}for(let r of d.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){let o=e.get(r[i]),u=e.get(r[a]);if(o===u)continue;let m=`${o}->${u}::sib`,g=`${u}->${o}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:o,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:o,weight:.3}))}return t}function F(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=I(r,e);t.push(i),p.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),a=r.hasAttribute("data-sentient-id");if(!i&&!a)return;n.add(r);let o=I(r,e);t.push(o),p.set(r,o.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=i=>{try{let a=window.getComputedStyle(i),o=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=i.getBoundingClientRect(),g=Math.max(m.top,0),c=window.innerHeight||1,l=1/(g/c+1),f=S(o,12,48)*.4+S(l,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,f))}catch(a){return .5}};return{scan:()=>new Promise(i=>{let a=()=>{let{nodes:o,edges:u}=F(p);i({nodes:o,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(o){a()}}),observe:i=>{n=i;try{e=new MutationObserver(a=>{let o=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let c=g.hasAttribute("data-sentient-id"),l=g.hasAttribute("aria-label");if(!c&&!l)return;let f=I(g,p);o.push(f),u.set(g,f.componentId)});o.length>0&&n&&n({nodes:o,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,d=5381;for(let s=0;s<p.length;s++)d=(d<<5)+d+p.charCodeAt(s)&4294967295;return(d>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},d=s=>{var r;try{let i=JSON.parse(s);t.clear();for(let a of(r=i.pageNodes)!=null?r:[])t.set(a.componentId,a)}catch(i){}};if(typeof window!="undefined"){let s=z(C,[]);for(let r of s)t.set(r.componentId,r);try{localStorage.removeItem(A)}catch(r){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let r=`${s.fromComponentId}->${s.toComponentId}`;n.set(r,s)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let c of s){let l=(r=a.get(c.semanticType))!=null?r:[];l.push(c),a.set(c.semanticType,l)}let o=[],u=new Set;for(let c of s)for(let l of q(c.semanticType)){let f=(i=a.get(l))!=null?i:[];for(let y of f){if(y.componentId===c.componentId)continue;let E=`semantic:${c.componentId}->${y.componentId}`;u.has(E)||(u.add(E),o.push({fromComponentId:c.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(c=>c.componentId));for(let c of n.values()){if(!m.has(c.fromComponentId)||!m.has(c.toComponentId))continue;let l=`structural:${c.fromComponentId}->${c.toComponentId}`;u.has(l)||(u.add(l),o.push({fromComponentId:c.fromComponentId,toComponentId:c.toComponentId,type:"structural",weight:c.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(c=>{let l=B(c.semanticType);return{componentId:c.componentId,semanticType:l,answers:c.answers,contentHash:V(c.componentId,l,c.answers),prominenceScore:c.prominenceScore,depthInPage:c.depth}}),edges:o};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var i;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(i=e.ingestUrl)!=null?i:W,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let a=localStorage.getItem("_snt_graph_nodes");a&&d.restore(JSON.stringify({pageNodes:JSON.parse(a)}))}catch(a){}n.scan().then(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);d.syncOnce()});let s=null,r=()=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,d.syncOnce()},500)};return n.observe(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);r()}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{s!==null&&clearTimeout(s),n.destroy(),d.destroy(),t.destroy()}})}export{M as deriveSessionSegment,x as detectDeviceClass,R as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
1
+ import{c as v}from"./chunk-NXCIN4O2.mjs";import{a as h,b,c as x,d as _,e as O,f as R,g as M}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let r=d[s],i=(p=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?p:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(d){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,d,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(d=n==null?void 0:n.textContent)==null?void 0:d.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[r,i]of e){let a=r.parentElement,o=p;for(;a;){if(e.has(a)){o=e.get(a);let m=e.get(r),g=`${o}->${m}`;!n.has(g)&&o!==m&&(n.add(g),t.push({fromComponentId:o,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(o))!=null?s:[];u.push(r),d.set(o,u)}for(let r of d.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){let o=e.get(r[i]),u=e.get(r[a]);if(o===u)continue;let m=`${o}->${u}::sib`,g=`${u}->${o}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:o,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:o,weight:.3}))}return t}function F(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=I(r,e);t.push(i),p.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),a=r.hasAttribute("data-sentient-id");if(!i&&!a)return;n.add(r);let o=I(r,e);t.push(o),p.set(r,o.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=i=>{try{let a=window.getComputedStyle(i),o=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=i.getBoundingClientRect(),g=Math.max(m.top,0),c=window.innerHeight||1,l=1/(g/c+1),f=S(o,12,48)*.4+S(l,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,f))}catch(a){return .5}};return{scan:()=>new Promise(i=>{let a=()=>{let{nodes:o,edges:u}=F(p);i({nodes:o,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(o){a()}}),observe:i=>{n=i;try{e=new MutationObserver(a=>{let o=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let c=g.hasAttribute("data-sentient-id"),l=g.hasAttribute("aria-label");if(!c&&!l)return;let f=I(g,p);o.push(f),u.set(g,f.componentId)});o.length>0&&n&&n({nodes:o,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,d=5381;for(let s=0;s<p.length;s++)d=(d<<5)+d+p.charCodeAt(s)&4294967295;return(d>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},d=s=>{var r;try{let i=JSON.parse(s);t.clear();for(let a of(r=i.pageNodes)!=null?r:[])t.set(a.componentId,a)}catch(i){}};if(typeof window!="undefined"){let s=z(C,[]);for(let r of s)t.set(r.componentId,r);try{localStorage.removeItem(A)}catch(r){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let r=`${s.fromComponentId}->${s.toComponentId}`;n.set(r,s)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let c of s){let l=(r=a.get(c.semanticType))!=null?r:[];l.push(c),a.set(c.semanticType,l)}let o=[],u=new Set;for(let c of s)for(let l of q(c.semanticType)){let f=(i=a.get(l))!=null?i:[];for(let y of f){if(y.componentId===c.componentId)continue;let E=`semantic:${c.componentId}->${y.componentId}`;u.has(E)||(u.add(E),o.push({fromComponentId:c.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(c=>c.componentId));for(let c of n.values()){if(!m.has(c.fromComponentId)||!m.has(c.toComponentId))continue;let l=`structural:${c.fromComponentId}->${c.toComponentId}`;u.has(l)||(u.add(l),o.push({fromComponentId:c.fromComponentId,toComponentId:c.toComponentId,type:"structural",weight:c.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(c=>{let l=B(c.semanticType);return{componentId:c.componentId,semanticType:l,answers:c.answers,contentHash:V(c.componentId,l,c.answers),prominenceScore:c.prominenceScore,depthInPage:c.depth}}),edges:o};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var i;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(i=e.ingestUrl)!=null?i:W,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let a=localStorage.getItem("_snt_graph_nodes");a&&d.restore(JSON.stringify({pageNodes:JSON.parse(a)}))}catch(a){}n.scan().then(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);d.syncOnce()});let s=null,r=()=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,d.syncOnce()},500)};return n.observe(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);r()}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{s!==null&&clearTimeout(s),n.destroy(),d.destroy(),t.destroy()}})}export{M as deriveSessionSegment,x as detectDeviceClass,R as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
@@ -1 +1 @@
1
- "use strict";var m=Object.defineProperty,k=Object.defineProperties,C=Object.getOwnPropertyDescriptor,I=Object.getOwnPropertyDescriptors,M=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var v=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,O=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&v(t,r,e[r]);if(b)for(var r of b(e))_.call(e,r)&&v(t,r,e[r]);return t},P=(t,e)=>k(t,I(e));var $=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},j=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of M(e))!A.call(t,s)&&s!==r&&m(t,s,{get:()=>e[s],enumerable:!(n=C(e,s))||n.enumerable});return t};var L=t=>j(m({},"__esModule",{value:!0}),t);var B={};$(B,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>w,detectDeviceClass:()=>y,detectTimeOfDay:()=>h,detectTrafficSource:()=>p,preloadAssignments:()=>R,preloadDecisions:()=>U,readSessionCookie:()=>x,referrerDomainFromReferer:()=>S});module.exports=L(B);function y(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function p(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(s){}let n=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(n)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(n)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function w(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,c,u,o,i,d,l;let r=(c=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?c:"",n=(o=(u=e==null?void 0:e.referer)==null?void 0:u.trim())!=null?o:"",s=(i=e==null?void 0:e.now)!=null?i:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?y(r):"desktop",trafficSource:n?p(n,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(n),timeOfDay:h(s),dayOfWeek:(l=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?l:"sun"}}var D=1500;function f(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);return fetch(t,P(O({},e),{signal:n.signal})).finally(()=>clearTimeout(s))}async function R(t,e,r){var o;let n=(o=r.timeoutMs)!=null?o:D,s={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(s.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{(await f(`${r.baseUrl}/sessions`,{method:"POST",headers:s,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(i){}let c=await Promise.allSettled(t.map(async({id:i,variantIds:d})=>{let l=await f(`${r.baseUrl}/assign`,{method:"POST",headers:s,body:JSON.stringify({sessionId:e,componentId:i,variantIds:d})},n);if(!l.ok)return null;let T=await l.json();return{id:i,variantId:T.variantId}})),u={};for(let i of c)i.status==="fulfilled"&&i.value&&(u[i.value.id]=i.value.variantId);return u}function x(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function U(t,e,r){var u;let n=(u=r.timeoutMs)!=null?u:D,s={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let c=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(c)},n)}catch(o){}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(i=>({id:i})),components:t.components})},n);return o.ok?await o.json():s}catch(o){return s}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
1
+ "use strict";var m=Object.defineProperty,C=Object.defineProperties,I=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyDescriptors,j=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var w=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,v=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&w(t,r,e[r]);if(b)for(var r of b(e))M.call(e,r)&&w(t,r,e[r]);return t},D=(t,e)=>C(t,$(e));var _=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},L=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of j(e))!A.call(t,i)&&i!==r&&m(t,i,{get:()=>e[i],enumerable:!(s=I(e,i))||s.enumerable});return t};var B=t=>L(m({},"__esModule",{value:!0}),t);var J={};_(J,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>U,detectDeviceClass:()=>p,detectTimeOfDay:()=>h,detectTrafficSource:()=>y,preloadAssignments:()=>P,preloadDecisions:()=>k,readSessionCookie:()=>R,referrerDomainFromReferer:()=>S});module.exports=B(J);function p(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function y(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(i){}let s=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(s)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(s)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function U(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,l,c,o,n,d,u;let r=(l=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?l:"",s=(o=(c=e==null?void 0:e.referer)==null?void 0:c.trim())!=null?o:"",i=(n=e==null?void 0:e.now)!=null?n:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?p(r):"desktop",trafficSource:s?y(s,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(s),timeOfDay:h(i),dayOfWeek:(u=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?u:"sun"}}var O=1500;function f(t,e,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r);return fetch(t,D(v({},e),{signal:s.signal})).finally(()=>clearTimeout(i))}async function P(t,e,r){var o;let s=(o=r.timeoutMs)!=null?o:O,i={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(i.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let n=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},s);if(n.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!n.ok){let d=await n.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${n.status})`,d)}}catch(n){console.error("[SentientUI] preloadAssignments: session upsert threw",n)}let l=await Promise.allSettled(t.map(async({id:n,variantIds:d})=>{let u=await f(`${r.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:e,componentId:n,variantIds:d})},s);if(!u.ok){let T=await u.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${n}" (${u.status})`,T),null}let x=await u.json();return{id:n,variantId:x.variantId}})),c={};for(let n of l)n.status==="fulfilled"&&n.value&&(c[n.value.id]=n.value.variantId);return c}function R(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function k(t,e,r){var c;let s=(c=r.timeoutMs)!=null?c:O,i={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let l=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let o=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(l)},s);if(!o.ok){let n=await o.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${o.status})`,n)}}catch(o){console.error("[SentientUI] preloadDecisions: session upsert threw",o)}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(n=>({id:n})),components:t.components})},s);if(!o.ok){let n=await o.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${o.status})`,n),i}return await o.json()}catch(o){return console.error("[SentientUI] preloadDecisions: decide threw",o),i}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{a as c,b as p,c as A,d as v,e as b,f as h,g as O,h as l}from"./chunk-QCYVBCUV.mjs";var y=1500;function d(r,t,e){let n=new AbortController,i=setTimeout(()=>n.abort(),e);return fetch(r,p(c({},t),{signal:n.signal})).finally(()=>clearTimeout(i))}async function P(r,t,e){var o;let n=(o=e.timeoutMs)!=null?o:y,i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(i.Origin=e.origin);let a=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{(await d(`${e.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(s){}let g=await Promise.allSettled(r.map(async({id:s,variantIds:S})=>{let m=await d(`${e.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:t,componentId:s,variantIds:S})},n);if(!m.ok)return null;let f=await m.json();return{id:s,variantId:f.variantId}})),u={};for(let s of g)s.status==="fulfilled"&&s.value&&(u[s.value.id]=s.value.variantId);return u}function T(r){var t,e;return(e=(t=r.get("_snt_uid"))==null?void 0:t.value)!=null?e:null}async function R(r,t,e){var u;let n=(u=e.timeoutMs)!=null?u:y,i={layoutOrder:r.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{await d(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},n)}catch(o){}try{let o=await d(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:t,sections:r.sections.map(s=>({id:s})),components:r.components})},n);return o.ok?await o.json():i}catch(o){return i}}export{l as buildSessionUpsertPayload,O as deriveSessionSegment,A as detectDeviceClass,h as detectTimeOfDay,v as detectTrafficSource,P as preloadAssignments,R as preloadDecisions,T as readSessionCookie,b as referrerDomainFromReferer};
1
+ import{a as p,b as y,c as b,d as h,e as v,f as U,g as w,h as d}from"./chunk-QCYVBCUV.mjs";var S=1500;function u(n,r,e){let i=new AbortController,o=setTimeout(()=>i.abort(),e);return fetch(n,y(p({},r),{signal:i.signal})).finally(()=>clearTimeout(o))}async function O(n,r,e){var t;let i=(t=e.timeoutMs)!=null?t:S,o={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(o.Origin=e.origin);let a=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let s=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(a)},i);if(s.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!s.ok){let m=await s.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${s.status})`,m)}}catch(s){console.error("[SentientUI] preloadAssignments: session upsert threw",s)}let g=await Promise.allSettled(n.map(async({id:s,variantIds:m})=>{let c=await u(`${e.baseUrl}/assign`,{method:"POST",headers:o,body:JSON.stringify({sessionId:r,componentId:s,variantIds:m})},i);if(!c.ok){let A=await c.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${s}" (${c.status})`,A),null}let f=await c.json();return{id:s,variantId:f.variantId}})),l={};for(let s of g)s.status==="fulfilled"&&s.value&&(l[s.value.id]=s.value.variantId);return l}function P(n){var r,e;return(e=(r=n.get("_snt_uid"))==null?void 0:r.value)!=null?e:null}async function R(n,r,e){var l;let i=(l=e.timeoutMs)!=null?l:S,o={layoutOrder:n.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let t=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},i);if(!t.ok){let s=await t.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${t.status})`,s)}}catch(t){console.error("[SentientUI] preloadDecisions: session upsert threw",t)}try{let t=await u(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:r,sections:n.sections.map(s=>({id:s})),components:n.components})},i);if(!t.ok){let s=await t.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${t.status})`,s),o}return await t.json()}catch(t){return console.error("[SentientUI] preloadDecisions: decide threw",t),o}}export{d as buildSessionUpsertPayload,w as deriveSessionSegment,b as detectDeviceClass,U as detectTimeOfDay,h as detectTrafficSource,O as preloadAssignments,R as preloadDecisions,P as readSessionCookie,v as referrerDomainFromReferer};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var G=Object.defineProperty,ce=Object.defineProperties,le=Object.getOwnPropertyDescriptor,ue=Object.getOwnPropertyDescriptors,de=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var Y=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,R=(e,t)=>{for(var n in t||(t={}))q.call(t,n)&&Y(e,n,t[n]);if(V)for(var n of V(t))ge.call(t,n)&&Y(e,n,t[n]);return e},Q=(e,t)=>ce(e,ue(t));var fe=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},me=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of de(t))!q.call(e,o)&&o!==n&&G(e,o,{get:()=>t[o],enumerable:!(i=le(t,o))||i.enumerable});return e};var pe=e=>me(G({},"__esModule",{value:!0}),e);var Pe={};fe(Pe,{attachMicroSignalDetectors:()=>ne,deriveSessionSegment:()=>te,detectDeviceClass:()=>U,detectTimeOfDay:()=>P,detectTrafficSource:()=>L,grantConsent:()=>Le,init:()=>ae,referrerDomainFromReferer:()=>M});module.exports=pe(Pe);var he="_snt_uid";var T="_snt_uid";function ye(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function Se(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function ve(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function we(e){try{return localStorage.getItem(e)}catch(t){return null}}function xe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Ee(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function _e(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function be(e){try{sessionStorage.removeItem(e)}catch(t){}}function ke(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ie(e){try{localStorage.removeItem(e)}catch(t){}}function Ce(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Te={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function X(e){var g,f,m,y,S,v;if(typeof window=="undefined")return Te;let t=(g=e==null?void 0:e.cookieName)!=null?g:he,i=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,o=(v=(S=(y=(m=Se(t))!=null?m:we(T))!=null?y:Ee(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:ye();ve(t,o,i);let c=xe(T,o),a=ke(t),s=c?!1:_e(T,o),r=!c&&!a&&!s;return{getSessionId:()=>o,isEphemeral:()=>r,destroy:()=>{o=null,Ce(t),Ie(T),be(T)}}}var De={push:()=>{},flush:()=>{},destroy:()=>{}};function Ae(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let i=JSON.parse(n);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(n){return[]}}function j(e,t,n){try{let o=[...(()=>{try{let c=localStorage.getItem(n);if(!c)return[];let a=JSON.parse(c);return Array.isArray(a)?a:[]}catch(c){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(o))}catch(i){}}function Z(e){var I,b,A;if(typeof window=="undefined")return De;let t=(I=e.flushIntervalMs)!=null?I:5e3,n=(b=e.maxBatchSize)!=null?b:20,i=(A=e.maxRetrySize)!=null?A:100,o=e.ingestUrl,c=e.apiKey,a=`_snt_retry_${c.slice(0,12)}`,s=[],r=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!r.has(p)&&(r.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&r.delete(p)}},m=new Set,y=l=>{r.has(l.id)||m.has(l.id)||(m.add(l.id),s.push(l))},S=Ae(i,a);for(let l of S)y(l);let v=0,E=0,K=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(k=>k.id),x;try{x=fetch(o,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${c}`}})}catch(k){j(l,i,a);for(let J of w)m.delete(J);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6));return}let O=k=>{if(k.ok||k.status>=400&&k.status<500&&k.status!==429){f(w),E=0,v=0;return}j(l,i,a);for(let J of w)m.delete(J);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6))};x instanceof Promise?x.then(O).catch(()=>{j(l,i,a);for(let k of w)m.delete(k);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6))}):O(x)},D=typeof TextEncoder!="undefined"?new TextEncoder:null,W=l=>D?D.encode(l).length:l.length,B=l=>{let p=[],w=2;for(let x of l){let O=W(JSON.stringify(x))+1;if(p.length>0&&w+O>57344||p.length>=n)break;p.push(x),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;s.length>0;){let l=s.filter(w=>!r.has(w.id));if(s.length=0,l.length===0)break;let p=B(l);if(p.length===0)break;p.length<l.length&&s.push(...l.slice(p.length)),K(p)}}catch(l){}},u=!0,d=null;d=setInterval(()=>{u&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},C=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),s.length>=n&&_()},flush:_,destroy(){u=!1,d!==null&&(clearInterval(d),d=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),_()}}}var z="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Oe(e,t){return`${z}${e}_${t}`}function H(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(z)&&e.push(n)}return e}catch(e){return[]}}function ee(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of H())try{let c=localStorage.getItem(o);if(!c)continue;let a=JSON.parse(c);if(n(a)){localStorage.removeItem(o);continue}let s=o.slice(z.length),r=s.lastIndexOf("_");if(r<0)continue;let g=s.slice(0,r),f=s.slice(r+1);t.set(F(g,f),a)}catch(c){}})(),{get(o,c){let a=t.get(F(o,c));return a?n(a)?(t.delete(F(o,c)),null):a:null},set(o,c,a){let s=F(o,c);t.set(s,a);try{localStorage.setItem(Oe(o,c),JSON.stringify(a))}catch(r){}},invalidate(o){let c=`${o}:`;for(let a of[...t.keys()])a.startsWith(c)&&t.delete(a);for(let a of H()){let s=a.slice(z.length),r=s.lastIndexOf("_");if(r<0)continue;if(s.slice(0,r)===o)try{localStorage.removeItem(a)}catch(f){}}},clear(){t.clear();for(let o of H())try{localStorage.removeItem(o)}catch(c){}}}}function U(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function L(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(o){}let i=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(i)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(i)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function te(e){let t=Re("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Re(e,t){var c,a,s,r,g,f,m;let n=(a=(c=t==null?void 0:t.userAgent)==null?void 0:c.trim())!=null?a:"",i=(r=(s=t==null?void 0:t.referer)==null?void 0:s.trim())!=null?r:"",o=(g=t==null?void 0:t.now)!=null?g:new Date;return{sessionId:e,ephemeral:!1,utmParams:(f=t==null?void 0:t.utmParams)!=null?f:{},deviceClass:n?U(n):"desktop",trafficSource:i?L(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(i),timeOfDay:P(o),dayOfWeek:(m=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?m:"sun"}}function ne(e,t,n){var o;let i=[];{let s=!1,r=[],g=()=>{if(s)return;let f=Date.now();for(r.push(f);r.length>0&&f-r[0]>500;)r.shift();r.length>=3&&(s=!0,e("rage_click"))};t.addEventListener("click",g),i.push(()=>t.removeEventListener("click",g))}{let c=!1,a=s=>{if(c||!(s.target instanceof Node)||!t.contains(s.target)&&t!==s.target)return;c=!0;let r=typeof window!="undefined"?window.getSelection():null,g=r?r.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",a),i.push(()=>document.removeEventListener("copy",a))}{let c=!1,a=!1,s=null,r=()=>{s!==null&&(clearTimeout(s),s=null)},g=()=>{c||!a||(r(),s=setTimeout(()=>{!c&&a&&(c=!0,e("scroll_hesitation"))},3e3))},f=()=>{r(),g()},m=S=>{for(let v of S)a=v.intersectionRatio>.3,a?g():r()};typeof process!="undefined"&&((o=process.env)==null?void 0:o.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),i.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),r()})}{let c=!1,a=n!=null?n:Date.now(),s=()=>{if(c||document.visibilityState!=="hidden")return;let r=Date.now()-a;r<15e3&&(c=!0,e("tab_loss",{timeOnPage:r}))};document.addEventListener("visibilitychange",s),i.push(()=>document.removeEventListener("visibilitychange",s))}return()=>{for(let c of i)c()}}var se="https://api.sentient-ui.com/v1/events",$=new Map,ie=null;function re(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var N={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ue(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,i]of t)n.startsWith("utm_")&&(e[n]=i);return e}catch(e){return{}}}function oe(e){return e.replace(/\/events\/?$/,"")}function Le(e){if(typeof window=="undefined")return;let t=e!=null?e:ie;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let n=$.get(t);if(!n){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:o}=n;if(!o)return;let c=ae(Q(R({},i),{consent:!0}));o(c),$.set(t,{config:Q(R({},i),{consent:!0}),upgrade:null})}function Me(e){var a;let t=oe((a=e.ingestUrl)!=null?a:se),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(s,r,g){try{let f=new URLSearchParams({componentId:s});for(let S of r!=null?r:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:n});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}catch(f){return r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},o={track:s=>i.track(s),goal:(s,r,g,f)=>i.goal(s,r,g,f),identify:s=>i.identify(s),getAssignment:(s,r)=>i.getAssignment(s,r),assign:(s,r,g,f)=>i.assign(s,r,g,f),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function c(s){i=s}return{proxy:o,setInner:c}}function ae(e){var K,D,W,B,_;if(typeof window=="undefined")return N;if(ie=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;let{proxy:u,setInner:d}=Me(e);return $.set(e.apiKey,{config:e,upgrade:d}),u}return $.set(e.apiKey,{config:e,upgrade:null}),N}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),N;let t=(K=e.ingestUrl)!=null?K:se,n=Date.now(),i=X({ssrSessionId:e.ssrSessionId}),o=ee(),c=Z({ingestUrl:t,apiKey:e.apiKey}),a=oe(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r=U((D=navigator.userAgent)!=null?D:""),g=typeof window!="undefined"?window.location.origin:void 0,f=L((W=document.referrer)!=null?W:"",g),m=(B=e.sessionSegment)!=null?B:`${r}:${f}`,y=new Map;if(e.initialAssignments)for(let[u,d]of Object.entries(e.initialAssignments))o.set(u,m,{variantId:d,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=i.getSessionId();if(v){let u=M((_=document.referrer)!=null?_:""),d=R({sessionId:v,deviceClass:r,trafficSource:f,referrerDomain:u,utmParams:Ue(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(d),headers:s}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:c});let E={goal(u,d={},h=1,C=0){let I=i.getSessionId();if(!I)return;let b=re();S.then(()=>{fetch(`${a}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:I,name:u,metadata:d,weight:h,stepIndex:C,goalId:b}),headers:s}).catch(()=>{})})},identify(u){let d=i.getSessionId();d&&S.then(()=>{fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:d,userId:u,ephemeral:i.isEphemeral()}),headers:s}).catch(()=>{})})},track(u){let d=i.getSessionId();if(!d)return;let h=Q(R({},u),{id:re(),sessionId:d,timestamp:Date.now(),timeInSession:Date.now()-n});c.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(u,d){return o.get(u,d)},async assign(u,d,h,C){let I=i.getSessionId();if(!I)return null;let b=o.get(u,m);if(b&&(d!=null&&d.length||b.content!==void 0))return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};let A=y.get(u);if(A)return A;let l=(async()=>{await S;try{let p={sessionId:I,componentId:u,variantIds:d};C!==void 0?p.agentDataByVariant=C:h!==void 0&&(p.agentData=h);let w=await fetch(`${a}/assign`,{method:"POST",body:JSON.stringify(p),headers:s});if(!w.ok)return null;let x=await w.json();return o.set(u,m,{variantId:x.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:x.content}),x}catch(p){return null}finally{y.delete(u)}})();return y.set(u,l),l},async fetchWeights(){var u;try{let d=await fetch(`${a}/weights`,{headers:s});return d.ok?(u=(await d.json()).components)!=null?u:[]:[]}catch(d){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){c.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if($.set(e.apiKey,{config:e,upgrade:null}),e.debug){let u=window;u.__sentient&&(u.__sentient.client=E)}return E}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
1
+ "use strict";var G=Object.defineProperty,le=Object.defineProperties,ue=Object.getOwnPropertyDescriptor,de=Object.getOwnPropertyDescriptors,ge=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var Y=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,R=(e,t)=>{for(var n in t||(t={}))q.call(t,n)&&Y(e,n,t[n]);if(V)for(var n of V(t))fe.call(t,n)&&Y(e,n,t[n]);return e},Q=(e,t)=>le(e,de(t));var me=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ge(t))!q.call(e,o)&&o!==n&&G(e,o,{get:()=>t[o],enumerable:!(i=ue(t,o))||i.enumerable});return e};var he=e=>pe(G({},"__esModule",{value:!0}),e);var Ne={};me(Ne,{attachMicroSignalDetectors:()=>re,deriveSessionSegment:()=>ne,detectDeviceClass:()=>U,detectTimeOfDay:()=>P,detectTrafficSource:()=>L,grantConsent:()=>Me,init:()=>ce,referrerDomainFromReferer:()=>M});module.exports=he(Ne);var ye="_snt_uid";var T="_snt_uid";function Se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ve(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function we(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function Ee(e){try{return localStorage.getItem(e)}catch(t){return null}}function xe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function _e(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function be(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function Ie(e){try{sessionStorage.removeItem(e)}catch(t){}}function ke(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ce(e){try{localStorage.removeItem(e)}catch(t){}}function Te(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var De={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function X(e){var g,f,m,y,S,v;if(typeof window=="undefined")return De;let t=(g=e==null?void 0:e.cookieName)!=null?g:ye,i=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,o=(v=(S=(y=(m=ve(t))!=null?m:Ee(T))!=null?y:_e(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:Se();we(t,o,i);let c=xe(T,o),a=ke(t),r=c?!1:be(T,o),s=!c&&!a&&!r;return{getSessionId:()=>o,isEphemeral:()=>s,destroy:()=>{o=null,Te(t),Ce(T),Ie(T)}}}var Ae={push:()=>{},flush:()=>{},destroy:()=>{}};function Oe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let i=JSON.parse(n);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(n){return[]}}function J(e,t,n){try{let o=[...(()=>{try{let c=localStorage.getItem(n);if(!c)return[];let a=JSON.parse(c);return Array.isArray(a)?a:[]}catch(c){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(o))}catch(i){}}function Z(e){var k,b,A;if(typeof window=="undefined")return Ae;let t=(k=e.flushIntervalMs)!=null?k:5e3,n=(b=e.maxBatchSize)!=null?b:20,i=(A=e.maxRetrySize)!=null?A:100,o=e.ingestUrl,c=e.apiKey,a=`_snt_retry_${c.slice(0,12)}`,r=[],s=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!s.has(p)&&(s.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&s.delete(p)}},m=new Set,y=l=>{s.has(l.id)||m.has(l.id)||(m.add(l.id),r.push(l))},S=Oe(i,a);for(let l of S)y(l);let v=0,x=0,K=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(I=>I.id),E;try{E=fetch(o,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${c}`}})}catch(I){J(l,i,a);for(let z of w)m.delete(z);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=I=>{if(I.ok||I.status>=400&&I.status<500&&I.status!==429){f(w),x=0,v=0;return}J(l,i,a);for(let z of w)m.delete(z);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{J(l,i,a);for(let I of w)m.delete(I);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},D=typeof TextEncoder!="undefined"?new TextEncoder:null,W=l=>D?D.encode(l).length:l.length,B=l=>{let p=[],w=2;for(let E of l){let O=W(JSON.stringify(E))+1;if(p.length>0&&w+O>57344||p.length>=n)break;p.push(E),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;r.length>0;){let l=r.filter(w=>!s.has(w.id));if(r.length=0,l.length===0)break;let p=B(l);if(p.length===0)break;p.length<l.length&&r.push(...l.slice(p.length)),K(p)}}catch(l){}},u=!0,d=null;d=setInterval(()=>{u&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},C=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),r.length>=n&&_()},flush:_,destroy(){u=!1,d!==null&&(clearInterval(d),d=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),_()}}}var H="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Re(e,t){return`${H}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function ee(e){let t=e.slice(H.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(i){return null}}function j(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(H)&&e.push(n)}return e}catch(e){return[]}}function te(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of j())try{let c=localStorage.getItem(o);if(!c)continue;let a=JSON.parse(c);if(n(a)){localStorage.removeItem(o);continue}let r=ee(o);if(!r)continue;t.set(F(r.componentId,r.segment),a)}catch(c){}})(),{get(o,c){let a=t.get(F(o,c));return a?n(a)?(t.delete(F(o,c)),null):a:null},set(o,c,a){let r=F(o,c);t.set(r,a);try{localStorage.setItem(Re(o,c),JSON.stringify(a))}catch(s){}},invalidate(o){let c=`${o}:`;for(let a of[...t.keys()])a.startsWith(c)&&t.delete(a);for(let a of j()){let r=ee(a);if((r==null?void 0:r.componentId)===o)try{localStorage.removeItem(a)}catch(s){}}},clear(){t.clear();for(let o of j())try{localStorage.removeItem(o)}catch(c){}}}}function U(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function L(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(o){}let i=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(i)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(i)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function ne(e){let t=Ue("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Ue(e,t){var c,a,r,s,g,f,m;let n=(a=(c=t==null?void 0:t.userAgent)==null?void 0:c.trim())!=null?a:"",i=(s=(r=t==null?void 0:t.referer)==null?void 0:r.trim())!=null?s:"",o=(g=t==null?void 0:t.now)!=null?g:new Date;return{sessionId:e,ephemeral:!1,utmParams:(f=t==null?void 0:t.utmParams)!=null?f:{},deviceClass:n?U(n):"desktop",trafficSource:i?L(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(i),timeOfDay:P(o),dayOfWeek:(m=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?m:"sun"}}function re(e,t,n){var o;let i=[];{let r=!1,s=[],g=()=>{if(r)return;let f=Date.now();for(s.push(f);s.length>0&&f-s[0]>500;)s.shift();s.length>=3&&(r=!0,e("rage_click"))};t.addEventListener("click",g),i.push(()=>t.removeEventListener("click",g))}{let c=!1,a=r=>{if(c||!(r.target instanceof Node)||!t.contains(r.target)&&t!==r.target)return;c=!0;let s=typeof window!="undefined"?window.getSelection():null,g=s?s.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",a),i.push(()=>document.removeEventListener("copy",a))}{let c=!1,a=!1,r=null,s=()=>{r!==null&&(clearTimeout(r),r=null)},g=()=>{c||!a||(s(),r=setTimeout(()=>{!c&&a&&(c=!0,e("scroll_hesitation"))},3e3))},f=()=>{s(),g()},m=S=>{for(let v of S)a=v.intersectionRatio>.3,a?g():s()};typeof process!="undefined"&&((o=process.env)==null?void 0:o.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),i.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),s()})}{let c=!1,a=n!=null?n:Date.now(),r=()=>{if(c||document.visibilityState!=="hidden")return;let s=Date.now()-a;s<15e3&&(c=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",r),i.push(()=>document.removeEventListener("visibilitychange",r))}return()=>{for(let c of i)c()}}var se="https://api.sentient-ui.com/v1/events",$=new Map,oe=null;function ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var N={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Le(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,i]of t)n.startsWith("utm_")&&(e[n]=i);return e}catch(e){return{}}}function ae(e){return e.replace(/\/events\/?$/,"")}function Me(e){if(typeof window=="undefined")return;let t=e!=null?e:oe;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let n=$.get(t);if(!n){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:o}=n;if(!o)return;let c=ce(Q(R({},i),{consent:!0}));o(c),$.set(t,{config:Q(R({},i),{consent:!0}),upgrade:null})}function Pe(e){var a;let t=ae((a=e.ingestUrl)!=null?a:se),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(r,s,g){try{let f=new URLSearchParams({componentId:r});for(let S of s!=null?s:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:n});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(f){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},o={track:r=>i.track(r),goal:(r,s,g,f)=>i.goal(r,s,g,f),identify:r=>i.identify(r),getAssignment:(r,s)=>i.getAssignment(r,s),assign:(r,s,g,f)=>i.assign(r,s,g,f),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function c(r){i=r}return{proxy:o,setInner:c}}function ce(e){var K,D,W,B,_;if(typeof window=="undefined")return N;if(oe=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;let{proxy:u,setInner:d}=Pe(e);return $.set(e.apiKey,{config:e,upgrade:d}),u}return $.set(e.apiKey,{config:e,upgrade:null}),N}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),N;let t=(K=e.ingestUrl)!=null?K:se,n=Date.now(),i=X({ssrSessionId:e.ssrSessionId}),o=te(),c=Z({ingestUrl:t,apiKey:e.apiKey}),a=ae(t),r={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=U((D=navigator.userAgent)!=null?D:""),g=typeof window!="undefined"?window.location.origin:void 0,f=L((W=document.referrer)!=null?W:"",g),m=(B=e.sessionSegment)!=null?B:`${s}:${f}`,y=new Map;if(e.initialAssignments)for(let[u,d]of Object.entries(e.initialAssignments))o.set(u,m,{variantId:d,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=i.getSessionId();if(v){let u=M((_=document.referrer)!=null?_:""),d=R({sessionId:v,deviceClass:s,trafficSource:f,referrerDomain:u,utmParams:Le(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(d),headers:r}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:c});let x={goal(u,d={},h=1,C=0){let k=i.getSessionId();if(!k)return;let b=ie();S.then(()=>{fetch(`${a}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:u,metadata:d,weight:h,stepIndex:C,goalId:b}),headers:r}).catch(()=>{})})},identify(u){let d=i.getSessionId();d&&S.then(()=>{fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:d,userId:u,ephemeral:i.isEphemeral()}),headers:r}).catch(()=>{})})},track(u){let d=i.getSessionId();if(!d)return;let h=Q(R({},u),{id:ie(),sessionId:d,timestamp:Date.now(),timeInSession:Date.now()-n});c.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(u,d){return o.get(u,d)},async assign(u,d,h,C){let k=i.getSessionId();if(!k)return null;let b=o.get(u,m);if(b&&(d!=null&&d.length||b.content!==void 0))return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};let A=y.get(u);if(A)return A;let l=(async()=>{await S;try{let p={sessionId:k,componentId:u,variantIds:d};C!==void 0?p.agentDataByVariant=C:h!==void 0&&(p.agentData=h);let w=await fetch(`${a}/assign`,{method:"POST",body:JSON.stringify(p),headers:r});if(!w.ok)return null;let E=await w.json();return o.set(u,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(p){return null}finally{y.delete(u)}})();return y.set(u,l),l},async fetchWeights(){var u;try{let d=await fetch(`${a}/weights`,{headers:r});return d.ok?(u=(await d.json()).components)!=null?u:[]:[]}catch(d){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){c.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if($.set(e.apiKey,{config:e,upgrade:null}),e.debug){let u=window;u.__sentient&&(u.__sentient.client=x)}return x}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as f,b as g,c as h}from"./chunk-PXHVZ2OY.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
1
+ import{a as f,b as g,c as h}from"./chunk-NXCIN4O2.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentientui/core",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,13 +26,6 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "scripts": {
30
- "build": "tsup",
31
- "test": "vitest run",
32
- "typecheck": "tsc --noEmit",
33
- "size-check": "tsx scripts/size-check.ts",
34
- "lint": "eslint src"
35
- },
36
29
  "devDependencies": {
37
30
  "@types/node": "^22.10.2",
38
31
  "jsdom": "^25.0.1",
@@ -40,5 +33,12 @@
40
33
  "tsx": "^4.19.2",
41
34
  "typescript": "^5.7.2",
42
35
  "vitest": "^2.1.8"
36
+ },
37
+ "scripts": {
38
+ "build": "tsup",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit",
41
+ "size-check": "tsx scripts/size-check.ts",
42
+ "lint": "eslint src"
43
43
  }
44
- }
44
+ }
@@ -1 +0,0 @@
1
- import{a as R,b as K,c as G,d as Q,e as F,f as z}from"./chunk-QCYVBCUV.mjs";var te="_snt_uid";var C="_snt_uid";function ne(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function se(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function ie(e,t,c){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${c}; SameSite=strict; path=/`}catch(r){}}function re(e){try{return localStorage.getItem(e)}catch(t){return null}}function oe(e,t){try{return localStorage.setItem(e,t),!0}catch(c){return!1}}function ae(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ce(e,t){try{return sessionStorage.setItem(e,t),!0}catch(c){return!1}}function le(e){try{sessionStorage.removeItem(e)}catch(t){}}function de(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function ue(e){try{localStorage.removeItem(e)}catch(t){}}function ge(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var fe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function H(e){var g,f,m,y,S,v;if(typeof window=="undefined")return fe;let t=(g=e==null?void 0:e.cookieName)!=null?g:te,r=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,a=(v=(S=(y=(m=se(t))!=null?m:re(C))!=null?y:ae(C))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:ne();ie(t,a,r);let o=oe(C,a),i=de(t),s=o?!1:ce(C,a),n=!o&&!i&&!s;return{getSessionId:()=>a,isEphemeral:()=>n,destroy:()=>{a=null,ge(t),ue(C),le(C)}}}var pe={push:()=>{},flush:()=>{},destroy:()=>{}};function me(e,t){try{let c=localStorage.getItem(t);if(!c)return[];let r=JSON.parse(c);return Array.isArray(r)?(localStorage.removeItem(t),r.slice(-e)):[]}catch(c){return[]}}function J(e,t,c){try{let a=[...(()=>{try{let o=localStorage.getItem(c);if(!o)return[];let i=JSON.parse(o);return Array.isArray(i)?i:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(c,JSON.stringify(a))}catch(r){}}function V(e){var k,I,D;if(typeof window=="undefined")return pe;let t=(k=e.flushIntervalMs)!=null?k:5e3,c=(I=e.maxBatchSize)!=null?I:20,r=(D=e.maxRetrySize)!=null?D:100,a=e.ingestUrl,o=e.apiKey,i=`_snt_retry_${o.slice(0,12)}`,s=[],n=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!n.has(p)&&(n.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&n.delete(p)}},m=new Set,y=l=>{n.has(l.id)||m.has(l.id)||(m.add(l.id),s.push(l))},S=me(r,i);for(let l of S)y(l);let v=0,x=0,L=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(b=>b.id),E;try{E=fetch(a,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(b){J(l,r,i);for(let B of w)m.delete(B);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=b=>{if(b.ok||b.status>=400&&b.status<500&&b.status!==429){f(w),x=0,v=0;return}J(l,r,i);for(let B of w)m.delete(B);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{J(l,r,i);for(let b of w)m.delete(b);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},A=typeof TextEncoder!="undefined"?new TextEncoder:null,N=l=>A?A.encode(l).length:l.length,$=l=>{let p=[],w=2;for(let E of l){let O=N(JSON.stringify(E))+1;if(p.length>0&&w+O>57344||p.length>=c)break;p.push(E),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;s.length>0;){let l=s.filter(w=>!n.has(w.id));if(s.length=0,l.length===0)break;let p=$(l);if(p.length===0)break;p.length<l.length&&s.push(...l.slice(p.length)),L(p)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},T=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",T),{push(l){y(l),s.length>=c&&_()},flush:_,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",T),_()}}}var W="_snt_asgn_";function P(e,t){return`${e}:${t}`}function he(e,t){return`${W}${e}_${t}`}function j(){try{let e=[];for(let t=0;t<localStorage.length;t++){let c=localStorage.key(t);c!=null&&c.startsWith(W)&&e.push(c)}return e}catch(e){return[]}}function Y(e=18e5){let t=new Map,c=a=>a.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let a of j())try{let o=localStorage.getItem(a);if(!o)continue;let i=JSON.parse(o);if(c(i)){localStorage.removeItem(a);continue}let s=a.slice(W.length),n=s.lastIndexOf("_");if(n<0)continue;let g=s.slice(0,n),f=s.slice(n+1);t.set(P(g,f),i)}catch(o){}})(),{get(a,o){let i=t.get(P(a,o));return i?c(i)?(t.delete(P(a,o)),null):i:null},set(a,o,i){let s=P(a,o);t.set(s,i);try{localStorage.setItem(he(a,o),JSON.stringify(i))}catch(n){}},invalidate(a){let o=`${a}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of j()){let s=i.slice(W.length),n=s.lastIndexOf("_");if(n<0)continue;if(s.slice(0,n)===a)try{localStorage.removeItem(i)}catch(f){}}},clear(){t.clear();for(let a of j())try{localStorage.removeItem(a)}catch(o){}}}}function ye(e,t,c){var a;let r=[];{let s=!1,n=[],g=()=>{if(s)return;let f=Date.now();for(n.push(f);n.length>0&&f-n[0]>500;)n.shift();n.length>=3&&(s=!0,e("rage_click"))};t.addEventListener("click",g),r.push(()=>t.removeEventListener("click",g))}{let o=!1,i=s=>{if(o||!(s.target instanceof Node)||!t.contains(s.target)&&t!==s.target)return;o=!0;let n=typeof window!="undefined"?window.getSelection():null,g=n?n.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",i),r.push(()=>document.removeEventListener("copy",i))}{let o=!1,i=!1,s=null,n=()=>{s!==null&&(clearTimeout(s),s=null)},g=()=>{o||!i||(n(),s=setTimeout(()=>{!o&&i&&(o=!0,e("scroll_hesitation"))},3e3))},f=()=>{n(),g()},m=S=>{for(let v of S)i=v.intersectionRatio>.3,i?g():n()};typeof process!="undefined"&&((a=process.env)==null?void 0:a.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),r.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),n()})}{let o=!1,i=c!=null?c:Date.now(),s=()=>{if(o||document.visibilityState!=="hidden")return;let n=Date.now()-i;n<15e3&&(o=!0,e("tab_loss",{timeOnPage:n}))};document.addEventListener("visibilitychange",s),r.push(()=>document.removeEventListener("visibilitychange",s))}return()=>{for(let o of r)o()}}var X="https://api.sentient-ui.com/v1/events",U=new Map,Z=null;function q(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var M={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Se(){try{let e={},t=new URLSearchParams(window.location.search);for(let[c,r]of t)c.startsWith("utm_")&&(e[c]=r);return e}catch(e){return{}}}function ee(e){return e.replace(/\/events\/?$/,"")}function De(e){if(typeof window=="undefined")return;let t=e!=null?e:Z;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let c=U.get(t);if(!c){console.warn("[sentient] grantConsent() called before init()");return}let{config:r,upgrade:a}=c;if(!a)return;let o=we(K(R({},r),{consent:!0}));a(o),U.set(t,{config:K(R({},r),{consent:!0}),upgrade:null})}function ve(e){var i;let t=ee((i=e.ingestUrl)!=null?i:X),c={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(s,n,g){try{let f=new URLSearchParams({componentId:s});for(let S of n!=null?n:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:c});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}catch(f){return n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},a={track:s=>r.track(s),goal:(s,n,g,f)=>r.goal(s,n,g,f),identify:s=>r.identify(s),getAssignment:(s,n)=>r.getAssignment(s,n),assign:(s,n,g,f)=>r.assign(s,n,g,f),fetchWeights:()=>r.fetchWeights(),getGraph:()=>r.getGraph(),destroy:()=>r.destroy()};function o(s){r=s}return{proxy:a,setInner:o}}function we(e){var L,A,N,$,_;if(typeof window=="undefined")return M;if(Z=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M;let{proxy:d,setInner:u}=ve(e);return U.set(e.apiKey,{config:e,upgrade:u}),d}return U.set(e.apiKey,{config:e,upgrade:null}),M}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),M;let t=(L=e.ingestUrl)!=null?L:X,c=Date.now(),r=H({ssrSessionId:e.ssrSessionId}),a=Y(),o=V({ingestUrl:t,apiKey:e.apiKey}),i=ee(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},n=G((A=navigator.userAgent)!=null?A:""),g=typeof window!="undefined"?window.location.origin:void 0,f=Q((N=document.referrer)!=null?N:"",g),m=($=e.sessionSegment)!=null?$:`${n}:${f}`,y=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))a.set(d,m,{variantId:u,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=r.getSessionId();if(v){let d=F((_=document.referrer)!=null?_:""),u=R({sessionId:v,deviceClass:n,trafficSource:f,referrerDomain:d,utmParams:Se(),timeOfDay:z(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:r.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:s}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let x={goal(d,u={},h=1,T=0){let k=r.getSessionId();if(!k)return;let I=q();S.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:d,metadata:u,weight:h,stepIndex:T,goalId:I}),headers:s}).catch(()=>{})})},identify(d){let u=r.getSessionId();u&&S.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:r.isEphemeral()}),headers:s}).catch(()=>{})})},track(d){let u=r.getSessionId();if(!u)return;let h=K(R({},d),{id:q(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-c});o.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(d,u){return a.get(d,u)},async assign(d,u,h,T){let k=r.getSessionId();if(!k)return null;let I=a.get(d,m);if(I&&(u!=null&&u.length||I.content!==void 0))return{variantId:I.variantId,assignmentTtlMs:0,content:I.content};let D=y.get(d);if(D)return D;let l=(async()=>{await S;try{let p={sessionId:k,componentId:d,variantIds:u};T!==void 0?p.agentDataByVariant=T:h!==void 0&&(p.agentData=h);let w=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify(p),headers:s});if(!w.ok)return null;let E=await w.json();return a.set(d,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(p){return null}finally{y.delete(d)}})();return y.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${i}/weights`,{headers:s});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),r.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(U.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=x)}return x}export{ye as a,De as b,we as c};