@careerdriver/black-box 1.2.3 → 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 +19 -4
- package/dist/runtime.d.ts +29 -0
- package/dist/runtime.global.js +1 -1
- package/dist/runtime.global.js.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,6 +33,21 @@ The runtime reads JSON configuration from your GPTO dashboard and automatically:
|
|
|
33
33
|
|
|
34
34
|
## Usage
|
|
35
35
|
|
|
36
|
+
### Context-Only Mode (No Header/HTML Injection)
|
|
37
|
+
|
|
38
|
+
If you want Blackbox to collect telemetry/context only (without changing visible HTML or `<head>`), set:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"panthera_blackbox": {
|
|
43
|
+
"frontend_mode": "context_only",
|
|
44
|
+
"invisible_context_only": true
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
In this mode, Blackbox keeps config fetch + telemetry sending active, but skips schema/meta/title/content injections.
|
|
50
|
+
|
|
36
51
|
### Quick Start Guide
|
|
37
52
|
|
|
38
53
|
#### Step 1: Install via npm (Primary)
|
|
@@ -120,7 +135,7 @@ pnpm add @careerdriver/black-box
|
|
|
120
135
|
pnpm add -D @careerdriver/black-box
|
|
121
136
|
|
|
122
137
|
# Install specific version
|
|
123
|
-
pnpm add @careerdriver/black-box@1.
|
|
138
|
+
pnpm add @careerdriver/black-box@1.4.0
|
|
124
139
|
|
|
125
140
|
# Install latest version (includes periodic telemetry)
|
|
126
141
|
pnpm add @careerdriver/black-box@latest
|
|
@@ -135,7 +150,7 @@ pnpm add @careerdriver/black-box@latest
|
|
|
135
150
|
npm install @careerdriver/black-box@latest
|
|
136
151
|
|
|
137
152
|
# Install specific version
|
|
138
|
-
npm install @careerdriver/black-box@1.
|
|
153
|
+
npm install @careerdriver/black-box@1.4.0
|
|
139
154
|
```
|
|
140
155
|
|
|
141
156
|
#### Using yarn
|
|
@@ -145,7 +160,7 @@ npm install @careerdriver/black-box@1.2.3
|
|
|
145
160
|
yarn add @careerdriver/black-box@latest
|
|
146
161
|
|
|
147
162
|
# Install specific version
|
|
148
|
-
yarn add @careerdriver/black-box@1.
|
|
163
|
+
yarn add @careerdriver/black-box@1.4.0
|
|
149
164
|
```
|
|
150
165
|
|
|
151
166
|
### ESM Import Usage
|
|
@@ -178,7 +193,7 @@ Add the script tag to your HTML:
|
|
|
178
193
|
></script>
|
|
179
194
|
```
|
|
180
195
|
|
|
181
|
-
**Note:** The `@latest` version includes periodic telemetry (v1.2.0+). To use a specific version, replace `@latest` with `@1.
|
|
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.
|
|
182
197
|
|
|
183
198
|
#### Via Local Installation
|
|
184
199
|
|
package/dist/runtime.d.ts
CHANGED
|
@@ -100,6 +100,8 @@ interface BlackBoxConfig {
|
|
|
100
100
|
};
|
|
101
101
|
};
|
|
102
102
|
tier?: 'bronze' | 'silver' | 'gold';
|
|
103
|
+
frontend_mode?: 'full' | 'context_only';
|
|
104
|
+
invisible_context_only?: boolean;
|
|
103
105
|
autofill?: AutofillConfig;
|
|
104
106
|
ads?: AdsConfig;
|
|
105
107
|
authority_grove?: AuthorityGroveConfig;
|
|
@@ -123,6 +125,9 @@ declare class PantheraBlackBox {
|
|
|
123
125
|
private heartbeatIntervalId;
|
|
124
126
|
private memorySessionId?;
|
|
125
127
|
private memorySessionTs?;
|
|
128
|
+
private routeTrackingInstalled;
|
|
129
|
+
private webVitalsTrackingInstalled;
|
|
130
|
+
private startedForms;
|
|
126
131
|
private periodicState;
|
|
127
132
|
constructor(options: {
|
|
128
133
|
configUrl: string;
|
|
@@ -185,8 +190,14 @@ declare class PantheraBlackBox {
|
|
|
185
190
|
* Set up cleanup handlers for page unload
|
|
186
191
|
*/
|
|
187
192
|
private setupCleanup;
|
|
193
|
+
private trackFormStart;
|
|
194
|
+
private setupRouteTracking;
|
|
195
|
+
private setupWebVitalsTracking;
|
|
188
196
|
private hashString;
|
|
189
197
|
private redactText;
|
|
198
|
+
private safeText;
|
|
199
|
+
private sanitizeUrlForTelemetry;
|
|
200
|
+
private bucketMetric;
|
|
190
201
|
private buildSamplingMeta;
|
|
191
202
|
private getConfigFrameworkVersion;
|
|
192
203
|
private getActiveReadabilityActionIds;
|
|
@@ -195,6 +206,7 @@ declare class PantheraBlackBox {
|
|
|
195
206
|
private buildSearchDiagnostics;
|
|
196
207
|
private buildPageQualityContext;
|
|
197
208
|
private buildTechnicalSignals;
|
|
209
|
+
private buildSeoSignals;
|
|
198
210
|
private applyPrivacy;
|
|
199
211
|
/**
|
|
200
212
|
* Send telemetry event
|
|
@@ -237,6 +249,23 @@ declare class PantheraBlackBox {
|
|
|
237
249
|
* Based on presence and count of JSON-LD schemas
|
|
238
250
|
*/
|
|
239
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;
|
|
240
269
|
/**
|
|
241
270
|
* Calculate structured data quality score (0-1)
|
|
242
271
|
* Based on JSON-LD schema validity and completeness
|
package/dist/runtime.global.js
CHANGED
|
@@ -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 _=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=_(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;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.",b=g.length,y=Math.ceil((l-d)/b)||1;for(let f=0;f<Math.max(1,y)&&d<l;f++){let S=document.createElement("p");S.textContent=g,o.appendChild(S),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(),b={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),S=this.getActiveReadabilityActionIds(),A={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:b,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:S},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:A,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 k=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(k)],{type:"application/json"});navigator.sendBeacon(this.telemetryUrl,v)}else await fetch(this.telemetryUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(k),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
|