@careerdriver/black-box 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -135,7 +135,7 @@ pnpm add @careerdriver/black-box
135
135
  pnpm add -D @careerdriver/black-box
136
136
 
137
137
  # Install specific version
138
- pnpm add @careerdriver/black-box@1.3.0
138
+ pnpm add @careerdriver/black-box@1.4.0
139
139
 
140
140
  # Install latest version (includes periodic telemetry)
141
141
  pnpm add @careerdriver/black-box@latest
@@ -150,7 +150,7 @@ pnpm add @careerdriver/black-box@latest
150
150
  npm install @careerdriver/black-box@latest
151
151
 
152
152
  # Install specific version
153
- npm install @careerdriver/black-box@1.3.0
153
+ npm install @careerdriver/black-box@1.4.0
154
154
  ```
155
155
 
156
156
  #### Using yarn
@@ -160,7 +160,7 @@ npm install @careerdriver/black-box@1.3.0
160
160
  yarn add @careerdriver/black-box@latest
161
161
 
162
162
  # Install specific version
163
- yarn add @careerdriver/black-box@1.3.0
163
+ yarn add @careerdriver/black-box@1.4.0
164
164
  ```
165
165
 
166
166
  ### ESM Import Usage
@@ -193,7 +193,7 @@ Add the script tag to your HTML:
193
193
  ></script>
194
194
  ```
195
195
 
196
- **Note:** The `@latest` version includes periodic telemetry (v1.2.0+). To use a specific version, replace `@latest` with `@1.3.0` or your preferred version.
196
+ **Note:** The `@latest` version includes periodic telemetry (v1.2.0+). To use a specific version, replace `@latest` with `@1.4.0` or your preferred version.
197
197
 
198
198
  #### Via Local Installation
199
199
 
package/dist/runtime.d.ts CHANGED
@@ -125,6 +125,9 @@ declare class PantheraBlackBox {
125
125
  private heartbeatIntervalId;
126
126
  private memorySessionId?;
127
127
  private memorySessionTs?;
128
+ private routeTrackingInstalled;
129
+ private webVitalsTrackingInstalled;
130
+ private startedForms;
128
131
  private periodicState;
129
132
  constructor(options: {
130
133
  configUrl: string;
@@ -187,8 +190,14 @@ declare class PantheraBlackBox {
187
190
  * Set up cleanup handlers for page unload
188
191
  */
189
192
  private setupCleanup;
193
+ private trackFormStart;
194
+ private setupRouteTracking;
195
+ private setupWebVitalsTracking;
190
196
  private hashString;
191
197
  private redactText;
198
+ private safeText;
199
+ private sanitizeUrlForTelemetry;
200
+ private bucketMetric;
192
201
  private buildSamplingMeta;
193
202
  private getConfigFrameworkVersion;
194
203
  private getActiveReadabilityActionIds;
@@ -197,6 +206,7 @@ declare class PantheraBlackBox {
197
206
  private buildSearchDiagnostics;
198
207
  private buildPageQualityContext;
199
208
  private buildTechnicalSignals;
209
+ private buildSeoSignals;
200
210
  private applyPrivacy;
201
211
  /**
202
212
  * Send telemetry event
@@ -239,6 +249,23 @@ declare class PantheraBlackBox {
239
249
  * Based on presence and count of JSON-LD schemas
240
250
  */
241
251
  private calculateSchemaCompleteness;
252
+ private collectSchemaTemplateInventory;
253
+ private calculateIndexabilityScore;
254
+ private calculateExtractabilityScore;
255
+ private calculateTrustProofDensityScore;
256
+ private calculateInternalLinkDensityScore;
257
+ private calculateCtaClarityScore;
258
+ private calculateSchemaTemplateCoverageScore;
259
+ private calculateCanonicalHealthScore;
260
+ private calculateImageAltCoverageScore;
261
+ private calculateTextDepthScore;
262
+ private calculateHeadingStructureScore;
263
+ private calculateEngagementQualityScore;
264
+ private calculateTechnicalHealthScore;
265
+ private calculateFormFrictionScore;
266
+ private calculateSearchFrictionScore;
267
+ private calculateWebVitalsScore;
268
+ private calculateCrawlReadinessScore;
242
269
  /**
243
270
  * Calculate structured data quality score (0-1)
244
271
  * Based on JSON-LD schema validity and completeness
@@ -1,3 +1,3 @@
1
1
  /* Panthera Black Box Runtime v1.2.0 - Safe, Declarative Website Control with Periodic Telemetry */
2
- "use strict";var PantheraBlackBox=(()=>{var x=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var M=(p,e)=>{for(var t in e)x(p,t,{get:e[t],enumerable:!0})},T=(p,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of E(e))!I.call(p,i)&&i!==t&&x(p,i,{get:()=>e[i],enumerable:!(n=A(e,i))||n.enumerable});return p};var D=p=>T(x({},"__esModule",{value:!0}),p);var B={};M(B,{PantheraBlackBox:()=>w,default:()=>q});var w=class{constructor(e){this.runtimeVersion="1.3.0";this.privacyPolicyVersion="2026-03-v2";this.config=null;this.initialized=!1;this.periodicIntervalId=null;this.heartbeatIntervalId=null;this.periodicState={pageViews:0,interactions:0,searches:0,lastSent:Date.now(),pageHistory:[],searchQueries:[],ctaClicks:[],outboundClicks:[],rageClicks:0,scrollDepthMax:0,activeTimeMs:0,idleTimeMs:0,lastActivityAt:Date.now(),jsErrorsCount:0,errorSignatures:[],resourceFailures:0};this.configUrl=e.configUrl,this.telemetryUrl=e.telemetryUrl,this._siteId=e.siteId,this._siteId}async init(){if(!this.initialized)try{let e=await fetch(this.configUrl,{method:"GET",headers:{Accept:"application/json"},cache:"no-cache"});if(!e.ok)throw new Error(`Failed to load config: ${e.status}`);let t=await e.json();if(!t.panthera_blackbox||!t.panthera_blackbox.site)throw new Error("Invalid config structure");this.config=t,this.initialized=!0,this.applyConfig(),this.config.panthera_blackbox.telemetry?.emit&&this.startTelemetry()}catch(e){console.error("[Panthera Black Box] Initialization failed:",e)}}applyConfig(){if(!this.config)return;let e=this.config.panthera_blackbox;e.frontend_mode==="context_only"||e.invisible_context_only===!0||(this.injectSchema(e),this.injectMetaTags(e),this.injectStructureEnhancements(e),this.injectContentEnhancements(e),this.injectContentDepth(e),e.autofill?.enabled&&e.autofill.forms&&this.initializeAutoFill(e),e.ads?.slots&&this.initializeAdSlots(e))}injectSchema(e){if(typeof document>"u")return;document.querySelectorAll('script[type="application/ld+json"][data-panthera]').forEach(r=>r.remove());let n=e.tier??"bronze";this.generateSchemasForTier(e,n).forEach((r,s)=>{let a=document.createElement("script");a.type="application/ld+json",a.setAttribute("data-panthera","true"),a.setAttribute("data-schema-index",s.toString()),a.textContent=JSON.stringify(r),document.head.appendChild(a)})}generateSchemasForTier(e,t){let n=[],i={"@context":"https://schema.org","@type":"Organization",name:e.site.brand,url:`https://${e.site.domain}`};if(e.authority_grove?.node&&(i.sameAs=e.authority_grove.node.sameAs,i.keywords=e.authority_grove.node.keywords),n.push(i),(t==="silver"||t==="gold")&&(e.products&&e.products.forEach(s=>{n.push({"@context":"https://schema.org","@type":"Product",name:s.name||e.site.brand,description:s.description,brand:{"@type":"Brand",name:e.site.brand},url:`https://${e.site.domain}`})}),e.services&&e.services.forEach(s=>{n.push({"@context":"https://schema.org","@type":"Service",name:s.name||e.site.brand,description:s.description,provider:{"@type":"Organization",name:e.site.brand,url:`https://${e.site.domain}`}})}),e.site.geo&&e.site.geo.length>0&&n.push({"@context":"https://schema.org","@type":"LocalBusiness",name:e.site.brand,url:`https://${e.site.domain}`,areaServed:e.site.geo}),e.faqs)){let r=e.faqs;r.length>0&&n.push({"@context":"https://schema.org","@type":"FAQPage",mainEntity:r.map(s=>({"@type":"Question",name:s.question,acceptedAnswer:{"@type":"Answer",text:s.answer}}))})}return n}injectMetaTags(e){if(typeof document>"u")return;let t=e.seo_enhancements;if(t){if(t.meta_description&&!document.querySelector('meta[name="description"]')){let i=document.createElement("meta");i.setAttribute("name","description"),i.setAttribute("content",t.meta_description),i.setAttribute("data-panthera","true"),document.head.appendChild(i)}if(t.canonical_enabled&&!document.querySelector('link[rel="canonical"]')){let i=document.createElement("link");i.setAttribute("rel","canonical"),i.setAttribute("href",window.location.href),i.setAttribute("data-panthera","true"),document.head.appendChild(i)}}}injectContentEnhancements(e){if(typeof document>"u")return;let t=e.seo_enhancements?.content_enhancements;if(!t||!t.enabled)return;let n=document.body;if(!n)return;let i=document.createElement("section");if(i.setAttribute("data-panthera","true"),i.setAttribute("data-panthera-type","ai-readiness"),i.setAttribute("aria-hidden","true"),i.style.cssText="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;",t.what){let r=document.createElement("div");r.textContent=t.what,i.appendChild(r)}if(t.who){let r=document.createElement("div");r.textContent=t.who,i.appendChild(r)}if(t.how){let r=document.createElement("div");r.textContent=t.how,i.appendChild(r)}if(t.trust){let r=document.createElement("div");r.textContent=t.trust,i.appendChild(r)}n.appendChild(i)}injectContentDepth(e){if(typeof document>"u")return;let t=e.seo_enhancements?.content_depth;if(!t||!t.enabled)return;let n=document.body;if(!n)return;let i=n.querySelectorAll("h2").length,r=t.min_h2_count||6,a=(n.textContent||"").length,l=Math.max(0,6e3-a),o=document.createElement("section");o.setAttribute("data-panthera","true"),o.setAttribute("data-panthera-type","content-depth"),o.setAttribute("aria-hidden","true"),o.style.cssText="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;";let d=0,h=Math.max(0,r-i);for(let u=0;u<h||d<l;u++){let m=document.createElement("h2");m.textContent=t.h2_templates?.[u]||`Section ${u+1}`,o.appendChild(m),d+=m.textContent.length;let g=t.content_templates?.[u]||t.default_content||"This section provides additional context and information for AI search engines. Our platform helps businesses optimize their online presence and improve visibility in AI-powered search results. We provide comprehensive solutions that enhance content discoverability and ensure your website is properly structured for modern search technologies.",S=g.length,y=Math.ceil((l-d)/S)||1;for(let f=0;f<Math.max(1,y)&&d<l;f++){let b=document.createElement("p");b.textContent=g,o.appendChild(b),d+=g.length}}o.children.length>0&&n.appendChild(o)}injectStructureEnhancements(e){if(typeof document>"u")return;let t=e.seo_enhancements?.structure_enhancements;if(t){if(t.inject_h1_if_missing&&!document.querySelector("h1")&&t.h1_text){let i=document.body;if(i){let r=document.createElement("h1");r.textContent=t.h1_text,r.setAttribute("data-panthera","true");let s=i.firstElementChild;s?i.insertBefore(r,s):i.appendChild(r)}}if(t.enhance_title){let n=document.querySelector("title"),i=n?.textContent||"",r=t.min_title_length||30;if(i.length<r&&t.title_template){let s=t.title_template.replace("{brand}",e.site.brand);if(n)n.textContent=s,n.setAttribute("data-panthera-enhanced","true");else{let a=document.createElement("title");a.textContent=s,a.setAttribute("data-panthera","true"),document.head.appendChild(a)}}}}}initializeAutoFill(e){typeof window>"u"||!e.autofill?.forms||e.autofill.forms.forEach(t=>{let n=document.querySelector(t.selector);n&&(n.pantheraAutoFill=t,n.addEventListener("focusin",i=>{let r=i.target;(r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.tagName==="SELECT")&&this.triggerAutoFill(t)},{once:!0}))})}async triggerAutoFill(e){let t={},n=document.querySelector(e.selector);if(n)for(let[i,r]of Object.entries(e.map)){let s=n.querySelector(r);s&&t[i]&&(s.value=t[i],s.dispatchEvent(new Event("input",{bubbles:!0})))}}initializeAdSlots(e){typeof window>"u"||!e.ads?.slots||e.ads.slots.forEach(t=>{let n=String(t.id||"").trim();if(n=n.replace(/["']/g,""),n=n.trim(),!!n)try{let i=n.replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g,"\\$&");if(i.includes('"')||i.includes("'"))throw new Error(`Slot ID contains quotes after sanitization: ${i}`);let r=`[data-ad-slot="${i}"]`,s=document.querySelector(r);s&&(s.pantheraAdSlot=t,this.loadAdCreative(t))}catch(i){console.error(`[Panthera Black Box] Invalid ad slot selector for ID: ${t.id}`,i)}})}async loadAdCreative(e){console.debug("[Panthera Black Box] Ad slot initialized:",e.id)}startTelemetry(){if(!this.config?.panthera_blackbox.telemetry?.emit)return;if(this.sendTelemetry("page_view",{url:window.location.href,referrer:document.referrer}),typeof window<"u"){let n=null,i=()=>{let l=Date.now(),o=l-this.periodicState.lastActivityAt;if(o>0){let d=Math.min(o,1e3);this.periodicState.activeTimeMs+=d,o>d&&(this.periodicState.idleTimeMs+=o-d)}this.periodicState.lastActivityAt=l},r=l=>{if(i(),typeof window<"u"){let o=Math.max(document.documentElement.scrollTop||0,document.body.scrollTop||0),d=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,1),h=window.innerHeight||0,u=Math.min(1,(o+h)/d);this.periodicState.scrollDepthMax=Math.max(this.periodicState.scrollDepthMax,u)}if(l&&l.type==="click"){let d=l.target?.closest('a,button,[role="button"],input[type="submit"]'),h=d?.textContent?.trim()||"";if(h&&/buy|start|book|contact|get demo|sign up|trial|pricing/i.test(h)&&this.periodicState.ctaClicks.push(h.slice(0,80)),d?.tagName.toLowerCase()==="a"){let u=d.href;try{let m=new URL(u,window.location.href);m.origin!==window.location.origin&&this.periodicState.outboundClicks.push(m.href)}catch{}}}n||(n=window.setTimeout(()=>{this.sendTelemetry("interaction",{timestamp:new Date().toISOString()}),n=null},1e3))};document.addEventListener("click",l=>r(l),{passive:!0}),document.addEventListener("scroll",l=>r(l),{passive:!0}),document.addEventListener("mousemove",i,{passive:!0}),document.addEventListener("keydown",i,{passive:!0});let s=0,a=0,c="";document.addEventListener("click",l=>{let d=(l.target?.textContent||"").trim().slice(0,80),h=Date.now();if(h-s>1500||d!==c){s=h,a=1,c=d;return}a+=1,a>=4&&(this.periodicState.rageClicks+=1,a=0)},{passive:!0}),window.addEventListener("error",l=>{this.periodicState.jsErrorsCount+=1;let o=String(l.message||"unknown-js-error").slice(0,120);this.periodicState.errorSignatures.push(o),this.periodicState.errorSignatures.length>20&&this.periodicState.errorSignatures.shift()}),window.addEventListener("unhandledrejection",()=>{this.periodicState.jsErrorsCount+=1}),window.addEventListener("error",l=>{l.target&&l.message===""&&(this.periodicState.resourceFailures+=1)},!0)}let e=this.config.panthera_blackbox.telemetry.periodic;if((e?.enabled??!0)&&typeof window<"u"){let n=e?.intervalMs||3e5;this.periodicIntervalId!==null&&window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=window.setInterval(()=>{this.sendPeriodicTelemetry()},n),window.setTimeout(()=>{this.sendPeriodicTelemetry()},1e3),this.setupCleanup()}else typeof window<"u"&&(this.heartbeatIntervalId!==null&&window.clearInterval(this.heartbeatIntervalId),this.heartbeatIntervalId=window.setInterval(()=>{this.sendTelemetry("page_view",{heartbeat:!0,timestamp:new Date().toISOString()})},3e5),this.setupCleanup())}setupCleanup(){if(typeof window>"u")return;let e=()=>{this.periodicIntervalId!==null&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),this.heartbeatIntervalId!==null&&(window.clearInterval(this.heartbeatIntervalId),this.heartbeatIntervalId=null)};window.addEventListener("beforeunload",e),window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",()=>{document.hidden&&(this.config?.panthera_blackbox.telemetry?.periodic?.enabled??!0?this.sendPeriodicTelemetry():this.sendTelemetry("page_view",{heartbeat:!0,timestamp:new Date().toISOString()}))})}hashString(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}redactText(e){let t=e,n=t;return t=t.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi,"[redacted-email]"),t=t.replace(/\\+?\\d[\\d\\s().-]{7,}\\d/g,"[redacted-phone]"),t=t.replace(/\\b(name|full name|first name|last name)\\s*[:=-]?\\s*[a-z ,.'-]{2,}/gi,"$1:[redacted-name]"),{value:t,redacted:t!==n}}buildSamplingMeta(e,t,n){return e>0||t>0||this.periodicState.jsErrorsCount>0?{tier:"critical",reason:"Detected friction or technical issues"}:n>0||this.periodicState.pageViews>20?{tier:"full",reason:"Coverage gaps or high activity"}:{tier:"sampled",reason:"Healthy low-risk traffic sample"}}getConfigFrameworkVersion(){let e=this.config?.panthera_blackbox?.ai_readability?.frameworkVersion;return typeof e=="string"&&e.trim().length>0?e:void 0}getActiveReadabilityActionIds(e=3){let t=this.config?.panthera_blackbox?.ai_readability?.recommendedActions;return Array.isArray(t)?t.map(n=>n?.id).filter(n=>typeof n=="string"&&n.trim().length>0).slice(0,e):[]}buildJourneyContext(){let e=this.periodicState.pageHistory,t=e[0]?.url,n=e[e.length-1]?.url,i=e.map(c=>c.url).filter(Boolean).slice(0,25),r=0,s=0,a=new Set;for(let c=0;c<i.length;c++)a.has(i[c])&&r++,a.add(i[c]),c>1&&i[c]===i[c-2]&&s++;return{entryUrl:t,exitUrl:n,path:i,stepCount:i.length,timeOnPathMs:e.length>1?e[e.length-1].timestamp-e[0].timestamp:0,loops:r,backtracks:s,stallPoints:this.detectDeadEnds().map(c=>c.url).slice(0,5)}}buildIntentSignals(){let e=this.detectIntent(),t=[{intent:e,confidence:.7},{intent:this.detectFunnelStage()==="decision"?"pricing":"general",confidence:.45},{intent:"support",confidence:.2}],n=["url_pattern","keyword_match"];return typeof document<"u"&&document.querySelectorAll('a[href*="demo"],button').length>0&&n.push("cta_match"),typeof document<"u"&&document.querySelectorAll('script[type="application/ld+json"]').length>0&&n.push("schema_hint"),{detectedIntent:e,confidence:t[0].confidence,topCandidates:t,reasonFlags:n}}buildSearchDiagnostics(e){let t=this.periodicState.searchQueries[this.periodicState.searchQueries.length-1]?.query,n=r=>{let s=r.toLowerCase();return s.includes("price")||s.includes("pricing")||s.includes("cost")?"price":s.includes("compare")||s.includes("vs")||s.includes("alternative")?"compare":s.includes("support")||s.includes("error")||s.includes("help")?"support":s.split(" ").length<=2?"nav":"info"},i=this.periodicState.searchQueries.map(r=>r.query).slice(-5);return{query:t,queryHash:t?this.hashString(t.toLowerCase()):void 0,queryClass:t?n(t):void 0,reformulations:i,zeroResultHints:e.length>0?["Repeated searches may indicate weak or missing answers"]:[],repeatedQueryFingerprint:e.length>0?this.hashString(e.map(r=>r.query).join("|")):void 0}}buildPageQualityContext(){if(typeof document>"u")return{};let e=document.body?.textContent||"",t=e.split(/\\s+/).filter(Boolean).length||1,n=Math.max(1,e.split(/[.!?]+/).filter(Boolean).length),i=Math.max(0,Math.min(1,1-Math.min(1,t/n/35))),r=document.querySelectorAll('a[href*="contact"],a[href*="pricing"],button').length>0,s=document.querySelectorAll("a").length,a=Array.from(document.querySelectorAll("a")).filter(d=>(d.textContent||"").trim().length>5).length,c=s>0?a/s:.5,l=document.querySelectorAll('script[type="application/ld+json"]').length>0,o=l&&/faq/i.test(e);return{readabilityScore:i,aboveFoldClarity:r?.8:.45,ctaPresence:r,linkClarityScore:c,schemaPresence:{jsonLd:l,faq:o},faqPresence:o}}buildTechnicalSignals(){let e=this.periodicState.jsErrorsCount>0?"needs-attention":"healthy";return{jsErrorsCount:this.periodicState.jsErrorsCount,errorSignatures:this.periodicState.errorSignatures.slice(-8),resourceFailures:this.periodicState.resourceFailures,lcpBucket:e,fidBucket:this.periodicState.rageClicks>0?"needs-attention":"healthy",clsBucket:"unknown",routeTransitionMsBucket:"unknown"}}applyPrivacy(e){let t=[],n=!1;if(e.search?.query){let r=this.redactText(e.search.query);r.redacted&&(n=!0),e.search.query=r.value,t.push(`search.query:${this.hashString(r.value.toLowerCase())}`)}if(e.page?.title){let r=this.redactText(e.page.title);r.redacted&&(n=!0),e.page.title=r.value,t.push(`page.title:${this.hashString(r.value.toLowerCase())}`)}let i=e.context||void 0;if(i&&typeof i=="object"){let r=s=>{let a=i[s];if(typeof a!="string")return;let c=this.redactText(a);i[s]=c.value,c.redacted&&(n=!0),t.push(`${s}:${this.hashString(c.value.toLowerCase())}`)};r("search_query"),r("query"),r("url"),i.privacy={redactionApplied:n,hashedFields:t.slice(0,12),policyVersion:this.privacyPolicyVersion},e.context=i}return e}async sendTelemetry(e,t){if(!this.config?.panthera_blackbox.telemetry?.emit)return;if(e==="page_view")this.periodicState.pageViews++,typeof window<"u"&&(this.periodicState.pageHistory.push({url:window.location.href,path:window.location.pathname,title:document.title,intent:this.detectIntent(),funnelStage:this.detectFunnelStage(),timestamp:Date.now()}),this.periodicState.pageHistory.length>50&&this.periodicState.pageHistory.shift());else if(e==="interaction")this.periodicState.interactions++;else if(e==="search"){this.periodicState.searches++;let g=t.search?.query||t.context?.search_query;g&&(this.periodicState.searchQueries.push({query:g,timestamp:Date.now()}),this.periodicState.searchQueries.length>50&&this.periodicState.searchQueries.shift())}let{page:n,search:i,...r}=t,s=this.getSessionId(),a=e==="page_view",c=n||(a&&typeof window<"u"?{url:window.location.href,path:window.location.pathname,title:document.title}:void 0),l=r.search_query||r.query,o=r.results_count,d=r.selected_result,h=e==="search"?i||(l?{query:l,results_count:o,selected_result:d}:void 0):void 0,u={event_type:e,...r};a&&(u.intent===void 0&&(u.intent=this.detectIntent()),u.funnelStage===void 0&&(u.funnelStage=this.detectFunnelStage())),u.captureMeta===void 0&&(u.captureMeta={runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion()});let m=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:["page_view","interaction","search"].includes(e)?e:"custom",session_id:s,page:c,search:h,context:Object.keys(u).length>0?u:void 0,metrics:this.collectMetrics()});try{if(navigator.sendBeacon){let g=new Blob([JSON.stringify(m)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,g)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m),keepalive:!0})}catch(g){console.debug("[Panthera Black Box] Telemetry failed:",g)}}async sendPeriodicTelemetry(){if(this.config?.panthera_blackbox.telemetry?.emit&&!(typeof window>"u"))try{let e=Date.now(),t=e-this.periodicState.lastSent,n=this.collectMetrics(),i=this.detectRepeatedSearches(),r=this.detectDeadEnds(),s=this.detectDropOffs(),a=this.buildJourneyContext(),c=this.buildIntentSignals(),l={scrollDepthMax:this.periodicState.scrollDepthMax,activeTimeMs:this.periodicState.activeTimeMs,idleTimeMs:this.periodicState.idleTimeMs,ctaClicks:this.periodicState.ctaClicks.slice(-10),outboundClicks:this.periodicState.outboundClicks.slice(-10),rageClicks:this.periodicState.rageClicks},o=this.buildSearchDiagnostics(i),d=this.buildPageQualityContext(),h=this.buildTechnicalSignals(),u=this.detectContentGaps(),m=this.detectFunnelStage(),g=this.detectIntent(),S={what:u.includes("what"),who:u.includes("who"),how:u.includes("how"),trust:u.includes("trust")},y=[];r.length>0&&y.push("Add clear next-step links and calls-to-action on dead-end pages."),i.length>0&&y.push("Improve clarity for repeated search topics with dedicated sections and internal links."),u.length>0&&y.push(`Fill missing content dimensions: ${u.join(", ")}.`);let f=this.buildSamplingMeta(r.length,s.length,u.length),b=this.getActiveReadabilityActionIds(),k={periodic:!0,timeSinceLastSend:t,aggregated:{pageViews:this.periodicState.pageViews,interactions:this.periodicState.interactions,searches:this.periodicState.searches},confusion:{repeatedSearches:i.length,deadEnds:r.length,dropOffs:s.length,repeatedSearchesDetail:i.slice(0,10),deadEndsDetail:r.slice(0,10),dropOffsDetail:s.slice(0,10)},coverage:{contentGaps:u.length,contentGapsDetail:u,funnelStage:m,intent:g,page:{url:window.location.href,path:window.location.pathname,title:document.title},missingContentDimensions:S,pageMetadata:{hasJsonLd:document.querySelectorAll('script[type="application/ld+json"]').length>0,h1Count:document.querySelectorAll("h1").length,h2Count:document.querySelectorAll("h2").length,textLength:document.body?.textContent?.length||0},recommendedFocus:y.slice(0,3)},journey:a,intentSignals:c,engagement:l,searchDiagnostics:o,pageQuality:d,technicalSignals:h,recommendationFeedback:{recommendationId:`rec-${this.detectFunnelStage()}`,exposed:!0,reachedNextStep:s.length===0&&r.length===0,activeReadabilityActionIds:b},captureMeta:{runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion(),samplingTier:f.tier,samplingReason:f.reason},intent:g,funnelStage:m},C=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:"custom",session_id:this.getSessionId(),page:{url:window.location.href,path:window.location.pathname,title:document.title},context:k,metrics:n});if(navigator.sendBeacon){let v=new Blob([JSON.stringify(C)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,v)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(C),keepalive:!0});let _=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:"page_view",session_id:this.getSessionId(),page:{url:window.location.href,path:window.location.pathname,title:document.title},context:{periodic:!0,heartbeat:!0,captureMeta:{runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion(),samplingTier:f.tier,samplingReason:f.reason},aggregatedMetrics:n,aggregatedPageViews:this.periodicState.pageViews,aggregatedInteractions:this.periodicState.interactions,aggregatedSearches:this.periodicState.searches},metrics:n});if(navigator.sendBeacon){let v=new Blob([JSON.stringify(_)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,v)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(_),keepalive:!0});this.periodicState.pageViews=0,this.periodicState.interactions=0,this.periodicState.searches=0,this.periodicState.lastSent=e,this.periodicState.ctaClicks=[],this.periodicState.outboundClicks=[],this.periodicState.rageClicks=0,this.periodicState.scrollDepthMax=0,this.periodicState.activeTimeMs=0,this.periodicState.idleTimeMs=0,this.periodicState.jsErrorsCount=0,this.periodicState.errorSignatures=[],this.periodicState.resourceFailures=0}catch(e){console.debug("[Panthera Black Box] Periodic telemetry failed:",e)}}detectRepeatedSearches(){let e=new Map;this.periodicState.searchQueries.forEach(({query:n})=>{e.set(n,(e.get(n)||0)+1)});let t=[];return e.forEach((n,i)=>{n>1&&t.push({query:i,count:n,intent:this.detectIntent(),funnelStage:this.detectFunnelStage()})}),t}detectDeadEnds(){let e=[];if(this.periodicState.pageHistory.length<2)return e;for(let r=0;r<this.periodicState.pageHistory.length-1;r++){let s=this.periodicState.pageHistory[r],c=this.periodicState.pageHistory[r+1].timestamp-s.timestamp;c>6e4&&e.push({url:s.url,path:s.path,title:s.title,at:new Date(s.timestamp).toISOString(),dwellMs:c,reason:"No next meaningful action within expected time window"})}let n=this.periodicState.pageHistory[this.periodicState.pageHistory.length-1],i=Date.now()-n.timestamp;return i>6e4&&e.push({url:n.url,path:n.path,title:n.title,at:new Date(n.timestamp).toISOString(),dwellMs:i,reason:"Session stalled after page view"}),e}detectDropOffs(){let e=[];if(this.periodicState.pageViews+this.periodicState.interactions+this.periodicState.searches<=2&&this.periodicState.pageHistory.length>0){let n=this.periodicState.pageHistory[this.periodicState.pageHistory.length-1],i=this.getSessionId();i&&e.push({sessionId:i,lastEvent:new Date(n.timestamp).toISOString(),lastUrl:n.url,stage:n.funnelStage,intent:n.intent})}return e}detectContentGaps(){if(typeof document>"u")return[];let e=[],t=document.body;if(!t)return e;let n=t.textContent?.toLowerCase()||"",i=this.config?.panthera_blackbox.seo_enhancements?.content_enhancements;return!i?.what&&!n.includes("what")&&!n.includes("do")&&e.push("what"),!i?.who&&!n.includes("who")&&!n.includes("for")&&e.push("who"),!i?.how&&!n.includes("how")&&!n.includes("work")&&e.push("how"),!i?.trust&&!n.includes("trust")&&!n.includes("certified")&&e.push("trust"),e}detectFunnelStage(){if(typeof window>"u")return"awareness";let e=window.location.href.toLowerCase(),t=window.location.pathname.toLowerCase();return e.includes("pricing")||e.includes("signup")||e.includes("checkout")||t.includes("pricing")?"decision":e.includes("docs")||e.includes("case-study")||e.includes("guides")||t.includes("docs")?"consideration":e.includes("support")||e.includes("account")||e.includes("dashboard")||t.includes("account")?"retention":"awareness"}detectIntent(){if(typeof window>"u")return"general";let e=window.location.href.toLowerCase(),t=document.title?.toLowerCase()||"",n=`${e} ${t}`;return n.includes("pricing")?"pricing":n.includes("demo")?"demo":n.includes("docs")?"docs":n.includes("case study")?"case-study":"general"}collectMetrics(){let e={},t=this.config?.panthera_blackbox.telemetry?.keys||[],n=["ts.authority","ai.schemaCompleteness","ai.structuredDataQuality","ai.authoritySignals","ai.searchVisibility"];return new Set([...t,...n]).forEach(r=>{r.startsWith("ai.")?r==="ai.schemaCompleteness"?e[r]=this.calculateSchemaCompleteness():r==="ai.structuredDataQuality"?e[r]=this.calculateStructuredDataQuality():r==="ai.authoritySignals"?e[r]=this.calculateAuthoritySignals():r==="ai.searchVisibility"?e[r]=this.calculateSearchVisibility():e[r]=.6+Math.random()*.35:r.startsWith("ts.")?r==="ts.authority"?e[r]=this.calculateAuthorityScore():e[r]=.5+Math.random()*.4:e[r]=0}),e}calculateSchemaCompleteness(){if(typeof document>"u")return 0;let e=document.querySelectorAll('script[type="application/ld+json"]'),t=document.querySelectorAll('script[type="application/ld+json"][data-panthera]'),n=0;e.length>0&&(n=.3),t.length>0&&(n=.5);let i=new Set;return e.forEach(r=>{try{let s=r.textContent;if(s){let a=JSON.parse(s);a["@type"]&&i.add(a["@type"])}}catch{}}),n+=Math.min(.5,i.size*.1),Math.min(1,n)}calculateStructuredDataQuality(){if(typeof document>"u")return 0;let e=document.querySelectorAll('script[type="application/ld+json"]');if(e.length===0)return 0;let t=0,n=0,i=0;if(e.forEach(c=>{try{let l=c.textContent;if(!l)return;let o=JSON.parse(l);if(!o["@context"]||!o["@type"])return;t++;let d=Object.keys(o);n+=d.length;let h=o["@type"];h==="Organization"&&o.name&&o.url?i+=2:(h==="Product"&&o.name||h==="Service"&&o.name||h==="FAQPage"&&Array.isArray(o.mainEntity))&&(i+=1)}catch{}}),t===0)return 0;let r=Math.min(.5,t*.25),s=Math.min(.3,n/t/10),a=Math.min(.2,i*.1);return Math.min(1,r+s+a)}calculateAuthoritySignals(){if(typeof document>"u")return 0;let e=0,t=document.body;if(!t)return 0;let n=t.textContent?.toLowerCase()||"",r=["certified","award","trusted","verified","accredited","licensed"].filter(c=>n.includes(c));e+=Math.min(.3,r.length*.05);let a=["review","testimonial","rating","star","customer"].filter(c=>n.includes(c));if(e+=Math.min(.3,a.length*.05),this.config?.panthera_blackbox.authority_grove?.node?.sameAs){let c=this.config.panthera_blackbox.authority_grove.node.sameAs.length;e+=Math.min(.4,c*.1)}return Math.min(1,e)}calculateSearchVisibility(){if(typeof document>"u")return 0;let e=0,t=document.querySelector('meta[name="description"]');t&&t.getAttribute("content")&&t.getAttribute("content").length>50&&(e+=.2);let n=document.querySelector("title");n&&n.textContent&&n.textContent.length>30&&(e+=.2);let i=document.querySelector("h1");i&&i.textContent&&(e+=.2),document.querySelectorAll('script[type="application/ld+json"]').length>0&&(e+=.2);let s=document.querySelectorAll("h2"),a=document.body?.textContent?.length||0;return s.length>=3&&a>1e3&&(e+=.2),Math.min(1,e)}calculateAuthorityScore(){if(!this.config?.panthera_blackbox.authority_grove?.node)return .5;let e=this.config.panthera_blackbox.authority_grove.node,t=.3;return e.sameAs&&e.sameAs.length>0&&(t+=Math.min(.4,e.sameAs.length*.1)),e.keywords&&e.keywords.length>0&&(t+=Math.min(.3,e.keywords.length*.05)),Math.min(1,t)}getSessionId(){if(typeof window>"u")return;let e=window.sessionStorage,t=window.localStorage,n="panthera_session_id",i="panthera_session_ts",r=Date.now(),s=1800*1e3,a=d=>{if(!d)return null;try{let h=d.getItem(n),u=Number(d.getItem(i)||0);if(h&&u&&r-u<s)return d.setItem(i,String(r)),h}catch{return null}return null},c=(d,h)=>{if(!d)return!1;try{return d.setItem(n,h),d.setItem(i,String(r)),!0}catch{return!1}},l=a(e)||a(t);if(l)return l;if(this.memorySessionId&&this.memorySessionTs&&r-this.memorySessionTs<s)return this.memorySessionTs=r,this.memorySessionId;let o=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${r}-${Math.random().toString(16).slice(2)}`;return c(e,o)||c(t,o),this.memorySessionId=o,this.memorySessionTs=r,o}getConfig(){return this.config}async reload(){this.periodicIntervalId!==null&&typeof window<"u"&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),this.periodicState={pageViews:0,interactions:0,searches:0,lastSent:Date.now(),pageHistory:[],searchQueries:[],ctaClicks:[],outboundClicks:[],rageClicks:0,scrollDepthMax:0,activeTimeMs:0,idleTimeMs:0,lastActivityAt:Date.now(),jsErrorsCount:0,errorSignatures:[],resourceFailures:0},this.initialized=!1,await this.init()}};(function(){if(typeof window>"u")return;let p=document.currentScript;if(!p)return;let e=p.getAttribute("data-config-url"),t=p.getAttribute("data-telemetry-url"),n=p.getAttribute("data-site-id");if(!e||!t||!n){console.warn("[Panthera Black Box] Missing required data attributes");return}let i=new w({configUrl:e,telemetryUrl:t,siteId:n});document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>i.init()):i.init(),window.PantheraBlackBox=w,window.panthera=i})();var q=w;return D(B);})();
2
+ "use strict";var PantheraBlackBox=(()=>{var k=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var I=(f,e)=>{for(var t in e)k(f,t,{get:e[t],enumerable:!0})},q=(f,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of T(e))!_.call(f,i)&&i!==t&&k(f,i,{get:()=>e[i],enumerable:!(n=E(e,i))||n.enumerable});return f};var D=f=>q(k({},"__esModule",{value:!0}),f);var F={};I(F,{PantheraBlackBox:()=>b,default:()=>L});var b=class{constructor(e){this.runtimeVersion="1.4.0";this.privacyPolicyVersion="2026-03-v2";this.config=null;this.initialized=!1;this.periodicIntervalId=null;this.heartbeatIntervalId=null;this.routeTrackingInstalled=!1;this.webVitalsTrackingInstalled=!1;this.startedForms=new Set;this.periodicState={pageViews:0,interactions:0,searches:0,lastSent:Date.now(),pageHistory:[],searchQueries:[],ctaClicks:[],outboundClicks:[],rageClicks:0,scrollDepthMax:0,activeTimeMs:0,idleTimeMs:0,lastActivityAt:Date.now(),jsErrorsCount:0,errorSignatures:[],resourceFailures:0,routeChanges:0,formStarts:0,formSubmits:0,formAbandons:0,webVitals:{}};this.configUrl=e.configUrl,this.telemetryUrl=e.telemetryUrl,this._siteId=e.siteId,this._siteId}async init(){if(!this.initialized)try{let e=await fetch(this.configUrl,{method:"GET",headers:{Accept:"application/json"},cache:"no-cache"});if(!e.ok)throw new Error(`Failed to load config: ${e.status}`);let t=await e.json();if(!t.panthera_blackbox||!t.panthera_blackbox.site)throw new Error("Invalid config structure");this.config=t,this.initialized=!0,this.applyConfig(),this.config.panthera_blackbox.telemetry?.emit&&this.startTelemetry()}catch(e){console.error("[Panthera Black Box] Initialization failed:",e)}}applyConfig(){if(!this.config)return;let e=this.config.panthera_blackbox;e.frontend_mode==="context_only"||e.invisible_context_only===!0||(this.injectSchema(e),this.injectMetaTags(e),this.injectStructureEnhancements(e),this.injectContentEnhancements(e),this.injectContentDepth(e),e.autofill?.enabled&&e.autofill.forms&&this.initializeAutoFill(e),e.ads?.slots&&this.initializeAdSlots(e))}injectSchema(e){if(typeof document>"u")return;document.querySelectorAll('script[type="application/ld+json"][data-panthera]').forEach(r=>r.remove());let n=e.tier??"bronze";this.generateSchemasForTier(e,n).forEach((r,a)=>{let s=document.createElement("script");s.type="application/ld+json",s.setAttribute("data-panthera","true"),s.setAttribute("data-schema-index",a.toString()),s.textContent=JSON.stringify(r),document.head.appendChild(s)})}generateSchemasForTier(e,t){let n=[],i={"@context":"https://schema.org","@type":"Organization",name:e.site.brand,url:`https://${e.site.domain}`};if(e.authority_grove?.node&&(i.sameAs=e.authority_grove.node.sameAs,i.keywords=e.authority_grove.node.keywords),n.push(i),(t==="silver"||t==="gold")&&(e.products&&e.products.forEach(a=>{n.push({"@context":"https://schema.org","@type":"Product",name:a.name||e.site.brand,description:a.description,brand:{"@type":"Brand",name:e.site.brand},url:`https://${e.site.domain}`})}),e.services&&e.services.forEach(a=>{n.push({"@context":"https://schema.org","@type":"Service",name:a.name||e.site.brand,description:a.description,provider:{"@type":"Organization",name:e.site.brand,url:`https://${e.site.domain}`}})}),e.site.geo&&e.site.geo.length>0&&n.push({"@context":"https://schema.org","@type":"LocalBusiness",name:e.site.brand,url:`https://${e.site.domain}`,areaServed:e.site.geo}),e.faqs)){let r=e.faqs;r.length>0&&n.push({"@context":"https://schema.org","@type":"FAQPage",mainEntity:r.map(a=>({"@type":"Question",name:a.question,acceptedAnswer:{"@type":"Answer",text:a.answer}}))})}return n}injectMetaTags(e){if(typeof document>"u")return;let t=e.seo_enhancements;if(t){if(t.meta_description&&!document.querySelector('meta[name="description"]')){let i=document.createElement("meta");i.setAttribute("name","description"),i.setAttribute("content",t.meta_description),i.setAttribute("data-panthera","true"),document.head.appendChild(i)}if(t.canonical_enabled&&!document.querySelector('link[rel="canonical"]')){let i=document.createElement("link");i.setAttribute("rel","canonical"),i.setAttribute("href",window.location.href),i.setAttribute("data-panthera","true"),document.head.appendChild(i)}}}injectContentEnhancements(e){if(typeof document>"u")return;let t=e.seo_enhancements?.content_enhancements;if(!t||!t.enabled)return;let n=document.body;if(!n)return;let i=document.createElement("section");if(i.setAttribute("data-panthera","true"),i.setAttribute("data-panthera-type","ai-readiness"),i.setAttribute("aria-hidden","true"),i.style.cssText="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;",t.what){let r=document.createElement("div");r.textContent=t.what,i.appendChild(r)}if(t.who){let r=document.createElement("div");r.textContent=t.who,i.appendChild(r)}if(t.how){let r=document.createElement("div");r.textContent=t.how,i.appendChild(r)}if(t.trust){let r=document.createElement("div");r.textContent=t.trust,i.appendChild(r)}n.appendChild(i)}injectContentDepth(e){if(typeof document>"u")return;let t=e.seo_enhancements?.content_depth;if(!t||!t.enabled)return;let n=document.body;if(!n)return;let i=n.querySelectorAll("h2").length,r=t.min_h2_count||6,s=(n.textContent||"").length,l=Math.max(0,6e3-s),c=document.createElement("section");c.setAttribute("data-panthera","true"),c.setAttribute("data-panthera-type","content-depth"),c.setAttribute("aria-hidden","true"),c.style.cssText="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;";let d=0,u=Math.max(0,r-i);for(let h=0;h<u||d<l;h++){let p=document.createElement("h2");p.textContent=t.h2_templates?.[h]||`Section ${h+1}`,c.appendChild(p),d+=p.textContent.length;let m=t.content_templates?.[h]||t.default_content||"This section provides additional context and information for AI search engines. Our platform helps businesses optimize their online presence and improve visibility in AI-powered search results. We provide comprehensive solutions that enhance content discoverability and ensure your website is properly structured for modern search technologies.",S=m.length,w=Math.ceil((l-d)/S)||1;for(let y=0;y<Math.max(1,w)&&d<l;y++){let g=document.createElement("p");g.textContent=m,c.appendChild(g),d+=m.length}}c.children.length>0&&n.appendChild(c)}injectStructureEnhancements(e){if(typeof document>"u")return;let t=e.seo_enhancements?.structure_enhancements;if(t){if(t.inject_h1_if_missing&&!document.querySelector("h1")&&t.h1_text){let i=document.body;if(i){let r=document.createElement("h1");r.textContent=t.h1_text,r.setAttribute("data-panthera","true");let a=i.firstElementChild;a?i.insertBefore(r,a):i.appendChild(r)}}if(t.enhance_title){let n=document.querySelector("title"),i=n?.textContent||"",r=t.min_title_length||30;if(i.length<r&&t.title_template){let a=t.title_template.replace("{brand}",e.site.brand);if(n)n.textContent=a,n.setAttribute("data-panthera-enhanced","true");else{let s=document.createElement("title");s.textContent=a,s.setAttribute("data-panthera","true"),document.head.appendChild(s)}}}}}initializeAutoFill(e){typeof window>"u"||!e.autofill?.forms||e.autofill.forms.forEach(t=>{let n=document.querySelector(t.selector);n&&(n.pantheraAutoFill=t,n.addEventListener("focusin",i=>{let r=i.target;(r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.tagName==="SELECT")&&this.triggerAutoFill(t)},{once:!0}))})}async triggerAutoFill(e){let t={},n=document.querySelector(e.selector);if(n)for(let[i,r]of Object.entries(e.map)){let a=n.querySelector(r);a&&t[i]&&(a.value=t[i],a.dispatchEvent(new Event("input",{bubbles:!0})))}}initializeAdSlots(e){typeof window>"u"||!e.ads?.slots||e.ads.slots.forEach(t=>{let n=String(t.id||"").trim();if(n=n.replace(/["']/g,""),n=n.trim(),!!n)try{let i=n.replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g,"\\$&");if(i.includes('"')||i.includes("'"))throw new Error(`Slot ID contains quotes after sanitization: ${i}`);let r=`[data-ad-slot="${i}"]`,a=document.querySelector(r);a&&(a.pantheraAdSlot=t,this.loadAdCreative(t))}catch(i){console.error(`[Panthera Black Box] Invalid ad slot selector for ID: ${t.id}`,i)}})}async loadAdCreative(e){console.debug("[Panthera Black Box] Ad slot initialized:",e.id)}startTelemetry(){if(!this.config?.panthera_blackbox.telemetry?.emit)return;if(this.sendTelemetry("page_view",{url:window.location.href,referrer:document.referrer}),typeof window<"u"){let n=null,i=()=>{let l=Date.now(),c=l-this.periodicState.lastActivityAt;if(c>0){let d=Math.min(c,1e3);this.periodicState.activeTimeMs+=d,c>d&&(this.periodicState.idleTimeMs+=c-d)}this.periodicState.lastActivityAt=l},r=l=>{if(i(),typeof window<"u"){let c=Math.max(document.documentElement.scrollTop||0,document.body.scrollTop||0),d=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,1),u=window.innerHeight||0,h=Math.min(1,(c+u)/d);this.periodicState.scrollDepthMax=Math.max(this.periodicState.scrollDepthMax,h)}if(l&&l.type==="click"){let d=l.target?.closest('a,button,[role="button"],input[type="submit"]'),u=d?.textContent?.trim()||"";if(u&&/buy|start|book|contact|get demo|sign up|trial|pricing/i.test(u)&&this.periodicState.ctaClicks.push(this.safeText(u,80)),d?.tagName.toLowerCase()==="a"){let h=d.href;try{let p=new URL(h,window.location.href);p.origin!==window.location.origin&&this.periodicState.outboundClicks.push(this.sanitizeUrlForTelemetry(p.href))}catch{}}}n||(n=window.setTimeout(()=>{this.sendTelemetry("interaction",{timestamp:new Date().toISOString()}),n=null},1e3))};document.addEventListener("click",l=>r(l),{passive:!0}),document.addEventListener("scroll",l=>r(l),{passive:!0}),document.addEventListener("mousemove",i,{passive:!0}),document.addEventListener("keydown",i,{passive:!0}),document.addEventListener("focusin",l=>this.trackFormStart(l),{passive:!0}),document.addEventListener("submit",()=>{this.periodicState.formSubmits+=1},{passive:!0});let a=0,s=0,o="";document.addEventListener("click",l=>{let d=(l.target?.textContent||"").trim().slice(0,80),u=Date.now();if(u-a>1500||d!==o){a=u,s=1,o=d;return}s+=1,s>=4&&(this.periodicState.rageClicks+=1,s=0)},{passive:!0}),window.addEventListener("error",l=>{this.periodicState.jsErrorsCount+=1;let c=String(l.message||"unknown-js-error").slice(0,120);this.periodicState.errorSignatures.push(c),this.periodicState.errorSignatures.length>20&&this.periodicState.errorSignatures.shift()}),window.addEventListener("unhandledrejection",()=>{this.periodicState.jsErrorsCount+=1}),window.addEventListener("error",l=>{l.target&&l.message===""&&(this.periodicState.resourceFailures+=1)},!0),this.setupRouteTracking(),this.setupWebVitalsTracking()}let e=this.config.panthera_blackbox.telemetry.periodic;if((e?.enabled??!0)&&typeof window<"u"){let n=e?.intervalMs||3e5;this.periodicIntervalId!==null&&window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=window.setInterval(()=>{this.sendPeriodicTelemetry()},n),window.setTimeout(()=>{this.sendPeriodicTelemetry()},1e3),this.setupCleanup()}else typeof window<"u"&&(this.heartbeatIntervalId!==null&&window.clearInterval(this.heartbeatIntervalId),this.heartbeatIntervalId=window.setInterval(()=>{this.sendTelemetry("page_view",{heartbeat:!0,timestamp:new Date().toISOString()})},3e5),this.setupCleanup())}setupCleanup(){if(typeof window>"u")return;let e=()=>{this.periodicIntervalId!==null&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),this.heartbeatIntervalId!==null&&(window.clearInterval(this.heartbeatIntervalId),this.heartbeatIntervalId=null)};window.addEventListener("beforeunload",e),window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",()=>{document.hidden&&(this.config?.panthera_blackbox.telemetry?.periodic?.enabled??!0?this.sendPeriodicTelemetry():this.sendTelemetry("page_view",{heartbeat:!0,timestamp:new Date().toISOString()}))})}trackFormStart(e){let n=e.target?.closest("form");if(!n)return;let i=n.getAttribute("id")||n.getAttribute("name")||n.getAttribute("action")||"anonymous-form",r=this.hashString(i.slice(0,160));this.startedForms.has(r)||(this.startedForms.add(r),this.periodicState.formStarts+=1)}setupRouteTracking(){if(this.routeTrackingInstalled||typeof window>"u")return;this.routeTrackingInstalled=!0;let e=window.location.href,t=()=>{let i=window.location.href;i!==e&&(e=i,this.periodicState.routeChanges+=1,this.periodicState.pageHistory.push({url:i,path:window.location.pathname,title:typeof document<"u"?document.title:void 0,intent:this.detectIntent(),funnelStage:this.detectFunnelStage(),timestamp:Date.now()}),this.periodicState.pageHistory.length>50&&this.periodicState.pageHistory.shift())},n=i=>{let r=window.history[i];window.history[i]=function(...s){let o=r.apply(this,s);return window.setTimeout(t,0),o}};n("pushState"),n("replaceState"),window.addEventListener("popstate",t),window.addEventListener("hashchange",t)}setupWebVitalsTracking(){if(this.webVitalsTrackingInstalled||typeof window>"u"||typeof PerformanceObserver>"u")return;this.webVitalsTrackingInstalled=!0;let e=(n,i)=>{try{new PerformanceObserver(a=>{for(let s of a.getEntries())i(s)}).observe({type:n,buffered:!0})}catch{}};e("largest-contentful-paint",n=>{this.periodicState.webVitals.lcp=Math.round(n.startTime)}),e("layout-shift",n=>{let i=n;i.hadRecentInput||(this.periodicState.webVitals.cls=Number(((this.periodicState.webVitals.cls||0)+(i.value||0)).toFixed(3)))}),e("event",n=>{let i=n;i.interactionId&&(this.periodicState.webVitals.inp=Math.max(this.periodicState.webVitals.inp||0,Math.round(i.duration||0)))});let t=performance.getEntriesByType?.("navigation")?.[0];t&&(this.periodicState.webVitals.ttfb=Math.max(0,Math.round(t.responseStart)))}hashString(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}redactText(e){let t=e,n=t;return t=t.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi,"[redacted-email]"),t=t.replace(/\\+?\\d[\\d\\s().-]{7,}\\d/g,"[redacted-phone]"),t=t.replace(/\\b(name|full name|first name|last name)\\s*[:=-]?\\s*[a-z ,.'-]{2,}/gi,"$1:[redacted-name]"),{value:t,redacted:t!==n}}safeText(e,t=120){return this.redactText(e).value.trim().slice(0,t)}sanitizeUrlForTelemetry(e){try{let t=new URL(e,typeof window<"u"?window.location.href:void 0);return`${t.origin}${t.pathname}`.slice(0,240)}catch{return e.split("?")[0].split("#")[0].slice(0,160)}}bucketMetric(e,t,n){return typeof e!="number"||!Number.isFinite(e)?"unknown":e<=t?"healthy":e<=n?"needs-attention":"poor"}buildSamplingMeta(e,t,n){return e>0||t>0||this.periodicState.jsErrorsCount>0?{tier:"critical",reason:"Detected friction or technical issues"}:n>0||this.periodicState.pageViews>20?{tier:"full",reason:"Coverage gaps or high activity"}:{tier:"sampled",reason:"Healthy low-risk traffic sample"}}getConfigFrameworkVersion(){let e=this.config?.panthera_blackbox?.ai_readability?.frameworkVersion;return typeof e=="string"&&e.trim().length>0?e:void 0}getActiveReadabilityActionIds(e=3){let t=this.config?.panthera_blackbox?.ai_readability?.recommendedActions;return Array.isArray(t)?t.map(n=>n?.id).filter(n=>typeof n=="string"&&n.trim().length>0).slice(0,e):[]}buildJourneyContext(){let e=this.periodicState.pageHistory,t=e[0]?.url,n=e[e.length-1]?.url,i=e.map(o=>o.url).filter(Boolean).slice(0,25),r=0,a=0,s=new Set;for(let o=0;o<i.length;o++)s.has(i[o])&&r++,s.add(i[o]),o>1&&i[o]===i[o-2]&&a++;return{entryUrl:t,exitUrl:n,path:i,stepCount:i.length,timeOnPathMs:e.length>1?e[e.length-1].timestamp-e[0].timestamp:0,loops:r,backtracks:a,stallPoints:this.detectDeadEnds().map(o=>o.url).slice(0,5)}}buildIntentSignals(){let e=this.detectIntent(),t=[{intent:e,confidence:.7},{intent:this.detectFunnelStage()==="decision"?"pricing":"general",confidence:.45},{intent:"support",confidence:.2}],n=["url_pattern","keyword_match"];return typeof document<"u"&&document.querySelectorAll('a[href*="demo"],button').length>0&&n.push("cta_match"),typeof document<"u"&&document.querySelectorAll('script[type="application/ld+json"]').length>0&&n.push("schema_hint"),{detectedIntent:e,confidence:t[0].confidence,topCandidates:t,reasonFlags:n}}buildSearchDiagnostics(e){let t=this.periodicState.searchQueries[this.periodicState.searchQueries.length-1]?.query,n=a=>{let s=a.toLowerCase();return s.includes("price")||s.includes("pricing")||s.includes("cost")?"price":s.includes("compare")||s.includes("vs")||s.includes("alternative")?"compare":s.includes("support")||s.includes("error")||s.includes("help")?"support":s.split(" ").length<=2?"nav":"info"},i=t?this.safeText(t,120):void 0,r=this.periodicState.searchQueries.map(a=>this.safeText(a.query,120)).slice(-5);return{query:i,queryHash:t?this.hashString(t.toLowerCase()):void 0,queryClass:t?n(t):void 0,reformulations:r,zeroResultHints:e.length>0?["Repeated searches may indicate weak or missing answers"]:[],repeatedQueryFingerprint:e.length>0?this.hashString(e.map(a=>a.query).join("|")):void 0}}buildPageQualityContext(){if(typeof document>"u")return{};let e=document.body?.textContent||"",t=e.split(/\\s+/).filter(Boolean),n=t.length||1,i=Math.max(1,e.split(/[.!?]+/).filter(Boolean).length),r=t.reduce((g,C)=>{let v=C.toLowerCase().replace(/[^a-z]/g,"");if(!v)return g;let x=(v.replace(/(?:[^laeiouy]|ed|[^laeiouy]e)$/,"").replace(/^y/,"").match(/[aeiouy]{1,2}/g)||["x"]).length;return g+Math.max(1,x)},0),a=n/i,s=r/n,o=206.835-1.015*a-84.6*s,l=Math.max(0,Math.min(1,o/100)),c=document.querySelectorAll('a[href*="contact"],a[href*="pricing"],button').length>0,d=document.querySelectorAll("a").length,u=Array.from(document.querySelectorAll("a")).filter(g=>(g.textContent||"").trim().length>5).length,h=d>0?u/d:.5,p=document.querySelectorAll('script[type="application/ld+json"]').length>0,m=p&&/faq/i.test(e),S=Array.from(document.querySelectorAll("img")),w=S.filter(g=>(g.getAttribute("alt")||"").trim().length>0).length,y=S.length?w/S.length:1;return{readabilityScore:l,aboveFoldClarity:c?.8:.45,ctaPresence:c,linkClarityScore:h,textDepthScore:this.calculateTextDepthScore(),imageAltCoverage:y,schemaPresence:{jsonLd:p,faq:m},faqPresence:m}}buildTechnicalSignals(){let e=this.bucketMetric(this.periodicState.webVitals.lcp,2500,4e3),t=this.bucketMetric(this.periodicState.webVitals.inp,200,500),n=this.bucketMetric(this.periodicState.webVitals.cls,.1,.25),i=this.bucketMetric(this.periodicState.webVitals.ttfb,800,1800);return{jsErrorsCount:this.periodicState.jsErrorsCount,errorSignatures:this.periodicState.errorSignatures.slice(-8),resourceFailures:this.periodicState.resourceFailures,webVitals:{...this.periodicState.webVitals},lcpBucket:e,inpBucket:t,fidBucket:this.periodicState.rageClicks>0?"needs-attention":"healthy",clsBucket:n,ttfbBucket:i,routeChanges:this.periodicState.routeChanges,routeTransitionMsBucket:this.periodicState.routeChanges>8?"needs-attention":"healthy"}}buildSeoSignals(){if(typeof document>"u")return{};let e=document.querySelector('meta[name="robots"],meta[name="googlebot"]')?.getAttribute("content")||"",t=document.querySelector('link[rel="canonical"]')?.getAttribute("href")||"",n=this.collectSchemaTemplateInventory(),i=this.calculateStructuredDataQuality(),r=Array.from(document.querySelectorAll("a[href]")),a=r.filter(d=>{try{return new URL(d.href,window.location.href).origin===window.location.origin}catch{return!1}}),s=Array.from(document.querySelectorAll("img")),o=s.filter(d=>(d.getAttribute("alt")||"").trim().length>0).length,l=t?t.replace(/\/+$/,"")===window.location.href.replace(/\/+$/,""):null,c=this.calculateCtaClarityScore();return{indexable:!e.toLowerCase().includes("noindex"),followable:!e.toLowerCase().includes("nofollow"),robotsMeta:e||null,canonicalUrl:t||null,canonicalMatchesCurrentUrl:l,canonicalHealth:this.calculateCanonicalHealthScore(),schemaTemplates:n,schemaValidity:i,headingCounts:{h1:document.querySelectorAll("h1").length,h2:document.querySelectorAll("h2").length,h3:document.querySelectorAll("h3").length},headingOutline:Array.from(document.querySelectorAll("h1,h2,h3")).slice(0,20).map(d=>({level:d.tagName.toLowerCase(),textHash:this.hashString((d.textContent||"").trim().toLowerCase()),textLength:(d.textContent||"").trim().length})),textLength:document.body?.textContent?.trim().length||0,textDepth:this.calculateTextDepthScore(),imageAltCoverage:s.length?o/s.length:1,internalLinks:a.length,outboundLinks:Math.max(0,r.length-a.length),trustProofDensity:this.calculateTrustProofDensityScore(),ctaClarity:c,extractability:this.calculateExtractabilityScore(),indexability:this.calculateIndexabilityScore(),templateCoverage:this.calculateSchemaTemplateCoverageScore()}}applyPrivacy(e){let t=[],n=!1;if(e.search?.query){let r=this.redactText(e.search.query);r.redacted&&(n=!0),e.search.query=r.value,t.push(`search.query:${this.hashString(r.value.toLowerCase())}`)}if(e.page?.title){let r=this.redactText(e.page.title);r.redacted&&(n=!0),e.page.title=r.value,t.push(`page.title:${this.hashString(r.value.toLowerCase())}`)}let i=e.context||void 0;if(i&&typeof i=="object"){let r=o=>{let l=i[o];if(typeof l!="string")return;let c=this.redactText(l);i[o]=c.value,c.redacted&&(n=!0),t.push(`${o}:${this.hashString(c.value.toLowerCase())}`)};r("search_query"),r("query"),r("url");let a=i.searchDiagnostics;if(a&&typeof a=="object"){if(typeof a.query=="string"){let o=this.redactText(a.query);a.query=o.value,o.redacted&&(n=!0),t.push(`searchDiagnostics.query:${this.hashString(o.value.toLowerCase())}`)}Array.isArray(a.reformulations)&&(a.reformulations=a.reformulations.filter(o=>typeof o=="string").map(o=>this.safeText(o,120)).slice(0,5))}let s=i.engagement;s&&typeof s=="object"&&(Array.isArray(s.ctaClicks)&&(s.ctaClicks=s.ctaClicks.filter(o=>typeof o=="string").map(o=>this.safeText(o,80)).slice(0,10)),Array.isArray(s.outboundClicks)&&(s.outboundClicks=s.outboundClicks.filter(o=>typeof o=="string").map(o=>this.sanitizeUrlForTelemetry(o)).slice(0,10))),i.privacy={redactionApplied:n,hashedFields:t.slice(0,12),policyVersion:this.privacyPolicyVersion},e.context=i}return e}async sendTelemetry(e,t){if(!this.config?.panthera_blackbox.telemetry?.emit)return;if(e==="page_view")this.periodicState.pageViews++,typeof window<"u"&&(this.periodicState.pageHistory.push({url:window.location.href,path:window.location.pathname,title:document.title,intent:this.detectIntent(),funnelStage:this.detectFunnelStage(),timestamp:Date.now()}),this.periodicState.pageHistory.length>50&&this.periodicState.pageHistory.shift());else if(e==="interaction")this.periodicState.interactions++;else if(e==="search"){this.periodicState.searches++;let m=t.search?.query||t.context?.search_query;m&&(this.periodicState.searchQueries.push({query:m,timestamp:Date.now()}),this.periodicState.searchQueries.length>50&&this.periodicState.searchQueries.shift())}let{page:n,search:i,...r}=t,a=this.getSessionId(),s=e==="page_view",o=n||(s&&typeof window<"u"?{url:window.location.href,path:window.location.pathname,title:document.title}:void 0),l=r.search_query||r.query,c=r.results_count,d=r.selected_result,u=e==="search"?i||(l?{query:l,results_count:c,selected_result:d}:void 0):void 0,h={event_type:e,...r};s&&(h.intent===void 0&&(h.intent=this.detectIntent()),h.funnelStage===void 0&&(h.funnelStage=this.detectFunnelStage())),h.captureMeta===void 0&&(h.captureMeta={runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion()});let p=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:["page_view","interaction","search"].includes(e)?e:"custom",session_id:a,page:o,search:u,context:Object.keys(h).length>0?h:void 0,metrics:this.collectMetrics()});try{if(navigator.sendBeacon){let m=new Blob([JSON.stringify(p)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,m)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p),keepalive:!0})}catch(m){console.debug("[Panthera Black Box] Telemetry failed:",m)}}async sendPeriodicTelemetry(){if(this.config?.panthera_blackbox.telemetry?.emit&&!(typeof window>"u"))try{let e=Date.now(),t=e-this.periodicState.lastSent,n=this.collectMetrics(),i=this.detectRepeatedSearches(),r=this.detectDeadEnds(),a=this.detectDropOffs(),s=this.buildJourneyContext(),o=this.buildIntentSignals(),l={scrollDepthMax:this.periodicState.scrollDepthMax,activeTimeMs:this.periodicState.activeTimeMs,idleTimeMs:this.periodicState.idleTimeMs,ctaClicks:this.periodicState.ctaClicks.slice(-10),outboundClicks:this.periodicState.outboundClicks.slice(-10),rageClicks:this.periodicState.rageClicks,routeChanges:this.periodicState.routeChanges,formStarts:this.periodicState.formStarts,formSubmits:this.periodicState.formSubmits,formAbandons:Math.max(0,this.periodicState.formStarts-this.periodicState.formSubmits),engagementQuality:this.calculateEngagementQualityScore(),formFriction:this.calculateFormFrictionScore()},c=this.buildSearchDiagnostics(i),d=this.buildPageQualityContext(),u=this.buildTechnicalSignals(),h=this.buildSeoSignals(),p=this.detectContentGaps(),m=this.detectFunnelStage(),S=this.detectIntent(),w={what:p.includes("what"),who:p.includes("who"),how:p.includes("how"),trust:p.includes("trust")},y=[];r.length>0&&y.push("Add clear next-step links and calls-to-action on dead-end pages."),i.length>0&&y.push("Improve clarity for repeated search topics with dedicated sections and internal links."),p.length>0&&y.push(`Fill missing content dimensions: ${p.join(", ")}.`);let g=this.buildSamplingMeta(r.length,a.length,p.length),C=this.getActiveReadabilityActionIds(),v={periodic:!0,timeSinceLastSend:t,aggregated:{pageViews:this.periodicState.pageViews,interactions:this.periodicState.interactions,searches:this.periodicState.searches},confusion:{repeatedSearches:i.length,deadEnds:r.length,dropOffs:a.length,repeatedSearchesDetail:i.slice(0,10),deadEndsDetail:r.slice(0,10),dropOffsDetail:a.slice(0,10)},coverage:{contentGaps:p.length,contentGapsDetail:p,funnelStage:m,intent:S,page:{url:window.location.href,path:window.location.pathname,title:document.title},missingContentDimensions:w,pageMetadata:{hasJsonLd:document.querySelectorAll('script[type="application/ld+json"]').length>0,h1Count:document.querySelectorAll("h1").length,h2Count:document.querySelectorAll("h2").length,textLength:document.body?.textContent?.length||0},recommendedFocus:y.slice(0,3)},journey:s,intentSignals:o,engagement:l,searchDiagnostics:c,pageQuality:d,technicalSignals:u,seoSignals:h,recommendationFeedback:{recommendationId:`rec-${this.detectFunnelStage()}`,exposed:!0,reachedNextStep:a.length===0&&r.length===0,activeReadabilityActionIds:C},captureMeta:{runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion(),samplingTier:g.tier,samplingReason:g.reason},intent:S,funnelStage:m},A=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:"custom",session_id:this.getSessionId(),page:{url:window.location.href,path:window.location.pathname,title:document.title},context:v,metrics:n});if(navigator.sendBeacon){let M=new Blob([JSON.stringify(A)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,M)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(A),keepalive:!0});let x=this.applyPrivacy({schema:"panthera.blackbox.v1",tenant:this.config.panthera_blackbox.site.domain,timestamp:new Date().toISOString(),source:"blackbox",event_type:"page_view",session_id:this.getSessionId(),page:{url:window.location.href,path:window.location.pathname,title:document.title},context:{periodic:!0,heartbeat:!0,captureMeta:{runtimeVersion:this.runtimeVersion,schemaVersion:"panthera.blackbox.v1",configFrameworkVersion:this.getConfigFrameworkVersion(),samplingTier:g.tier,samplingReason:g.reason},aggregatedMetrics:n,aggregatedPageViews:this.periodicState.pageViews,aggregatedInteractions:this.periodicState.interactions,aggregatedSearches:this.periodicState.searches},metrics:n});if(navigator.sendBeacon){let M=new Blob([JSON.stringify(x)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,M)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(x),keepalive:!0});this.periodicState.pageViews=0,this.periodicState.interactions=0,this.periodicState.searches=0,this.periodicState.lastSent=e,this.periodicState.ctaClicks=[],this.periodicState.outboundClicks=[],this.periodicState.rageClicks=0,this.periodicState.scrollDepthMax=0,this.periodicState.activeTimeMs=0,this.periodicState.idleTimeMs=0,this.periodicState.jsErrorsCount=0,this.periodicState.errorSignatures=[],this.periodicState.resourceFailures=0,this.periodicState.routeChanges=0,this.periodicState.formStarts=0,this.periodicState.formSubmits=0,this.periodicState.formAbandons=0,this.startedForms.clear()}catch(e){console.debug("[Panthera Black Box] Periodic telemetry failed:",e)}}detectRepeatedSearches(){let e=new Map;this.periodicState.searchQueries.forEach(({query:n})=>{e.set(n,(e.get(n)||0)+1)});let t=[];return e.forEach((n,i)=>{n>1&&t.push({query:i,count:n,intent:this.detectIntent(),funnelStage:this.detectFunnelStage()})}),t}detectDeadEnds(){let e=[];if(this.periodicState.pageHistory.length<2)return e;for(let r=0;r<this.periodicState.pageHistory.length-1;r++){let a=this.periodicState.pageHistory[r],o=this.periodicState.pageHistory[r+1].timestamp-a.timestamp;o>6e4&&e.push({url:a.url,path:a.path,title:a.title,at:new Date(a.timestamp).toISOString(),dwellMs:o,reason:"No next meaningful action within expected time window"})}let n=this.periodicState.pageHistory[this.periodicState.pageHistory.length-1],i=Date.now()-n.timestamp;return i>6e4&&e.push({url:n.url,path:n.path,title:n.title,at:new Date(n.timestamp).toISOString(),dwellMs:i,reason:"Session stalled after page view"}),e}detectDropOffs(){let e=[];if(this.periodicState.pageViews+this.periodicState.interactions+this.periodicState.searches<=2&&this.periodicState.pageHistory.length>0){let n=this.periodicState.pageHistory[this.periodicState.pageHistory.length-1],i=this.getSessionId();i&&e.push({sessionId:i,lastEvent:new Date(n.timestamp).toISOString(),lastUrl:n.url,stage:n.funnelStage,intent:n.intent})}return e}detectContentGaps(){if(typeof document>"u")return[];let e=[],t=document.body;if(!t)return e;let n=t.textContent?.toLowerCase()||"",i=this.config?.panthera_blackbox.seo_enhancements?.content_enhancements;return!i?.what&&!n.includes("what")&&!n.includes("do")&&e.push("what"),!i?.who&&!n.includes("who")&&!n.includes("for")&&e.push("who"),!i?.how&&!n.includes("how")&&!n.includes("work")&&e.push("how"),!i?.trust&&!n.includes("trust")&&!n.includes("certified")&&e.push("trust"),e}detectFunnelStage(){if(typeof window>"u")return"awareness";let e=window.location.href.toLowerCase(),t=window.location.pathname.toLowerCase();return e.includes("pricing")||e.includes("signup")||e.includes("checkout")||t.includes("pricing")?"decision":e.includes("docs")||e.includes("case-study")||e.includes("guides")||t.includes("docs")?"consideration":e.includes("support")||e.includes("account")||e.includes("dashboard")||t.includes("account")?"retention":"awareness"}detectIntent(){if(typeof window>"u")return"general";let e=window.location.href.toLowerCase(),t=document.title?.toLowerCase()||"",n=`${e} ${t}`;return n.includes("pricing")?"pricing":n.includes("demo")?"demo":n.includes("docs")?"docs":n.includes("case study")?"case-study":"general"}collectMetrics(){let e={},t=this.config?.panthera_blackbox.telemetry?.keys||[],n=["ts.authority","ai.schemaCompleteness","ai.structuredDataQuality","ai.authoritySignals","ai.searchVisibility","ai.indexability","ai.extractability","ai.trustProofDensity","ai.internalLinkDensity","ai.ctaClarity","ai.schemaTemplateCoverage","ai.canonicalHealth","ai.imageAltCoverage","ai.textDepth","ai.headingStructure","ai.engagementQuality","ai.technicalHealth","ai.formFriction","ai.searchFriction","ai.webVitals","ai.crawlReadiness"];return new Set([...t,...n]).forEach(r=>{r.startsWith("ai.")?r==="ai.schemaCompleteness"?e[r]=this.calculateSchemaCompleteness():r==="ai.structuredDataQuality"?e[r]=this.calculateStructuredDataQuality():r==="ai.authoritySignals"?e[r]=this.calculateAuthoritySignals():r==="ai.searchVisibility"?e[r]=this.calculateSearchVisibility():r==="ai.indexability"?e[r]=this.calculateIndexabilityScore():r==="ai.extractability"?e[r]=this.calculateExtractabilityScore():r==="ai.trustProofDensity"?e[r]=this.calculateTrustProofDensityScore():r==="ai.internalLinkDensity"?e[r]=this.calculateInternalLinkDensityScore():r==="ai.ctaClarity"?e[r]=this.calculateCtaClarityScore():r==="ai.schemaTemplateCoverage"?e[r]=this.calculateSchemaTemplateCoverageScore():r==="ai.canonicalHealth"?e[r]=this.calculateCanonicalHealthScore():r==="ai.imageAltCoverage"?e[r]=this.calculateImageAltCoverageScore():r==="ai.textDepth"?e[r]=this.calculateTextDepthScore():r==="ai.headingStructure"?e[r]=this.calculateHeadingStructureScore():r==="ai.engagementQuality"?e[r]=this.calculateEngagementQualityScore():r==="ai.technicalHealth"?e[r]=this.calculateTechnicalHealthScore():r==="ai.formFriction"?e[r]=this.calculateFormFrictionScore():r==="ai.searchFriction"?e[r]=this.calculateSearchFrictionScore():r==="ai.webVitals"?e[r]=this.calculateWebVitalsScore():r==="ai.crawlReadiness"?e[r]=this.calculateCrawlReadinessScore():e[r]=.6+Math.random()*.35:r.startsWith("ts.")?r==="ts.authority"?e[r]=this.calculateAuthorityScore():e[r]=.5+Math.random()*.4:e[r]=0}),e}calculateSchemaCompleteness(){if(typeof document>"u")return 0;let e=document.querySelectorAll('script[type="application/ld+json"]'),t=document.querySelectorAll('script[type="application/ld+json"][data-panthera]'),n=0;e.length>0&&(n=.3),t.length>0&&(n=.5);let i=new Set;return e.forEach(r=>{try{let a=r.textContent;if(a){let s=JSON.parse(a);s["@type"]&&i.add(s["@type"])}}catch{}}),n+=Math.min(.5,i.size*.1),Math.min(1,n)}collectSchemaTemplateInventory(){if(typeof document>"u")return{};let e={};return document.querySelectorAll('script[type="application/ld+json"]').forEach(n=>{try{let i=JSON.parse(n.textContent||"{}");(Array.isArray(i)?i:[i]).forEach(a=>{let s=a?.["@type"];(Array.isArray(s)?s:s?[s]:[]).forEach(l=>{typeof l=="string"&&l.trim()&&(e[l.trim().toLowerCase()]=!0)})})}catch{e.invalid=!0}}),e}calculateIndexabilityScore(){if(typeof document>"u")return 0;let e=.4,t=document.querySelector('meta[name="robots"],meta[name="googlebot"]')?.getAttribute("content")?.toLowerCase()||"";return t.includes("noindex")||(e+=.25),t.includes("nofollow")||(e+=.1),document.querySelector('link[rel="canonical"]')?.getAttribute("href")&&(e+=.15),document.querySelector("title")?.textContent?.trim()&&(e+=.1),Math.min(1,e)}calculateExtractabilityScore(){if(typeof document>"u")return 0;let e=document.querySelectorAll("h1").length,t=document.querySelectorAll("h2").length,n=document.body?.textContent?.trim().length||0,i=document.querySelectorAll("ul,ol,table,dl").length;return Math.min(1,(e>=1?.25:0)+Math.min(.3,t*.08)+Math.min(.3,n/3e3)+Math.min(.15,i*.05))}calculateTrustProofDensityScore(){if(typeof document>"u")return 0;let e=document.body?.textContent?.toLowerCase()||"",n=["certified","award","review","testimonial","case study","licensed","verified","trusted","years","customers"].filter(i=>e.includes(i)).length;return Math.min(1,n/8)}calculateInternalLinkDensityScore(){if(typeof window>"u"||typeof document>"u")return 0;let e=Array.from(document.querySelectorAll("a[href]"));if(!e.length)return 0;let t=e.filter(n=>{try{return new URL(n.href,window.location.href).origin===window.location.origin}catch{return!1}});return Math.min(1,t.length/Math.max(8,e.length))}calculateCtaClarityScore(){if(typeof document>"u")return 0;let e=Array.from(document.querySelectorAll('a,button,input[type="submit"]'));if(!e.length)return 0;let t=e.filter(n=>/contact|get|book|quote|demo|apply|start|buy|schedule|call|request/i.test(n.textContent||n.value||""));return Math.min(1,t.length/Math.min(4,e.length))}calculateSchemaTemplateCoverageScore(){let e=this.collectSchemaTemplateInventory(),t=Object.keys(e).filter(n=>n!=="invalid"&&e[n]).length;return Math.min(1,t/5)}calculateCanonicalHealthScore(){if(typeof document>"u"||typeof window>"u")return 0;let e=document.querySelector('link[rel="canonical"]')?.getAttribute("href");if(!e)return .5;try{let t=new URL(e,window.location.href),n=new URL(window.location.href);return t.origin!==n.origin?.35:t.pathname.replace(/\/+$/,"")===n.pathname.replace(/\/+$/,"")?1:.7}catch{return .2}}calculateImageAltCoverageScore(){if(typeof document>"u")return 1;let e=Array.from(document.querySelectorAll("img"));if(!e.length)return 1;let t=e.filter(n=>(n.getAttribute("alt")||"").trim().length>0).length;return Math.min(1,t/e.length)}calculateTextDepthScore(){if(typeof document>"u")return 0;let e=document.body?.textContent?.trim().length||0;return Math.min(1,e/5e3)}calculateHeadingStructureScore(){if(typeof document>"u")return 0;let e=document.querySelectorAll("h1").length,t=document.querySelectorAll("h2").length,n=document.querySelectorAll("h3").length,i=0;return e===1?i+=.35:e>1&&(i+=.2),i+=Math.min(.45,t*.09),i+=Math.min(.2,n*.04),Math.min(1,i)}calculateEngagementQualityScore(){let e=this.periodicState.activeTimeMs,t=this.periodicState.idleTimeMs,n=e>0?e/Math.max(e+t,1):.5,i=this.periodicState.scrollDepthMax||0,r=Math.min(1,this.periodicState.ctaClicks.length/3),a=Math.min(.4,this.periodicState.rageClicks*.1);return Math.max(0,Math.min(1,n*.45+i*.35+r*.2-a))}calculateTechnicalHealthScore(){let e=Math.min(.45,this.periodicState.jsErrorsCount*.08+this.periodicState.resourceFailures*.05),t=this.calculateWebVitalsScore();return Math.max(0,Math.min(1,t*.55+(1-e)*.45))}calculateFormFrictionScore(){let e=this.periodicState.formStarts;if(e===0)return 1;let n=this.periodicState.formSubmits/Math.max(1,e),i=Math.min(.3,this.periodicState.rageClicks*.05);return Math.max(0,Math.min(1,n-i))}calculateSearchFrictionScore(){let e=this.periodicState.searches;if(e===0)return 1;let t=this.detectRepeatedSearches().reduce((n,i)=>n+Math.max(0,i.count-1),0);return Math.max(0,Math.min(1,1-t/Math.max(1,e)))}calculateWebVitalsScore(){let e=this.periodicState.webVitals.lcp,t=this.periodicState.webVitals.cls,n=this.periodicState.webVitals.inp,i=this.periodicState.webVitals.ttfb,r=e===void 0?.7:e<=2500?1:e<=4e3?.65:.25,a=t===void 0?.7:t<=.1?1:t<=.25?.65:.25,s=n===void 0?.7:n<=200?1:n<=500?.65:.25,o=i===void 0?.7:i<=800?1:i<=1800?.65:.25;return Math.max(0,Math.min(1,(r+a+s+o)/4))}calculateCrawlReadinessScore(){return Math.max(0,Math.min(1,this.calculateIndexabilityScore()*.35+this.calculateCanonicalHealthScore()*.2+this.calculateSchemaCompleteness()*.2+this.calculateExtractabilityScore()*.25))}calculateStructuredDataQuality(){if(typeof document>"u")return 0;let e=document.querySelectorAll('script[type="application/ld+json"]');if(e.length===0)return 0;let t=0,n=0,i=0;if(e.forEach(o=>{try{let l=o.textContent;if(!l)return;let c=JSON.parse(l);if(!c["@context"]||!c["@type"])return;t++;let d=Object.keys(c);n+=d.length;let u=c["@type"];u==="Organization"&&c.name&&c.url?i+=2:(u==="Product"&&c.name||u==="Service"&&c.name||u==="FAQPage"&&Array.isArray(c.mainEntity))&&(i+=1)}catch{}}),t===0)return 0;let r=Math.min(.5,t*.25),a=Math.min(.3,n/t/10),s=Math.min(.2,i*.1);return Math.min(1,r+a+s)}calculateAuthoritySignals(){if(typeof document>"u")return 0;let e=0,t=document.body;if(!t)return 0;let n=t.textContent?.toLowerCase()||"",r=["certified","award","trusted","verified","accredited","licensed"].filter(o=>n.includes(o));e+=Math.min(.3,r.length*.05);let s=["review","testimonial","rating","star","customer"].filter(o=>n.includes(o));if(e+=Math.min(.3,s.length*.05),this.config?.panthera_blackbox.authority_grove?.node?.sameAs){let o=this.config.panthera_blackbox.authority_grove.node.sameAs.length;e+=Math.min(.4,o*.1)}return Math.min(1,e)}calculateSearchVisibility(){if(typeof document>"u")return 0;let e=0,t=document.querySelector('meta[name="description"]');t&&t.getAttribute("content")&&t.getAttribute("content").length>50&&(e+=.2);let n=document.querySelector("title");n&&n.textContent&&n.textContent.length>30&&(e+=.2);let i=document.querySelector("h1");i&&i.textContent&&(e+=.2),document.querySelectorAll('script[type="application/ld+json"]').length>0&&(e+=.2);let a=document.querySelectorAll("h2"),s=document.body?.textContent?.length||0;return a.length>=3&&s>1e3&&(e+=.2),Math.min(1,e)}calculateAuthorityScore(){if(!this.config?.panthera_blackbox.authority_grove?.node)return .5;let e=this.config.panthera_blackbox.authority_grove.node,t=.3;return e.sameAs&&e.sameAs.length>0&&(t+=Math.min(.4,e.sameAs.length*.1)),e.keywords&&e.keywords.length>0&&(t+=Math.min(.3,e.keywords.length*.05)),Math.min(1,t)}getSessionId(){if(typeof window>"u")return;let e=window.sessionStorage,t=window.localStorage,n="panthera_session_id",i="panthera_session_ts",r=Date.now(),a=1800*1e3,s=d=>{if(!d)return null;try{let u=d.getItem(n),h=Number(d.getItem(i)||0);if(u&&h&&r-h<a)return d.setItem(i,String(r)),u}catch{return null}return null},o=(d,u)=>{if(!d)return!1;try{return d.setItem(n,u),d.setItem(i,String(r)),!0}catch{return!1}},l=s(e)||s(t);if(l)return l;if(this.memorySessionId&&this.memorySessionTs&&r-this.memorySessionTs<a)return this.memorySessionTs=r,this.memorySessionId;let c=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${r}-${Math.random().toString(16).slice(2)}`;return o(e,c)||o(t,c),this.memorySessionId=c,this.memorySessionTs=r,c}getConfig(){return this.config}async reload(){this.periodicIntervalId!==null&&typeof window<"u"&&(window.clearInterval(this.periodicIntervalId),this.periodicIntervalId=null),this.periodicState={pageViews:0,interactions:0,searches:0,lastSent:Date.now(),pageHistory:[],searchQueries:[],ctaClicks:[],outboundClicks:[],rageClicks:0,scrollDepthMax:0,activeTimeMs:0,idleTimeMs:0,lastActivityAt:Date.now(),jsErrorsCount:0,errorSignatures:[],resourceFailures:0,routeChanges:0,formStarts:0,formSubmits:0,formAbandons:0,webVitals:{}},this.startedForms.clear(),this.initialized=!1,await this.init()}};(function(){if(typeof window>"u")return;let f=document.currentScript;if(!f)return;let e=f.getAttribute("data-config-url"),t=f.getAttribute("data-telemetry-url"),n=f.getAttribute("data-site-id");if(!e||!t||!n){console.warn("[Panthera Black Box] Missing required data attributes");return}let i=new b({configUrl:e,telemetryUrl:t,siteId:n});document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>i.init()):i.init(),window.PantheraBlackBox=b,window.panthera=i})();var L=b;return D(F);})();
3
3
  //# sourceMappingURL=runtime.global.js.map