@sentientui/core 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,7 +25,11 @@ const result = await client.assign('hero_headline', ['control', 'variant_b']);
25
25
  console.log(result?.variantId); // e.g. 'variant_b'
26
26
  console.log(result?.content); // managed text content if the variant is WYSIWYG-managed
27
27
 
28
- // Fire a goal (reward) when the visitor converts
28
+ // Credit the variant served for a component when the visitor converts
29
+ // (feeds the per-variant CVR funnel — no variantId plumbing needed)
30
+ client.componentGoal('hero_headline', 'trial_started');
31
+
32
+ // Or record a session-level funnel goal not tied to any component
29
33
  client.goal('trial_started', { plan: 'pro' });
30
34
  ```
31
35
 
@@ -65,11 +69,24 @@ Queues an event for batched ingest. Events flush every 5 s and on `visibilitycha
65
69
 
66
70
  Fires a named goal for the current session. Used for cross-component conversions (e.g. `'trial_started'`, `'purchase_completed'`) where you cannot scope the reward to a single `<Adaptive>`.
67
71
 
68
- > **Two reward paths:** `client.goal()` sends a named reward event that the bandit attributes to whatever variant was active at goal time. When using `@sentientui/react`, the `<Adaptive>` component's `onConvert` prop (or the `goal` prop on `<AdaptiveText>`) is the preferred path for rewards scoped to a single component — it ties the reward directly to the assignment without needing the component ID. Use `client.goal()` for funnel steps that span multiple components or occur after navigation.
69
-
70
72
  - `weight` (0–1, default `1.0`) — partial reward value. Use values < 1 for funnel steps that precede the final conversion. The bandit learns from each step immediately.
71
73
  - `stepIndex` (default `0`) — position in the funnel for analytics grouping.
72
74
 
75
+ > **Which goal method?** `goal()` is **session-level** — it POSTs to `/v1/goals` with no component/variant, so it appears in funnel charts but **not** the per-variant CVR breakdown. For variant experiments, prefer **`componentGoal()`** (below) or the declarative `<Adaptive goal={…}>` prop, both of which attribute the conversion to the served variant.
76
+
77
+ ### `client.componentGoal(componentId, goalType, opts?)`
78
+
79
+ Records a conversion **attributed to the variant currently served** for `componentId`, so it feeds the per-variant CVR funnel. Resolves the served variant from the local assignment cache — you don't pass `variantId` or `projectId`. Emits a `goal_achieved` event (the same signal `<Adaptive goal>` fires automatically).
80
+
81
+ ```ts
82
+ client.componentGoal('hero_headline', 'hero_contact', {
83
+ reward: 1, // 0–1, default 1
84
+ metadata: { method: 'whatsapp' } // merged into the event payload
85
+ });
86
+ ```
87
+
88
+ No-ops (with a `debug` warning) if the component has not been assigned yet — render its `<Adaptive>` / call `assign()` first. Prefer this over a hand-rolled `client.track({ eventType: 'goal_achieved', … })`, which requires you to thread the `variantId` through yourself. In React, use the [`useAdaptiveGoal`](../react/README.md#useadaptivegoalcomponentid) hook.
89
+
73
90
  ### `client.identify(userId)`
74
91
 
75
92
  Attaches a stable user ID to the session. Portraits and cluster assignment carry forward across future sessions for the same `userId`.
@@ -103,7 +120,7 @@ const initialAssignments = await preloadAssignments(
103
120
  ],
104
121
  sessionId,
105
122
  {
106
- apiKey: process.env.SENTIENT_API_KEY!,
123
+ apiKey: process.env.NEXT_PUBLIC_SENTIENT_API_KEY!,
107
124
  baseUrl: 'https://api.sentient-ui.com/v1',
108
125
  origin: process.env.APP_ORIGIN, // must be in the project's allowed origins
109
126
  userAgent, // from request headers, aligns segment with the client
@@ -0,0 +1 @@
1
+ import{a as A,b as K,c as W,d as B,e as Q,f as F}from"./chunk-QCYVBCUV.mjs";var ne="_snt_uid";var D="_snt_uid";function se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ie(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function re(e,t,a){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${a}; SameSite=strict; path=/`}catch(i){}}function oe(e){try{return localStorage.getItem(e)}catch(t){return null}}function ae(e,t){try{return localStorage.setItem(e,t),!0}catch(a){return!1}}function ce(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function le(e,t){try{return sessionStorage.setItem(e,t),!0}catch(a){return!1}}function de(e){try{sessionStorage.removeItem(e)}catch(t){}}function ue(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function ge(e){try{localStorage.removeItem(e)}catch(t){}}function pe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var fe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function V(e){var p,m,f,S,y,v;if(typeof window=="undefined")return fe;let t=(p=e==null?void 0:e.cookieName)!=null?p:ne,i=((m=e==null?void 0:e.cookieTTLDays)!=null?m:365)*24*60*60,c=(v=(y=(S=(f=ie(t))!=null?f:oe(D))!=null?S:ce(D))!=null?y:e==null?void 0:e.ssrSessionId)!=null?v:se();re(t,c,i);let o=ae(D,c),r=ue(t),n=o?!1:le(D,c),s=!o&&!r&&!n;return{getSessionId:()=>c,isEphemeral:()=>s,destroy:()=>{c=null,pe(t),ge(D),de(D)}}}var me={push:()=>{},flush:()=>{},destroy:()=>{}};function he(e,t){try{let a=localStorage.getItem(t);if(!a)return[];let i=JSON.parse(a);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(a){return[]}}function j(e,t,a){try{let c=[...(()=>{try{let o=localStorage.getItem(a);if(!o)return[];let r=JSON.parse(o);return Array.isArray(r)?r:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(a,JSON.stringify(c))}catch(i){}}function Y(e){var x,w,T;if(typeof window=="undefined")return me;let t=(x=e.flushIntervalMs)!=null?x:5e3,a=(w=e.maxBatchSize)!=null?w:20,i=(T=e.maxRetrySize)!=null?T:100,c=e.ingestUrl,o=e.apiKey,r=`_snt_retry_${o.slice(0,12)}`,n=[],s=new Set,p=[],m=l=>{for(let g of l)f.delete(g),!s.has(g)&&(s.add(g),p.push(g));for(;p.length>500;){let g=p.shift();g&&s.delete(g)}},f=new Set,S=l=>{s.has(l.id)||f.has(l.id)||(f.add(l.id),n.push(l))},y=he(i,r);for(let l of y)S(l);let v=0,_=0,L=l=>{if(l.length===0)return;let g=JSON.stringify(l),E=l.map(C=>C.id),I;try{I=fetch(c,{method:"POST",keepalive:!0,body:g,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(C){j(l,i,r);for(let G of E)f.delete(G);_++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(_,6));return}let R=C=>{if(C.ok||C.status>=400&&C.status<500&&C.status!==429){m(E),_=0,v=0;return}j(l,i,r);for(let G of E)f.delete(G);_++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(_,6))};I instanceof Promise?I.then(R).catch(()=>{j(l,i,r);for(let C of E)f.delete(C);_++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(_,6))}):R(I)},O=typeof TextEncoder!="undefined"?new TextEncoder:null,N=l=>O?O.encode(l).length:l.length,$=l=>{let g=[],E=2;for(let I of l){let R=N(JSON.stringify(I))+1;if(g.length>0&&E+R>57344||g.length>=a)break;g.push(I),E+=R}return g},k=()=>{try{if(Date.now()<v)return;for(;n.length>0;){let l=n.filter(E=>!s.has(E.id));if(n.length=0,l.length===0)break;let g=$(l);if(g.length===0)break;g.length<l.length&&n.push(...l.slice(g.length)),L(g)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&k()},t);let h=()=>{document.visibilityState==="hidden"&&k()},b=()=>{k()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",b),{push(l){S(l),n.length>=a&&k()},flush:k,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",b),k()}}}var J="_snt_asgn_";function P(e,t){return`${e}:${t}`}function ye(e,t){return`${J}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function q(e){let t=e.slice(J.length),a=t.indexOf(":");if(a<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,a)),segment:decodeURIComponent(t.slice(a+1))}}catch(i){return null}}function z(){try{let e=[];for(let t=0;t<localStorage.length;t++){let a=localStorage.key(t);a!=null&&a.startsWith(J)&&e.push(a)}return e}catch(e){return[]}}function X(e=18e5){let t=new Map,a=c=>c.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let c of z())try{let o=localStorage.getItem(c);if(!o)continue;let r=JSON.parse(o);if(a(r)){localStorage.removeItem(c);continue}let n=q(c);if(!n)continue;t.set(P(n.componentId,n.segment),r)}catch(o){}})(),{get(c,o){let r=t.get(P(c,o));return r?a(r)?(t.delete(P(c,o)),null):r:null},set(c,o,r){let n=P(c,o);t.set(n,r);try{localStorage.setItem(ye(c,o),JSON.stringify(r))}catch(s){}},invalidate(c){let o=`${c}:`;for(let r of[...t.keys()])r.startsWith(o)&&t.delete(r);for(let r of z()){let n=q(r);if((n==null?void 0:n.componentId)===c)try{localStorage.removeItem(r)}catch(s){}}},clear(){t.clear();for(let c of z())try{localStorage.removeItem(c)}catch(o){}}}}function Se(e,t,a){var c;let i=[];{let n=!1,s=[],p=()=>{if(n)return;let m=Date.now();for(s.push(m);s.length>0&&m-s[0]>500;)s.shift();s.length>=3&&(n=!0,e("rage_click"))};t.addEventListener("click",p),i.push(()=>t.removeEventListener("click",p))}{let o=!1,r=n=>{if(o||!(n.target instanceof Node)||!t.contains(n.target)&&t!==n.target)return;o=!0;let s=typeof window!="undefined"?window.getSelection():null,p=s?s.toString().length:0;e("text_copy",{selectionLength:p})};document.addEventListener("copy",r),i.push(()=>document.removeEventListener("copy",r))}{let o=!1,r=!1,n=null,s=()=>{n!==null&&(clearTimeout(n),n=null)},p=()=>{o||!r||(s(),n=setTimeout(()=>{!o&&r&&(o=!0,e("scroll_hesitation"))},3e3))},m=()=>{s(),p()},f=y=>{for(let v of y)r=v.intersectionRatio>.3,r?p():s()};typeof process!="undefined"&&((c=process.env)==null?void 0:c.NODE_ENV)!=="production"&&(window.__lastIOCallback=f);let S=new IntersectionObserver(f,{threshold:[.3]});S.observe(t),window.addEventListener("scroll",m,{passive:!0}),i.push(()=>{S.disconnect(),window.removeEventListener("scroll",m),s()})}{let o=!1,r=a!=null?a:Date.now(),n=()=>{if(o||document.visibilityState!=="hidden")return;let s=Date.now()-r;s<15e3&&(o=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",n),i.push(()=>document.removeEventListener("visibilitychange",n))}return()=>{for(let o of i)o()}}var Z="https://api.sentient-ui.com/v1/events",M=new Map,ee=null;function H(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var U={track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function ve(){try{let e={},t=new URLSearchParams(window.location.search);for(let[a,i]of t)a.startsWith("utm_")&&(e[a]=i);return e}catch(e){return{}}}function te(e){return e.replace(/\/events\/?$/,"")}function Oe(e){if(typeof window=="undefined")return;let t=e!=null?e:ee;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let a=M.get(t);if(!a){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:c}=a;if(!c)return;let o=Ee(K(A({},i),{consent:!0}));c(o),M.set(t,{config:K(A({},i),{consent:!0}),upgrade:null})}function we(e){var r;let t=te((r=e.ingestUrl)!=null?r:Z),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(n,s,p){try{let m=new URLSearchParams({componentId:n});for(let y of s!=null?s:[])m.append("variantIds[]",y);let f=await fetch(`${t}/winner?${m.toString()}`,{headers:a});return f.ok?{variantId:(await f.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(m){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},c={track:n=>i.track(n),goal:(n,s,p,m)=>i.goal(n,s,p,m),componentGoal:(n,s,p)=>i.componentGoal(n,s,p),identify:n=>i.identify(n),getAssignment:(n,s)=>i.getAssignment(n,s),assign:(n,s,p,m)=>i.assign(n,s,p,m),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function o(n){i=n}return{proxy:c,setInner:o}}function Ee(e){var L,O,N,$,k;if(typeof window=="undefined")return U;if(ee=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;let{proxy:d,setInner:u}=we(e);return M.set(e.apiKey,{config:e,upgrade:u}),d}return M.set(e.apiKey,{config:e,upgrade:null}),U}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),U;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),U;let t=(L=e.ingestUrl)!=null?L:Z,a=Date.now(),i=V({ssrSessionId:e.ssrSessionId}),c=X(),o=Y({ingestUrl:t,apiKey:e.apiKey}),r=te(t),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=W((O=navigator.userAgent)!=null?O:""),p=typeof window!="undefined"?window.location.origin:void 0,m=B((N=document.referrer)!=null?N:"",p),f=($=e.sessionSegment)!=null?$:`${s}:${m}`,S=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))c.set(d,f,{variantId:u,assignedAt:Date.now(),segment:f,confidence:1});let y=Promise.resolve(),v=i.getSessionId();if(v){let d=Q((k=document.referrer)!=null?k:""),u=A({sessionId:v,deviceClass:s,trafficSource:m,referrerDomain:d,utmParams:ve(),timeOfDay:F(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{y=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:n}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let _={goal(d,u={},h=1,b=0){let x=i.getSessionId();if(!x)return;let w=H();y.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:x,name:d,metadata:u,weight:h,stepIndex:b,goalId:w}),headers:n}).catch(()=>{})})},componentGoal(d,u,h){var T,l;let b=i.getSessionId();if(!b)return;let x=c.get(d,f);if(!x){e.debug&&console.warn(`[sentient] componentGoal("${d}"): no assignment yet \u2014 render its <Adaptive> or call assign() before recording a goal.`);return}let w={id:H(),sessionId:b,projectId:e.apiKey,componentId:d,variantId:x.variantId,eventType:"goal_achieved",goalType:u,payload:A({reward:(T=h==null?void 0:h.reward)!=null?T:1},(l=h==null?void 0:h.metadata)!=null?l:{}),timestamp:Date.now(),timeInSession:Date.now()-a};e.debug&&console.log("[sentient] componentGoal",w),y.then(()=>o.push(w))},identify(d){let u=i.getSessionId();u&&y.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:i.isEphemeral()}),headers:n}).catch(()=>{})})},track(d){let u=i.getSessionId();if(!u)return;let h=K(A({},d),{id:H(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-a});e.debug&&console.log("[sentient] track",h),y.then(()=>o.push(h))},getAssignment(d,u){return c.get(d,u)},async assign(d,u,h,b){let x=i.getSessionId();if(!x)return null;let w=c.get(d,f);if(w&&(u!=null&&u.length||w.content!==void 0))return{variantId:w.variantId,assignmentTtlMs:0,content:w.content};let T=S.get(d);if(T)return T;let l=(async()=>{await y;try{let g={sessionId:x,componentId:d,variantIds:u};b!==void 0?g.agentDataByVariant=b:h!==void 0&&(g.agentData=h);let E=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(g),headers:n});if(!E.ok)return null;let I=await E.json();return c.set(d,f,{variantId:I.variantId,assignedAt:Date.now(),segment:f,confidence:1,content:I.content}),I}catch(g){return null}finally{S.delete(d)}})();return S.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${r}/weights`,{headers:n});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(M.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=_)}return _}export{Se as a,Oe as b,Ee as c};
@@ -1 +1 @@
1
- "use strict";var W=Object.defineProperty,pe=Object.defineProperties,fe=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols;var te=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ee=(e,t,n)=>t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(e,t)=>{for(var n in t||(t={}))te.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))ye.call(t,n)&&ee(e,n,t[n]);return e},B=(e,t)=>pe(e,me(t));var Se=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of he(t))!te.call(e,s)&&s!==n&&W(e,s,{get:()=>t[s],enumerable:!(d=fe(t,s))||d.enumerable});return e};var we=e=>ve(W({},"__esModule",{value:!0}),e);var it={};Se(it,{deriveSessionSegment:()=>H,detectDeviceClass:()=>O,detectTimeOfDay:()=>U,detectTrafficSource:()=>R,init:()=>st,referrerDomainFromReferer:()=>M});module.exports=we(it);var Ee="_snt_uid";var N="_snt_uid";function Ie(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function be(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function Ce(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(d){}}function xe(e){try{return localStorage.getItem(e)}catch(t){return null}}function _e(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Te(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function Ae(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function ke(e){try{sessionStorage.removeItem(e)}catch(t){}}function De(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ne(e){try{localStorage.removeItem(e)}catch(t){}}function Oe(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Re={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function ne(e){var c,u,g,h,l,y;if(typeof window=="undefined")return Re;let t=(c=e==null?void 0:e.cookieName)!=null?c:Ee,d=((u=e==null?void 0:e.cookieTTLDays)!=null?u:365)*24*60*60,s=(y=(l=(h=(g=be(t))!=null?g:xe(N))!=null?h:Te(N))!=null?l:e==null?void 0:e.ssrSessionId)!=null?y:Ie();Ce(t,s,d);let i=_e(N,s),r=De(t),a=i?!1:Ae(N,s),o=!i&&!r&&!a;return{getSessionId:()=>s,isEphemeral:()=>o,destroy:()=>{s=null,Oe(t),Ne(N),ke(N)}}}var Me={push:()=>{},flush:()=>{},destroy:()=>{}};function Ue(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let d=JSON.parse(n);return Array.isArray(d)?(localStorage.removeItem(t),d.slice(-e)):[]}catch(n){return[]}}function J(e,t,n){try{let s=[...(()=>{try{let i=localStorage.getItem(n);if(!i)return[];let r=JSON.parse(i);return Array.isArray(r)?r:[]}catch(i){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(s))}catch(d){}}function re(e){var A,C,P;if(typeof window=="undefined")return Me;let t=(A=e.flushIntervalMs)!=null?A:5e3,n=(C=e.maxBatchSize)!=null?C:20,d=(P=e.maxRetrySize)!=null?P:100,s=e.ingestUrl,i=e.apiKey,r=`_snt_retry_${i.slice(0,12)}`,a=[],o=new Set,c=[],u=p=>{for(let S of p)g.delete(S),!o.has(S)&&(o.add(S),c.push(S));for(;c.length>500;){let S=c.shift();S&&o.delete(S)}},g=new Set,h=p=>{o.has(p.id)||g.has(p.id)||(g.add(p.id),a.push(p))},l=Ue(d,r);for(let p of l)h(p);let y=0,v=0,_=p=>{if(p.length===0)return;let S=JSON.stringify(p),E=p.map(x=>x.id),I;try{I=fetch(s,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}})}catch(x){J(p,d,r);for(let z of E)g.delete(z);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6));return}let L=x=>{if(x.ok||x.status>=400&&x.status<500&&x.status!==429){u(E),v=0,y=0;return}J(p,d,r);for(let z of E)g.delete(z);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))};I instanceof Promise?I.then(L).catch(()=>{J(p,d,r);for(let x of E)g.delete(x);v++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(v,6))}):L(I)},T=typeof TextEncoder!="undefined"?new TextEncoder:null,G=p=>T?T.encode(p).length:p.length,K=p=>{let S=[],E=2;for(let I of p){let L=G(JSON.stringify(I))+1;if(S.length>0&&E+L>57344||S.length>=n)break;S.push(I),E+=L}return S},b=()=>{try{if(Date.now()<y)return;for(;a.length>0;){let p=a.filter(E=>!o.has(E.id));if(a.length=0,p.length===0)break;let S=K(p);if(S.length===0)break;S.length<p.length&&a.push(...p.slice(S.length)),_(S)}}catch(p){}},f=!0,m=null;m=setInterval(()=>{f&&b()},t);let w=()=>{document.visibilityState==="hidden"&&b()},k=()=>{b()};return document.addEventListener("visibilitychange",w),window.addEventListener("beforeunload",k),{push(p){h(p),a.length>=n&&b()},flush:b,destroy(){f=!1,m!==null&&(clearInterval(m),m=null),document.removeEventListener("visibilitychange",w),window.removeEventListener("beforeunload",k),b()}}}var j="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Pe(e,t){return`${j}${e}_${t}`}function Q(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(j)&&e.push(n)}return e}catch(e){return[]}}function oe(e=18e5){let t=new Map,n=s=>s.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let s of Q())try{let i=localStorage.getItem(s);if(!i)continue;let r=JSON.parse(i);if(n(r)){localStorage.removeItem(s);continue}let a=s.slice(j.length),o=a.lastIndexOf("_");if(o<0)continue;let c=a.slice(0,o),u=a.slice(o+1);t.set(F(c,u),r)}catch(i){}})(),{get(s,i){let r=t.get(F(s,i));return r?n(r)?(t.delete(F(s,i)),null):r:null},set(s,i,r){let a=F(s,i);t.set(a,r);try{localStorage.setItem(Pe(s,i),JSON.stringify(r))}catch(o){}},invalidate(s){let i=`${s}:`;for(let r of[...t.keys()])r.startsWith(i)&&t.delete(r);for(let r of Q()){let a=r.slice(j.length),o=a.lastIndexOf("_");if(o<0)continue;if(a.slice(0,o)===s)try{localStorage.removeItem(r)}catch(u){}}},clear(){t.clear();for(let s of Q())try{localStorage.removeItem(s)}catch(i){}}}}function O(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function R(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(s){}let d=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(d)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(d)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function U(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=Le("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Le(e,t){var i,r,a,o,c,u,g;let n=(r=(i=t==null?void 0:t.userAgent)==null?void 0:i.trim())!=null?r:"",d=(o=(a=t==null?void 0:t.referer)==null?void 0:a.trim())!=null?o:"",s=(c=t==null?void 0:t.now)!=null?c:new Date;return{sessionId:e,ephemeral:!1,utmParams:(u=t==null?void 0:t.utmParams)!=null?u:{},deviceClass:n?O(n):"desktop",trafficSource:d?R(d,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(d),timeOfDay:U(s),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?g:"sun"}}var ie="https://api.sentient-ui.com/v1/events",q=new Map,$e=null;function se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var $={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ge(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,d]of t)n.startsWith("utm_")&&(e[n]=d);return e}catch(e){return{}}}function ae(e){return e.replace(/\/events\/?$/,"")}function Ke(e){var r;let t=ae((r=e.ingestUrl)!=null?r:ie),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},d={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(a,o,c){try{let u=new URLSearchParams({componentId:a});for(let l of o!=null?o:[])u.append("variantIds[]",l);let g=await fetch(`${t}/winner?${u.toString()}`,{headers:n});return g.ok?{variantId:(await g.json()).variantId,assignmentTtlMs:0}:o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}catch(u){return o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},s={track:a=>d.track(a),goal:(a,o,c,u)=>d.goal(a,o,c,u),identify:a=>d.identify(a),getAssignment:(a,o)=>d.getAssignment(a,o),assign:(a,o,c,u)=>d.assign(a,o,c,u),fetchWeights:()=>d.fetchWeights(),getGraph:()=>d.getGraph(),destroy:()=>d.destroy()};function i(a){d=a}return{proxy:s,setInner:i}}function ce(e){var _,T,G,K,b;if(typeof window=="undefined")return $;if($e=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;let{proxy:f,setInner:m}=Ke(e);return q.set(e.apiKey,{config:e,upgrade:m}),f}return q.set(e.apiKey,{config:e,upgrade:null}),$}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(_=e.ingestUrl)!=null?_:ie,n=Date.now(),d=ne({ssrSessionId:e.ssrSessionId}),s=oe(),i=re({ingestUrl:t,apiKey:e.apiKey}),r=ae(t),a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o=O((T=navigator.userAgent)!=null?T:""),c=typeof window!="undefined"?window.location.origin:void 0,u=R((G=document.referrer)!=null?G:"",c),g=(K=e.sessionSegment)!=null?K:`${o}:${u}`,h=new Map;if(e.initialAssignments)for(let[f,m]of Object.entries(e.initialAssignments))s.set(f,g,{variantId:m,assignedAt:Date.now(),segment:g,confidence:1});let l=Promise.resolve(),y=d.getSessionId();if(y){let f=M((b=document.referrer)!=null?b:""),m=D({sessionId:y,deviceClass:o,trafficSource:u,referrerDomain:f,utmParams:Ge(),timeOfDay:U(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:d.isEphemeral()},e.userId?{userId:e.userId}:{});try{l=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(m),headers:a}).then(w=>{w.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(w){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:i});let v={goal(f,m={},w=1,k=0){let A=d.getSessionId();if(!A)return;let C=se();l.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:A,name:f,metadata:m,weight:w,stepIndex:k,goalId:C}),headers:a}).catch(()=>{})})},identify(f){let m=d.getSessionId();m&&l.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:m,userId:f,ephemeral:d.isEphemeral()}),headers:a}).catch(()=>{})})},track(f){let m=d.getSessionId();if(!m)return;let w=B(D({},f),{id:se(),sessionId:m,timestamp:Date.now(),timeInSession:Date.now()-n});i.push(w),e.debug&&console.log("[sentient] track",w)},getAssignment(f,m){return s.get(f,m)},async assign(f,m,w,k){let A=d.getSessionId();if(!A)return null;let C=s.get(f,g);if(C&&(m!=null&&m.length||C.content!==void 0))return{variantId:C.variantId,assignmentTtlMs:0,content:C.content};let P=h.get(f);if(P)return P;let p=(async()=>{await l;try{let S={sessionId:A,componentId:f,variantIds:m};k!==void 0?S.agentDataByVariant=k:w!==void 0&&(S.agentData=w);let E=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(S),headers:a});if(!E.ok)return null;let I=await E.json();return s.set(f,g,{variantId:I.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:I.content}),I}catch(S){return null}finally{h.delete(f)}})();return h.set(f,p),p},async fetchWeights(){var f;try{let m=await fetch(`${r}/weights`,{headers:a});return m.ok?(f=(await m.json()).components)!=null?f:[]:[]}catch(m){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){i.destroy(),d.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(q.set(e.apiKey,{config:e,upgrade:null}),e.debug){let f=window;f.__sentient&&(f.__sentient.client=v)}return v}var We=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Be="h1, h2, h3",Fe={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function V(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function je(e){var t,n,d;try{let s=e;for(let i of Object.keys(s)){if(!i.startsWith("__reactFiber")&&!i.startsWith("__reactInternalInstance"))continue;let r=s[i],a=(d=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?d:(n=r==null?void 0:r.type)==null?void 0:n.name;if(a&&a.length>1)return a}}catch(s){}}function ze(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function Je(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function Qe(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function He(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function Y(e,t){var d,s,i;let n=e.querySelector(Be);return{componentId:Qe(e),semanticType:Je(e),ariaLabel:(d=e.getAttribute("aria-label"))!=null?d:void 0,headingText:(i=(s=n==null?void 0:n.textContent)==null?void 0:s.trim())!=null?i:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:He(e),reactComponentName:je(e),dataAttributes:ze(e)}}function de(e){var i;let t=[],n=new Set,d="__root__",s=new Map;for(let[r,a]of e){let o=r.parentElement,c=d;for(;o;){if(e.has(o)){c=e.get(o);let g=e.get(r),h=`${c}->${g}`;!n.has(h)&&c!==g&&(n.add(h),t.push({fromComponentId:c,toComponentId:g,weight:.6}));break}o=o.parentElement}let u=(i=s.get(c))!=null?i:[];u.push(r),s.set(c,u)}for(let r of s.values())if(!(r.length<2))for(let a=0;a<r.length;a++)for(let o=a+1;o<r.length;o++){let c=e.get(r[a]),u=e.get(r[o]);if(c===u)continue;let g=`${c}->${u}::sib`,h=`${u}->${c}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:c,toComponentId:u,weight:.3})),n.has(h)||(n.add(h),t.push({fromComponentId:u,toComponentId:c,weight:.3}))}return t}function qe(e){let t=[],n=new Set,d=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let a=Y(r,e);t.push(a),d.set(r,a.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let a=r.hasAttribute("aria-label"),o=r.hasAttribute("data-sentient-id");if(!a&&!o)return;n.add(r);let c=Y(r,e);t.push(c),d.set(r,c.componentId)}),{nodes:t,edges:de(d)}}function ue(){if(typeof window=="undefined")return Fe;let e=null,t=0,n=null,d=a=>{try{let o=window.getComputedStyle(a),c=parseFloat(o.fontSize)||12,u=parseFloat(o.zIndex)||0,g=a.getBoundingClientRect(),h=Math.max(g.top,0),l=window.innerHeight||1,y=1/(h/l+1),v=V(c,12,48)*.4+V(y,0,1)*.4+V(u,0,100)*.2;return Math.max(0,Math.min(1,v))}catch(o){return .5}};return{scan:()=>new Promise(a=>{let o=()=>{let{nodes:c,edges:u}=qe(d);a({nodes:c,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(o,{timeout:100}):o()}catch(c){o()}}),observe:a=>{n=a;try{e=new MutationObserver(o=>{let c=[],u=new Map;for(let g of o)g.type==="childList"&&g.addedNodes.forEach(h=>{if(!(h instanceof Element)||!We.has(h.tagName))return;let l=h.hasAttribute("data-sentient-id"),y=h.hasAttribute("aria-label");if(!l&&!y)return;let v=Y(h,d);c.push(v),u.set(h,v.componentId)});c.length>0&&n&&n({nodes:c,edges:de(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(o){}},getProminenceScore:d,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(a){}t=0,n=null}}}var X="_snt_graph_nodes",le="_snt_graph_edges",Ve={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Ye(e){var t;return(t=Ve[e])!=null?t:[]}function Xe(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function Ze(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var et=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function tt(e){return et.has(e)?e:"generic"}function nt(e,t,n){let d=`${e}:${t}:${n.join(",")}`,s=5381;for(let i=0;i<d.length;i++)s=(s<<5)+s+d.charCodeAt(i)&4294967295;return(s>>>0).toString(16).padStart(8,"0")}function ge(e){let t=new Map,n=new Map,d=()=>{typeof window!="undefined"&&Ze(X,[...t.values()])},s=i=>{var r;try{let a=JSON.parse(i);t.clear();for(let o of(r=a.pageNodes)!=null?r:[])t.set(o.componentId,o)}catch(a){}};if(typeof window!="undefined"){let i=Xe(X,[]);for(let r of i)t.set(r.componentId,r);try{localStorage.removeItem(le)}catch(r){}}return{addPageNode(i){t.set(i.componentId,i),d()},addStructuralEdge(i){let r=`${i.fromComponentId}->${i.toComponentId}`;n.set(r,i)},syncOnce(){var r,a;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let i=[...t.values()];if(i.length!==0)try{let o=new Map;for(let l of i){let y=(r=o.get(l.semanticType))!=null?r:[];y.push(l),o.set(l.semanticType,y)}let c=[],u=new Set;for(let l of i)for(let y of Ye(l.semanticType)){let v=(a=o.get(y))!=null?a:[];for(let _ of v){if(_.componentId===l.componentId)continue;let T=`semantic:${l.componentId}->${_.componentId}`;u.has(T)||(u.add(T),c.push({fromComponentId:l.componentId,toComponentId:_.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(i.map(l=>l.componentId));for(let l of n.values()){if(!g.has(l.fromComponentId)||!g.has(l.toComponentId))continue;let y=`structural:${l.fromComponentId}->${l.toComponentId}`;u.has(y)||(u.add(y),c.push({fromComponentId:l.fromComponentId,toComponentId:l.toComponentId,type:"structural",weight:l.weight,confidence:1}))}let h={pageUrl:window.location.href,nodes:i.map(l=>{let y=tt(l.semanticType);return{componentId:l.componentId,semanticType:y,answers:l.answers,contentHash:nt(l.componentId,y,l.answers),prominenceScore:l.prominenceScore,depthInPage:l.depth}}),edges:c};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:D({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(h)}).catch(()=>{})}catch(o){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:s,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(X),localStorage.removeItem(le)}catch(i){}}}}var rt="https://api.sentient-ui.com/v1/events";function ot(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function st(e){var a;let t=ce(e);if(!e.graph||typeof window=="undefined")return t;let n=ue(),d=(a=e.ingestUrl)!=null?a:rt,s=ge({syncUrl:d.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:ot()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&s.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}n.scan().then(o=>{for(let c of o.nodes)s.addPageNode({id:c.componentId,componentId:c.componentId,semanticType:c.semanticType,answers:c.headingText?[c.headingText]:[],prominenceScore:c.prominenceScore,depth:c.depth});for(let c of o.edges)s.addStructuralEdge(c);s.syncOnce()});let i=null,r=()=>{i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null,s.syncOnce()},500)};return n.observe(o=>{for(let c of o.nodes)s.addPageNode({id:c.componentId,componentId:c.componentId,semanticType:c.semanticType,answers:c.headingText?[c.headingText]:[],prominenceScore:c.prominenceScore,depth:c.depth});for(let c of o.edges)s.addStructuralEdge(c);r()}),B(D({},t),{getGraph:()=>s.snapshot(),destroy:()=>{i!==null&&clearTimeout(i),n.destroy(),s.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
1
+ "use strict";var W=Object.defineProperty,me=Object.defineProperties,fe=Object.getOwnPropertyDescriptor,he=Object.getOwnPropertyDescriptors,ye=Object.getOwnPropertyNames,ee=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable;var te=(e,t,n)=>t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,O=(e,t)=>{for(var n in t||(t={}))ne.call(t,n)&&te(e,n,t[n]);if(ee)for(var n of ee(t))Se.call(t,n)&&te(e,n,t[n]);return e},B=(e,t)=>me(e,he(t));var ve=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ye(t))!ne.call(e,i)&&i!==n&&W(e,i,{get:()=>t[i],enumerable:!(c=fe(t,i))||c.enumerable});return e};var Ee=e=>we(W({},"__esModule",{value:!0}),e);var at={};ve(at,{deriveSessionSegment:()=>H,detectDeviceClass:()=>R,detectTimeOfDay:()=>P,detectTrafficSource:()=>M,init:()=>it,referrerDomainFromReferer:()=>U});module.exports=Ee(at);var Ie="_snt_uid";var N="_snt_uid";function be(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function Ce(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function xe(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(c){}}function _e(e){try{return localStorage.getItem(e)}catch(t){return null}}function Te(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Ae(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ke(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function De(e){try{sessionStorage.removeItem(e)}catch(t){}}function Oe(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ne(e){try{localStorage.removeItem(e)}catch(t){}}function Re(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Me={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function re(e){var d,l,g,h,u,y;if(typeof window=="undefined")return Me;let t=(d=e==null?void 0:e.cookieName)!=null?d:Ie,c=((l=e==null?void 0:e.cookieTTLDays)!=null?l:365)*24*60*60,i=(y=(u=(h=(g=Ce(t))!=null?g:_e(N))!=null?h:Ae(N))!=null?u:e==null?void 0:e.ssrSessionId)!=null?y:be();xe(t,i,c);let a=Te(N,i),r=Oe(t),s=a?!1:ke(N,i),o=!a&&!r&&!s;return{getSessionId:()=>i,isEphemeral:()=>o,destroy:()=>{i=null,Re(t),Ne(N),De(N)}}}var Ue={push:()=>{},flush:()=>{},destroy:()=>{}};function Pe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let c=JSON.parse(n);return Array.isArray(c)?(localStorage.removeItem(t),c.slice(-e)):[]}catch(n){return[]}}function z(e,t,n){try{let i=[...(()=>{try{let a=localStorage.getItem(n);if(!a)return[];let r=JSON.parse(a);return Array.isArray(r)?r:[]}catch(a){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(i))}catch(c){}}function oe(e){var b,E,D;if(typeof window=="undefined")return Ue;let t=(b=e.flushIntervalMs)!=null?b:5e3,n=(E=e.maxBatchSize)!=null?E:20,c=(D=e.maxRetrySize)!=null?D:100,i=e.ingestUrl,a=e.apiKey,r=`_snt_retry_${a.slice(0,12)}`,s=[],o=new Set,d=[],l=p=>{for(let S of p)g.delete(S),!o.has(S)&&(o.add(S),d.push(S));for(;d.length>500;){let S=d.shift();S&&o.delete(S)}},g=new Set,h=p=>{o.has(p.id)||g.has(p.id)||(g.add(p.id),s.push(p))},u=Pe(c,r);for(let p of u)h(p);let y=0,w=0,A=p=>{if(p.length===0)return;let S=JSON.stringify(p),I=p.map(T=>T.id),C;try{C=fetch(i,{method:"POST",keepalive:!0,body:S,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`}})}catch(T){z(p,c,r);for(let j of I)g.delete(j);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6));return}let L=T=>{if(T.ok||T.status>=400&&T.status<500&&T.status!==429){l(I),w=0,y=0;return}z(p,c,r);for(let j of I)g.delete(j);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))};C instanceof Promise?C.then(L).catch(()=>{z(p,c,r);for(let T of I)g.delete(T);w++,y=Date.now()+Math.min(6e4,1e3*2**Math.min(w,6))}):L(C)},k=typeof TextEncoder!="undefined"?new TextEncoder:null,G=p=>k?k.encode(p).length:p.length,K=p=>{let S=[],I=2;for(let C of p){let L=G(JSON.stringify(C))+1;if(S.length>0&&I+L>57344||S.length>=n)break;S.push(C),I+=L}return S},_=()=>{try{if(Date.now()<y)return;for(;s.length>0;){let p=s.filter(I=>!o.has(I.id));if(s.length=0,p.length===0)break;let S=K(p);if(S.length===0)break;S.length<p.length&&s.push(...p.slice(S.length)),A(S)}}catch(p){}},m=!0,f=null;f=setInterval(()=>{m&&_()},t);let v=()=>{document.visibilityState==="hidden"&&_()},x=()=>{_()};return document.addEventListener("visibilitychange",v),window.addEventListener("beforeunload",x),{push(p){h(p),s.length>=n&&_()},flush:_,destroy(){m=!1,f!==null&&(clearInterval(f),f=null),document.removeEventListener("visibilitychange",v),window.removeEventListener("beforeunload",x),_()}}}var Q="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Le(e,t){return`${Q}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function se(e){let t=e.slice(Q.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(c){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(Q)&&e.push(n)}return e}catch(e){return[]}}function ie(e=18e5){let t=new Map,n=i=>i.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let i of J())try{let a=localStorage.getItem(i);if(!a)continue;let r=JSON.parse(a);if(n(r)){localStorage.removeItem(i);continue}let s=se(i);if(!s)continue;t.set(F(s.componentId,s.segment),r)}catch(a){}})(),{get(i,a){let r=t.get(F(i,a));return r?n(r)?(t.delete(F(i,a)),null):r:null},set(i,a,r){let s=F(i,a);t.set(s,r);try{localStorage.setItem(Le(i,a),JSON.stringify(r))}catch(o){}},invalidate(i){let a=`${i}:`;for(let r of[...t.keys()])r.startsWith(a)&&t.delete(r);for(let r of J()){let s=se(r);if((s==null?void 0:s.componentId)===i)try{localStorage.removeItem(r)}catch(o){}}},clear(){t.clear();for(let i of J())try{localStorage.removeItem(i)}catch(a){}}}}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 c=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(c)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(c)?"social":"referral"}catch(n){return"direct"}}function U(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function H(e){let t=$e("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function $e(e,t){var a,r,s,o,d,l,g;let n=(r=(a=t==null?void 0:t.userAgent)==null?void 0:a.trim())!=null?r:"",c=(o=(s=t==null?void 0:t.referer)==null?void 0:s.trim())!=null?o:"",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:c?M(c,t==null?void 0:t.appOrigin):"direct",referrerDomain:U(c),timeOfDay:P(i),dayOfWeek:(g=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?g:"sun"}}var ae="https://api.sentient-ui.com/v1/events",q=new Map,Ge=null;function V(){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:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ke(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,c]of t)n.startsWith("utm_")&&(e[n]=c);return e}catch(e){return{}}}function ce(e){return e.replace(/\/events\/?$/,"")}function We(e){var r;let t=ce((r=e.ingestUrl)!=null?r:ae),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},c={track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(s,o,d){try{let l=new URLSearchParams({componentId:s});for(let u of o!=null?o:[])l.append("variantIds[]",u);let g=await fetch(`${t}/winner?${l.toString()}`,{headers:n});return g.ok?{variantId:(await g.json()).variantId,assignmentTtlMs:0}:o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}catch(l){return o!=null&&o[0]?{variantId:o[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},i={track:s=>c.track(s),goal:(s,o,d,l)=>c.goal(s,o,d,l),componentGoal:(s,o,d)=>c.componentGoal(s,o,d),identify:s=>c.identify(s),getAssignment:(s,o)=>c.getAssignment(s,o),assign:(s,o,d,l)=>c.assign(s,o,d,l),fetchWeights:()=>c.fetchWeights(),getGraph:()=>c.getGraph(),destroy:()=>c.destroy()};function a(s){c=s}return{proxy:i,setInner:a}}function de(e){var A,k,G,K,_;if(typeof window=="undefined")return $;if(Ge=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;let{proxy:m,setInner:f}=We(e);return q.set(e.apiKey,{config:e,upgrade:f}),m}return q.set(e.apiKey,{config:e,upgrade:null}),$}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),$;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),$;let t=(A=e.ingestUrl)!=null?A:ae,n=Date.now(),c=re({ssrSessionId:e.ssrSessionId}),i=ie(),a=oe({ingestUrl:t,apiKey:e.apiKey}),r=ce(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},o=R((k=navigator.userAgent)!=null?k:""),d=typeof window!="undefined"?window.location.origin:void 0,l=M((G=document.referrer)!=null?G:"",d),g=(K=e.sessionSegment)!=null?K:`${o}:${l}`,h=new Map;if(e.initialAssignments)for(let[m,f]of Object.entries(e.initialAssignments))i.set(m,g,{variantId:f,assignedAt:Date.now(),segment:g,confidence:1});let u=Promise.resolve(),y=c.getSessionId();if(y){let m=U((_=document.referrer)!=null?_:""),f=O({sessionId:y,deviceClass:o,trafficSource:l,referrerDomain:m,utmParams:Ke(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:c.isEphemeral()},e.userId?{userId:e.userId}:{});try{u=fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(f),headers:s}).then(v=>{v.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(v){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:a});let w={goal(m,f={},v=1,x=0){let b=c.getSessionId();if(!b)return;let E=V();u.then(()=>{fetch(`${r}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:b,name:m,metadata:f,weight:v,stepIndex:x,goalId:E}),headers:s}).catch(()=>{})})},componentGoal(m,f,v){var D,p;let x=c.getSessionId();if(!x)return;let b=i.get(m,g);if(!b){e.debug&&console.warn(`[sentient] componentGoal("${m}"): no assignment yet \u2014 render its <Adaptive> or call assign() before recording a goal.`);return}let E={id:V(),sessionId:x,projectId:e.apiKey,componentId:m,variantId:b.variantId,eventType:"goal_achieved",goalType:f,payload:O({reward:(D=v==null?void 0:v.reward)!=null?D:1},(p=v==null?void 0:v.metadata)!=null?p:{}),timestamp:Date.now(),timeInSession:Date.now()-n};e.debug&&console.log("[sentient] componentGoal",E),u.then(()=>a.push(E))},identify(m){let f=c.getSessionId();f&&u.then(()=>{fetch(`${r}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:f,userId:m,ephemeral:c.isEphemeral()}),headers:s}).catch(()=>{})})},track(m){let f=c.getSessionId();if(!f)return;let v=B(O({},m),{id:V(),sessionId:f,timestamp:Date.now(),timeInSession:Date.now()-n});e.debug&&console.log("[sentient] track",v),u.then(()=>a.push(v))},getAssignment(m,f){return i.get(m,f)},async assign(m,f,v,x){let b=c.getSessionId();if(!b)return null;let E=i.get(m,g);if(E&&(f!=null&&f.length||E.content!==void 0))return{variantId:E.variantId,assignmentTtlMs:0,content:E.content};let D=h.get(m);if(D)return D;let p=(async()=>{await u;try{let S={sessionId:b,componentId:m,variantIds:f};x!==void 0?S.agentDataByVariant=x:v!==void 0&&(S.agentData=v);let I=await fetch(`${r}/assign`,{method:"POST",body:JSON.stringify(S),headers:s});if(!I.ok)return null;let C=await I.json();return i.set(m,g,{variantId:C.variantId,assignedAt:Date.now(),segment:g,confidence:1,content:C.content}),C}catch(S){return null}finally{h.delete(m)}})();return h.set(m,p),p},async fetchWeights(){var m;try{let f=await fetch(`${r}/weights`,{headers:s});return f.ok?(m=(await f.json()).components)!=null?m:[]:[]}catch(f){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){a.destroy(),c.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(q.set(e.apiKey,{config:e,upgrade:null}),e.debug){let m=window;m.__sentient&&(m.__sentient.client=w)}return w}var Be=new Set(["SECTION","ARTICLE","MAIN","DIV"]),Fe="h1, h2, h3",je={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function Y(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function ze(e){var t,n,c;try{let i=e;for(let a of Object.keys(i)){if(!a.startsWith("__reactFiber")&&!a.startsWith("__reactInternalInstance"))continue;let r=i[a],s=(c=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?c:(n=r==null?void 0:r.type)==null?void 0:n.name;if(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 qe(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function X(e,t){var c,i,a;let n=e.querySelector(Fe);return{componentId:He(e),semanticType:Qe(e),ariaLabel:(c=e.getAttribute("aria-label"))!=null?c:void 0,headingText:(a=(i=n==null?void 0:n.textContent)==null?void 0:i.trim())!=null?a:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:qe(e),reactComponentName:ze(e),dataAttributes:Je(e)}}function ue(e){var a;let t=[],n=new Set,c="__root__",i=new Map;for(let[r,s]of e){let o=r.parentElement,d=c;for(;o;){if(e.has(o)){d=e.get(o);let g=e.get(r),h=`${d}->${g}`;!n.has(h)&&d!==g&&(n.add(h),t.push({fromComponentId:d,toComponentId:g,weight:.6}));break}o=o.parentElement}let l=(a=i.get(d))!=null?a:[];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 o=s+1;o<r.length;o++){let d=e.get(r[s]),l=e.get(r[o]);if(d===l)continue;let g=`${d}->${l}::sib`,h=`${l}->${d}::sib`;n.has(g)||(n.add(g),t.push({fromComponentId:d,toComponentId:l,weight:.3})),n.has(h)||(n.add(h),t.push({fromComponentId:l,toComponentId:d,weight:.3}))}return t}function Ve(e){let t=[],n=new Set,c=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let s=X(r,e);t.push(s),c.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"),o=r.hasAttribute("data-sentient-id");if(!s&&!o)return;n.add(r);let d=X(r,e);t.push(d),c.set(r,d.componentId)}),{nodes:t,edges:ue(c)}}function le(){if(typeof window=="undefined")return je;let e=null,t=0,n=null,c=s=>{try{let o=window.getComputedStyle(s),d=parseFloat(o.fontSize)||12,l=parseFloat(o.zIndex)||0,g=s.getBoundingClientRect(),h=Math.max(g.top,0),u=window.innerHeight||1,y=1/(h/u+1),w=Y(d,12,48)*.4+Y(y,0,1)*.4+Y(l,0,100)*.2;return Math.max(0,Math.min(1,w))}catch(o){return .5}};return{scan:()=>new Promise(s=>{let o=()=>{let{nodes:d,edges:l}=Ve(c);s({nodes:d,edges:l,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(o,{timeout:100}):o()}catch(d){o()}}),observe:s=>{n=s;try{e=new MutationObserver(o=>{let d=[],l=new Map;for(let g of o)g.type==="childList"&&g.addedNodes.forEach(h=>{if(!(h instanceof Element)||!Be.has(h.tagName))return;let u=h.hasAttribute("data-sentient-id"),y=h.hasAttribute("aria-label");if(!u&&!y)return;let w=X(h,c);d.push(w),l.set(h,w.componentId)});d.length>0&&n&&n({nodes:d,edges:ue(l),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(o){}},getProminenceScore:c,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(s){}t=0,n=null}}}var Z="_snt_graph_nodes",ge="_snt_graph_edges",Ye={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function Xe(e){var t;return(t=Ye[e])!=null?t:[]}function Ze(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function et(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var tt=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function nt(e){return tt.has(e)?e:"generic"}function rt(e,t,n){let c=`${e}:${t}:${n.join(",")}`,i=5381;for(let a=0;a<c.length;a++)i=(i<<5)+i+c.charCodeAt(a)&4294967295;return(i>>>0).toString(16).padStart(8,"0")}function pe(e){let t=new Map,n=new Map,c=()=>{typeof window!="undefined"&&et(Z,[...t.values()])},i=a=>{var r;try{let s=JSON.parse(a);t.clear();for(let o of(r=s.pageNodes)!=null?r:[])t.set(o.componentId,o)}catch(s){}};if(typeof window!="undefined"){let a=Ze(Z,[]);for(let r of a)t.set(r.componentId,r);try{localStorage.removeItem(ge)}catch(r){}}return{addPageNode(a){t.set(a.componentId,a),c()},addStructuralEdge(a){let r=`${a.fromComponentId}->${a.toComponentId}`;n.set(r,a)},syncOnce(){var r,s;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let a=[...t.values()];if(a.length!==0)try{let o=new Map;for(let u of a){let y=(r=o.get(u.semanticType))!=null?r:[];y.push(u),o.set(u.semanticType,y)}let d=[],l=new Set;for(let u of a)for(let y of Xe(u.semanticType)){let w=(s=o.get(y))!=null?s:[];for(let A of w){if(A.componentId===u.componentId)continue;let k=`semantic:${u.componentId}->${A.componentId}`;l.has(k)||(l.add(k),d.push({fromComponentId:u.componentId,toComponentId:A.componentId,type:"semantic",weight:.4,confidence:.9}))}}let g=new Set(a.map(u=>u.componentId));for(let u of n.values()){if(!g.has(u.fromComponentId)||!g.has(u.toComponentId))continue;let y=`structural:${u.fromComponentId}->${u.toComponentId}`;l.has(y)||(l.add(y),d.push({fromComponentId:u.fromComponentId,toComponentId:u.toComponentId,type:"structural",weight:u.weight,confidence:1}))}let h={pageUrl:window.location.href,nodes:a.map(u=>{let y=nt(u.semanticType);return{componentId:u.componentId,semanticType:y,answers:u.answers,contentHash:rt(u.componentId,y,u.answers),prominenceScore:u.prominenceScore,depthInPage:u.depth}}),edges:d};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:O({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(h)}).catch(()=>{})}catch(o){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:i,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(Z),localStorage.removeItem(ge)}catch(a){}}}}var ot="https://api.sentient-ui.com/v1/events";function st(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function it(e){var s;let t=de(e);if(!e.graph||typeof window=="undefined")return t;let n=le(),c=(s=e.ingestUrl)!=null?s:ot,i=pe({syncUrl:c.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:st()});try{let o=localStorage.getItem("_snt_graph_nodes");o&&i.restore(JSON.stringify({pageNodes:JSON.parse(o)}))}catch(o){}n.scan().then(o=>{for(let d of o.nodes)i.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)i.addStructuralEdge(d);i.syncOnce()});let a=null,r=()=>{a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,i.syncOnce()},500)};return n.observe(o=>{for(let d of o.nodes)i.addPageNode({id:d.componentId,componentId:d.componentId,semanticType:d.semanticType,answers:d.headingText?[d.headingText]:[],prominenceScore:d.prominenceScore,depth:d.depth});for(let d of o.edges)i.addStructuralEdge(d);r()}),B(O({},t),{getGraph:()=>i.snapshot(),destroy:()=>{a!==null&&clearTimeout(a),n.destroy(),i.destroy(),t.destroy()}})}0&&(module.exports={deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,init,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{c as v}from"./chunk-PXHVZ2OY.mjs";import{a as h,b,c as x,d as _,e as O,f as R,g as M}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let r=d[s],i=(p=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?p:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(d){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,d,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(d=n==null?void 0:n.textContent)==null?void 0:d.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[r,i]of e){let a=r.parentElement,o=p;for(;a;){if(e.has(a)){o=e.get(a);let m=e.get(r),g=`${o}->${m}`;!n.has(g)&&o!==m&&(n.add(g),t.push({fromComponentId:o,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(o))!=null?s:[];u.push(r),d.set(o,u)}for(let r of d.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){let o=e.get(r[i]),u=e.get(r[a]);if(o===u)continue;let m=`${o}->${u}::sib`,g=`${u}->${o}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:o,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:o,weight:.3}))}return t}function F(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=I(r,e);t.push(i),p.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),a=r.hasAttribute("data-sentient-id");if(!i&&!a)return;n.add(r);let o=I(r,e);t.push(o),p.set(r,o.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=i=>{try{let a=window.getComputedStyle(i),o=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=i.getBoundingClientRect(),g=Math.max(m.top,0),c=window.innerHeight||1,l=1/(g/c+1),f=S(o,12,48)*.4+S(l,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,f))}catch(a){return .5}};return{scan:()=>new Promise(i=>{let a=()=>{let{nodes:o,edges:u}=F(p);i({nodes:o,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(o){a()}}),observe:i=>{n=i;try{e=new MutationObserver(a=>{let o=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let c=g.hasAttribute("data-sentient-id"),l=g.hasAttribute("aria-label");if(!c&&!l)return;let f=I(g,p);o.push(f),u.set(g,f.componentId)});o.length>0&&n&&n({nodes:o,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,d=5381;for(let s=0;s<p.length;s++)d=(d<<5)+d+p.charCodeAt(s)&4294967295;return(d>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},d=s=>{var r;try{let i=JSON.parse(s);t.clear();for(let a of(r=i.pageNodes)!=null?r:[])t.set(a.componentId,a)}catch(i){}};if(typeof window!="undefined"){let s=z(C,[]);for(let r of s)t.set(r.componentId,r);try{localStorage.removeItem(A)}catch(r){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let r=`${s.fromComponentId}->${s.toComponentId}`;n.set(r,s)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let c of s){let l=(r=a.get(c.semanticType))!=null?r:[];l.push(c),a.set(c.semanticType,l)}let o=[],u=new Set;for(let c of s)for(let l of q(c.semanticType)){let f=(i=a.get(l))!=null?i:[];for(let y of f){if(y.componentId===c.componentId)continue;let E=`semantic:${c.componentId}->${y.componentId}`;u.has(E)||(u.add(E),o.push({fromComponentId:c.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(c=>c.componentId));for(let c of n.values()){if(!m.has(c.fromComponentId)||!m.has(c.toComponentId))continue;let l=`structural:${c.fromComponentId}->${c.toComponentId}`;u.has(l)||(u.add(l),o.push({fromComponentId:c.fromComponentId,toComponentId:c.toComponentId,type:"structural",weight:c.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(c=>{let l=B(c.semanticType);return{componentId:c.componentId,semanticType:l,answers:c.answers,contentHash:V(c.componentId,l,c.answers),prominenceScore:c.prominenceScore,depthInPage:c.depth}}),edges:o};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var i;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(i=e.ingestUrl)!=null?i:W,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let a=localStorage.getItem("_snt_graph_nodes");a&&d.restore(JSON.stringify({pageNodes:JSON.parse(a)}))}catch(a){}n.scan().then(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);d.syncOnce()});let s=null,r=()=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,d.syncOnce()},500)};return n.observe(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);r()}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{s!==null&&clearTimeout(s),n.destroy(),d.destroy(),t.destroy()}})}export{M as deriveSessionSegment,x as detectDeviceClass,R as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
1
+ import{c as v}from"./chunk-3H4BNU6T.mjs";import{a as h,b,c as x,d as _,e as O,f as R,g as M}from"./chunk-QCYVBCUV.mjs";var P=new Set(["SECTION","ARTICLE","MAIN","DIV"]),D="h1, h2, h3",G={scan:async()=>({nodes:[],edges:[],scannedAt:0}),observe:()=>{},getProminenceScore:()=>0,destroy:()=>{}};function S(e,t,n){return n<=t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function k(e){var t,n,p;try{let d=e;for(let s of Object.keys(d)){if(!s.startsWith("__reactFiber")&&!s.startsWith("__reactInternalInstance"))continue;let r=d[s],i=(p=(t=r==null?void 0:r.type)==null?void 0:t.displayName)!=null?p:(n=r==null?void 0:r.type)==null?void 0:n.name;if(i&&i.length>1)return i}}catch(d){}}function $(e){let t={};for(let n of Array.from(e.attributes))n.name.startsWith("data-")&&(t[n.name]=n.value);return t}function L(e){let t=e.getAttribute("data-sentient-type");if(t)return t;let n=e.getAttribute("role");return n||"generic"}function U(e){var t,n;return(n=(t=e.getAttribute("data-sentient-id"))!=null?t:e.getAttribute("id"))!=null?n:e.tagName.toLowerCase()}function j(e){let t=0,n=e.parentElement;for(;n;)t++,n=n.parentElement;return t}function I(e,t){var p,d,s;let n=e.querySelector(D);return{componentId:U(e),semanticType:L(e),ariaLabel:(p=e.getAttribute("aria-label"))!=null?p:void 0,headingText:(s=(d=n==null?void 0:n.textContent)==null?void 0:d.trim())!=null?s:void 0,isAboveFold:e.getBoundingClientRect().top<window.innerHeight,prominenceScore:t(e),depth:j(e),reactComponentName:k(e),dataAttributes:$(e)}}function w(e){var s;let t=[],n=new Set,p="__root__",d=new Map;for(let[r,i]of e){let a=r.parentElement,o=p;for(;a;){if(e.has(a)){o=e.get(a);let m=e.get(r),g=`${o}->${m}`;!n.has(g)&&o!==m&&(n.add(g),t.push({fromComponentId:o,toComponentId:m,weight:.6}));break}a=a.parentElement}let u=(s=d.get(o))!=null?s:[];u.push(r),d.set(o,u)}for(let r of d.values())if(!(r.length<2))for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){let o=e.get(r[i]),u=e.get(r[a]);if(o===u)continue;let m=`${o}->${u}::sib`,g=`${u}->${o}::sib`;n.has(m)||(n.add(m),t.push({fromComponentId:o,toComponentId:u,weight:.3})),n.has(g)||(n.add(g),t.push({fromComponentId:u,toComponentId:o,weight:.3}))}return t}function F(e){let t=[],n=new Set,p=new Map;return document.querySelectorAll("[data-sentient-id]").forEach(r=>{if(r instanceof Element&&!n.has(r)){n.add(r);let i=I(r,e);t.push(i),p.set(r,i.componentId)}}),document.querySelectorAll("section, article, main, aside").forEach(r=>{if(!(r instanceof Element)||n.has(r))return;let i=r.hasAttribute("aria-label"),a=r.hasAttribute("data-sentient-id");if(!i&&!a)return;n.add(r);let o=I(r,e);t.push(o),p.set(r,o.componentId)}),{nodes:t,edges:w(p)}}function N(){if(typeof window=="undefined")return G;let e=null,t=0,n=null,p=i=>{try{let a=window.getComputedStyle(i),o=parseFloat(a.fontSize)||12,u=parseFloat(a.zIndex)||0,m=i.getBoundingClientRect(),g=Math.max(m.top,0),c=window.innerHeight||1,l=1/(g/c+1),f=S(o,12,48)*.4+S(l,0,1)*.4+S(u,0,100)*.2;return Math.max(0,Math.min(1,f))}catch(a){return .5}};return{scan:()=>new Promise(i=>{let a=()=>{let{nodes:o,edges:u}=F(p);i({nodes:o,edges:u,scannedAt:Date.now()})};try{typeof requestIdleCallback=="function"?t=requestIdleCallback(a,{timeout:100}):a()}catch(o){a()}}),observe:i=>{n=i;try{e=new MutationObserver(a=>{let o=[],u=new Map;for(let m of a)m.type==="childList"&&m.addedNodes.forEach(g=>{if(!(g instanceof Element)||!P.has(g.tagName))return;let c=g.hasAttribute("data-sentient-id"),l=g.hasAttribute("aria-label");if(!c&&!l)return;let f=I(g,p);o.push(f),u.set(g,f.componentId)});o.length>0&&n&&n({nodes:o,edges:w(u),addedAt:Date.now()})}),e.observe(document.body,{childList:!0,subtree:!0})}catch(a){}},getProminenceScore:p,destroy:()=>{if(e&&(e.disconnect(),e=null),t&&typeof cancelIdleCallback=="function")try{cancelIdleCallback(t)}catch(i){}t=0,n=null}}}var C="_snt_graph_nodes",A="_snt_graph_edges",K={pricing:["features","faq"],features:["pricing"],faq:["pricing"],social_proof:["cta"],cta:["social_proof","hero","trust"],hero:["cta"],comparison:["pricing"],trust:["cta"]};function q(e){var t;return(t=K[e])!=null?t:[]}function z(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(n){return t}}function H(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch(n){}}var J=new Set(["pricing","hero","social_proof","cta","features","faq","comparison","trust","navigation","generic"]);function B(e){return J.has(e)?e:"generic"}function V(e,t,n){let p=`${e}:${t}:${n.join(",")}`,d=5381;for(let s=0;s<p.length;s++)d=(d<<5)+d+p.charCodeAt(s)&4294967295;return(d>>>0).toString(16).padStart(8,"0")}function T(e){let t=new Map,n=new Map,p=()=>{typeof window!="undefined"&&H(C,[...t.values()])},d=s=>{var r;try{let i=JSON.parse(s);t.clear();for(let a of(r=i.pageNodes)!=null?r:[])t.set(a.componentId,a)}catch(i){}};if(typeof window!="undefined"){let s=z(C,[]);for(let r of s)t.set(r.componentId,r);try{localStorage.removeItem(A)}catch(r){}}return{addPageNode(s){t.set(s.componentId,s),p()},addStructuralEdge(s){let r=`${s.fromComponentId}->${s.toComponentId}`;n.set(r,s)},syncOnce(){var r,i;if(!(e!=null&&e.syncUrl)||typeof window=="undefined")return;let s=[...t.values()];if(s.length!==0)try{let a=new Map;for(let c of s){let l=(r=a.get(c.semanticType))!=null?r:[];l.push(c),a.set(c.semanticType,l)}let o=[],u=new Set;for(let c of s)for(let l of q(c.semanticType)){let f=(i=a.get(l))!=null?i:[];for(let y of f){if(y.componentId===c.componentId)continue;let E=`semantic:${c.componentId}->${y.componentId}`;u.has(E)||(u.add(E),o.push({fromComponentId:c.componentId,toComponentId:y.componentId,type:"semantic",weight:.4,confidence:.9}))}}let m=new Set(s.map(c=>c.componentId));for(let c of n.values()){if(!m.has(c.fromComponentId)||!m.has(c.toComponentId))continue;let l=`structural:${c.fromComponentId}->${c.toComponentId}`;u.has(l)||(u.add(l),o.push({fromComponentId:c.fromComponentId,toComponentId:c.toComponentId,type:"structural",weight:c.weight,confidence:1}))}let g={pageUrl:window.location.href,nodes:s.map(c=>{let l=B(c.semanticType);return{componentId:c.componentId,semanticType:l,answers:c.answers,contentHash:V(c.componentId,l,c.answers),prominenceScore:c.prominenceScore,depthInPage:c.depth}}),edges:o};fetch(e.syncUrl,{method:"POST",keepalive:!0,headers:h({"Content-Type":"application/json"},e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}),body:JSON.stringify(g)}).catch(()=>{})}catch(a){}},snapshot(){return{pageNodes:[...t.values()],capturedAt:Date.now()}},serialize(){return JSON.stringify({pageNodes:[...t.values()]})},restore:d,destroy(){if(typeof window!="undefined")try{localStorage.removeItem(C),localStorage.removeItem(A)}catch(s){}}}}var W="https://api.sentient-ui.com/v1/events";function Y(){try{let e=document.cookie.match(/(?:^|; )_snt_uid=([^;]*)/);return e?decodeURIComponent(e[1]):void 0}catch(e){return}}function oe(e){var i;let t=v(e);if(!e.graph||typeof window=="undefined")return t;let n=N(),p=(i=e.ingestUrl)!=null?i:W,d=T({syncUrl:p.replace(/\/events\/?$/,"/graph/sync"),apiKey:e.apiKey,projectId:e.apiKey,sessionId:Y()});try{let a=localStorage.getItem("_snt_graph_nodes");a&&d.restore(JSON.stringify({pageNodes:JSON.parse(a)}))}catch(a){}n.scan().then(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);d.syncOnce()});let s=null,r=()=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,d.syncOnce()},500)};return n.observe(a=>{for(let o of a.nodes)d.addPageNode({id:o.componentId,componentId:o.componentId,semanticType:o.semanticType,answers:o.headingText?[o.headingText]:[],prominenceScore:o.prominenceScore,depth:o.depth});for(let o of a.edges)d.addStructuralEdge(o);r()}),b(h({},t),{getGraph:()=>d.snapshot(),destroy:()=>{s!==null&&clearTimeout(s),n.destroy(),d.destroy(),t.destroy()}})}export{M as deriveSessionSegment,x as detectDeviceClass,R as detectTimeOfDay,_ as detectTrafficSource,oe as init,O as referrerDomainFromReferer};
@@ -40,7 +40,7 @@ type ServerAssignments = Record<string, string>;
40
40
  * { id: 'cta', variantIds: ['cta-short', 'cta-long'] },
41
41
  * ],
42
42
  * sessionId, // read from cookies() or req.cookies
43
- * { apiKey: process.env.SENTIENT_API_KEY!, baseUrl: process.env.SENTIENT_API_URL! },
43
+ * { apiKey: process.env.NEXT_PUBLIC_SENTIENT_API_KEY!, baseUrl: 'https://api.sentient-ui.com/v1' },
44
44
  * );
45
45
  * return <AdaptiveProvider ... initialAssignments={assignments}>{children}</AdaptiveProvider>;
46
46
  * ```
@@ -40,7 +40,7 @@ type ServerAssignments = Record<string, string>;
40
40
  * { id: 'cta', variantIds: ['cta-short', 'cta-long'] },
41
41
  * ],
42
42
  * sessionId, // read from cookies() or req.cookies
43
- * { apiKey: process.env.SENTIENT_API_KEY!, baseUrl: process.env.SENTIENT_API_URL! },
43
+ * { apiKey: process.env.NEXT_PUBLIC_SENTIENT_API_KEY!, baseUrl: 'https://api.sentient-ui.com/v1' },
44
44
  * );
45
45
  * return <AdaptiveProvider ... initialAssignments={assignments}>{children}</AdaptiveProvider>;
46
46
  * ```
@@ -1 +1 @@
1
- "use strict";var m=Object.defineProperty,k=Object.defineProperties,C=Object.getOwnPropertyDescriptor,I=Object.getOwnPropertyDescriptors,M=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var v=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,O=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&v(t,r,e[r]);if(b)for(var r of b(e))_.call(e,r)&&v(t,r,e[r]);return t},P=(t,e)=>k(t,I(e));var $=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},j=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of M(e))!A.call(t,s)&&s!==r&&m(t,s,{get:()=>e[s],enumerable:!(n=C(e,s))||n.enumerable});return t};var L=t=>j(m({},"__esModule",{value:!0}),t);var B={};$(B,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>w,detectDeviceClass:()=>y,detectTimeOfDay:()=>h,detectTrafficSource:()=>p,preloadAssignments:()=>R,preloadDecisions:()=>U,readSessionCookie:()=>x,referrerDomainFromReferer:()=>S});module.exports=L(B);function y(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function p(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(s){}let n=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(n)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(n)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function w(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,c,u,o,i,d,l;let r=(c=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?c:"",n=(o=(u=e==null?void 0:e.referer)==null?void 0:u.trim())!=null?o:"",s=(i=e==null?void 0:e.now)!=null?i:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?y(r):"desktop",trafficSource:n?p(n,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(n),timeOfDay:h(s),dayOfWeek:(l=["sun","mon","tue","wed","thu","fri","sat"][s.getDay()])!=null?l:"sun"}}var D=1500;function f(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);return fetch(t,P(O({},e),{signal:n.signal})).finally(()=>clearTimeout(s))}async function R(t,e,r){var o;let n=(o=r.timeoutMs)!=null?o:D,s={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(s.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{(await f(`${r.baseUrl}/sessions`,{method:"POST",headers:s,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(i){}let c=await Promise.allSettled(t.map(async({id:i,variantIds:d})=>{let l=await f(`${r.baseUrl}/assign`,{method:"POST",headers:s,body:JSON.stringify({sessionId:e,componentId:i,variantIds:d})},n);if(!l.ok)return null;let T=await l.json();return{id:i,variantId:T.variantId}})),u={};for(let i of c)i.status==="fulfilled"&&i.value&&(u[i.value.id]=i.value.variantId);return u}function x(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function U(t,e,r){var u;let n=(u=r.timeoutMs)!=null?u:D,s={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let c=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(c)},n)}catch(o){}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(i=>({id:i})),components:t.components})},n);return o.ok?await o.json():s}catch(o){return s}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
1
+ "use strict";var m=Object.defineProperty,C=Object.defineProperties,I=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyDescriptors,j=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var w=(t,e,r)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,v=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&w(t,r,e[r]);if(b)for(var r of b(e))M.call(e,r)&&w(t,r,e[r]);return t},D=(t,e)=>C(t,$(e));var _=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},L=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of j(e))!A.call(t,i)&&i!==r&&m(t,i,{get:()=>e[i],enumerable:!(s=I(e,i))||s.enumerable});return t};var B=t=>L(m({},"__esModule",{value:!0}),t);var J={};_(J,{buildSessionUpsertPayload:()=>g,deriveSessionSegment:()=>U,detectDeviceClass:()=>p,detectTimeOfDay:()=>h,detectTrafficSource:()=>y,preloadAssignments:()=>P,preloadDecisions:()=>k,readSessionCookie:()=>R,referrerDomainFromReferer:()=>S});module.exports=B(J);function p(t){let e=t.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(e)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(e)?"mobile":"desktop"}function y(t,e){if(!t)return"direct";try{let r=new URL(t);if(e)try{if(new URL(e).host===r.host)return"direct"}catch(i){}let s=r.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(s)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(s)?"social":"referral"}catch(r){return"direct"}}function S(t){if(!t)return null;try{return new URL(t).hostname}catch(e){return null}}function h(t){let e=t.getHours();return e<6?"night":e<12?"morning":e<18?"afternoon":"evening"}function U(t){let e=g("__segment__",t);return`${e.deviceClass}:${e.trafficSource}`}function g(t,e){var a,l,c,o,n,d,u;let r=(l=(a=e==null?void 0:e.userAgent)==null?void 0:a.trim())!=null?l:"",s=(o=(c=e==null?void 0:e.referer)==null?void 0:c.trim())!=null?o:"",i=(n=e==null?void 0:e.now)!=null?n:new Date;return{sessionId:t,ephemeral:!1,utmParams:(d=e==null?void 0:e.utmParams)!=null?d:{},deviceClass:r?p(r):"desktop",trafficSource:s?y(s,e==null?void 0:e.appOrigin):"direct",referrerDomain:S(s),timeOfDay:h(i),dayOfWeek:(u=["sun","mon","tue","wed","thu","fri","sat"][i.getDay()])!=null?u:"sun"}}var O=1500;function f(t,e,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r);return fetch(t,D(v({},e),{signal:s.signal})).finally(()=>clearTimeout(i))}async function P(t,e,r){var o;let s=(o=r.timeoutMs)!=null?o:O,i={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(i.Origin=r.origin);let a=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let n=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},s);if(n.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!n.ok){let d=await n.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${n.status})`,d)}}catch(n){console.error("[SentientUI] preloadAssignments: session upsert threw",n)}let l=await Promise.allSettled(t.map(async({id:n,variantIds:d})=>{let u=await f(`${r.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:e,componentId:n,variantIds:d})},s);if(!u.ok){let T=await u.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${n}" (${u.status})`,T),null}let x=await u.json();return{id:n,variantId:x.variantId}})),c={};for(let n of l)n.status==="fulfilled"&&n.value&&(c[n.value.id]=n.value.variantId);return c}function R(t){var e,r;return(r=(e=t.get("_snt_uid"))==null?void 0:e.value)!=null?r:null}async function k(t,e,r){var c;let s=(c=r.timeoutMs)!=null?c:O,i={layoutOrder:t.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${r.apiKey}`};r.origin&&(a.Origin=r.origin);let l=g(e,{userAgent:r.userAgent,referer:r.referer,utmParams:r.utmParams,appOrigin:r.origin});try{let o=await f(`${r.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(l)},s);if(!o.ok){let n=await o.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${o.status})`,n)}}catch(o){console.error("[SentientUI] preloadDecisions: session upsert threw",o)}try{let o=await f(`${r.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:e,sections:t.sections.map(n=>({id:n})),components:t.components})},s);if(!o.ok){let n=await o.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${o.status})`,n),i}return await o.json()}catch(o){return console.error("[SentientUI] preloadDecisions: decide threw",o),i}}0&&(module.exports={buildSessionUpsertPayload,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,preloadAssignments,preloadDecisions,readSessionCookie,referrerDomainFromReferer});
@@ -1 +1 @@
1
- import{a as c,b as p,c as A,d as v,e as b,f as h,g as O,h as l}from"./chunk-QCYVBCUV.mjs";var y=1500;function d(r,t,e){let n=new AbortController,i=setTimeout(()=>n.abort(),e);return fetch(r,p(c({},t),{signal:n.signal})).finally(()=>clearTimeout(i))}async function P(r,t,e){var o;let n=(o=e.timeoutMs)!=null?o:y,i={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(i.Origin=e.origin);let a=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{(await d(`${e.baseUrl}/sessions`,{method:"POST",headers:i,body:JSON.stringify(a)},n)).status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}catch(s){}let g=await Promise.allSettled(r.map(async({id:s,variantIds:S})=>{let m=await d(`${e.baseUrl}/assign`,{method:"POST",headers:i,body:JSON.stringify({sessionId:t,componentId:s,variantIds:S})},n);if(!m.ok)return null;let f=await m.json();return{id:s,variantId:f.variantId}})),u={};for(let s of g)s.status==="fulfilled"&&s.value&&(u[s.value.id]=s.value.variantId);return u}function T(r){var t,e;return(e=(t=r.get("_snt_uid"))==null?void 0:t.value)!=null?e:null}async function R(r,t,e){var u;let n=(u=e.timeoutMs)!=null?u:y,i={layoutOrder:r.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=l(t,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{await d(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},n)}catch(o){}try{let o=await d(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:t,sections:r.sections.map(s=>({id:s})),components:r.components})},n);return o.ok?await o.json():i}catch(o){return i}}export{l as buildSessionUpsertPayload,O as deriveSessionSegment,A as detectDeviceClass,h as detectTimeOfDay,v as detectTrafficSource,P as preloadAssignments,R as preloadDecisions,T as readSessionCookie,b as referrerDomainFromReferer};
1
+ import{a as p,b as y,c as b,d as h,e as v,f as U,g as w,h as d}from"./chunk-QCYVBCUV.mjs";var S=1500;function u(n,r,e){let i=new AbortController,o=setTimeout(()=>i.abort(),e);return fetch(n,y(p({},r),{signal:i.signal})).finally(()=>clearTimeout(o))}async function O(n,r,e){var t;let i=(t=e.timeoutMs)!=null?t:S,o={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(o.Origin=e.origin);let a=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let s=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:o,body:JSON.stringify(a)},i);if(s.status===402)console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing");else if(!s.ok){let m=await s.json().catch(()=>({}));console.error(`[SentientUI] preloadAssignments: session upsert failed (${s.status})`,m)}}catch(s){console.error("[SentientUI] preloadAssignments: session upsert threw",s)}let g=await Promise.allSettled(n.map(async({id:s,variantIds:m})=>{let c=await u(`${e.baseUrl}/assign`,{method:"POST",headers:o,body:JSON.stringify({sessionId:r,componentId:s,variantIds:m})},i);if(!c.ok){let A=await c.json().catch(()=>({}));return console.error(`[SentientUI] preloadAssignments: assign failed for "${s}" (${c.status})`,A),null}let f=await c.json();return{id:s,variantId:f.variantId}})),l={};for(let s of g)s.status==="fulfilled"&&s.value&&(l[s.value.id]=s.value.variantId);return l}function P(n){var r,e;return(e=(r=n.get("_snt_uid"))==null?void 0:r.value)!=null?e:null}async function R(n,r,e){var l;let i=(l=e.timeoutMs)!=null?l:S,o={layoutOrder:n.sections,assignments:{},persona:"unknown",confidence:0},a={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`};e.origin&&(a.Origin=e.origin);let g=d(r,{userAgent:e.userAgent,referer:e.referer,utmParams:e.utmParams,appOrigin:e.origin});try{let t=await u(`${e.baseUrl}/sessions`,{method:"POST",headers:a,body:JSON.stringify(g)},i);if(!t.ok){let s=await t.json().catch(()=>({}));console.error(`[SentientUI] preloadDecisions: session upsert failed (${t.status})`,s)}}catch(t){console.error("[SentientUI] preloadDecisions: session upsert threw",t)}try{let t=await u(`${e.baseUrl}/decide`,{method:"POST",headers:a,body:JSON.stringify({sessionId:r,sections:n.sections.map(s=>({id:s})),components:n.components})},i);if(!t.ok){let s=await t.json().catch(()=>({}));return console.error(`[SentientUI] preloadDecisions: decide failed (${t.status})`,s),o}return await t.json()}catch(t){return console.error("[SentientUI] preloadDecisions: decide threw",t),o}}export{d as buildSessionUpsertPayload,w as deriveSessionSegment,b as detectDeviceClass,U as detectTimeOfDay,h as detectTrafficSource,O as preloadAssignments,R as preloadDecisions,P as readSessionCookie,v as referrerDomainFromReferer};
package/dist/index.d.cts CHANGED
@@ -194,9 +194,24 @@ type ComponentWeightEntry = {
194
194
  updatedAt: number;
195
195
  variants: WeightEntry[];
196
196
  };
197
+ type ComponentGoalOptions = {
198
+ /** Reward credited to the served variant (0–1). Defaults to 1. */
199
+ reward?: number;
200
+ /** Extra fields merged into the event payload. */
201
+ metadata?: Record<string, unknown>;
202
+ };
197
203
  type SentientClient = {
198
204
  track(event: Omit<SentientEvent, 'id' | 'sessionId' | 'timestamp' | 'timeInSession'>): void;
199
205
  goal(name: string, metadata?: Record<string, unknown>, weight?: number, stepIndex?: number): void;
206
+ /**
207
+ * Records a conversion attributed to the variant currently served for
208
+ * `componentId`, so it feeds the per-variant CVR funnel. Resolves the served
209
+ * variant from the local assignment cache — no need to pass variantId or
210
+ * projectId. No-ops if the component has not been assigned yet (render its
211
+ * `<Adaptive>`/call `assign()` first). Prefer this over bare `goal()` for
212
+ * variant experiments; `goal()` is session-level only (no component attribution).
213
+ */
214
+ componentGoal(componentId: string, goalType: string, opts?: ComponentGoalOptions): void;
200
215
  identify(userId: string): void;
201
216
  getAssignment(componentId: string, segment: string): Assignment | null;
202
217
  /** Server-side variant assignment. Caches the result locally per (component, segment). */
@@ -219,4 +234,4 @@ declare function grantConsent(apiKey?: string): void;
219
234
  */
220
235
  declare function init(config: SentientConfig): SentientClient;
221
236
 
222
- export { type AssignResult, type Assignment, type AssignmentCache, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
237
+ export { type AssignResult, type Assignment, type AssignmentCache, type ComponentGoalOptions, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
package/dist/index.d.ts CHANGED
@@ -194,9 +194,24 @@ type ComponentWeightEntry = {
194
194
  updatedAt: number;
195
195
  variants: WeightEntry[];
196
196
  };
197
+ type ComponentGoalOptions = {
198
+ /** Reward credited to the served variant (0–1). Defaults to 1. */
199
+ reward?: number;
200
+ /** Extra fields merged into the event payload. */
201
+ metadata?: Record<string, unknown>;
202
+ };
197
203
  type SentientClient = {
198
204
  track(event: Omit<SentientEvent, 'id' | 'sessionId' | 'timestamp' | 'timeInSession'>): void;
199
205
  goal(name: string, metadata?: Record<string, unknown>, weight?: number, stepIndex?: number): void;
206
+ /**
207
+ * Records a conversion attributed to the variant currently served for
208
+ * `componentId`, so it feeds the per-variant CVR funnel. Resolves the served
209
+ * variant from the local assignment cache — no need to pass variantId or
210
+ * projectId. No-ops if the component has not been assigned yet (render its
211
+ * `<Adaptive>`/call `assign()` first). Prefer this over bare `goal()` for
212
+ * variant experiments; `goal()` is session-level only (no component attribution).
213
+ */
214
+ componentGoal(componentId: string, goalType: string, opts?: ComponentGoalOptions): void;
200
215
  identify(userId: string): void;
201
216
  getAssignment(componentId: string, segment: string): Assignment | null;
202
217
  /** Server-side variant assignment. Caches the result locally per (component, segment). */
@@ -219,4 +234,4 @@ declare function grantConsent(apiKey?: string): void;
219
234
  */
220
235
  declare function init(config: SentientConfig): SentientClient;
221
236
 
222
- export { type AssignResult, type Assignment, type AssignmentCache, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
237
+ export { type AssignResult, type Assignment, type AssignmentCache, type ComponentGoalOptions, type ComponentWeightEntry, type ContentAddedEvent, type DOMScanner, type EventQueue, type EventType, type GraphClient, type GraphConfig, type GraphSnapshot, type MicroSignalEmitter, type MicroSignalType, type PageNode, type QueueConfig, type ScanResult, type ScannedNode, type SentientClient, type SentientConfig, type SentientEvent, type SessionConfig, type SessionManager, type WeightEntry, attachMicroSignalDetectors, grantConsent, init };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var G=Object.defineProperty,ce=Object.defineProperties,le=Object.getOwnPropertyDescriptor,ue=Object.getOwnPropertyDescriptors,de=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var Y=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,R=(e,t)=>{for(var n in t||(t={}))q.call(t,n)&&Y(e,n,t[n]);if(V)for(var n of V(t))ge.call(t,n)&&Y(e,n,t[n]);return e},Q=(e,t)=>ce(e,ue(t));var fe=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},me=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of de(t))!q.call(e,o)&&o!==n&&G(e,o,{get:()=>t[o],enumerable:!(i=le(t,o))||i.enumerable});return e};var pe=e=>me(G({},"__esModule",{value:!0}),e);var Pe={};fe(Pe,{attachMicroSignalDetectors:()=>ne,deriveSessionSegment:()=>te,detectDeviceClass:()=>U,detectTimeOfDay:()=>P,detectTrafficSource:()=>L,grantConsent:()=>Le,init:()=>ae,referrerDomainFromReferer:()=>M});module.exports=pe(Pe);var he="_snt_uid";var T="_snt_uid";function ye(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function Se(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function ve(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function we(e){try{return localStorage.getItem(e)}catch(t){return null}}function xe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function Ee(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function _e(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function be(e){try{sessionStorage.removeItem(e)}catch(t){}}function ke(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ie(e){try{localStorage.removeItem(e)}catch(t){}}function Ce(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var Te={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function X(e){var g,f,m,y,S,v;if(typeof window=="undefined")return Te;let t=(g=e==null?void 0:e.cookieName)!=null?g:he,i=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,o=(v=(S=(y=(m=Se(t))!=null?m:we(T))!=null?y:Ee(T))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:ye();ve(t,o,i);let c=xe(T,o),a=ke(t),s=c?!1:_e(T,o),r=!c&&!a&&!s;return{getSessionId:()=>o,isEphemeral:()=>r,destroy:()=>{o=null,Ce(t),Ie(T),be(T)}}}var De={push:()=>{},flush:()=>{},destroy:()=>{}};function Ae(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let i=JSON.parse(n);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(n){return[]}}function j(e,t,n){try{let o=[...(()=>{try{let c=localStorage.getItem(n);if(!c)return[];let a=JSON.parse(c);return Array.isArray(a)?a:[]}catch(c){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(o))}catch(i){}}function Z(e){var I,b,A;if(typeof window=="undefined")return De;let t=(I=e.flushIntervalMs)!=null?I:5e3,n=(b=e.maxBatchSize)!=null?b:20,i=(A=e.maxRetrySize)!=null?A:100,o=e.ingestUrl,c=e.apiKey,a=`_snt_retry_${c.slice(0,12)}`,s=[],r=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!r.has(p)&&(r.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&r.delete(p)}},m=new Set,y=l=>{r.has(l.id)||m.has(l.id)||(m.add(l.id),s.push(l))},S=Ae(i,a);for(let l of S)y(l);let v=0,E=0,K=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(k=>k.id),x;try{x=fetch(o,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${c}`}})}catch(k){j(l,i,a);for(let J of w)m.delete(J);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6));return}let O=k=>{if(k.ok||k.status>=400&&k.status<500&&k.status!==429){f(w),E=0,v=0;return}j(l,i,a);for(let J of w)m.delete(J);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6))};x instanceof Promise?x.then(O).catch(()=>{j(l,i,a);for(let k of w)m.delete(k);E++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(E,6))}):O(x)},D=typeof TextEncoder!="undefined"?new TextEncoder:null,W=l=>D?D.encode(l).length:l.length,B=l=>{let p=[],w=2;for(let x of l){let O=W(JSON.stringify(x))+1;if(p.length>0&&w+O>57344||p.length>=n)break;p.push(x),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;s.length>0;){let l=s.filter(w=>!r.has(w.id));if(s.length=0,l.length===0)break;let p=B(l);if(p.length===0)break;p.length<l.length&&s.push(...l.slice(p.length)),K(p)}}catch(l){}},u=!0,d=null;d=setInterval(()=>{u&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},C=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",C),{push(l){y(l),s.length>=n&&_()},flush:_,destroy(){u=!1,d!==null&&(clearInterval(d),d=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",C),_()}}}var z="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Oe(e,t){return`${z}${e}_${t}`}function H(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(z)&&e.push(n)}return e}catch(e){return[]}}function ee(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of H())try{let c=localStorage.getItem(o);if(!c)continue;let a=JSON.parse(c);if(n(a)){localStorage.removeItem(o);continue}let s=o.slice(z.length),r=s.lastIndexOf("_");if(r<0)continue;let g=s.slice(0,r),f=s.slice(r+1);t.set(F(g,f),a)}catch(c){}})(),{get(o,c){let a=t.get(F(o,c));return a?n(a)?(t.delete(F(o,c)),null):a:null},set(o,c,a){let s=F(o,c);t.set(s,a);try{localStorage.setItem(Oe(o,c),JSON.stringify(a))}catch(r){}},invalidate(o){let c=`${o}:`;for(let a of[...t.keys()])a.startsWith(c)&&t.delete(a);for(let a of H()){let s=a.slice(z.length),r=s.lastIndexOf("_");if(r<0)continue;if(s.slice(0,r)===o)try{localStorage.removeItem(a)}catch(f){}}},clear(){t.clear();for(let o of H())try{localStorage.removeItem(o)}catch(c){}}}}function U(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function L(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(o){}let i=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(i)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(i)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function te(e){let t=Re("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Re(e,t){var c,a,s,r,g,f,m;let n=(a=(c=t==null?void 0:t.userAgent)==null?void 0:c.trim())!=null?a:"",i=(r=(s=t==null?void 0:t.referer)==null?void 0:s.trim())!=null?r:"",o=(g=t==null?void 0:t.now)!=null?g:new Date;return{sessionId:e,ephemeral:!1,utmParams:(f=t==null?void 0:t.utmParams)!=null?f:{},deviceClass:n?U(n):"desktop",trafficSource:i?L(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(i),timeOfDay:P(o),dayOfWeek:(m=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?m:"sun"}}function ne(e,t,n){var o;let i=[];{let s=!1,r=[],g=()=>{if(s)return;let f=Date.now();for(r.push(f);r.length>0&&f-r[0]>500;)r.shift();r.length>=3&&(s=!0,e("rage_click"))};t.addEventListener("click",g),i.push(()=>t.removeEventListener("click",g))}{let c=!1,a=s=>{if(c||!(s.target instanceof Node)||!t.contains(s.target)&&t!==s.target)return;c=!0;let r=typeof window!="undefined"?window.getSelection():null,g=r?r.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",a),i.push(()=>document.removeEventListener("copy",a))}{let c=!1,a=!1,s=null,r=()=>{s!==null&&(clearTimeout(s),s=null)},g=()=>{c||!a||(r(),s=setTimeout(()=>{!c&&a&&(c=!0,e("scroll_hesitation"))},3e3))},f=()=>{r(),g()},m=S=>{for(let v of S)a=v.intersectionRatio>.3,a?g():r()};typeof process!="undefined"&&((o=process.env)==null?void 0:o.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),i.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),r()})}{let c=!1,a=n!=null?n:Date.now(),s=()=>{if(c||document.visibilityState!=="hidden")return;let r=Date.now()-a;r<15e3&&(c=!0,e("tab_loss",{timeOnPage:r}))};document.addEventListener("visibilitychange",s),i.push(()=>document.removeEventListener("visibilitychange",s))}return()=>{for(let c of i)c()}}var se="https://api.sentient-ui.com/v1/events",$=new Map,ie=null;function re(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var N={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Ue(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,i]of t)n.startsWith("utm_")&&(e[n]=i);return e}catch(e){return{}}}function oe(e){return e.replace(/\/events\/?$/,"")}function Le(e){if(typeof window=="undefined")return;let t=e!=null?e:ie;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let n=$.get(t);if(!n){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:o}=n;if(!o)return;let c=ae(Q(R({},i),{consent:!0}));o(c),$.set(t,{config:Q(R({},i),{consent:!0}),upgrade:null})}function Me(e){var a;let t=oe((a=e.ingestUrl)!=null?a:se),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(s,r,g){try{let f=new URLSearchParams({componentId:s});for(let S of r!=null?r:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:n});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}catch(f){return r!=null&&r[0]?{variantId:r[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},o={track:s=>i.track(s),goal:(s,r,g,f)=>i.goal(s,r,g,f),identify:s=>i.identify(s),getAssignment:(s,r)=>i.getAssignment(s,r),assign:(s,r,g,f)=>i.assign(s,r,g,f),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function c(s){i=s}return{proxy:o,setInner:c}}function ae(e){var K,D,W,B,_;if(typeof window=="undefined")return N;if(ie=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;let{proxy:u,setInner:d}=Me(e);return $.set(e.apiKey,{config:e,upgrade:d}),u}return $.set(e.apiKey,{config:e,upgrade:null}),N}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),N;let t=(K=e.ingestUrl)!=null?K:se,n=Date.now(),i=X({ssrSessionId:e.ssrSessionId}),o=ee(),c=Z({ingestUrl:t,apiKey:e.apiKey}),a=oe(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r=U((D=navigator.userAgent)!=null?D:""),g=typeof window!="undefined"?window.location.origin:void 0,f=L((W=document.referrer)!=null?W:"",g),m=(B=e.sessionSegment)!=null?B:`${r}:${f}`,y=new Map;if(e.initialAssignments)for(let[u,d]of Object.entries(e.initialAssignments))o.set(u,m,{variantId:d,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=i.getSessionId();if(v){let u=M((_=document.referrer)!=null?_:""),d=R({sessionId:v,deviceClass:r,trafficSource:f,referrerDomain:u,utmParams:Ue(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(d),headers:s}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:c});let E={goal(u,d={},h=1,C=0){let I=i.getSessionId();if(!I)return;let b=re();S.then(()=>{fetch(`${a}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:I,name:u,metadata:d,weight:h,stepIndex:C,goalId:b}),headers:s}).catch(()=>{})})},identify(u){let d=i.getSessionId();d&&S.then(()=>{fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:d,userId:u,ephemeral:i.isEphemeral()}),headers:s}).catch(()=>{})})},track(u){let d=i.getSessionId();if(!d)return;let h=Q(R({},u),{id:re(),sessionId:d,timestamp:Date.now(),timeInSession:Date.now()-n});c.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(u,d){return o.get(u,d)},async assign(u,d,h,C){let I=i.getSessionId();if(!I)return null;let b=o.get(u,m);if(b&&(d!=null&&d.length||b.content!==void 0))return{variantId:b.variantId,assignmentTtlMs:0,content:b.content};let A=y.get(u);if(A)return A;let l=(async()=>{await S;try{let p={sessionId:I,componentId:u,variantIds:d};C!==void 0?p.agentDataByVariant=C:h!==void 0&&(p.agentData=h);let w=await fetch(`${a}/assign`,{method:"POST",body:JSON.stringify(p),headers:s});if(!w.ok)return null;let x=await w.json();return o.set(u,m,{variantId:x.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:x.content}),x}catch(p){return null}finally{y.delete(u)}})();return y.set(u,l),l},async fetchWeights(){var u;try{let d=await fetch(`${a}/weights`,{headers:s});return d.ok?(u=(await d.json()).components)!=null?u:[]:[]}catch(d){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){c.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if($.set(e.apiKey,{config:e,upgrade:null}),e.debug){let u=window;u.__sentient&&(u.__sentient.client=E)}return E}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
1
+ "use strict";var B=Object.defineProperty,le=Object.defineProperties,de=Object.getOwnPropertyDescriptor,ue=Object.getOwnPropertyDescriptors,ge=Object.getOwnPropertyNames,Y=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var q=(e,t,n)=>t in e?B(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,D=(e,t)=>{for(var n in t||(t={}))X.call(t,n)&&q(e,n,t[n]);if(Y)for(var n of Y(t))fe.call(t,n)&&q(e,n,t[n]);return e},Q=(e,t)=>le(e,ue(t));var me=(e,t)=>{for(var n in t)B(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ge(t))!X.call(e,o)&&o!==n&&B(e,o,{get:()=>t[o],enumerable:!(i=de(t,o))||i.enumerable});return e};var he=e=>pe(B({},"__esModule",{value:!0}),e);var Ne={};me(Ne,{attachMicroSignalDetectors:()=>ie,deriveSessionSegment:()=>re,detectDeviceClass:()=>U,detectTimeOfDay:()=>P,detectTrafficSource:()=>L,grantConsent:()=>Me,init:()=>ce,referrerDomainFromReferer:()=>M});module.exports=he(Ne);var ye="_snt_uid";var A="_snt_uid";function Se(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function ve(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function we(e,t,n){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${n}; SameSite=strict; path=/`}catch(i){}}function Ee(e){try{return localStorage.getItem(e)}catch(t){return null}}function xe(e,t){try{return localStorage.setItem(e,t),!0}catch(n){return!1}}function be(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function Ie(e,t){try{return sessionStorage.setItem(e,t),!0}catch(n){return!1}}function _e(e){try{sessionStorage.removeItem(e)}catch(t){}}function ke(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function Ce(e){try{localStorage.removeItem(e)}catch(t){}}function Te(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var De={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function Z(e){var g,m,f,S,y,v;if(typeof window=="undefined")return De;let t=(g=e==null?void 0:e.cookieName)!=null?g:ye,i=((m=e==null?void 0:e.cookieTTLDays)!=null?m:365)*24*60*60,o=(v=(y=(S=(f=ve(t))!=null?f:Ee(A))!=null?S:be(A))!=null?y:e==null?void 0:e.ssrSessionId)!=null?v:Se();we(t,o,i);let c=xe(A,o),a=ke(t),r=c?!1:Ie(A,o),s=!c&&!a&&!r;return{getSessionId:()=>o,isEphemeral:()=>s,destroy:()=>{o=null,Te(t),Ce(A),_e(A)}}}var Ae={push:()=>{},flush:()=>{},destroy:()=>{}};function Oe(e,t){try{let n=localStorage.getItem(t);if(!n)return[];let i=JSON.parse(n);return Array.isArray(i)?(localStorage.removeItem(t),i.slice(-e)):[]}catch(n){return[]}}function z(e,t,n){try{let o=[...(()=>{try{let c=localStorage.getItem(n);if(!c)return[];let a=JSON.parse(c);return Array.isArray(a)?a:[]}catch(c){return[]}})(),...e].slice(-t);localStorage.setItem(n,JSON.stringify(o))}catch(i){}}function ee(e){var x,w,T;if(typeof window=="undefined")return Ae;let t=(x=e.flushIntervalMs)!=null?x:5e3,n=(w=e.maxBatchSize)!=null?w:20,i=(T=e.maxRetrySize)!=null?T:100,o=e.ingestUrl,c=e.apiKey,a=`_snt_retry_${c.slice(0,12)}`,r=[],s=new Set,g=[],m=l=>{for(let p of l)f.delete(p),!s.has(p)&&(s.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&s.delete(p)}},f=new Set,S=l=>{s.has(l.id)||f.has(l.id)||(f.add(l.id),r.push(l))},y=Oe(i,a);for(let l of y)S(l);let v=0,I=0,K=l=>{if(l.length===0)return;let p=JSON.stringify(l),E=l.map(C=>C.id),b;try{b=fetch(o,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${c}`}})}catch(C){z(l,i,a);for(let j of E)f.delete(j);I++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(I,6));return}let R=C=>{if(C.ok||C.status>=400&&C.status<500&&C.status!==429){m(E),I=0,v=0;return}z(l,i,a);for(let j of E)f.delete(j);I++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(I,6))};b instanceof Promise?b.then(R).catch(()=>{z(l,i,a);for(let C of E)f.delete(C);I++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(I,6))}):R(b)},O=typeof TextEncoder!="undefined"?new TextEncoder:null,G=l=>O?O.encode(l).length:l.length,W=l=>{let p=[],E=2;for(let b of l){let R=G(JSON.stringify(b))+1;if(p.length>0&&E+R>57344||p.length>=n)break;p.push(b),E+=R}return p},k=()=>{try{if(Date.now()<v)return;for(;r.length>0;){let l=r.filter(E=>!s.has(E.id));if(r.length=0,l.length===0)break;let p=W(l);if(p.length===0)break;p.length<l.length&&r.push(...l.slice(p.length)),K(p)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&k()},t);let h=()=>{document.visibilityState==="hidden"&&k()},_=()=>{k()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",_),{push(l){S(l),r.length>=n&&k()},flush:k,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",_),k()}}}var H="_snt_asgn_";function F(e,t){return`${e}:${t}`}function Re(e,t){return`${H}${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function te(e){let t=e.slice(H.length),n=t.indexOf(":");if(n<0)return null;try{return{componentId:decodeURIComponent(t.slice(0,n)),segment:decodeURIComponent(t.slice(n+1))}}catch(i){return null}}function J(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n!=null&&n.startsWith(H)&&e.push(n)}return e}catch(e){return[]}}function ne(e=18e5){let t=new Map,n=o=>o.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let o of J())try{let c=localStorage.getItem(o);if(!c)continue;let a=JSON.parse(c);if(n(a)){localStorage.removeItem(o);continue}let r=te(o);if(!r)continue;t.set(F(r.componentId,r.segment),a)}catch(c){}})(),{get(o,c){let a=t.get(F(o,c));return a?n(a)?(t.delete(F(o,c)),null):a:null},set(o,c,a){let r=F(o,c);t.set(r,a);try{localStorage.setItem(Re(o,c),JSON.stringify(a))}catch(s){}},invalidate(o){let c=`${o}:`;for(let a of[...t.keys()])a.startsWith(c)&&t.delete(a);for(let a of J()){let r=te(a);if((r==null?void 0:r.componentId)===o)try{localStorage.removeItem(a)}catch(s){}}},clear(){t.clear();for(let o of J())try{localStorage.removeItem(o)}catch(c){}}}}function U(e){let t=e.toLowerCase();return/ipad|tablet|playbook|kindle|silk/.test(t)?"tablet":/mobi|iphone|ipod|android.*mobile|phone/.test(t)?"mobile":"desktop"}function L(e,t){if(!e)return"direct";try{let n=new URL(e);if(t)try{if(new URL(t).host===n.host)return"direct"}catch(o){}let i=n.hostname.toLowerCase();return/(^|\.)(google|bing|duckduckgo|yahoo)\./.test(i)?"search":/(^|\.)(twitter|x\.com|facebook|linkedin|reddit|t\.co)/.test(i)?"social":"referral"}catch(n){return"direct"}}function M(e){if(!e)return null;try{return new URL(e).hostname}catch(t){return null}}function P(e){let t=e.getHours();return t<6?"night":t<12?"morning":t<18?"afternoon":"evening"}function re(e){let t=Ue("__segment__",e);return`${t.deviceClass}:${t.trafficSource}`}function Ue(e,t){var c,a,r,s,g,m,f;let n=(a=(c=t==null?void 0:t.userAgent)==null?void 0:c.trim())!=null?a:"",i=(s=(r=t==null?void 0:t.referer)==null?void 0:r.trim())!=null?s:"",o=(g=t==null?void 0:t.now)!=null?g:new Date;return{sessionId:e,ephemeral:!1,utmParams:(m=t==null?void 0:t.utmParams)!=null?m:{},deviceClass:n?U(n):"desktop",trafficSource:i?L(i,t==null?void 0:t.appOrigin):"direct",referrerDomain:M(i),timeOfDay:P(o),dayOfWeek:(f=["sun","mon","tue","wed","thu","fri","sat"][o.getDay()])!=null?f:"sun"}}function ie(e,t,n){var o;let i=[];{let r=!1,s=[],g=()=>{if(r)return;let m=Date.now();for(s.push(m);s.length>0&&m-s[0]>500;)s.shift();s.length>=3&&(r=!0,e("rage_click"))};t.addEventListener("click",g),i.push(()=>t.removeEventListener("click",g))}{let c=!1,a=r=>{if(c||!(r.target instanceof Node)||!t.contains(r.target)&&t!==r.target)return;c=!0;let s=typeof window!="undefined"?window.getSelection():null,g=s?s.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",a),i.push(()=>document.removeEventListener("copy",a))}{let c=!1,a=!1,r=null,s=()=>{r!==null&&(clearTimeout(r),r=null)},g=()=>{c||!a||(s(),r=setTimeout(()=>{!c&&a&&(c=!0,e("scroll_hesitation"))},3e3))},m=()=>{s(),g()},f=y=>{for(let v of y)a=v.intersectionRatio>.3,a?g():s()};typeof process!="undefined"&&((o=process.env)==null?void 0:o.NODE_ENV)!=="production"&&(window.__lastIOCallback=f);let S=new IntersectionObserver(f,{threshold:[.3]});S.observe(t),window.addEventListener("scroll",m,{passive:!0}),i.push(()=>{S.disconnect(),window.removeEventListener("scroll",m),s()})}{let c=!1,a=n!=null?n:Date.now(),r=()=>{if(c||document.visibilityState!=="hidden")return;let s=Date.now()-a;s<15e3&&(c=!0,e("tab_loss",{timeOnPage:s}))};document.addEventListener("visibilitychange",r),i.push(()=>document.removeEventListener("visibilitychange",r))}return()=>{for(let c of i)c()}}var se="https://api.sentient-ui.com/v1/events",$=new Map,oe=null;function V(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var N={track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Le(){try{let e={},t=new URLSearchParams(window.location.search);for(let[n,i]of t)n.startsWith("utm_")&&(e[n]=i);return e}catch(e){return{}}}function ae(e){return e.replace(/\/events\/?$/,"")}function Me(e){if(typeof window=="undefined")return;let t=e!=null?e:oe;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let n=$.get(t);if(!n){console.warn("[sentient] grantConsent() called before init()");return}let{config:i,upgrade:o}=n;if(!o)return;let c=ce(Q(D({},i),{consent:!0}));o(c),$.set(t,{config:Q(D({},i),{consent:!0}),upgrade:null})}function Pe(e){var a;let t=ae((a=e.ingestUrl)!=null?a:se),n={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},i={track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(r,s,g){try{let m=new URLSearchParams({componentId:r});for(let y of s!=null?s:[])m.append("variantIds[]",y);let f=await fetch(`${t}/winner?${m.toString()}`,{headers:n});return f.ok?{variantId:(await f.json()).variantId,assignmentTtlMs:0}:s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}catch(m){return s!=null&&s[0]?{variantId:s[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},o={track:r=>i.track(r),goal:(r,s,g,m)=>i.goal(r,s,g,m),componentGoal:(r,s,g)=>i.componentGoal(r,s,g),identify:r=>i.identify(r),getAssignment:(r,s)=>i.getAssignment(r,s),assign:(r,s,g,m)=>i.assign(r,s,g,m),fetchWeights:()=>i.fetchWeights(),getGraph:()=>i.getGraph(),destroy:()=>i.destroy()};function c(r){i=r}return{proxy:o,setInner:c}}function ce(e){var K,O,G,W,k;if(typeof window=="undefined")return N;if(oe=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;let{proxy:d,setInner:u}=Pe(e);return $.set(e.apiKey,{config:e,upgrade:u}),d}return $.set(e.apiKey,{config:e,upgrade:null}),N}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),N;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),N;let t=(K=e.ingestUrl)!=null?K:se,n=Date.now(),i=Z({ssrSessionId:e.ssrSessionId}),o=ne(),c=ee({ingestUrl:t,apiKey:e.apiKey}),a=ae(t),r={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},s=U((O=navigator.userAgent)!=null?O:""),g=typeof window!="undefined"?window.location.origin:void 0,m=L((G=document.referrer)!=null?G:"",g),f=(W=e.sessionSegment)!=null?W:`${s}:${m}`,S=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))o.set(d,f,{variantId:u,assignedAt:Date.now(),segment:f,confidence:1});let y=Promise.resolve(),v=i.getSessionId();if(v){let d=M((k=document.referrer)!=null?k:""),u=D({sessionId:v,deviceClass:s,trafficSource:m,referrerDomain:d,utmParams:Le(),timeOfDay:P(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:i.isEphemeral()},e.userId?{userId:e.userId}:{});try{y=fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:r}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:c});let I={goal(d,u={},h=1,_=0){let x=i.getSessionId();if(!x)return;let w=V();y.then(()=>{fetch(`${a}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:x,name:d,metadata:u,weight:h,stepIndex:_,goalId:w}),headers:r}).catch(()=>{})})},componentGoal(d,u,h){var T,l;let _=i.getSessionId();if(!_)return;let x=o.get(d,f);if(!x){e.debug&&console.warn(`[sentient] componentGoal("${d}"): no assignment yet \u2014 render its <Adaptive> or call assign() before recording a goal.`);return}let w={id:V(),sessionId:_,projectId:e.apiKey,componentId:d,variantId:x.variantId,eventType:"goal_achieved",goalType:u,payload:D({reward:(T=h==null?void 0:h.reward)!=null?T:1},(l=h==null?void 0:h.metadata)!=null?l:{}),timestamp:Date.now(),timeInSession:Date.now()-n};e.debug&&console.log("[sentient] componentGoal",w),y.then(()=>c.push(w))},identify(d){let u=i.getSessionId();u&&y.then(()=>{fetch(`${a}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:i.isEphemeral()}),headers:r}).catch(()=>{})})},track(d){let u=i.getSessionId();if(!u)return;let h=Q(D({},d),{id:V(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-n});e.debug&&console.log("[sentient] track",h),y.then(()=>c.push(h))},getAssignment(d,u){return o.get(d,u)},async assign(d,u,h,_){let x=i.getSessionId();if(!x)return null;let w=o.get(d,f);if(w&&(u!=null&&u.length||w.content!==void 0))return{variantId:w.variantId,assignmentTtlMs:0,content:w.content};let T=S.get(d);if(T)return T;let l=(async()=>{await y;try{let p={sessionId:x,componentId:d,variantIds:u};_!==void 0?p.agentDataByVariant=_:h!==void 0&&(p.agentData=h);let E=await fetch(`${a}/assign`,{method:"POST",body:JSON.stringify(p),headers:r});if(!E.ok)return null;let b=await E.json();return o.set(d,f,{variantId:b.variantId,assignedAt:Date.now(),segment:f,confidence:1,content:b.content}),b}catch(p){return null}finally{S.delete(d)}})();return S.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${a}/weights`,{headers:r});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){c.destroy(),i.destroy(),e.debug&&console.log("[sentient] destroyed")}};if($.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=I)}return I}0&&(module.exports={attachMicroSignalDetectors,deriveSessionSegment,detectDeviceClass,detectTimeOfDay,detectTrafficSource,grantConsent,init,referrerDomainFromReferer});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as f,b as g,c as h}from"./chunk-PXHVZ2OY.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
1
+ import{a as f,b as g,c as h}from"./chunk-3H4BNU6T.mjs";import{c as a,d as b,e as c,f as d,g as e}from"./chunk-QCYVBCUV.mjs";export{f as attachMicroSignalDetectors,e as deriveSessionSegment,a as detectDeviceClass,d as detectTimeOfDay,b as detectTrafficSource,g as grantConsent,h as init,c as referrerDomainFromReferer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentientui/core",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,13 +26,6 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "scripts": {
30
- "build": "tsup",
31
- "test": "vitest run",
32
- "typecheck": "tsc --noEmit",
33
- "size-check": "tsx scripts/size-check.ts",
34
- "lint": "eslint src"
35
- },
36
29
  "devDependencies": {
37
30
  "@types/node": "^22.10.2",
38
31
  "jsdom": "^25.0.1",
@@ -40,5 +33,12 @@
40
33
  "tsx": "^4.19.2",
41
34
  "typescript": "^5.7.2",
42
35
  "vitest": "^2.1.8"
36
+ },
37
+ "scripts": {
38
+ "build": "tsup",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit",
41
+ "size-check": "tsx scripts/size-check.ts",
42
+ "lint": "eslint src"
43
43
  }
44
- }
44
+ }
@@ -1 +0,0 @@
1
- import{a as R,b as K,c as G,d as Q,e as F,f as z}from"./chunk-QCYVBCUV.mjs";var te="_snt_uid";var C="_snt_uid";function ne(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(t){}let e=()=>Math.floor(Math.random()*4294967295).toString(16).padStart(8,"0");return`${e()}-${e()}-${e()}-${e()}`}function se(e){try{let t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):null}catch(t){return null}}function ie(e,t,c){try{document.cookie=`${e}=${encodeURIComponent(t)}; max-age=${c}; SameSite=strict; path=/`}catch(r){}}function re(e){try{return localStorage.getItem(e)}catch(t){return null}}function oe(e,t){try{return localStorage.setItem(e,t),!0}catch(c){return!1}}function ae(e){try{return sessionStorage.getItem(e)}catch(t){return null}}function ce(e,t){try{return sessionStorage.setItem(e,t),!0}catch(c){return!1}}function le(e){try{sessionStorage.removeItem(e)}catch(t){}}function de(e){try{return document.cookie=`${e}_probe=1; max-age=1; SameSite=strict; path=/`,/(?:^|; )_snt_uid_probe=1/.test(document.cookie)||document.cookie.indexOf(`${e}_probe=1`)!==-1}catch(t){return!1}}function ue(e){try{localStorage.removeItem(e)}catch(t){}}function ge(e){try{document.cookie=`${e}=; max-age=0; SameSite=strict; path=/`}catch(t){}}var fe={getSessionId:()=>null,isEphemeral:()=>!1,destroy:()=>{}};function H(e){var g,f,m,y,S,v;if(typeof window=="undefined")return fe;let t=(g=e==null?void 0:e.cookieName)!=null?g:te,r=((f=e==null?void 0:e.cookieTTLDays)!=null?f:365)*24*60*60,a=(v=(S=(y=(m=se(t))!=null?m:re(C))!=null?y:ae(C))!=null?S:e==null?void 0:e.ssrSessionId)!=null?v:ne();ie(t,a,r);let o=oe(C,a),i=de(t),s=o?!1:ce(C,a),n=!o&&!i&&!s;return{getSessionId:()=>a,isEphemeral:()=>n,destroy:()=>{a=null,ge(t),ue(C),le(C)}}}var pe={push:()=>{},flush:()=>{},destroy:()=>{}};function me(e,t){try{let c=localStorage.getItem(t);if(!c)return[];let r=JSON.parse(c);return Array.isArray(r)?(localStorage.removeItem(t),r.slice(-e)):[]}catch(c){return[]}}function J(e,t,c){try{let a=[...(()=>{try{let o=localStorage.getItem(c);if(!o)return[];let i=JSON.parse(o);return Array.isArray(i)?i:[]}catch(o){return[]}})(),...e].slice(-t);localStorage.setItem(c,JSON.stringify(a))}catch(r){}}function V(e){var k,I,D;if(typeof window=="undefined")return pe;let t=(k=e.flushIntervalMs)!=null?k:5e3,c=(I=e.maxBatchSize)!=null?I:20,r=(D=e.maxRetrySize)!=null?D:100,a=e.ingestUrl,o=e.apiKey,i=`_snt_retry_${o.slice(0,12)}`,s=[],n=new Set,g=[],f=l=>{for(let p of l)m.delete(p),!n.has(p)&&(n.add(p),g.push(p));for(;g.length>500;){let p=g.shift();p&&n.delete(p)}},m=new Set,y=l=>{n.has(l.id)||m.has(l.id)||(m.add(l.id),s.push(l))},S=me(r,i);for(let l of S)y(l);let v=0,x=0,L=l=>{if(l.length===0)return;let p=JSON.stringify(l),w=l.map(b=>b.id),E;try{E=fetch(a,{method:"POST",keepalive:!0,body:p,headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}})}catch(b){J(l,r,i);for(let B of w)m.delete(B);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6));return}let O=b=>{if(b.ok||b.status>=400&&b.status<500&&b.status!==429){f(w),x=0,v=0;return}J(l,r,i);for(let B of w)m.delete(B);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))};E instanceof Promise?E.then(O).catch(()=>{J(l,r,i);for(let b of w)m.delete(b);x++,v=Date.now()+Math.min(6e4,1e3*2**Math.min(x,6))}):O(E)},A=typeof TextEncoder!="undefined"?new TextEncoder:null,N=l=>A?A.encode(l).length:l.length,$=l=>{let p=[],w=2;for(let E of l){let O=N(JSON.stringify(E))+1;if(p.length>0&&w+O>57344||p.length>=c)break;p.push(E),w+=O}return p},_=()=>{try{if(Date.now()<v)return;for(;s.length>0;){let l=s.filter(w=>!n.has(w.id));if(s.length=0,l.length===0)break;let p=$(l);if(p.length===0)break;p.length<l.length&&s.push(...l.slice(p.length)),L(p)}}catch(l){}},d=!0,u=null;u=setInterval(()=>{d&&_()},t);let h=()=>{document.visibilityState==="hidden"&&_()},T=()=>{_()};return document.addEventListener("visibilitychange",h),window.addEventListener("beforeunload",T),{push(l){y(l),s.length>=c&&_()},flush:_,destroy(){d=!1,u!==null&&(clearInterval(u),u=null),document.removeEventListener("visibilitychange",h),window.removeEventListener("beforeunload",T),_()}}}var W="_snt_asgn_";function P(e,t){return`${e}:${t}`}function he(e,t){return`${W}${e}_${t}`}function j(){try{let e=[];for(let t=0;t<localStorage.length;t++){let c=localStorage.key(t);c!=null&&c.startsWith(W)&&e.push(c)}return e}catch(e){return[]}}function Y(e=18e5){let t=new Map,c=a=>a.assignedAt+e<Date.now();return typeof window!="undefined"&&(()=>{for(let a of j())try{let o=localStorage.getItem(a);if(!o)continue;let i=JSON.parse(o);if(c(i)){localStorage.removeItem(a);continue}let s=a.slice(W.length),n=s.lastIndexOf("_");if(n<0)continue;let g=s.slice(0,n),f=s.slice(n+1);t.set(P(g,f),i)}catch(o){}})(),{get(a,o){let i=t.get(P(a,o));return i?c(i)?(t.delete(P(a,o)),null):i:null},set(a,o,i){let s=P(a,o);t.set(s,i);try{localStorage.setItem(he(a,o),JSON.stringify(i))}catch(n){}},invalidate(a){let o=`${a}:`;for(let i of[...t.keys()])i.startsWith(o)&&t.delete(i);for(let i of j()){let s=i.slice(W.length),n=s.lastIndexOf("_");if(n<0)continue;if(s.slice(0,n)===a)try{localStorage.removeItem(i)}catch(f){}}},clear(){t.clear();for(let a of j())try{localStorage.removeItem(a)}catch(o){}}}}function ye(e,t,c){var a;let r=[];{let s=!1,n=[],g=()=>{if(s)return;let f=Date.now();for(n.push(f);n.length>0&&f-n[0]>500;)n.shift();n.length>=3&&(s=!0,e("rage_click"))};t.addEventListener("click",g),r.push(()=>t.removeEventListener("click",g))}{let o=!1,i=s=>{if(o||!(s.target instanceof Node)||!t.contains(s.target)&&t!==s.target)return;o=!0;let n=typeof window!="undefined"?window.getSelection():null,g=n?n.toString().length:0;e("text_copy",{selectionLength:g})};document.addEventListener("copy",i),r.push(()=>document.removeEventListener("copy",i))}{let o=!1,i=!1,s=null,n=()=>{s!==null&&(clearTimeout(s),s=null)},g=()=>{o||!i||(n(),s=setTimeout(()=>{!o&&i&&(o=!0,e("scroll_hesitation"))},3e3))},f=()=>{n(),g()},m=S=>{for(let v of S)i=v.intersectionRatio>.3,i?g():n()};typeof process!="undefined"&&((a=process.env)==null?void 0:a.NODE_ENV)!=="production"&&(window.__lastIOCallback=m);let y=new IntersectionObserver(m,{threshold:[.3]});y.observe(t),window.addEventListener("scroll",f,{passive:!0}),r.push(()=>{y.disconnect(),window.removeEventListener("scroll",f),n()})}{let o=!1,i=c!=null?c:Date.now(),s=()=>{if(o||document.visibilityState!=="hidden")return;let n=Date.now()-i;n<15e3&&(o=!0,e("tab_loss",{timeOnPage:n}))};document.addEventListener("visibilitychange",s),r.push(()=>document.removeEventListener("visibilitychange",s))}return()=>{for(let o of r)o()}}var X="https://api.sentient-ui.com/v1/events",U=new Map,Z=null;function q(){try{if(typeof crypto!="undefined"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch(e){}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var M={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,assign:()=>Promise.resolve(null),fetchWeights:()=>Promise.resolve([]),getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}};function Se(){try{let e={},t=new URLSearchParams(window.location.search);for(let[c,r]of t)c.startsWith("utm_")&&(e[c]=r);return e}catch(e){return{}}}function ee(e){return e.replace(/\/events\/?$/,"")}function De(e){if(typeof window=="undefined")return;let t=e!=null?e:Z;if(!t){console.warn("[sentient] grantConsent() called before init()");return}let c=U.get(t);if(!c){console.warn("[sentient] grantConsent() called before init()");return}let{config:r,upgrade:a}=c;if(!a)return;let o=we(K(R({},r),{consent:!0}));a(o),U.set(t,{config:K(R({},r),{consent:!0}),upgrade:null})}function ve(e){var i;let t=ee((i=e.ingestUrl)!=null?i:X),c={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},r={track:()=>{},goal:()=>{},identify:()=>{},getAssignment:()=>null,fetchWeights:()=>Promise.resolve([]),async assign(s,n,g){try{let f=new URLSearchParams({componentId:s});for(let S of n!=null?n:[])f.append("variantIds[]",S);let m=await fetch(`${t}/winner?${f.toString()}`,{headers:c});return m.ok?{variantId:(await m.json()).variantId,assignmentTtlMs:0}:n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}catch(f){return n!=null&&n[0]?{variantId:n[0],assignmentTtlMs:0}:null}},getGraph:()=>({pageNodes:[],capturedAt:0}),destroy:()=>{}},a={track:s=>r.track(s),goal:(s,n,g,f)=>r.goal(s,n,g,f),identify:s=>r.identify(s),getAssignment:(s,n)=>r.getAssignment(s,n),assign:(s,n,g,f)=>r.assign(s,n,g,f),fetchWeights:()=>r.fetchWeights(),getGraph:()=>r.getGraph(),destroy:()=>r.destroy()};function o(s){r=s}return{proxy:a,setInner:o}}function we(e){var L,A,N,$,_;if(typeof window=="undefined")return M;if(Z=e.apiKey,e.consent===!1){if(e.preConsentBehavior==="statistical_winner"){if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M;let{proxy:d,setInner:u}=ve(e);return U.set(e.apiKey,{config:e,upgrade:u}),d}return U.set(e.apiKey,{config:e,upgrade:null}),M}if(!e.apiKey||!e.apiKey.startsWith("pk_"))return console.warn("[sentient] init() called with an invalid apiKey \u2014 expected a pk_ public key. SDK disabled."),M;if(e.ingestUrl==="")return console.warn("[sentient] init() called with an empty ingestUrl. SDK disabled."),M;let t=(L=e.ingestUrl)!=null?L:X,c=Date.now(),r=H({ssrSessionId:e.ssrSessionId}),a=Y(),o=V({ingestUrl:t,apiKey:e.apiKey}),i=ee(t),s={"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},n=G((A=navigator.userAgent)!=null?A:""),g=typeof window!="undefined"?window.location.origin:void 0,f=Q((N=document.referrer)!=null?N:"",g),m=($=e.sessionSegment)!=null?$:`${n}:${f}`,y=new Map;if(e.initialAssignments)for(let[d,u]of Object.entries(e.initialAssignments))a.set(d,m,{variantId:u,assignedAt:Date.now(),segment:m,confidence:1});let S=Promise.resolve(),v=r.getSessionId();if(v){let d=F((_=document.referrer)!=null?_:""),u=R({sessionId:v,deviceClass:n,trafficSource:f,referrerDomain:d,utmParams:Se(),timeOfDay:z(new Date),dayOfWeek:["sun","mon","tue","wed","thu","fri","sat"][new Date().getDay()],ephemeral:r.isEphemeral()},e.userId?{userId:e.userId}:{});try{S=fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify(u),headers:s}).then(h=>{h.status===402&&console.warn("[SentientUI] Session limit exceeded for this project. The bandit will stop learning until the limit resets. Upgrade at sentient-ui.com/pricing")}).catch(()=>{})}catch(h){}}e.debug&&(console.log("[sentient] initialized",{context:e.context}),window.__sentient={client:null,queue:o});let x={goal(d,u={},h=1,T=0){let k=r.getSessionId();if(!k)return;let I=q();S.then(()=>{fetch(`${i}/goals`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:k,name:d,metadata:u,weight:h,stepIndex:T,goalId:I}),headers:s}).catch(()=>{})})},identify(d){let u=r.getSessionId();u&&S.then(()=>{fetch(`${i}/sessions`,{method:"POST",keepalive:!0,body:JSON.stringify({sessionId:u,userId:d,ephemeral:r.isEphemeral()}),headers:s}).catch(()=>{})})},track(d){let u=r.getSessionId();if(!u)return;let h=K(R({},d),{id:q(),sessionId:u,timestamp:Date.now(),timeInSession:Date.now()-c});o.push(h),e.debug&&console.log("[sentient] track",h)},getAssignment(d,u){return a.get(d,u)},async assign(d,u,h,T){let k=r.getSessionId();if(!k)return null;let I=a.get(d,m);if(I&&(u!=null&&u.length||I.content!==void 0))return{variantId:I.variantId,assignmentTtlMs:0,content:I.content};let D=y.get(d);if(D)return D;let l=(async()=>{await S;try{let p={sessionId:k,componentId:d,variantIds:u};T!==void 0?p.agentDataByVariant=T:h!==void 0&&(p.agentData=h);let w=await fetch(`${i}/assign`,{method:"POST",body:JSON.stringify(p),headers:s});if(!w.ok)return null;let E=await w.json();return a.set(d,m,{variantId:E.variantId,assignedAt:Date.now(),segment:m,confidence:1,content:E.content}),E}catch(p){return null}finally{y.delete(d)}})();return y.set(d,l),l},async fetchWeights(){var d;try{let u=await fetch(`${i}/weights`,{headers:s});return u.ok?(d=(await u.json()).components)!=null?d:[]:[]}catch(u){return[]}},getGraph(){return{pageNodes:[],capturedAt:0}},destroy(){o.destroy(),r.destroy(),e.debug&&console.log("[sentient] destroyed")}};if(U.set(e.apiKey,{config:e,upgrade:null}),e.debug){let d=window;d.__sentient&&(d.__sentient.client=x)}return x}export{ye as a,De as b,we as c};