@sentientui/react 0.17.2 → 0.17.3
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/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- 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/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -244,6 +244,15 @@ type AssignmentState = {
|
|
|
244
244
|
/** Populated when the assigned variant is a dashboard-managed text variant. */
|
|
245
245
|
content: string | null;
|
|
246
246
|
isLoading: boolean;
|
|
247
|
+
/**
|
|
248
|
+
* True once `variantId` reflects a REAL decision — an SSR preload, the local
|
|
249
|
+
* assignment cache, a server `assign()`, live bandit weights, or a dev
|
|
250
|
+
* override — rather than the interim `variantIds[0]` placeholder shown while a
|
|
251
|
+
* decision is still in flight. Exposure tracking MUST gate on this: emitting
|
|
252
|
+
* `variant_assigned` for the placeholder accrues a phantom baseline
|
|
253
|
+
* impression that can never convert and dilutes that arm's CVR.
|
|
254
|
+
*/
|
|
255
|
+
settled: boolean;
|
|
247
256
|
/**
|
|
248
257
|
* True while a dev override (?sentient_variant= / window.__sentient_overrides)
|
|
249
258
|
* is forcing this variant. Consumers must suppress ALL tracking while set —
|
package/dist/index.d.ts
CHANGED
|
@@ -244,6 +244,15 @@ type AssignmentState = {
|
|
|
244
244
|
/** Populated when the assigned variant is a dashboard-managed text variant. */
|
|
245
245
|
content: string | null;
|
|
246
246
|
isLoading: boolean;
|
|
247
|
+
/**
|
|
248
|
+
* True once `variantId` reflects a REAL decision — an SSR preload, the local
|
|
249
|
+
* assignment cache, a server `assign()`, live bandit weights, or a dev
|
|
250
|
+
* override — rather than the interim `variantIds[0]` placeholder shown while a
|
|
251
|
+
* decision is still in flight. Exposure tracking MUST gate on this: emitting
|
|
252
|
+
* `variant_assigned` for the placeholder accrues a phantom baseline
|
|
253
|
+
* impression that can never convert and dilutes that arm's CVR.
|
|
254
|
+
*/
|
|
255
|
+
settled: boolean;
|
|
247
256
|
/**
|
|
248
257
|
* True while a dev override (?sentient_variant= / window.__sentient_overrides)
|
|
249
258
|
* is forcing this variant. Consumers must suppress ALL tracking while set —
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
"use strict";var ut=Object.create;var J=Object.defineProperty,dt=Object.defineProperties,ft=Object.getOwnPropertyDescriptor,gt=Object.getOwnPropertyDescriptors,pt=Object.getOwnPropertyNames,fe=Object.getOwnPropertySymbols,mt=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty,vt=Object.prototype.propertyIsEnumerable;var ge=(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={}))pe.call(t,n)&&ge(e,n,t[n]);if(fe)for(var n of fe(t))vt.call(t,n)&&ge(e,n,t[n]);return e},H=(e,t)=>dt(e,gt(t));var yt=(e,t)=>{for(var n in t)J(e,n,{get:t[n],enumerable:!0})},me=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of pt(t))!pe.call(e,i)&&i!==n&&J(e,i,{get:()=>t[i],enumerable:!(o=ft(t,i))||o.enumerable});return e};var ve=(e,t,n)=>(n=e!=null?ut(mt(e)):{},me(t||!e||!e.__esModule?J(n,"default",{value:e,enumerable:!0}):n,e)),St=e=>me(J({},"__esModule",{value:!0}),e);var Et={};yt(Et,{Adaptive:()=>Be,AdaptiveGroup:()=>et,AdaptiveProvider:()=>Ge,AdaptiveText:()=>Ke,SentientPersonaScript:()=>He,buildAgentFeed:()=>rt,defineAgentContent:()=>it,detectSegment:()=>se.deriveSessionSegment,getAgentContent:()=>ae,renderAgentJsonLd:()=>ot,renderAgentJsonLdBody:()=>le,renderAgentMarkdown:()=>st,useAdaptive:()=>Ze,useAdaptiveApiBaseUrl:()=>Te,useAdaptiveGoal:()=>Ue,useAdaptiveTokens:()=>qe,useAssignment:()=>U,useInitialAssignments:()=>Z,useLayoutOrder:()=>Le,useSentient:()=>_});module.exports=St(Et);var x=require("react"),N=require("@sentientui/core");var ye=new Map,X=new Map;function Se(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 he(e,t){ye.set(e,t);let n=X.get(e);if(n)for(let o of n)try{o(t)}catch(i){}}function be(e){var t;return(t=ye.get(e))!=null?t:null}var ht={on:!1,listeners:new Set};function we(){if(typeof window=="undefined")return ht;let e=window;return e.__sentient_preview||(e.__sentient_preview={on:!1,listeners:new Set}),e.__sentient_preview}function re(){return we().on}function Ae(e){let t=we().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 q(){var e;return typeof window=="undefined"?0:(e=window.__sentient_overrides_version)!=null?e:0}function j(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 bt={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0};function W(){if(typeof window=="undefined")return bt;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(){W().version+=1;for(let e of W().listeners)e()}function Q(e){return W().components.set(e.id,e),z(),()=>{W().components.delete(e.id),z()}}function Y(e){return W().slots.set(e.id,e),z(),()=>{W().slots.delete(e.id),z()}}function _e(e){W().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",T=(0,x.createContext)({client:null,apiKey:"",initialAssignments:{},sessionSegment:"desktop:direct",ssrFallback:"first",onAssignment:void 0,initialLayoutOrder:null,initialSlots:{},initialPersona:null,apiBaseUrl:Re,debug:!1});function Ge(e){var S,b;let[t,n]=(0,x.useState)(null),[o]=(0,x.useState)(()=>{var a;return(a=e.sessionSegment)!=null?a:wt()}),[i,c]=(0,x.useState)(re());(0,x.useEffect)(()=>Ae(()=>c(re())),[]),(0,x.useEffect)(()=>{if(e.consent===!1&&!e.preConsentBehavior){n(w=>(w==null||w.destroy(),null));return}let a={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,f=null,l=null,m=w=>{e.engagement!==!1&&import("@sentientui/core/engagement").then(({startEngagementCapture:v})=>{p||(l=v(w,{apiKey:e.apiKey,apiBase:e.apiBaseUrl?e.apiBaseUrl.replace(/\/$/,""):void 0}))})};return e.enableGraph!==!1?import("@sentientui/core/graph").then(({init:w})=>{p||(f=w(H(O({},a),{graph:!0})),n(f),m(f))}):(f=(0,N.init)(a),n(f),m(f)),()=>{p=!0,l==null||l(),f==null||f.dispose()}},[e.consent]),(0,x.useEffect)(()=>{if(!t)return;let a=!1,p=async()=>{if(a)return;let l;try{l=await t.fetchWeights()}catch(m){return}if(!a)for(let m of l){let w={componentId:m.componentId,updatedAt:m.updatedAt,variants:m.variants.map(v=>{var h;return{variantId:v.variantId,pulls:v.pulls,avgReward:(h=v.avgReward)!=null?h:0}})};he(m.componentId,w)}};p();let f=setInterval(()=>{p()},6e4);return()=>{a=!0,clearInterval(f)}},[t]);let s=(S=e.ssrFallback)!=null?S:"first",r=(b=e.apiBaseUrl)!=null?b:Re;(0,x.useEffect)(()=>{var a;typeof process!="undefined"&&((a=process.env)==null?void 0:a.NODE_ENV)==="production"||Ce({apiKey:e.apiKey,apiBaseUrl:r,isLocal:(t==null?void 0:t.isLocal)===!0})},[t,e.apiKey,r]),(0,x.useEffect)(()=>{e.initialLayoutOrder&&e.initialLayoutOrder.length>0&&_e(e.initialLayoutOrder)},[e.initialLayoutOrder]);let y=(0,x.useMemo)(()=>t&&i?xe(t):t,[t,i]),d=(0,x.useMemo)(()=>{var a,p,f,l,m;return{client:y,apiKey:e.apiKey,initialAssignments:(a=e.initialAssignments)!=null?a:{},sessionSegment:o,ssrFallback:s,onAssignment:e.onAssignment,initialLayoutOrder:(p=e.initialLayoutOrder)!=null?p:null,initialSlots:(f=e.initialSlots)!=null?f:{},initialPersona:(l=e.initialPersona)!=null?l:null,apiBaseUrl:r,debug:(m=e.debug)!=null?m:!1}},[y,e.apiKey,e.initialAssignments,o,s,e.onAssignment,e.initialLayoutOrder,e.initialSlots,e.initialPersona,r,e.debug]);return(0,Pe.jsx)(T.Provider,{value:d,children:e.children})}function _(){return(0,x.useContext)(T).client}function P(){return(0,x.useContext)(T).apiKey}function Z(){return(0,x.useContext)(T).initialAssignments}function ee(){return(0,x.useContext)(T).sessionSegment}function Ee(){return(0,x.useContext)(T).ssrFallback}function te(){return(0,x.useContext)(T).onAssignment}function Oe(){return(0,x.useContext)(T).debug}function Le(){let e=(0,x.useContext)(T).initialLayoutOrder,t=(0,x.useSyncExternalStore)(j,()=>{var n;return typeof window=="undefined"?null:(n=window.__sentient_layout_override)!=null?n:null},()=>null);return t!=null?t:e}function Ie(){return(0,x.useContext)(T).initialSlots}function Te(){return(0,x.useContext)(T).apiBaseUrl}var k=require("react"),Fe=require("@sentientui/core");var I=require("react");function At(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 c=i.indexOf(":");if(c!==-1&&i.slice(0,c)===e)return i.slice(c+1)}}catch(o){}return null}function De(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=Z(),c=Ee(),s=_(),r=ee(),y=te(),d=Oe(),S=(0,I.useRef)(null);(0,I.useSyncExternalStore)(j,q,()=>0);let b=At(e),a=b&&t.includes(b)?b:null,p=(0,I.useRef)(null);(0,I.useEffect)(()=>{d&&a&&p.current!==a&&(p.current=a,console.info(`[sentient] override active: ${e} -> ${a}`))},[d,a,e]);let f=(()=>{var g,u;if(a)return{variantId:a,content:null,isLoading:!1};if(!s){let A=i[e];return A&&t.includes(A)?{variantId:A,content:null,isLoading:!1}:c==="first"&&t.length>0?{variantId:t[0],content:null,isLoading:!1}:{variantId:null,content:null,isLoading:!0}}let v=s.getAssignment(e,r);if(v&&(t.includes(v.variantId)||v.content))return{variantId:v.variantId,content:(g=v.content)!=null?g:null,isLoading:!1};let h=be(e);if(h){let A=De(h,t);if(A)return{variantId:A,content:null,isLoading:!1}}return{variantId:(u=t[0])!=null?u:null,content:null,isLoading:!1}})(),[l,m]=(0,I.useState)(f),w=v=>{y&&S.current!==v&&(S.current=v,y(e,v))};return(0,I.useEffect)(()=>{var h;if(a||!s)return;let v=s.getAssignment(e,r);if(v&&(t.includes(v.variantId)||v.content)){m({variantId:v.variantId,content:(h=v.content)!=null?h:null,isLoading:!1}),w(v.variantId);return}m(g=>{var u;return g.variantId?g:{variantId:(u=t[0])!=null?u:null,content:null,isLoading:!1}})},[a,s,e,r]),(0,I.useEffect)(()=>{if(a||!s)return;let v=s.getAssignment(e,r);if(v&&t.includes(v.variantId))return;let h=!1;return s.assign(e,t,n,o).then(g=>{var u;h||g&&(!t.includes(g.variantId)&&!g.content||(m({variantId:g.variantId,content:(u=g.content)!=null?u:null,isLoading:!1}),w(g.variantId)))}),()=>{h=!0}},[a,s,e,r]),(0,I.useEffect)(()=>{if(!a&&s)return Se(e,v=>{var u;let h=s.getAssignment(e,r);if(h&&(t.includes(h.variantId)||h.content)){m({variantId:h.variantId,content:(u=h.content)!=null?u:null,isLoading:!1});return}let g=De(v,t);g&&m({variantId:g,content:null,isLoading:!1})})},[a,s,e,r]),a?{variantId:a,content:null,isLoading:!1,isOverride:!0}:l}function L(){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 xt(e){if(!(e instanceof Element))return!1;let t=e.tagName.toLowerCase();return t==="a"||t==="button"?!0:e.getAttribute("role")==="button"}function Me(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(xt(o))return!0;o=o.parentElement}return!1}function M(e,t,n){if(t.type==="weighted_composite"){let r=new Set,y=[];return t.steps.forEach(({goal:d,name:S,weight:b},a)=>{let p=()=>{r.has(a)||(r.add(a),n.fireStep(S,b,a))};if(d.type==="click"){let f=l=>{let m=l.target;m instanceof Element&&Me(m,e,d.selector)&&p()};e.addEventListener("click",f),y.push(()=>e.removeEventListener("click",f));return}if(d.type==="form_submit"){let f=l=>{l.target instanceof HTMLFormElement&&e.contains(l.target)&&p()};e.addEventListener("submit",f),y.push(()=>e.removeEventListener("submit",f));return}if(d.type==="scroll_depth"){let f=Math.max(0,Math.min(1,d.threshold)),l=new IntersectionObserver(m=>{for(let w of m)if(w.intersectionRatio>=f){p(),l.disconnect();break}},{threshold:[f]});l.observe(e),y.push(()=>l.disconnect())}}),()=>{for(let d of y)d()}}let o=t.type==="composite"?t.all:[t],i=new Set(o.map((r,y)=>y)),c=r=>{i.delete(r),i.size===0&&n.fireGoal()},s=[];return o.forEach((r,y)=>{if(r.type==="click"){let d=S=>{let b=S.target;b instanceof Element&&Me(b,e,r.selector)&&(t.type==="composite"?c(y):n.fireGoal())};e.addEventListener("click",d),s.push(()=>e.removeEventListener("click",d));return}if(r.type==="form_submit"){let d=S=>{S.target instanceof HTMLFormElement&&e.contains(S.target)&&(t.type==="composite"?c(y):n.fireGoal())};e.addEventListener("submit",d),s.push(()=>e.removeEventListener("submit",d));return}if(r.type==="scroll_depth"){let d=Math.max(0,Math.min(1,r.threshold)),S=new IntersectionObserver(b=>{for(let a of b)if(a.intersectionRatio>=d){t.type==="composite"?c(y):n.fireGoal(),S.disconnect();break}},{threshold:[d]});S.observe(e),s.push(()=>S.disconnect());return}}),()=>{for(let r of s)r()}}function B(e,t,n,o){e.track({projectId:t,componentId:n,variantId:o,eventType:"variant_assigned",payload:{}})}var We=require("react/jsx-runtime");function kt(e){var v;let t=_(),n=P(),o=(0,k.useMemo)(()=>Object.keys(e.variants),[e.variants]),{variantId:i,content:c,isOverride:s}=U(e.id,o,e.agentData,e.agentDataByVariant),r=(0,k.useRef)(null),[y,d]=(0,k.useState)(!1);(0,k.useEffect)(()=>{d(!0)},[]);let S=(0,k.useRef)(!1),b=(0,k.useRef)(new Set),a=(0,k.useRef)(null),p=typeof e.goal=="string"?e.goal:JSON.stringify(e.goal),f=(0,k.useMemo)(()=>D(e.goal),[p]),l=typeof e.goal=="string"?e.goal:f.type;if((0,k.useEffect)(()=>Q({id:e.id,variantIds:o,goal:l}),[e.id,o,l]),(0,k.useEffect)(()=>{s||!t||!i||!n||a.current!==i&&(a.current=i,B(t,n,e.id,i))},[t,i,n,e.id,s]),(0,k.useEffect)(()=>{S.current=!1,b.current=new Set},[i,f]),(0,k.useEffect)(()=>{if(s||!t||!i)return;let h=r.current;if(!h)return;let g=null,u=0,A=()=>{u=Date.now(),g=setTimeout(()=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"cursor_signal",payload:{hoverDuration:Date.now()-u}}),g=null},800)},R=()=>{g!==null&&(clearTimeout(g),g=null)};return h.addEventListener("mouseenter",A),h.addEventListener("mouseleave",R),()=>{h.removeEventListener("mouseenter",A),h.removeEventListener("mouseleave",R),g!==null&&clearTimeout(g)}},[t,i,n,e.id,s]),(0,k.useEffect)(()=>{if(s||!t||!i)return;let h=r.current;if(!h)return;let g=Date.now();return(0,Fe.attachMicroSignalDetectors)((u,A={})=>{var ce,ue,de;t.track({projectId:n,componentId:e.id,variantId:i,eventType:"micro_signal",payload:O({signalType:u},A)});let R=(ce=e.microSignalGoals)==null?void 0:ce[u];if(!R||b.current.has(u))return;b.current.add(u);let at=typeof R=="string"?R:R.name,lt=typeof R=="string"?1:(ue=R.weight)!=null?ue:1,ct=typeof R=="string"?0:(de=R.stepIndex)!=null?de:0;t.goal(at,O({signalType:u},A),lt,ct)},h,g)},[t,i,n,e.id,e.microSignalGoals,s]),(0,k.useEffect)(()=>{if(s||!t||!i)return;let h=r.current;if(h)return M(h,f,{fireGoal:()=>{S.current||(S.current=!0,t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:l,payload:{reward:1}}),t.goal(l,{componentId:e.id,variantId:i},1,0))},fireStep:(g,u,A)=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:g,payload:{reward:u}}),t.goal(g,{},u,A)}})},[t,i,n,e.id,f,l,s]),e.clientOnly&&(!y||!t)||!i)return null;let m=(v=e.variants[i])!=null?v:null,w=m===null?c:null;return L()&&m===null&&w===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:m!=null?m:w})}var Be=(0,k.memo)(kt,(e,t)=>{if(e.id!==t.id||e.goal!==t.goal&&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 G=require("react");var je=require("react/jsx-runtime");function Ke({id:e,default:t,component:n="span",className:o,goal:i}){let c=_(),s=P(),r=te(),y=ee(),d=(0,G.useRef)(null),S=(0,G.useRef)(null),[b,a]=(0,G.useState)(()=>{var g,u;return(u=(g=c==null?void 0:c.getAssignment(e,y))==null?void 0:g.content)!=null?u:null}),[p,f]=(0,G.useState)(()=>{var g,u;return(u=(g=c==null?void 0:c.getAssignment(e,y))==null?void 0:g.variantId)!=null?u:null});(0,G.useEffect)(()=>{var u;if(!c||((u=c.getAssignment(e,y))==null?void 0:u.content)!==void 0)return;let g=!1;return c.assign(e).then(A=>{if(!g){if(!A){L()&&console.warn(`[sentient] <AdaptiveText id="${e}"> assignment failed \u2014 showing default text.`);return}f(A.variantId),A.content&&a(A.content)}}),()=>{g=!0}},[c,e,y]),(0,G.useEffect)(()=>{!c||!p||!s||d.current!==p&&(d.current=p,c.track({projectId:s,componentId:e,variantId:p,eventType:"variant_assigned",payload:{}}),r==null||r(e,p))},[c,p,s,e,r]);let l=i===void 0?"":typeof i=="string"?i:JSON.stringify(i),m=(0,G.useMemo)(()=>i===void 0?null:D(i),[l]),w=i===void 0?null:typeof i=="string"?i:m.type,v=(0,G.useRef)(!1);return(0,G.useEffect)(()=>{v.current=!1},[p,l]),(0,G.useEffect)(()=>{if(!c||!p||!s||!m||!w)return;let g=S.current;if(g)return M(g,m,{fireGoal:()=>{v.current||(v.current=!0,c.track({projectId:s,componentId:e,variantId:p,eventType:"goal_achieved",goalType:w,payload:{reward:1}}),c.goal(w,{componentId:e,variantId:p},1,0))},fireStep:(u,A,R)=>{c.track({projectId:s,componentId:e,variantId:p,eventType:"goal_achieved",goalType:u,payload:{reward:A}}),c.goal(u,{},A,R)}})},[c,p,s,e,m,w]),(0,je.jsx)(n,{ref:g=>{S.current=g},className:o,children:b!=null?b:t})}var Ne=require("react");function Ue(e){let t=_();return(0,Ne.useCallback)((n,o)=>{t==null||t.componentGoal(e,n,o)},[t,e])}var Ve=require("@sentientui/core"),Je=require("@sentientui/policy"),ze=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,Je.confidenceBand)(e.persona.confidence))+");}catch(e){}})();":(0,Ve.renderPrePaintScript)(e.apiKey)}function He(e){return(0,ze.jsx)("script",{"data-sentient-persona-script":"",dangerouslySetInnerHTML:{__html:Ct(e)}})}var F=require("react"),Xe=require("@sentientui/policy");var V=require("react"),K=require("@sentientui/core"),_t=require("@sentientui/policy");function ne(e,t){var S;(0,V.useSyncExternalStore)(j,q,()=>0);let n=_(),o=Ie(),[,i]=(0,V.useReducer)(b=>b+1,0),c=typeof window!="undefined"?(S=window.__sentient_slot_overrides)==null?void 0:S[e]:void 0,s=c===void 0?o[e]:void 0,r=c===void 0&&s===void 0&&n?n.getSlotResult(e):null,y=(n==null?void 0:n.isLocal)===!0&&c===void 0&&s===void 0&&r===null;if((0,V.useEffect)(()=>{if(!y||!n)return;let b=!1;return n.decide({slots:[t]}).then(a=>{!b&&a&&i()}),()=>{b=!0}},[n,e,y]),c!==void 0)return{result:c,arm:(0,K.armOfResult)(c),source:"override"};if(s!==void 0)return{result:s,arm:(0,K.armOfResult)(s),source:"preloaded"};if(r!==null)return{result:r,arm:(0,K.armOfResult)(r),source:"client"};let d=(0,K.baselineResultFor)(t);return{result:d,arm:(0,K.armOfResult)(d),source:"baseline"}}var oe=new Set;function Rt(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/"/g,'\\"')}function qe(e,t,n){let o=_(),i=P(),c=(0,F.useMemo)(()=>({id:e,dims:t}),[e]),{result:s,arm:r}=ne(e,c),y=(0,F.useMemo)(()=>typeof s=="string"?{}:s,[r]);if(L()&&!oe.has(e)){let a=(0,Xe.validateSlotDecl)({id:e,dims:Object.fromEntries(Object.entries(t).map(([f,l])=>[f,[...l]]))}),p=Object.values(t).reduce((f,l)=>f*l.length,1);a.ok?p>4&&(oe.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.`)):(oe.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}"): invalid declaration \u2014 ${a.reason}. Serving baseline.`))}let d=(n==null?void 0:n.goal)===void 0?null:typeof n.goal=="string"?n.goal:JSON.stringify(n.goal);(0,F.useEffect)(()=>Y({id:e,dims:t}),[e]);let S=(0,F.useRef)(null);(0,F.useEffect)(()=>{!o||S.current===r||(S.current=r,B(o,i,e,r))},[o,i,e,r]),(0,F.useEffect)(()=>{if(!o||!(n!=null&&n.goal))return;let a=document.querySelector(`[data-sentient-slot="${Rt(e)}"]`);if(!a){L()&&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=$(n.goal),f=!1;return M(a,D(n.goal),{fireGoal:()=>{f||(f=!0,o.componentGoal(e,p))},fireStep:(l,m)=>{o.componentGoal(e,l,{reward:m})}})},[o,e,d,r]);let b=(0,F.useMemo)(()=>{let a={"data-sentient-slot":e};for(let[p,f]of Object.entries(y))a[`data-${p}`]=f;return a},[e,y]);return{tokens:y,props:b}}var C=require("react"),Ye=require("@sentientui/core");var Qe=new Set;function Ze(e,t){var g;if(L()&&!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=_(),o=P(),i=(0,C.useMemo)(()=>Object.keys(t.variants),[e]),{variantId:c,isOverride:s}=U(e,i),r=(g=c!=null?c:i[0])!=null?g:"",y=t.variants[r],[d,S]=(0,C.useState)(null),b=(0,C.useRef)(null),a=(0,C.useCallback)(u=>{b.current=u,S(u)},[]),p=typeof t.goal=="string"?t.goal:JSON.stringify(t.goal),f=(0,C.useMemo)(()=>D(t.goal),[p]),l=$(t.goal);(0,C.useEffect)(()=>Q({id:e,variantIds:i,goal:l}),[e,i,l]);let m=(0,C.useRef)(null);(0,C.useEffect)(()=>{s||!n||!r||!d||m.current!==r&&(m.current=r,B(n,o,e,r))},[n,o,e,r,d,s]);let w=(0,C.useRef)(!1);(0,C.useEffect)(()=>{w.current=!1},[r,p]),(0,C.useEffect)(()=>{if(!s&&!(!n||!r||!d))return M(d,f,{fireGoal:()=>{w.current||(w.current=!0,n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:l,payload:{reward:1}}),n.goal(l,{componentId:e,variantId:r},1,0))},fireStep:(u,A,R)=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"goal_achieved",goalType:u,payload:{reward:A}}),n.goal(u,{},A,R)}})},[n,d,r,o,e,f,l,s]),(0,C.useEffect)(()=>{if(s||!n||!r||!d)return;let u=Date.now();return(0,Ye.attachMicroSignalDetectors)((A,R={})=>{n.track({projectId:o,componentId:e,variantId:r,eventType:"micro_signal",payload:O({signalType:A},R)})},d,u)},[n,d,r,o,e,s]),(0,C.useEffect)(()=>{if(!L()||!n)return;let u=setTimeout(()=>{!b.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(u)},[n,e]);let v=(0,C.useCallback)((u,A)=>{s||n==null||n.componentGoal(e,u!=null?u:l,A)},[n,e,l,s]),h=(0,C.useMemo)(()=>({ref:a,"data-sentient-id":e,"data-sentient-variant":r}),[a,e,r]);return{variant:r,value:y,bind:h,fireGoal:v}}var E=require("react");var tt=require("react/jsx-runtime"),ie=new Set;function et(e){var f;let t=_(),n=P(),o=(0,E.useRef)(null),i=(0,E.useMemo)(()=>Object.keys(e.arrangements),[e.id]),c=(0,E.useMemo)(()=>O({id:e.id,arms:i},e.baseline!==void 0?{baseline:e.baseline}:{}),[e.id,i,e.baseline]),{arm:s}=ne(e.id,c);L()&&e.baseline!==void 0&&e.baseline!==i[0]&&!ie.has(e.id+":baseline")&&(ie.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=E.Children.toArray(e.children).filter(E.isValidElement),y=new Map;for(let l of r)y.set(String((f=l.key)!=null?f:"").replace(/^\.\$/,""),l);let d=e.arrangements[s],S=d!==void 0&&d.length===r.length&&d.every(l=>y.has(l));L()&&d!==void 0&&!S&&!ie.has(e.id+":keys")&&(ie.add(e.id+":keys"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: arrangement "${s}" [${d.join(", ")}] does not match the children's keys \u2014 rendering declaration order (fail-safe).`));let b=S?d.map(l=>y.get(l)):r;(0,E.useEffect)(()=>Y({id:e.id,arms:Object.keys(e.arrangements)}),[e.id]);let a=(0,E.useRef)(null);(0,E.useEffect)(()=>{!t||a.current===s||(a.current=s,B(t,n,e.id,s))},[t,n,e.id,s]);let p=e.goal===void 0?null:typeof e.goal=="string"?e.goal:JSON.stringify(e.goal);return(0,E.useEffect)(()=>{if(!t||e.goal===void 0)return;let l=o.current;if(!l)return;let m=$(e.goal),w=!1;return M(l,D(e.goal),{fireGoal:()=>{w||(w=!0,t.componentGoal(e.id,m))},fireStep:(v,h)=>{t.componentGoal(e.id,v,{reward:h})}})},[t,e.id,p,s]),(0,tt.jsx)("div",{ref:o,"data-sentient-id":e.id,"data-sentient-variant":s,children:b})}var se=require("@sentientui/core");var Gt=["page","blocks","layoutOrder"],nt=new Map;function it(e,t){nt.set(e,t)}function ae(e){return nt.get(e)}function rt(e){var i,c;let t=(c=(i=e.content)!=null?i:ae(e.page))!=null?c:{},n={};for(let[s,r]of Object.entries(t))Gt.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 ot(e){return`<script type="application/ld+json">${le(e)}</script>`}function le(e){return JSON.stringify(O({"@context":"https://schema.org","@type":"WebPage"},e)).replace(/</g,"\\u003c")}function st(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 ft=Object.create;var H=Object.defineProperty,gt=Object.defineProperties,pt=Object.getOwnPropertyDescriptor,mt=Object.getOwnPropertyDescriptors,vt=Object.getOwnPropertyNames,ge=Object.getOwnPropertySymbols,yt=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty,St=Object.prototype.propertyIsEnumerable;var pe=(e,t,n)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,T=(e,t)=>{for(var n in t||(t={}))me.call(t,n)&&pe(e,n,t[n]);if(ge)for(var n of ge(t))St.call(t,n)&&pe(e,n,t[n]);return e},z=(e,t)=>gt(e,mt(t));var ht=(e,t)=>{for(var n in t)H(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of vt(t))!me.call(e,i)&&i!==n&&H(e,i,{get:()=>t[i],enumerable:!(o=pt(t,i))||o.enumerable});return e};var ye=(e,t,n)=>(n=e!=null?ft(yt(e)):{},ve(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e)),bt=e=>ve(H({},"__esModule",{value:!0}),e);var It={};ht(It,{Adaptive:()=>We,AdaptiveGroup:()=>nt,AdaptiveProvider:()=>Ee,AdaptiveText:()=>je,SentientPersonaScript:()=>ze,buildAgentFeed:()=>st,defineAgentContent:()=>ot,detectSegment:()=>ae.deriveSessionSegment,getAgentContent:()=>le,renderAgentJsonLd:()=>at,renderAgentJsonLdBody:()=>ue,renderAgentMarkdown:()=>lt,useAdaptive:()=>tt,useAdaptiveApiBaseUrl:()=>Pe,useAdaptiveGoal:()=>$e,useAdaptiveTokens:()=>Ye,useAssignment:()=>V,useInitialAssignments:()=>ee,useLayoutOrder:()=>Ie,useSentient:()=>R});module.exports=bt(It);var A=require("react"),$=require("@sentientui/core");var Se=new Map,q=new Map;function he(e,t){let n=q.get(e);return n||(n=new Set,q.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&q.delete(e)}}function be(e,t){Se.set(e,t);let n=q.get(e);if(n)for(let o of n)try{o(t)}catch(i){}}function we(e){var t;return(t=Se.get(e))!=null?t:null}var wt={on:!1,listeners:new Set};function Ae(){if(typeof window=="undefined")return wt;let e=window;return e.__sentient_preview||(e.__sentient_preview={on:!1,listeners:new Set}),e.__sentient_preview}function oe(){return Ae().on}function xe(e){let t=Ae().listeners;return t.add(e),()=>{t.delete(e)}}function ke(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 Ce="sentient:overrides-changed";function Q(){var e;return typeof window=="undefined"?0:(e=window.__sentient_overrides_version)!=null?e:0}function U(e){return typeof window=="undefined"?()=>{}:(window.addEventListener(Ce,e),()=>window.removeEventListener(Ce,e))}function _e(e){typeof window!="undefined"&&(window.__sentient_devtools_config=e)}var At={components:new Map,slots:new Map,sections:[],listeners:new Set,version:0};function K(){if(typeof window=="undefined")return At;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 X(){K().version+=1;for(let e of K().listeners)e()}function Y(e){return K().components.set(e.id,e),X(),()=>{K().components.delete(e.id),X()}}function Z(e){return K().slots.set(e.id,e),X(),()=>{K().slots.delete(e.id),X()}}function Re(e){K().sections=[...e],X()}var De=require("react/jsx-runtime");function xt(){var e,t;if(typeof window=="undefined")return"desktop:direct";try{let n=(0,$.detectDeviceClass)((e=navigator.userAgent)!=null?e:""),o=(0,$.detectTrafficSource)((t=document.referrer)!=null?t:"",window.location.origin);return`${n}:${o}`}catch(n){return"desktop:direct"}}var Ge="https://api.sentient-ui.com/v1",P=(0,A.createContext)({client:null,apiKey:"",initialAssignments:{},sessionSegment:"desktop:direct",ssrFallback:"first",onAssignment:void 0,initialLayoutOrder:null,initialSlots:{},initialPersona:null,apiBaseUrl:Ge,debug:!1});function Ee(e){var m,h;let[t,n]=(0,A.useState)(null),[o]=(0,A.useState)(()=>{var S;return(S=e.sessionSegment)!=null?S:xt()}),[i,a]=(0,A.useState)(oe());(0,A.useEffect)(()=>xe(()=>a(oe())),[]),(0,A.useEffect)(()=>{if(e.consent===!1&&!e.preConsentBehavior){n(b=>(b==null||b.destroy(),null));return}let S={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,u=null,p=null,c=b=>{e.engagement!==!1&&import("@sentientui/core/engagement").then(({startEngagementCapture:x})=>{g||(p=x(b,{apiKey:e.apiKey,apiBase:e.apiBaseUrl?e.apiBaseUrl.replace(/\/$/,""):void 0}))})};return e.enableGraph!==!1?import("@sentientui/core/graph").then(({init:b})=>{g||(u=b(z(T({},S),{graph:!0})),n(u),c(u))}):(u=(0,$.init)(S),n(u),c(u)),()=>{g=!0,p==null||p(),u==null||u.dispose()}},[e.consent]),(0,A.useEffect)(()=>{if(!t)return;let S=!1,g=async()=>{if(S)return;let p;try{p=await t.fetchWeights()}catch(c){return}if(!S)for(let c of p){let b={componentId:c.componentId,updatedAt:c.updatedAt,variants:c.variants.map(x=>{var I;return{variantId:x.variantId,pulls:x.pulls,avgReward:(I=x.avgReward)!=null?I:0}})};be(c.componentId,b)}};g();let u=setInterval(()=>{g()},6e4);return()=>{S=!0,clearInterval(u)}},[t]);let r=(m=e.ssrFallback)!=null?m:"first",s=(h=e.apiBaseUrl)!=null?h:Ge;(0,A.useEffect)(()=>{var S;typeof process!="undefined"&&((S=process.env)==null?void 0:S.NODE_ENV)==="production"||_e({apiKey:e.apiKey,apiBaseUrl:s,isLocal:(t==null?void 0:t.isLocal)===!0})},[t,e.apiKey,s]),(0,A.useEffect)(()=>{e.initialLayoutOrder&&e.initialLayoutOrder.length>0&&Re(e.initialLayoutOrder)},[e.initialLayoutOrder]);let l=(0,A.useMemo)(()=>t&&i?ke(t):t,[t,i]),y=(0,A.useMemo)(()=>{var S,g,u,p,c;return{client:l,apiKey:e.apiKey,initialAssignments:(S=e.initialAssignments)!=null?S:{},sessionSegment:o,ssrFallback:r,onAssignment:e.onAssignment,initialLayoutOrder:(g=e.initialLayoutOrder)!=null?g:null,initialSlots:(u=e.initialSlots)!=null?u:{},initialPersona:(p=e.initialPersona)!=null?p:null,apiBaseUrl:s,debug:(c=e.debug)!=null?c:!1}},[l,e.apiKey,e.initialAssignments,o,r,e.onAssignment,e.initialLayoutOrder,e.initialSlots,e.initialPersona,s,e.debug]);return(0,De.jsx)(P.Provider,{value:y,children:e.children})}function R(){return(0,A.useContext)(P).client}function D(){return(0,A.useContext)(P).apiKey}function ee(){return(0,A.useContext)(P).initialAssignments}function te(){return(0,A.useContext)(P).sessionSegment}function Le(){return(0,A.useContext)(P).ssrFallback}function ne(){return(0,A.useContext)(P).onAssignment}function Oe(){return(0,A.useContext)(P).debug}function Ie(){let e=(0,A.useContext)(P).initialLayoutOrder,t=(0,A.useSyncExternalStore)(U,()=>{var n;return typeof window=="undefined"?null:(n=window.__sentient_layout_override)!=null?n:null},()=>null);return t!=null?t:e}function Te(){return(0,A.useContext)(P).initialSlots}function Pe(){return(0,A.useContext)(P).apiBaseUrl}var C=require("react"),Fe=require("@sentientui/core");var E=require("react");function kt(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 a=i.indexOf(":");if(a!==-1&&i.slice(0,a)===e)return i.slice(a+1)}}catch(o){}return null}var Ct=5;function Me(e,t){var o,i;let n=null;for(let a of e.variants){if(!t.includes(a.variantId))continue;let r=(o=a.pulls)!=null?o:0,s=r>0?r*a.avgReward/(r+Ct):0;(!n||s>n.score)&&(n={variantId:a.variantId,score:s})}return(i=n==null?void 0:n.variantId)!=null?i:null}function V(e,t,n,o){let i=ee(),a=Le(),r=R(),s=te(),l=ne(),y=Oe(),m=(0,E.useRef)(null);(0,E.useSyncExternalStore)(U,Q,()=>0);let[h,S]=(0,E.useState)(!1);(0,E.useEffect)(()=>S(!0),[]);let g=h?kt(e):null,u=g&&t.includes(g)?g:null,p=(0,E.useRef)(null);(0,E.useEffect)(()=>{y&&u&&p.current!==u&&(p.current=u,console.info(`[sentient] override active: ${e} -> ${u}`))},[y,u,e]);let c=(()=>{var f,w;if(u)return{variantId:u,content:null,isLoading:!1,settled:!0};if(!r){let k=i[e];return k&&t.includes(k)?{variantId:k,content:null,isLoading:!1,settled:!0}:a==="first"&&t.length>0?{variantId:t[0],content:null,isLoading:!1,settled:!1}:{variantId:null,content:null,isLoading:!0,settled:!1}}let d=r.getAssignment(e,s);if(d&&(t.includes(d.variantId)||d.content))return{variantId:d.variantId,content:(f=d.content)!=null?f:null,isLoading:!1,settled:!0};let v=we(e);if(v){let k=Me(v,t);if(k)return{variantId:k,content:null,isLoading:!1,settled:!0}}return{variantId:(w=t[0])!=null?w:null,content:null,isLoading:!1,settled:!1}})(),[b,x]=(0,E.useState)(c),I=d=>{l&&m.current!==d&&(m.current=d,l(e,d))};return(0,E.useEffect)(()=>{var v;if(u||!r)return;let d=r.getAssignment(e,s);if(d&&(t.includes(d.variantId)||d.content)){x({variantId:d.variantId,content:(v=d.content)!=null?v:null,isLoading:!1,settled:!0}),I(d.variantId);return}x(f=>{var w;return f.variantId?f:{variantId:(w=t[0])!=null?w:null,content:null,isLoading:!1,settled:!1}})},[u,r,e,s]),(0,E.useEffect)(()=>{if(u||!r)return;let d=r.getAssignment(e,s);if(d&&t.includes(d.variantId))return;let v=!1;return r.assign(e,t,n,o).then(f=>{var w;v||f&&(!t.includes(f.variantId)&&!f.content||(x({variantId:f.variantId,content:(w=f.content)!=null?w:null,isLoading:!1,settled:!0}),I(f.variantId)))}),()=>{v=!0}},[u,r,e,s]),(0,E.useEffect)(()=>{if(!u&&r)return he(e,d=>{var w;let v=r.getAssignment(e,s);if(v&&(t.includes(v.variantId)||v.content)){x({variantId:v.variantId,content:(w=v.content)!=null?w:null,isLoading:!1,settled:!0});return}let f=Me(d,t);f&&x({variantId:f,content:null,isLoading:!1,settled:!0})})},[u,r,e,s]),u?{variantId:u,content:null,isLoading:!1,settled:!0,isOverride:!0}:b}function G(){var e;return typeof process=="undefined"||((e=process.env)==null?void 0:e.NODE_ENV)!=="production"}function M(e){return typeof e=="string"?{type:"click"}:e}function J(e){return typeof e=="string"?e:e.type}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 Be(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 B(e,t,n){if(t.type==="weighted_composite"){let s=new Set,l=[];return t.steps.forEach(({goal:y,name:m,weight:h},S)=>{let g=()=>{s.has(S)||(s.add(S),n.fireStep(m,h,S))};if(y.type==="click"){let u=p=>{let c=p.target;c instanceof Element&&Be(c,e,y.selector)&&g()};e.addEventListener("click",u),l.push(()=>e.removeEventListener("click",u));return}if(y.type==="form_submit"){let u=p=>{p.target instanceof HTMLFormElement&&e.contains(p.target)&&g()};e.addEventListener("submit",u),l.push(()=>e.removeEventListener("submit",u));return}if(y.type==="scroll_depth"){let u=Math.max(0,Math.min(1,y.threshold)),p=new IntersectionObserver(c=>{for(let b of c)if(b.intersectionRatio>=u){g(),p.disconnect();break}},{threshold:[u]});p.observe(e),l.push(()=>p.disconnect())}}),()=>{for(let y of l)y()}}let o=t.type==="composite"?t.all:[t],i=new Set(o.map((s,l)=>l)),a=s=>{i.delete(s),i.size===0&&n.fireGoal()},r=[];return o.forEach((s,l)=>{if(s.type==="click"){let y=m=>{let h=m.target;h instanceof Element&&Be(h,e,s.selector)&&(t.type==="composite"?a(l):n.fireGoal())};e.addEventListener("click",y),r.push(()=>e.removeEventListener("click",y));return}if(s.type==="form_submit"){let y=m=>{m.target instanceof HTMLFormElement&&e.contains(m.target)&&(t.type==="composite"?a(l):n.fireGoal())};e.addEventListener("submit",y),r.push(()=>e.removeEventListener("submit",y));return}if(s.type==="scroll_depth"){let y=Math.max(0,Math.min(1,s.threshold)),m=new IntersectionObserver(h=>{for(let S of h)if(S.intersectionRatio>=y){t.type==="composite"?a(l):n.fireGoal(),m.disconnect();break}},{threshold:[y]});m.observe(e),r.push(()=>m.disconnect());return}}),()=>{for(let s of r)s()}}function W(e,t,n,o){e.track({projectId:t,componentId:n,variantId:o,eventType:"variant_assigned",payload:{}})}var Ke=require("react/jsx-runtime");function Rt(e){var I;let t=R(),n=D(),o=(0,C.useMemo)(()=>Object.keys(e.variants),[e.variants]),{variantId:i,content:a,isOverride:r,settled:s}=V(e.id,o,e.agentData,e.agentDataByVariant),l=(0,C.useRef)(null),[y,m]=(0,C.useState)(!1);(0,C.useEffect)(()=>{m(!0)},[]);let h=(0,C.useRef)(!1),S=(0,C.useRef)(new Set),g=(0,C.useRef)(null),u=typeof e.goal=="string"?e.goal:JSON.stringify(e.goal),p=(0,C.useMemo)(()=>M(e.goal),[u]),c=typeof e.goal=="string"?e.goal:p.type;if((0,C.useEffect)(()=>Y({id:e.id,variantIds:o,goal:c}),[e.id,o,c]),(0,C.useEffect)(()=>{r||s&&(!t||!i||!n||g.current!==i&&(g.current=i,W(t,n,e.id,i)))},[t,i,n,e.id,r,s]),(0,C.useEffect)(()=>{h.current=!1,S.current=new Set},[i,p]),(0,C.useEffect)(()=>{if(r||!t||!i)return;let d=l.current;if(!d)return;let v=null,f=0,w=()=>{f=Date.now(),v=setTimeout(()=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"cursor_signal",payload:{hoverDuration:Date.now()-f}}),v=null},800)},k=()=>{v!==null&&(clearTimeout(v),v=null)};return d.addEventListener("mouseenter",w),d.addEventListener("mouseleave",k),()=>{d.removeEventListener("mouseenter",w),d.removeEventListener("mouseleave",k),v!==null&&clearTimeout(v)}},[t,i,n,e.id,r]),(0,C.useEffect)(()=>{if(r||!t||!i)return;let d=l.current;if(!d)return;let v=Date.now();return(0,Fe.attachMicroSignalDetectors)((f,w={})=>{var ce,de,fe;t.track({projectId:n,componentId:e.id,variantId:i,eventType:"micro_signal",payload:T({signalType:f},w)});let k=(ce=e.microSignalGoals)==null?void 0:ce[f];if(!k||S.current.has(f))return;S.current.add(f);let ut=typeof k=="string"?k:k.name,ct=typeof k=="string"?1:(de=k.weight)!=null?de:1,dt=typeof k=="string"?0:(fe=k.stepIndex)!=null?fe:0;t.goal(ut,T({signalType:f},w),ct,dt)},d,v)},[t,i,n,e.id,e.microSignalGoals,r]),(0,C.useEffect)(()=>{if(r||!t||!i)return;let d=l.current;if(d)return B(d,p,{fireGoal:()=>{h.current||(h.current=!0,t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:c,payload:{reward:1}}),t.goal(c,{componentId:e.id,variantId:i},1,0))},fireStep:(v,f,w)=>{t.track({projectId:n,componentId:e.id,variantId:i,eventType:"goal_achieved",goalType:v,payload:{reward:f}}),t.goal(v,{},f,w)}})},[t,i,n,e.id,p,c,r]),e.clientOnly&&(!y||!t)||!i)return null;let b=(I=e.variants[i])!=null?I:null,x=b===null?a:null;return G()&&b===null&&x===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,Ke.jsx)("div",{ref:l,"data-sentient-id":e.id,"data-sentient-variant":i,children:b!=null?b:x})}var We=(0,C.memo)(Rt,(e,t)=>{if(e.id!==t.id||e.goal!==t.goal&&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 L=require("react");var Ne=require("react/jsx-runtime");function je({id:e,default:t,component:n="span",className:o,goal:i}){let a=R(),r=D(),s=ne(),l=te(),y=(0,L.useRef)(null),m=(0,L.useRef)(null),[h,S]=(0,L.useState)(()=>{var d,v;return(v=(d=a==null?void 0:a.getAssignment(e,l))==null?void 0:d.content)!=null?v:null}),[g,u]=(0,L.useState)(()=>{var d,v;return(v=(d=a==null?void 0:a.getAssignment(e,l))==null?void 0:d.variantId)!=null?v:null});(0,L.useEffect)(()=>{var v;if(!a||((v=a.getAssignment(e,l))==null?void 0:v.content)!==void 0)return;let d=!1;return a.assign(e).then(f=>{if(!d){if(!f){G()&&console.warn(`[sentient] <AdaptiveText id="${e}"> assignment failed \u2014 showing default text.`);return}u(f.variantId),f.content&&S(f.content)}}),()=>{d=!0}},[a,e,l]),(0,L.useEffect)(()=>{!a||!g||!r||y.current!==g&&(y.current=g,a.track({projectId:r,componentId:e,variantId:g,eventType:"variant_assigned",payload:{}}),s==null||s(e,g))},[a,g,r,e,s]);let p=i===void 0?"":typeof i=="string"?i:JSON.stringify(i),c=(0,L.useMemo)(()=>i===void 0?null:M(i),[p]),b=i===void 0?null:typeof i=="string"?i:c.type,x=(0,L.useRef)(!1);return(0,L.useEffect)(()=>{x.current=!1},[g,p]),(0,L.useEffect)(()=>{if(!a||!g||!r||!c||!b)return;let d=m.current;if(d)return B(d,c,{fireGoal:()=>{x.current||(x.current=!0,a.track({projectId:r,componentId:e,variantId:g,eventType:"goal_achieved",goalType:b,payload:{reward:1}}),a.goal(b,{componentId:e,variantId:g},1,0))},fireStep:(v,f,w)=>{a.track({projectId:r,componentId:e,variantId:g,eventType:"goal_achieved",goalType:v,payload:{reward:f}}),a.goal(v,{},f,w)}})},[a,g,r,e,c,b]),(0,Ne.jsx)(n,{ref:d=>{m.current=d},className:o,children:h!=null?h:t})}var Ue=require("react");function $e(e){let t=R();return(0,Ue.useCallback)((n,o)=>{t==null||t.componentGoal(e,n,o)},[t,e])}var Je=require("@sentientui/core"),He=require("@sentientui/policy"),Xe=require("react/jsx-runtime");function Ve(e){return JSON.stringify(e).replace(/</g,"\\u003c")}function Gt(e){return e.persona?'(function(){try{var d=document.documentElement;if(d.hasAttribute("data-sentient-persona"))return;d.setAttribute("data-sentient-persona",'+Ve(e.persona.persona)+');d.setAttribute("data-sentient-confidence",'+Ve((0,He.confidenceBand)(e.persona.confidence))+");}catch(e){}})();":(0,Je.renderPrePaintScript)(e.apiKey)}function ze(e){return(0,Xe.jsx)("script",{"data-sentient-persona-script":"",dangerouslySetInnerHTML:{__html:Gt(e)}})}var F=require("react"),Qe=require("@sentientui/policy");var N=require("react"),j=require("@sentientui/core"),Et=require("@sentientui/policy");var qe=new Set;function ie(e,t){var m;(0,N.useSyncExternalStore)(U,Q,()=>0);let n=R(),o=Te(),[,i]=(0,N.useReducer)(h=>h+1,0),a=typeof window!="undefined"?(m=window.__sentient_slot_overrides)==null?void 0:m[e]:void 0,r=a===void 0?o[e]:void 0,s=a===void 0&&r===void 0&&n?n.getSlotResult(e):null,l=(n==null?void 0:n.isLocal)===!0&&a===void 0&&r===void 0&&s===null;(0,N.useEffect)(()=>{if(!l||!n)return;let h=!1;return n.decide({slots:[t]}).then(S=>{!h&&S&&i()}),()=>{h=!0}},[n,e,l]);let y=(()=>{if(a!==void 0)return{result:a,arm:(0,j.armOfResult)(a),source:"override"};if(r!==void 0)return{result:r,arm:(0,j.armOfResult)(r),source:"preloaded"};if(s!==null)return{result:s,arm:(0,j.armOfResult)(s),source:"client"};let h=(0,j.baselineResultFor)(t);return{result:h,arm:(0,j.armOfResult)(h),source:"baseline"}})();return(0,N.useEffect)(()=>{G()&&(!n||n.isLocal===!0||y.source==="baseline"&&(qe.has(e)||(qe.add(e),console.warn(`[sentient] slot "${e}" resolved to its baseline \u2014 no SSR-preloaded or decided result. Keyed clients decide slots server-side, so this slot serves baseline for the whole session and records no exposure. Preload it via loadAdaptiveDecision()/initialSlots so it can serve a decided arm and learn.`))))},[n,y.source,e]),y}var se=new Set;function Lt(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/"/g,'\\"')}function Ye(e,t,n){let o=R(),i=D(),a=(0,F.useMemo)(()=>({id:e,dims:t}),[e]),{result:r,arm:s,source:l}=ie(e,a),y=(0,F.useMemo)(()=>typeof r=="string"?{}:r,[s]);if(G()&&!se.has(e)){let g=(0,Qe.validateSlotDecl)({id:e,dims:Object.fromEntries(Object.entries(t).map(([p,c])=>[p,[...c]]))}),u=Object.values(t).reduce((p,c)=>p*c.length,1);g.ok?u>4&&(se.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}") declares ${u} combinations \u2014 more than the recommended 4. Each extra combination needs more traffic to learn; consider fewer dims/values.`)):(se.add(e),console.warn(`[sentient] useAdaptiveTokens("${e}"): invalid declaration \u2014 ${g.reason}. Serving baseline.`))}let m=(n==null?void 0:n.goal)===void 0?null:typeof n.goal=="string"?n.goal:JSON.stringify(n.goal);(0,F.useEffect)(()=>Z({id:e,dims:t}),[e]);let h=(0,F.useRef)(null);(0,F.useEffect)(()=>{!o||l==="baseline"||h.current===s||(h.current=s,W(o,i,e,s))},[o,i,e,s,l]),(0,F.useEffect)(()=>{if(!o||!(n!=null&&n.goal))return;let g=document.querySelector(`[data-sentient-slot="${Lt(e)}"]`);if(!g){G()&&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 u=J(n.goal),p=!1;return B(g,M(n.goal),{fireGoal:()=>{p||(p=!0,o.componentGoal(e,u))},fireStep:(c,b)=>{o.componentGoal(e,c,{reward:b})}})},[o,e,m,s]);let S=(0,F.useMemo)(()=>{let g={"data-sentient-slot":e};for(let[u,p]of Object.entries(y))g[`data-${u}`]=p;return g},[e,y]);return{tokens:y,props:S}}var _=require("react"),et=require("@sentientui/core");var Ze=new Set;function tt(e,t){var v;if(G()&&!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=R(),o=D(),i=(0,_.useMemo)(()=>Object.keys(t.variants),[e]),{variantId:a,isOverride:r,settled:s}=V(e,i),l=(v=a!=null?a:i[0])!=null?v:"",y=t.variants[l],[m,h]=(0,_.useState)(null),S=(0,_.useRef)(null),g=(0,_.useCallback)(f=>{S.current=f,h(f)},[]),u=typeof t.goal=="string"?t.goal:JSON.stringify(t.goal),p=(0,_.useMemo)(()=>M(t.goal),[u]),c=J(t.goal);(0,_.useEffect)(()=>Y({id:e,variantIds:i,goal:c}),[e,i,c]);let b=(0,_.useRef)(null);(0,_.useEffect)(()=>{r||s&&(!n||!l||!m||b.current!==l&&(b.current=l,W(n,o,e,l)))},[n,o,e,l,m,r,s]);let x=(0,_.useRef)(!1);(0,_.useEffect)(()=>{x.current=!1},[l,u]),(0,_.useEffect)(()=>{if(!r&&!(!n||!l||!m))return B(m,p,{fireGoal:()=>{x.current||(x.current=!0,n.track({projectId:o,componentId:e,variantId:l,eventType:"goal_achieved",goalType:c,payload:{reward:1}}),n.goal(c,{componentId:e,variantId:l},1,0))},fireStep:(f,w,k)=>{n.track({projectId:o,componentId:e,variantId:l,eventType:"goal_achieved",goalType:f,payload:{reward:w}}),n.goal(f,{},w,k)}})},[n,m,l,o,e,p,c,r]),(0,_.useEffect)(()=>{if(r||!n||!l||!m)return;let f=Date.now();return(0,et.attachMicroSignalDetectors)((w,k={})=>{n.track({projectId:o,componentId:e,variantId:l,eventType:"micro_signal",payload:T({signalType:w},k)})},m,f)},[n,m,l,o,e,r]),(0,_.useEffect)(()=>{if(!G()||!n)return;let f=setTimeout(()=>{!S.current&&!Ze.has(e)&&(Ze.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(f)},[n,e]);let I=(0,_.useCallback)((f,w)=>{r||n==null||n.componentGoal(e,f!=null?f:c,w)},[n,e,c,r]),d=(0,_.useMemo)(()=>({ref:g,"data-sentient-id":e,"data-sentient-variant":l}),[g,e,l]);return{variant:l,value:y,bind:d,fireGoal:I}}var O=require("react");var it=require("react/jsx-runtime"),re=new Set;function nt(e){var p;let t=R(),n=D(),o=(0,O.useRef)(null),i=(0,O.useMemo)(()=>Object.keys(e.arrangements),[e.id]),a=(0,O.useMemo)(()=>T({id:e.id,arms:i},e.baseline!==void 0?{baseline:e.baseline}:{}),[e.id,i,e.baseline]),{arm:r,source:s}=ie(e.id,a);G()&&e.baseline!==void 0&&e.baseline!==i[0]&&!re.has(e.id+":baseline")&&(re.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 l=O.Children.toArray(e.children).filter(O.isValidElement),y=new Map;for(let c of l)y.set(String((p=c.key)!=null?p:"").replace(/^\.\$/,""),c);let m=e.arrangements[r],h=m!==void 0&&m.length===l.length&&m.every(c=>y.has(c));G()&&m!==void 0&&!h&&!re.has(e.id+":keys")&&(re.add(e.id+":keys"),console.warn(`[sentient] <AdaptiveGroup id="${e.id}">: arrangement "${r}" [${m.join(", ")}] does not match the children's keys \u2014 rendering declaration order (fail-safe).`));let S=h?m.map(c=>y.get(c)):l;(0,O.useEffect)(()=>Z({id:e.id,arms:Object.keys(e.arrangements)}),[e.id]);let g=(0,O.useRef)(null);(0,O.useEffect)(()=>{!t||s==="baseline"||g.current===r||(g.current=r,W(t,n,e.id,r))},[t,n,e.id,r,s]);let u=e.goal===void 0?null:typeof e.goal=="string"?e.goal:JSON.stringify(e.goal);return(0,O.useEffect)(()=>{if(!t||e.goal===void 0)return;let c=o.current;if(!c)return;let b=J(e.goal),x=!1;return B(c,M(e.goal),{fireGoal:()=>{x||(x=!0,t.componentGoal(e.id,b))},fireStep:(I,d)=>{t.componentGoal(e.id,I,{reward:d})}})},[t,e.id,u,r]),(0,it.jsx)("div",{ref:o,"data-sentient-id":e.id,"data-sentient-variant":r,children:S})}var ae=require("@sentientui/core");var Ot=["page","blocks","layoutOrder"],rt=new Map;function ot(e,t){rt.set(e,t)}function le(e){return rt.get(e)}function st(e){var i,a;let t=(a=(i=e.content)!=null?i:le(e.page))!=null?a:{},n={};for(let[r,s]of Object.entries(t))Ot.includes(r)||(n[r]=s);let o=z(T({},n),{page:e.page,blocks:e.blocks});return e.layoutOrder&&(o.layoutOrder=e.layoutOrder),o}function at(e){return`<script type="application/ld+json">${ue(e)}</script>`}function ue(e){return JSON.stringify(T({"@context":"https://schema.org","@type":"WebPage"},e)).replace(/</g,"\\u003c")}function lt(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,renderAgentJsonLd,renderAgentJsonLdBody,renderAgentMarkdown,useAdaptive,useAdaptiveApiBaseUrl,useAdaptiveGoal,useAdaptiveTokens,useAssignment,useInitialAssignments,useLayoutOrder,useSentient});
|
|
5
5
|
//# sourceMappingURL=index.js.map
|