@sentientui/react 0.15.6 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/dist/index.d.cts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/next/adaptive-root.d.ts +10 -4
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +1 -1
- package/dist/testing.mjs.map +1 -1
- package/package.json +3 -3
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
|
|
429
|
+
## Graph scanning & engagement capture (on by default)
|
|
430
430
|
|
|
431
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
|
109
|
-
*
|
|
110
|
-
*
|
|
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
|
-
*
|
|
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
|
|
109
|
-
*
|
|
110
|
-
*
|
|
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 J=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?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,O=(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},H=(e,t)=>ut(e,ft(t));var vt=(e,t)=>{for(var n in t)J(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&&J(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?J(n,"default",{value:e,enumerable:!0}):n,e)),yt=e=>Se(J({},"__esModule",{value:!0}),e);var Gt={};vt(Gt,{Adaptive:()=>We,AdaptiveGroup:()=>Ze,AdaptiveProvider:()=>Ge,AdaptiveText:()=>Fe,SentientPersonaScript:()=>Je,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:()=>U,useInitialAssignments:()=>ne,useLayoutOrder:()=>Ee,useSentient:()=>C});module.exports=yt(Gt);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 ke="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(ke,e),()=>window.removeEventListener(ke,e))}function Ce(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 _e(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 v,u;let[t,n]=(0,A.useState)(null),[o]=(0,A.useState)(()=>{var d;return(d=e.sessionSegment)!=null?d:wt()}),[i,p]=(0,A.useState)(ae());(0,A.useEffect)(()=>Ae(()=>p(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},g=!1,l=null,a=null,h=f=>{e.engagement!==!1&&import("@sentientui/core/engagement").then(({startEngagementCapture:w})=>{g||(a=w(f,{apiKey:e.apiKey,apiBase:e.apiBaseUrl?e.apiBaseUrl.replace(/\/$/,""):void 0}))})};return e.enableGraph!==!1?import("@sentientui/core/graph").then(({init:f})=>{g||(l=f(H(O({},d),{graph:!0})),n(l),h(l))}):(l=(0,N.init)(d),n(l),h(l)),()=>{g=!0,a==null||a(),l==null||l.dispose()}},[e.consent]),(0,A.useEffect)(()=>{if(!t)return;let d=!1,g=async()=>{if(d)return;let a;try{a=await t.fetchWeights()}catch(h){return}if(!d)for(let h of a){let f={componentId:h.componentId,updatedAt:h.updatedAt,variants:h.variants.map(w=>{var y;return{variantId:w.variantId,pulls:w.pulls,avgReward:(y=w.avgReward)!=null?y:0}})};Q(h.componentId,f)}};g();let l=setInterval(()=>{g()},6e4);return()=>{d=!0,clearInterval(l)}},[t]);let s=(v=e.ssrFallback)!=null?v:"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"||Ce({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&&_e(e.initialLayoutOrder)},[e.initialLayoutOrder]);let m=(0,A.useMemo)(()=>t&&i?xe(t):t,[t,i]),c=(0,A.useMemo)(()=>{var d,g,l,a;return{client:m,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}},[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 C(){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 Oe(){return(0,A.useContext)(I).ssrFallback}function re(){return(0,A.useContext)(I).onAssignment}function Ee(){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 p=i.indexOf(":");if(p!==-1&&i.slice(0,p)===e)return i.slice(p+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 U(e,t,n,o){let i=ne(),p=Oe(),s=C(),r=ie(),m=re(),c=(0,L.useRef)(null);(0,L.useSyncExternalStore)(K,Z,()=>0);let v=bt(e),u=v&&t.includes(v)?v:null,d=(0,L.useRef)(null);u&&d.current!==u&&(d.current=u,console.info(`[sentient] override active: ${e} -> ${u}`));let g=(()=>{var y,b;if(u)return{variantId:u,content:null,isLoading:!1};if(!s){let S=i[e];return S&&t.includes(S)?{variantId:S,content:null,isLoading:!1}:p==="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:(y=f.content)!=null?y:null,isLoading:!1};let w=Y(e);if(w){let S=Te(w,t);if(S)return{variantId:S,content:null,isLoading:!1}}return{variantId:(b=t[0])!=null?b:null,content:null,isLoading:!1}})(),[l,a]=(0,L.useState)(g),h=f=>{m&&c.current!==f&&(c.current=f,m(e,f))};return(0,L.useEffect)(()=>{var w;if(u||!s)return;let f=s.getAssignment(e,r);if(f&&(t.includes(f.variantId)||f.content)){a({variantId:f.variantId,content:(w=f.content)!=null?w:null,isLoading:!1}),h(f.variantId);return}a(y=>{var b;return y.variantId?y:{variantId:(b=t[0])!=null?b: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 w=!1;return s.assign(e,t,n,o).then(y=>{var b;w||y&&(!t.includes(y.variantId)&&!y.content||(a({variantId:y.variantId,content:(b=y.content)!=null?b:null,isLoading:!1}),h(y.variantId)))}),()=>{w=!0}},[u,s,e,r]),(0,L.useEffect)(()=>{if(!u&&s)return q(e,f=>{var b;let w=s.getAssignment(e,r);if(w&&(t.includes(w.variantId)||w.content)){a({variantId:w.variantId,content:(b=w.content)!=null?b:null,isLoading:!1});return}let y=Te(f,t);y&&a({variantId:y,content:null,isLoading:!1})})},[u,s,e,r]),u?{variantId:u,content:null,isLoading:!1,isOverride:!0}:l}function E(){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 $(e){return typeof e=="string"?e:e.type}function At(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(At(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:v,weight:u},d)=>{let g=()=>{r.has(d)||(r.add(d),n.fireStep(v,u,d))};if(c.type==="click"){let l=a=>{let h=a.target;h instanceof Element&&De(h,e,c.selector)&&g()};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)&&g()};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(h=>{for(let f of h)if(f.intersectionRatio>=l){g(),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)),p=r=>{i.delete(r),i.size===0&&n.fireGoal()},s=[];return o.forEach((r,m)=>{if(r.type==="click"){let c=v=>{let u=v.target;u instanceof Element&&De(u,e,r.selector)&&(t.type==="composite"?p(m):n.fireGoal())};e.addEventListener("click",c),s.push(()=>e.removeEventListener("click",c));return}if(r.type==="form_submit"){let c=v=>{v.target instanceof HTMLFormElement&&e.contains(v.target)&&(t.type==="composite"?p(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)),v=new IntersectionObserver(u=>{for(let d of u)if(d.intersectionRatio>=c){t.type==="composite"?p(m):n.fireGoal(),v.disconnect();break}},{threshold:[c]});v.observe(e),s.push(()=>v.disconnect());return}}),()=>{for(let r of s)r()}}function W(e,t,n,o){e.track({projectId:t,componentId:n,variantId:o,eventType:"variant_assigned",payload:{}})}var Be=require("react/jsx-runtime");function xt(e){var w;let t=C(),n=P(),o=(0,x.useMemo)(()=>Object.keys(e.variants),[e.variants]),{variantId:i,content:p,isOverride:s}=U(e.id,o,e.agentData,e.agentDataByVariant),r=(0,x.useRef)(null),[m,c]=(0,x.useState)(!1);(0,x.useEffect)(()=>{c(!0)},[]);let v=(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)(()=>{s||!t||!i||!n||d.current!==i&&(d.current=i,W(t,n,e.id,i))},[t,i,n,e.id,s]),(0,x.useEffect)(()=>{v.current=!1,u.current=new Set},[i,l]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let y=r.current;if(!y)return;let b=null,S=0,R=()=>{S=Date.now(),b=setTimeout(()=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"cursor_signal",payload:{hoverDuration:Date.now()-S}}),b=null},800)},_=()=>{b!==null&&(clearTimeout(b),b=null)};return y.addEventListener("mouseenter",R),y.addEventListener("mouseleave",_),()=>{y.removeEventListener("mouseenter",R),y.removeEventListener("mouseleave",_),b!==null&&clearTimeout(b)}},[t,i,n,e.id,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let y=r.current;if(!y)return;let b=Date.now();return(0,Me.attachMicroSignalDetectors)((S,R={})=>{var fe,ge,pe;t.track({projectId:n,componentId:e.id,variantId:i,eventType:"micro_signal",payload:O({signalType:S},R)});let _=(fe=e.microSignalGoals)==null?void 0:fe[S];if(!_||u.current.has(S))return;u.current.add(S);let st=typeof _=="string"?_:_.name,at=typeof _=="string"?1:(ge=_.weight)!=null?ge:1,lt=typeof _=="string"?0:(pe=_.stepIndex)!=null?pe:0;t.goal(st,O({signalType:S},R),at,lt)},y,b)},[t,i,n,e.id,e.microSignalGoals,s]),(0,x.useEffect)(()=>{if(s||!t||!i)return;let y=r.current;if(y)return M(y,l,{fireGoal:()=>{v.current||(v.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:(b,S,R)=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:b,payload:{reward:S}}),t.goal(b,{},S,R)}})},[t,i,n,e.id,l,a,s]),e.clientOnly&&(!m||!t)||!i)return null;let h=(w=e.variants[i])!=null?w:null,f=h===null?p:null;return E()&&h===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:h!=null?h:f})}var We=(0,x.memo)(xt,(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=C(),p=P(),s=re(),r=ie(),m=(0,B.useRef)(null),[c,v]=(0,B.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,B.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,B.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){E()&&console.warn(`[sentient] <AdaptiveText id="${e}"> assignment failed \u2014 showing default text.`);return}d(a.variantId),a.content&&v(a.content)}}),()=>{g=!0}},[i,e,r]),(0,B.useEffect)(()=>{!i||!u||!p||m.current!==u&&(m.current=u,i.track({projectId:p,componentId:e,variantId:u,eventType:"variant_assigned",payload:{}}),s==null||s(e,u))},[i,u,p,e,s]),(0,je.jsx)(n,{className:o,children:c!=null?c:t})}var Ke=require("react");function Ne(e){let t=C();return(0,Ke.useCallback)((n,o)=>{t==null||t.componentGoal(e,n,o)},[t,e])}var $e=require("@sentientui/core"),Ve=require("@sentientui/policy"),He=require("react/jsx-runtime");function Ue(e){return JSON.stringify(e).replace(/</g,"\\u003c")}function kt(e){return e.persona?'(function(){try{var d=document.documentElement;if(d.hasAttribute("data-sentient-persona"))return;d.setAttribute("data-sentient-persona",'+Ue(e.persona.persona)+');d.setAttribute("data-sentient-confidence",'+Ue((0,Ve.confidenceBand)(e.persona.confidence))+");}catch(e){}})();":(0,$e.renderPrePaintScript)(e.apiKey)}function Je(e){return(0,He.jsx)("script",{"data-sentient-persona-script":"",dangerouslySetInnerHTML:{__html:kt(e)}})}var T=require("react"),ze=require("@sentientui/policy");var V=require("react"),j=require("@sentientui/core"),Ct=require("@sentientui/policy");function oe(e,t){var v;(0,V.useSyncExternalStore)(K,Z,()=>0);let n=C(),o=Le(),[,i]=(0,V.useReducer)(u=>u+1,0),p=typeof window!="undefined"?(v=window.__sentient_slot_overrides)==null?void 0:v[e]:void 0,s=p===void 0?o[e]:void 0,r=p===void 0&&s===void 0&&n?n.getSlotResult(e):null,m=(n==null?void 0:n.isLocal)===!0&&p===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]),p!==void 0)return{result:p,arm:(0,j.armOfResult)(p),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 _t(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/"/g,'\\"')}function Xe(e,t,n){let o=C(),i=P(),p=(0,T.useMemo)(()=>({id:e,dims:t}),[e]),{result:s,arm:r}=oe(e,p),m=(0,T.useMemo)(()=>typeof s=="string"?{}:s,[r]);if(E()&&!le.has(e)){let d=(0,ze.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 v=(0,T.useRef)(null);(0,T.useEffect)(()=>{!o||v.current===r||(v.current=r,W(o,i,e,r))},[o,i,e,r]),(0,T.useEffect)(()=>{if(!o||!(n!=null&&n.goal))return;let d=document.querySelector(`[data-sentient-slot="${_t(e)}"]`);if(!d){E()&&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=$(n.goal),l=!1;return M(d,D(n.goal),{fireGoal:()=>{l||(l=!0,o.componentGoal(e,g))},fireStep:(a,h)=>{o.componentGoal(e,a,{reward:h})}})},[o,e,c,r]);let u=(0,T.useMemo)(()=>{let d={"data-sentient-slot":e};for(let[g,l]of Object.entries(m))d[`data-${g}`]=l;return d},[e,m]);return{tokens:m,props:u}}var k=require("react"),Qe=require("@sentientui/core");var qe=new Set;function Ye(e,t){var b;if(E()&&!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=C(),o=P(),i=(0,k.useMemo)(()=>Object.keys(t.variants),[e]),{variantId:p,isOverride:s}=U(e,i),r=(b=p!=null?p:i[0])!=null?b:"",m=t.variants[r],[c,v]=(0,k.useState)(null),u=(0,k.useRef)(null),d=(0,k.useCallback)(S=>{u.current=S,v(S)},[]),g=typeof t.goal=="string"?t.goal:JSON.stringify(t.goal),l=(0,k.useMemo)(()=>D(t.goal),[g]),a=$(t.goal);(0,k.useEffect)(()=>ee({id:e,variantIds:i,goal:a}),[e,i,a]);let h=(0,k.useRef)(null);(0,k.useEffect)(()=>{s||!n||!r||!c||h.current!==r&&(h.current=r,W(n,o,e,r))},[n,o,e,r,c,s]);let f=(0,k.useRef)(!1);(0,k.useEffect)(()=>{f.current=!1},[r,g]),(0,k.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:(S,R,_)=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:S,payload:{reward:R}}),n.goal(S,{},R,_)}})},[n,c,r,o,e,l,a,s]),(0,k.useEffect)(()=>{if(s||!n||!r||!c)return;let S=Date.now();return(0,Qe.attachMicroSignalDetectors)((R,_={})=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"micro_signal",payload:O({signalType:R},_)})},c,S)},[n,c,r,o,e,s]),(0,k.useEffect)(()=>{if(!E()||!n)return;let S=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(S)},[n,e]);let w=(0,k.useCallback)((S,R)=>{s||n==null||n.componentGoal(e,S!=null?S:a,R)},[n,e,a,s]),y=(0,k.useMemo)(()=>({ref:d,"data-sentient-id":e,"data-sentient-variant":r}),[d,e,r]);return{variant:r,value:m,bind:y,fireGoal:w}}var G=require("react");var et=require("react/jsx-runtime"),se=new Set;function Ze(e){var l;let t=C(),n=P(),o=(0,G.useRef)(null),i=(0,G.useMemo)(()=>Object.keys(e.arrangements),[e.id]),p=(0,G.useMemo)(()=>O({id:e.id,arms:i},e.baseline!==void 0?{baseline:e.baseline}:{}),[e.id,i,e.baseline]),{arm:s}=oe(e.id,p);E()&&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],v=c!==void 0&&c.length===r.length&&c.every(a=>m.has(a));E()&&c!==void 0&&!v&&!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=v?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))},[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 h=$(e.goal),f=!1;return M(a,D(e.goal),{fireGoal:()=>{f||(f=!0,t.componentGoal(e.id,h))},fireStep:(w,y)=>{t.componentGoal(e.id,w,{reward:y})}})},[t,e.id,g,s]),(0,et.jsx)("div",{ref:o,"data-sentient-id":e.id,"data-sentient-variant":s,children:u})}var ce=require("@sentientui/core");var Rt=["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,p;let t=(p=(i=e.content)!=null?i:ue(e.page))!=null?p:{},n={};for(let[s,r]of Object.entries(t))Rt.includes(s)||(n[s]=r);let o=H(O({},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(O({"@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
|