@sentientui/core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ import{a as R,b as K,c as B,d as G,e as Q,f as F}from"./chunk-QCYVBCUV.mjs";var ne="_snt_uid";var T="_snt_uid";function se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ie(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function re(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(r){}}function oe(e){try{return localStorage.getItem(e)}catch(t){return null}}function ae(e,t){try{return localStorage.setItem(e,t),!0}catch(a){return!1}}function ce(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function le(e,t){try{return sessionStorage.setItem(e,t),!0}catch(a){return!1}}function de(e){try{sessionStorage.removeItem(e)}catch(t){}}function ue(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function ge(e){try{localStorage.removeItem(e)}catch(t){}}function pe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var fe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function H(e){var p,f,m,y,S,v;if(typeof window=="undefined")return fe;let t=(p=e==null?void 0:e.cookieName)!=null?p:ne,r=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,c=(v=(S=(y=(m=ie(t))!=null?m:oe(T))!=null?y:ce(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:se();re(t,c,r);let o=ae(T,c),i=ue(t),n=o?!1:le(T,c),s=!o&&!i&&!n;return{getSessionId:()=>c,isEphemeral:()=>s,destroy:()=>{c=null,pe(t),ge(T),de(T)}}}var me={push:()=>{},flush:()=>{},destroy:()=>{}};function he(e,t){try{let a=localStorage.getItem(t);if(!a)return[];let r=JSON.parse(a);return Array.isArray(r)?(localStorage.removeItem(t),r.slice(-e)):[]}catch(a){return[]}}function z(e,t,a){try{let c=[...(()=>{try{let o=localStorage.getItem(a);if(!o)return[];let i=JSON.parse(o);return Array.isArray(i)?i:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(a,JSON.stringify(c))}catch(r){}}function V(e){var k,_,D;if(typeof window=="undefined")return me;let t=(k=e.flushIntervalMs)!=null?k:5e3,a=(_=e.maxBatchSize)!=null?_:20,r=(D=e.maxRetrySize)!=null?D:100,c=e.ingestUrl,o=e.apiKey,i=`_snt_retry_${o.slice(0,12)}`,n=[],s=new Set,p=[],f=l=>{for(let g of l)m.delete(g),!s.has(g)&&(s.add(g),p.push(g));for(;p.length>500;){let g=p.shift();g&&s.delete(g)}},m=new Set,y=l=>{s.has(l.id)||m.has(l.id)||(m.add(l.id),n.push(l))},S=he(r,i);for(let l of S)y(l);let v=0,x=0,L=l=>{if(l.length===0)return;let g=JSON.stringify(l),w=l.map(b=>b.id),E;try{E=fetch(c,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(b){z(l,r,i);for(let W of w)m.delete(W);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=b=>{if(b.ok||b.status>=400&&b.status<500&&b.status!==429){f(w),x=0,v=0;return}z(l,r,i);for(let W of w)m.delete(W);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{z(l,r,i);for(let b of w)m.delete(b);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},A=typeof TextEncoder!="undefined"?new TextEncoder:null,N=l=>A?A.encode(l).length:l.length,$=l=>{let g=[],w=2;for(let E of l){let O=N(JSON.stringify(E))+1;if(g.length>0&&w+O>57344||g.length>=a)break;g.push(E),w+=O}return g},I=()=>{try{if(Date.now()<v)return;for(;n.length>0;){let l=n.filter(w=>!s.has(w.id));if(n.length=0,l.length===0)break;let g=$(l);if(g.length===0)break;g.length<l.length&&n.push(...l.slice(g.length)),L(g)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&I()},t);let h=()=>{document.visibilityState==="hidden"&&I()},C=()=>{I()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),n.length>=a&&I()},flush:I,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),I()}}}var j="_snt_asgn_";function P(e,t){return`${e}:${t}`}function ye(e,t){return`${j}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function Y(e){let t=e.slice(j.length),a=t.indexOf(":");if(a<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,a)),segment:decodeURIComponent(t.slice(a+1))}}catch(r){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let a=localStorage.key(t);a!=null&&a.startsWith(j)&&e.push(a)}return e}catch(e){return[]}}function q(e=18e5){let t=new Map,a=c=>c.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let c of J())try{let o=localStorage.getItem(c);if(!o)continue;let i=JSON.parse(o);if(a(i)){localStorage.removeItem(c);continue}let n=Y(c);if(!n)continue;t.set(P(n.componentId,n.segment),i)}catch(o){}})(),{get(c,o){let i=t.get(P(c,o));return i?a(i)?(t.delete(P(c,o)),null):i:null},set(c,o,i){let n=P(c,o);t.set(n,i);try{localStorage.setItem(ye(c,o),JSON.stringify(i))}catch(s){}},invalidate(c){let o=`${c}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of J()){let n=Y(i);if((n==null?void 0:n.componentId)===c)try{localStorage.removeItem(i)}catch(s){}}},clear(){t.clear();for(let c of J())try{localStorage.removeItem(c)}catch(o){}}}}function Se(e,t,a){var c;let r=[];{let n=!1,s=[],p=()=>{if(n)return;let f=Date.now();for(s.push(f);s.length>0&&f-s[0]>500;)s.shift();s.length>=3&&(n=!0,e("rage_click"))};t.addEventListener("click",p),r.push(()=>t.removeEventListener("click",p))}{let o=!1,i=n=>{if(o||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;o=!0;let s=typeof window!="undefined"?window.getSelection():null,p=s?s.toString().length:0;e("text_copy",{selectionLength:p})};document.addEventListener("copy",i),r.push(()=>document.removeEventListener("copy",i))}{let o=!1,i=!1,n=null,s=()=>{n!==null&&(clearTimeout(n),n=null)},p=()=>{o||!i||(s(),n=setTimeout(()=>{!o&&i&&(o=!0,e("scroll_hesitation"))},3e3))},f=()=>{s(),p()},m=S=>{for(let v of S)i=v.intersectionRatio>.3,i?p():s()};typeof process!="undefined"&&((c=process.env)==null?void 0:c.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),r.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),s()})}{let o=!1,i=a!=null?a:Date.now(),n=()=>{if(o||document.visibilityState!=="hidden")return;let s=Date.now()-i;s<15e3&&(o=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",n),r.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let o of r)o()}}var Z="https://api.sentient-ui.com/v1/events",M=new Map,ee=null;function X(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var U={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function ve(){try{let e={},t=new URLSearchParams(window.location.search);for(let[a,r]of t)a.startsWith("utm_")&&(e[a]=r);return e}catch(e){return{}}}function te(e){return e.replace(/\/events\/?$/,"")}function Oe(e){if(typeof window=="undefined")return;let t=e!=null?e:ee;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let a=M.get(t);if(!a){console.warn("[sentient] grantConsent() called before init()");return}let{config:r,upgrade:c}=a;if(!c)return;let o=Ee(K(R({},r),{consent:!0}));c(o),M.set(t,{config:K(R({},r),{consent:!0}),upgrade:null})}function we(e){var i;let t=te((i=e.ingestUrl)!=null?i:Z),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(n,s,p){try{let f=new URLSearchParams({componentId:n});for(let S of s!=null?s:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:a});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(f){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},c={track:n=>r.track(n),goal:(n,s,p,f)=>r.goal(n,s,p,f),identify:n=>r.identify(n),getAssignment:(n,s)=>r.getAssignment(n,s),assign:(n,s,p,f)=>r.assign(n,s,p,f),fetchWeights:()=>r.fetchWeights(),getGraph:()=>r.getGraph(),destroy:()=>r.destroy()};function o(n){r=n}return{proxy:c,setInner:o}}function Ee(e){var L,A,N,$,I;if(typeof window=="undefined")return U;if(ee=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;let{proxy:d,setInner:u}=we(e);return M.set(e.apiKey,{config:e,upgrade:u}),d}return M.set(e.apiKey,{config:e,upgrade:null}),U}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),U;let t=(L=e.ingestUrl)!=null?L:Z,a=Date.now(),r=H({ssrSessionId:e.ssrSessionId}),c=q(),o=V({ingestUrl:t,apiKey:e.apiKey}),i=te(t),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=B((A=navigator.userAgent)!=null?A:""),p=typeof window!="undefined"?window.location.origin:void 0,f=G((N=document.referrer)!=null?N:"",p),m=($=e.sessionSegment)!=null?$:`${s}:${f}`,y=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))c.set(d,m,{variantId:u,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=r.getSessionId();if(v){let d=Q((I=document.referrer)!=null?I:""),u=R({sessionId:v,deviceClass:s,trafficSource:f,referrerDomain:d,utmParams:ve(),timeOfDay:F(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:r.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:n}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let x={goal(d,u={},h=1,C=0){let k=r.getSessionId();if(!k)return;let _=X();S.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:d,metadata:u,weight:h,stepIndex:C,goalId:_}),headers:n}).catch(()=>{})})},identify(d){let u=r.getSessionId();u&&S.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:r.isEphemeral()}),headers:n}).catch(()=>{})})},track(d){let u=r.getSessionId();if(!u)return;let h=K(R({},d),{id:X(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-a});o.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(d,u){return c.get(d,u)},async assign(d,u,h,C){let k=r.getSessionId();if(!k)return null;let _=c.get(d,m);if(_&&(u!=null&&u.length||_.content!==void 0))return{variantId:_.variantId,assignmentTtlMs:0,content:_.content};let D=y.get(d);if(D)return D;let l=(async()=>{await S;try{let g={sessionId:k,componentId:d,variantIds:u};C!==void 0?g.agentDataByVariant=C:h!==void 0&&(g.agentData=h);let w=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify(g),headers:n});if(!w.ok)return null;let E=await w.json();return c.set(d,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(g){return null}finally{y.delete(d)}})();return y.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${i}/weights`,{headers:n});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),r.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(M.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=x)}return x}export{Se as a,Oe as b,Ee as c};
@@ -1 +1 @@
1
- "use strict";var G=Object.defineProperty,le=Object.defineProperties,ge=Object.getOwnPropertyDescriptor,pe=Object.getOwnPropertyDescriptors,fe=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols;var ee=Object.prototype.hasOwnProperty,me=Object.prototype.propertyIsEnumerable;var Z=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(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))me.call(t,n)&&Z(e,n,t[n]);return e},B=(e,t)=>le(e,pe(t));var he=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},ye=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of fe(t))!ee.call(e,i)&&i!==n&&G(e,i,{get:()=>t[i],enumerable:!(a=ge(t,i))||a.enumerable});return e};var Se=e=>ye(G({},"__esModule",{value:!0}),e);var it={};he(it,{deriveSessionSegment:()=>W,detectDeviceClass:()=>R,detectTimeOfDay:()=>P,detectTrafficSource:()=>M,init:()=>st,referrerDomainFromReferer:()=>U});module.exports=Se(it);var ve="_snt_uid";var N="_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 Ee(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 be(e){try{return localStorage.getItem(e)}catch(t){return null}}function Ce(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function xe(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 Ae(e){try{sessionStorage.removeItem(e)}catch(t){}}function Te(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 ke(e){try{localStorage.removeItem(e)}catch(t){}}function De(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,l,g,m,u;if(typeof window=="undefined")return Oe;let t=(d=e==null?void 0:e.cookieName)!=null?d:ve,a=((l=e==null?void 0:e.cookieTTLDays)!=null?l:365)*24*60*60,i=(u=(m=(g=Ee(t))!=null?g:be(N))!=null?m:xe(N))!=null?u:we();Ie(t,i,a);let o=Ce(N,i),r=Te(t),s=o?!1:_e(N,i),c=!o&&!r&&!s;return{getSessionId:()=>i,isEphemeral:()=>c,destroy:()=>{i=null,De(t),ke(N),Ae(N)}}}var F="_snt_retry";var Ne={push:()=>{},flush:()=>{},destroy:()=>{}};function Re(e){try{let t=localStorage.getItem(F);if(!t)return[];let n=JSON.parse(t);return Array.isArray(n)?(localStorage.removeItem(F),n.slice(-e)):[]}catch(t){return[]}}function Q(e,t){try{let a=[...(()=>{try{let i=localStorage.getItem(F);if(!i)return[];let o=JSON.parse(i);return Array.isArray(o)?o:[]}catch(i){return[]}})(),...e].slice(-t);localStorage.setItem(F,JSON.stringify(a))}catch(n){}}function ne(e){var k,A,O;if(typeof window=="undefined")return Ne;let t=(k=e.flushIntervalMs)!=null?k:5e3,n=(A=e.maxBatchSize)!=null?A:20,a=(O=e.maxRetrySize)!=null?O:100,i=e.ingestUrl,o=e.apiKey,r=[],s=new Set,c=[],d=p=>{for(let y of p)l.delete(y),!s.has(y)&&(s.add(y),c.push(y));for(;c.length>500;){let y=c.shift();y&&s.delete(y)}},l=new Set,g=p=>{s.has(p.id)||l.has(p.id)||(l.add(p.id),r.push(p))},m=Re(a);for(let p of m)g(p);let u=0,h=0,E=p=>{if(p.length===0)return;let y=JSON.stringify(p),v=p.map(_=>_.id),I;try{I=fetch(i,{method:"POST",keepalive:!0,body:y,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(_){Q(p,a);for(let J of v)l.delete(J);h++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(h,6));return}let x=_=>{if(_.ok||_.status>=400&&_.status<500&&_.status!==429){d(v),h=0,u=0;return}Q(p,a);for(let J of v)l.delete(J);h++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(h,6))};I instanceof Promise?I.then(x).catch(()=>{Q(p,a);for(let _ of v)l.delete(_);h++,u=Date.now()+Math.min(6e4,1e3*2**Math.min(h,6))}):x(I)},b=typeof TextEncoder!="undefined"?new TextEncoder:null,T=p=>b?b.encode(p).length:p.length,K=p=>{let y=[],v=2;for(let I of p){let x=T(JSON.stringify(I))+1;if(y.length>0&&v+x>57344||y.length>=n)break;y.push(I),v+=x}return y},C=()=>{try{if(Date.now()<u)return;for(;r.length>0;){let p=r.filter(v=>!s.has(v.id));if(r.length=0,p.length===0)break;let y=K(p);if(y.length===0)break;y.length<p.length&&r.push(...p.slice(y.length)),E(y)}}catch(p){}},L=!0,f=null;f=setInterval(()=>{L&&C()},t);let S=()=>{document.visibilityState==="hidden"&&C()},w=()=>{C()};return document.addEventListener("visibilitychange",S),window.addEventListener("beforeunload",w),{push(p){g(p),r.length>=n&&C()},flush:C,destroy(){L=!1,f!==null&&(clearInterval(f),f=null),document.removeEventListener("visibilitychange",S),window.removeEventListener("beforeunload",w),C()}}}var z="_snt_asgn_";function j(e,t){return`${e}:${t}`}function Me(e,t){return`${z}${e}_${t}`}function H(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(z)&&e.push(n)}return e}catch(e){return[]}}function re(e=18e5){let t=new Map,n=i=>i.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let i of H())try{let o=localStorage.getItem(i);if(!o)continue;let r=JSON.parse(o);if(n(r)){localStorage.removeItem(i);continue}let s=i.slice(z.length),c=s.lastIndexOf("_");if(c<0)continue;let d=s.slice(0,c),l=s.slice(c+1);t.set(j(d,l),r)}catch(o){}})(),{get(i,o){let r=t.get(j(i,o));return r?n(r)?(t.delete(j(i,o)),null):r:null},set(i,o,r){let s=j(i,o);t.set(s,r);try{localStorage.setItem(Me(i,o),JSON.stringify(r))}catch(c){}},invalidate(i){let o=`${i}:`;for(let r of[...t.keys()])r.startsWith(o)&&t.delete(r);for(let r of H()){let s=r.slice(z.length),c=s.lastIndexOf("_");if(c<0)continue;if(s.slice(0,c)===i)try{localStorage.removeItem(r)}catch(l){}}},clear(){t.clear();for(let i of H())try{localStorage.removeItem(i)}catch(o){}}}}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 M(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(i){}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 U(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 W(e){let t=Ue("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Ue(e,t){var o,r,s,c,d,l,g;let n=(r=(o=t==null?void 0:t.userAgent)==null?void 0:o.trim())!=null?r:"",a=(c=(s=t==null?void 0:t.referer)==null?void 0:s.trim())!=null?c:"",i=(d=t==null?void 0:t.now)!=null?d:new Date;return{sessionId:e,ephemeral:!1,utmParams:(l=t==null?void 0:t.utmParams)!=null?l:{},deviceClass:n?R(n):"desktop",trafficSource:a?M(a,t==null?void 0:t.appOrigin):"direct",referrerDomain:U(a),timeOfDay:P(i),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?g:"sun"}}var oe="https://api.sentient-ui.com/v1/events",Pe=null,Le=null;function $e(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var $={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ke(){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 se(e){return e.replace(/\/events\/?$/,"")}function Ge(e){var i;let t=se((i=e.ingestUrl)!=null?i:oe),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},a={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,async assign(o,r,s){try{let c=new URLSearchParams({componentId:o});for(let g of r!=null?r:[])c.append("variantIds[]",g);let d=await fetch(`${t}/winner?${c.toString()}`,{headers:n});return d.ok?{variantId:(await d.json()).variantId,assignmentTtlMs:0}:r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}catch(c){return r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};return Le=o=>{a=o},{track:o=>a.track(o),goal:(o,r)=>a.goal(o,r),identify:o=>a.identify(o),getAssignment:(o,r)=>a.getAssignment(o,r),assign:(o,r,s,c)=>a.assign(o,r,s,c),getGraph:()=>a.getGraph(),destroy:()=>a.destroy()}}function ie(e){var b,T,K,C,L;if(typeof window=="undefined")return $;if(Pe=e,e.consent===!1)return e.preConsentBehavior==="statistical_winner"?!e.apiKey||!e.apiKey.startsWith("pk_")?(console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$):Ge(e):$;if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(b=e.ingestUrl)!=null?b:oe,n=Date.now(),a=te(),i=re(),o=ne({ingestUrl:t,apiKey:e.apiKey}),r=se(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c=R((T=navigator.userAgent)!=null?T:""),d=typeof window!="undefined"?window.location.origin:void 0,l=M((K=document.referrer)!=null?K:"",d),g=(C=e.sessionSegment)!=null?C:`${c}:${l}`,m=new Map;if(e.initialAssignments)for(let[f,S]of Object.entries(e.initialAssignments))i.set(f,g,{variantId:S,assignedAt:Date.now(),segment:g,confidence:1});let u=Promise.resolve(),h=a.getSessionId();if(h){let f=U((L=document.referrer)!=null?L:""),S=D({sessionId:h,deviceClass:c,trafficSource:l,referrerDomain:f,utmParams:Ke(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:a.isEphemeral()},e.userId?{userId:e.userId}:{});try{u=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(S),headers:s}).then(w=>{w.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(w){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let E={goal(f,S={},w=1,k=0){let A=a.getSessionId();A&&u.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:A,name:f,metadata:S,weight:w,stepIndex:k}),headers:s}).catch(()=>{})})},identify(f){let S=a.getSessionId();S&&u.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:S,userId:f,ephemeral:a.isEphemeral()}),headers:s}).catch(()=>{})})},track(f){let S=a.getSessionId();if(!S)return;let w=B(D({},f),{id:$e(),sessionId:S,timestamp:Date.now(),timeInSession:Date.now()-n});o.push(w),e.debug&&console.log("[sentient] track",w)},getAssignment(f,S){return i.get(f,S)},async assign(f,S,w,k){let A=a.getSessionId();if(!A)return null;let O=i.get(f,g);if(O)return{variantId:O.variantId,assignmentTtlMs:0,content:O.content};let p=m.get(f);if(p)return p;let y=(async()=>{await u;try{let v={sessionId:A,componentId:f,variantIds:S};k!==void 0?v.agentDataByVariant=k:w!==void 0&&(v.agentData=w);let I=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(v),headers:s});if(!I.ok)return null;let x=await I.json();return i.set(f,g,{variantId:x.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:x.content}),x}catch(v){return null}finally{m.delete(f)}})();return m.set(f,y),y},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),a.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let f=window;f.__sentient&&(f.__sentient.client=E)}return E}var Be=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Fe="h1, h2, h3",je={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function q(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 i=e;for(let o of Object.keys(i)){if(!o.startsWith("__reactFiber")&&!o.startsWith("__reactInternalInstance"))continue;let r=i[o],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(i){}}function Je(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function Qe(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function He(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function We(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function Y(e,t){var a,i,o;let n=e.querySelector(Fe);return{componentId:He(e),semanticType:Qe(e),ariaLabel:(a=e.getAttribute("aria-label"))!=null?a:void 0,headingText:(o=(i=n==null?void 0:n.textContent)==null?void 0:i.trim())!=null?o:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:We(e),reactComponentName:ze(e),dataAttributes:Je(e)}}function ae(e){var o;let t=[],n=new Set,a="__root__",i=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 g=e.get(r),m=`${d}->${g}`;!n.has(m)&&d!==g&&(n.add(m),t.push({fromComponentId:d,toComponentId:g,weight:.6}));break}c=c.parentElement}let l=(o=i.get(d))!=null?o:[];l.push(r),i.set(d,l)}for(let r of i.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]),l=e.get(r[c]);if(d===l)continue;let g=`${d}->${l}::sib`,m=`${l}->${d}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:d,toComponentId:l,weight:.3})),n.has(m)||(n.add(m),t.push({fromComponentId:l,toComponentId:d,weight:.3}))}return t}function qe(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=Y(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=Y(r,e);t.push(d),a.set(r,d.componentId)}),{nodes:t,edges:ae(a)}}function ce(){if(typeof window=="undefined")return je;let e=null,t=0,n=null,a=s=>{try{let c=window.getComputedStyle(s),d=parseFloat(c.fontSize)||12,l=parseFloat(c.zIndex)||0,g=s.getBoundingClientRect(),m=Math.max(g.top,0),u=window.innerHeight||1,h=1/(m/u+1),E=q(d,12,48)*.4+q(h,0,1)*.4+q(l,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:l}=qe(a);s({nodes:d,edges:l,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=[],l=new Map;for(let g of c)g.type==="childList"&&g.addedNodes.forEach(m=>{if(!(m instanceof Element)||!Be.has(m.tagName))return;let u=m.hasAttribute("data-sentient-id"),h=m.hasAttribute("aria-label");if(!u&&!h)return;let E=Y(m,a);d.push(E),l.set(m,E.componentId)});d.length>0&&n&&n({nodes:d,edges:ae(l),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",de="_snt_graph_edges",Ye={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Ve(e){var t;return(t=Ye[e])!=null?t:[]}function Xe(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function Ze(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var et=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function tt(e){return et.has(e)?e:"generic"}function nt(e,t,n){let a=`${e}:${t}:${n.join(",")}`,i=5381;for(let o=0;o<a.length;o++)i=(i<<5)+i+a.charCodeAt(o)&4294967295;return(i>>>0).toString(16).padStart(8,"0")}function ue(e){let t=new Map,n=new Map,a=()=>{typeof window!="undefined"&&Ze(V,[...t.values()])},i=o=>{var r;try{let s=JSON.parse(o);t.clear();for(let c of(r=s.pageNodes)!=null?r:[])t.set(c.componentId,c)}catch(s){}};if(typeof window!="undefined"){let o=Xe(V,[]);for(let r of o)t.set(r.componentId,r);try{localStorage.removeItem(de)}catch(r){}}return{addPageNode(o){t.set(o.componentId,o),a()},addStructuralEdge(o){let r=`${o.fromComponentId}->${o.toComponentId}`;n.set(r,o)},syncOnce(){var r,s;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let o=[...t.values()];if(o.length!==0)try{let c=new Map;for(let u of o){let h=(r=c.get(u.semanticType))!=null?r:[];h.push(u),c.set(u.semanticType,h)}let d=[],l=new Set;for(let u of o)for(let h of Ve(u.semanticType)){let E=(s=c.get(h))!=null?s:[];for(let b of E){if(b.componentId===u.componentId)continue;let T=`semantic:${u.componentId}->${b.componentId}`;l.has(T)||(l.add(T),d.push({fromComponentId:u.componentId,toComponentId:b.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(o.map(u=>u.componentId));for(let u of n.values()){if(!g.has(u.fromComponentId)||!g.has(u.toComponentId))continue;let h=`structural:${u.fromComponentId}->${u.toComponentId}`;l.has(h)||(l.add(h),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let m={pageUrl:window.location.href,nodes:o.map(u=>{let h=tt(u.semanticType);return{componentId:u.componentId,semanticType:h,answers:u.answers,contentHash:nt(u.componentId,h,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:D({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(m)}).catch(()=>{})}catch(c){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:i,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(V),localStorage.removeItem(de)}catch(o){}}}}var rt="https://api.sentient-ui.com/v1/events";function ot(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function st(e){var o;let t=ie(e);if(!e.graph||typeof window=="undefined")return t;let n=ce(),a=(o=e.ingestUrl)!=null?o:rt,i=ue({syncUrl:a.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:ot()});try{let r=localStorage.getItem("_snt_graph_nodes");r&&i.restore(JSON.stringify({pageNodes:JSON.parse(r)}))}catch(r){}return n.scan().then(r=>{for(let s of r.nodes)i.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)i.addStructuralEdge(s);i.syncOnce()}),n.observe(r=>{for(let s of r.nodes)i.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)i.addStructuralEdge(s)}),B(D({},t),{getGraph:()=>i.snapshot(),destroy:()=>{n.destroy(),i.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
1
+ "use strict";var W=Object.defineProperty,fe=Object.defineProperties,me=Object.getOwnPropertyDescriptor,he=Object.getOwnPropertyDescriptors,ye=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols;var te=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable;var ee=(e,t,n)=>t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(e,t)=>{for(var n in t||(t={}))te.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))Se.call(t,n)&&ee(e,n,t[n]);return e},B=(e,t)=>fe(e,he(t));var ve=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ye(t))!te.call(e,s)&&s!==n&&W(e,s,{get:()=>t[s],enumerable:!(c=me(t,s))||c.enumerable});return e};var Ee=e=>we(W({},"__esModule",{value:!0}),e);var at={};ve(at,{deriveSessionSegment:()=>H,detectDeviceClass:()=>O,detectTimeOfDay:()=>U,detectTrafficSource:()=>R,init:()=>it,referrerDomainFromReferer:()=>M});module.exports=Ee(at);var Ie="_snt_uid";var N="_snt_uid";function be(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function Ce(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function xe(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(c){}}function _e(e){try{return localStorage.getItem(e)}catch(t){return null}}function Te(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Ae(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ke(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function De(e){try{sessionStorage.removeItem(e)}catch(t){}}function Ne(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Oe(e){try{localStorage.removeItem(e)}catch(t){}}function Re(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Me={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function ne(e){var d,l,g,h,u,y;if(typeof window=="undefined")return Me;let t=(d=e==null?void 0:e.cookieName)!=null?d:Ie,c=((l=e==null?void 0:e.cookieTTLDays)!=null?l:365)*24*60*60,s=(y=(u=(h=(g=Ce(t))!=null?g:_e(N))!=null?h:Ae(N))!=null?u:e==null?void 0:e.ssrSessionId)!=null?y:be();xe(t,s,c);let a=Te(N,s),r=Ne(t),i=a?!1:ke(N,s),o=!a&&!r&&!i;return{getSessionId:()=>s,isEphemeral:()=>o,destroy:()=>{s=null,Re(t),Oe(N),De(N)}}}var Ue={push:()=>{},flush:()=>{},destroy:()=>{}};function Pe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let c=JSON.parse(n);return Array.isArray(c)?(localStorage.removeItem(t),c.slice(-e)):[]}catch(n){return[]}}function z(e,t,n){try{let s=[...(()=>{try{let a=localStorage.getItem(n);if(!a)return[];let r=JSON.parse(a);return Array.isArray(r)?r:[]}catch(a){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(s))}catch(c){}}function re(e){var A,C,P;if(typeof window=="undefined")return Ue;let t=(A=e.flushIntervalMs)!=null?A:5e3,n=(C=e.maxBatchSize)!=null?C:20,c=(P=e.maxRetrySize)!=null?P:100,s=e.ingestUrl,a=e.apiKey,r=`_snt_retry_${a.slice(0,12)}`,i=[],o=new Set,d=[],l=p=>{for(let S of p)g.delete(S),!o.has(S)&&(o.add(S),d.push(S));for(;d.length>500;){let S=d.shift();S&&o.delete(S)}},g=new Set,h=p=>{o.has(p.id)||g.has(p.id)||(g.add(p.id),i.push(p))},u=Pe(c,r);for(let p of u)h(p);let y=0,v=0,_=p=>{if(p.length===0)return;let S=JSON.stringify(p),E=p.map(x=>x.id),I;try{I=fetch(s,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`}})}catch(x){z(p,c,r);for(let j of E)g.delete(j);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let L=x=>{if(x.ok||x.status>=400&&x.status<500&&x.status!==429){l(E),v=0,y=0;return}z(p,c,r);for(let j of E)g.delete(j);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};I instanceof Promise?I.then(L).catch(()=>{z(p,c,r);for(let x of E)g.delete(x);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):L(I)},T=typeof TextEncoder!="undefined"?new TextEncoder:null,K=p=>T?T.encode(p).length:p.length,G=p=>{let S=[],E=2;for(let I of p){let L=K(JSON.stringify(I))+1;if(S.length>0&&E+L>57344||S.length>=n)break;S.push(I),E+=L}return S},b=()=>{try{if(Date.now()<y)return;for(;i.length>0;){let p=i.filter(E=>!o.has(E.id));if(i.length=0,p.length===0)break;let S=G(p);if(S.length===0)break;S.length<p.length&&i.push(...p.slice(S.length)),_(S)}}catch(p){}},f=!0,m=null;m=setInterval(()=>{f&&b()},t);let w=()=>{document.visibilityState==="hidden"&&b()},k=()=>{b()};return document.addEventListener("visibilitychange",w),window.addEventListener("beforeunload",k),{push(p){h(p),i.length>=n&&b()},flush:b,destroy(){f=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",w),window.removeEventListener("beforeunload",k),b()}}}var Q="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Le(e,t){return`${Q}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function oe(e){let t=e.slice(Q.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(c){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(Q)&&e.push(n)}return e}catch(e){return[]}}function se(e=18e5){let t=new Map,n=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of J())try{let a=localStorage.getItem(s);if(!a)continue;let r=JSON.parse(a);if(n(r)){localStorage.removeItem(s);continue}let i=oe(s);if(!i)continue;t.set(F(i.componentId,i.segment),r)}catch(a){}})(),{get(s,a){let r=t.get(F(s,a));return r?n(r)?(t.delete(F(s,a)),null):r:null},set(s,a,r){let i=F(s,a);t.set(i,r);try{localStorage.setItem(Le(s,a),JSON.stringify(r))}catch(o){}},invalidate(s){let a=`${s}:`;for(let r of[...t.keys()])r.startsWith(a)&&t.delete(r);for(let r of J()){let i=oe(r);if((i==null?void 0:i.componentId)===s)try{localStorage.removeItem(r)}catch(o){}}},clear(){t.clear();for(let s of J())try{localStorage.removeItem(s)}catch(a){}}}}function O(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function R(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(s){}let c=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(c)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(c)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function U(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=$e("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function $e(e,t){var a,r,i,o,d,l,g;let n=(r=(a=t==null?void 0:t.userAgent)==null?void 0:a.trim())!=null?r:"",c=(o=(i=t==null?void 0:t.referer)==null?void 0:i.trim())!=null?o:"",s=(d=t==null?void 0:t.now)!=null?d:new Date;return{sessionId:e,ephemeral:!1,utmParams:(l=t==null?void 0:t.utmParams)!=null?l:{},deviceClass:n?O(n):"desktop",trafficSource:c?R(c,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(c),timeOfDay:U(s),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?g:"sun"}}var ae="https://api.sentient-ui.com/v1/events",q=new Map,Ke=null;function ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var $={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ge(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,c]of t)n.startsWith("utm_")&&(e[n]=c);return e}catch(e){return{}}}function ce(e){return e.replace(/\/events\/?$/,"")}function We(e){var r;let t=ce((r=e.ingestUrl)!=null?r:ae),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(i,o,d){try{let l=new URLSearchParams({componentId:i});for(let u of o!=null?o:[])l.append("variantIds[]",u);let g=await fetch(`${t}/winner?${l.toString()}`,{headers:n});return g.ok?{variantId:(await g.json()).variantId,assignmentTtlMs:0}:o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}catch(l){return o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},s={track:i=>c.track(i),goal:(i,o,d,l)=>c.goal(i,o,d,l),identify:i=>c.identify(i),getAssignment:(i,o)=>c.getAssignment(i,o),assign:(i,o,d,l)=>c.assign(i,o,d,l),fetchWeights:()=>c.fetchWeights(),getGraph:()=>c.getGraph(),destroy:()=>c.destroy()};function a(i){c=i}return{proxy:s,setInner:a}}function de(e){var _,T,K,G,b;if(typeof window=="undefined")return $;if(Ke=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;let{proxy:f,setInner:m}=We(e);return q.set(e.apiKey,{config:e,upgrade:m}),f}return q.set(e.apiKey,{config:e,upgrade:null}),$}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(_=e.ingestUrl)!=null?_:ae,n=Date.now(),c=ne({ssrSessionId:e.ssrSessionId}),s=se(),a=re({ingestUrl:t,apiKey:e.apiKey}),r=ce(t),i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o=O((T=navigator.userAgent)!=null?T:""),d=typeof window!="undefined"?window.location.origin:void 0,l=R((K=document.referrer)!=null?K:"",d),g=(G=e.sessionSegment)!=null?G:`${o}:${l}`,h=new Map;if(e.initialAssignments)for(let[f,m]of Object.entries(e.initialAssignments))s.set(f,g,{variantId:m,assignedAt:Date.now(),segment:g,confidence:1});let u=Promise.resolve(),y=c.getSessionId();if(y){let f=M((b=document.referrer)!=null?b:""),m=D({sessionId:y,deviceClass:o,trafficSource:l,referrerDomain:f,utmParams:Ge(),timeOfDay:U(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:c.isEphemeral()},e.userId?{userId:e.userId}:{});try{u=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:i}).then(w=>{w.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(w){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:a});let v={goal(f,m={},w=1,k=0){let A=c.getSessionId();if(!A)return;let C=ie();u.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:A,name:f,metadata:m,weight:w,stepIndex:k,goalId:C}),headers:i}).catch(()=>{})})},identify(f){let m=c.getSessionId();m&&u.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:f,ephemeral:c.isEphemeral()}),headers:i}).catch(()=>{})})},track(f){let m=c.getSessionId();if(!m)return;let w=B(D({},f),{id:ie(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});a.push(w),e.debug&&console.log("[sentient] track",w)},getAssignment(f,m){return s.get(f,m)},async assign(f,m,w,k){let A=c.getSessionId();if(!A)return null;let C=s.get(f,g);if(C&&(m!=null&&m.length||C.content!==void 0))return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let P=h.get(f);if(P)return P;let p=(async()=>{await u;try{let S={sessionId:A,componentId:f,variantIds:m};k!==void 0?S.agentDataByVariant=k:w!==void 0&&(S.agentData=w);let E=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(S),headers:i});if(!E.ok)return null;let I=await E.json();return s.set(f,g,{variantId:I.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:I.content}),I}catch(S){return null}finally{h.delete(f)}})();return h.set(f,p),p},async fetchWeights(){var f;try{let m=await fetch(`${r}/weights`,{headers:i});return m.ok?(f=(await m.json()).components)!=null?f:[]:[]}catch(m){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){a.destroy(),c.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(q.set(e.apiKey,{config:e,upgrade:null}),e.debug){let f=window;f.__sentient&&(f.__sentient.client=v)}return v}var Be=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Fe="h1, h2, h3",je={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function V(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function ze(e){var t,n,c;try{let s=e;for(let a of Object.keys(s)){if(!a.startsWith("__reactFiber")&&!a.startsWith("__reactInternalInstance"))continue;let r=s[a],i=(c=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?c:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(s){}}function Je(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function Qe(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function He(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function qe(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function Y(e,t){var c,s,a;let n=e.querySelector(Fe);return{componentId:He(e),semanticType:Qe(e),ariaLabel:(c=e.getAttribute("aria-label"))!=null?c:void 0,headingText:(a=(s=n==null?void 0:n.textContent)==null?void 0:s.trim())!=null?a:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:qe(e),reactComponentName:ze(e),dataAttributes:Je(e)}}function ue(e){var a;let t=[],n=new Set,c="__root__",s=new Map;for(let[r,i]of e){let o=r.parentElement,d=c;for(;o;){if(e.has(o)){d=e.get(o);let g=e.get(r),h=`${d}->${g}`;!n.has(h)&&d!==g&&(n.add(h),t.push({fromComponentId:d,toComponentId:g,weight:.6}));break}o=o.parentElement}let l=(a=s.get(d))!=null?a:[];l.push(r),s.set(d,l)}for(let r of s.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let o=i+1;o<r.length;o++){let d=e.get(r[i]),l=e.get(r[o]);if(d===l)continue;let g=`${d}->${l}::sib`,h=`${l}->${d}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:d,toComponentId:l,weight:.3})),n.has(h)||(n.add(h),t.push({fromComponentId:l,toComponentId:d,weight:.3}))}return t}function Ve(e){let t=[],n=new Set,c=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=Y(r,e);t.push(i),c.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),o=r.hasAttribute("data-sentient-id");if(!i&&!o)return;n.add(r);let d=Y(r,e);t.push(d),c.set(r,d.componentId)}),{nodes:t,edges:ue(c)}}function le(){if(typeof window=="undefined")return je;let e=null,t=0,n=null,c=i=>{try{let o=window.getComputedStyle(i),d=parseFloat(o.fontSize)||12,l=parseFloat(o.zIndex)||0,g=i.getBoundingClientRect(),h=Math.max(g.top,0),u=window.innerHeight||1,y=1/(h/u+1),v=V(d,12,48)*.4+V(y,0,1)*.4+V(l,0,100)*.2;return Math.max(0,Math.min(1,v))}catch(o){return .5}};return{scan:()=>new Promise(i=>{let o=()=>{let{nodes:d,edges:l}=Ve(c);i({nodes:d,edges:l,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(o,{timeout:100}):o()}catch(d){o()}}),observe:i=>{n=i;try{e=new MutationObserver(o=>{let d=[],l=new Map;for(let g of o)g.type==="childList"&&g.addedNodes.forEach(h=>{if(!(h instanceof Element)||!Be.has(h.tagName))return;let u=h.hasAttribute("data-sentient-id"),y=h.hasAttribute("aria-label");if(!u&&!y)return;let v=Y(h,c);d.push(v),l.set(h,v.componentId)});d.length>0&&n&&n({nodes:d,edges:ue(l),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(o){}},getProminenceScore:c,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var X="_snt_graph_nodes",ge="_snt_graph_edges",Ye={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Xe(e){var t;return(t=Ye[e])!=null?t:[]}function Ze(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function et(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var tt=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function nt(e){return tt.has(e)?e:"generic"}function rt(e,t,n){let c=`${e}:${t}:${n.join(",")}`,s=5381;for(let a=0;a<c.length;a++)s=(s<<5)+s+c.charCodeAt(a)&4294967295;return(s>>>0).toString(16).padStart(8,"0")}function pe(e){let t=new Map,n=new Map,c=()=>{typeof window!="undefined"&&et(X,[...t.values()])},s=a=>{var r;try{let i=JSON.parse(a);t.clear();for(let o of(r=i.pageNodes)!=null?r:[])t.set(o.componentId,o)}catch(i){}};if(typeof window!="undefined"){let a=Ze(X,[]);for(let r of a)t.set(r.componentId,r);try{localStorage.removeItem(ge)}catch(r){}}return{addPageNode(a){t.set(a.componentId,a),c()},addStructuralEdge(a){let r=`${a.fromComponentId}->${a.toComponentId}`;n.set(r,a)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let a=[...t.values()];if(a.length!==0)try{let o=new Map;for(let u of a){let y=(r=o.get(u.semanticType))!=null?r:[];y.push(u),o.set(u.semanticType,y)}let d=[],l=new Set;for(let u of a)for(let y of Xe(u.semanticType)){let v=(i=o.get(y))!=null?i:[];for(let _ of v){if(_.componentId===u.componentId)continue;let T=`semantic:${u.componentId}->${_.componentId}`;l.has(T)||(l.add(T),d.push({fromComponentId:u.componentId,toComponentId:_.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(a.map(u=>u.componentId));for(let u of n.values()){if(!g.has(u.fromComponentId)||!g.has(u.toComponentId))continue;let y=`structural:${u.fromComponentId}->${u.toComponentId}`;l.has(y)||(l.add(y),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let h={pageUrl:window.location.href,nodes:a.map(u=>{let y=nt(u.semanticType);return{componentId:u.componentId,semanticType:y,answers:u.answers,contentHash:rt(u.componentId,y,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:D({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(h)}).catch(()=>{})}catch(o){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:s,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(X),localStorage.removeItem(ge)}catch(a){}}}}var ot="https://api.sentient-ui.com/v1/events";function st(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function it(e){var i;let t=de(e);if(!e.graph||typeof window=="undefined")return t;let n=le(),c=(i=e.ingestUrl)!=null?i:ot,s=pe({syncUrl:c.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:st()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&s.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}n.scan().then(o=>{for(let d of o.nodes)s.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)s.addStructuralEdge(d);s.syncOnce()});let a=null,r=()=>{a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,s.syncOnce()},500)};return n.observe(o=>{for(let d of o.nodes)s.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)s.addStructuralEdge(d);r()}),B(D({},t),{getGraph:()=>s.snapshot(),destroy:()=>{a!==null&&clearTimeout(a),n.destroy(),s.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{c as v}from"./chunk-PXHX4K5R.mjs";import{a as h,b,c as x,d as _,e as O,f as M,g as R}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let c=e;for(let s of Object.keys(c)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let o=c[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(c){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,c,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(c=n==null?void 0:n.textContent)==null?void 0:c.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",c=new Map;for(let[o,r]of e){let a=o.parentElement,d=p;for(;a;){if(e.has(a)){d=e.get(a);let m=e.get(o),g=`${d}->${m}`;!n.has(g)&&d!==m&&(n.add(g),t.push({fromComponentId:d,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=c.get(d))!=null?s:[];u.push(o),c.set(d,u)}for(let o of c.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let a=r+1;a<o.length;a++){let d=e.get(o[r]),u=e.get(o[a]);if(d===u)continue;let m=`${d}->${u}::sib`,g=`${u}->${d}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:d,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:d,weight:.3}))}return t}function F(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 d=I(o,e);t.push(d),p.set(o,d.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=r=>{try{let a=window.getComputedStyle(r),d=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(d,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:d,edges:u}=F(p);r({nodes:d,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(d){a()}}),observe:r=>{n=r;try{e=new MutationObserver(a=>{let d=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let i=g.hasAttribute("data-sentient-id"),f=g.hasAttribute("aria-label");if(!i&&!f)return;let l=I(g,p);d.push(l),u.set(g,l.componentId)});d.length>0&&n&&n({nodes:d,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",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,c=5381;for(let s=0;s<p.length;s++)c=(c<<5)+c+p.charCodeAt(s)&4294967295;return(c>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},c=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=z(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 d=[],u=new Set;for(let i of s)for(let f of q(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),d.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),d.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=B(i.semanticType);return{componentId:i.componentId,semanticType:f,answers:i.answers,contentHash:V(i.componentId,f,i.answers),prominenceScore:i.prominenceScore,depthInPage:i.depth}}),edges:d};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:c,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var s;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(s=e.ingestUrl)!=null?s:W,c=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&c.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}return n.scan().then(o=>{for(let r of o.nodes)c.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)c.addStructuralEdge(r);c.syncOnce()}),n.observe(o=>{for(let r of o.nodes)c.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)c.addStructuralEdge(r)}),b(h({},t),{getGraph:()=>c.snapshot(),destroy:()=>{n.destroy(),c.destroy(),t.destroy()}})}export{R as deriveSessionSegment,x as detectDeviceClass,M as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
1
+ import{c as v}from"./chunk-NXCIN4O2.mjs";import{a as h,b,c as x,d as _,e as O,f as R,g as M}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let r=d[s],i=(p=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?p:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(d){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,d,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(d=n==null?void 0:n.textContent)==null?void 0:d.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[r,i]of e){let a=r.parentElement,o=p;for(;a;){if(e.has(a)){o=e.get(a);let m=e.get(r),g=`${o}->${m}`;!n.has(g)&&o!==m&&(n.add(g),t.push({fromComponentId:o,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(o))!=null?s:[];u.push(r),d.set(o,u)}for(let r of d.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){let o=e.get(r[i]),u=e.get(r[a]);if(o===u)continue;let m=`${o}->${u}::sib`,g=`${u}->${o}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:o,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:o,weight:.3}))}return t}function F(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=I(r,e);t.push(i),p.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),a=r.hasAttribute("data-sentient-id");if(!i&&!a)return;n.add(r);let o=I(r,e);t.push(o),p.set(r,o.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=i=>{try{let a=window.getComputedStyle(i),o=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=i.getBoundingClientRect(),g=Math.max(m.top,0),c=window.innerHeight||1,l=1/(g/c+1),f=S(o,12,48)*.4+S(l,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,f))}catch(a){return .5}};return{scan:()=>new Promise(i=>{let a=()=>{let{nodes:o,edges:u}=F(p);i({nodes:o,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(o){a()}}),observe:i=>{n=i;try{e=new MutationObserver(a=>{let o=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let c=g.hasAttribute("data-sentient-id"),l=g.hasAttribute("aria-label");if(!c&&!l)return;let f=I(g,p);o.push(f),u.set(g,f.componentId)});o.length>0&&n&&n({nodes:o,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,d=5381;for(let s=0;s<p.length;s++)d=(d<<5)+d+p.charCodeAt(s)&4294967295;return(d>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},d=s=>{var r;try{let i=JSON.parse(s);t.clear();for(let a of(r=i.pageNodes)!=null?r:[])t.set(a.componentId,a)}catch(i){}};if(typeof window!="undefined"){let s=z(C,[]);for(let r of s)t.set(r.componentId,r);try{localStorage.removeItem(A)}catch(r){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let r=`${s.fromComponentId}->${s.toComponentId}`;n.set(r,s)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let c of s){let l=(r=a.get(c.semanticType))!=null?r:[];l.push(c),a.set(c.semanticType,l)}let o=[],u=new Set;for(let c of s)for(let l of q(c.semanticType)){let f=(i=a.get(l))!=null?i:[];for(let y of f){if(y.componentId===c.componentId)continue;let E=`semantic:${c.componentId}->${y.componentId}`;u.has(E)||(u.add(E),o.push({fromComponentId:c.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(c=>c.componentId));for(let c of n.values()){if(!m.has(c.fromComponentId)||!m.has(c.toComponentId))continue;let l=`structural:${c.fromComponentId}->${c.toComponentId}`;u.has(l)||(u.add(l),o.push({fromComponentId:c.fromComponentId,toComponentId:c.toComponentId,type:"structural",weight:c.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(c=>{let l=B(c.semanticType);return{componentId:c.componentId,semanticType:l,answers:c.answers,contentHash:V(c.componentId,l,c.answers),prominenceScore:c.prominenceScore,depthInPage:c.depth}}),edges:o};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var i;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(i=e.ingestUrl)!=null?i:W,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let a=localStorage.getItem("_snt_graph_nodes");a&&d.restore(JSON.stringify({pageNodes:JSON.parse(a)}))}catch(a){}n.scan().then(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);d.syncOnce()});let s=null,r=()=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,d.syncOnce()},500)};return n.observe(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);r()}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{s!==null&&clearTimeout(s),n.destroy(),d.destroy(),t.destroy()}})}export{M as deriveSessionSegment,x as detectDeviceClass,R as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
@@ -1 +1 @@
1
- "use strict";var m=Object.defineProperty,k=Object.defineProperties,C=Object.getOwnPropertyDescriptor,I=Object.getOwnPropertyDescriptors,M=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var v=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,O=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&v(t,r,e[r]);if(b)for(var r of b(e))_.call(e,r)&&v(t,r,e[r]);return t},P=(t,e)=>k(t,I(e));var $=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},j=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of M(e))!A.call(t,s)&&s!==r&&m(t,s,{get:()=>e[s],enumerable:!(n=C(e,s))||n.enumerable});return t};var L=t=>j(m({},"__esModule",{value:!0}),t);var B={};$(B,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>w,detectDeviceClass:()=>y,detectTimeOfDay:()=>h,detectTrafficSource:()=>p,preloadAssignments:()=>R,preloadDecisions:()=>U,readSessionCookie:()=>x,referrerDomainFromReferer:()=>S});module.exports=L(B);function y(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function p(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(s){}let n=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(n)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(n)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function w(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,c,u,o,i,d,l;let r=(c=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?c:"",n=(o=(u=e==null?void 0:e.referer)==null?void 0:u.trim())!=null?o:"",s=(i=e==null?void 0:e.now)!=null?i:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?y(r):"desktop",trafficSource:n?p(n,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(n),timeOfDay:h(s),dayOfWeek:(l=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?l:"sun"}}var D=1500;function f(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);return fetch(t,P(O({},e),{signal:n.signal})).finally(()=>clearTimeout(s))}async function R(t,e,r){var o;let n=(o=r.timeoutMs)!=null?o:D,s={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(s.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{(await f(`${r.baseUrl}/sessions`,{method:"POST",headers:s,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(i){}let c=await Promise.allSettled(t.map(async({id:i,variantIds:d})=>{let l=await f(`${r.baseUrl}/assign`,{method:"POST",headers:s,body:JSON.stringify({sessionId:e,componentId:i,variantIds:d})},n);if(!l.ok)return null;let T=await l.json();return{id:i,variantId:T.variantId}})),u={};for(let i of c)i.status==="fulfilled"&&i.value&&(u[i.value.id]=i.value.variantId);return u}function x(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function U(t,e,r){var u;let n=(u=r.timeoutMs)!=null?u:D,s={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let c=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(c)},n)}catch(o){}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(i=>({id:i})),components:t.components})},n);return o.ok?await o.json():s}catch(o){return s}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
1
+ "use strict";var m=Object.defineProperty,C=Object.defineProperties,I=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyDescriptors,j=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var w=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,v=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&w(t,r,e[r]);if(b)for(var r of b(e))M.call(e,r)&&w(t,r,e[r]);return t},D=(t,e)=>C(t,$(e));var _=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},L=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of j(e))!A.call(t,i)&&i!==r&&m(t,i,{get:()=>e[i],enumerable:!(s=I(e,i))||s.enumerable});return t};var B=t=>L(m({},"__esModule",{value:!0}),t);var J={};_(J,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>U,detectDeviceClass:()=>p,detectTimeOfDay:()=>h,detectTrafficSource:()=>y,preloadAssignments:()=>P,preloadDecisions:()=>k,readSessionCookie:()=>R,referrerDomainFromReferer:()=>S});module.exports=B(J);function p(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function y(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(i){}let s=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(s)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(s)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function U(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,l,c,o,n,d,u;let r=(l=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?l:"",s=(o=(c=e==null?void 0:e.referer)==null?void 0:c.trim())!=null?o:"",i=(n=e==null?void 0:e.now)!=null?n:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?p(r):"desktop",trafficSource:s?y(s,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(s),timeOfDay:h(i),dayOfWeek:(u=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?u:"sun"}}var O=1500;function f(t,e,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r);return fetch(t,D(v({},e),{signal:s.signal})).finally(()=>clearTimeout(i))}async function P(t,e,r){var o;let s=(o=r.timeoutMs)!=null?o:O,i={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(i.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let n=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},s);if(n.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!n.ok){let d=await n.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${n.status})`,d)}}catch(n){console.error("[SentientUI] preloadAssignments: session upsert threw",n)}let l=await Promise.allSettled(t.map(async({id:n,variantIds:d})=>{let u=await f(`${r.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:e,componentId:n,variantIds:d})},s);if(!u.ok){let T=await u.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${n}" (${u.status})`,T),null}let x=await u.json();return{id:n,variantId:x.variantId}})),c={};for(let n of l)n.status==="fulfilled"&&n.value&&(c[n.value.id]=n.value.variantId);return c}function R(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function k(t,e,r){var c;let s=(c=r.timeoutMs)!=null?c:O,i={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let l=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let o=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(l)},s);if(!o.ok){let n=await o.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${o.status})`,n)}}catch(o){console.error("[SentientUI] preloadDecisions: session upsert threw",o)}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(n=>({id:n})),components:t.components})},s);if(!o.ok){let n=await o.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${o.status})`,n),i}return await o.json()}catch(o){return console.error("[SentientUI] preloadDecisions: decide threw",o),i}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{a as c,b as p,c as A,d as v,e as b,f as h,g as O,h as l}from"./chunk-QCYVBCUV.mjs";var y=1500;function d(r,t,e){let n=new AbortController,i=setTimeout(()=>n.abort(),e);return fetch(r,p(c({},t),{signal:n.signal})).finally(()=>clearTimeout(i))}async function P(r,t,e){var o;let n=(o=e.timeoutMs)!=null?o:y,i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(i.Origin=e.origin);let a=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{(await d(`${e.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(s){}let g=await Promise.allSettled(r.map(async({id:s,variantIds:S})=>{let m=await d(`${e.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:t,componentId:s,variantIds:S})},n);if(!m.ok)return null;let f=await m.json();return{id:s,variantId:f.variantId}})),u={};for(let s of g)s.status==="fulfilled"&&s.value&&(u[s.value.id]=s.value.variantId);return u}function T(r){var t,e;return(e=(t=r.get("_snt_uid"))==null?void 0:t.value)!=null?e:null}async function R(r,t,e){var u;let n=(u=e.timeoutMs)!=null?u:y,i={layoutOrder:r.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{await d(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},n)}catch(o){}try{let o=await d(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:t,sections:r.sections.map(s=>({id:s})),components:r.components})},n);return o.ok?await o.json():i}catch(o){return i}}export{l as buildSessionUpsertPayload,O as deriveSessionSegment,A as detectDeviceClass,h as detectTimeOfDay,v as detectTrafficSource,P as preloadAssignments,R as preloadDecisions,T as readSessionCookie,b as referrerDomainFromReferer};
1
+ import{a as p,b as y,c as b,d as h,e as v,f as U,g as w,h as d}from"./chunk-QCYVBCUV.mjs";var S=1500;function u(n,r,e){let i=new AbortController,o=setTimeout(()=>i.abort(),e);return fetch(n,y(p({},r),{signal:i.signal})).finally(()=>clearTimeout(o))}async function O(n,r,e){var t;let i=(t=e.timeoutMs)!=null?t:S,o={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(o.Origin=e.origin);let a=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let s=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(a)},i);if(s.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!s.ok){let m=await s.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${s.status})`,m)}}catch(s){console.error("[SentientUI] preloadAssignments: session upsert threw",s)}let g=await Promise.allSettled(n.map(async({id:s,variantIds:m})=>{let c=await u(`${e.baseUrl}/assign`,{method:"POST",headers:o,body:JSON.stringify({sessionId:r,componentId:s,variantIds:m})},i);if(!c.ok){let A=await c.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${s}" (${c.status})`,A),null}let f=await c.json();return{id:s,variantId:f.variantId}})),l={};for(let s of g)s.status==="fulfilled"&&s.value&&(l[s.value.id]=s.value.variantId);return l}function P(n){var r,e;return(e=(r=n.get("_snt_uid"))==null?void 0:r.value)!=null?e:null}async function R(n,r,e){var l;let i=(l=e.timeoutMs)!=null?l:S,o={layoutOrder:n.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let t=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},i);if(!t.ok){let s=await t.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${t.status})`,s)}}catch(t){console.error("[SentientUI] preloadDecisions: session upsert threw",t)}try{let t=await u(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:r,sections:n.sections.map(s=>({id:s})),components:n.components})},i);if(!t.ok){let s=await t.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${t.status})`,s),o}return await t.json()}catch(t){return console.error("[SentientUI] preloadDecisions: decide threw",t),o}}export{d as buildSessionUpsertPayload,w as deriveSessionSegment,b as detectDeviceClass,U as detectTimeOfDay,h as detectTrafficSource,O as preloadAssignments,R as preloadDecisions,P as readSessionCookie,v as referrerDomainFromReferer};
package/dist/index.d.cts CHANGED
@@ -4,6 +4,13 @@ export { d as deriveSessionSegment, a as detectDeviceClass, c as detectTimeOfDay
4
4
  type SessionConfig = {
5
5
  cookieName?: string;
6
6
  cookieTTLDays?: number;
7
+ /**
8
+ * Session ID generated during SSR (e.g. from `loadAdaptiveAssignments`).
9
+ * Used as the fallback when no existing cookie or localStorage entry is found,
10
+ * so the client adopts the same session the server used for variant assignment
11
+ * on first visit rather than generating a new, orphaned ID.
12
+ */
13
+ ssrSessionId?: string;
7
14
  };
8
15
  type SessionManager = {
9
16
  getSessionId(): string | null;
@@ -165,12 +172,28 @@ type SentientConfig = {
165
172
  */
166
173
  preConsentBehavior?: 'statistical_winner' | 'control';
167
174
  userId?: string;
175
+ /**
176
+ * Session ID generated server-side (from `loadAdaptiveAssignments` / `loadAdaptiveDecision`).
177
+ * When provided, the client adopts this ID on first visit instead of generating a new one,
178
+ * ensuring events and goals are attributed to the same session the server used for assignment.
179
+ */
180
+ ssrSessionId?: string;
168
181
  };
169
182
  type AssignResult = {
170
183
  variantId: string;
171
184
  assignmentTtlMs: number;
172
185
  content?: string;
173
186
  };
187
+ type WeightEntry = {
188
+ variantId: string;
189
+ pulls: number;
190
+ avgReward: number | null;
191
+ };
192
+ type ComponentWeightEntry = {
193
+ componentId: string;
194
+ updatedAt: number;
195
+ variants: WeightEntry[];
196
+ };
174
197
  type SentientClient = {
175
198
  track(event: Omit<SentientEvent, 'id' | 'sessionId' | 'timestamp' | 'timeInSession'>): void;
176
199
  goal(name: string, metadata?: Record<string, unknown>, weight?: number, stepIndex?: number): void;
@@ -178,6 +201,8 @@ type SentientClient = {
178
201
  getAssignment(componentId: string, segment: string): Assignment | null;
179
202
  /** Server-side variant assignment. Caches the result locally per (component, segment). */
180
203
  assign(componentId: string, variantIds?: string[], agentData?: unknown, agentDataByVariant?: Record<string, unknown>): Promise<AssignResult | null>;
204
+ /** Fetches current bandit weights for all components in this project. Used by the provider to keep live-weight polling fresh. */
205
+ fetchWeights(): Promise<ComponentWeightEntry[]>;
181
206
  getGraph(): GraphSnapshot;
182
207
  destroy(): void;
183
208
  };
@@ -186,11 +211,12 @@ type SentientClient = {
186
211
  * Upgrades a pre-consent client (created with `consent: false, preConsentBehavior: 'statistical_winner'`)
187
212
  * to a fully-tracking client. Call this from your consent management platform callback.
188
213
  * For React apps, prefer updating the `consent` prop on `<AdaptiveProvider>`.
214
+ * Pass `apiKey` to target a specific project; omit to upgrade the most-recently-initialized client.
189
215
  */
190
- declare function grantConsent(): void;
216
+ declare function grantConsent(apiKey?: string): void;
191
217
  /**
192
218
  * Initializes the Sentient client. Returns a no-op client during SSR.
193
219
  */
194
220
  declare function init(config: SentientConfig): SentientClient;
195
221
 
196
- export { type AssignResult, type Assignment, type AssignmentCache, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, attachMicroSignalDetectors, grantConsent, init };
222
+ export { type AssignResult, type Assignment, type AssignmentCache, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,13 @@ export { d as deriveSessionSegment, a as detectDeviceClass, c as detectTimeOfDay
4
4
  type SessionConfig = {
5
5
  cookieName?: string;
6
6
  cookieTTLDays?: number;
7
+ /**
8
+ * Session ID generated during SSR (e.g. from `loadAdaptiveAssignments`).
9
+ * Used as the fallback when no existing cookie or localStorage entry is found,
10
+ * so the client adopts the same session the server used for variant assignment
11
+ * on first visit rather than generating a new, orphaned ID.
12
+ */
13
+ ssrSessionId?: string;
7
14
  };
8
15
  type SessionManager = {
9
16
  getSessionId(): string | null;
@@ -165,12 +172,28 @@ type SentientConfig = {
165
172
  */
166
173
  preConsentBehavior?: 'statistical_winner' | 'control';
167
174
  userId?: string;
175
+ /**
176
+ * Session ID generated server-side (from `loadAdaptiveAssignments` / `loadAdaptiveDecision`).
177
+ * When provided, the client adopts this ID on first visit instead of generating a new one,
178
+ * ensuring events and goals are attributed to the same session the server used for assignment.
179
+ */
180
+ ssrSessionId?: string;
168
181
  };
169
182
  type AssignResult = {
170
183
  variantId: string;
171
184
  assignmentTtlMs: number;
172
185
  content?: string;
173
186
  };
187
+ type WeightEntry = {
188
+ variantId: string;
189
+ pulls: number;
190
+ avgReward: number | null;
191
+ };
192
+ type ComponentWeightEntry = {
193
+ componentId: string;
194
+ updatedAt: number;
195
+ variants: WeightEntry[];
196
+ };
174
197
  type SentientClient = {
175
198
  track(event: Omit<SentientEvent, 'id' | 'sessionId' | 'timestamp' | 'timeInSession'>): void;
176
199
  goal(name: string, metadata?: Record<string, unknown>, weight?: number, stepIndex?: number): void;
@@ -178,6 +201,8 @@ type SentientClient = {
178
201
  getAssignment(componentId: string, segment: string): Assignment | null;
179
202
  /** Server-side variant assignment. Caches the result locally per (component, segment). */
180
203
  assign(componentId: string, variantIds?: string[], agentData?: unknown, agentDataByVariant?: Record<string, unknown>): Promise<AssignResult | null>;
204
+ /** Fetches current bandit weights for all components in this project. Used by the provider to keep live-weight polling fresh. */
205
+ fetchWeights(): Promise<ComponentWeightEntry[]>;
181
206
  getGraph(): GraphSnapshot;
182
207
  destroy(): void;
183
208
  };
@@ -186,11 +211,12 @@ type SentientClient = {
186
211
  * Upgrades a pre-consent client (created with `consent: false, preConsentBehavior: 'statistical_winner'`)
187
212
  * to a fully-tracking client. Call this from your consent management platform callback.
188
213
  * For React apps, prefer updating the `consent` prop on `<AdaptiveProvider>`.
214
+ * Pass `apiKey` to target a specific project; omit to upgrade the most-recently-initialized client.
189
215
  */
190
- declare function grantConsent(): void;
216
+ declare function grantConsent(apiKey?: string): void;
191
217
  /**
192
218
  * Initializes the Sentient client. Returns a no-op client during SSR.
193
219
  */
194
220
  declare function init(config: SentientConfig): SentientClient;
195
221
 
196
- export { type AssignResult, type Assignment, type AssignmentCache, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, attachMicroSignalDetectors, grantConsent, init };
222
+ export { type AssignResult, type Assignment, type AssignmentCache, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var N=Object.defineProperty,ae=Object.defineProperties,ce=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,ue=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,de=Object.prototype.propertyIsEnumerable;var V=(e,t,r)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,B=(e,t)=>{for(var r in t||(t={}))X.call(t,r)&&V(e,r,t[r]);if(q)for(var r of q(t))de.call(t,r)&&V(e,r,t[r]);return e},z=(e,t)=>ae(e,le(t));var ge=(e,t)=>{for(var r in t)N(e,r,{get:t[r],enumerable:!0})},fe=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ue(t))!X.call(e,i)&&i!==r&&N(e,i,{get:()=>t[i],enumerable:!(o=ce(t,i))||o.enumerable});return e};var me=e=>fe(N({},"__esModule",{value:!0}),e);var Pe={};ge(Pe,{attachMicroSignalDetectors:()=>ie,deriveSessionSegment:()=>ne,detectDeviceClass:()=>O,detectTimeOfDay:()=>L,detectTrafficSource:()=>R,grantConsent:()=>Le,init:()=>oe,referrerDomainFromReferer:()=>U});module.exports=me(Pe);var pe="_snt_uid";var C="_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,r){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${r}; SameSite=strict; path=/`}catch(o){}}function ve(e){try{return localStorage.getItem(e)}catch(t){return null}}function we(e,t){try{return localStorage.setItem(e,t),!0}catch(r){return!1}}function xe(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function Ee(e,t){try{return sessionStorage.setItem(e,t),!0}catch(r){return!1}}function _e(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 ke(e){try{localStorage.removeItem(e)}catch(t){}}function Ie(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Te={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Z(e){var f,d,m,v,y;if(typeof window=="undefined")return Te;let t=(f=e==null?void 0:e.cookieName)!=null?f:pe,o=((d=e==null?void 0:e.cookieTTLDays)!=null?d:365)*24*60*60,i=(y=(v=(m=he(t))!=null?m:ve(C))!=null?v:xe(C))!=null?y:ye();Se(t,i,o);let s=we(C,i),n=be(t),a=s?!1:Ee(C,i),c=!s&&!n&&!a;return{getSessionId:()=>i,isEphemeral:()=>c,destroy:()=>{i=null,Ie(t),ke(C),_e(C)}}}var G="_snt_retry";var Ce={push:()=>{},flush:()=>{},destroy:()=>{}};function De(e){try{let t=localStorage.getItem(G);if(!t)return[];let r=JSON.parse(t);return Array.isArray(r)?(localStorage.removeItem(G),r.slice(-e)):[]}catch(t){return[]}}function J(e,t){try{let o=[...(()=>{try{let i=localStorage.getItem(G);if(!i)return[];let s=JSON.parse(i);return Array.isArray(s)?s:[]}catch(i){return[]}})(),...e].slice(-t);localStorage.setItem(G,JSON.stringify(o))}catch(r){}}function ee(e){var I,k,T;if(typeof window=="undefined")return Ce;let t=(I=e.flushIntervalMs)!=null?I:5e3,r=(k=e.maxBatchSize)!=null?k:20,o=(T=e.maxRetrySize)!=null?T:100,i=e.ingestUrl,s=e.apiKey,n=[],a=new Set,c=[],f=l=>{for(let g of l)d.delete(g),!a.has(g)&&(a.add(g),c.push(g));for(;c.length>500;){let g=c.shift();g&&a.delete(g)}},d=new Set,m=l=>{a.has(l.id)||d.has(l.id)||(d.add(l.id),n.push(l))},v=De(o);for(let l of v)m(l);let y=0,w=0,P=l=>{if(l.length===0)return;let g=JSON.stringify(l),h=l.map(b=>b.id),x;try{x=fetch(i,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}})}catch(b){J(l,o);for(let W of h)d.delete(W);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6));return}let _=b=>{if(b.ok||b.status>=400&&b.status<500&&b.status!==429){f(h),w=0,y=0;return}J(l,o);for(let W of h)d.delete(W);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};x instanceof Promise?x.then(_).catch(()=>{J(l,o);for(let b of h)d.delete(b);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))}):_(x)},D=typeof TextEncoder!="undefined"?new TextEncoder:null,$=l=>D?D.encode(l).length:l.length,K=l=>{let g=[],h=2;for(let x of l){let _=$(JSON.stringify(x))+1;if(g.length>0&&h+_>57344||g.length>=r)break;g.push(x),h+=_}return g},E=()=>{try{if(Date.now()<y)return;for(;n.length>0;){let l=n.filter(h=>!a.has(h.id));if(n.length=0,l.length===0)break;let g=K(l);if(g.length===0)break;g.length<l.length&&n.push(...l.slice(g.length)),P(g)}}catch(l){}},A=!0,u=null;u=setInterval(()=>{A&&E()},t);let p=()=>{document.visibilityState==="hidden"&&E()},S=()=>{E()};return document.addEventListener("visibilitychange",p),window.addEventListener("beforeunload",S),{push(l){m(l),n.length>=r&&E()},flush:E,destroy(){A=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",p),window.removeEventListener("beforeunload",S),E()}}}var F="_snt_asgn_";function Q(e,t){return`${e}:${t}`}function Ae(e,t){return`${F}${e}_${t}`}function j(){try{let e=[];for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r!=null&&r.startsWith(F)&&e.push(r)}return e}catch(e){return[]}}function te(e=18e5){let t=new Map,r=i=>i.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let i of j())try{let s=localStorage.getItem(i);if(!s)continue;let n=JSON.parse(s);if(r(n)){localStorage.removeItem(i);continue}let a=i.slice(F.length),c=a.lastIndexOf("_");if(c<0)continue;let f=a.slice(0,c),d=a.slice(c+1);t.set(Q(f,d),n)}catch(s){}})(),{get(i,s){let n=t.get(Q(i,s));return n?r(n)?(t.delete(Q(i,s)),null):n:null},set(i,s,n){let a=Q(i,s);t.set(a,n);try{localStorage.setItem(Ae(i,s),JSON.stringify(n))}catch(c){}},invalidate(i){let s=`${i}:`;for(let n of[...t.keys()])n.startsWith(s)&&t.delete(n);for(let n of j()){let a=n.slice(F.length),c=a.lastIndexOf("_");if(c<0)continue;if(a.slice(0,c)===i)try{localStorage.removeItem(n)}catch(d){}}},clear(){t.clear();for(let i of j())try{localStorage.removeItem(i)}catch(s){}}}}function O(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function R(e,t){if(!e)return"direct";try{let r=new URL(e);if(t)try{if(new URL(t).host===r.host)return"direct"}catch(i){}let o=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(o)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(o)?"social":"referral"}catch(r){return"direct"}}function U(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function L(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function ne(e){let t=Oe("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Oe(e,t){var s,n,a,c,f,d,m;let r=(n=(s=t==null?void 0:t.userAgent)==null?void 0:s.trim())!=null?n:"",o=(c=(a=t==null?void 0:t.referer)==null?void 0:a.trim())!=null?c:"",i=(f=t==null?void 0:t.now)!=null?f:new Date;return{sessionId:e,ephemeral:!1,utmParams:(d=t==null?void 0:t.utmParams)!=null?d:{},deviceClass:r?O(r):"desktop",trafficSource:o?R(o,t==null?void 0:t.appOrigin):"direct",referrerDomain:U(o),timeOfDay:L(i),dayOfWeek:(m=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?m:"sun"}}function ie(e,t,r){let o=[];{let n=!1,a=[],c=()=>{if(n)return;let f=Date.now();for(a.push(f);a.length>0&&f-a[0]>500;)a.shift();a.length>=3&&(n=!0,e("rage_click"))};t.addEventListener("click",c),o.push(()=>t.removeEventListener("click",c))}{let i=!1,s=n=>{if(i||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;i=!0;let a=typeof window!="undefined"?window.getSelection():null,c=a?a.toString().length:0;e("text_copy",{selectionLength:c})};document.addEventListener("copy",s),o.push(()=>document.removeEventListener("copy",s))}{let i=!1,s=!1,n=null,a=()=>{n!==null&&(clearTimeout(n),n=null)},c=()=>{i||!s||(a(),n=setTimeout(()=>{!i&&s&&(i=!0,e("scroll_hesitation"))},3e3))},f=()=>{a(),c()},d=v=>{for(let y of v)s=y.intersectionRatio>.3,s?c():a()};window.__lastIOCallback=d;let m=new IntersectionObserver(d,{threshold:[.3]});m.observe(t),window.addEventListener("scroll",f,{passive:!0}),o.push(()=>{m.disconnect(),window.removeEventListener("scroll",f),a()})}{let i=!1,s=r!=null?r:Date.now(),n=()=>{if(i||document.visibilityState!=="hidden")return;let a=Date.now()-s;a<15e3&&(i=!0,e("tab_loss",{timeOnPage:a}))};document.addEventListener("visibilitychange",n),o.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let i of o)i()}}var re="https://api.sentient-ui.com/v1/events",H=null,Y=null;function Re(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var M={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ue(){try{let e={},t=new URLSearchParams(window.location.search);for(let[r,o]of t)r.startsWith("utm_")&&(e[r]=o);return e}catch(e){return{}}}function se(e){return e.replace(/\/events\/?$/,"")}function Le(){if(typeof window=="undefined")return;if(!H){console.warn("[sentient] grantConsent() called before init()");return}let e=Y;Y=null;let t=oe(z(B({},H),{consent:!0}));e==null||e(t)}function Me(e){var i;let t=se((i=e.ingestUrl)!=null?i:re),r={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,async assign(s,n,a){try{let c=new URLSearchParams({componentId:s});for(let m of n!=null?n:[])c.append("variantIds[]",m);let f=await fetch(`${t}/winner?${c.toString()}`,{headers:r});return f.ok?{variantId:(await f.json()).variantId,assignmentTtlMs:0}:n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}catch(c){return n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};return Y=s=>{o=s},{track:s=>o.track(s),goal:(s,n)=>o.goal(s,n),identify:s=>o.identify(s),getAssignment:(s,n)=>o.getAssignment(s,n),assign:(s,n,a,c)=>o.assign(s,n,a,c),getGraph:()=>o.getGraph(),destroy:()=>o.destroy()}}function oe(e){var D,$,K,E,A;if(typeof window=="undefined")return M;if(H=e,e.consent===!1)return e.preConsentBehavior==="statistical_winner"?!e.apiKey||!e.apiKey.startsWith("pk_")?(console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M):Me(e):M;if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),M;let t=(D=e.ingestUrl)!=null?D:re,r=Date.now(),o=Z(),i=te(),s=ee({ingestUrl:t,apiKey:e.apiKey}),n=se(t),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c=O(($=navigator.userAgent)!=null?$:""),f=typeof window!="undefined"?window.location.origin:void 0,d=R((K=document.referrer)!=null?K:"",f),m=(E=e.sessionSegment)!=null?E:`${c}:${d}`,v=new Map;if(e.initialAssignments)for(let[u,p]of Object.entries(e.initialAssignments))i.set(u,m,{variantId:p,assignedAt:Date.now(),segment:m,confidence:1});let y=Promise.resolve(),w=o.getSessionId();if(w){let u=U((A=document.referrer)!=null?A:""),p=B({sessionId:w,deviceClass:c,trafficSource:d,referrerDomain:u,utmParams:Ue(),timeOfDay:L(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:o.isEphemeral()},e.userId?{userId:e.userId}:{});try{y=fetch(`${n}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(p),headers:a}).then(S=>{S.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(S){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:s});let P={goal(u,p={},S=1,I=0){let k=o.getSessionId();k&&y.then(()=>{fetch(`${n}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:u,metadata:p,weight:S,stepIndex:I}),headers:a}).catch(()=>{})})},identify(u){let p=o.getSessionId();p&&y.then(()=>{fetch(`${n}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:p,userId:u,ephemeral:o.isEphemeral()}),headers:a}).catch(()=>{})})},track(u){let p=o.getSessionId();if(!p)return;let S=z(B({},u),{id:Re(),sessionId:p,timestamp:Date.now(),timeInSession:Date.now()-r});s.push(S),e.debug&&console.log("[sentient] track",S)},getAssignment(u,p){return i.get(u,p)},async assign(u,p,S,I){let k=o.getSessionId();if(!k)return null;let T=i.get(u,m);if(T)return{variantId:T.variantId,assignmentTtlMs:0,content:T.content};let l=v.get(u);if(l)return l;let g=(async()=>{await y;try{let h={sessionId:k,componentId:u,variantIds:p};I!==void 0?h.agentDataByVariant=I:S!==void 0&&(h.agentData=S);let x=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(h),headers:a});if(!x.ok)return null;let _=await x.json();return i.set(u,m,{variantId:_.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:_.content}),_}catch(h){return null}finally{v.delete(u)}})();return v.set(u,g),g},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){s.destroy(),o.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let u=window;u.__sentient&&(u.__sentient.client=P)}return P}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
1
+ "use strict";var G=Object.defineProperty,le=Object.defineProperties,ue=Object.getOwnPropertyDescriptor,de=Object.getOwnPropertyDescriptors,ge=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var Y=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,R=(e,t)=>{for(var n in t||(t={}))q.call(t,n)&&Y(e,n,t[n]);if(V)for(var n of V(t))fe.call(t,n)&&Y(e,n,t[n]);return e},Q=(e,t)=>le(e,de(t));var me=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ge(t))!q.call(e,o)&&o!==n&&G(e,o,{get:()=>t[o],enumerable:!(i=ue(t,o))||i.enumerable});return e};var he=e=>pe(G({},"__esModule",{value:!0}),e);var Ne={};me(Ne,{attachMicroSignalDetectors:()=>re,deriveSessionSegment:()=>ne,detectDeviceClass:()=>U,detectTimeOfDay:()=>P,detectTrafficSource:()=>L,grantConsent:()=>Me,init:()=>ce,referrerDomainFromReferer:()=>M});module.exports=he(Ne);var ye="_snt_uid";var T="_snt_uid";function Se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ve(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function we(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function Ee(e){try{return localStorage.getItem(e)}catch(t){return null}}function xe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function _e(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function be(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function Ie(e){try{sessionStorage.removeItem(e)}catch(t){}}function ke(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ce(e){try{localStorage.removeItem(e)}catch(t){}}function Te(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var De={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function X(e){var g,f,m,y,S,v;if(typeof window=="undefined")return De;let t=(g=e==null?void 0:e.cookieName)!=null?g:ye,i=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,o=(v=(S=(y=(m=ve(t))!=null?m:Ee(T))!=null?y:_e(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:Se();we(t,o,i);let c=xe(T,o),a=ke(t),r=c?!1:be(T,o),s=!c&&!a&&!r;return{getSessionId:()=>o,isEphemeral:()=>s,destroy:()=>{o=null,Te(t),Ce(T),Ie(T)}}}var Ae={push:()=>{},flush:()=>{},destroy:()=>{}};function Oe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let i=JSON.parse(n);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(n){return[]}}function J(e,t,n){try{let o=[...(()=>{try{let c=localStorage.getItem(n);if(!c)return[];let a=JSON.parse(c);return Array.isArray(a)?a:[]}catch(c){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(o))}catch(i){}}function Z(e){var k,b,A;if(typeof window=="undefined")return Ae;let t=(k=e.flushIntervalMs)!=null?k:5e3,n=(b=e.maxBatchSize)!=null?b:20,i=(A=e.maxRetrySize)!=null?A:100,o=e.ingestUrl,c=e.apiKey,a=`_snt_retry_${c.slice(0,12)}`,r=[],s=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!s.has(p)&&(s.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&s.delete(p)}},m=new Set,y=l=>{s.has(l.id)||m.has(l.id)||(m.add(l.id),r.push(l))},S=Oe(i,a);for(let l of S)y(l);let v=0,x=0,K=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(I=>I.id),E;try{E=fetch(o,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${c}`}})}catch(I){J(l,i,a);for(let z of w)m.delete(z);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=I=>{if(I.ok||I.status>=400&&I.status<500&&I.status!==429){f(w),x=0,v=0;return}J(l,i,a);for(let z of w)m.delete(z);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{J(l,i,a);for(let I of w)m.delete(I);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},D=typeof TextEncoder!="undefined"?new TextEncoder:null,W=l=>D?D.encode(l).length:l.length,B=l=>{let p=[],w=2;for(let E of l){let O=W(JSON.stringify(E))+1;if(p.length>0&&w+O>57344||p.length>=n)break;p.push(E),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;r.length>0;){let l=r.filter(w=>!s.has(w.id));if(r.length=0,l.length===0)break;let p=B(l);if(p.length===0)break;p.length<l.length&&r.push(...l.slice(p.length)),K(p)}}catch(l){}},u=!0,d=null;d=setInterval(()=>{u&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},C=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),r.length>=n&&_()},flush:_,destroy(){u=!1,d!==null&&(clearInterval(d),d=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),_()}}}var H="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Re(e,t){return`${H}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function ee(e){let t=e.slice(H.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(i){return null}}function j(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(H)&&e.push(n)}return e}catch(e){return[]}}function te(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of j())try{let c=localStorage.getItem(o);if(!c)continue;let a=JSON.parse(c);if(n(a)){localStorage.removeItem(o);continue}let r=ee(o);if(!r)continue;t.set(F(r.componentId,r.segment),a)}catch(c){}})(),{get(o,c){let a=t.get(F(o,c));return a?n(a)?(t.delete(F(o,c)),null):a:null},set(o,c,a){let r=F(o,c);t.set(r,a);try{localStorage.setItem(Re(o,c),JSON.stringify(a))}catch(s){}},invalidate(o){let c=`${o}:`;for(let a of[...t.keys()])a.startsWith(c)&&t.delete(a);for(let a of j()){let r=ee(a);if((r==null?void 0:r.componentId)===o)try{localStorage.removeItem(a)}catch(s){}}},clear(){t.clear();for(let o of j())try{localStorage.removeItem(o)}catch(c){}}}}function U(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function L(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(o){}let i=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(i)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(i)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function ne(e){let t=Ue("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Ue(e,t){var c,a,r,s,g,f,m;let n=(a=(c=t==null?void 0:t.userAgent)==null?void 0:c.trim())!=null?a:"",i=(s=(r=t==null?void 0:t.referer)==null?void 0:r.trim())!=null?s:"",o=(g=t==null?void 0:t.now)!=null?g:new Date;return{sessionId:e,ephemeral:!1,utmParams:(f=t==null?void 0:t.utmParams)!=null?f:{},deviceClass:n?U(n):"desktop",trafficSource:i?L(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(i),timeOfDay:P(o),dayOfWeek:(m=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?m:"sun"}}function re(e,t,n){var o;let i=[];{let r=!1,s=[],g=()=>{if(r)return;let f=Date.now();for(s.push(f);s.length>0&&f-s[0]>500;)s.shift();s.length>=3&&(r=!0,e("rage_click"))};t.addEventListener("click",g),i.push(()=>t.removeEventListener("click",g))}{let c=!1,a=r=>{if(c||!(r.target instanceof Node)||!t.contains(r.target)&&t!==r.target)return;c=!0;let s=typeof window!="undefined"?window.getSelection():null,g=s?s.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",a),i.push(()=>document.removeEventListener("copy",a))}{let c=!1,a=!1,r=null,s=()=>{r!==null&&(clearTimeout(r),r=null)},g=()=>{c||!a||(s(),r=setTimeout(()=>{!c&&a&&(c=!0,e("scroll_hesitation"))},3e3))},f=()=>{s(),g()},m=S=>{for(let v of S)a=v.intersectionRatio>.3,a?g():s()};typeof process!="undefined"&&((o=process.env)==null?void 0:o.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),i.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),s()})}{let c=!1,a=n!=null?n:Date.now(),r=()=>{if(c||document.visibilityState!=="hidden")return;let s=Date.now()-a;s<15e3&&(c=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",r),i.push(()=>document.removeEventListener("visibilitychange",r))}return()=>{for(let c of i)c()}}var se="https://api.sentient-ui.com/v1/events",$=new Map,oe=null;function ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var N={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Le(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,i]of t)n.startsWith("utm_")&&(e[n]=i);return e}catch(e){return{}}}function ae(e){return e.replace(/\/events\/?$/,"")}function Me(e){if(typeof window=="undefined")return;let t=e!=null?e:oe;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let n=$.get(t);if(!n){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:o}=n;if(!o)return;let c=ce(Q(R({},i),{consent:!0}));o(c),$.set(t,{config:Q(R({},i),{consent:!0}),upgrade:null})}function Pe(e){var a;let t=ae((a=e.ingestUrl)!=null?a:se),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(r,s,g){try{let f=new URLSearchParams({componentId:r});for(let S of s!=null?s:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:n});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(f){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},o={track:r=>i.track(r),goal:(r,s,g,f)=>i.goal(r,s,g,f),identify:r=>i.identify(r),getAssignment:(r,s)=>i.getAssignment(r,s),assign:(r,s,g,f)=>i.assign(r,s,g,f),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function c(r){i=r}return{proxy:o,setInner:c}}function ce(e){var K,D,W,B,_;if(typeof window=="undefined")return N;if(oe=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;let{proxy:u,setInner:d}=Pe(e);return $.set(e.apiKey,{config:e,upgrade:d}),u}return $.set(e.apiKey,{config:e,upgrade:null}),N}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),N;let t=(K=e.ingestUrl)!=null?K:se,n=Date.now(),i=X({ssrSessionId:e.ssrSessionId}),o=te(),c=Z({ingestUrl:t,apiKey:e.apiKey}),a=ae(t),r={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=U((D=navigator.userAgent)!=null?D:""),g=typeof window!="undefined"?window.location.origin:void 0,f=L((W=document.referrer)!=null?W:"",g),m=(B=e.sessionSegment)!=null?B:`${s}:${f}`,y=new Map;if(e.initialAssignments)for(let[u,d]of Object.entries(e.initialAssignments))o.set(u,m,{variantId:d,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=i.getSessionId();if(v){let u=M((_=document.referrer)!=null?_:""),d=R({sessionId:v,deviceClass:s,trafficSource:f,referrerDomain:u,utmParams:Le(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(d),headers:r}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:c});let x={goal(u,d={},h=1,C=0){let k=i.getSessionId();if(!k)return;let b=ie();S.then(()=>{fetch(`${a}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:u,metadata:d,weight:h,stepIndex:C,goalId:b}),headers:r}).catch(()=>{})})},identify(u){let d=i.getSessionId();d&&S.then(()=>{fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:d,userId:u,ephemeral:i.isEphemeral()}),headers:r}).catch(()=>{})})},track(u){let d=i.getSessionId();if(!d)return;let h=Q(R({},u),{id:ie(),sessionId:d,timestamp:Date.now(),timeInSession:Date.now()-n});c.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(u,d){return o.get(u,d)},async assign(u,d,h,C){let k=i.getSessionId();if(!k)return null;let b=o.get(u,m);if(b&&(d!=null&&d.length||b.content!==void 0))return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};let A=y.get(u);if(A)return A;let l=(async()=>{await S;try{let p={sessionId:k,componentId:u,variantIds:d};C!==void 0?p.agentDataByVariant=C:h!==void 0&&(p.agentData=h);let w=await fetch(`${a}/assign`,{method:"POST",body:JSON.stringify(p),headers:r});if(!w.ok)return null;let E=await w.json();return o.set(u,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(p){return null}finally{y.delete(u)}})();return y.set(u,l),l},async fetchWeights(){var u;try{let d=await fetch(`${a}/weights`,{headers:r});return d.ok?(u=(await d.json()).components)!=null?u:[]:[]}catch(d){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){c.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if($.set(e.apiKey,{config:e,upgrade:null}),e.debug){let u=window;u.__sentient&&(u.__sentient.client=x)}return x}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as f,b as g,c as h}from"./chunk-PXHX4K5R.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
1
+ import{a as f,b as g,c as h}from"./chunk-NXCIN4O2.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentientui/core",
3
- "version": "0.7.1",
3
+ "version": "0.8.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,13 +26,6 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "scripts": {
30
- "build": "tsup",
31
- "test": "vitest run",
32
- "typecheck": "tsc --noEmit",
33
- "size-check": "tsx scripts/size-check.ts",
34
- "lint": "eslint src"
35
- },
36
29
  "devDependencies": {
37
30
  "@types/node": "^22.10.2",
38
31
  "jsdom": "^25.0.1",
@@ -40,5 +33,12 @@
40
33
  "tsx": "^4.19.2",
41
34
  "typescript": "^5.7.2",
42
35
  "vitest": "^2.1.8"
36
+ },
37
+ "scripts": {
38
+ "build": "tsup",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit",
41
+ "size-check": "tsx scripts/size-check.ts",
42
+ "lint": "eslint src"
43
43
  }
44
- }
44
+ }
@@ -1 +0,0 @@
1
- import{a as L,b as B,c as G,d as Q,e as F,f as z}from"./chunk-QCYVBCUV.mjs";var ee="_snt_uid";var C="_snt_uid";function te(){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 ne(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function ie(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(o){}}function se(e){try{return localStorage.getItem(e)}catch(t){return null}}function re(e,t){try{return localStorage.setItem(e,t),!0}catch(a){return!1}}function oe(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ae(e,t){try{return sessionStorage.setItem(e,t),!0}catch(a){return!1}}function ce(e){try{sessionStorage.removeItem(e)}catch(t){}}function le(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 de(e){try{localStorage.removeItem(e)}catch(t){}}function ue(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var ge={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Y(e){var f,g,p,v,y;if(typeof window=="undefined")return ge;let t=(f=e==null?void 0:e.cookieName)!=null?f:ee,o=((g=e==null?void 0:e.cookieTTLDays)!=null?g:365)*24*60*60,i=(y=(v=(p=ne(t))!=null?p:se(C))!=null?v:oe(C))!=null?y:te();ie(t,i,o);let s=re(C,i),n=le(t),r=s?!1:ae(C,i),l=!s&&!n&&!r;return{getSessionId:()=>i,isEphemeral:()=>l,destroy:()=>{i=null,ue(t),de(C),ce(C)}}}var K="_snt_retry";var fe={push:()=>{},flush:()=>{},destroy:()=>{}};function me(e){try{let t=localStorage.getItem(K);if(!t)return[];let a=JSON.parse(t);return Array.isArray(a)?(localStorage.removeItem(K),a.slice(-e)):[]}catch(t){return[]}}function J(e,t){try{let o=[...(()=>{try{let i=localStorage.getItem(K);if(!i)return[];let s=JSON.parse(i);return Array.isArray(s)?s:[]}catch(i){return[]}})(),...e].slice(-t);localStorage.setItem(K,JSON.stringify(o))}catch(a){}}function q(e){var k,b,T;if(typeof window=="undefined")return fe;let t=(k=e.flushIntervalMs)!=null?k:5e3,a=(b=e.maxBatchSize)!=null?b:20,o=(T=e.maxRetrySize)!=null?T:100,i=e.ingestUrl,s=e.apiKey,n=[],r=new Set,l=[],f=c=>{for(let u of c)g.delete(u),!r.has(u)&&(r.add(u),l.push(u));for(;l.length>500;){let u=l.shift();u&&r.delete(u)}},g=new Set,p=c=>{r.has(c.id)||g.has(c.id)||(g.add(c.id),n.push(c))},v=me(o);for(let c of v)p(c);let y=0,w=0,R=c=>{if(c.length===0)return;let u=JSON.stringify(c),h=c.map(I=>I.id),E;try{E=fetch(i,{method:"POST",keepalive:!0,body:u,headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}})}catch(I){J(c,o);for(let P of h)g.delete(P);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6));return}let _=I=>{if(I.ok||I.status>=400&&I.status<500&&I.status!==429){f(h),w=0,y=0;return}J(c,o);for(let P of h)g.delete(P);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};E instanceof Promise?E.then(_).catch(()=>{J(c,o);for(let I of h)g.delete(I);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))}):_(E)},A=typeof TextEncoder!="undefined"?new TextEncoder:null,U=c=>A?A.encode(c).length:c.length,M=c=>{let u=[],h=2;for(let E of c){let _=U(JSON.stringify(E))+1;if(u.length>0&&h+_>57344||u.length>=a)break;u.push(E),h+=_}return u},x=()=>{try{if(Date.now()<y)return;for(;n.length>0;){let c=n.filter(h=>!r.has(h.id));if(n.length=0,c.length===0)break;let u=M(c);if(u.length===0)break;u.length<c.length&&n.push(...c.slice(u.length)),R(u)}}catch(c){}},D=!0,d=null;d=setInterval(()=>{D&&x()},t);let m=()=>{document.visibilityState==="hidden"&&x()},S=()=>{x()};return document.addEventListener("visibilitychange",m),window.addEventListener("beforeunload",S),{push(c){p(c),n.length>=a&&x()},flush:x,destroy(){D=!1,d!==null&&(clearInterval(d),d=null),document.removeEventListener("visibilitychange",m),window.removeEventListener("beforeunload",S),x()}}}var $="_snt_asgn_";function N(e,t){return`${e}:${t}`}function pe(e,t){return`${$}${e}_${t}`}function W(){try{let e=[];for(let t=0;t<localStorage.length;t++){let a=localStorage.key(t);a!=null&&a.startsWith($)&&e.push(a)}return e}catch(e){return[]}}function V(e=18e5){let t=new Map,a=i=>i.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let i of W())try{let s=localStorage.getItem(i);if(!s)continue;let n=JSON.parse(s);if(a(n)){localStorage.removeItem(i);continue}let r=i.slice($.length),l=r.lastIndexOf("_");if(l<0)continue;let f=r.slice(0,l),g=r.slice(l+1);t.set(N(f,g),n)}catch(s){}})(),{get(i,s){let n=t.get(N(i,s));return n?a(n)?(t.delete(N(i,s)),null):n:null},set(i,s,n){let r=N(i,s);t.set(r,n);try{localStorage.setItem(pe(i,s),JSON.stringify(n))}catch(l){}},invalidate(i){let s=`${i}:`;for(let n of[...t.keys()])n.startsWith(s)&&t.delete(n);for(let n of W()){let r=n.slice($.length),l=r.lastIndexOf("_");if(l<0)continue;if(r.slice(0,l)===i)try{localStorage.removeItem(n)}catch(g){}}},clear(){t.clear();for(let i of W())try{localStorage.removeItem(i)}catch(s){}}}}function ye(e,t,a){let o=[];{let n=!1,r=[],l=()=>{if(n)return;let f=Date.now();for(r.push(f);r.length>0&&f-r[0]>500;)r.shift();r.length>=3&&(n=!0,e("rage_click"))};t.addEventListener("click",l),o.push(()=>t.removeEventListener("click",l))}{let i=!1,s=n=>{if(i||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;i=!0;let r=typeof window!="undefined"?window.getSelection():null,l=r?r.toString().length:0;e("text_copy",{selectionLength:l})};document.addEventListener("copy",s),o.push(()=>document.removeEventListener("copy",s))}{let i=!1,s=!1,n=null,r=()=>{n!==null&&(clearTimeout(n),n=null)},l=()=>{i||!s||(r(),n=setTimeout(()=>{!i&&s&&(i=!0,e("scroll_hesitation"))},3e3))},f=()=>{r(),l()},g=v=>{for(let y of v)s=y.intersectionRatio>.3,s?l():r()};window.__lastIOCallback=g;let p=new IntersectionObserver(g,{threshold:[.3]});p.observe(t),window.addEventListener("scroll",f,{passive:!0}),o.push(()=>{p.disconnect(),window.removeEventListener("scroll",f),r()})}{let i=!1,s=a!=null?a:Date.now(),n=()=>{if(i||document.visibilityState!=="hidden")return;let r=Date.now()-s;r<15e3&&(i=!0,e("tab_loss",{timeOnPage:r}))};document.addEventListener("visibilitychange",n),o.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let i of o)i()}}var X="https://api.sentient-ui.com/v1/events",j=null,H=null;function he(){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 O={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Se(){try{let e={},t=new URLSearchParams(window.location.search);for(let[a,o]of t)a.startsWith("utm_")&&(e[a]=o);return e}catch(e){return{}}}function Z(e){return e.replace(/\/events\/?$/,"")}function De(){if(typeof window=="undefined")return;if(!j){console.warn("[sentient] grantConsent() called before init()");return}let e=H;H=null;let t=we(B(L({},j),{consent:!0}));e==null||e(t)}function ve(e){var i;let t=Z((i=e.ingestUrl)!=null?i:X),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,async assign(s,n,r){try{let l=new URLSearchParams({componentId:s});for(let p of n!=null?n:[])l.append("variantIds[]",p);let f=await fetch(`${t}/winner?${l.toString()}`,{headers:a});return f.ok?{variantId:(await f.json()).variantId,assignmentTtlMs:0}:n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}catch(l){return n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};return H=s=>{o=s},{track:s=>o.track(s),goal:(s,n)=>o.goal(s,n),identify:s=>o.identify(s),getAssignment:(s,n)=>o.getAssignment(s,n),assign:(s,n,r,l)=>o.assign(s,n,r,l),getGraph:()=>o.getGraph(),destroy:()=>o.destroy()}}function we(e){var A,U,M,x,D;if(typeof window=="undefined")return O;if(j=e,e.consent===!1)return e.preConsentBehavior==="statistical_winner"?!e.apiKey||!e.apiKey.startsWith("pk_")?(console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),O):ve(e):O;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."),O;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),O;let t=(A=e.ingestUrl)!=null?A:X,a=Date.now(),o=Y(),i=V(),s=q({ingestUrl:t,apiKey:e.apiKey}),n=Z(t),r={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},l=G((U=navigator.userAgent)!=null?U:""),f=typeof window!="undefined"?window.location.origin:void 0,g=Q((M=document.referrer)!=null?M:"",f),p=(x=e.sessionSegment)!=null?x:`${l}:${g}`,v=new Map;if(e.initialAssignments)for(let[d,m]of Object.entries(e.initialAssignments))i.set(d,p,{variantId:m,assignedAt:Date.now(),segment:p,confidence:1});let y=Promise.resolve(),w=o.getSessionId();if(w){let d=F((D=document.referrer)!=null?D:""),m=L({sessionId:w,deviceClass:l,trafficSource:g,referrerDomain:d,utmParams:Se(),timeOfDay:z(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:o.isEphemeral()},e.userId?{userId:e.userId}:{});try{y=fetch(`${n}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:r}).then(S=>{S.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(S){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:s});let R={goal(d,m={},S=1,k=0){let b=o.getSessionId();b&&y.then(()=>{fetch(`${n}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:b,name:d,metadata:m,weight:S,stepIndex:k}),headers:r}).catch(()=>{})})},identify(d){let m=o.getSessionId();m&&y.then(()=>{fetch(`${n}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:d,ephemeral:o.isEphemeral()}),headers:r}).catch(()=>{})})},track(d){let m=o.getSessionId();if(!m)return;let S=B(L({},d),{id:he(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-a});s.push(S),e.debug&&console.log("[sentient] track",S)},getAssignment(d,m){return i.get(d,m)},async assign(d,m,S,k){let b=o.getSessionId();if(!b)return null;let T=i.get(d,p);if(T)return{variantId:T.variantId,assignmentTtlMs:0,content:T.content};let c=v.get(d);if(c)return c;let u=(async()=>{await y;try{let h={sessionId:b,componentId:d,variantIds:m};k!==void 0?h.agentDataByVariant=k:S!==void 0&&(h.agentData=S);let E=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(h),headers:r});if(!E.ok)return null;let _=await E.json();return i.set(d,p,{variantId:_.variantId,assignedAt:Date.now(),segment:p,confidence:1,content:_.content}),_}catch(h){return null}finally{v.delete(d)}})();return v.set(d,u),u},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){s.destroy(),o.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let d=window;d.__sentient&&(d.__sentient.client=R)}return R}export{ye as a,De as b,we as c};