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