@sentientui/core 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,7 +29,7 @@ console.log(result?.content); // managed text content if the variant is WYSI
29
29
  client.goal('trial_started', { plan: 'pro' });
30
30
  ```
31
31
 
32
- `init()` returns a no-op client during SSR (`typeof window === 'undefined'`), when `consent` is `false`, or when `apiKey` does not start with `pk_`. The hosted ingest URL (`https://sentient-api.fly.dev/v1/events`) is built in — no URL configuration required.
32
+ `init()` returns a no-op client during SSR (`typeof window === 'undefined'`), when `consent` is `false`, or when `apiKey` does not start with `pk_`. The hosted ingest URL (`https://api.sentient-ui.com/v1/events`) is built in — no URL configuration required.
33
33
 
34
34
  ## API
35
35
 
@@ -104,7 +104,7 @@ const initialAssignments = await preloadAssignments(
104
104
  sessionId,
105
105
  {
106
106
  apiKey: process.env.SENTIENT_API_KEY!,
107
- baseUrl: 'https://sentient-api.fly.dev/v1',
107
+ baseUrl: 'https://api.sentient-ui.com/v1',
108
108
  origin: process.env.APP_ORIGIN, // must be in the project's allowed origins
109
109
  userAgent, // from request headers, aligns segment with the client
110
110
  referer,
@@ -1 +1 @@
1
- import{a as M,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 se(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(o){}}function ie(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,h;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,s=(h=(v=(p=ne(t))!=null?p:ie(C))!=null?v:oe(C))!=null?h:te();se(t,s,o);let i=re(C,s),n=le(t),r=i?!1:ae(C,s),l=!i&&!n&&!r;return{getSessionId:()=>s,isEphemeral:()=>l,destroy:()=>{s=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 s=localStorage.getItem(K);if(!s)return[];let i=JSON.parse(s);return Array.isArray(i)?i:[]}catch(s){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,s=e.ingestUrl,i=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 h=0,w=0,R=c=>{if(c.length===0)return;let u=JSON.stringify(c),y=c.map(I=>I.id),E;try{E=fetch(s,{method:"POST",keepalive:!0,body:u,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(I){J(c,o);for(let P of y)g.delete(P);w++,h=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(y),w=0,h=0;return}J(c,o);for(let P of y)g.delete(P);w++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};E instanceof Promise?E.then(_).catch(()=>{J(c,o);for(let I of y)g.delete(I);w++,h=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,L=c=>{let u=[],y=2;for(let E of c){let _=U(JSON.stringify(E))+1;if(u.length>0&&y+_>57344||u.length>=a)break;u.push(E),y+=_}return u},x=()=>{try{if(Date.now()<h)return;for(;n.length>0;){let c=n.filter(y=>!r.has(y.id));if(n.length=0,c.length===0)break;let u=L(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=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of W())try{let i=localStorage.getItem(s);if(!i)continue;let n=JSON.parse(i);if(a(n)){localStorage.removeItem(s);continue}let r=s.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(i){}})(),{get(s,i){let n=t.get(N(s,i));return n?a(n)?(t.delete(N(s,i)),null):n:null},set(s,i,n){let r=N(s,i);t.set(r,n);try{localStorage.setItem(pe(s,i),JSON.stringify(n))}catch(l){}},invalidate(s){let i=`${s}:`;for(let n of[...t.keys()])n.startsWith(i)&&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)===s)try{localStorage.removeItem(n)}catch(g){}}},clear(){t.clear();for(let s of W())try{localStorage.removeItem(s)}catch(i){}}}}function he(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 s=!1,i=n=>{if(s||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;s=!0;let r=typeof window!="undefined"?window.getSelection():null,l=r?r.toString().length:0;e("text_copy",{selectionLength:l})};document.addEventListener("copy",i),o.push(()=>document.removeEventListener("copy",i))}{let s=!1,i=!1,n=null,r=()=>{n!==null&&(clearTimeout(n),n=null)},l=()=>{s||!i||(r(),n=setTimeout(()=>{!s&&i&&(s=!0,e("scroll_hesitation"))},3e3))},f=()=>{r(),l()},g=v=>{for(let h of v)i=h.intersectionRatio>.3,i?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 s=!1,i=a!=null?a:Date.now(),n=()=>{if(s||document.visibilityState!=="hidden")return;let r=Date.now()-i;r<15e3&&(s=!0,e("tab_loss",{timeOnPage:r}))};document.addEventListener("visibilitychange",n),o.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let s of o)s()}}var X="https://sentient-api.fly.dev/v1/events",j=null,H=null;function ye(){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(M({},j),{consent:!0}));e==null||e(t)}function ve(e){var s;let t=Z((s=e.ingestUrl)!=null?s:X),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,async assign(i,n,r){try{let l=new URLSearchParams({componentId:i});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=i=>{o=i},{track:i=>o.track(i),goal:(i,n)=>o.goal(i,n),identify:i=>o.identify(i),getAssignment:(i,n)=>o.getAssignment(i,n),assign:(i,n,r,l)=>o.assign(i,n,r,l),getGraph:()=>o.getGraph(),destroy:()=>o.destroy()}}function we(e){var A,U,L,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(),s=V(),i=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((L=document.referrer)!=null?L:"",f),p=(x=e.sessionSegment)!=null?x:`${l}:${g}`,v=new Map;if(e.initialAssignments)for(let[d,m]of Object.entries(e.initialAssignments))s.set(d,p,{variantId:m,assignedAt:Date.now(),segment:p,confidence:1});let h=Promise.resolve(),w=o.getSessionId();if(w){let d=F((D=document.referrer)!=null?D:""),m=M({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{h=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 sentientui.dev/pricing")}).catch(()=>{})}catch(S){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let R={goal(d,m={},S=1,k=0){let b=o.getSessionId();b&&h.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&&h.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(M({},d),{id:ye(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-a});i.push(S),e.debug&&console.log("[sentient] track",S)},getAssignment(d,m){return s.get(d,m)},async assign(d,m,S,k){let b=o.getSessionId();if(!b)return null;let T=s.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 h;try{let y={sessionId:b,componentId:d,variantIds:m};k!==void 0?y.agentDataByVariant=k:S!==void 0&&(y.agentData=S);let E=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(y),headers:r});if(!E.ok)return null;let _=await E.json();return s.set(d,p,{variantId:_.variantId,assignedAt:Date.now(),segment:p,confidence:1,content:_.content}),_}catch(y){return null}finally{v.delete(d)}})();return v.set(d,u),u},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),o.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let d=window;d.__sentient&&(d.__sentient.client=R)}return R}export{he as a,De as b,we as c};
1
+ import{a as M,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 se(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(o){}}function ie(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,h;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,s=(h=(v=(p=ne(t))!=null?p:ie(C))!=null?v:oe(C))!=null?h:te();se(t,s,o);let i=re(C,s),n=le(t),r=i?!1:ae(C,s),l=!i&&!n&&!r;return{getSessionId:()=>s,isEphemeral:()=>l,destroy:()=>{s=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 s=localStorage.getItem(K);if(!s)return[];let i=JSON.parse(s);return Array.isArray(i)?i:[]}catch(s){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,s=e.ingestUrl,i=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 h=0,w=0,R=c=>{if(c.length===0)return;let u=JSON.stringify(c),y=c.map(I=>I.id),E;try{E=fetch(s,{method:"POST",keepalive:!0,body:u,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(I){J(c,o);for(let P of y)g.delete(P);w++,h=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(y),w=0,h=0;return}J(c,o);for(let P of y)g.delete(P);w++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};E instanceof Promise?E.then(_).catch(()=>{J(c,o);for(let I of y)g.delete(I);w++,h=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,L=c=>{let u=[],y=2;for(let E of c){let _=U(JSON.stringify(E))+1;if(u.length>0&&y+_>57344||u.length>=a)break;u.push(E),y+=_}return u},x=()=>{try{if(Date.now()<h)return;for(;n.length>0;){let c=n.filter(y=>!r.has(y.id));if(n.length=0,c.length===0)break;let u=L(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=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of W())try{let i=localStorage.getItem(s);if(!i)continue;let n=JSON.parse(i);if(a(n)){localStorage.removeItem(s);continue}let r=s.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(i){}})(),{get(s,i){let n=t.get(N(s,i));return n?a(n)?(t.delete(N(s,i)),null):n:null},set(s,i,n){let r=N(s,i);t.set(r,n);try{localStorage.setItem(pe(s,i),JSON.stringify(n))}catch(l){}},invalidate(s){let i=`${s}:`;for(let n of[...t.keys()])n.startsWith(i)&&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)===s)try{localStorage.removeItem(n)}catch(g){}}},clear(){t.clear();for(let s of W())try{localStorage.removeItem(s)}catch(i){}}}}function he(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 s=!1,i=n=>{if(s||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;s=!0;let r=typeof window!="undefined"?window.getSelection():null,l=r?r.toString().length:0;e("text_copy",{selectionLength:l})};document.addEventListener("copy",i),o.push(()=>document.removeEventListener("copy",i))}{let s=!1,i=!1,n=null,r=()=>{n!==null&&(clearTimeout(n),n=null)},l=()=>{s||!i||(r(),n=setTimeout(()=>{!s&&i&&(s=!0,e("scroll_hesitation"))},3e3))},f=()=>{r(),l()},g=v=>{for(let h of v)i=h.intersectionRatio>.3,i?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 s=!1,i=a!=null?a:Date.now(),n=()=>{if(s||document.visibilityState!=="hidden")return;let r=Date.now()-i;r<15e3&&(s=!0,e("tab_loss",{timeOnPage:r}))};document.addEventListener("visibilitychange",n),o.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let s of o)s()}}var X="https://api.sentient-ui.com/v1/events",j=null,H=null;function ye(){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(M({},j),{consent:!0}));e==null||e(t)}function ve(e){var s;let t=Z((s=e.ingestUrl)!=null?s:X),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,async assign(i,n,r){try{let l=new URLSearchParams({componentId:i});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=i=>{o=i},{track:i=>o.track(i),goal:(i,n)=>o.goal(i,n),identify:i=>o.identify(i),getAssignment:(i,n)=>o.getAssignment(i,n),assign:(i,n,r,l)=>o.assign(i,n,r,l),getGraph:()=>o.getGraph(),destroy:()=>o.destroy()}}function we(e){var A,U,L,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(),s=V(),i=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((L=document.referrer)!=null?L:"",f),p=(x=e.sessionSegment)!=null?x:`${l}:${g}`,v=new Map;if(e.initialAssignments)for(let[d,m]of Object.entries(e.initialAssignments))s.set(d,p,{variantId:m,assignedAt:Date.now(),segment:p,confidence:1});let h=Promise.resolve(),w=o.getSessionId();if(w){let d=F((D=document.referrer)!=null?D:""),m=M({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{h=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 sentientui.dev/pricing")}).catch(()=>{})}catch(S){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let R={goal(d,m={},S=1,k=0){let b=o.getSessionId();b&&h.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&&h.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(M({},d),{id:ye(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-a});i.push(S),e.debug&&console.log("[sentient] track",S)},getAssignment(d,m){return s.get(d,m)},async assign(d,m,S,k){let b=o.getSessionId();if(!b)return null;let T=s.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 h;try{let y={sessionId:b,componentId:d,variantIds:m};k!==void 0?y.agentDataByVariant=k:S!==void 0&&(y.agentData=S);let E=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(y),headers:r});if(!E.ok)return null;let _=await E.json();return s.set(d,p,{variantId:_.variantId,assignedAt:Date.now(),segment:p,confidence:1,content:_.content}),_}catch(y){return null}finally{v.delete(d)}})();return v.set(d,u),u},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),o.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(e.debug){let d=window;d.__sentient&&(d.__sentient.client=R)}return R}export{he as a,De as b,we 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:()=>L,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){}},P=!0,f=null;f=setInterval(()=>{P&&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(){P=!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 L(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:L(i),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?g:"sun"}}var oe="https://sentient-api.fly.dev/v1/events",Le=null,Pe=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 Pe=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,P;if(typeof window=="undefined")return $;if(Le=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((P=document.referrer)!=null?P:""),S=D({sessionId:h,deviceClass:c,trafficSource:l,referrerDomain:f,utmParams:Ke(),timeOfDay:L(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 sentientui.dev/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://sentient-api.fly.dev/v1/events";function ot(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function 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 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:()=>L,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){}},P=!0,f=null;f=setInterval(()=>{P&&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(){P=!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 L(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:L(i),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?g:"sun"}}var oe="https://api.sentient-ui.com/v1/events",Le=null,Pe=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 Pe=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,P;if(typeof window=="undefined")return $;if(Le=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((P=document.referrer)!=null?P:""),S=D({sessionId:h,deviceClass:c,trafficSource:l,referrerDomain:f,utmParams:Ke(),timeOfDay:L(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 sentientui.dev/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 +1 @@
1
- import{c as v}from"./chunk-GL5EXCWW.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 d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let o=d[s],r=(p=(t=o==null?void 0:o.type)==null?void 0:t.displayName)!=null?p:(n=o==null?void 0:o.type)==null?void 0:n.name;if(r&&r.length>1)return r}}catch(d){}}function $(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[o,r]of e){let a=o.parentElement,c=p;for(;a;){if(e.has(a)){c=e.get(a);let m=e.get(o),g=`${c}->${m}`;!n.has(g)&&c!==m&&(n.add(g),t.push({fromComponentId:c,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(c))!=null?s:[];u.push(o),d.set(c,u)}for(let o of d.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let a=r+1;a<o.length;a++){let c=e.get(o[r]),u=e.get(o[a]);if(c===u)continue;let m=`${c}->${u}::sib`,g=`${u}->${c}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:c,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:c,weight:.3}))}return t}function 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 c=I(o,e);t.push(c),p.set(o,c.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),c=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=r.getBoundingClientRect(),g=Math.max(m.top,0),i=window.innerHeight||1,f=1/(g/i+1),l=S(c,12,48)*.4+S(f,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,l))}catch(a){return .5}};return{scan:()=>new Promise(r=>{let a=()=>{let{nodes:c,edges:u}=F(p);r({nodes:c,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(c){a()}}),observe:r=>{n=r;try{e=new MutationObserver(a=>{let c=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!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);c.push(l),u.set(g,l.componentId)});c.length>0&&n&&n({nodes:c,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(r){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",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 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 c=[],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),c.push({fromComponentId:i.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(i=>i.componentId));for(let i of n.values()){if(!m.has(i.fromComponentId)||!m.has(i.toComponentId))continue;let f=`structural:${i.fromComponentId}->${i.toComponentId}`;u.has(f)||(u.add(f),c.push({fromComponentId:i.fromComponentId,toComponentId:i.toComponentId,type:"structural",weight:i.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(i=>{let f=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:c};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://sentient-api.fly.dev/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,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&d.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}return n.scan().then(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r);d.syncOnce()}),n.observe(o=>{for(let r of o.nodes)d.addPageNode({id:r.componentId,componentId:r.componentId,semanticType:r.semanticType,answers:r.headingText?[r.headingText]:[],prominenceScore:r.prominenceScore,depth:r.depth});for(let r of o.edges)d.addStructuralEdge(r)}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{n.destroy(),d.destroy(),t.destroy()}})}export{R as deriveSessionSegment,x as detectDeviceClass,M as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
1
+ import{c as v}from"./chunk-UMFABMON.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};
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 T="_snt_uid";function he(){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 ye(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 Ce={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Z(e){var f,d,m,v,h;if(typeof window=="undefined")return Ce;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=(h=(v=(m=ye(t))!=null?m:ve(T))!=null?v:xe(T))!=null?h:he();Se(t,i,o);let s=we(T,i),n=be(t),a=s?!1:Ee(T,i),c=!s&&!n&&!a;return{getSessionId:()=>i,isEphemeral:()=>c,destroy:()=>{i=null,Ie(t),ke(T),_e(T)}}}var G="_snt_retry";var Te={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,C;if(typeof window=="undefined")return Te;let t=(I=e.flushIntervalMs)!=null?I:5e3,r=(k=e.maxBatchSize)!=null?k:20,o=(C=e.maxRetrySize)!=null?C: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 h=0,w=0,P=l=>{if(l.length===0)return;let g=JSON.stringify(l),y=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 y)d.delete(W);w++,h=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(y),w=0,h=0;return}J(l,o);for(let W of y)d.delete(W);w++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};x instanceof Promise?x.then(_).catch(()=>{J(l,o);for(let b of y)d.delete(b);w++,h=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=[],y=2;for(let x of l){let _=$(JSON.stringify(x))+1;if(g.length>0&&y+_>57344||g.length>=r)break;g.push(x),y+=_}return g},E=()=>{try{if(Date.now()<h)return;for(;n.length>0;){let l=n.filter(y=>!a.has(y.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 h of v)s=h.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://sentient-api.fly.dev/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 h=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{h=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 sentientui.dev/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&&h.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&&h.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 C=i.get(u,m);if(C)return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let l=v.get(u);if(l)return l;let g=(async()=>{await h;try{let y={sessionId:k,componentId:u,variantIds:p};I!==void 0?y.agentDataByVariant=I:S!==void 0&&(y.agentData=S);let x=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(y),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(y){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 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 T="_snt_uid";function he(){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 ye(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 Ce={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Z(e){var f,d,m,v,h;if(typeof window=="undefined")return Ce;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=(h=(v=(m=ye(t))!=null?m:ve(T))!=null?v:xe(T))!=null?h:he();Se(t,i,o);let s=we(T,i),n=be(t),a=s?!1:Ee(T,i),c=!s&&!n&&!a;return{getSessionId:()=>i,isEphemeral:()=>c,destroy:()=>{i=null,Ie(t),ke(T),_e(T)}}}var G="_snt_retry";var Te={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,C;if(typeof window=="undefined")return Te;let t=(I=e.flushIntervalMs)!=null?I:5e3,r=(k=e.maxBatchSize)!=null?k:20,o=(C=e.maxRetrySize)!=null?C: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 h=0,w=0,P=l=>{if(l.length===0)return;let g=JSON.stringify(l),y=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 y)d.delete(W);w++,h=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(y),w=0,h=0;return}J(l,o);for(let W of y)d.delete(W);w++,h=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};x instanceof Promise?x.then(_).catch(()=>{J(l,o);for(let b of y)d.delete(b);w++,h=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=[],y=2;for(let x of l){let _=$(JSON.stringify(x))+1;if(g.length>0&&y+_>57344||g.length>=r)break;g.push(x),y+=_}return g},E=()=>{try{if(Date.now()<h)return;for(;n.length>0;){let l=n.filter(y=>!a.has(y.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 h of v)s=h.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 h=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{h=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 sentientui.dev/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&&h.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&&h.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 C=i.get(u,m);if(C)return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let l=v.get(u);if(l)return l;let g=(async()=>{await h;try{let y={sessionId:k,componentId:u,variantIds:p};I!==void 0?y.agentDataByVariant=I:S!==void 0&&(y.agentData=S);let x=await fetch(`${n}/assign`,{method:"POST",body:JSON.stringify(y),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(y){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});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as f,b as g,c as h}from"./chunk-GL5EXCWW.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-UMFABMON.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.6.0",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",