@sentientui/react 0.15.5 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -426,17 +426,24 @@ window.__sentient_overrides = { hero_cta: 'variant_a' };
426
426
 
427
427
  Overrides bypass the bandit entirely — no events recorded, weights unchanged.
428
428
 
429
- ## Graph mode
429
+ ## Graph scanning & engagement capture (on by default)
430
430
 
431
- Pass `enableGraph` to `AdaptiveProvider` (or `AdaptiveRoot`) to turn on DOM graph scanning. The SDK captures your page structure and syncs it to power the dashboard Graph page. The graph code is loaded on demand, so apps that don't set `enableGraph` keep the lean bundle.
431
+ DOM graph scanning and behavioral engagement capture are **on by default** no props needed. The SDK:
432
+
433
+ - captures your page structure and auto-detects what each section is (pricing, hero, social proof, …) — explicit `data-sentient-type` attributes always win over the heuristic;
434
+ - records per-section attention (visible time + scroll depth), which is what powers audience profiles with zero tagging.
435
+
436
+ Both modules are loaded on demand after init, so the base bundle stays lean, and neither ever runs for a Do-Not-Track, Global Privacy Control, or consent-gated visitor (see Consent below).
437
+
438
+ Opt out per feature:
432
439
 
433
440
  ```tsx
434
- <AdaptiveProvider apiKey="pk_…" context="saas" enableGraph>
441
+ <AdaptiveProvider apiKey="pk_…" context="saas" enableGraph={false} engagement={false}>
435
442
  <App />
436
443
  </AdaptiveProvider>
437
444
  ```
438
445
 
439
- Direct `@sentientui/core` users enable the same thing by importing `init` from `@sentientui/core/graph` and passing `graph: true`.
446
+ Direct `@sentientui/core` users enable graph scanning by importing `init` from `@sentientui/core/graph` with `graph: true`, and engagement capture via `startEngagementCapture` from `@sentientui/core/engagement`.
440
447
 
441
448
  ## Consent management (GDPR)
442
449
 
package/dist/index.d.cts CHANGED
@@ -103,13 +103,19 @@ type AdaptiveProviderProps = {
103
103
  */
104
104
  localMode?: 'auto' | boolean;
105
105
  /**
106
- * Enable DOM graph scanning + page-structure sync. When `true`, the provider
106
+ * DOM graph scanning + page-structure sync. ON by default: the provider
107
107
  * dynamically loads `@sentientui/core/graph` and uses its graph-capable
108
- * `init()` for the single client, so the SDK scans your page structure and
109
- * syncs it to power the dashboard graph page. Left off (default), the lean
110
- * bundle is used and the graph entry is never loaded.
108
+ * `init()` for the single client, so the SDK scans your page structure,
109
+ * auto-detects semantic sections, and syncs them to power personas and the
110
+ * dashboard graph page. Pass `false` to keep the lean bundle only.
111
111
  */
112
112
  enableGraph?: boolean;
113
+ /**
114
+ * Behavioral engagement capture (per-section dwell/scroll + semantic section
115
+ * registration) powering personas. ON by default — pass `false` to disable.
116
+ * Never runs for a DNT/GPC or consent-gated visitor (no client → no capture).
117
+ */
118
+ engagement?: boolean;
113
119
  children: ReactNode;
114
120
  };
115
121
  /**
package/dist/index.d.ts CHANGED
@@ -103,13 +103,19 @@ type AdaptiveProviderProps = {
103
103
  */
104
104
  localMode?: 'auto' | boolean;
105
105
  /**
106
- * Enable DOM graph scanning + page-structure sync. When `true`, the provider
106
+ * DOM graph scanning + page-structure sync. ON by default: the provider
107
107
  * dynamically loads `@sentientui/core/graph` and uses its graph-capable
108
- * `init()` for the single client, so the SDK scans your page structure and
109
- * syncs it to power the dashboard graph page. Left off (default), the lean
110
- * bundle is used and the graph entry is never loaded.
108
+ * `init()` for the single client, so the SDK scans your page structure,
109
+ * auto-detects semantic sections, and syncs them to power personas and the
110
+ * dashboard graph page. Pass `false` to keep the lean bundle only.
111
111
  */
112
112
  enableGraph?: boolean;
113
+ /**
114
+ * Behavioral engagement capture (per-section dwell/scroll + semantic section
115
+ * registration) powering personas. ON by default — pass `false` to disable.
116
+ * Never runs for a DNT/GPC or consent-gated visitor (no client → no capture).
117
+ */
118
+ engagement?: boolean;
113
119
  children: ReactNode;
114
120
  };
115
121
  /**
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- "use strict";var lt=Object.create;var H=Object.defineProperty,ct=Object.defineProperties,ut=Object.getOwnPropertyDescriptor,dt=Object.getOwnPropertyDescriptors,ft=Object.getOwnPropertyNames,me=Object.getOwnPropertySymbols,gt=Object.getPrototypeOf,ye=Object.prototype.hasOwnProperty,pt=Object.prototype.propertyIsEnumerable;var ve=(e,t,n)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,E=(e,t)=>{for(var n in t||(t={}))ye.call(t,n)&&ve(e,n,t[n]);if(me)for(var n of me(t))pt.call(t,n)&&ve(e,n,t[n]);return e},J=(e,t)=>ct(e,dt(t));var mt=(e,t)=>{for(var n in t)H(e,n,{get:t[n],enumerable:!0})},Se=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ft(t))!ye.call(e,i)&&i!==n&&H(e,i,{get:()=>t[i],enumerable:!(o=ut(t,i))||o.enumerable});return e};var vt=(e,t,n)=>(n=e!=null?lt(gt(e)):{},Se(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e)),yt=e=>Se(H({},"__esModule",{value:!0}),e);var Ot={};mt(Ot,{Adaptive:()=>Me,AdaptiveGroup:()=>Ye,AdaptiveProvider:()=>Re,AdaptiveText:()=>Fe,SentientPersonaScript:()=>Ve,buildAgentFeed:()=>nt,defineAgentContent:()=>tt,detectSegment:()=>ce.deriveSessionSegment,getAgentContent:()=>ue,getWeights:()=>Y,renderAgentJsonLd:()=>it,renderAgentJsonLdBody:()=>de,renderAgentMarkdown:()=>rt,subscribeWeights:()=>q,updateWeights:()=>Q,useAdaptive:()=>Qe,useAdaptiveApiBaseUrl:()=>Le,useAdaptiveGoal:()=>Ke,useAdaptiveTokens:()=>ze,useAssignment:()=>$,useInitialAssignments:()=>ne,useLayoutOrder:()=>Ee,useSentient:()=>k});module.exports=yt(Ot);var w=require("react"),N=require("@sentientui/core");var he=new Map,X=new Map;function q(e,t){let n=X.get(e);return n||(n=new Set,X.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&X.delete(e)}}function Q(e,t){he.set(e,t);let n=X.get(e);if(n)for(let o of n)try{o(t)}catch(i){}}function Y(e){var t;return(t=he.get(e))!=null?t:null}var St={on:!1,listeners:new Set};function we(){if(typeof window=="undefined")return St;let e=window;return e.__sentient_preview||(e.__sentient_preview={on:!1,listeners:new Set}),e.__sentient_preview}function ae(){return we().on}function be(e){let t=we().listeners;return t.add(e),()=>{t.delete(e)}}function Ae(e){return{isLocal:e.isLocal,track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},fetchWeights:()=>Promise.resolve([]),getAssignment:(t,n)=>e.getAssignment(t,n),assign:(t,n,o,i)=>e.assign(t,n,o,i),decide:()=>Promise.resolve(null),getSlotResult:t=>e.getSlotResult(t),getPersona:()=>e.getPersona(),getGraph:()=>e.getGraph(),dispose:()=>e.dispose(),destroy:()=>e.destroy()}}var xe="sentient:overrides-changed";function Z(){var e;return typeof window=="undefined"?0:(e=window.__sentient_overrides_version)!=null?e:0}function K(e){return typeof window=="undefined"?()=>{}:(window.addEventListener(xe,e),()=>window.removeEventListener(xe,e))}function _e(e){typeof window!="undefined"&&(window.__sentient_devtools_config=e)}var ht={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0};function B(){if(typeof window=="undefined")return ht;let e=window;return e.__sentient_registry||(e.__sentient_registry={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0}),e.__sentient_registry}function z(){B().version+=1;for(let e of B().listeners)e()}function ee(e){return B().components.set(e.id,e),z(),()=>{B().components.delete(e.id),z()}}function te(e){return B().slots.set(e.id,e),z(),()=>{B().slots.delete(e.id),z()}}function ke(e){B().sections=[...e],z()}var Ie=require("react/jsx-runtime");function wt(){var e,t;if(typeof window=="undefined")return"desktop:direct";try{let n=(0,N.detectDeviceClass)((e=navigator.userAgent)!=null?e:""),o=(0,N.detectTrafficSource)((t=document.referrer)!=null?t:"",window.location.origin);return`${n}:${o}`}catch(n){return"desktop:direct"}}var Ce="https://api.sentient-ui.com/v1",I=(0,w.createContext)({client:null,apiKey:"",initialAssignments:{},sessionSegment:"desktop:direct",ssrFallback:"first",onAssignment:void 0,initialLayoutOrder:null,initialSlots:{},initialPersona:null,apiBaseUrl:Ce});function Re(e){var S,u;let[t,n]=(0,w.useState)(null),[o]=(0,w.useState)(()=>{var d;return(d=e.sessionSegment)!=null?d:wt()}),[i,f]=(0,w.useState)(ae());(0,w.useEffect)(()=>be(()=>f(ae())),[]),(0,w.useEffect)(()=>{if(e.consent===!1&&!e.preConsentBehavior){n(a=>(a==null||a.destroy(),null));return}let d={apiKey:e.apiKey,context:e.context,debug:e.debug,initialAssignments:e.initialAssignments,sessionSegment:o,consent:e.consent,preConsentBehavior:e.preConsentBehavior,respectDoNotTrack:e.respectDoNotTrack,ssrSessionId:e.ssrSessionId,country:e.country,localMode:e.localMode,initialSlots:e.initialSlots,initialPersona:e.initialPersona,ingestUrl:e.apiBaseUrl?`${e.apiBaseUrl.replace(/\/$/,"")}/events`:void 0},g=!1,l=null;return e.enableGraph?import("@sentientui/core/graph").then(({init:a})=>{g||(l=a(J(E({},d),{graph:!0})),n(l))}):(l=(0,N.init)(d),n(l)),()=>{g=!0,l==null||l.dispose()}},[e.consent]),(0,w.useEffect)(()=>{if(!t)return;let d=!1,g=async()=>{if(d)return;let a;try{a=await t.fetchWeights()}catch(b){return}if(!d)for(let b of a){let m={componentId:b.componentId,updatedAt:b.updatedAt,variants:b.variants.map(A=>{var v;return{variantId:A.variantId,pulls:A.pulls,avgReward:(v=A.avgReward)!=null?v:0}})};Q(b.componentId,m)}};g();let l=setInterval(()=>{g()},6e4);return()=>{d=!0,clearInterval(l)}},[t]);let s=(S=e.ssrFallback)!=null?S:"first",r=(u=e.apiBaseUrl)!=null?u:Ce;(0,w.useEffect)(()=>{var d;typeof process!="undefined"&&((d=process.env)==null?void 0:d.NODE_ENV)==="production"||_e({apiKey:e.apiKey,apiBaseUrl:r,isLocal:(t==null?void 0:t.isLocal)===!0})},[t,e.apiKey,r]),(0,w.useEffect)(()=>{e.initialLayoutOrder&&e.initialLayoutOrder.length>0&&ke(e.initialLayoutOrder)},[e.initialLayoutOrder]);let p=(0,w.useMemo)(()=>t&&i?Ae(t):t,[t,i]),c=(0,w.useMemo)(()=>{var d,g,l,a;return{client:p,apiKey:e.apiKey,initialAssignments:(d=e.initialAssignments)!=null?d:{},sessionSegment:o,ssrFallback:s,onAssignment:e.onAssignment,initialLayoutOrder:(g=e.initialLayoutOrder)!=null?g:null,initialSlots:(l=e.initialSlots)!=null?l:{},initialPersona:(a=e.initialPersona)!=null?a:null,apiBaseUrl:r}},[p,e.apiKey,e.initialAssignments,o,s,e.onAssignment,e.initialLayoutOrder,e.initialSlots,e.initialPersona,r]);return(0,Ie.jsx)(I.Provider,{value:c,children:e.children})}function k(){return(0,w.useContext)(I).client}function P(){return(0,w.useContext)(I).apiKey}function ne(){return(0,w.useContext)(I).initialAssignments}function ie(){return(0,w.useContext)(I).sessionSegment}function Ge(){return(0,w.useContext)(I).ssrFallback}function re(){return(0,w.useContext)(I).onAssignment}function Ee(){let e=(0,w.useContext)(I).initialLayoutOrder,t=(0,w.useSyncExternalStore)(K,()=>{var n;return typeof window=="undefined"?null:(n=window.__sentient_layout_override)!=null?n:null},()=>null);return t!=null?t:e}function Oe(){return(0,w.useContext)(I).initialSlots}function Le(){return(0,w.useContext)(I).apiBaseUrl}var x=require("react"),De=require("@sentientui/core");var L=require("react");function bt(e){var n;if(typeof window=="undefined")return null;let t=(n=window.__sentient_overrides)==null?void 0:n[e];if(t)return t;try{let o=new URLSearchParams(window.location.search);for(let i of o.getAll("sentient_variant")){let f=i.indexOf(":");if(f!==-1&&i.slice(0,f)===e)return i.slice(f+1)}}catch(o){}return null}function Pe(e,t){var o;let n=null;for(let i of e.variants)t.includes(i.variantId)&&(!n||i.avgReward>n.avgReward)&&(n={variantId:i.variantId,avgReward:i.avgReward});return(o=n==null?void 0:n.variantId)!=null?o:null}function $(e,t,n,o){let i=ne(),f=Ge(),s=k(),r=ie(),p=re(),c=(0,L.useRef)(null);(0,L.useSyncExternalStore)(K,Z,()=>0);let S=bt(e),u=S&&t.includes(S)?S:null,d=(0,L.useRef)(null);u&&d.current!==u&&(d.current=u,console.info(`[sentient] override active: ${e} -> ${u}`));let g=(()=>{var v,h;if(u)return{variantId:u,content:null,isLoading:!1};if(!s){let y=i[e];return y&&t.includes(y)?{variantId:y,content:null,isLoading:!1}:f==="first"&&t.length>0?{variantId:t[0],content:null,isLoading:!1}:{variantId:null,content:null,isLoading:!0}}let m=s.getAssignment(e,r);if(m&&(t.includes(m.variantId)||m.content))return{variantId:m.variantId,content:(v=m.content)!=null?v:null,isLoading:!1};let A=Y(e);if(A){let y=Pe(A,t);if(y)return{variantId:y,content:null,isLoading:!1}}return{variantId:(h=t[0])!=null?h:null,content:null,isLoading:!1}})(),[l,a]=(0,L.useState)(g),b=m=>{p&&c.current!==m&&(c.current=m,p(e,m))};return(0,L.useEffect)(()=>{var A;if(u||!s)return;let m=s.getAssignment(e,r);if(m&&(t.includes(m.variantId)||m.content)){a({variantId:m.variantId,content:(A=m.content)!=null?A:null,isLoading:!1}),b(m.variantId);return}a(v=>{var h;return v.variantId?v:{variantId:(h=t[0])!=null?h:null,content:null,isLoading:!1}})},[u,s,e,r]),(0,L.useEffect)(()=>{if(u||!s)return;let m=s.getAssignment(e,r);if(m&&t.includes(m.variantId))return;let A=!1;return s.assign(e,t,n,o).then(v=>{var h;A||v&&(!t.includes(v.variantId)&&!v.content||(a({variantId:v.variantId,content:(h=v.content)!=null?h:null,isLoading:!1}),b(v.variantId)))}),()=>{A=!0}},[u,s,e,r]),(0,L.useEffect)(()=>{if(!u&&s)return q(e,m=>{var h;let A=s.getAssignment(e,r);if(A&&(t.includes(A.variantId)||A.content)){a({variantId:A.variantId,content:(h=A.content)!=null?h:null,isLoading:!1});return}let v=Pe(m,t);v&&a({variantId:v,content:null,isLoading:!1})})},[u,s,e,r]),u?{variantId:u,content:null,isLoading:!1,isOverride:!0}:l}function O(){var e;return typeof process=="undefined"||((e=process.env)==null?void 0:e.NODE_ENV)!=="production"}function D(e){return typeof e=="string"?{type:"click"}:e}function U(e){return typeof e=="string"?e:e.type}var At=3e4;function xt(e,t){try{let n=`_snt_pv_${e}_${t}`;return sessionStorage.getItem(n)?!1:(sessionStorage.setItem(n,"1"),!0)}catch(n){return!0}}function _t(e){if(!(e instanceof Element))return!1;let t=e.tagName.toLowerCase();return t==="a"||t==="button"?!0:e.getAttribute("role")==="button"}function Te(e,t,n){if(n){try{let i=e;for(;i&&i!==t;){if(i.matches(n))return!0;i=i.parentElement}}catch(i){}return!1}let o=e;for(;o&&o!==t;){if(_t(o))return!0;o=o.parentElement}return!1}function M(e,t,n){if(t.type==="weighted_composite"){let r=new Set,p=[];return t.steps.forEach(({goal:c,name:S,weight:u},d)=>{let g=()=>{r.has(d)||(r.add(d),n.fireStep(S,u,d))};if(c.type==="click"){let l=a=>{let b=a.target;b instanceof Element&&Te(b,e,c.selector)&&g()};e.addEventListener("click",l),p.push(()=>e.removeEventListener("click",l));return}if(c.type==="form_submit"){let l=a=>{a.target instanceof HTMLFormElement&&e.contains(a.target)&&g()};e.addEventListener("submit",l),p.push(()=>e.removeEventListener("submit",l));return}if(c.type==="scroll_depth"){let l=Math.max(0,Math.min(1,c.threshold)),a=new IntersectionObserver(b=>{for(let m of b)if(m.intersectionRatio>=l){g(),a.disconnect();break}},{threshold:[l]});a.observe(e),p.push(()=>a.disconnect())}}),()=>{for(let c of p)c()}}let o=t.type==="composite"?t.all:[t],i=new Set(o.map((r,p)=>p)),f=r=>{i.delete(r),i.size===0&&n.fireGoal()},s=[];return o.forEach((r,p)=>{if(r.type==="click"){let c=S=>{let u=S.target;u instanceof Element&&Te(u,e,r.selector)&&(t.type==="composite"?f(p):n.fireGoal())};e.addEventListener("click",c),s.push(()=>e.removeEventListener("click",c));return}if(r.type==="form_submit"){let c=S=>{S.target instanceof HTMLFormElement&&e.contains(S.target)&&(t.type==="composite"?f(p):n.fireGoal())};e.addEventListener("submit",c),s.push(()=>e.removeEventListener("submit",c));return}if(r.type==="scroll_depth"){let c=Math.max(0,Math.min(1,r.threshold)),S=new IntersectionObserver(u=>{for(let d of u)if(d.intersectionRatio>=c){t.type==="composite"?f(p):n.fireGoal(),S.disconnect();break}},{threshold:[c]});S.observe(e),s.push(()=>S.disconnect());return}}),()=>{for(let r of s)r()}}function W(e,t,n,o,i){var r;let f=(r=i==null?void 0:i.innerHTML)!=null?r:"",s=f!==""&&xt(n,o);e.track({projectId:t,componentId:n,variantId:o,eventType:"variant_assigned",payload:s?{previewHtml:f.slice(0,At)}:{}})}var We=require("react/jsx-runtime");function kt(e){var A;let t=k(),n=P(),o=(0,x.useMemo)(()=>Object.keys(e.variants),[e.variants]),{variantId:i,content:f,isOverride:s}=$(e.id,o,e.agentData,e.agentDataByVariant),r=(0,x.useRef)(null),[p,c]=(0,x.useState)(!1);(0,x.useEffect)(()=>{c(!0)},[]);let S=(0,x.useRef)(!1),u=(0,x.useRef)(new Set),d=(0,x.useRef)(null),g=typeof e.goal=="string"?e.goal:JSON.stringify(e.goal),l=(0,x.useMemo)(()=>D(e.goal),[g]),a=typeof e.goal=="string"?e.goal:l.type;if((0,x.useEffect)(()=>ee({id:e.id,variantIds:o,goal:a}),[e.id,o,a]),(0,x.useEffect)(()=>{var h,y;s||!t||!i||!n||d.current===i||!((y=(h=r.current)==null?void 0:h.innerHTML)!=null&&y)||(d.current=i,W(t,n,e.id,i,r.current))},[t,i,n,e.id,p,f,s]),(0,x.useEffect)(()=>{S.current=!1,u.current=new Set},[i,l]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(!v)return;let h=null,y=0,R=()=>{y=Date.now(),h=setTimeout(()=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"cursor_signal",payload:{hoverDuration:Date.now()-y}}),h=null},800)},C=()=>{h!==null&&(clearTimeout(h),h=null)};return v.addEventListener("mouseenter",R),v.addEventListener("mouseleave",C),()=>{v.removeEventListener("mouseenter",R),v.removeEventListener("mouseleave",C),h!==null&&clearTimeout(h)}},[t,i,n,e.id,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(!v)return;let h=Date.now();return(0,De.attachMicroSignalDetectors)((y,R={})=>{var fe,ge,pe;t.track({projectId:n,componentId:e.id,variantId:i,eventType:"micro_signal",payload:E({signalType:y},R)});let C=(fe=e.microSignalGoals)==null?void 0:fe[y];if(!C||u.current.has(y))return;u.current.add(y);let ot=typeof C=="string"?C:C.name,st=typeof C=="string"?1:(ge=C.weight)!=null?ge:1,at=typeof C=="string"?0:(pe=C.stepIndex)!=null?pe:0;t.goal(ot,E({signalType:y},R),st,at)},v,h)},[t,i,n,e.id,e.microSignalGoals,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(v)return M(v,l,{fireGoal:()=>{S.current||(S.current=!0,t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:a,payload:{reward:1}}),t.goal(a,{componentId:e.id,variantId:i},1,0))},fireStep:(h,y,R)=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:h,payload:{reward:y}}),t.goal(h,{},y,R)}})},[t,i,n,e.id,l,a,s]),e.clientOnly&&(!p||!t)||!i)return null;let b=(A=e.variants[i])!=null?A:null,m=b===null?f:null;return O()&&b===null&&m===null&&console.warn(`[sentient] <Adaptive id="${e.id}"> was assigned variant "${i}" but no matching key exists in props.variants. If this is a dashboard-managed text variant, use <AdaptiveText id="${e.id}"> instead.`),(0,We.jsx)("div",{ref:r,"data-sentient-id":e.id,"data-sentient-variant":i,children:b!=null?b:m})}var Me=(0,x.memo)(kt,(e,t)=>{if(e.id!==t.id||JSON.stringify(e.goal)!==JSON.stringify(t.goal)||e.microSignalGoals!==t.microSignalGoals||e.clientOnly!==t.clientOnly||e.agentData!==t.agentData||e.agentDataByVariant!==t.agentDataByVariant)return!1;if(e.variants===t.variants)return!0;let n=Object.keys(e.variants),o=Object.keys(t.variants);return n.length!==o.length?!1:n.every(i=>i in t.variants&&Object.is(e.variants[i],t.variants[i]))});var F=require("react");var Be=require("react/jsx-runtime");function Fe({id:e,default:t,component:n="span",className:o}){let i=k(),f=P(),s=re(),r=ie(),p=(0,F.useRef)(null),[c,S]=(0,F.useState)(()=>{var g,l;return(l=(g=i==null?void 0:i.getAssignment(e,r))==null?void 0:g.content)!=null?l:null}),[u,d]=(0,F.useState)(()=>{var g,l;return(l=(g=i==null?void 0:i.getAssignment(e,r))==null?void 0:g.variantId)!=null?l:null});return(0,F.useEffect)(()=>{var l;if(!i||((l=i.getAssignment(e,r))==null?void 0:l.content)!==void 0)return;let g=!1;return i.assign(e).then(a=>{if(!g){if(!a){O()&&console.warn(`[sentient] <AdaptiveText id="${e}"> assignment failed \u2014 showing default text.`);return}d(a.variantId),a.content&&S(a.content)}}),()=>{g=!0}},[i,e,r]),(0,F.useEffect)(()=>{!i||!u||!f||p.current!==u&&(p.current=u,i.track({projectId:f,componentId:e,variantId:u,eventType:"variant_assigned",payload:{}}),s==null||s(e,u))},[i,u,f,e,s]),(0,Be.jsx)(n,{className:o,children:c!=null?c:t})}var je=require("react");function Ke(e){let t=k();return(0,je.useCallback)((n,o)=>{t==null||t.componentGoal(e,n,o)},[t,e])}var $e=require("@sentientui/core"),Ue=require("@sentientui/policy"),He=require("react/jsx-runtime");function Ne(e){return JSON.stringify(e).replace(/</g,"\\u003c")}function Ct(e){return e.persona?'(function(){try{var d=document.documentElement;if(d.hasAttribute("data-sentient-persona"))return;d.setAttribute("data-sentient-persona",'+Ne(e.persona.persona)+');d.setAttribute("data-sentient-confidence",'+Ne((0,Ue.confidenceBand)(e.persona.confidence))+");}catch(e){}})();":(0,$e.renderPrePaintScript)(e.apiKey)}function Ve(e){return(0,He.jsx)("script",{"data-sentient-persona-script":"",dangerouslySetInnerHTML:{__html:Ct(e)}})}var T=require("react"),Je=require("@sentientui/policy");var V=require("react"),j=require("@sentientui/core"),Rt=require("@sentientui/policy");function oe(e,t){var S;(0,V.useSyncExternalStore)(K,Z,()=>0);let n=k(),o=Oe(),[,i]=(0,V.useReducer)(u=>u+1,0),f=typeof window!="undefined"?(S=window.__sentient_slot_overrides)==null?void 0:S[e]:void 0,s=f===void 0?o[e]:void 0,r=f===void 0&&s===void 0&&n?n.getSlotResult(e):null,p=(n==null?void 0:n.isLocal)===!0&&f===void 0&&s===void 0&&r===null;if((0,V.useEffect)(()=>{if(!p||!n)return;let u=!1;return n.decide({slots:[t]}).then(d=>{!u&&d&&i()}),()=>{u=!0}},[n,e,p]),f!==void 0)return{result:f,arm:(0,j.armOfResult)(f),source:"override"};if(s!==void 0)return{result:s,arm:(0,j.armOfResult)(s),source:"preloaded"};if(r!==null)return{result:r,arm:(0,j.armOfResult)(r),source:"client"};let c=(0,j.baselineResultFor)(t);return{result:c,arm:(0,j.armOfResult)(c),source:"baseline"}}var le=new Set;function Gt(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/"/g,'\\"')}function ze(e,t,n){let o=k(),i=P(),f=(0,T.useMemo)(()=>({id:e,dims:t}),[e]),{result:s,arm:r}=oe(e,f),p=(0,T.useMemo)(()=>typeof s=="string"?{}:s,[r]);if(O()&&!le.has(e)){let d=(0,Je.validateSlotDecl)({id:e,dims:Object.fromEntries(Object.entries(t).map(([l,a])=>[l,[...a]]))}),g=Object.values(t).reduce((l,a)=>l*a.length,1);d.ok?g>4&&(le.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}") declares ${g} combinations \u2014 more than the recommended 4. Each extra combination needs more traffic to learn; consider fewer dims/values.`)):(le.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}"): invalid declaration \u2014 ${d.reason}. Serving baseline.`))}let c=(n==null?void 0:n.goal)===void 0?null:typeof n.goal=="string"?n.goal:JSON.stringify(n.goal);(0,T.useEffect)(()=>te({id:e,dims:t}),[e]);let S=(0,T.useRef)(null);(0,T.useEffect)(()=>{!o||S.current===r||(S.current=r,W(o,i,e,r,null))},[o,i,e,r]),(0,T.useEffect)(()=>{if(!o||!(n!=null&&n.goal))return;let d=document.querySelector(`[data-sentient-slot="${Gt(e)}"]`);if(!d){O()&&console.warn(`[sentient] useAdaptiveTokens("${e}"): a goal is declared but no element carries the returned props \u2014 spread {...props} on the slot's element.`);return}let g=U(n.goal),l=!1;return M(d,D(n.goal),{fireGoal:()=>{l||(l=!0,o.componentGoal(e,g))},fireStep:(a,b)=>{o.componentGoal(e,a,{reward:b})}})},[o,e,c,r]);let u=(0,T.useMemo)(()=>{let d={"data-sentient-slot":e};for(let[g,l]of Object.entries(p))d[`data-${g}`]=l;return d},[e,p]);return{tokens:p,props:u}}var _=require("react"),qe=require("@sentientui/core");var Xe=new Set;function Qe(e,t){var h;if(O()&&!t.goal)throw new Error(`[sentient] useAdaptive("${e}"): a goal is required \u2014 without one the optimizer accumulates exposures with no rewards and cannot learn. Pass e.g. goal: 'buy_click'.`);let n=k(),o=P(),i=(0,_.useMemo)(()=>Object.keys(t.variants),[e]),{variantId:f,isOverride:s}=$(e,i),r=(h=f!=null?f:i[0])!=null?h:"",p=t.variants[r],[c,S]=(0,_.useState)(null),u=(0,_.useRef)(null),d=(0,_.useCallback)(y=>{u.current=y,S(y)},[]),g=typeof t.goal=="string"?t.goal:JSON.stringify(t.goal),l=(0,_.useMemo)(()=>D(t.goal),[g]),a=U(t.goal);(0,_.useEffect)(()=>ee({id:e,variantIds:i,goal:a}),[e,i,a]);let b=(0,_.useRef)(null);(0,_.useEffect)(()=>{s||!n||!r||!c||b.current!==r&&(b.current=r,W(n,o,e,r,c))},[n,o,e,r,c,s]);let m=(0,_.useRef)(!1);(0,_.useEffect)(()=>{m.current=!1},[r,g]),(0,_.useEffect)(()=>{if(!s&&!(!n||!r||!c))return M(c,l,{fireGoal:()=>{m.current||(m.current=!0,n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:a,payload:{reward:1}}),n.goal(a,{componentId:e,variantId:r},1,0))},fireStep:(y,R,C)=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:y,payload:{reward:R}}),n.goal(y,{},R,C)}})},[n,c,r,o,e,l,a,s]),(0,_.useEffect)(()=>{if(s||!n||!r||!c)return;let y=Date.now();return(0,qe.attachMicroSignalDetectors)((R,C={})=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"micro_signal",payload:E({signalType:R},C)})},c,y)},[n,c,r,o,e,s]),(0,_.useEffect)(()=>{if(!O()||!n)return;let y=setTimeout(()=>{!u.current&&!Xe.has(e)&&(Xe.add(e),console.warn(`[sentient] useAdaptive("${e}"): bind was never attached \u2014 spread {...bind} on the rendered element, otherwise exposure and goal tracking cannot work and the optimizer learns nothing.`))},0);return()=>clearTimeout(y)},[n,e]);let A=(0,_.useCallback)((y,R)=>{s||n==null||n.componentGoal(e,y!=null?y:a,R)},[n,e,a,s]),v=(0,_.useMemo)(()=>({ref:d,"data-sentient-id":e,"data-sentient-variant":r}),[d,e,r]);return{variant:r,value:p,bind:v,fireGoal:A}}var G=require("react");var Ze=require("react/jsx-runtime"),se=new Set;function Ye(e){var l;let t=k(),n=P(),o=(0,G.useRef)(null),i=(0,G.useMemo)(()=>Object.keys(e.arrangements),[e.id]),f=(0,G.useMemo)(()=>E({id:e.id,arms:i},e.baseline!==void 0?{baseline:e.baseline}:{}),[e.id,i,e.baseline]),{arm:s}=oe(e.id,f);O()&&e.baseline!==void 0&&e.baseline!==i[0]&&!se.has(e.id+":baseline")&&(se.add(e.id+":baseline"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: baseline "${e.baseline}" is not the first-declared arrangement ("${i[0]}"). The first arrangement should usually be the page's real incumbent (the holdout sees it).`));let r=G.Children.toArray(e.children).filter(G.isValidElement),p=new Map;for(let a of r)p.set(String((l=a.key)!=null?l:"").replace(/^\.\$/,""),a);let c=e.arrangements[s],S=c!==void 0&&c.length===r.length&&c.every(a=>p.has(a));O()&&c!==void 0&&!S&&!se.has(e.id+":keys")&&(se.add(e.id+":keys"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: arrangement "${s}" [${c.join(", ")}] does not match the children's keys \u2014 rendering declaration order (fail-safe).`));let u=S?c.map(a=>p.get(a)):r;(0,G.useEffect)(()=>te({id:e.id,arms:Object.keys(e.arrangements)}),[e.id]);let d=(0,G.useRef)(null);(0,G.useEffect)(()=>{!t||d.current===s||(d.current=s,W(t,n,e.id,s,o.current))},[t,n,e.id,s]);let g=e.goal===void 0?null:typeof e.goal=="string"?e.goal:JSON.stringify(e.goal);return(0,G.useEffect)(()=>{if(!t||e.goal===void 0)return;let a=o.current;if(!a)return;let b=U(e.goal),m=!1;return M(a,D(e.goal),{fireGoal:()=>{m||(m=!0,t.componentGoal(e.id,b))},fireStep:(A,v)=>{t.componentGoal(e.id,A,{reward:v})}})},[t,e.id,g,s]),(0,Ze.jsx)("div",{ref:o,"data-sentient-id":e.id,"data-sentient-variant":s,children:u})}var ce=require("@sentientui/core");var Et=["page","blocks","layoutOrder"],et=new Map;function tt(e,t){et.set(e,t)}function ue(e){return et.get(e)}function nt(e){var i,f;let t=(f=(i=e.content)!=null?i:ue(e.page))!=null?f:{},n={};for(let[s,r]of Object.entries(t))Et.includes(s)||(n[s]=r);let o=J(E({},n),{page:e.page,blocks:e.blocks});return e.layoutOrder&&(o.layoutOrder=e.layoutOrder),o}function it(e){return`<script type="application/ld+json">${de(e)}</script>`}function de(e){return JSON.stringify(E({"@context":"https://schema.org","@type":"WebPage"},e)).replace(/</g,"\\u003c")}function rt(e){let t=[];e.title&&t.push(`# ${e.title}`,""),e.summary&&t.push(String(e.summary),"");for(let[n,o]of Object.entries(e))["page","title","summary","blocks","layoutOrder"].includes(n)||t.push(`## ${n}`,"","```json",JSON.stringify(o,null,2),"```","");if(e.blocks.length>0){t.push("## blocks","");for(let n of e.blocks)t.push(`- **${n.id}** \u2192 variant \`${n.variant}\``),n.content!==void 0&&t.push(""," ```json",JSON.stringify(n.content,null,2)," ```");t.push("")}return t.join(`
2
+ "use strict";var ct=Object.create;var H=Object.defineProperty,ut=Object.defineProperties,dt=Object.getOwnPropertyDescriptor,ft=Object.getOwnPropertyDescriptors,gt=Object.getOwnPropertyNames,me=Object.getOwnPropertySymbols,pt=Object.getPrototypeOf,ye=Object.prototype.hasOwnProperty,mt=Object.prototype.propertyIsEnumerable;var ve=(e,t,n)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,E=(e,t)=>{for(var n in t||(t={}))ye.call(t,n)&&ve(e,n,t[n]);if(me)for(var n of me(t))mt.call(t,n)&&ve(e,n,t[n]);return e},J=(e,t)=>ut(e,ft(t));var vt=(e,t)=>{for(var n in t)H(e,n,{get:t[n],enumerable:!0})},Se=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of gt(t))!ye.call(e,i)&&i!==n&&H(e,i,{get:()=>t[i],enumerable:!(o=dt(t,i))||o.enumerable});return e};var he=(e,t,n)=>(n=e!=null?ct(pt(e)):{},Se(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e)),yt=e=>Se(H({},"__esModule",{value:!0}),e);var Ot={};vt(Ot,{Adaptive:()=>We,AdaptiveGroup:()=>Ze,AdaptiveProvider:()=>Ge,AdaptiveText:()=>Fe,SentientPersonaScript:()=>He,buildAgentFeed:()=>it,defineAgentContent:()=>nt,detectSegment:()=>ce.deriveSessionSegment,getAgentContent:()=>ue,getWeights:()=>Y,renderAgentJsonLd:()=>rt,renderAgentJsonLdBody:()=>de,renderAgentMarkdown:()=>ot,subscribeWeights:()=>q,updateWeights:()=>Q,useAdaptive:()=>Ye,useAdaptiveApiBaseUrl:()=>Ie,useAdaptiveGoal:()=>Ne,useAdaptiveTokens:()=>Xe,useAssignment:()=>$,useInitialAssignments:()=>ne,useLayoutOrder:()=>Oe,useSentient:()=>k});module.exports=yt(Ot);var A=require("react"),N=require("@sentientui/core");var we=new Map,X=new Map;function q(e,t){let n=X.get(e);return n||(n=new Set,X.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&X.delete(e)}}function Q(e,t){we.set(e,t);let n=X.get(e);if(n)for(let o of n)try{o(t)}catch(i){}}function Y(e){var t;return(t=we.get(e))!=null?t:null}var St={on:!1,listeners:new Set};function be(){if(typeof window=="undefined")return St;let e=window;return e.__sentient_preview||(e.__sentient_preview={on:!1,listeners:new Set}),e.__sentient_preview}function ae(){return be().on}function Ae(e){let t=be().listeners;return t.add(e),()=>{t.delete(e)}}function xe(e){return{isLocal:e.isLocal,track:()=>{},goal:()=>{},componentGoal:()=>{},identify:()=>{},fetchWeights:()=>Promise.resolve([]),getAssignment:(t,n)=>e.getAssignment(t,n),assign:(t,n,o,i)=>e.assign(t,n,o,i),decide:()=>Promise.resolve(null),getSlotResult:t=>e.getSlotResult(t),getPersona:()=>e.getPersona(),getGraph:()=>e.getGraph(),dispose:()=>e.dispose(),destroy:()=>e.destroy()}}var _e="sentient:overrides-changed";function Z(){var e;return typeof window=="undefined"?0:(e=window.__sentient_overrides_version)!=null?e:0}function K(e){return typeof window=="undefined"?()=>{}:(window.addEventListener(_e,e),()=>window.removeEventListener(_e,e))}function ke(e){typeof window!="undefined"&&(window.__sentient_devtools_config=e)}var ht={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0};function F(){if(typeof window=="undefined")return ht;let e=window;return e.__sentient_registry||(e.__sentient_registry={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0}),e.__sentient_registry}function z(){F().version+=1;for(let e of F().listeners)e()}function ee(e){return F().components.set(e.id,e),z(),()=>{F().components.delete(e.id),z()}}function te(e){return F().slots.set(e.id,e),z(),()=>{F().slots.delete(e.id),z()}}function Ce(e){F().sections=[...e],z()}var Pe=require("react/jsx-runtime");function wt(){var e,t;if(typeof window=="undefined")return"desktop:direct";try{let n=(0,N.detectDeviceClass)((e=navigator.userAgent)!=null?e:""),o=(0,N.detectTrafficSource)((t=document.referrer)!=null?t:"",window.location.origin);return`${n}:${o}`}catch(n){return"desktop:direct"}}var Re="https://api.sentient-ui.com/v1",I=(0,A.createContext)({client:null,apiKey:"",initialAssignments:{},sessionSegment:"desktop:direct",ssrFallback:"first",onAssignment:void 0,initialLayoutOrder:null,initialSlots:{},initialPersona:null,apiBaseUrl:Re});function Ge(e){var S,u;let[t,n]=(0,A.useState)(null),[o]=(0,A.useState)(()=>{var d;return(d=e.sessionSegment)!=null?d:wt()}),[i,g]=(0,A.useState)(ae());(0,A.useEffect)(()=>Ae(()=>g(ae())),[]),(0,A.useEffect)(()=>{if(e.consent===!1&&!e.preConsentBehavior){n(f=>(f==null||f.destroy(),null));return}let d={apiKey:e.apiKey,context:e.context,debug:e.debug,initialAssignments:e.initialAssignments,sessionSegment:o,consent:e.consent,preConsentBehavior:e.preConsentBehavior,respectDoNotTrack:e.respectDoNotTrack,ssrSessionId:e.ssrSessionId,country:e.country,localMode:e.localMode,initialSlots:e.initialSlots,initialPersona:e.initialPersona,ingestUrl:e.apiBaseUrl?`${e.apiBaseUrl.replace(/\/$/,"")}/events`:void 0},p=!1,l=null,a=null,w=f=>{e.engagement!==!1&&import("@sentientui/core/engagement").then(({startEngagementCapture:b})=>{p||(a=b(f,{apiKey:e.apiKey,apiBase:e.apiBaseUrl?e.apiBaseUrl.replace(/\/$/,""):void 0}))})};return e.enableGraph!==!1?import("@sentientui/core/graph").then(({init:f})=>{p||(l=f(J(E({},d),{graph:!0})),n(l),w(l))}):(l=(0,N.init)(d),n(l),w(l)),()=>{p=!0,a==null||a(),l==null||l.dispose()}},[e.consent]),(0,A.useEffect)(()=>{if(!t)return;let d=!1,p=async()=>{if(d)return;let a;try{a=await t.fetchWeights()}catch(w){return}if(!d)for(let w of a){let f={componentId:w.componentId,updatedAt:w.updatedAt,variants:w.variants.map(b=>{var v;return{variantId:b.variantId,pulls:b.pulls,avgReward:(v=b.avgReward)!=null?v:0}})};Q(w.componentId,f)}};p();let l=setInterval(()=>{p()},6e4);return()=>{d=!0,clearInterval(l)}},[t]);let s=(S=e.ssrFallback)!=null?S:"first",r=(u=e.apiBaseUrl)!=null?u:Re;(0,A.useEffect)(()=>{var d;typeof process!="undefined"&&((d=process.env)==null?void 0:d.NODE_ENV)==="production"||ke({apiKey:e.apiKey,apiBaseUrl:r,isLocal:(t==null?void 0:t.isLocal)===!0})},[t,e.apiKey,r]),(0,A.useEffect)(()=>{e.initialLayoutOrder&&e.initialLayoutOrder.length>0&&Ce(e.initialLayoutOrder)},[e.initialLayoutOrder]);let m=(0,A.useMemo)(()=>t&&i?xe(t):t,[t,i]),c=(0,A.useMemo)(()=>{var d,p,l,a;return{client:m,apiKey:e.apiKey,initialAssignments:(d=e.initialAssignments)!=null?d:{},sessionSegment:o,ssrFallback:s,onAssignment:e.onAssignment,initialLayoutOrder:(p=e.initialLayoutOrder)!=null?p:null,initialSlots:(l=e.initialSlots)!=null?l:{},initialPersona:(a=e.initialPersona)!=null?a:null,apiBaseUrl:r}},[m,e.apiKey,e.initialAssignments,o,s,e.onAssignment,e.initialLayoutOrder,e.initialSlots,e.initialPersona,r]);return(0,Pe.jsx)(I.Provider,{value:c,children:e.children})}function k(){return(0,A.useContext)(I).client}function P(){return(0,A.useContext)(I).apiKey}function ne(){return(0,A.useContext)(I).initialAssignments}function ie(){return(0,A.useContext)(I).sessionSegment}function Ee(){return(0,A.useContext)(I).ssrFallback}function re(){return(0,A.useContext)(I).onAssignment}function Oe(){let e=(0,A.useContext)(I).initialLayoutOrder,t=(0,A.useSyncExternalStore)(K,()=>{var n;return typeof window=="undefined"?null:(n=window.__sentient_layout_override)!=null?n:null},()=>null);return t!=null?t:e}function Le(){return(0,A.useContext)(I).initialSlots}function Ie(){return(0,A.useContext)(I).apiBaseUrl}var x=require("react"),Me=require("@sentientui/core");var L=require("react");function bt(e){var n;if(typeof window=="undefined")return null;let t=(n=window.__sentient_overrides)==null?void 0:n[e];if(t)return t;try{let o=new URLSearchParams(window.location.search);for(let i of o.getAll("sentient_variant")){let g=i.indexOf(":");if(g!==-1&&i.slice(0,g)===e)return i.slice(g+1)}}catch(o){}return null}function Te(e,t){var o;let n=null;for(let i of e.variants)t.includes(i.variantId)&&(!n||i.avgReward>n.avgReward)&&(n={variantId:i.variantId,avgReward:i.avgReward});return(o=n==null?void 0:n.variantId)!=null?o:null}function $(e,t,n,o){let i=ne(),g=Ee(),s=k(),r=ie(),m=re(),c=(0,L.useRef)(null);(0,L.useSyncExternalStore)(K,Z,()=>0);let S=bt(e),u=S&&t.includes(S)?S:null,d=(0,L.useRef)(null);u&&d.current!==u&&(d.current=u,console.info(`[sentient] override active: ${e} -> ${u}`));let p=(()=>{var v,h;if(u)return{variantId:u,content:null,isLoading:!1};if(!s){let y=i[e];return y&&t.includes(y)?{variantId:y,content:null,isLoading:!1}:g==="first"&&t.length>0?{variantId:t[0],content:null,isLoading:!1}:{variantId:null,content:null,isLoading:!0}}let f=s.getAssignment(e,r);if(f&&(t.includes(f.variantId)||f.content))return{variantId:f.variantId,content:(v=f.content)!=null?v:null,isLoading:!1};let b=Y(e);if(b){let y=Te(b,t);if(y)return{variantId:y,content:null,isLoading:!1}}return{variantId:(h=t[0])!=null?h:null,content:null,isLoading:!1}})(),[l,a]=(0,L.useState)(p),w=f=>{m&&c.current!==f&&(c.current=f,m(e,f))};return(0,L.useEffect)(()=>{var b;if(u||!s)return;let f=s.getAssignment(e,r);if(f&&(t.includes(f.variantId)||f.content)){a({variantId:f.variantId,content:(b=f.content)!=null?b:null,isLoading:!1}),w(f.variantId);return}a(v=>{var h;return v.variantId?v:{variantId:(h=t[0])!=null?h:null,content:null,isLoading:!1}})},[u,s,e,r]),(0,L.useEffect)(()=>{if(u||!s)return;let f=s.getAssignment(e,r);if(f&&t.includes(f.variantId))return;let b=!1;return s.assign(e,t,n,o).then(v=>{var h;b||v&&(!t.includes(v.variantId)&&!v.content||(a({variantId:v.variantId,content:(h=v.content)!=null?h:null,isLoading:!1}),w(v.variantId)))}),()=>{b=!0}},[u,s,e,r]),(0,L.useEffect)(()=>{if(!u&&s)return q(e,f=>{var h;let b=s.getAssignment(e,r);if(b&&(t.includes(b.variantId)||b.content)){a({variantId:b.variantId,content:(h=b.content)!=null?h:null,isLoading:!1});return}let v=Te(f,t);v&&a({variantId:v,content:null,isLoading:!1})})},[u,s,e,r]),u?{variantId:u,content:null,isLoading:!1,isOverride:!0}:l}function O(){var e;return typeof process=="undefined"||((e=process.env)==null?void 0:e.NODE_ENV)!=="production"}function D(e){return typeof e=="string"?{type:"click"}:e}function U(e){return typeof e=="string"?e:e.type}var At=3e4;function xt(e,t){try{let n=`_snt_pv_${e}_${t}`;return sessionStorage.getItem(n)?!1:(sessionStorage.setItem(n,"1"),!0)}catch(n){return!0}}function _t(e){if(!(e instanceof Element))return!1;let t=e.tagName.toLowerCase();return t==="a"||t==="button"?!0:e.getAttribute("role")==="button"}function De(e,t,n){if(n){try{let i=e;for(;i&&i!==t;){if(i.matches(n))return!0;i=i.parentElement}}catch(i){}return!1}let o=e;for(;o&&o!==t;){if(_t(o))return!0;o=o.parentElement}return!1}function M(e,t,n){if(t.type==="weighted_composite"){let r=new Set,m=[];return t.steps.forEach(({goal:c,name:S,weight:u},d)=>{let p=()=>{r.has(d)||(r.add(d),n.fireStep(S,u,d))};if(c.type==="click"){let l=a=>{let w=a.target;w instanceof Element&&De(w,e,c.selector)&&p()};e.addEventListener("click",l),m.push(()=>e.removeEventListener("click",l));return}if(c.type==="form_submit"){let l=a=>{a.target instanceof HTMLFormElement&&e.contains(a.target)&&p()};e.addEventListener("submit",l),m.push(()=>e.removeEventListener("submit",l));return}if(c.type==="scroll_depth"){let l=Math.max(0,Math.min(1,c.threshold)),a=new IntersectionObserver(w=>{for(let f of w)if(f.intersectionRatio>=l){p(),a.disconnect();break}},{threshold:[l]});a.observe(e),m.push(()=>a.disconnect())}}),()=>{for(let c of m)c()}}let o=t.type==="composite"?t.all:[t],i=new Set(o.map((r,m)=>m)),g=r=>{i.delete(r),i.size===0&&n.fireGoal()},s=[];return o.forEach((r,m)=>{if(r.type==="click"){let c=S=>{let u=S.target;u instanceof Element&&De(u,e,r.selector)&&(t.type==="composite"?g(m):n.fireGoal())};e.addEventListener("click",c),s.push(()=>e.removeEventListener("click",c));return}if(r.type==="form_submit"){let c=S=>{S.target instanceof HTMLFormElement&&e.contains(S.target)&&(t.type==="composite"?g(m):n.fireGoal())};e.addEventListener("submit",c),s.push(()=>e.removeEventListener("submit",c));return}if(r.type==="scroll_depth"){let c=Math.max(0,Math.min(1,r.threshold)),S=new IntersectionObserver(u=>{for(let d of u)if(d.intersectionRatio>=c){t.type==="composite"?g(m):n.fireGoal(),S.disconnect();break}},{threshold:[c]});S.observe(e),s.push(()=>S.disconnect());return}}),()=>{for(let r of s)r()}}function W(e,t,n,o,i){var r;let g=(r=i==null?void 0:i.innerHTML)!=null?r:"",s=g!==""&&xt(n,o);e.track({projectId:t,componentId:n,variantId:o,eventType:"variant_assigned",payload:s?{previewHtml:g.slice(0,At)}:{}})}var Be=require("react/jsx-runtime");function kt(e){var b;let t=k(),n=P(),o=(0,x.useMemo)(()=>Object.keys(e.variants),[e.variants]),{variantId:i,content:g,isOverride:s}=$(e.id,o,e.agentData,e.agentDataByVariant),r=(0,x.useRef)(null),[m,c]=(0,x.useState)(!1);(0,x.useEffect)(()=>{c(!0)},[]);let S=(0,x.useRef)(!1),u=(0,x.useRef)(new Set),d=(0,x.useRef)(null),p=typeof e.goal=="string"?e.goal:JSON.stringify(e.goal),l=(0,x.useMemo)(()=>D(e.goal),[p]),a=typeof e.goal=="string"?e.goal:l.type;if((0,x.useEffect)(()=>ee({id:e.id,variantIds:o,goal:a}),[e.id,o,a]),(0,x.useEffect)(()=>{var h,y;s||!t||!i||!n||d.current===i||!((y=(h=r.current)==null?void 0:h.innerHTML)!=null&&y)||(d.current=i,W(t,n,e.id,i,r.current))},[t,i,n,e.id,m,g,s]),(0,x.useEffect)(()=>{S.current=!1,u.current=new Set},[i,l]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(!v)return;let h=null,y=0,R=()=>{y=Date.now(),h=setTimeout(()=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"cursor_signal",payload:{hoverDuration:Date.now()-y}}),h=null},800)},C=()=>{h!==null&&(clearTimeout(h),h=null)};return v.addEventListener("mouseenter",R),v.addEventListener("mouseleave",C),()=>{v.removeEventListener("mouseenter",R),v.removeEventListener("mouseleave",C),h!==null&&clearTimeout(h)}},[t,i,n,e.id,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(!v)return;let h=Date.now();return(0,Me.attachMicroSignalDetectors)((y,R={})=>{var fe,ge,pe;t.track({projectId:n,componentId:e.id,variantId:i,eventType:"micro_signal",payload:E({signalType:y},R)});let C=(fe=e.microSignalGoals)==null?void 0:fe[y];if(!C||u.current.has(y))return;u.current.add(y);let st=typeof C=="string"?C:C.name,at=typeof C=="string"?1:(ge=C.weight)!=null?ge:1,lt=typeof C=="string"?0:(pe=C.stepIndex)!=null?pe:0;t.goal(st,E({signalType:y},R),at,lt)},v,h)},[t,i,n,e.id,e.microSignalGoals,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let v=r.current;if(v)return M(v,l,{fireGoal:()=>{S.current||(S.current=!0,t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:a,payload:{reward:1}}),t.goal(a,{componentId:e.id,variantId:i},1,0))},fireStep:(h,y,R)=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:h,payload:{reward:y}}),t.goal(h,{},y,R)}})},[t,i,n,e.id,l,a,s]),e.clientOnly&&(!m||!t)||!i)return null;let w=(b=e.variants[i])!=null?b:null,f=w===null?g:null;return O()&&w===null&&f===null&&console.warn(`[sentient] <Adaptive id="${e.id}"> was assigned variant "${i}" but no matching key exists in props.variants. If this is a dashboard-managed text variant, use <AdaptiveText id="${e.id}"> instead.`),(0,Be.jsx)("div",{ref:r,"data-sentient-id":e.id,"data-sentient-variant":i,children:w!=null?w:f})}var We=(0,x.memo)(kt,(e,t)=>{if(e.id!==t.id||JSON.stringify(e.goal)!==JSON.stringify(t.goal)||e.microSignalGoals!==t.microSignalGoals||e.clientOnly!==t.clientOnly||e.agentData!==t.agentData||e.agentDataByVariant!==t.agentDataByVariant)return!1;if(e.variants===t.variants)return!0;let n=Object.keys(e.variants),o=Object.keys(t.variants);return n.length!==o.length?!1:n.every(i=>i in t.variants&&Object.is(e.variants[i],t.variants[i]))});var B=require("react");var je=require("react/jsx-runtime");function Fe({id:e,default:t,component:n="span",className:o}){let i=k(),g=P(),s=re(),r=ie(),m=(0,B.useRef)(null),[c,S]=(0,B.useState)(()=>{var p,l;return(l=(p=i==null?void 0:i.getAssignment(e,r))==null?void 0:p.content)!=null?l:null}),[u,d]=(0,B.useState)(()=>{var p,l;return(l=(p=i==null?void 0:i.getAssignment(e,r))==null?void 0:p.variantId)!=null?l:null});return(0,B.useEffect)(()=>{var l;if(!i||((l=i.getAssignment(e,r))==null?void 0:l.content)!==void 0)return;let p=!1;return i.assign(e).then(a=>{if(!p){if(!a){O()&&console.warn(`[sentient] <AdaptiveText id="${e}"> assignment failed \u2014 showing default text.`);return}d(a.variantId),a.content&&S(a.content)}}),()=>{p=!0}},[i,e,r]),(0,B.useEffect)(()=>{!i||!u||!g||m.current!==u&&(m.current=u,i.track({projectId:g,componentId:e,variantId:u,eventType:"variant_assigned",payload:{}}),s==null||s(e,u))},[i,u,g,e,s]),(0,je.jsx)(n,{className:o,children:c!=null?c:t})}var Ke=require("react");function Ne(e){let t=k();return(0,Ke.useCallback)((n,o)=>{t==null||t.componentGoal(e,n,o)},[t,e])}var Ue=require("@sentientui/core"),Ve=require("@sentientui/policy"),Je=require("react/jsx-runtime");function $e(e){return JSON.stringify(e).replace(/</g,"\\u003c")}function Ct(e){return e.persona?'(function(){try{var d=document.documentElement;if(d.hasAttribute("data-sentient-persona"))return;d.setAttribute("data-sentient-persona",'+$e(e.persona.persona)+');d.setAttribute("data-sentient-confidence",'+$e((0,Ve.confidenceBand)(e.persona.confidence))+");}catch(e){}})();":(0,Ue.renderPrePaintScript)(e.apiKey)}function He(e){return(0,Je.jsx)("script",{"data-sentient-persona-script":"",dangerouslySetInnerHTML:{__html:Ct(e)}})}var T=require("react"),ze=require("@sentientui/policy");var V=require("react"),j=require("@sentientui/core"),Rt=require("@sentientui/policy");function oe(e,t){var S;(0,V.useSyncExternalStore)(K,Z,()=>0);let n=k(),o=Le(),[,i]=(0,V.useReducer)(u=>u+1,0),g=typeof window!="undefined"?(S=window.__sentient_slot_overrides)==null?void 0:S[e]:void 0,s=g===void 0?o[e]:void 0,r=g===void 0&&s===void 0&&n?n.getSlotResult(e):null,m=(n==null?void 0:n.isLocal)===!0&&g===void 0&&s===void 0&&r===null;if((0,V.useEffect)(()=>{if(!m||!n)return;let u=!1;return n.decide({slots:[t]}).then(d=>{!u&&d&&i()}),()=>{u=!0}},[n,e,m]),g!==void 0)return{result:g,arm:(0,j.armOfResult)(g),source:"override"};if(s!==void 0)return{result:s,arm:(0,j.armOfResult)(s),source:"preloaded"};if(r!==null)return{result:r,arm:(0,j.armOfResult)(r),source:"client"};let c=(0,j.baselineResultFor)(t);return{result:c,arm:(0,j.armOfResult)(c),source:"baseline"}}var le=new Set;function Gt(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/"/g,'\\"')}function Xe(e,t,n){let o=k(),i=P(),g=(0,T.useMemo)(()=>({id:e,dims:t}),[e]),{result:s,arm:r}=oe(e,g),m=(0,T.useMemo)(()=>typeof s=="string"?{}:s,[r]);if(O()&&!le.has(e)){let d=(0,ze.validateSlotDecl)({id:e,dims:Object.fromEntries(Object.entries(t).map(([l,a])=>[l,[...a]]))}),p=Object.values(t).reduce((l,a)=>l*a.length,1);d.ok?p>4&&(le.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}") declares ${p} combinations \u2014 more than the recommended 4. Each extra combination needs more traffic to learn; consider fewer dims/values.`)):(le.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}"): invalid declaration \u2014 ${d.reason}. Serving baseline.`))}let c=(n==null?void 0:n.goal)===void 0?null:typeof n.goal=="string"?n.goal:JSON.stringify(n.goal);(0,T.useEffect)(()=>te({id:e,dims:t}),[e]);let S=(0,T.useRef)(null);(0,T.useEffect)(()=>{!o||S.current===r||(S.current=r,W(o,i,e,r,null))},[o,i,e,r]),(0,T.useEffect)(()=>{if(!o||!(n!=null&&n.goal))return;let d=document.querySelector(`[data-sentient-slot="${Gt(e)}"]`);if(!d){O()&&console.warn(`[sentient] useAdaptiveTokens("${e}"): a goal is declared but no element carries the returned props \u2014 spread {...props} on the slot's element.`);return}let p=U(n.goal),l=!1;return M(d,D(n.goal),{fireGoal:()=>{l||(l=!0,o.componentGoal(e,p))},fireStep:(a,w)=>{o.componentGoal(e,a,{reward:w})}})},[o,e,c,r]);let u=(0,T.useMemo)(()=>{let d={"data-sentient-slot":e};for(let[p,l]of Object.entries(m))d[`data-${p}`]=l;return d},[e,m]);return{tokens:m,props:u}}var _=require("react"),Qe=require("@sentientui/core");var qe=new Set;function Ye(e,t){var h;if(O()&&!t.goal)throw new Error(`[sentient] useAdaptive("${e}"): a goal is required \u2014 without one the optimizer accumulates exposures with no rewards and cannot learn. Pass e.g. goal: 'buy_click'.`);let n=k(),o=P(),i=(0,_.useMemo)(()=>Object.keys(t.variants),[e]),{variantId:g,isOverride:s}=$(e,i),r=(h=g!=null?g:i[0])!=null?h:"",m=t.variants[r],[c,S]=(0,_.useState)(null),u=(0,_.useRef)(null),d=(0,_.useCallback)(y=>{u.current=y,S(y)},[]),p=typeof t.goal=="string"?t.goal:JSON.stringify(t.goal),l=(0,_.useMemo)(()=>D(t.goal),[p]),a=U(t.goal);(0,_.useEffect)(()=>ee({id:e,variantIds:i,goal:a}),[e,i,a]);let w=(0,_.useRef)(null);(0,_.useEffect)(()=>{s||!n||!r||!c||w.current!==r&&(w.current=r,W(n,o,e,r,c))},[n,o,e,r,c,s]);let f=(0,_.useRef)(!1);(0,_.useEffect)(()=>{f.current=!1},[r,p]),(0,_.useEffect)(()=>{if(!s&&!(!n||!r||!c))return M(c,l,{fireGoal:()=>{f.current||(f.current=!0,n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:a,payload:{reward:1}}),n.goal(a,{componentId:e,variantId:r},1,0))},fireStep:(y,R,C)=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:y,payload:{reward:R}}),n.goal(y,{},R,C)}})},[n,c,r,o,e,l,a,s]),(0,_.useEffect)(()=>{if(s||!n||!r||!c)return;let y=Date.now();return(0,Qe.attachMicroSignalDetectors)((R,C={})=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"micro_signal",payload:E({signalType:R},C)})},c,y)},[n,c,r,o,e,s]),(0,_.useEffect)(()=>{if(!O()||!n)return;let y=setTimeout(()=>{!u.current&&!qe.has(e)&&(qe.add(e),console.warn(`[sentient] useAdaptive("${e}"): bind was never attached \u2014 spread {...bind} on the rendered element, otherwise exposure and goal tracking cannot work and the optimizer learns nothing.`))},0);return()=>clearTimeout(y)},[n,e]);let b=(0,_.useCallback)((y,R)=>{s||n==null||n.componentGoal(e,y!=null?y:a,R)},[n,e,a,s]),v=(0,_.useMemo)(()=>({ref:d,"data-sentient-id":e,"data-sentient-variant":r}),[d,e,r]);return{variant:r,value:m,bind:v,fireGoal:b}}var G=require("react");var et=require("react/jsx-runtime"),se=new Set;function Ze(e){var l;let t=k(),n=P(),o=(0,G.useRef)(null),i=(0,G.useMemo)(()=>Object.keys(e.arrangements),[e.id]),g=(0,G.useMemo)(()=>E({id:e.id,arms:i},e.baseline!==void 0?{baseline:e.baseline}:{}),[e.id,i,e.baseline]),{arm:s}=oe(e.id,g);O()&&e.baseline!==void 0&&e.baseline!==i[0]&&!se.has(e.id+":baseline")&&(se.add(e.id+":baseline"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: baseline "${e.baseline}" is not the first-declared arrangement ("${i[0]}"). The first arrangement should usually be the page's real incumbent (the holdout sees it).`));let r=G.Children.toArray(e.children).filter(G.isValidElement),m=new Map;for(let a of r)m.set(String((l=a.key)!=null?l:"").replace(/^\.\$/,""),a);let c=e.arrangements[s],S=c!==void 0&&c.length===r.length&&c.every(a=>m.has(a));O()&&c!==void 0&&!S&&!se.has(e.id+":keys")&&(se.add(e.id+":keys"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: arrangement "${s}" [${c.join(", ")}] does not match the children's keys \u2014 rendering declaration order (fail-safe).`));let u=S?c.map(a=>m.get(a)):r;(0,G.useEffect)(()=>te({id:e.id,arms:Object.keys(e.arrangements)}),[e.id]);let d=(0,G.useRef)(null);(0,G.useEffect)(()=>{!t||d.current===s||(d.current=s,W(t,n,e.id,s,o.current))},[t,n,e.id,s]);let p=e.goal===void 0?null:typeof e.goal=="string"?e.goal:JSON.stringify(e.goal);return(0,G.useEffect)(()=>{if(!t||e.goal===void 0)return;let a=o.current;if(!a)return;let w=U(e.goal),f=!1;return M(a,D(e.goal),{fireGoal:()=>{f||(f=!0,t.componentGoal(e.id,w))},fireStep:(b,v)=>{t.componentGoal(e.id,b,{reward:v})}})},[t,e.id,p,s]),(0,et.jsx)("div",{ref:o,"data-sentient-id":e.id,"data-sentient-variant":s,children:u})}var ce=require("@sentientui/core");var Et=["page","blocks","layoutOrder"],tt=new Map;function nt(e,t){tt.set(e,t)}function ue(e){return tt.get(e)}function it(e){var i,g;let t=(g=(i=e.content)!=null?i:ue(e.page))!=null?g:{},n={};for(let[s,r]of Object.entries(t))Et.includes(s)||(n[s]=r);let o=J(E({},n),{page:e.page,blocks:e.blocks});return e.layoutOrder&&(o.layoutOrder=e.layoutOrder),o}function rt(e){return`<script type="application/ld+json">${de(e)}</script>`}function de(e){return JSON.stringify(E({"@context":"https://schema.org","@type":"WebPage"},e)).replace(/</g,"\\u003c")}function ot(e){let t=[];e.title&&t.push(`# ${e.title}`,""),e.summary&&t.push(String(e.summary),"");for(let[n,o]of Object.entries(e))["page","title","summary","blocks","layoutOrder"].includes(n)||t.push(`## ${n}`,"","```json",JSON.stringify(o,null,2),"```","");if(e.blocks.length>0){t.push("## blocks","");for(let n of e.blocks)t.push(`- **${n.id}** \u2192 variant \`${n.variant}\``),n.content!==void 0&&t.push(""," ```json",JSON.stringify(n.content,null,2)," ```");t.push("")}return t.join(`
3
3
  `).trimEnd()+`
4
4
  `}0&&(module.exports={Adaptive,AdaptiveGroup,AdaptiveProvider,AdaptiveText,SentientPersonaScript,buildAgentFeed,defineAgentContent,detectSegment,getAgentContent,getWeights,renderAgentJsonLd,renderAgentJsonLdBody,renderAgentMarkdown,subscribeWeights,updateWeights,useAdaptive,useAdaptiveApiBaseUrl,useAdaptiveGoal,useAdaptiveTokens,useAssignment,useInitialAssignments,useLayoutOrder,useSentient});
5
5
  //# sourceMappingURL=index.js.map