@sentientui/core 0.3.0 → 0.3.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
+ var te=Object.defineProperty,ne=Object.defineProperties;var re=Object.getOwnPropertyDescriptors;var q=Object.getOwnPropertySymbols;var se=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var V=(e,t,n)=>t in e?te(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t)=>{for(var n in t||(t={}))se.call(t,n)&&V(e,n,t[n]);if(q)for(var n of q(t))ie.call(t,n)&&V(e,n,t[n]);return e},P=(e,t)=>ne(e,re(t));var oe="_snt_uid";var T="_snt_uid";function ae(){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 de(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(s){}}function ue(e){try{return localStorage.getItem(e)}catch(t){return null}}function le(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function ge(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function me(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function fe(e){try{sessionStorage.removeItem(e)}catch(t){}}function pe(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 ye(e){try{localStorage.removeItem(e)}catch(t){}}function he(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Se={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function X(e){var u,g,p,h,S;if(typeof window=="undefined")return Se;let t=(u=e==null?void 0:e.cookieName)!=null?u:oe,s=((g=e==null?void 0:e.cookieTTLDays)!=null?g:365)*24*60*60,r=(S=(h=(p=ce(t))!=null?p:ue(T))!=null?h:ge(T))!=null?S:ae();de(t,r,s);let o=le(T,r),i=pe(t),a=o?!1:me(T,r),d=!o&&!i&&!a;return{getSessionId:()=>r,isEphemeral:()=>d,destroy:()=>{r=null,he(t),ye(T),fe(T)}}}var M="_snt_retry";var ve={push:()=>{},flush:()=>{},destroy:()=>{}};function xe(e){try{let t=localStorage.getItem(M);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(M),n.slice(-e)):[]}catch(t){return[]}}function z(e,t){try{let s=[...(()=>{try{let r=localStorage.getItem(M);if(!r)return[];let o=JSON.parse(r);return Array.isArray(o)?o:[]}catch(r){return[]}})(),...e].slice(-t);localStorage.setItem(M,JSON.stringify(s))}catch(n){}}function H(e){var E,_,Y;if(typeof window=="undefined")return ve;let t=(E=e.flushIntervalMs)!=null?E:5e3,n=(_=e.maxBatchSize)!=null?_:20,s=(Y=e.maxRetrySize)!=null?Y:100,r=e.ingestUrl,o=e.apiKey,i=[],a=new Set,d=[],u=c=>{for(let f of c)g.delete(f),!a.has(f)&&(a.add(f),d.push(f));for(;d.length>500;){let f=d.shift();f&&a.delete(f)}},g=new Set,p=c=>{a.has(c.id)||g.has(c.id)||(g.add(c.id),i.push(c))},h=xe(s);for(let c of h)p(c);let S=0,v=0,O=c=>{if(c.length===0)return;let f=JSON.stringify(c),I=c.map(w=>w.id),A;try{A=fetch(r,{method:"POST",keepalive:!0,body:f,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(w){z(c,s);for(let j of I)g.delete(j);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let D=w=>{if(w.ok||w.status>=400&&w.status<500&&w.status!==429){u(I),v=0,S=0;return}z(c,s);for(let j of I)g.delete(j);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};A instanceof Promise?A.then(D).catch(()=>{z(c,s);for(let w of I)g.delete(w);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):D(A)},k=typeof TextEncoder!="undefined"?new TextEncoder:null,U=c=>k?k.encode(c).length:c.length,R=c=>{let f=[],I=2;for(let A of c){let D=U(JSON.stringify(A))+1;if(f.length>0&&I+D>57344||f.length>=n)break;f.push(A),I+=D}return f},x=()=>{try{if(Date.now()<S)return;for(;i.length>0;){let c=i.filter(I=>!a.has(I.id));if(i.length=0,c.length===0)break;let f=R(c);if(f.length===0)break;f.length<c.length&&i.push(...c.slice(f.length)),O(f)}}catch(c){}},l=!0,m=null;m=setInterval(()=>{l&&x()},t);let y=()=>{document.visibilityState==="hidden"&&x()},b=()=>{x()};return document.addEventListener("visibilitychange",y),window.addEventListener("beforeunload",b),{push(c){p(c),i.length>=n&&x()},flush:x,destroy(){l=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",y),window.removeEventListener("beforeunload",b),x()}}}var L="_snt_asgn_";function $(e,t){return`${e}:${t}`}function Ie(e,t){return`${L}${e}_${t}`}function W(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(L)&&e.push(n)}return e}catch(e){return[]}}function Z(e=18e5){let t=new Map,n=r=>r.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let r of W())try{let o=localStorage.getItem(r);if(!o)continue;let i=JSON.parse(o);if(n(i)){localStorage.removeItem(r);continue}let a=r.slice(L.length),d=a.lastIndexOf("_");if(d<0)continue;let u=a.slice(0,d),g=a.slice(d+1);t.set($(u,g),i)}catch(o){}})(),{get(r,o){let i=t.get($(r,o));return i?n(i)?(t.delete($(r,o)),null):i:null},set(r,o,i){let a=$(r,o);t.set(a,i);try{localStorage.setItem(Ie(r,o),JSON.stringify(i))}catch(d){}},invalidate(r){let o=`${r}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of W()){let a=i.slice(L.length),d=a.lastIndexOf("_");if(d<0)continue;if(a.slice(0,d)===r)try{localStorage.removeItem(i)}catch(g){}}},clear(){t.clear();for(let r of W())try{localStorage.removeItem(r)}catch(o){}}}}function N(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 K(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(r){}let s=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(s)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(s)?"social":"referral"}catch(n){return"direct"}}function B(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function Q(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function we(e){let t=G("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function G(e,t){var o,i,a,d,u,g,p;let n=(i=(o=t==null?void 0:t.userAgent)==null?void 0:o.trim())!=null?i:"",s=(d=(a=t==null?void 0:t.referer)==null?void 0:a.trim())!=null?d:"",r=(u=t==null?void 0:t.now)!=null?u:new Date;return{sessionId:e,ephemeral:!1,utmParams:(g=t==null?void 0:t.utmParams)!=null?g:{},deviceClass:n?N(n):"desktop",trafficSource:s?K(s,t==null?void 0:t.appOrigin):"direct",referrerDomain:B(s),timeOfDay:Q(r),dayOfWeek:(p=["sun","mon","tue","wed","thu","fri","sat"][r.getDay()])!=null?p:"sun"}}var ee=1500;function J(e,t,n){let s=new AbortController,r=setTimeout(()=>s.abort(),n);return fetch(e,P(C({},t),{signal:s.signal})).finally(()=>clearTimeout(r))}async function Ae(e,t,n){var d;let s=(d=n.timeoutMs)!=null?d:ee,r={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(r.Origin=n.origin);let o=G(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await J(`${n.baseUrl}/sessions`,{method:"POST",headers:r,body:JSON.stringify(o)},s)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(u){}let i=await Promise.allSettled(e.map(async({id:u,variantIds:g})=>{let p=await J(`${n.baseUrl}/assign`,{method:"POST",headers:r,body:JSON.stringify({sessionId:t,componentId:u,variantIds:g})},s);if(!p.ok)return null;let h=await p.json();return{id:u,variantId:h.variantId}})),a={};for(let u of i)u.status==="fulfilled"&&u.value&&(a[u.value.id]=u.value.variantId);return a}function be(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}async function Ee(e,t,n){var a;let s=(a=n.timeoutMs)!=null?a:ee,r={layoutOrder:e.sections,assignments:{},persona:"unknown",confidence:0},o={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(o.Origin=n.origin);let i=G(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{await J(`${n.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(i)},s)}catch(d){}try{let d=await J(`${n.baseUrl}/decide`,{method:"POST",headers:o,body:JSON.stringify({sessionId:t,sections:e.sections.map(u=>({id:u})),components:e.components})},s);return d.ok?await d.json():r}catch(d){return r}}var _e="https://sentient-api.fly.dev/v1/events";function Te(){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 F={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function ke(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,s]of t)n.startsWith("utm_")&&(e[n]=s);return e}catch(e){return{}}}function De(e){return e.replace(/\/events\/?$/,"")}function Ge(e){var O,k,U,R,x;if(typeof window=="undefined"||e.consent===!1)return F;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."),F;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),F;let t=(O=e.ingestUrl)!=null?O:_e,n=Date.now(),s=X(),r=Z(),o=H({ingestUrl:t,apiKey:e.apiKey}),i=De(t),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d=N((k=navigator.userAgent)!=null?k:""),u=typeof window!="undefined"?window.location.origin:void 0,g=K((U=document.referrer)!=null?U:"",u),p=(R=e.sessionSegment)!=null?R:`${d}:${g}`;if(e.initialAssignments)for(let[l,m]of Object.entries(e.initialAssignments))r.set(l,p,{variantId:m,assignedAt:Date.now(),segment:p,confidence:1});let h=Promise.resolve(),S=s.getSessionId();if(S){let l=B((x=document.referrer)!=null?x:""),m=C({sessionId:S,deviceClass:d,trafficSource:g,referrerDomain:l,utmParams:ke(),timeOfDay:Q(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:s.isEphemeral()},e.userId?{userId:e.userId}:{});try{h=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:a}).then(y=>{y.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(y){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let v={goal(l,m={}){let y=s.getSessionId();y&&h.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,name:l,metadata:m}),headers:a}).catch(()=>{})})},identify(l){let m=s.getSessionId();m&&h.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:l,ephemeral:s.isEphemeral()}),headers:a}).catch(()=>{})})},track(l){let m=s.getSessionId();if(!m)return;let y=P(C({},l),{id:Te(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});o.push(y),e.debug&&console.log("[sentient] track",y)},getAssignment(l,m){return r.get(l,m)},async assign(l,m){let y=s.getSessionId();if(!y)return null;let b=r.get(l,p);if(b)return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};await h;try{let E=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify({sessionId:y,componentId:l,variantIds:m}),headers:a});if(!E.ok)return null;let _=await E.json();return r.set(l,p,{variantId:_.variantId,assignedAt:Date.now(),segment:p,confidence:1,content:_.content}),_}catch(E){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),s.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let l=window;l.__sentient&&(l.__sentient.client=v)}return v}export{C as a,P as b,N as c,K as d,B as e,Q as f,we as g,Ae as h,be as i,Ee as j,Ge as k};
@@ -1 +1 @@
1
- "use strict";var $=Object.defineProperty,de=Object.defineProperties,ue=Object.getOwnPropertyDescriptor,ge=Object.getOwnPropertyDescriptors,le=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols;var ee=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var Z=(e,t,n)=>t in e?$(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,_=(e,t)=>{for(var n in t||(t={}))ee.call(t,n)&&Z(e,n,t[n]);if(X)for(var n of X(t))pe.call(t,n)&&Z(e,n,t[n]);return e},L=(e,t)=>de(e,ge(t));var me=(e,t)=>{for(var n in t)$(e,n,{get:t[n],enumerable:!0})},fe=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of le(t))!ee.call(e,o)&&o!==n&&$(e,o,{get:()=>t[o],enumerable:!(a=ue(t,o))||a.enumerable});return e};var he=e=>fe($({},"__esModule",{value:!0}),e);var nt={};me(nt,{deriveSessionSegment:()=>z,detectDeviceClass:()=>k,detectTimeOfDay:()=>R,detectTrafficSource:()=>N,init:()=>tt,preloadAssignments:()=>q,readSessionCookie:()=>W,referrerDomainFromReferer:()=>D});module.exports=he(nt);var ye="_snt_uid";var O="_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 Ie(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(a){}}function Ee(e){try{return localStorage.getItem(e)}catch(t){return null}}function we(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function be(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function Ce(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function Ae(e){try{sessionStorage.removeItem(e)}catch(t){}}function _e(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 Te(e){try{localStorage.removeItem(e)}catch(t){}}function xe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Oe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function te(e){var d,g,l,m,u;if(typeof window=="undefined")return Oe;let t=(d=e==null?void 0:e.cookieName)!=null?d:ye,a=((g=e==null?void 0:e.cookieTTLDays)!=null?g:365)*24*60*60,o=(u=(m=(l=ve(t))!=null?l:Ee(O))!=null?m:be(O))!=null?u:Se();Ie(t,o,a);let i=we(O,o),r=_e(t),s=i?!1:Ce(O,o),c=!i&&!r&&!s;return{getSessionId:()=>o,isEphemeral:()=>c,destroy:()=>{o=null,xe(t),Te(O),Ae(O)}}}var K="_snt_retry";var ke={push:()=>{},flush:()=>{},destroy:()=>{}};function Ne(e){try{let t=localStorage.getItem(K);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(K),n.slice(-e)):[]}catch(t){return[]}}function F(e,t){try{let a=[...(()=>{try{let o=localStorage.getItem(K);if(!o)return[];let i=JSON.parse(o);return Array.isArray(i)?i:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(K,JSON.stringify(a))}catch(n){}}function ne(e){var v,P,T;if(typeof window=="undefined")return ke;let t=(v=e.flushIntervalMs)!=null?v:5e3,n=(P=e.maxBatchSize)!=null?P:20,a=(T=e.maxRetrySize)!=null?T:100,o=e.ingestUrl,i=e.apiKey,r=[],s=new Set,c=[],d=p=>{for(let S of p)s.has(S)||(s.add(S),c.push(S));for(;c.length>500;){let S=c.shift();S&&s.delete(S)}},g=new Set,l=p=>{s.has(p.id)||g.has(p.id)||(g.add(p.id),r.push(p))},m=Ne(a);for(let p of m)l(p);let u=0,f=0,E=p=>{if(p.length===0)return;let S=JSON.stringify(p),x=p.map(A=>A.id),C;try{C=fetch(o,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(A){F(p,a),f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6));return}let M=A=>{if(A.ok||A.status>=400&&A.status<500&&A.status!==429){d(x),f=0,u=0;return}F(p,a),f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6))};C instanceof Promise?C.then(M).catch(()=>{F(p,a),f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6))}):M(C)},w=p=>{let S=[],x=2;for(let C of p){let M=JSON.stringify(C).length+1;if(S.length>0&&x+M>57344||S.length>=n)break;S.push(C),x+=M}return S},I=()=>{try{if(Date.now()<u)return;for(;r.length>0;){let p=r.filter(x=>!s.has(x.id));if(r.length=0,p.length===0)break;let S=w(p);if(S.length===0)break;S.length<p.length&&r.push(...p.slice(S.length)),E(S)}}catch(p){}},U=!0,b=null;b=setInterval(()=>{U&&I()},t);let h=()=>{document.visibilityState==="hidden"&&I()},y=()=>{I()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",y),{push(p){l(p),r.length>=n&&I()},flush:I,destroy(){U=!1,b!==null&&(clearInterval(b),b=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",y),I()}}}var B="_snt_asgn_";function G(e,t){return`${e}:${t}`}function De(e,t){return`${B}${e}_${t}`}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(B)&&e.push(n)}return e}catch(e){return[]}}function re(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of J())try{let i=localStorage.getItem(o);if(!i)continue;let r=JSON.parse(i);if(n(r)){localStorage.removeItem(o);continue}let s=o.slice(B.length),c=s.lastIndexOf("_");if(c<0)continue;let d=s.slice(0,c),g=s.slice(c+1);t.set(G(d,g),r)}catch(i){}})(),{get(o,i){let r=t.get(G(o,i));return r?n(r)?(t.delete(G(o,i)),null):r:null},set(o,i,r){let s=G(o,i);t.set(s,r);try{localStorage.setItem(De(o,i),JSON.stringify(r))}catch(c){}},invalidate(o){let i=`${o}:`;for(let r of[...t.keys()])r.startsWith(i)&&t.delete(r);for(let r of J()){let s=r.slice(B.length),c=s.lastIndexOf("_");if(c<0)continue;if(s.slice(0,c)===o)try{localStorage.removeItem(r)}catch(g){}}},clear(){t.clear();for(let o of J())try{localStorage.removeItem(o)}catch(i){}}}}function k(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 N(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 a=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(a)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(a)?"social":"referral"}catch(n){return"direct"}}function D(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function R(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function z(e){let t=Q("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Q(e,t){var i,r,s,c,d,g,l;let n=(r=(i=t==null?void 0:t.userAgent)==null?void 0:i.trim())!=null?r:"",a=(c=(s=t==null?void 0:t.referer)==null?void 0:s.trim())!=null?c:"",o=(d=t==null?void 0:t.now)!=null?d:new Date;return{sessionId:e,ephemeral:!1,utmParams:(g=t==null?void 0:t.utmParams)!=null?g:{},deviceClass:n?k(n):"desktop",trafficSource:a?N(a,t==null?void 0:t.appOrigin):"direct",referrerDomain:D(a),timeOfDay:R(o),dayOfWeek:(l=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?l:"sun"}}async function q(e,t,n){let a={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(a.Origin=n.origin);let o=Q(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await fetch(`${n.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(o)})).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(s){}let i=await Promise.allSettled(e.map(async({id:s,variantIds:c})=>{let d=await fetch(`${n.baseUrl}/assign`,{method:"POST",headers:a,body:JSON.stringify({sessionId:t,componentId:s,variantIds:c})});if(!d.ok)return null;let g=await d.json();return{id:s,variantId:g.variantId}})),r={};for(let s of i)s.status==="fulfilled"&&s.value&&(r[s.value.id]=s.value.variantId);return r}function W(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}var Re="https://sentient-api.fly.dev/v1/events";function Ue(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return`evt-${Date.now()}-${Math.random().toString(16).slice(2)}`}var j={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Pe(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,a]of t)n.startsWith("utm_")&&(e[n]=a);return e}catch(e){return{}}}function Me(e){return e.replace(/\/events\/?$/,"")}function se(e){var E,w,I,U,b;if(typeof window=="undefined"||e.consent===!1)return j;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."),j;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),j;let t=(E=e.ingestUrl)!=null?E:Re,n=Date.now(),a=te(),o=re(),i=ne({ingestUrl:t,apiKey:e.apiKey}),r=Me(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c=k((w=navigator.userAgent)!=null?w:""),d=typeof window!="undefined"?window.location.origin:void 0,g=N((I=document.referrer)!=null?I:"",d),l=(U=e.sessionSegment)!=null?U:`${c}:${g}`;if(e.initialAssignments)for(let[h,y]of Object.entries(e.initialAssignments))o.set(h,l,{variantId:y,assignedAt:Date.now(),segment:l,confidence:1});let m=Promise.resolve(),u=a.getSessionId();if(u){let h=D((b=document.referrer)!=null?b:""),y=_({sessionId:u,deviceClass:c,trafficSource:g,referrerDomain:h,utmParams:Pe(),timeOfDay:R(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:a.isEphemeral()},e.userId?{userId:e.userId}:{});try{m=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(y),headers:s}).then(v=>{v.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(v){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let f={goal(h,y={}){let v=a.getSessionId();v&&m.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:v,name:h,metadata:y}),headers:s}).catch(()=>{})})},identify(h){let y=a.getSessionId();y&&m.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,userId:h,ephemeral:a.isEphemeral()}),headers:s}).catch(()=>{})})},track(h){let y=a.getSessionId();if(!y)return;let v=L(_({},h),{id:Ue(),sessionId:y,timestamp:Date.now(),timeInSession:Date.now()-n});i.push(v),e.debug&&console.log("[sentient] track",v)},getAssignment(h,y){return o.get(h,y)},async assign(h,y){let v=a.getSessionId();if(!v)return null;let P=o.get(h,l);if(P)return{variantId:P.variantId,assignmentTtlMs:0};await m;try{let T=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify({sessionId:v,componentId:h,variantIds:y}),headers:s});if(!T.ok)return null;let p=await T.json();return o.set(h,l,{variantId:p.variantId,assignedAt:Date.now(),segment:l,confidence:1}),p}catch(T){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),a.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let h=window;h.__sentient&&(h.__sentient.client=f)}return f}var $e=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Le="h1, h2, h3",Ke={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function Y(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function Ge(e){var t,n,a;try{let o=e;for(let i of Object.keys(o)){if(!i.startsWith("__reactFiber")&&!i.startsWith("__reactInternalInstance"))continue;let r=o[i],s=(a=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?a:(n=r==null?void 0:r.type)==null?void 0:n.name;if(s&&s.length>1)return s}}catch(o){}}function Be(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 Fe(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function Je(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function H(e,t){var a,o,i;let n=e.querySelector(Le);return{componentId:Fe(e),semanticType:je(e),ariaLabel:(a=e.getAttribute("aria-label"))!=null?a:void 0,headingText:(i=(o=n==null?void 0:n.textContent)==null?void 0:o.trim())!=null?i:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:Je(e),reactComponentName:Ge(e),dataAttributes:Be(e)}}function oe(e){var i;let t=[],n=new Set,a="__root__",o=new Map;for(let[r,s]of e){let c=r.parentElement,d=a;for(;c;){if(e.has(c)){d=e.get(c);let l=e.get(r),m=`${d}->${l}`;!n.has(m)&&d!==l&&(n.add(m),t.push({fromComponentId:d,toComponentId:l,weight:.6}));break}c=c.parentElement}let g=(i=o.get(d))!=null?i:[];g.push(r),o.set(d,g)}for(let r of o.values())if(!(r.length<2))for(let s=0;s<r.length;s++)for(let c=s+1;c<r.length;c++){let d=e.get(r[s]),g=e.get(r[c]);if(d===g)continue;let l=`${d}->${g}::sib`,m=`${g}->${d}::sib`;n.has(l)||(n.add(l),t.push({fromComponentId:d,toComponentId:g,weight:.3})),n.has(m)||(n.add(m),t.push({fromComponentId:g,toComponentId:d,weight:.3}))}return t}function ze(e){let t=[],n=new Set,a=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let s=H(r,e);t.push(s),a.set(r,s.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let s=r.hasAttribute("aria-label"),c=r.hasAttribute("data-sentient-id");if(!s&&!c)return;n.add(r);let d=H(r,e);t.push(d),a.set(r,d.componentId)}),{nodes:t,edges:oe(a)}}function ie(){if(typeof window=="undefined")return Ke;let e=null,t=0,n=null,a=s=>{try{let c=window.getComputedStyle(s),d=parseFloat(c.fontSize)||12,g=parseFloat(c.zIndex)||0,l=s.getBoundingClientRect(),m=Math.max(l.top,0),u=window.innerHeight||1,f=1/(m/u+1),E=Y(d,12,48)*.4+Y(f,0,1)*.4+Y(g,0,100)*.2;return Math.max(0,Math.min(1,E))}catch(c){return .5}};return{scan:()=>new Promise(s=>{let c=()=>{let{nodes:d,edges:g}=ze(a);s({nodes:d,edges:g,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(c,{timeout:100}):c()}catch(d){c()}}),observe:s=>{n=s;try{e=new MutationObserver(c=>{let d=[],g=new Map;for(let l of c)l.type==="childList"&&l.addedNodes.forEach(m=>{if(!(m instanceof Element)||!$e.has(m.tagName))return;let u=m.hasAttribute("data-sentient-id"),f=m.hasAttribute("aria-label");if(!u&&!f)return;let E=H(m,a);d.push(E),g.set(m,E.componentId)});d.length>0&&n&&n({nodes:d,edges:oe(g),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(c){}},getProminenceScore:a,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(s){}t=0,n=null}}}var V="_snt_graph_nodes",ae="_snt_graph_edges",Qe={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function qe(e){var t;return(t=Qe[e])!=null?t:[]}function We(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function Ye(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var He=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function Ve(e){return He.has(e)?e:"generic"}function Xe(e,t,n){let a=`${e}:${t}:${n.join(",")}`,o=5381;for(let i=0;i<a.length;i++)o=(o<<5)+o+a.charCodeAt(i)&4294967295;return(o>>>0).toString(16).padStart(8,"0")}function ce(e){let t=new Map,n=new Map,a=()=>{typeof window!="undefined"&&Ye(V,[...t.values()])},o=i=>{var r;try{let s=JSON.parse(i);t.clear();for(let c of(r=s.pageNodes)!=null?r:[])t.set(c.componentId,c)}catch(s){}};if(typeof window!="undefined"){let i=We(V,[]);for(let r of i)t.set(r.componentId,r);try{localStorage.removeItem(ae)}catch(r){}}return{addPageNode(i){t.set(i.componentId,i),a()},addStructuralEdge(i){let r=`${i.fromComponentId}->${i.toComponentId}`;n.set(r,i)},syncOnce(){var r,s;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let i=[...t.values()];if(i.length!==0)try{let c=new Map;for(let u of i){let f=(r=c.get(u.semanticType))!=null?r:[];f.push(u),c.set(u.semanticType,f)}let d=[],g=new Set;for(let u of i)for(let f of qe(u.semanticType)){let E=(s=c.get(f))!=null?s:[];for(let w of E){if(w.componentId===u.componentId)continue;let I=`semantic:${u.componentId}->${w.componentId}`;g.has(I)||(g.add(I),d.push({fromComponentId:u.componentId,toComponentId:w.componentId,type:"semantic",weight:.4,confidence:.9}))}}let l=new Set(i.map(u=>u.componentId));for(let u of n.values()){if(!l.has(u.fromComponentId)||!l.has(u.toComponentId))continue;let f=`structural:${u.fromComponentId}->${u.toComponentId}`;g.has(f)||(g.add(f),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let m={pageUrl:window.location.href,nodes:i.map(u=>{let f=Ve(u.semanticType);return{componentId:u.componentId,semanticType:f,answers:u.answers,contentHash:Xe(u.componentId,f,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:_({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(m)}).catch(()=>{})}catch(c){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:o,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(V),localStorage.removeItem(ae)}catch(i){}}}}var Ze="https://sentient-api.fly.dev/v1/events";function et(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function tt(e){var i;let t=se(e);if(!e.graph||typeof window=="undefined")return t;let n=ie(),a=(i=e.ingestUrl)!=null?i:Ze,o=ce({syncUrl:a.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:et()});try{let r=localStorage.getItem("_snt_graph_nodes");r&&o.restore(JSON.stringify({pageNodes:JSON.parse(r)}))}catch(r){}return n.scan().then(r=>{for(let s of r.nodes)o.addPageNode({id:s.componentId,componentId:s.componentId,semanticType:s.semanticType,answers:s.headingText?[s.headingText]:[],prominenceScore:s.prominenceScore,depth:s.depth});for(let s of r.edges)o.addStructuralEdge(s);o.syncOnce()}),n.observe(r=>{for(let s of r.nodes)o.addPageNode({id:s.componentId,componentId:s.componentId,semanticType:s.semanticType,answers:s.headingText?[s.headingText]:[],prominenceScore:s.prominenceScore,depth:s.depth});for(let s of r.edges)o.addStructuralEdge(s)}),L(_({},t),{getGraph:()=>o.snapshot(),destroy:()=>{n.destroy(),o.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,preloadAssignments,readSessionCookie,referrerDomainFromReferer});
1
+ "use strict";var K=Object.defineProperty,pe=Object.defineProperties,me=Object.getOwnPropertyDescriptor,fe=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,te=Object.getOwnPropertySymbols;var re=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ne=(e,t,n)=>t in e?K(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t)=>{for(var n in t||(t={}))re.call(t,n)&&ne(e,n,t[n]);if(te)for(var n of te(t))ye.call(t,n)&&ne(e,n,t[n]);return e},N=(e,t)=>pe(e,fe(t));var Se=(e,t)=>{for(var n in t)K(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of he(t))!re.call(e,s)&&s!==n&&K(e,s,{get:()=>t[s],enumerable:!(a=me(t,s))||a.enumerable});return e};var Ie=e=>ve(K({},"__esModule",{value:!0}),e);var at={};Se(at,{deriveSessionSegment:()=>q,detectDeviceClass:()=>R,detectTimeOfDay:()=>M,detectTrafficSource:()=>U,init:()=>it,preloadAssignments:()=>Y,readSessionCookie:()=>H,referrerDomainFromReferer:()=>P});module.exports=Ie(at);var Ee="_snt_uid";var D="_snt_uid";function we(){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 Ae(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(a){}}function Ce(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 Te(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 Oe(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 Ne(e){try{localStorage.removeItem(e)}catch(t){}}function De(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Re={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function se(e){var d,g,l,p,u;if(typeof window=="undefined")return Re;let t=(d=e==null?void 0:e.cookieName)!=null?d:Ee,a=((g=e==null?void 0:e.cookieTTLDays)!=null?g:365)*24*60*60,s=(u=(p=(l=be(t))!=null?l:Ce(D))!=null?p:Te(D))!=null?u:we();Ae(t,s,a);let i=xe(D,s),r=ke(t),o=i?!1:_e(D,s),c=!i&&!r&&!o;return{getSessionId:()=>s,isEphemeral:()=>c,destroy:()=>{s=null,De(t),Ne(D),Oe(D)}}}var G="_snt_retry";var Ue={push:()=>{},flush:()=>{},destroy:()=>{}};function Pe(e){try{let t=localStorage.getItem(G);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(G),n.slice(-e)):[]}catch(t){return[]}}function z(e,t){try{let a=[...(()=>{try{let s=localStorage.getItem(G);if(!s)return[];let i=JSON.parse(s);return Array.isArray(i)?i:[]}catch(s){return[]}})(),...e].slice(-t);localStorage.setItem(G,JSON.stringify(a))}catch(n){}}function oe(e){var O,k,ee;if(typeof window=="undefined")return Ue;let t=(O=e.flushIntervalMs)!=null?O:5e3,n=(k=e.maxBatchSize)!=null?k:20,a=(ee=e.maxRetrySize)!=null?ee:100,s=e.ingestUrl,i=e.apiKey,r=[],o=new Set,c=[],d=m=>{for(let S of m)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,l=m=>{o.has(m.id)||g.has(m.id)||(g.add(m.id),r.push(m))},p=Pe(a);for(let m of p)l(m);let u=0,f=0,I=m=>{if(m.length===0)return;let S=JSON.stringify(m),b=m.map(A=>A.id),T;try{T=fetch(s,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(A){z(m,a);for(let J of b)g.delete(J);f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6));return}let $=A=>{if(A.ok||A.status>=400&&A.status<500&&A.status!==429){d(b),f=0,u=0;return}z(m,a);for(let J of b)g.delete(J);f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6))};T instanceof Promise?T.then($).catch(()=>{z(m,a);for(let A of b)g.delete(A);f++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(f,6))}):$(T)},E=typeof TextEncoder!="undefined"?new TextEncoder:null,x=m=>E?E.encode(m).length:m.length,L=m=>{let S=[],b=2;for(let T of m){let $=x(JSON.stringify(T))+1;if(S.length>0&&b+$>57344||S.length>=n)break;S.push(T),b+=$}return S},w=()=>{try{if(Date.now()<u)return;for(;r.length>0;){let m=r.filter(b=>!o.has(b.id));if(r.length=0,m.length===0)break;let S=L(m);if(S.length===0)break;S.length<m.length&&r.push(...m.slice(S.length)),I(S)}}catch(m){}},h=!0,y=null;y=setInterval(()=>{h&&w()},t);let v=()=>{document.visibilityState==="hidden"&&w()},_=()=>{w()};return document.addEventListener("visibilitychange",v),window.addEventListener("beforeunload",_),{push(m){l(m),r.length>=n&&w()},flush:w,destroy(){h=!1,y!==null&&(clearInterval(y),y=null),document.removeEventListener("visibilitychange",v),window.removeEventListener("beforeunload",_),w()}}}var F="_snt_asgn_";function B(e,t){return`${e}:${t}`}function Me(e,t){return`${F}${e}_${t}`}function Q(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(F)&&e.push(n)}return e}catch(e){return[]}}function ie(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 o=s.slice(F.length),c=o.lastIndexOf("_");if(c<0)continue;let d=o.slice(0,c),g=o.slice(c+1);t.set(B(d,g),r)}catch(i){}})(),{get(s,i){let r=t.get(B(s,i));return r?n(r)?(t.delete(B(s,i)),null):r:null},set(s,i,r){let o=B(s,i);t.set(o,r);try{localStorage.setItem(Me(s,i),JSON.stringify(r))}catch(c){}},invalidate(s){let i=`${s}:`;for(let r of[...t.keys()])r.startsWith(i)&&t.delete(r);for(let r of Q()){let o=r.slice(F.length),c=o.lastIndexOf("_");if(c<0)continue;if(o.slice(0,c)===s)try{localStorage.removeItem(r)}catch(g){}}},clear(){t.clear();for(let s of Q())try{localStorage.removeItem(s)}catch(i){}}}}function R(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 U(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 a=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(a)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(a)?"social":"referral"}catch(n){return"direct"}}function P(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function M(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function q(e){let t=W("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function W(e,t){var i,r,o,c,d,g,l;let n=(r=(i=t==null?void 0:t.userAgent)==null?void 0:i.trim())!=null?r:"",a=(c=(o=t==null?void 0:t.referer)==null?void 0:o.trim())!=null?c:"",s=(d=t==null?void 0:t.now)!=null?d:new Date;return{sessionId:e,ephemeral:!1,utmParams:(g=t==null?void 0:t.utmParams)!=null?g:{},deviceClass:n?R(n):"desktop",trafficSource:a?U(a,t==null?void 0:t.appOrigin):"direct",referrerDomain:P(a),timeOfDay:M(s),dayOfWeek:(l=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?l:"sun"}}var $e=1500;function ae(e,t,n){let a=new AbortController,s=setTimeout(()=>a.abort(),n);return fetch(e,N(C({},t),{signal:a.signal})).finally(()=>clearTimeout(s))}async function Y(e,t,n){var c;let a=(c=n.timeoutMs)!=null?c:$e,s={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(s.Origin=n.origin);let i=W(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await ae(`${n.baseUrl}/sessions`,{method:"POST",headers:s,body:JSON.stringify(i)},a)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(d){}let r=await Promise.allSettled(e.map(async({id:d,variantIds:g})=>{let l=await ae(`${n.baseUrl}/assign`,{method:"POST",headers:s,body:JSON.stringify({sessionId:t,componentId:d,variantIds:g})},a);if(!l.ok)return null;let p=await l.json();return{id:d,variantId:p.variantId}})),o={};for(let d of r)d.status==="fulfilled"&&d.value&&(o[d.value.id]=d.value.variantId);return o}function H(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}var Le="https://sentient-api.fly.dev/v1/events";function Ke(){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 j={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ge(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,a]of t)n.startsWith("utm_")&&(e[n]=a);return e}catch(e){return{}}}function Be(e){return e.replace(/\/events\/?$/,"")}function ce(e){var I,E,x,L,w;if(typeof window=="undefined"||e.consent===!1)return j;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."),j;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),j;let t=(I=e.ingestUrl)!=null?I:Le,n=Date.now(),a=se(),s=ie(),i=oe({ingestUrl:t,apiKey:e.apiKey}),r=Be(t),o={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c=R((E=navigator.userAgent)!=null?E:""),d=typeof window!="undefined"?window.location.origin:void 0,g=U((x=document.referrer)!=null?x:"",d),l=(L=e.sessionSegment)!=null?L:`${c}:${g}`;if(e.initialAssignments)for(let[h,y]of Object.entries(e.initialAssignments))s.set(h,l,{variantId:y,assignedAt:Date.now(),segment:l,confidence:1});let p=Promise.resolve(),u=a.getSessionId();if(u){let h=P((w=document.referrer)!=null?w:""),y=C({sessionId:u,deviceClass:c,trafficSource:g,referrerDomain:h,utmParams:Ge(),timeOfDay:M(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:a.isEphemeral()},e.userId?{userId:e.userId}:{});try{p=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(y),headers:o}).then(v=>{v.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(v){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let f={goal(h,y={}){let v=a.getSessionId();v&&p.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:v,name:h,metadata:y}),headers:o}).catch(()=>{})})},identify(h){let y=a.getSessionId();y&&p.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,userId:h,ephemeral:a.isEphemeral()}),headers:o}).catch(()=>{})})},track(h){let y=a.getSessionId();if(!y)return;let v=N(C({},h),{id:Ke(),sessionId:y,timestamp:Date.now(),timeInSession:Date.now()-n});i.push(v),e.debug&&console.log("[sentient] track",v)},getAssignment(h,y){return s.get(h,y)},async assign(h,y){let v=a.getSessionId();if(!v)return null;let _=s.get(h,l);if(_)return{variantId:_.variantId,assignmentTtlMs:0,content:_.content};await p;try{let O=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify({sessionId:v,componentId:h,variantIds:y}),headers:o});if(!O.ok)return null;let k=await O.json();return s.set(h,l,{variantId:k.variantId,assignedAt:Date.now(),segment:l,confidence:1,content:k.content}),k}catch(O){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),a.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let h=window;h.__sentient&&(h.__sentient.client=f)}return f}var Fe=new Set(["SECTION","ARTICLE","MAIN","DIV"]),je="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,a;try{let s=e;for(let i of Object.keys(s)){if(!i.startsWith("__reactFiber")&&!i.startsWith("__reactInternalInstance"))continue;let r=s[i],o=(a=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?a:(n=r==null?void 0:r.type)==null?void 0:n.name;if(o&&o.length>1)return o}}catch(s){}}function Qe(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 We(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function Ye(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function X(e,t){var a,s,i;let n=e.querySelector(je);return{componentId:We(e),semanticType:qe(e),ariaLabel:(a=e.getAttribute("aria-label"))!=null?a: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:Ye(e),reactComponentName:ze(e),dataAttributes:Qe(e)}}function de(e){var i;let t=[],n=new Set,a="__root__",s=new Map;for(let[r,o]of e){let c=r.parentElement,d=a;for(;c;){if(e.has(c)){d=e.get(c);let l=e.get(r),p=`${d}->${l}`;!n.has(p)&&d!==l&&(n.add(p),t.push({fromComponentId:d,toComponentId:l,weight:.6}));break}c=c.parentElement}let g=(i=s.get(d))!=null?i:[];g.push(r),s.set(d,g)}for(let r of s.values())if(!(r.length<2))for(let o=0;o<r.length;o++)for(let c=o+1;c<r.length;c++){let d=e.get(r[o]),g=e.get(r[c]);if(d===g)continue;let l=`${d}->${g}::sib`,p=`${g}->${d}::sib`;n.has(l)||(n.add(l),t.push({fromComponentId:d,toComponentId:g,weight:.3})),n.has(p)||(n.add(p),t.push({fromComponentId:g,toComponentId:d,weight:.3}))}return t}function He(e){let t=[],n=new Set,a=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let o=X(r,e);t.push(o),a.set(r,o.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let o=r.hasAttribute("aria-label"),c=r.hasAttribute("data-sentient-id");if(!o&&!c)return;n.add(r);let d=X(r,e);t.push(d),a.set(r,d.componentId)}),{nodes:t,edges:de(a)}}function ue(){if(typeof window=="undefined")return Je;let e=null,t=0,n=null,a=o=>{try{let c=window.getComputedStyle(o),d=parseFloat(c.fontSize)||12,g=parseFloat(c.zIndex)||0,l=o.getBoundingClientRect(),p=Math.max(l.top,0),u=window.innerHeight||1,f=1/(p/u+1),I=V(d,12,48)*.4+V(f,0,1)*.4+V(g,0,100)*.2;return Math.max(0,Math.min(1,I))}catch(c){return .5}};return{scan:()=>new Promise(o=>{let c=()=>{let{nodes:d,edges:g}=He(a);o({nodes:d,edges:g,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(c,{timeout:100}):c()}catch(d){c()}}),observe:o=>{n=o;try{e=new MutationObserver(c=>{let d=[],g=new Map;for(let l of c)l.type==="childList"&&l.addedNodes.forEach(p=>{if(!(p instanceof Element)||!Fe.has(p.tagName))return;let u=p.hasAttribute("data-sentient-id"),f=p.hasAttribute("aria-label");if(!u&&!f)return;let I=X(p,a);d.push(I),g.set(p,I.componentId)});d.length>0&&n&&n({nodes:d,edges:de(g),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(c){}},getProminenceScore:a,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(o){}t=0,n=null}}}var Z="_snt_graph_nodes",ge="_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 Xe(e){var t;return(t=Ve[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 a=`${e}:${t}:${n.join(",")}`,s=5381;for(let i=0;i<a.length;i++)s=(s<<5)+s+a.charCodeAt(i)&4294967295;return(s>>>0).toString(16).padStart(8,"0")}function le(e){let t=new Map,n=new Map,a=()=>{typeof window!="undefined"&&et(Z,[...t.values()])},s=i=>{var r;try{let o=JSON.parse(i);t.clear();for(let c of(r=o.pageNodes)!=null?r:[])t.set(c.componentId,c)}catch(o){}};if(typeof window!="undefined"){let i=Ze(Z,[]);for(let r of i)t.set(r.componentId,r);try{localStorage.removeItem(ge)}catch(r){}}return{addPageNode(i){t.set(i.componentId,i),a()},addStructuralEdge(i){let r=`${i.fromComponentId}->${i.toComponentId}`;n.set(r,i)},syncOnce(){var r,o;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let i=[...t.values()];if(i.length!==0)try{let c=new Map;for(let u of i){let f=(r=c.get(u.semanticType))!=null?r:[];f.push(u),c.set(u.semanticType,f)}let d=[],g=new Set;for(let u of i)for(let f of Xe(u.semanticType)){let I=(o=c.get(f))!=null?o:[];for(let E of I){if(E.componentId===u.componentId)continue;let x=`semantic:${u.componentId}->${E.componentId}`;g.has(x)||(g.add(x),d.push({fromComponentId:u.componentId,toComponentId:E.componentId,type:"semantic",weight:.4,confidence:.9}))}}let l=new Set(i.map(u=>u.componentId));for(let u of n.values()){if(!l.has(u.fromComponentId)||!l.has(u.toComponentId))continue;let f=`structural:${u.fromComponentId}->${u.toComponentId}`;g.has(f)||(g.add(f),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let p={pageUrl:window.location.href,nodes:i.map(u=>{let f=nt(u.semanticType);return{componentId:u.componentId,semanticType:f,answers:u.answers,contentHash:rt(u.componentId,f,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:C({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(p)}).catch(()=>{})}catch(c){}},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(Z),localStorage.removeItem(ge)}catch(i){}}}}var st="https://sentient-api.fly.dev/v1/events";function ot(){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=ce(e);if(!e.graph||typeof window=="undefined")return t;let n=ue(),a=(i=e.ingestUrl)!=null?i:st,s=le({syncUrl:a.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:ot()});try{let r=localStorage.getItem("_snt_graph_nodes");r&&s.restore(JSON.stringify({pageNodes:JSON.parse(r)}))}catch(r){}return n.scan().then(r=>{for(let o of r.nodes)s.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 r.edges)s.addStructuralEdge(o);s.syncOnce()}),n.observe(r=>{for(let o of r.nodes)s.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 r.edges)s.addStructuralEdge(o)}),N(C({},t),{getGraph:()=>s.snapshot(),destroy:()=>{n.destroy(),s.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,preloadAssignments,readSessionCookie,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{a as h,b,c as x,d as _,e as O,f as M,g as R,h as P,i as D,k as v}from"./chunk-HWKW5O3R.mjs";var G=new Set(["SECTION","ARTICLE","MAIN","DIV"]),k="h1, h2, h3",$={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 L(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 o=d[s],r=(p=(t=o==null?void 0:o.type)==null?void 0:t.displayName)!=null?p:(n=o==null?void 0:o.type)==null?void 0:n.name;if(r&&r.length>1)return r}}catch(d){}}function U(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function j(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function F(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function K(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(k);return{componentId:F(e),semanticType:j(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:K(e),reactComponentName:L(e),dataAttributes:U(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[o,r]of e){let a=o.parentElement,c=p;for(;a;){if(e.has(a)){c=e.get(a);let m=e.get(o),g=`${c}->${m}`;!n.has(g)&&c!==m&&(n.add(g),t.push({fromComponentId:c,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(c))!=null?s:[];u.push(o),d.set(c,u)}for(let o of d.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let a=r+1;a<o.length;a++){let c=e.get(o[r]),u=e.get(o[a]);if(c===u)continue;let m=`${c}->${u}::sib`,g=`${u}->${c}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:c,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:c,weight:.3}))}return t}function q(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(o=>{if(o instanceof Element&&!n.has(o)){n.add(o);let r=I(o,e);t.push(r),p.set(o,r.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(o=>{if(!(o instanceof Element)||n.has(o))return;let r=o.hasAttribute("aria-label"),a=o.hasAttribute("data-sentient-id");if(!r&&!a)return;n.add(o);let c=I(o,e);t.push(c),p.set(o,c.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return $;let e=null,t=0,n=null,p=r=>{try{let a=window.getComputedStyle(r),c=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=r.getBoundingClientRect(),g=Math.max(m.top,0),i=window.innerHeight||1,f=1/(g/i+1),l=S(c,12,48)*.4+S(f,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,l))}catch(a){return .5}};return{scan:()=>new Promise(r=>{let a=()=>{let{nodes:c,edges:u}=q(p);r({nodes:c,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(c){a()}}),observe:r=>{n=r;try{e=new MutationObserver(a=>{let c=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!G.has(g.tagName))return;let i=g.hasAttribute("data-sentient-id"),f=g.hasAttribute("aria-label");if(!i&&!f)return;let l=I(g,p);c.push(l),u.set(g,l.componentId)});c.length>0&&n&&n({nodes:c,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(r){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",z={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function H(e){var t;return(t=z[e])!=null?t:[]}function J(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function B(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var V=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function W(e){return V.has(e)?e:"generic"}function Y(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"&&B(C,[...t.values()])},d=s=>{var o;try{let r=JSON.parse(s);t.clear();for(let a of(o=r.pageNodes)!=null?o:[])t.set(a.componentId,a)}catch(r){}};if(typeof window!="undefined"){let s=J(C,[]);for(let o of s)t.set(o.componentId,o);try{localStorage.removeItem(A)}catch(o){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let o=`${s.fromComponentId}->${s.toComponentId}`;n.set(o,s)},syncOnce(){var o,r;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let i of s){let f=(o=a.get(i.semanticType))!=null?o:[];f.push(i),a.set(i.semanticType,f)}let c=[],u=new Set;for(let i of s)for(let f of H(i.semanticType)){let l=(r=a.get(f))!=null?r:[];for(let y of l){if(y.componentId===i.componentId)continue;let E=`semantic:${i.componentId}->${y.componentId}`;u.has(E)||(u.add(E),c.push({fromComponentId:i.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(i=>i.componentId));for(let i of n.values()){if(!m.has(i.fromComponentId)||!m.has(i.toComponentId))continue;let f=`structural:${i.fromComponentId}->${i.toComponentId}`;u.has(f)||(u.add(f),c.push({fromComponentId:i.fromComponentId,toComponentId:i.toComponentId,type:"structural",weight:i.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(i=>{let f=W(i.semanticType);return{componentId:i.componentId,semanticType:f,answers:i.answers,contentHash:Y(i.componentId,f,i.answers),prominenceScore:i.prominenceScore,depthInPage:i.depth}}),edges:c};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 Q="https://sentient-api.fly.dev/v1/events";function X(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function se(e){var s;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(s=e.ingestUrl)!=null?s:Q,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:X()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&d.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}return n.scan().then(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r);d.syncOnce()}),n.observe(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r)}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{n.destroy(),d.destroy(),t.destroy()}})}export{R as deriveSessionSegment,x as detectDeviceClass,M as detectTimeOfDay,_ as detectTrafficSource,se as init,P as preloadAssignments,D as readSessionCookie,O as referrerDomainFromReferer};
1
+ import{a as h,b,c as x,d as _,e as O,f as M,g as R,h as P,i as D,k as v}from"./chunk-6B5JZHAF.mjs";var G=new Set(["SECTION","ARTICLE","MAIN","DIV"]),k="h1, h2, h3",$={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 L(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 o=d[s],r=(p=(t=o==null?void 0:o.type)==null?void 0:t.displayName)!=null?p:(n=o==null?void 0:o.type)==null?void 0:n.name;if(r&&r.length>1)return r}}catch(d){}}function U(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function j(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function F(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function K(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(k);return{componentId:F(e),semanticType:j(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:K(e),reactComponentName:L(e),dataAttributes:U(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[o,r]of e){let a=o.parentElement,c=p;for(;a;){if(e.has(a)){c=e.get(a);let m=e.get(o),g=`${c}->${m}`;!n.has(g)&&c!==m&&(n.add(g),t.push({fromComponentId:c,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(c))!=null?s:[];u.push(o),d.set(c,u)}for(let o of d.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let a=r+1;a<o.length;a++){let c=e.get(o[r]),u=e.get(o[a]);if(c===u)continue;let m=`${c}->${u}::sib`,g=`${u}->${c}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:c,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:c,weight:.3}))}return t}function q(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(o=>{if(o instanceof Element&&!n.has(o)){n.add(o);let r=I(o,e);t.push(r),p.set(o,r.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(o=>{if(!(o instanceof Element)||n.has(o))return;let r=o.hasAttribute("aria-label"),a=o.hasAttribute("data-sentient-id");if(!r&&!a)return;n.add(o);let c=I(o,e);t.push(c),p.set(o,c.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return $;let e=null,t=0,n=null,p=r=>{try{let a=window.getComputedStyle(r),c=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=r.getBoundingClientRect(),g=Math.max(m.top,0),i=window.innerHeight||1,f=1/(g/i+1),l=S(c,12,48)*.4+S(f,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,l))}catch(a){return .5}};return{scan:()=>new Promise(r=>{let a=()=>{let{nodes:c,edges:u}=q(p);r({nodes:c,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(c){a()}}),observe:r=>{n=r;try{e=new MutationObserver(a=>{let c=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!G.has(g.tagName))return;let i=g.hasAttribute("data-sentient-id"),f=g.hasAttribute("aria-label");if(!i&&!f)return;let l=I(g,p);c.push(l),u.set(g,l.componentId)});c.length>0&&n&&n({nodes:c,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(r){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",z={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function H(e){var t;return(t=z[e])!=null?t:[]}function J(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function B(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var V=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function W(e){return V.has(e)?e:"generic"}function Y(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"&&B(C,[...t.values()])},d=s=>{var o;try{let r=JSON.parse(s);t.clear();for(let a of(o=r.pageNodes)!=null?o:[])t.set(a.componentId,a)}catch(r){}};if(typeof window!="undefined"){let s=J(C,[]);for(let o of s)t.set(o.componentId,o);try{localStorage.removeItem(A)}catch(o){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let o=`${s.fromComponentId}->${s.toComponentId}`;n.set(o,s)},syncOnce(){var o,r;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let i of s){let f=(o=a.get(i.semanticType))!=null?o:[];f.push(i),a.set(i.semanticType,f)}let c=[],u=new Set;for(let i of s)for(let f of H(i.semanticType)){let l=(r=a.get(f))!=null?r:[];for(let y of l){if(y.componentId===i.componentId)continue;let E=`semantic:${i.componentId}->${y.componentId}`;u.has(E)||(u.add(E),c.push({fromComponentId:i.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(i=>i.componentId));for(let i of n.values()){if(!m.has(i.fromComponentId)||!m.has(i.toComponentId))continue;let f=`structural:${i.fromComponentId}->${i.toComponentId}`;u.has(f)||(u.add(f),c.push({fromComponentId:i.fromComponentId,toComponentId:i.toComponentId,type:"structural",weight:i.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(i=>{let f=W(i.semanticType);return{componentId:i.componentId,semanticType:f,answers:i.answers,contentHash:Y(i.componentId,f,i.answers),prominenceScore:i.prominenceScore,depthInPage:i.depth}}),edges:c};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 Q="https://sentient-api.fly.dev/v1/events";function X(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function se(e){var s;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(s=e.ingestUrl)!=null?s:Q,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:X()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&d.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}return n.scan().then(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r);d.syncOnce()}),n.observe(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r)}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{n.destroy(),d.destroy(),t.destroy()}})}export{R as deriveSessionSegment,x as detectDeviceClass,M as detectTimeOfDay,_ as detectTrafficSource,se as init,P as preloadAssignments,D as readSessionCookie,O as referrerDomainFromReferer};
package/dist/index.d.cts CHANGED
@@ -43,6 +43,7 @@ type Assignment = {
43
43
  assignedAt: number;
44
44
  segment: string;
45
45
  confidence: number;
46
+ content?: string;
46
47
  };
47
48
  type AssignmentCache = {
48
49
  get(componentId: string, segment: string): Assignment | null;
@@ -152,6 +153,11 @@ type ServerAssignConfig = {
152
153
  /** From `Referer` request header. */
153
154
  referer?: string;
154
155
  utmParams?: Record<string, string>;
156
+ /**
157
+ * Milliseconds to wait for the API before returning default variants.
158
+ * Prevents slow/cold API from blocking SSR. Defaults to 1500.
159
+ */
160
+ timeoutMs?: number;
155
161
  };
156
162
  /** componentId → assigned variantId */
157
163
  type ServerAssignments = Record<string, string>;
package/dist/index.d.ts CHANGED
@@ -43,6 +43,7 @@ type Assignment = {
43
43
  assignedAt: number;
44
44
  segment: string;
45
45
  confidence: number;
46
+ content?: string;
46
47
  };
47
48
  type AssignmentCache = {
48
49
  get(componentId: string, segment: string): Assignment | null;
@@ -152,6 +153,11 @@ type ServerAssignConfig = {
152
153
  /** From `Referer` request header. */
153
154
  referer?: string;
154
155
  utmParams?: Record<string, string>;
156
+ /**
157
+ * Milliseconds to wait for the API before returning default variants.
158
+ * Prevents slow/cold API from blocking SSR. Defaults to 1500.
159
+ */
160
+ timeoutMs?: number;
155
161
  };
156
162
  /** componentId → assigned variantId */
157
163
  type ServerAssignments = Record<string, string>;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var L=Object.defineProperty,ne=Object.defineProperties,re=Object.getOwnPropertyDescriptor,se=Object.getOwnPropertyDescriptors,ie=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,oe=Object.prototype.propertyIsEnumerable;var z=(e,t,n)=>t in e?L(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,G=(e,t)=>{for(var n in t||(t={}))W.call(t,n)&&z(e,n,t[n]);if(j)for(var n of j(t))oe.call(t,n)&&z(e,n,t[n]);return e},Y=(e,t)=>ne(e,se(t));var ae=(e,t)=>{for(var n in t)L(e,n,{get:t[n],enumerable:!0})},ce=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ie(t))!W.call(e,r)&&r!==n&&L(e,r,{get:()=>t[r],enumerable:!(i=re(t,r))||i.enumerable});return e};var de=e=>ce(L({},"__esModule",{value:!0}),e);var Oe={};ae(Oe,{deriveSessionSegment:()=>H,detectDeviceClass:()=>C,detectTimeOfDay:()=>R,detectTrafficSource:()=>O,init:()=>Ce,preloadAssignments:()=>Z,preloadDecisions:()=>te,readSessionCookie:()=>ee,referrerDomainFromReferer:()=>U});module.exports=de(Oe);var ue="_snt_uid";var k="_snt_uid";function le(){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 ge(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function me(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function fe(e){try{return localStorage.getItem(e)}catch(t){return null}}function pe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function ye(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function he(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function Se(e){try{sessionStorage.removeItem(e)}catch(t){}}function ve(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 we(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Ae={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function q(e){var f,m,p,v,h;if(typeof window=="undefined")return Ae;let t=(f=e==null?void 0:e.cookieName)!=null?f:ue,i=((m=e==null?void 0:e.cookieTTLDays)!=null?m:365)*24*60*60,r=(h=(v=(p=ge(t))!=null?p:fe(k))!=null?v:ye(k))!=null?h:le();me(t,r,i);let a=pe(k,r),s=ve(t),o=a?!1:he(k,r),d=!a&&!s&&!o;return{getSessionId:()=>r,isEphemeral:()=>d,destroy:()=>{r=null,we(t),Ie(k),Se(k)}}}var N="_snt_retry";var Ee={push:()=>{},flush:()=>{},destroy:()=>{}};function be(e){try{let t=localStorage.getItem(N);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(N),n.slice(-e)):[]}catch(t){return[]}}function J(e,t){try{let i=[...(()=>{try{let r=localStorage.getItem(N);if(!r)return[];let a=JSON.parse(r);return Array.isArray(a)?a:[]}catch(r){return[]}})(),...e].slice(-t);localStorage.setItem(N,JSON.stringify(i))}catch(n){}}function V(e){var y,T,b;if(typeof window=="undefined")return Ee;let t=(y=e.flushIntervalMs)!=null?y:5e3,n=(T=e.maxBatchSize)!=null?T:20,i=(b=e.maxRetrySize)!=null?b:100,r=e.ingestUrl,a=e.apiKey,s=[],o=new Set,d=[],f=c=>{for(let g of c)o.has(g)||(o.add(g),d.push(g));for(;d.length>500;){let g=d.shift();g&&o.delete(g)}},m=new Set,p=c=>{o.has(c.id)||m.has(c.id)||(m.add(c.id),s.push(c))},v=be(i);for(let c of v)p(c);let h=0,S=0,P=c=>{if(c.length===0)return;let g=JSON.stringify(c),_=c.map(E=>E.id),A;try{A=fetch(r,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`}})}catch(E){J(c,i),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6));return}let x=E=>{if(E.ok||E.status>=400&&E.status<500&&E.status!==429){f(_),S=0,h=0;return}J(c,i),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6))};A instanceof Promise?A.then(x).catch(()=>{J(c,i),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6))}):x(A)},$=c=>{let g=[],_=2;for(let A of c){let x=JSON.stringify(A).length+1;if(g.length>0&&_+x>57344||g.length>=n)break;g.push(A),_+=x}return g},I=()=>{try{if(Date.now()<h)return;for(;s.length>0;){let c=s.filter(_=>!o.has(_.id));if(s.length=0,c.length===0)break;let g=$(c);if(g.length===0)break;g.length<c.length&&s.push(...c.slice(g.length)),P(g)}}catch(c){}},D=!0,w=null;w=setInterval(()=>{D&&I()},t);let u=()=>{document.visibilityState==="hidden"&&I()},l=()=>{I()};return document.addEventListener("visibilitychange",u),window.addEventListener("beforeunload",l),{push(c){p(c),s.length>=n&&I()},flush:I,destroy(){D=!1,w!==null&&(clearInterval(w),w=null),document.removeEventListener("visibilitychange",u),window.removeEventListener("beforeunload",l),I()}}}var K="_snt_asgn_";function M(e,t){return`${e}:${t}`}function _e(e,t){return`${K}${e}_${t}`}function F(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(K)&&e.push(n)}return e}catch(e){return[]}}function X(e=18e5){let t=new Map,n=r=>r.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let r of F())try{let a=localStorage.getItem(r);if(!a)continue;let s=JSON.parse(a);if(n(s)){localStorage.removeItem(r);continue}let o=r.slice(K.length),d=o.lastIndexOf("_");if(d<0)continue;let f=o.slice(0,d),m=o.slice(d+1);t.set(M(f,m),s)}catch(a){}})(),{get(r,a){let s=t.get(M(r,a));return s?n(s)?(t.delete(M(r,a)),null):s:null},set(r,a,s){let o=M(r,a);t.set(o,s);try{localStorage.setItem(_e(r,a),JSON.stringify(s))}catch(d){}},invalidate(r){let a=`${r}:`;for(let s of[...t.keys()])s.startsWith(a)&&t.delete(s);for(let s of F()){let o=s.slice(K.length),d=o.lastIndexOf("_");if(d<0)continue;if(o.slice(0,d)===r)try{localStorage.removeItem(s)}catch(m){}}},clear(){t.clear();for(let r of F())try{localStorage.removeItem(r)}catch(a){}}}}function C(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 O(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(r){}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 U(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function R(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=B("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function B(e,t){var a,s,o,d,f,m,p;let n=(s=(a=t==null?void 0:t.userAgent)==null?void 0:a.trim())!=null?s:"",i=(d=(o=t==null?void 0:t.referer)==null?void 0:o.trim())!=null?d:"",r=(f=t==null?void 0:t.now)!=null?f:new Date;return{sessionId:e,ephemeral:!1,utmParams:(m=t==null?void 0:t.utmParams)!=null?m:{},deviceClass:n?C(n):"desktop",trafficSource:i?O(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:U(i),timeOfDay:R(r),dayOfWeek:(p=["sun","mon","tue","wed","thu","fri","sat"][r.getDay()])!=null?p:"sun"}}async function Z(e,t,n){let i={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(i.Origin=n.origin);let r=B(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await fetch(`${n.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(r)})).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(o){}let a=await Promise.allSettled(e.map(async({id:o,variantIds:d})=>{let f=await fetch(`${n.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:t,componentId:o,variantIds:d})});if(!f.ok)return null;let m=await f.json();return{id:o,variantId:m.variantId}})),s={};for(let o of a)o.status==="fulfilled"&&o.value&&(s[o.value.id]=o.value.variantId);return s}function ee(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}async function te(e,t,n){let i={layoutOrder:e.sections,assignments:{},persona:"unknown",confidence:0},r={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(r.Origin=n.origin);let a=B(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{await fetch(`${n.baseUrl}/sessions`,{method:"POST",headers:r,body:JSON.stringify(a)})}catch(s){}try{let s=await fetch(`${n.baseUrl}/decide`,{method:"POST",headers:r,body:JSON.stringify({sessionId:t,sections:e.sections.map(o=>({id:o})),components:e.components})});return s.ok?await s.json():i}catch(s){return i}}var ke="https://sentient-api.fly.dev/v1/events";function De(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return`evt-${Date.now()}-${Math.random().toString(16).slice(2)}`}var Q={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Te(){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 xe(e){return e.replace(/\/events\/?$/,"")}function Ce(e){var P,$,I,D,w;if(typeof window=="undefined"||e.consent===!1)return Q;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."),Q;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),Q;let t=(P=e.ingestUrl)!=null?P:ke,n=Date.now(),i=q(),r=X(),a=V({ingestUrl:t,apiKey:e.apiKey}),s=xe(t),o={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d=C(($=navigator.userAgent)!=null?$:""),f=typeof window!="undefined"?window.location.origin:void 0,m=O((I=document.referrer)!=null?I:"",f),p=(D=e.sessionSegment)!=null?D:`${d}:${m}`;if(e.initialAssignments)for(let[u,l]of Object.entries(e.initialAssignments))r.set(u,p,{variantId:l,assignedAt:Date.now(),segment:p,confidence:1});let v=Promise.resolve(),h=i.getSessionId();if(h){let u=U((w=document.referrer)!=null?w:""),l=G({sessionId:h,deviceClass:d,trafficSource:m,referrerDomain:u,utmParams:Te(),timeOfDay:R(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{v=fetch(`${s}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(l),headers:o}).then(y=>{y.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(y){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:a});let S={goal(u,l={}){let y=i.getSessionId();y&&v.then(()=>{fetch(`${s}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,name:u,metadata:l}),headers:o}).catch(()=>{})})},identify(u){let l=i.getSessionId();l&&v.then(()=>{fetch(`${s}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:l,userId:u,ephemeral:i.isEphemeral()}),headers:o}).catch(()=>{})})},track(u){let l=i.getSessionId();if(!l)return;let y=Y(G({},u),{id:De(),sessionId:l,timestamp:Date.now(),timeInSession:Date.now()-n});a.push(y),e.debug&&console.log("[sentient] track",y)},getAssignment(u,l){return r.get(u,l)},async assign(u,l){let y=i.getSessionId();if(!y)return null;let T=r.get(u,p);if(T)return{variantId:T.variantId,assignmentTtlMs:0};await v;try{let b=await fetch(`${s}/assign`,{method:"POST",body:JSON.stringify({sessionId:y,componentId:u,variantIds:l}),headers:o});if(!b.ok)return null;let c=await b.json();return r.set(u,p,{variantId:c.variantId,assignedAt:Date.now(),segment:p,confidence:1}),c}catch(b){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){a.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let u=window;u.__sentient&&(u.__sentient.client=S)}return S}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
1
+ "use strict";var N=Object.defineProperty,ae=Object.defineProperties,ce=Object.getOwnPropertyDescriptor,de=Object.getOwnPropertyDescriptors,ue=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,le=Object.prototype.propertyIsEnumerable;var X=(e,t,n)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t)=>{for(var n in t||(t={}))H.call(t,n)&&X(e,n,t[n]);if(V)for(var n of V(t))le.call(t,n)&&X(e,n,t[n]);return e},K=(e,t)=>ae(e,de(t));var ge=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},me=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ue(t))!H.call(e,r)&&r!==n&&N(e,r,{get:()=>t[r],enumerable:!(s=ce(t,r))||s.enumerable});return e};var fe=e=>me(N({},"__esModule",{value:!0}),e);var $e={};ge($e,{deriveSessionSegment:()=>ne,detectDeviceClass:()=>O,detectTimeOfDay:()=>P,detectTrafficSource:()=>U,init:()=>Me,preloadAssignments:()=>se,preloadDecisions:()=>oe,readSessionCookie:()=>ie,referrerDomainFromReferer:()=>R});module.exports=fe($e);var pe="_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 he(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function Se(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(s){}}function ve(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 Ie(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function we(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function Ae(e){try{sessionStorage.removeItem(e)}catch(t){}}function be(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 Ee(e){try{localStorage.removeItem(e)}catch(t){}}function _e(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Te={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Z(e){var u,g,p,h,S;if(typeof window=="undefined")return Te;let t=(u=e==null?void 0:e.cookieName)!=null?u:pe,s=((g=e==null?void 0:e.cookieTTLDays)!=null?g:365)*24*60*60,r=(S=(h=(p=he(t))!=null?p:ve(T))!=null?h:Ie(T))!=null?S:ye();Se(t,r,s);let o=xe(T,r),i=be(t),a=o?!1:we(T,r),d=!o&&!i&&!a;return{getSessionId:()=>r,isEphemeral:()=>d,destroy:()=>{r=null,_e(t),Ee(T),Ae(T)}}}var B="_snt_retry";var ke={push:()=>{},flush:()=>{},destroy:()=>{}};function De(e){try{let t=localStorage.getItem(B);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(B),n.slice(-e)):[]}catch(t){return[]}}function W(e,t){try{let s=[...(()=>{try{let r=localStorage.getItem(B);if(!r)return[];let o=JSON.parse(r);return Array.isArray(o)?o:[]}catch(r){return[]}})(),...e].slice(-t);localStorage.setItem(B,JSON.stringify(s))}catch(n){}}function ee(e){var E,_,q;if(typeof window=="undefined")return ke;let t=(E=e.flushIntervalMs)!=null?E:5e3,n=(_=e.maxBatchSize)!=null?_:20,s=(q=e.maxRetrySize)!=null?q:100,r=e.ingestUrl,o=e.apiKey,i=[],a=new Set,d=[],u=c=>{for(let f of c)g.delete(f),!a.has(f)&&(a.add(f),d.push(f));for(;d.length>500;){let f=d.shift();f&&a.delete(f)}},g=new Set,p=c=>{a.has(c.id)||g.has(c.id)||(g.add(c.id),i.push(c))},h=De(s);for(let c of h)p(c);let S=0,v=0,M=c=>{if(c.length===0)return;let f=JSON.stringify(c),I=c.map(w=>w.id),A;try{A=fetch(r,{method:"POST",keepalive:!0,body:f,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(w){W(c,s);for(let z of I)g.delete(z);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let D=w=>{if(w.ok||w.status>=400&&w.status<500&&w.status!==429){u(I),v=0,S=0;return}W(c,s);for(let z of I)g.delete(z);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};A instanceof Promise?A.then(D).catch(()=>{W(c,s);for(let w of I)g.delete(w);v++,S=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):D(A)},k=typeof TextEncoder!="undefined"?new TextEncoder:null,$=c=>k?k.encode(c).length:c.length,L=c=>{let f=[],I=2;for(let A of c){let D=$(JSON.stringify(A))+1;if(f.length>0&&I+D>57344||f.length>=n)break;f.push(A),I+=D}return f},x=()=>{try{if(Date.now()<S)return;for(;i.length>0;){let c=i.filter(I=>!a.has(I.id));if(i.length=0,c.length===0)break;let f=L(c);if(f.length===0)break;f.length<c.length&&i.push(...c.slice(f.length)),M(f)}}catch(c){}},l=!0,m=null;m=setInterval(()=>{l&&x()},t);let y=()=>{document.visibilityState==="hidden"&&x()},b=()=>{x()};return document.addEventListener("visibilitychange",y),window.addEventListener("beforeunload",b),{push(c){p(c),i.length>=n&&x()},flush:x,destroy(){l=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",y),window.removeEventListener("beforeunload",b),x()}}}var G="_snt_asgn_";function Q(e,t){return`${e}:${t}`}function Ce(e,t){return`${G}${e}_${t}`}function Y(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(G)&&e.push(n)}return e}catch(e){return[]}}function te(e=18e5){let t=new Map,n=r=>r.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let r of Y())try{let o=localStorage.getItem(r);if(!o)continue;let i=JSON.parse(o);if(n(i)){localStorage.removeItem(r);continue}let a=r.slice(G.length),d=a.lastIndexOf("_");if(d<0)continue;let u=a.slice(0,d),g=a.slice(d+1);t.set(Q(u,g),i)}catch(o){}})(),{get(r,o){let i=t.get(Q(r,o));return i?n(i)?(t.delete(Q(r,o)),null):i:null},set(r,o,i){let a=Q(r,o);t.set(a,i);try{localStorage.setItem(Ce(r,o),JSON.stringify(i))}catch(d){}},invalidate(r){let o=`${r}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of Y()){let a=i.slice(G.length),d=a.lastIndexOf("_");if(d<0)continue;if(a.slice(0,d)===r)try{localStorage.removeItem(i)}catch(g){}}},clear(){t.clear();for(let r of Y())try{localStorage.removeItem(r)}catch(o){}}}}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 U(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(r){}let s=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(s)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(s)?"social":"referral"}catch(n){return"direct"}}function R(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=J("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function J(e,t){var o,i,a,d,u,g,p;let n=(i=(o=t==null?void 0:t.userAgent)==null?void 0:o.trim())!=null?i:"",s=(d=(a=t==null?void 0:t.referer)==null?void 0:a.trim())!=null?d:"",r=(u=t==null?void 0:t.now)!=null?u:new Date;return{sessionId:e,ephemeral:!1,utmParams:(g=t==null?void 0:t.utmParams)!=null?g:{},deviceClass:n?O(n):"desktop",trafficSource:s?U(s,t==null?void 0:t.appOrigin):"direct",referrerDomain:R(s),timeOfDay:P(r),dayOfWeek:(p=["sun","mon","tue","wed","thu","fri","sat"][r.getDay()])!=null?p:"sun"}}var re=1500;function F(e,t,n){let s=new AbortController,r=setTimeout(()=>s.abort(),n);return fetch(e,K(C({},t),{signal:s.signal})).finally(()=>clearTimeout(r))}async function se(e,t,n){var d;let s=(d=n.timeoutMs)!=null?d:re,r={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(r.Origin=n.origin);let o=J(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await F(`${n.baseUrl}/sessions`,{method:"POST",headers:r,body:JSON.stringify(o)},s)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(u){}let i=await Promise.allSettled(e.map(async({id:u,variantIds:g})=>{let p=await F(`${n.baseUrl}/assign`,{method:"POST",headers:r,body:JSON.stringify({sessionId:t,componentId:u,variantIds:g})},s);if(!p.ok)return null;let h=await p.json();return{id:u,variantId:h.variantId}})),a={};for(let u of i)u.status==="fulfilled"&&u.value&&(a[u.value.id]=u.value.variantId);return a}function ie(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}async function oe(e,t,n){var a;let s=(a=n.timeoutMs)!=null?a:re,r={layoutOrder:e.sections,assignments:{},persona:"unknown",confidence:0},o={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(o.Origin=n.origin);let i=J(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{await F(`${n.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(i)},s)}catch(d){}try{let d=await F(`${n.baseUrl}/decide`,{method:"POST",headers:o,body:JSON.stringify({sessionId:t,sections:e.sections.map(u=>({id:u})),components:e.components})},s);return d.ok?await d.json():r}catch(d){return r}}var Oe="https://sentient-api.fly.dev/v1/events";function Ue(){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 j={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Re(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,s]of t)n.startsWith("utm_")&&(e[n]=s);return e}catch(e){return{}}}function Pe(e){return e.replace(/\/events\/?$/,"")}function Me(e){var M,k,$,L,x;if(typeof window=="undefined"||e.consent===!1)return j;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."),j;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),j;let t=(M=e.ingestUrl)!=null?M:Oe,n=Date.now(),s=Z(),r=te(),o=ee({ingestUrl:t,apiKey:e.apiKey}),i=Pe(t),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d=O((k=navigator.userAgent)!=null?k:""),u=typeof window!="undefined"?window.location.origin:void 0,g=U(($=document.referrer)!=null?$:"",u),p=(L=e.sessionSegment)!=null?L:`${d}:${g}`;if(e.initialAssignments)for(let[l,m]of Object.entries(e.initialAssignments))r.set(l,p,{variantId:m,assignedAt:Date.now(),segment:p,confidence:1});let h=Promise.resolve(),S=s.getSessionId();if(S){let l=R((x=document.referrer)!=null?x:""),m=C({sessionId:S,deviceClass:d,trafficSource:g,referrerDomain:l,utmParams:Re(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:s.isEphemeral()},e.userId?{userId:e.userId}:{});try{h=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:a}).then(y=>{y.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(y){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let v={goal(l,m={}){let y=s.getSessionId();y&&h.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,name:l,metadata:m}),headers:a}).catch(()=>{})})},identify(l){let m=s.getSessionId();m&&h.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:l,ephemeral:s.isEphemeral()}),headers:a}).catch(()=>{})})},track(l){let m=s.getSessionId();if(!m)return;let y=K(C({},l),{id:Ue(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});o.push(y),e.debug&&console.log("[sentient] track",y)},getAssignment(l,m){return r.get(l,m)},async assign(l,m){let y=s.getSessionId();if(!y)return null;let b=r.get(l,p);if(b)return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};await h;try{let E=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify({sessionId:y,componentId:l,variantIds:m}),headers:a});if(!E.ok)return null;let _=await E.json();return r.set(l,p,{variantId:_.variantId,assignedAt:Date.now(),segment:p,confidence:1,content:_.content}),_}catch(E){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),s.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let l=window;l.__sentient&&(l.__sentient.client=v)}return v}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i}from"./chunk-HWKW5O3R.mjs";export{e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,i as init,f as preloadAssignments,h as preloadDecisions,g as readSessionCookie,c as referrerDomainFromReferer};
1
+ import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i}from"./chunk-6B5JZHAF.mjs";export{e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,i as init,f as preloadAssignments,h as preloadDecisions,g as readSessionCookie,c as referrerDomainFromReferer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentientui/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- var V=Object.defineProperty,X=Object.defineProperties;var H=Object.getOwnPropertyDescriptors;var F=Object.getOwnPropertySymbols;var Z=Object.prototype.hasOwnProperty,ee=Object.prototype.propertyIsEnumerable;var j=(e,t,n)=>t in e?V(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Q=(e,t)=>{for(var n in t||(t={}))Z.call(t,n)&&j(e,n,t[n]);if(F)for(var n of F(t))ee.call(t,n)&&j(e,n,t[n]);return e},z=(e,t)=>X(e,H(t));var te="_snt_uid";var k="_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 re(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function se(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(o){}}function ie(e){try{return localStorage.getItem(e)}catch(t){return null}}function oe(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 ce(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){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 le(e){try{localStorage.removeItem(e)}catch(t){}}function ge(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var me={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function W(e){var f,m,p,v,h;if(typeof window=="undefined")return me;let t=(f=e==null?void 0:e.cookieName)!=null?f:te,o=((m=e==null?void 0:e.cookieTTLDays)!=null?m:365)*24*60*60,r=(h=(v=(p=re(t))!=null?p:ie(k))!=null?v:ae(k))!=null?h:ne();se(t,r,o);let a=oe(k,r),s=ue(t),i=a?!1:ce(k,r),d=!a&&!s&&!i;return{getSessionId:()=>r,isEphemeral:()=>d,destroy:()=>{r=null,ge(t),le(k),de(k)}}}var U="_snt_retry";var fe={push:()=>{},flush:()=>{},destroy:()=>{}};function pe(e){try{let t=localStorage.getItem(U);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(U),n.slice(-e)):[]}catch(t){return[]}}function G(e,t){try{let o=[...(()=>{try{let r=localStorage.getItem(U);if(!r)return[];let a=JSON.parse(r);return Array.isArray(a)?a:[]}catch(r){return[]}})(),...e].slice(-t);localStorage.setItem(U,JSON.stringify(o))}catch(n){}}function Y(e){var y,T,b;if(typeof window=="undefined")return fe;let t=(y=e.flushIntervalMs)!=null?y:5e3,n=(T=e.maxBatchSize)!=null?T:20,o=(b=e.maxRetrySize)!=null?b:100,r=e.ingestUrl,a=e.apiKey,s=[],i=new Set,d=[],f=c=>{for(let g of c)i.has(g)||(i.add(g),d.push(g));for(;d.length>500;){let g=d.shift();g&&i.delete(g)}},m=new Set,p=c=>{i.has(c.id)||m.has(c.id)||(m.add(c.id),s.push(c))},v=pe(o);for(let c of v)p(c);let h=0,S=0,C=c=>{if(c.length===0)return;let g=JSON.stringify(c),_=c.map(E=>E.id),A;try{A=fetch(r,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`}})}catch(E){G(c,o),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6));return}let x=E=>{if(E.ok||E.status>=400&&E.status<500&&E.status!==429){f(_),S=0,h=0;return}G(c,o),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6))};A instanceof Promise?A.then(x).catch(()=>{G(c,o),S++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(S,6))}):x(A)},O=c=>{let g=[],_=2;for(let A of c){let x=JSON.stringify(A).length+1;if(g.length>0&&_+x>57344||g.length>=n)break;g.push(A),_+=x}return g},I=()=>{try{if(Date.now()<h)return;for(;s.length>0;){let c=s.filter(_=>!i.has(_.id));if(s.length=0,c.length===0)break;let g=O(c);if(g.length===0)break;g.length<c.length&&s.push(...c.slice(g.length)),C(g)}}catch(c){}},D=!0,w=null;w=setInterval(()=>{D&&I()},t);let u=()=>{document.visibilityState==="hidden"&&I()},l=()=>{I()};return document.addEventListener("visibilitychange",u),window.addEventListener("beforeunload",l),{push(c){p(c),s.length>=n&&I()},flush:I,destroy(){D=!1,w!==null&&(clearInterval(w),w=null),document.removeEventListener("visibilitychange",u),window.removeEventListener("beforeunload",l),I()}}}var P="_snt_asgn_";function R(e,t){return`${e}:${t}`}function ye(e,t){return`${P}${e}_${t}`}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(P)&&e.push(n)}return e}catch(e){return[]}}function q(e=18e5){let t=new Map,n=r=>r.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let r of J())try{let a=localStorage.getItem(r);if(!a)continue;let s=JSON.parse(a);if(n(s)){localStorage.removeItem(r);continue}let i=r.slice(P.length),d=i.lastIndexOf("_");if(d<0)continue;let f=i.slice(0,d),m=i.slice(d+1);t.set(R(f,m),s)}catch(a){}})(),{get(r,a){let s=t.get(R(r,a));return s?n(s)?(t.delete(R(r,a)),null):s:null},set(r,a,s){let i=R(r,a);t.set(i,s);try{localStorage.setItem(ye(r,a),JSON.stringify(s))}catch(d){}},invalidate(r){let a=`${r}:`;for(let s of[...t.keys()])s.startsWith(a)&&t.delete(s);for(let s of J()){let i=s.slice(P.length),d=i.lastIndexOf("_");if(d<0)continue;if(i.slice(0,d)===r)try{localStorage.removeItem(s)}catch(m){}}},clear(){t.clear();for(let r of J())try{localStorage.removeItem(r)}catch(a){}}}}function $(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(r){}let o=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(o)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(o)?"social":"referral"}catch(n){return"direct"}}function N(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function M(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function he(e){let t=K("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function K(e,t){var a,s,i,d,f,m,p;let n=(s=(a=t==null?void 0:t.userAgent)==null?void 0:a.trim())!=null?s:"",o=(d=(i=t==null?void 0:t.referer)==null?void 0:i.trim())!=null?d:"",r=(f=t==null?void 0:t.now)!=null?f:new Date;return{sessionId:e,ephemeral:!1,utmParams:(m=t==null?void 0:t.utmParams)!=null?m:{},deviceClass:n?$(n):"desktop",trafficSource:o?L(o,t==null?void 0:t.appOrigin):"direct",referrerDomain:N(o),timeOfDay:M(r),dayOfWeek:(p=["sun","mon","tue","wed","thu","fri","sat"][r.getDay()])!=null?p:"sun"}}async function Se(e,t,n){let o={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(o.Origin=n.origin);let r=K(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{(await fetch(`${n.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(r)})).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}catch(i){}let a=await Promise.allSettled(e.map(async({id:i,variantIds:d})=>{let f=await fetch(`${n.baseUrl}/assign`,{method:"POST",headers:o,body:JSON.stringify({sessionId:t,componentId:i,variantIds:d})});if(!f.ok)return null;let m=await f.json();return{id:i,variantId:m.variantId}})),s={};for(let i of a)i.status==="fulfilled"&&i.value&&(s[i.value.id]=i.value.variantId);return s}function ve(e){var t,n;return(n=(t=e.get("_snt_uid"))==null?void 0:t.value)!=null?n:null}async function Ie(e,t,n){let o={layoutOrder:e.sections,assignments:{},persona:"unknown",confidence:0},r={"Content-Type":"application/json",Authorization:`Bearer ${n.apiKey}`};n.origin&&(r.Origin=n.origin);let a=K(t,{userAgent:n.userAgent,referer:n.referer,utmParams:n.utmParams,appOrigin:n.origin});try{await fetch(`${n.baseUrl}/sessions`,{method:"POST",headers:r,body:JSON.stringify(a)})}catch(s){}try{let s=await fetch(`${n.baseUrl}/decide`,{method:"POST",headers:r,body:JSON.stringify({sessionId:t,sections:e.sections.map(i=>({id:i})),components:e.components})});return s.ok?await s.json():o}catch(s){return o}}var we="https://sentient-api.fly.dev/v1/events";function Ae(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return`evt-${Date.now()}-${Math.random().toString(16).slice(2)}`}var B={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ee(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,o]of t)n.startsWith("utm_")&&(e[n]=o);return e}catch(e){return{}}}function be(e){return e.replace(/\/events\/?$/,"")}function Le(e){var C,O,I,D,w;if(typeof window=="undefined"||e.consent===!1)return B;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."),B;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),B;let t=(C=e.ingestUrl)!=null?C:we,n=Date.now(),o=W(),r=q(),a=Y({ingestUrl:t,apiKey:e.apiKey}),s=be(t),i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d=$((O=navigator.userAgent)!=null?O:""),f=typeof window!="undefined"?window.location.origin:void 0,m=L((I=document.referrer)!=null?I:"",f),p=(D=e.sessionSegment)!=null?D:`${d}:${m}`;if(e.initialAssignments)for(let[u,l]of Object.entries(e.initialAssignments))r.set(u,p,{variantId:l,assignedAt:Date.now(),segment:p,confidence:1});let v=Promise.resolve(),h=o.getSessionId();if(h){let u=N((w=document.referrer)!=null?w:""),l=Q({sessionId:h,deviceClass:d,trafficSource:m,referrerDomain:u,utmParams:Ee(),timeOfDay:M(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:o.isEphemeral()},e.userId?{userId:e.userId}:{});try{v=fetch(`${s}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(l),headers:i}).then(y=>{y.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentientui.dev/pricing")}).catch(()=>{})}catch(y){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:a});let S={goal(u,l={}){let y=o.getSessionId();y&&v.then(()=>{fetch(`${s}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:y,name:u,metadata:l}),headers:i}).catch(()=>{})})},identify(u){let l=o.getSessionId();l&&v.then(()=>{fetch(`${s}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:l,userId:u,ephemeral:o.isEphemeral()}),headers:i}).catch(()=>{})})},track(u){let l=o.getSessionId();if(!l)return;let y=z(Q({},u),{id:Ae(),sessionId:l,timestamp:Date.now(),timeInSession:Date.now()-n});a.push(y),e.debug&&console.log("[sentient] track",y)},getAssignment(u,l){return r.get(u,l)},async assign(u,l){let y=o.getSessionId();if(!y)return null;let T=r.get(u,p);if(T)return{variantId:T.variantId,assignmentTtlMs:0};await v;try{let b=await fetch(`${s}/assign`,{method:"POST",body:JSON.stringify({sessionId:y,componentId:u,variantIds:l}),headers:i});if(!b.ok)return null;let c=await b.json();return r.set(u,p,{variantId:c.variantId,assignedAt:Date.now(),segment:p,confidence:1}),c}catch(b){return null}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){a.destroy(),o.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let u=window;u.__sentient&&(u.__sentient.client=S)}return S}export{Q as a,z as b,$ as c,L as d,N as e,M as f,he as g,Se as h,ve as i,Ie as j,Le as k};