@wcag-checkr/ci 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{ErrorBoundary-Cqi0ZKe2.js → ErrorBoundary-CzV_1Ln4.js} +31 -31
- package/dist/assets/{copy-ai-fixer-prompt-CRsdN4Sj.js → copy-ai-fixer-prompt-CL_yFzec.js} +2 -2
- package/dist/assets/{devtools-panel-D9An3OOB.js → devtools-panel-hFt35zzD.js} +1 -1
- package/dist/assets/{parallel-tab-flow-CU0Ury3L.js → parallel-tab-flow-DN_z0IGA.js} +1 -1
- package/dist/assets/{rubric-config-client-DJeX8aIu.js → rubric-config-client-Ck8nJHda.js} +1 -1
- package/dist/assets/{scheduled-audit-runner-DHb4xUoT.js → scheduled-audit-runner-DO-z335b.js} +2 -2
- package/dist/assets/{service-worker.ts-phJ4har2.js → service-worker.ts-BZg0XiJG.js} +2 -2
- package/dist/assets/side-panel-BjfjV2qz.js +4 -0
- package/dist/assets/{site-report-renderer-DhC9RU2d.js → site-report-renderer-Cdd4E5RB.js} +1 -1
- package/dist/devtools/panel.html +3 -3
- package/dist/manifest.json +1 -1
- package/dist/service-worker-loader.js +1 -1
- package/dist/side-panel/side-panel.html +5 -5
- package/package.json +1 -1
- package/dist/assets/side-panel-BiD3ZdNA.js +0 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-
|
|
2
|
-
import{_ as l}from"./preload-helper-D7HrI6pR.js";import{r as v}from"./crash-reporter-DAZnNefT.js";async function C(e){var f,w,y,g;if(e.results.length===0)return;let d;if(e.componentId){const o=await chrome.storage.local.get("igtRuns"),a=((o==null?void 0:o.igtRuns)??{})[e.componentId]??{};d=Object.values(a)}let p,u;const i=((f=e.results[0])==null?void 0:f.pageUrl)??((w=e.results[0])==null?void 0:w.scope)??"";if(i){const{getDismissalsForUrl:o}=await l(async()=>{const{getDismissalsForUrl:t}=await import("./ErrorBoundary-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-CzV_1Ln4.js","assets/styles-clWOl0K-.js","assets/_commonjsHelpers-Cpj98o6Y.js","assets/crash-reporter-DAZnNefT.js","assets/ai-usage-log-HdIilbbf.js","assets/styles-BwnbwQRf.css","assets/scheduled-audit-runner-DO-z335b.js","assets/preload-helper-D7HrI6pR.js","assets/diff-CECbooHD.js","assets/design-system-audit-DpxJrxnb.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as l}from"./preload-helper-D7HrI6pR.js";import{r as v}from"./crash-reporter-DAZnNefT.js";async function C(e){var f,w,y,g;if(e.results.length===0)return;let d;if(e.componentId){const o=await chrome.storage.local.get("igtRuns"),a=((o==null?void 0:o.igtRuns)??{})[e.componentId]??{};d=Object.values(a)}let p,u;const i=((f=e.results[0])==null?void 0:f.pageUrl)??((w=e.results[0])==null?void 0:w.scope)??"";if(i){const{getDismissalsForUrl:o}=await l(async()=>{const{getDismissalsForUrl:t}=await import("./ErrorBoundary-CzV_1Ln4.js").then(n=>n.o);return{getDismissalsForUrl:t}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),r=await o(i);p=Object.keys(r);const{getResolutionsForPage:a}=await l(async()=>{const{getResolutionsForPage:t}=await import("./scheduled-audit-runner-DO-z335b.js").then(n=>n.b7);return{getResolutionsForPage:t}},__vite__mapDeps([6,7,3,8,4])),c=await a(i),x=new Set;for(const t of e.results)for(const n of((y=t.axeRulesEvaluated)==null?void 0:y.incomplete)??[])for(const _ of n.elements??[])x.add(`${n.ruleId}::${_.selector}`);u=c.filter(t=>x.has(`${t.ruleId}::${t.selector}`))}let m;if(e.componentId){const{loadAcknowledgedKeysForComponent:o}=await l(async()=>{const{loadAcknowledgedKeysForComponent:a}=await import("./scheduled-audit-runner-DO-z335b.js").then(c=>c.b6);return{loadAcknowledgedKeysForComponent:a}},__vite__mapDeps([6,7,3,8,4])),r=await o(e.componentId);m=r.size>0?Array.from(r):void 0}const b=await v({type:"EXPORT_REQUEST",format:"ai-prompt",results:e.results,delta:e.delta??void 0,manualRuns:d,siteCrawlReport:e.siteCrawlReport??void 0,dismissedKeys:p,incompleteResolutions:u,acknowledgedKeys:m});try{await navigator.clipboard.writeText(b.content)}catch{}const h=`<!doctype html><html><head><meta charset="utf-8"><title>AI fix prompt</title>
|
|
3
3
|
<style>body{font:14px/1.5 ui-monospace,Menlo,monospace;max-width:920px;margin:24px auto;padding:0 16px;color:#0f172a;}
|
|
4
4
|
.banner{background:#ecfdf5;border:1px solid #6ee7b7;padding:12px 14px;border-radius:6px;margin-bottom:16px;font-family:system-ui;}
|
|
5
5
|
pre{white-space:pre-wrap;word-break:break-word;background:#f8fafc;border:1px solid #e2e8f0;padding:14px;border-radius:6px;font-size:13px;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as s,j as e,R as n}from"./styles-clWOl0K-.js";import{E as i,u as a,n as l}from"./ErrorBoundary-
|
|
1
|
+
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as s,j as e,R as n}from"./styles-clWOl0K-.js";import{E as i,u as a,n as l}from"./ErrorBoundary-CzV_1Ln4.js";import{i as p,e as m}from"./crash-reporter-DAZnNefT.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-HdIilbbf.js";import"./scheduled-audit-runner-DO-z335b.js";import"./preload-helper-D7HrI6pR.js";import"./diff-CECbooHD.js";import"./design-system-audit-DpxJrxnb.js";p("devtools-panel");function c(){const t=a(r=>r.tier);return m(t,"devtoolsPanel")?e.jsx(l,{}):e.jsxs("div",{style:{padding:24,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif'},children:[e.jsx("h2",{style:{margin:0,fontSize:16,fontWeight:600,color:"#1f2923"},children:"DevTools panel isn’t available on your current plan"}),e.jsx("p",{style:{marginTop:8,fontSize:13,color:"#64748b"},children:"The wcagcheckr DevTools panel is part of a higher-tier plan. The extension’s side panel is still available — open it from the extensions menu."})]})}const o=document.getElementById("root");if(!o)throw new Error("devtools panel: #root not found");s(o).render(e.jsx(n.StrictMode,{children:e.jsx(i,{children:e.jsx(c,{})})}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b1 as p,b2 as g,b3 as $,b4 as v}from"./scheduled-audit-runner-
|
|
1
|
+
import{b1 as p,b2 as g,b3 as $,b4 as v}from"./scheduled-audit-runner-DO-z335b.js";import{k as w,c as E,h as T}from"./crash-reporter-DAZnNefT.js";import"./preload-helper-D7HrI6pR.js";import"./diff-CECbooHD.js";import"./ai-usage-log-HdIilbbf.js";const m=E("parallel-tab-flow");async function _(s){const n=performance.now(),a=p(s.matrix),o=Math.max(1,Math.min(s.parallelism??4,8)),i=[];for(let e=0;e<o;e++)i.push([]);a.forEach((e,b)=>{i[b%o].push(e)}),m.info(`parallel-tab audit starting: ${a.length} states across ${o} tabs (~${Math.ceil(a.length/o)} states/tab)`);const r=a.length;let t=0;a[0]&&w({type:"AUDIT_PROGRESS_EVENT",current:0,total:r,currentState:a[0]});const l=e=>{t++,w({type:"AUDIT_PROGRESS_EVENT",current:t,total:r,currentState:e})},d=i.map((e,b)=>e.length===0?Promise.resolve({results:[],failed:!1}):y(s.targetUrl,s.scope,e,b,s.cancel,l)),h=await Promise.all(d),c=[];let u=0,f=0;for(const e of h)e.failed?f++:u++,c.push(...e.results);return{results:c,parallelDurationMs:performance.now()-n,tabsCompleted:u,tabsFailed:f}}async function y(s,n,a,o,i,r){let t;const l=[];try{const d=await chrome.tabs.create({url:s,active:!1});if(!d.id)throw new Error("chrome.tabs.create returned no id");if(t=d.id,m.debug(`worker ${o}: opened tab ${t}`),await U(t),i.isCanceled())throw new Error("canceled");const h=await g(t,0);if(!h.ok)throw new Error(`content script unreachable: ${h.reason}`);for(let c=0;c<a.length&&!i.isCanceled();c++){const u=a[c];try{if(!(await $(t,u,n)).success){m.warn(`worker ${o} state ${c+1}/${a.length} drive failed`),r==null||r(u);continue}const e=await T(t,{type:"AUDIT_REQUEST",selector:n,currentState:u});e.success&&e.result&&l.push({...e.result,violations:e.result.violations})}catch(f){m.debug(`worker ${o} state ${c+1} error`,f)}finally{r==null||r(u)}}try{await v(t,n)}catch{}return{results:l,failed:!1}}catch(d){return m.warn(`worker ${o} failed`,d),{results:l,failed:!0}}finally{if(t!==void 0)try{await chrome.tabs.remove(t)}catch{}}}function U(s,n=3e4){return new Promise((a,o)=>{const i=setTimeout(()=>{chrome.tabs.onUpdated.removeListener(r),o(new Error(`tab ${s} load timed out after ${n}ms`))},n),r=(t,l)=>{t===s&&l.status==="complete"&&(clearTimeout(i),chrome.tabs.onUpdated.removeListener(r),a())};chrome.tabs.onUpdated.addListener(r),chrome.tabs.get(s).then(t=>{t.status==="complete"&&(clearTimeout(i),chrome.tabs.onUpdated.removeListener(r),a())})})}export{_ as runParallelTabAudit};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as t,n as i,o as e,aX as n}from"./scheduled-audit-runner-
|
|
1
|
+
import{m as t,n as i,o as e,aX as n}from"./scheduled-audit-runner-DO-z335b.js";import{c as o}from"./crash-reporter-DAZnNefT.js";const c=o("rubric-config-client"),f="wcagcheckr",u=`https://api.wcagcheckr.com/v1/products/${f}/rubrics`,h=1e4,s="rubric-config-refresh",d=60;async function R(){const r=await t();if(!r){e(null);return}if(i(r)==="expired"){c.warn("cached rubrics are expired (>7d); falling back to bundled defaults"),e(null);return}e(r.config)}async function g(){try{const r=await fetch(u,{signal:AbortSignal.timeout(h),headers:{accept:"application/json"}});if(!r.ok)throw new Error(`http ${r.status}`);const a=await r.json();await n({fetchedAt:Date.now(),config:a}),e(a),c.info("rubrics refreshed from server")}catch(r){c.warn("rubric refresh failed; keeping prior cache",r)}}function b(){chrome.alarms.create(s,{periodInMinutes:d}),chrome.alarms.onAlarm.addListener(r=>{r.name===s&&g()})}export{b as a,g as r,R as w};
|
package/dist/assets/{scheduled-audit-runner-DHb4xUoT.js → scheduled-audit-runner-DO-z335b.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/parallel-tab-flow-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/parallel-tab-flow-DN_z0IGA.js","assets/crash-reporter-DAZnNefT.js","assets/preload-helper-D7HrI6pR.js","assets/diff-CECbooHD.js","assets/ai-usage-log-HdIilbbf.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
var as=Object.defineProperty;var ns=(e,t,a)=>t in e?as(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var Wt=(e,t,a)=>ns(e,typeof t!="symbol"?t+"":t,a);import{_ as kn}from"./preload-helper-D7HrI6pR.js";import{c as Z,e as he,o as $e,k as H,h as xe,f as $t,j as tr}from"./crash-reporter-DAZnNefT.js";import{b as pe,m as Xn,d as os,T as rs,e as Qn,c as xn,g as ga,i as Zn}from"./diff-CECbooHD.js";import{i as is,j as Pe,J as ss,T as In,x as Nt,v as ma,z as ke,D as cs,e as nn,K as ls,L as ds,M as us,N as hs,O as ps,P as fs,W as gs,b as ms,g as bs,u as ys,r as ws,f as vs}from"./ai-usage-log-HdIilbbf.js";const on=(e,t)=>t.some(a=>e instanceof a);let eo,to;function As(){return eo||(eo=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ks(){return to||(to=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const rn=new WeakMap,Fa=new WeakMap,ba=new WeakMap;function xs(e){const t=new Promise((a,n)=>{const o=()=>{e.removeEventListener("success",r),e.removeEventListener("error",i)},r=()=>{a(Qe(e.result)),o()},i=()=>{n(e.error),o()};e.addEventListener("success",r),e.addEventListener("error",i)});return ba.set(t,e),t}function Is(e){if(rn.has(e))return;const t=new Promise((a,n)=>{const o=()=>{e.removeEventListener("complete",r),e.removeEventListener("error",i),e.removeEventListener("abort",i)},r=()=>{a(),o()},i=()=>{n(e.error||new DOMException("AbortError","AbortError")),o()};e.addEventListener("complete",r),e.addEventListener("error",i),e.addEventListener("abort",i)});rn.set(e,t)}let sn={get(e,t,a){if(e instanceof IDBTransaction){if(t==="done")return rn.get(e);if(t==="store")return a.objectStoreNames[1]?void 0:a.objectStore(a.objectStoreNames[0])}return Qe(e[t])},set(e,t,a){return e[t]=a,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function ar(e){sn=e(sn)}function Ss(e){return ks().includes(e)?function(...t){return e.apply(cn(this),t),Qe(this.request)}:function(...t){return Qe(e.apply(cn(this),t))}}function Cs(e){return typeof e=="function"?Ss(e):(e instanceof IDBTransaction&&Is(e),on(e,As())?new Proxy(e,sn):e)}function Qe(e){if(e instanceof IDBRequest)return xs(e);if(Fa.has(e))return Fa.get(e);const t=Cs(e);return t!==e&&(Fa.set(e,t),ba.set(t,e)),t}const cn=e=>ba.get(e);function Sn(e,t,{blocked:a,upgrade:n,blocking:o,terminated:r}={}){const i=indexedDB.open(e,t),c=Qe(i);return n&&i.addEventListener("upgradeneeded",d=>{n(Qe(i.result),d.oldVersion,d.newVersion,Qe(i.transaction),d)}),a&&i.addEventListener("blocked",d=>a(d.oldVersion,d.newVersion,d)),c.then(d=>{r&&d.addEventListener("close",()=>r()),o&&d.addEventListener("versionchange",l=>o(l.oldVersion,l.newVersion,l))}).catch(()=>{}),c}const $s=["get","getKey","getAll","getAllKeys","count"],Ts=["put","add","delete","clear"],_a=new Map;function ao(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(_a.get(t))return _a.get(t);const a=t.replace(/FromIndex$/,""),n=t!==a,o=Ts.includes(a);if(!(a in(n?IDBIndex:IDBObjectStore).prototype)||!(o||$s.includes(a)))return;const r=async function(i,...c){const d=this.transaction(i,o?"readwrite":"readonly");let l=d.store;return n&&(l=l.index(c.shift())),(await Promise.all([l[a](...c),o&&d.done]))[0]};return _a.set(t,r),r}ar(e=>({...e,get:(t,a,n)=>ao(t,a)||e.get(t,a,n),has:(t,a)=>!!ao(t,a)||e.has(t,a)}));const Es=["continue","continuePrimaryKey","advance"],no={},ln=new WeakMap,nr=new WeakMap,Rs={get(e,t){if(!Es.includes(t))return e[t];let a=no[t];return a||(a=no[t]=function(...n){ln.set(this,nr.get(this)[t](...n))}),a}};async function*Os(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;const a=new Proxy(t,Rs);for(nr.set(a,t),ba.set(a,cn(t));t;)yield a,t=await(ln.get(a)||t.continue()),ln.delete(a)}function oo(e,t){return t===Symbol.asyncIterator&&on(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&on(e,[IDBIndex,IDBObjectStore])}ar(e=>({...e,get(t,a,n){return oo(t,a)?Os:e.get(t,a,n)},has(t,a){return oo(t,a)||e.has(t,a)}}));const Ms="wcag-component-auditor",Ds=3;let rt=null;function ce(){return rt||(rt=Sn(Ms,Ds,{upgrade(e,t){if(t<1){const a=e.createObjectStore("baselines",{keyPath:"componentId"});a.createIndex("byUrl","snapshotMeta.url"),a.createIndex("byDate","lastUpdated");const n=e.createObjectStore("audit-history",{keyPath:"auditId",autoIncrement:!0});n.createIndex("byComponentId","componentId"),n.createIndex("byDate","runDate")}if(t<2&&e.createObjectStore("site-crawl-per-url",{keyPath:"slot"}),t<3){e.createObjectStore("scheduled-audits",{keyPath:"id"});const a=e.createObjectStore("scheduled-audit-results",{keyPath:"resultId",autoIncrement:!0});a.createIndex("byScheduleId","scheduleId"),a.createIndex("byRanAt","ranAt")}}})),rt}async function Ns(){rt&&(await rt).close(),rt=null}async function ya(e){return(await ce()).get("baselines",e)}async function Cn(e){await(await ce()).put("baselines",e)}async function or(e){await(await ce()).delete("baselines",e)}async function rr(){return(await ce()).getAll("baselines")}async function Ls(e){return(await ce()).getAllFromIndex("baselines","byUrl",e)}async function Ps(e){return(await ce()).add("audit-history",e)}async function Fs(e){return(await ce()).getAllFromIndex("audit-history","byComponentId",e)}async function ir(){return(await ce()).get("site-crawl-per-url","current")}async function sr(e){await(await ce()).put("site-crawl-per-url",{...e,slot:"current"})}async function $n(){await(await ce()).delete("site-crawl-per-url","current")}async function cr(){return(await ce()).getAll("scheduled-audits")}async function lr(e){return(await ce()).get("scheduled-audits",e)}async function Tn(e){await(await ce()).put("scheduled-audits",e)}async function _s(e){await(await ce()).delete("scheduled-audits",e)}async function dr(e){return(await ce()).add("scheduled-audit-results",e)}async function Us(e){return(await ce()).getAllFromIndex("scheduled-audit-results","byScheduleId",e)}async function Ws(){return(await ce()).getAll("scheduled-audit-results")}async function ur(e,t=50){const a=await ce(),n=await a.getAllFromIndex("scheduled-audit-results","byScheduleId",e);if(n.length<=t)return;n.sort((i,c)=>c.ranAt.localeCompare(i.ranAt));const o=n.slice(t),r=a.transaction("scheduled-audit-results","readwrite");for(const i of o)i.resultId!==void 0&&await r.store.delete(i.resultId);await r.done}async function Gs(e){const a=(await ce()).transaction("scheduled-audit-results","readwrite");let o=await a.store.index("byScheduleId").openCursor(IDBKeyRange.only(e));for(;o;)await o.delete(),o=await o.continue();await a.done}const Vs=Object.freeze(Object.defineProperty({__proto__:null,_resetDbForTesting:Ns,appendAuditHistory:Ps,appendScheduledAuditResult:dr,deleteBaseline:or,deleteScheduledAudit:_s,deleteScheduledAuditResultsForScheduleId:Gs,deleteSiteCrawlPerUrl:$n,getBaseline:ya,getDb:ce,getScheduledAudit:lr,getSiteCrawlPerUrl:ir,listAllScheduledAuditResults:Ws,listAuditHistoryForComponent:Fs,listBaselines:rr,listBaselinesByUrl:Ls,listScheduledAuditResultsByScheduleId:Us,listScheduledAudits:cr,pruneScheduledAuditResults:ur,putScheduledAudit:Tn,setBaseline:Cn,setSiteCrawlPerUrl:sr},Symbol.toStringTag,{value:"Module"})),Qt="siteCrawlReport";async function En(){var a;if(typeof chrome>"u"||!((a=chrome.storage)!=null&&a.local))return null;const t=(await chrome.storage.local.get([Qt]))[Qt];return t&&typeof t=="object"?t:null}async function hr(e){var t;if(!(typeof chrome>"u"||!((t=chrome.storage)!=null&&t.local))){if(e===null){await chrome.storage.local.remove([Qt]),await $n().catch(()=>{});return}await chrome.storage.local.set({[Qt]:e})}}async function Zt(){try{const e=await ir();return(e==null?void 0:e.perUrl)??null}catch{return null}}async function pr(e,t){if(e===null){await $n();return}await sr({startUrl:(t==null?void 0:t.startUrl)??"",finishedAt:(t==null?void 0:t.finishedAt)??new Date().toISOString(),perUrl:e})}const wp=Object.freeze(Object.defineProperty({__proto__:null,loadSiteCrawlPerUrlResults:Zt,loadSiteCrawlReport:En,saveSiteCrawlPerUrlResults:pr,saveSiteCrawlReport:hr},Symbol.toStringTag,{value:"Module"}));async function He(){return!1}function vp(e){return!1}const Lt="HEADLESS_BUILD_LOCKOUT",Ze="wcagcheckr is in private build phase. A team license is required for access. If you believe you should have access, contact cliff@locustware.com.";async function fr(){const e=await chrome.tabs.query({currentWindow:!0}),t=e.find(n=>n.active);if(t!=null&&t.id&&ro(t.url))return t.id;const a=e.find(n=>n.id&&ro(n.url));return(a==null?void 0:a.id)??null}function ro(e){return typeof e=="string"&&/^https?:\/\//.test(e)}const dn="rubricConfigCache",js=7*24*60*60*1e3;function Ap(e){const t=Date.now()-e.fetchedAt;return t>=js?"expired":t>=60*60*1e3?"stale":"fresh"}async function kp(){var a;if(typeof chrome>"u"||!((a=chrome.storage)!=null&&a.local))return null;const t=(await chrome.storage.local.get(dn))[dn];return!t||typeof t!="object"?null:t}async function xp(e){var t;typeof chrome>"u"||!((t=chrome.storage)!=null&&t.local)||await chrome.storage.local.set({[dn]:e})}let gr=null;function Ip(e){gr=e}function mr(){return gr}const un="acknowledgedFindings";async function wa(){var a;if(typeof chrome>"u"||!((a=chrome.storage)!=null&&a.local))return[];const t=(await chrome.storage.local.get([un]))[un];return Array.isArray(t)?t:[]}async function va(e){const t=await wa();return new Set(t.filter(a=>a.componentId===e).map(a=>a.matchKey))}async function Bs(e){const a=(await wa()).filter(n=>!(n.componentId===e.componentId&&n.matchKey===e.matchKey));a.push({...e,acknowledgedAt:new Date().toISOString()}),await br(a)}async function Hs(e,t){const n=(await wa()).filter(o=>!(o.componentId===e&&o.matchKey===t));await br(n)}async function br(e){var t;typeof chrome>"u"||!((t=chrome.storage)!=null&&t.local)||await chrome.storage.local.set({[un]:e})}const Sp=Object.freeze(Object.defineProperty({__proto__:null,acknowledgeFinding:Bs,loadAcknowledged:wa,loadAcknowledgedKeysForComponent:va,unacknowledgeFinding:Hs},Symbol.toStringTag,{value:"Module"})),qs=/:nth-(?:last-)?(?:child|of-type)\([^)]+\)/g,zs=/\[id="[^"]*"\]/g,Ks=/\[data-testid="[^"]*"\]/g,Ys=/#[\w-]*\d[\w-]*/g,Js=/\[href(?:[\^$*~|]?=("|')[^"']*\1)?\]/g,Xs=/\[aria-label(?:[\^$*~|]?=("|')[^"']*\1)?\]/g,Qs=new Set(["region","landmark-one-main","page-has-heading-one","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","landmark-main-is-top-level","landmark-banner-is-top-level","landmark-contentinfo-is-top-level","landmark-complementary-is-top-level","landmark-unique","bypass","document-title","html-has-lang","meta-viewport"]);function Zs(e){return e&&e.replace(qs,"").replace(zs,"").replace(Ks,"").replace(Ys,"").replace(Js,"").replace(Xs,"").replace(/\s+/g," ").trim()}function Fe(e,t){return Qs.has(e)?`${e}::__structural__`:`${e}::${Zs(t)}`}const io={minor:0,moderate:1,serious:2,critical:3};function yr(e){const t=new Map;for(const a of e){const n=Fe(a.ruleId,a.target.selector),o=t.get(n);if(!o){t.set(n,a);continue}(io[a.impact]??0)>(io[o.impact]??0)&&t.set(n,a)}return Array.from(t.values())}const wr=[{id:"contrast",label:"Color & contrast",axeRules:["color-contrast","color-contrast-enhanced","link-in-text-block"],igtWorkflowIds:["visual-indicators"]},{id:"alt-text",label:"Alt text",axeRules:["image-alt","input-image-alt","object-alt","svg-img-alt","area-alt","role-img-alt"],igtWorkflowIds:[]},{id:"forms",label:"Forms",axeRules:["label","select-name","aria-input-field-name","aria-toggle-field-name","form-field-multiple-labels","label-content-name-mismatch","autocomplete-valid","label-title-only","wcc-onfocus-context-change","wcc-oninput-context-change","wcc-cognitive-auth-challenge"],igtWorkflowIds:["forms"]},{id:"keyboard",label:"Keyboard",axeRules:["nested-interactive","tabindex","frame-focusable-content","no-focusable-content","focus-order-semantics","wcc-gesture-no-alternative","wcc-drag-no-alternative"],igtWorkflowIds:["keyboard","focus-management"]},{id:"tab-order",label:"Tab order",axeRules:[],igtWorkflowIds:[],verifiedByWorkflowIds:["keyboard"],heuristic:"tab-order"},{id:"screen-reader",label:"Screen reader / ARIA",axeRules:["aria-allowed-attr","aria-required-attr","aria-required-children","aria-required-parent","aria-roles","aria-valid-attr-value","aria-valid-attr","aria-hidden-body","aria-hidden-focus","button-name","input-button-name","link-name","frame-title","presentation-role-conflict","aria-allowed-role","aria-prohibited-attr","aria-text","aria-deprecated-role","aria-conditional-attr","aria-braille-equivalent","empty-button","empty-heading","empty-link"],igtWorkflowIds:["screen-reader"]},{id:"reading-order",label:"Reading order",axeRules:[],igtWorkflowIds:[],verifiedByWorkflowIds:["page-structure"],heuristic:"reading-order"},{id:"page-structure",label:"Page structure",axeRules:["heading-order","page-has-heading-one","landmark-one-main","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","region","bypass","empty-table-header","landmark-banner-is-top-level","landmark-complementary-is-top-level","landmark-contentinfo-is-top-level","landmark-main-is-top-level","landmark-unique"],igtWorkflowIds:["page-structure"]}];function Cp(e,t){const a=new Set;for(const n of t)n.wcagCriterion===e&&a.add(n.ruleId);if(a.size===0)return null;for(const n of wr)for(const o of n.axeRules)if(a.has(o))return n.id;return null}function ec(e){const t=wr.map(o=>ac(o,e)),a=tc(t.map(o=>o.letter)),n=t.filter(o=>o.letter==="D"||o.letter==="F");return{overallLetter:a,subGrades:t,warningAreas:n,isLawsuitRisk:n.length>0}}function tc(e){const t=e.filter(i=>i==="A").length,a=e.filter(i=>i==="C").length,n=e.filter(i=>i==="D").length,o=e.filter(i=>i==="F").length,r=e.length-t;return t===0&&n+o>a?"F":r===0?"A":r<=3?"B":r<=6?"C":"D"}function ac(e,t){const a=new Set(e.axeRules),n=t.violations.filter(N=>a.has(N.ruleId)),o=t.manualRuns.filter(N=>e.igtWorkflowIds.includes(N.workflowId)),r=e.igtWorkflowIds.map(N=>t.workflows.find(O=>O.id===N)).filter(N=>N!=null);let i=r.length>0;for(const N of r){const O=o.find(P=>P.workflowId===N.id);if((O?Object.keys(O.steps).length:0)!==N.steps.length){i=!1;break}}const c=o.some(N=>Object.keys(N.steps).length>0),d=e.verifiedByWorkflowIds??[],l=t.manualRuns.filter(N=>d.includes(N.workflowId)),p=d.map(N=>t.workflows.find(O=>O.id===N)).filter(N=>N!=null);let m=d.length>0&&p.length===d.length;for(const N of p){const O=l.find(P=>P.workflowId===N.id);if((O?Object.keys(O.steps).length:0)!==N.steps.length){m=!1;break}}let u=null;if(m)for(const N of l)N.completedAt&&(u===null||N.completedAt>u)&&(u=N.completedAt);const g=e.heuristic==="tab-order"?t.heuristicCounts.tabOrder??0:e.heuristic==="reading-order"?t.heuristicCounts.readingOrder??0:0,h=d[0]??e.igtWorkflowIds[0]??null,f=t.interactiveAuditVerdicts,w=[];f&&(e.id==="tab-order"&&f.focusOrder&&w.push({verdict:f.focusOrder,criterionId:"2.4.3"}),e.id==="keyboard"&&(f.keyboardTrap&&w.push({verdict:f.keyboardTrap,criterionId:"2.1.2"}),f.focusVisible&&w.push({verdict:f.focusVisible,criterionId:"2.4.7"})),e.id==="reading-order"&&f.readingOrder&&w.push({verdict:f.readingOrder,criterionId:"1.3.2"}),e.id==="contrast"&&f.nonTextContrast&&w.push({verdict:f.nonTextContrast,criterionId:"1.4.11"}));const b=w.some(N=>N.verdict==="fail");if(w.length>0&&w.every(N=>N.verdict==="pass")&&d.length>0&&!m)return{id:e.id,label:e.label,letter:"A",untested:!1,needsIgt:!1,igtCompleted:!1,verifiedByIgt:!1,verifiedAt:w.length>0?new Date().toISOString():null,suppressedHeuristicCount:g,primaryVerifierWorkflowId:h,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1},aiVerifiedCriteria:w.map(N=>N.criterionId)};if(m&&d.length>0)return{id:e.id,label:e.label,letter:"A",untested:!1,needsIgt:!1,igtCompleted:!0,verifiedByIgt:!0,verifiedAt:u,suppressedHeuristicCount:g,primaryVerifierWorkflowId:h,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1}};const v=e.axeRules.length>0||e.heuristic!=null,s=e.igtWorkflowIds.length>0;if(v?!t.auditRan:!c)return{id:e.id,label:e.label,letter:"F",untested:!0,needsIgt:s||d.length>0,igtCompleted:!1,verifiedByIgt:!1,verifiedAt:null,suppressedHeuristicCount:0,primaryVerifierWorkflowId:h,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1}};const $={critical:0,serious:0,moderate:0,minor:0},A=yr(n);for(const N of A)$[N.impact]++;const C=(t.aiResolvedFails??[]).filter(N=>a.has(N.ruleId));if(C.length>0){const N=new Set(A.map(O=>`${O.ruleId}::${O.target.selector}`));for(const O of C){const W=`${O.ruleId}::${O.selector}`;N.has(W)||(N.add(W),$[O.impact]++)}}const F=w.length>0&&w.some(N=>N.verdict==="pass"||N.verdict==="fail"),T=F?g:0;F||($.serious+=g),b&&($.serious+=w.filter(N=>N.verdict==="fail").length);for(const N of o){const O=r.find(W=>W.id===N.workflowId);if(O)for(const W of O.steps){const P=N.steps[W.id];(P==null?void 0:P.status)==="fail"&&(W.severity==="required"?$.serious++:$.moderate++)}}const I=$.critical>0,D=$.serious>0;let S;$.critical>=5?S="F":$.critical>=1?S="D":$.serious>=1?S="C":$.moderate>=1?S="B":S="A";const _=S!=="A"&&(s&&!i||d.length>0&&!m);return{id:e.id,label:e.label,letter:S,untested:!1,needsIgt:_,igtCompleted:i,verifiedByIgt:!1,verifiedAt:null,suppressedHeuristicCount:T,primaryVerifierWorkflowId:h,counts:$,caps:{cappedAtC:I,cappedAtB:D}}}const it="incompleteResolutions",so=2e3,co=600;function Rn(e,t,a){return`${e}::${t}::${a}`}function vr(e){return e.reasoning&&e.reasoning.length>co?{...e,reasoning:e.reasoning.slice(0,co-1)+"…"}:e}function nc(e){const t=Object.entries(e);if(t.length<=so)return e;const a=t.sort(([,n],[,o])=>{const r=Date.parse(n.resolvedAt)||0;return(Date.parse(o.resolvedAt)||0)-r});return Object.fromEntries(a.slice(0,so))}async function Aa(){try{const t=(await chrome.storage.local.get(it))[it];return t&&typeof t=="object"?t:{}}catch{return{}}}async function On(e){const t=nc(e);try{await chrome.storage.local.set({[it]:t})}catch(a){const n=Object.entries(t).sort(([,r],[,i])=>{const c=Date.parse(r.resolvedAt)||0;return(Date.parse(i.resolvedAt)||0)-c}),o=Object.fromEntries(n.slice(0,Math.floor(n.length/2)));try{await chrome.storage.local.set({[it]:o}),console.warn("[incomplete-resolutions] storage quota hit; pruned to",Object.keys(o).length,"entries",a)}catch(r){await chrome.storage.local.remove(it).catch(()=>{}),console.warn("[incomplete-resolutions] storage quota still exceeded after prune; wiped key",r)}}}async function De(e){const t=await Aa();t[Rn(e.pageUrl,e.ruleId,e.selector)]=vr(e),await On(t)}async function oc(e){if(e.length===0)return;const t=await Aa();for(const a of e)t[Rn(a.pageUrl,a.ruleId,a.selector)]=vr(a);await On(t)}async function Ar(){const e=await Aa();return Object.values(e)}async function ka(e){return(await Ar()).filter(a=>a.pageUrl===e)}async function rc(e,t,a){const n=await Aa();delete n[Rn(e,t,a)],await On(n)}async function ic(){await chrome.storage.local.remove(it)}function kr(e){if(!e.reasoning)return e;const t=e.reasoning.toLowerCase(),a=Gt(t,/verdict\s+corrected\s+to\s+pass|verdict:\s*pass\s+\(corrected\)/gi),n=Gt(t,/verdict\s+corrected\s+to\s+fail|verdict:\s*fail\s+\(corrected\)/gi);if(a>n&&a>=0)return{...e,verdict:"pass"};if(n>a&&n>=0)return{...e,verdict:"fail"};const o=Gt(t,/actually\s+passes|in\s+fact\s+passes|passes\s+aa/gi),r=Gt(t,/actually\s+fails|in\s+fact\s+fails|fails\s+aa/gi);return o<0&&r<0?e:o>r&&o/t.length>=.5?{...e,verdict:"pass"}:r>o&&r/t.length>=.5?{...e,verdict:"fail"}:e}function Gt(e,t){let a=-1;const n=t.flags.includes("g")?t.flags:t.flags+"g",o=new RegExp(t.source,n);let r;for(;(r=o.exec(e))!==null;)a=r.index,r.index===o.lastIndex&&o.lastIndex++;return a}function xr(e){if(e.ruleId!=="color-contrast"&&e.ruleId!=="color-contrast-enhanced"||!e.reasoning||e.verdict!=="fail")return e;const t=sc(e.reasoning);if(t.length<2)return e;const a=t[0],n=t[1];if(n.a<.999)return e;const o=a.a<.999?{r:Math.round(a.r*a.a+n.r*(1-a.a)),g:Math.round(a.g*a.a+n.g*(1-a.a)),b:Math.round(a.b*a.a+n.b*(1-a.a))}:{r:a.r,g:a.g,b:a.b},r=lc(o,{r:n.r,g:n.g,b:n.b}),i=cc(e.reasoning)??4.5;return r<i+.05?e:{...e,verdict:"pass",reasoning:`${e.reasoning}
|
|
3
3
|
|
|
4
4
|
(rc.299 math-salvage: re-computed from cited rgb(${a.r},${a.g},${a.b}) on rgb(${n.r},${n.g},${n.b}) → ${r.toFixed(2)}:1 against threshold ${i}:1 → PASS. Original AI verdict was FAIL but its arithmetic appears wrong on this element. One-way salvage: only flips fail→pass, never pass→fail.)`}}function Ir(e,t){var n;const a=new Set;for(const o of t)for(const r of((n=o.axeRulesEvaluated)==null?void 0:n.incomplete)??[])for(const i of r.elements??[])a.add(`${r.ruleId}::${i.selector}`);return e.map(kr).map(xr).filter(o=>o.verdict==="fail"&&a.has(`${o.ruleId}::${o.selector}`)&&!/aria-hidden=["']true["']/.test(o.selector))}function sc(e){const t=/rgba?\(\s*([0-9.]+)[,\s]+([0-9.]+)[,\s]+([0-9.]+)(?:[,/\s]+([0-9.]+))?\s*\)/gi,a=[];let n;for(;(n=t.exec(e))!==null&&(a.push({r:Math.round(parseFloat(n[1])),g:Math.round(parseFloat(n[2])),b:Math.round(parseFloat(n[3])),a:n[4]!==void 0?parseFloat(n[4]):1}),!(a.length>=4)););return a}function cc(e){const t=/([34](?:\.\d+)?|7(?:\.\d+)?)\s*:\s*1/g,a=[];let n;for(;(n=t.exec(e))!==null;){const o=parseFloat(n[1]);(o===3||o===4.5||o===7)&&a.push(o)}return a.length>0?a[a.length-1]:null}function lc(e,t){const a=d=>{const l=d/255;return l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4)},n=d=>.2126*a(d.r)+.7152*a(d.g)+.0722*a(d.b),o=n(e),r=n(t),i=Math.max(o,r),c=Math.min(o,r);return(i+.05)/(c+.05)}const dc=Object.freeze(Object.defineProperty({__proto__:null,applyContrastMathSalvage:xr,applySelfCorrectionSalvage:kr,clearAllResolutions:ic,deleteResolution:rc,filterRelevant:Ir,getAllResolutions:Ar,getResolutionsForPage:ka,saveResolution:De,saveResolutions:oc},Symbol.toStringTag,{value:"Module"})),Rt="interactiveAuditResults";function Mn(e,t){return`${e}::${t}`}async function Pt(){try{const t=(await chrome.storage.local.get(Rt))[Rt];return t&&typeof t=="object"?t:{}}catch{return{}}}async function Dn(e){await chrome.storage.local.set({[Rt]:e})}async function te(e){const t=await Pt(),a={componentId:e.componentId,criterionId:e.criterionId,verdict:e.verdict,reasoning:e.reasoning,confidence:e.confidence,pageUrl:e.pageUrl,finishedAt:e.finishedAt,costUsd:e.costUsd,model:e.model,inputHash:e.inputHash};t[Mn(e.componentId,e.criterionId)]=a,await Dn(t)}async function Ge(e,t){return(await Pt())[Mn(e,t)]??null}async function Sr(){const e=await Pt();return Object.values(e)}async function ea(e){return(await Sr()).filter(a=>a.componentId===e)}async function uc(e,t){const a=await Pt();delete a[Mn(e,t)],await Dn(a)}async function hc(){await chrome.storage.local.remove(Rt)}async function xa(e){const t=new Set;for(const n of e)n&&t.add(n);if(t.size===0)return[];const a=[];for(const n of t)try{const o=await ea(n);for(const r of o)a.push({criterionId:r.criterionId,ruleId:`ai-interactive::${r.criterionId}`,pageUrl:r.pageUrl,verdict:r.verdict,reasoning:r.reasoning})}catch{}return a}async function pc(){try{const e=await Pt();let t=!1;for(const a of Object.keys(e)){const n=e[a];if(n.steps&&n.steps.length>0){const o={componentId:n.componentId,criterionId:n.criterionId,verdict:n.verdict,reasoning:n.reasoning,confidence:n.confidence,pageUrl:n.pageUrl,finishedAt:n.finishedAt,costUsd:n.costUsd,model:n.model};e[a]=o,t=!0}}t&&await Dn(e)}catch{try{await chrome.storage.local.remove(Rt)}catch{}}}const $p=Object.freeze(Object.defineProperty({__proto__:null,clearAllInteractiveAuditResults:hc,getAllInteractiveAuditResults:Sr,getInteractiveAuditResult:Ge,getInteractiveAuditResultsForComponent:ea,loadInteractiveResultsForScoring:xa,migrateStrippedShape:pc,removeInteractiveAuditResult:uc,saveInteractiveAuditResult:te},Symbol.toStringTag,{value:"Module"})),fc=Z("walkthrough-acks"),hn="walkthroughAcks";function Nn(e,t,a){return`${e}::${t}::${a}`}async function Ia(){try{const t=(await chrome.storage.local.get(hn))[hn];return t&&typeof t=="object"?t:{}}catch{return{}}}async function Cr(e){await chrome.storage.local.set({[hn]:e})}async function Tp(e){if(!e.note||!e.note.trim())throw new Error("Acknowledgement requires a non-empty note explaining manual verification.");const t=await Ia();t[Nn(e.componentId,e.criterionId,e.pageUrl)]={...e,note:e.note.trim()},await Cr(t),fc.info(`acknowledged ${e.criterionId} on ${e.pageUrl}`)}async function Ep(e,t,a){const n=await Ia();delete n[Nn(e,t,a)],await Cr(n)}async function gc(e,t,a){return(await Ia())[Nn(e,t,a)]??null}async function mc(){const e=await Ia();return Object.values(e)}async function $r(e){const t=new Set;for(const n of e)n&&t.add(n);return t.size===0?[]:(await mc()).filter(n=>t.has(n.componentId))}const ta={A:4,B:3,C:2,D:1,F:0},bc=["F","D","C","B","A"];function yc(e,t){const a=(ta[e]+ta[t])/2,n=Math.ceil(a-.5);return bc[n]}function wc(e,t){return ta[e]<=ta[t]?e:t}const Ua=[{id:"contrast",label:"Color contrast",rules:["color-contrast","color-contrast-enhanced","link-in-text-block"],needsManualCheck:!1},{id:"alt",label:"Image alt text",rules:["image-alt","input-image-alt","area-alt","svg-img-alt","object-alt","role-img-alt"],needsManualCheck:!1},{id:"labels",label:"Form labels",rules:["label","select-name","aria-input-field-name","aria-toggle-field-name","form-field-multiple-labels","label-content-name-mismatch","autocomplete-valid"],needsManualCheck:!1},{id:"names",label:"Buttons / links named",rules:["button-name","input-button-name","link-name","empty-button","empty-heading","empty-link"],needsManualCheck:!1},{id:"keyboard",label:"Keyboard operability",rules:["nested-interactive","tabindex","frame-focusable-content","no-focusable-content"],needsManualCheck:!0},{id:"structure",label:"Landmarks + heading structure",rules:["heading-order","page-has-heading-one","landmark-one-main","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","region","bypass"],needsManualCheck:!1}];function vc(e){const t=new Map;for(const a of e){const n=`${a.ruleId}::${a.target.selector}`;t.has(n)||t.set(n,a)}return Array.from(t.values())}function Ac(e,t,a="2.1",n="AA",o,r,i,c,d){const l=is({audits:e??[],igtRuns:(t==null?void 0:t.runs)??[],workflows:(t==null?void 0:t.workflows)??Pe,acknowledgedMatchKeys:o??new Set,incompleteResolutions:r,interactiveAuditResults:i,auditScope:c,humanCriterionVerdicts:d}),p={},m={},u=[],g=[],h=[];let f=0;for(const b of l.values()){if(b.state==="not-evaluated"){u.push(b.criterionId);continue}if(f++,b.state==="fail"){h.push(b.criterionId);const k=[];for(const v of b.evidence)v.outcome==="fail"&&k.push({source:v.source,ruleOrStepId:v.ruleOrStepId,selector:v.selector,notes:v.notes,pageUrl:v.pageUrl});k.length>0&&(m[b.criterionId]=k)}if(b.state==="inconclusive"){g.push(b.criterionId);const k=[];for(const v of b.evidence)if(v.outcome==="incomplete"){const s=v.source==="ai"?"ai-uncertain":"axe-incomplete";k.push({source:s,ruleOrStepId:v.ruleOrStepId,resolutionHint:v.resolutionHint,elements:v.elements??(v.selector?[{selector:v.selector,failureSummary:v.resolutionHint}]:void 0),pageUrl:v.pageUrl})}else v.outcome==="skip"&&k.push({source:"igt-skip",ruleOrStepId:v.ruleOrStepId,resolutionHint:v.resolutionHint});k.length>0&&(p[b.criterionId]=k)}}const w=ss(l);return{targetVersion:Nt,targetLevel:In,totalApplicable:l.size,evaluated:f,untestedCriteria:u,inconclusiveCriteria:g,failingCriteria:h,inconclusiveReasons:p,failingReasons:m,canClaimConformance:w.canClaimConformance}}function Sa(e,t,a,n,o,r,i,c,d){const l=n??new Set,p=vc(e).filter(D=>!l.has(D.matchKey)),m=p.filter(D=>D.needsReview),u=p.filter(D=>!D.needsReview),g={critical:0,serious:0,moderate:0,minor:0,unique:u.length};for(const D of u)g[D.impact]++;let h;t&&(h=kc(t.runs,t.workflows),g.serious+=h.failedRequired,g.moderate+=h.failedAdvisory,g.unique+=h.failedRequired+h.failedAdvisory);const f=[],w=[];if(o&&o.length>0){const D=new Set;if(r)for(const _ of r)D.add(`${_.criterionId}::${_.pageUrl}`);const S=new Set;for(const _ of o){if(_.verdict==="pass")continue;const N=`${_.criterionId}::${_.pageUrl}`;if(S.has(N))continue;S.add(N);const O=_.verdict==="fail"?"serious":"moderate",W={criterionId:_.criterionId,pageUrl:_.pageUrl,verdict:_.verdict,impact:O,reasoning:_.reasoning};if(D.has(N)){w.push(W);continue}f.push(W),g[O]++,g.unique++}}const b=new Map;for(const D of Ua)for(const S of D.rules)b.set(S,D);const k=new Map;for(const D of Ua)k.set(D.id,{count:0,rules:new Set});for(const D of yr(u)){const S=b.get(D.ruleId);if(!S)continue;const _=k.get(S.id);_.count++,_.rules.add(D.ruleId)}const v=Ua.map(D=>{const S=k.get(D.id);let _="pass";return S.count>0?_="fail":D.needsManualCheck&&(_="unchecked"),{id:D.id,label:D.label,status:_,violationCount:S.count,rules:Array.from(S.rules),needsManualCheck:D.needsManualCheck}}),s=g.critical>0,x=g.serious>0,$=(()=>{if(!o||o.length===0||!r||r.length===0)return o;const D=new Set;for(const S of r)D.add(`${S.criterionId}::${S.pageUrl}`);return o.map(S=>D.has(`${S.criterionId}::${S.pageUrl}`)?{...S,verdict:"pass",reasoning:`Human verified: ${S.reasoning}`}:S)})(),A=a?Ac(a,t,"2.1","AA",n,d,$,c,i):void 0,C=A?!A.canClaimConformance:!1;let F;g.critical>=5?F="F":g.critical>=1?F="D":g.serious>=5||g.serious>=1?F="C":g.moderate>=3||g.moderate>=1?F="B":(g.minor>=1,F="A"),C&&F==="A"&&(F="B");const T=v.filter(D=>D.status==="fail").length;let I;return g.critical>0||T>=4?I="critical":g.serious>=3||T>=2?I="high":g.serious>=1||g.moderate>=3?I="moderate":I="low",{letter:F,risk:I,caps:{cappedAtC:s,cappedAtB:x,cappedAtBByCoverage:C},totals:g,categories:v,coverage:A,manual:h,reviewQueue:{count:m.length,rules:Array.from(new Set(m.map(D=>D.ruleId)))},walkthroughFindings:f,walkthroughAcknowledgements:w}}function kc(e,t){new Map(t.map(c=>[c.id,c]));const a=new Map(e.map(c=>[c.workflowId,c]));let n=0,o=0,r=0;const i=t.map(c=>{const d=a.get(c.id);let l=0,p=0,m=0,u=0,g=0;for(const h of c.steps){const f=d==null?void 0:d.steps[h.id];f&&(g++,f.status==="pass"?l++:f.status==="skip"?u++:f.status==="fail"&&(h.severity==="required"?p++:m++))}return g===c.steps.length&&r++,n+=p,o+=m,{workflowId:c.id,name:c.name,passed:l,failedRequired:p,failedAdvisory:m,skipped:u,answered:g,total:c.steps.length}});return{workflowsCompleted:r,workflowsTotal:t.length,failedRequired:n,failedAdvisory:o,perWorkflow:i}}const xc={low:"Low exposure — no critical or serious violations across the three layers (axe-core, wcagcheckr DOM analyzers, AI walkthroughs). All 50 WCAG 2.1 AA criteria have an evaluation path; spot-check content-meaning criteria (caption accuracy, alt-text correctness) before any formal conformance claim.",moderate:"Moderate exposure — some serious or multiple moderate violations. Should be addressed but not lawsuit-emergency level.",high:"High exposure — multiple serious violations OR multiple lawsuit-magnet categories failing. ADA Title III suits target sites at this level.",critical:"Critical exposure — at least one critical-impact violation OR most lawsuit-magnet categories failing. Sites in this state are demand-letter targets."},Tr={low:"✓ Off the radar",moderate:"⚡ Some lawsuit exposure",high:"⚠️ High target risk",critical:"🚨 Lawsuit magnet"},Er={low:"Your site clears the automated checks ADA-targeting tools use to identify lawsuit victims. wcagcheckr runs three layers (axe-core, our DOM analyzers, AI walkthroughs) covering all 50 WCAG 2.1 AA criteria — most demand-letter mills only run axe.",moderate:"Some failures. Not the easiest target, but the issues here are exactly what automated targeting tools look for. Switch to Developer mode for the issue list and fix-it walkthroughs.",high:"Multiple serious failures. Automated lawsuit-screening tools will flag this site. Real risk of being targeted with a demand letter — Developer mode has the full issue list and fix-it walkthroughs.",critical:"Your site fails the automated WCAG checks demand-letter mills run on thousands of sites to identify lawsuit targets. Without remediation, expect to be flagged. Developer mode has the full issue list plus fix-it guidance for each."},lo={A:"No critical, serious, or moderate violations across the three layers (axe-core, wcagcheckr DOM analyzers, AI walkthroughs). All 50 WCAG 2.1 AA criteria evaluated; content-meaning checks (caption accuracy, alt-text correctness, sensory cues) benefit from a human spot-check before formal conformance claims.",B:"Only moderate-impact violations detected. No serious or critical findings.",C:"Has at least one serious-impact violation. Automatically capped here regardless of how few.",D:"Has at least one critical-impact violation. Automatically capped here regardless of how few.",F:"Multiple critical-impact violations detected. Lawsuit-magnet profile."};function Rp(e,t){if(e!=="B")return lo[e];const{moderateCount:a,blockingCriteriaCount:n}=t;return n>0&&a===0?`No critical, serious, or moderate violations detected — but ${n} WCAG 2.1 AA criteri${n===1?"on has":"a have"} not yet been affirmatively evaluated (untested or inconclusive). The grade is capped at B until coverage is complete. Open the side panel's "Coverage gaps" panel under the grade and record a verdict for each.`:n>0&&a>0?`${a} moderate WCAG finding${a===1?"":"s"} detected, AND ${n} criteri${n===1?"on has":"a have"} not yet been affirmatively evaluated. Address both before any formal conformance claim.`:lo.B}const lt={"ai-alt-misleading":{summary:`The AI vision model judged this image's alt text is empty, misleading, or generic when the image is actually informative or functional. Use the AI assessment (shown above this recipe) to understand what the image depicts, then write descriptive alt text conveying its meaning to a screen-reader user. Use alt="" only when the image is genuinely decorative (a divider, a flourish, an icon next to text that already labels the action). Decorative is rare — when in doubt, describe.`,snippetLang:"html",snippet:`<!-- Failing — empty alt on an informational logo -->
|
|
@@ -1024,7 +1024,7 @@ Primary AI verdict was uncertain. Programmatic multi-column detector found no ma
|
|
|
1024
1024
|
document.body.offsetHeight;
|
|
1025
1025
|
return true;
|
|
1026
1026
|
})()
|
|
1027
|
-
`;await chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:t})}async function Do(e,t){let a;try{a=await chrome.debugger.sendCommand({tabId:e},"Page.captureScreenshot",{format:"png",captureBeyondViewport:!0,clip:{x:t.x,y:t.y,width:t.width,height:t.height,scale:1}})}catch(n){return Xe.warn(`captureElementClip failed: ${n instanceof Error?n.message:String(n)}`),null}if(!(a!=null&&a.data))return null;try{const n=`data:image/png;base64,${a.data}`,o=await fetch(n).then(d=>d.blob()),r=await createImageBitmap(o),c=new OffscreenCanvas(r.width,r.height).getContext("2d");return c?(c.drawImage(r,0,0),c.getImageData(0,0,r.width,r.height)):null}catch(n){return Xe.warn(`clip decode failed: ${n instanceof Error?n.message:String(n)}`),null}}const Xd=25,Jt=8,Qd=150,Zd=.95,eu=4,tu=400;function au(e,t,a){if(e.width!==t.width||e.height!==t.height)return null;const n=e.width,o=e.height;let r=0,i=0;for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2],F=e.data[x],T=e.data[x+1],I=e.data[x+2],D=Math.abs(F-$)+Math.abs(T-A)+Math.abs(I-C);D>i&&(i=D),D>=Xd&&r++}if(r<Jt)return null;const c=i*Zd;let d=0,l=0,p=0,m=0;if(i>=tu)for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2],F=e.data[x],T=e.data[x+1],I=e.data[x+2];Math.abs(F-$)+Math.abs(T-A)+Math.abs(I-C)>=c&&(d+=$,l+=A,p+=C,m++)}const u=m>=eu?{r:Math.round(d/m),g:Math.round(l/m),b:Math.round(p/m)}:a,g=new Map;let h=0;for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2];if(Math.abs($-u.r)+Math.abs(A-u.g)+Math.abs(C-u.b)>=Qd){h++;const T=$>>4<<8|A>>4<<4|C>>4,I=g.get(T);I?(I.r+=$,I.g+=A,I.b+=C,I.count++):g.set(T,{r:$,g:A,b:C,count:1})}}const f=n*o;if(h<f*.2){g.clear();for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=e.data[x],A=e.data[x+1],C=e.data[x+2],F=$>>4<<8|A>>4<<4|C>>4,T=g.get(F);T?(T.r+=$,T.g+=A,T.b+=C,T.count++):g.set(F,{r:$,g:A,b:C,count:1})}}let w={r:0,g:0,b:0,count:0};for(const v of g.values())v.count>w.count&&(w=v);const b={r:Math.round(w.r/w.count),g:Math.round(w.g/w.count),b:Math.round(w.b/w.count)},k=Et(u,b);return{textPixelCount:r,worstRatio:k,worstBackground:b,worstForeground:u}}async function nu(e,t,a){var d,l,p,m,u,g;const n=new Map;for(const h of t){const f=h.pageUrl??h.scope??"";for(const w of((d=h.axeRulesEvaluated)==null?void 0:d.incomplete)??[])if(w.ruleId==="color-contrast")for(const b of w.elements??[]){const k=`${f}::${w.ruleId}::${b.selector}`;n.has(k)||n.set(k,{pageUrl:f,ruleId:w.ruleId,selector:b.selector,wcagCriterion:w.wcagCriterion??"1.4.3",foreground:(l=b.styles)==null?void 0:l.foreground,fontSize:(p=b.styles)==null?void 0:p.fontSize,fontWeight:(m=b.styles)==null?void 0:m.fontWeight,failureSummary:b.failureSummary})}}if(n.size===0)return{resolved:0,skipped:0};let o=!1,r=null;for(let h=1;h<=6;h++)try{await chrome.debugger.attach({tabId:e},Hd),o=!0;break}catch(f){r=f;const w=f instanceof Error?f.message:String(f);if(/already attached/i.test(w)){await new Promise(b=>setTimeout(b,500));continue}break}if(!o)return Xe.warn("debugger attach failed after retries; skipping pixel sampling",r),{resolved:0,skipped:n.size};let i=0,c=0;try{const h=Array.from(n.values()),f=h.map(I=>I.selector),w=await Kd(e,f);if(a!=null&&a.aborted)return{resolved:0,skipped:n.size};const b=I=>{const D=w.get(I);return D&&!("decorative"in D)?D:null},k=new Set;for(const[I,D]of w)D&&"decorative"in D&&k.add(I);for(const I of h){if(!k.has(I.selector))continue;const D={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"pass",reasoning:'Not applicable to WCAG 1.4.3 (contrast minimum): this element is decorative / removed from the accessibility tree — it sits inside an aria-hidden="true" subtree, or is visually hidden (display:none, sr-only clip, off-screen, or zero opacity). Decorative and incidental content is exempt from the contrast-minimum requirement, so it is recorded as not-applicable and does not count as a violation.',resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:await Oo({...I,bgFingerprint:null})};await De(D),i++}const v=h.filter(I=>!k.has(I.selector));if(v.length===0)return Xe.info(`pixel-contrast sampler: all ${h.length} targets decorative/not-applicable (1.4.3)`),{resolved:i,skipped:c};const s=((u=h[0])==null?void 0:u.pageUrl)??"",x=s?await ka(s):[],$=new Map;for(const I of x)$.set(`${I.ruleId}::${I.selector}`,I);const A=new Map,C=[];for(const I of v){const D=await Oo({...I,bgFingerprint:((g=b(I.selector))==null?void 0:g.bgFingerprint)??null});A.set(I.selector,D);const S=$.get(`${I.ruleId}::${I.selector}`);if(S&&S.inputHash===D&&S.verdict!=="uncertain"){const _={...S,resolvedAt:new Date().toISOString(),reasoning:S.reasoning.includes("(cached, hash-match)")?S.reasoning:`${S.reasoning} (cached, hash-match)`};await De(_),i++;continue}C.push(I)}if(C.length===0)return Xe.info(`pixel-contrast sampler: all ${h.length} targets reused from hash-cache`),{resolved:i,skipped:c};await Yd(e);const F=new Map;for(const I of C){if(a!=null&&a.aborted)break;const D=b(I.selector);if(!D)continue;const S=await Do(e,D);S&&F.set(I.selector,S)}if(await Jd(e),a!=null&&a.aborted)return{resolved:0,skipped:n.size};const T=new Map;for(const I of C){if(a!=null&&a.aborted)break;const D=b(I.selector);if(!D)continue;const S=await Do(e,D);S&&T.set(I.selector,S)}for(const I of C){if(a!=null&&a.aborted)break;const D=A.get(I.selector),S=b(I.selector);if(!S){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:"Hide-text observation: element's bounding rect could not be resolved at audit time (element may be display:none, detached from DOM, or zero-size). Cannot sample contrast empirically. Manual verification required if you believe this element is visible.",resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const _=F.get(I.selector),N=T.get(I.selector);if(!_||!N){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:"Hide-text observation: per-element clip capture failed via chrome.debugger Page.captureScreenshot. Manual verification required.",resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const O=qd(I.foreground);if(!O){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:`Hide-text observation: element's computed CSS foreground color could not be parsed (got ${JSON.stringify(I.foreground)}). Cannot compute contrast against rendered background without an intended foreground color. Manual verification required.`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const W=au(_,N,O);if(!W){if(S.resolvedBg){const re=Ja(I.fontSize,I.fontWeight),oe=re?Ya:Ka,le=Et(O,S.resolvedBg),ie=le>=oe;i++,await De({pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:ie?"pass":"fail",reasoning:`Too few text pixels for an empirical screenshot reading (under ${Jt} after diffing hidden vs visible). Resolved DETERMINISTICALLY from CSS: foreground rgb(${O.r},${O.g},${O.b}) on resolved background rgb(${S.resolvedBg.r},${S.resolvedBg.g},${S.resolvedBg.b}) = ${le.toFixed(2)}:1 vs AA ${oe}:1 (${re?"large":"normal"} text) → ${ie?"PASS":"FAIL"}. (rc.413 — known-fg/known-bg text isn't left 'uncertain' when the pixel diff is sparse; that caused A↔B grade flip-flop.)`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D});continue}if(S.resolvedBgGradient&&S.resolvedBgGradient.length>=2){const re=Ja(I.fontSize,I.fontWeight),oe=re?Ya:Ka,le=S.resolvedBgGradient;let ie=1/0,ge=le[0];for(const Oe of le){const ve=Et(O,Oe);ve<ie&&(ie=ve,ge=Oe)}const Re=ie>=oe;i++,await De({pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:Re?"pass":"fail",reasoning:`Too few text pixels for an empirical screenshot reading (under ${Jt}). Background is a linear-gradient; resolved DETERMINISTICALLY from CSS worst-case stop: foreground rgb(${O.r},${O.g},${O.b}) on least-contrasting stop rgb(${ge.r},${ge.g},${ge.b}) = ${ie.toFixed(2)}:1 vs AA ${oe}:1 (${re?"large":"normal"} text) → ${Re?"PASS":"FAIL"}. (rc.413 — small text on a gradient isn't left 'uncertain'; that caused the A↔B grade flip-flop.)`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D});continue}c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:`Hide-text observation: too few text pixels detected (under ${Jt} after diffing hidden vs visible captures) AND the background is a raster image / otherwise unresolvable, so neither an empirical nor a CSS contrast reading is possible. Element may be canvas-rendered or SVG. Manual verification required.`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const P=Ja(I.fontSize,I.fontWeight),V=P?Ya:Ka,M=X=>`rgb(${X.r},${X.g},${X.b})`;let j=W.worstRatio>=V,q="";if(zd(W.worstRatio,O,S.resolvedBg,V)){const X=Et(O,S.resolvedBg);j=!0,q=` Cross-check (rc.356): computed CSS contrast ${M(O)} on resolved background ${M(S.resolvedBg)} = ${X.toFixed(2)}:1, which PASSES ${V}:1 — the sub-threshold pixel reading is an anti-aliasing/sampling artifact, not a real failure. Suppressed.`}const z={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:j?"pass":"fail",reasoning:`Hide-text observation: ${W.textPixelCount} text-core pixels detected by diffing hidden-vs-visible viewport screenshots. Worst per-pixel contrast: ${W.worstRatio.toFixed(2)}:1 against AA threshold ${V}:1 (${P?"large text":"normal text"}). At worst pixel: rendered foreground ${M(W.worstForeground)} on rendered background ${M(W.worstBackground)}. ${j&&q?"Passes (computed cross-check).":j?"Passes threshold.":"Falls below threshold — at least one text pixel reads against a background that fails contrast."}`+q,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(z),i++}}finally{try{await chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:`(() => { const el = document.getElementById(${JSON.stringify(Bn)}); if (el) el.remove(); return true; })()`})}catch{}try{await chrome.debugger.detach({tabId:e})}catch{}}return Xe.info(`pixel-contrast sampler: resolved ${i}, skipped ${c}/${n.size}`),{resolved:i,skipped:c}}const mt=Z("ai-text");function bt(e){if(e!=null&&e.aborted){const t=new Error("aborted");throw t.name="AbortError",t}}function yt(e){return e instanceof Error&&(e.name==="AbortError"||e.name==="ExternalAbortError"||e.message==="aborted")}async function ou(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.headings)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeHeading({headingText:h.text,sectionContent:h.sectionContent,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-heading-not-descriptive","2.4.6","AA","moderate","AI judged this heading does not describe its section content.",h.selector,h.outerHTML,h.text,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("heading judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function ru(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.sensory)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeSensoryLanguage({instructionText:h.text,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-sensory-instruction","1.3.3","A","serious","AI flagged this instruction as relying on sensory characteristics (shape, color, location) without a programmatic identifier.",h.selector,h.outerHTML,h.text.slice(0,100),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("sensory judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function iu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.aria)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeAriaSemantics({elementHtml:h.outerHTML,computedRole:h.role,surroundingHtml:h.surroundingHtml,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&c.push(await wt("ai-aria-misuse","4.1.2","A","serious",`AI judged role="${h.role}" is being used inappropriately on this element.`,h.selector,h.outerHTML,h.role,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("aria judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function su(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.genericLinkText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeGenericLinkText({linkText:h.linkText,surroundingText:h.surroundingText,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-generic-link-text","2.4.4","A","serious","AI judged this link's purpose is not clear from its text or surrounding context.",h.selector,h.outerHTML,h.linkText,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("generic-link judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function cu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.wallOfText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeWallOfText({blockText:h.blockText,structuralChildrenCount:h.structuralChildrenCount,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-wall-of-text","3.1.5","AAA","moderate","AI flagged this block as a wall of text with insufficient structural breaks (subheadings, lists, paragraphs).",h.selector,h.outerHTML,h.blockText.slice(0,80),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("wall-of-text judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function lu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.languageMismatch)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeLanguageMismatch({declaredLang:h.declaredLang,bodyTextSample:h.bodyTextSample,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.7&&c.push(await wt("ai-language-mismatch","3.1.1","A","serious",`AI judged the page's content does not match the declared lang="${h.declaredLang||"(none)"}".`,h.selector,h.outerHTML,h.bodyTextSample.slice(0,80),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("language-mismatch judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function wt(e,t,a,n,o,r,i,c,d,l){const p={selector:r,outerHTML:i.slice(0,500),failureSummary:`AI assessment: ${d.reasoning}`,tagName:"AI",role:null,accessibleName:null,textSnippet:c.slice(0,100)||null,attrId:null,attrTestid:null},m=await xn({ruleId:e,componentId:l.componentId,currentState:l.currentState,target:p});return{ruleId:e,wcagCriterion:t,wcagLevel:a,impact:n,description:o,helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/",target:p,componentId:l.componentId,currentState:l.currentState,axeVersion:l.axeVersion,detectedAt:new Date().toISOString(),matchKey:m,ai:{reasoning:d.reasoning,confidence:d.confidence,model:d.model,costUsd:d.costUsd}}}const mi=Z("ai-vision");function bi(e){if(e!=null&&e.aborted){const t=new Error("aborted");throw t.name="AbortError",t}}function yi(e){return e instanceof Error&&(e.name==="AbortError"||e.name==="ExternalAbortError"||e.message==="aborted")}async function du(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.imageOfText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=Math.max(1,a.imageOfTextMaxImages??5),d=[...e].sort((g,h)=>h.pixelArea-g.pixelArea).slice(0,c),l=d.length,p=[],m=[];for(let g=0;g<d.length;g++){const h=d[g];if(!i.canCharge())break;try{bi(n.signal);const f=await r.judgeImageOfText({imageUrl:h.imageUrl,accessibleName:h.accessibleName,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&p.push(await wi("ai-image-of-text","1.4.5","AA","moderate","AI judged this image bakes substantial text into the raster — should be presented as actual HTML text instead.",h.selector,h.outerHTML,h.accessibleName??"",f,t))}catch(f){if(yi(f)){m.push(`canceled after ${g}/${l} candidates`);break}const w=f instanceof Error?f.message:String(f);m.push(`${h.selector}: ${w}`),mi.warn("image-of-text judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,l)}return{findings:p,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:m}}async function uu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.colorOnlyMeaning)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[o.reason]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bi(n.signal);const f=await r.judgeColorOnlyMeaning({elementHtml:h.elementHtml,contextDescription:h.contextDescription,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&c.push(await wi("ai-color-only-meaning","1.4.1","A","serious","AI judged this region conveys information only through color (no text label, icon glyph, or shape difference).",h.selector,h.outerHTML,h.contextDescription,f,t))}catch(f){if(yi(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(w),mi.warn("color-only judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function wi(e,t,a,n,o,r,i,c,d,l){const p={selector:r,outerHTML:i.slice(0,500),failureSummary:`AI assessment: ${d.reasoning}`,tagName:"AI",role:null,accessibleName:null,textSnippet:c.slice(0,100)||null,attrId:null,attrTestid:null},m=await xn({ruleId:e,componentId:l.componentId,currentState:l.currentState,target:p});return{ruleId:e,wcagCriterion:t,wcagLevel:a,impact:n,description:o,helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/",target:p,componentId:l.componentId,currentState:l.currentState,axeVersion:l.axeVersion,detectedAt:new Date().toISOString(),matchKey:m,ai:{reasoning:d.reasoning,confidence:d.confidence,model:d.model,costUsd:d.costUsd}}}const wn=Z("ensure-content-script"),hu=1500,pu=300;async function Hn(e,t){if(await No(e,t))return{ok:!0};const a=chrome.runtime.getManifest(),n=[];for(const o of a.content_scripts??[])Array.isArray(o.js)&&n.push(...o.js);if(n.length===0)return wn.error("manifest declares no content_scripts"),{ok:!1,reason:"inject-failed",detail:"no content_scripts declared in manifest"};try{const o=t!==void 0?{tabId:e,frameIds:[t]}:{tabId:e,allFrames:!0};await chrome.scripting.executeScript({target:o,files:n})}catch(o){return fu(o)}return await gu(pu),await No(e,t)?(wn.info("content script injected on demand",{tabId:e,frameId:t}),{ok:!0}):{ok:!1,reason:"unresponsive-after-inject",detail:"content script injected but did not register handlers — likely Content Security Policy on this page is blocking it"}}async function No(e,t){try{const a=t!==void 0?{frameId:t}:void 0,n=await Promise.race([chrome.tabs.sendMessage(e,{type:"PING_REQUEST"},a),new Promise((o,r)=>setTimeout(()=>r(new Error("ping timeout")),hu))]);return(n==null?void 0:n.type)==="PING_RESPONSE"}catch{return!1}}function fu(e){const t=e instanceof Error?e.message:String(e);return/cannot access contents of (?:the page|url)/i.test(t)||/chrome:\/\//i.test(t)||/chrome-extension:\/\//i.test(t)||/devtools:\/\//i.test(t)||/chrome\.google\.com\/webstore/i.test(t)||/the extensions gallery/i.test(t)?{ok:!1,reason:"restricted-url",detail:t}:/no tab with id/i.test(t)||/tab .* was closed/i.test(t)?{ok:!1,reason:"tab-gone",detail:t}:(wn.warn("content-script injection failed",e),{ok:!1,reason:"inject-failed",detail:t})}function gu(e){return new Promise(t=>setTimeout(t,e))}function vn(e){switch(e.reason){case"restricted-url":return"Chrome blocks extensions on this page (chrome:// pages, the Chrome Web Store, view-source: pages, and a few others). Open a regular https:// page and try again.";case"tab-gone":return"The tab was closed or navigated away while the audit was starting. Click into the tab you want audited and click Scan again.";case"unresponsive-after-inject":return"We loaded our auditor onto the page, but the page's Content Security Policy appears to be blocking it. Some sites (banks, gov, strict CSPs) prevent extensions from running. Try a different page on the same site, or open DevTools → Console to confirm a CSP error.";case"inject-failed":return`Could not load our auditor onto the page. Try a hard refresh (Ctrl+Shift+R) on the page and click Scan again. If it persists, the page may be using an unusual document type or origin restriction.${e.detail?` (Detail: ${e.detail})`:""}`;case"unknown":default:return"Could not establish connection with the page. Hard-refresh (Ctrl+Shift+R) the tab you want audited and try again."}}const Xa=Z("forensic-anchor-client"),mu="https://api.wcagcheckr.com",bu="wcagcheckr",yu=15e3;function wu(e){if(typeof e!="object"||e===null)return!1;const t=e;return t.schemaVersion!==1&&t.schemaVersion!==2||!(typeof t.anchoredAt=="string"&&typeof t.tsaName=="string"&&typeof t.rfc3161TokenBase64=="string"&&t.rfc3161TokenBase64.length>0&&typeof t.serverSignatureBase64=="string"&&t.serverSignatureBase64.length>0&&typeof t.serverKeyFingerprint=="string"&&t.serverKeyFingerprint.length>0)?!1:t.schemaVersion===2?typeof t.prevAuditHash=="string"&&/^[0-9a-f]{64}$/.test(t.prevAuditHash):!0}async function vi(e,t){return Ai(e.hash,e.pageUrl,e.capturedAt,t)}async function Ai(e,t,a,n){const o={auditHash:e,pageUrl:t,capturedAt:a,...n?{licenseId:n}:{}},r=`${mu}/v1/products/${bu}/forensic/anchor`;try{const i=await fetch(r,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(o),signal:AbortSignal.timeout(yu)});if(!i.ok)return Xa.warn(`anchor HTTP ${i.status}; entry stays local-only`),null;const c=await i.json();return wu(c)?c:(Xa.warn("anchor returned malformed receipt; entry stays local-only",c),null)}catch(i){return Xa.warn("anchor request failed; entry stays local-only",i),null}}async function vu(e){const t=na(e),a=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",a);return Array.from(new Uint8Array(n)).map(o=>o.toString(16).padStart(2,"0")).join("")}function Au(e){try{return new URL(e).hostname}catch{return e}}const ku="wcag-site-claims",xu=1,Dt="claims";let Qa=null;function qn(){return Qa||(Qa=Sn(ku,xu,{upgrade(e){e.objectStoreNames.contains(Dt)||e.createObjectStore(Dt,{keyPath:"domain"})}})),Qa}async function Iu(e){await(await qn()).put(Dt,e)}async function tf(e){return await(await qn()).get(Dt,e)??null}async function af(){return(await qn()).getAll(Dt)}const Lo="4.11.4";async function Su(e){try{return(await chrome.tabs.get(e)).url??""}catch{return""}}const U=Z("flows");async function vt(){const e=await fr();if(!e)throw new Error("no audit target tab found");return e}async function zn(){var a,n,o,r,i;const e=await Ye("stateMatrix",nn);return((a=e.pseudoStates)==null?void 0:a.length)>0&&((n=e.themes)==null?void 0:n.length)>0&&((o=e.directions)==null?void 0:o.length)>0&&((r=e.breakpoints)==null?void 0:r.length)>0&&((i=e.breakpointPresets)==null?void 0:i.length)>0?e:(U.warn("stored stateMatrix is invalid; using defaults"),nn)}async function Cu(e,t,a){const n=t.themes.includes("light"),o=t.themes.includes("dark");if(!n||!o)return t;let r=null;try{r=await xe(e,{type:"THEME_AWARENESS_REQUEST"},a)}catch{return t}return!r||r.hasUnreadableSheets?t:r.hasDarkModeCss&&!r.hasLightModeCss?(U.info("theme-axis prune: site is dark-only, skipping light pass"),{...t,themes:t.themes.filter(i=>i!=="light")}):r.hasLightModeCss&&!r.hasDarkModeCss?(U.info("theme-axis prune: site is light-only, skipping dark pass"),{...t,themes:t.themes.filter(i=>i!=="dark")}):t}const $u=200,Za=3,Po=8;async function Tu(e,t){const a=[];let n=null,o=null;for(let i=0;i<Po&&!t();i++){const c=await e();if(c.error&&(o=c.error),!c.result)break;if(n=c.result,a.push(c.violations),i===1&&a[0].length===0&&a[1].length===0)return{violations:[],lastResult:n,sampleCount:2,stabilized:!0,lastError:o};if(a.length>=Za){const d=a.slice(-Za);if(Eu(d))return{violations:d[d.length-1],lastResult:n,sampleCount:a.length,stabilized:!0,lastError:o}}i<Po-1&&await new Promise(d=>setTimeout(d,$u))}const r=a.slice(-Za);return{violations:Ru(r),lastResult:n,sampleCount:a.length,stabilized:!1,lastError:o}}function Eu(e){if(e.length<2)return!0;const t=Fo(e[0]);for(let a=1;a<e.length;a++){const n=Fo(e[a]);if(n.size!==t.size)return!1;for(const o of t)if(!n.has(o))return!1}return!0}function Fo(e){return new Set(e.map(t=>`${t.ruleId}::${t.target.selector}::${t.matchKey}`))}function Ru(e){const t=new Map,a="Audit detected this finding intermittently across multiple samples — likely an animation or transitional state was in progress. Verify manually.";for(const n of e)for(const o of n){const r=`${o.ruleId}::${o.target.selector}::${o.matchKey}`;t.has(r)||t.set(r,{...o,needsReview:!0,flakyAcrossRuns:!0,target:{...o.target,failureSummary:o.target.failureSummary?`${o.target.failureSummary} ${a}`:a}})}return Array.from(t.values())}async function _o(e,t,a,n,o){await Promise.all([(async()=>{var r;try{const i=await xe(e,{type:"READING_ORDER_REQUEST",selector:t},a);n[0]&&(i.issues.length>0?(n[0].readingOrderIssues=i.issues,n[0].positionAnalysisCapturedAt=o):(r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-reading-order-clean",wcagCriterion:"1.3.2"}))}catch(i){U.debug("reading-order analysis skipped",i)}})(),(async()=>{var r;try{const i=await xe(e,{type:"TAB_ORDER_ANALYZE_REQUEST"},a);n[0]&&(i.issues.length>0?(n[0].tabOrderIssues=i.issues,n[0].positionAnalysisCapturedAt=o):(r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-tab-order-clean",wcagCriterion:"2.4.3"}))}catch(i){U.debug("tab-order analysis skipped",i)}})(),(async()=>{var r;try{const i=await xe(e,{type:"TYPOGRAPHY_ANALYZE_REQUEST",selector:t},a);i.issues.length>0&&n[0]?n[0].typographyIssues=i.issues:n[0]&&((r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-typography-clean",wcagCriterion:"1.4.12"}))}catch(i){U.debug("typography analysis skipped",i)}})(),(async()=>{try{const r=await xe(e,{type:"CUSTOM_PROPERTY_REQUEST"},a);r.undefined.length>0&&n[0]&&(n[0].undefinedCustomProperties=r.undefined)}catch(r){U.debug("custom-property analysis skipped",r)}})()])}async function pt(e,t,a,n,o={}){var I,D,S,_,N;const r=o.asSubroutine===!0;if(await He())return r||H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}}),{ok:!1,results:[],error:Ze};const i=o.tabIdOverride??await vt(),c=await Hn(i,a);if(!c.ok)return r||H({type:"AUDIT_FAILED_EVENT",error:{code:c.reason==="restricted-url"?"RESTRICTED_URL":"CONTENT_SCRIPT_UNREACHABLE",message:vn(c),recoverable:c.reason!=="restricted-url"}}),{ok:!1,results:[],error:vn(c)};try{const[O]=await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},func:()=>document.contentType}),W=String((O==null?void 0:O.result)??"").toLowerCase();if(!(W===""||W==="text/html"||W==="application/xhtml+xml")){const V=`This page is not an HTML document (Content-Type: ${W||"unknown"}). WCAG HTML checks don't apply to XML sitemaps, RSS/Atom feeds, JSON, or plain text — skipped.`;return r||H({type:"AUDIT_FAILED_EVENT",error:{code:"NOT_HTML_DOCUMENT",message:V,recoverable:!1}}),{ok:!1,results:[],error:V,skipped:!0}}}catch(O){U.debug("content-type probe failed (non-fatal); proceeding with audit",O)}try{await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:()=>{try{let O=document.getElementById("__wcagcheckr_audit_freeze");O||(O=document.createElement("style"),O.id="__wcagcheckr_audit_freeze",O.textContent="*, *::before, *::after { animation-duration: 0s !important; animation-delay: 0s !important; transition-duration: 0s !important; transition-delay: 0s !important; } html, body { scroll-behavior: auto !important; }",document.documentElement.appendChild(O)),window.scrollTo(0,0);const W=document.activeElement;W&&W instanceof HTMLElement&&W!==document.body&&W.blur()}catch{}}}),await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:async()=>{try{await document.fonts.ready}catch{}}})}catch(O){U.debug("audit-start state stabilization failed (non-fatal)",O)}const d=n??await zn(),l=await Cu(i,d,a),p=Fl(l),m=await ls(`${await Su(i)}|${e}|${a??0}`),u=await ds(l),g=await Ye("axeDisabledRules",[]),h=await us(g);let f=null;try{f=(await xe(i,{type:"SCOPE_FINGERPRINT_REQUEST",selector:e},a)).fingerprint}catch(O){U.debug("scope fingerprint failed; skipping cache fast-path",O)}if(f){const O=await hs(m);if(O&&O.fingerprint===f&&O.axeVersion===Lo&&O.matrixConfigHash===u&&O.disabledRulesHash===h)return U.info(`audit-cache HIT for ${O.componentId} — skipping matrix iteration`),r||(H({type:"AUDIT_COMPLETE_EVENT",componentId:O.componentId,results:O.results,delta:O.delta}),H({type:"SCORECARD_UPDATED_EVENT"})),{ok:!0,results:O.results}}r||await at({sessionId:_t(),mode:"single-element",scope:e,startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"}),await $t(i,{type:"LIVE_REGIONS_ARM_REQUEST"},a).catch(()=>{}),await $t(i,{type:"FOCUS_TRACE_ARM_REQUEST"},a).catch(()=>{}),await xe(i,{type:"WARMUP_REQUEST"},a).catch(()=>{});const w=[],b=[];let k="",v,s=!1,x=null,$=null,A=null,C=null,F=!1,T=null;try{for(let O=0;O<p.length;O++){if(t.isCanceled()){U.info("single audit canceled by user");break}const W=p[O];try{const P=await bn(i,W,e,a);if(!P.success){v=(I=P.error)==null?void 0:I.message,U.warn(`state ${O+1}/${p.length} drive failed`,v);continue}W.breakpoint.id!==x&&(await xe(i,{type:"WARMUP_REQUEST"},a).catch(()=>{}),x=W.breakpoint.id);const V=O===0?void 0:[...ii],M=await Tu(async()=>{var z;const q=await xe(i,{type:"AUDIT_REQUEST",selector:e,currentState:W,rulesToRun:V},a);return q.success&&q.result?{result:q.result,violations:q.result.violations,error:null}:{result:null,violations:[],error:((z=q.error)==null?void 0:z.message)??null}},()=>t.isCanceled());M.lastError&&(v=M.lastError,U.warn(`state ${O+1}/${p.length} sampling: ${M.lastError}`));const j=M.lastResult;if(!M.stabilized&&M.sampleCount>0&&U.info(`state ${O+1}/${p.length} did not stabilize after ${M.sampleCount} samples — ${M.violations.length} finding(s) routed to needs-review as flickering`),j){s=!0;const q=M.violations;U.info(`[adaptive-sample] state ${O+1}/${p.length} ${W.pseudoState}·${W.theme}·${W.direction}·${W.breakpoint.id}: ${M.sampleCount} sample(s), ${M.stabilized?"stabilized":"flickering"}, ${q.length} finding(s)`);const z=await ad(i,{quality:75})??void 0;let X,re;try{X=(await xe(i,{type:"LIVE_REGIONS_DRAIN_REQUEST"},a)).announcements}catch{}try{re=(await xe(i,{type:"FOCUS_TRACE_DRAIN_REQUEST"},a)).focusEvents}catch{}if(b.push({...j,violations:q,frameId:a,announcements:X,focusEvents:re,screenshotDataUrl:z}),w.push(...q),k=j.componentId,O===0&&$===null)try{const oe=await Ye("aiConfig",{}),le=ke(oe);if(le.enabled&&le.apiKey&&k){$=pa(i,e,a,le,b,k,t).catch(ge=>{U.warn("ai augmentation (parallel) failed",ge)});const ie=((D=b[0])==null?void 0:D.pageUrl)??((S=b[0])==null?void 0:S.scope)??"";A=jd({tabId:i,componentId:k,pageUrl:ie,results:b,verifyFixesOnly:o.verifyFixesOnly}).catch(ge=>(U.warn("1.4.11 walkthrough (parallel) failed",ge),{criterionId:"1.4.11",ran:!0,ok:!1,error:String(ge)}))}}catch(oe){U.debug("ai augmentation (parallel) gate-read failed",oe)}!F&&W.pseudoState==="default"&&W.theme==="light"&&W.direction==="ltr"&&W.breakpoint.id==="desktop"&&b[0]&&(F=!0,T=_o(i,e,a,b,W).catch(le=>{U.debug("lightweight deep analyzers (parallel) failed",le)}))}}catch(P){v=P instanceof Error?P.message:String(P),U.warn(`state ${O+1}/${p.length} threw`,P)}H({type:"AUDIT_PROGRESS_EVENT",current:O+1,total:p.length,currentState:W,componentId:k||void 0}),r||await Ft({})}if(s&&k){const O={pseudoState:"default",ariaVariation:null,theme:"light",direction:"ltr",breakpoint:{id:"desktop",label:"Desktop",width:1280,height:800,deviceScaleFactor:1,mobile:!1}};if(F){if(T)try{await T}catch{}}else{try{await bn(i,O,e,a),await new Promise(M=>setTimeout(M,200))}catch(M){U.debug("reference-state drive failed; analyzers will use last matrix state",M)}await _o(i,e,a,b,O).catch(M=>{U.debug("lightweight deep analyzers (post-matrix fallback) failed",M)})}try{const M=await Ye("aiConfig",{}),j=ke(M);if(j.enabled&&j.apiKey&&k&&b[0]){const q=b[0].pageUrl??b[0].scope??"";C=Vd({tabId:i,componentId:k,pageUrl:q,results:b,verifyFixesOnly:o.verifyFixesOnly}).catch(z=>(U.warn("1.3.2 walkthrough (parallel) failed",z),{criterionId:"1.3.2",ran:!0,ok:!1,error:String(z)}))}}catch(M){U.debug("1.3.2 walkthrough (parallel) gate-read failed",M)}try{if($)await $;else{const M=await Ye("aiConfig",{}),j=ke(M);j.enabled&&j.apiKey&&await pa(i,e,a,j,b,k,t)}}catch(M){U.warn("ai augmentation skipped",M)}try{const M=await Ye("aiConfig",{}),j=ke(M);if(j.enabled&&j.apiKey&&k&&b[0]){await Yt(i,e,a).catch(oe=>U.warn("pre-walkthrough resetState failed",oe));const q=b[0].pageUrl??b[0].scope??"",z=new AbortController,X=setInterval(()=>{t.isCanceled()&&z.abort()},250),re=await Gd({tabId:i,componentId:k,pageUrl:q,results:b,signal:z.signal,verifyFixesOnly:o.verifyFixesOnly}).finally(()=>clearInterval(X));U.info("keyboard walkthroughs complete",re)}}catch(M){U.warn("keyboard walkthroughs failed",M)}try{const M=[];A&&M.push(await A),C&&M.push(await C),M.length>0&&U.info("parallel AI walkthroughs joined",M)}catch(M){U.warn("parallel AI walkthrough join failed",M)}try{if(k&&b[0]){const M=b[0].pageUrl??b[0].scope??"",j=new AbortController,q=setInterval(()=>{t.isCanceled()&&j.abort()},250),z=await Bd({tabId:i,componentId:k,pageUrl:M,results:b,signal:j.signal,verifyFixesOnly:o.verifyFixesOnly}).finally(()=>clearInterval(q));U.info("2.5.3 label-in-name walkthrough complete",z)}}catch(M){U.warn("2.5.3 walkthrough failed",M)}try{if(k&&b[0]){await Yt(i,e,a).catch(X=>U.warn("pre-sampler resetState failed",X));const M=new AbortController,j=setInterval(()=>{t.isCanceled()&&M.abort()},250),{resolved:q,skipped:z}=await nu(i,b,M.signal).finally(()=>clearInterval(j));U.info(`pixel contrast sampler: resolved=${q} skipped=${z}`)}}catch(M){U.warn("pixel contrast sampler failed",M)}const W=b.flatMap(M=>M.announcements??[]),P=b.flatMap(M=>M.focusEvents??[]),V=await Gn(k,w,{announcements:W,focusEvents:P},d);try{const M=await xa(b.map(de=>de.componentId)),j=await $r(b.map(de=>de.componentId)),q=new Set;for(const de of new Set(b.map(y=>y.componentId))){const y=await va(de);for(const L of y)q.add(L)}const z=[...new Set(b.map(de=>de.componentId))],X=await Fr(z),re=((_=b[0])==null?void 0:_.pageUrl)??((N=b[0])==null?void 0:N.scope)??"",oe=re?await ka(re):[],le=new Set(b.map(de=>de.pageUrl??de.scope??"").filter(Boolean)).size>1?"site-crawl":"single-page",ie=et(w,{runs:[],workflows:Pe},b,q,M,j,X,le,oe),ge={...ie.score,letter:ie.combined},Re=b.reduce((de,y)=>de+y.durationMs,0),Oe=await pe(),ve=he(Oe,"forensicLog")?await zr(b,ge,Re):null;if(ve){const de=await pe();if(he(de,"forensicAnchoring"))try{const y=await ga(),L=await vi(ve,y??void 0);L&&await Kr(ve.componentId,ve.capturedAt,L)}catch(y){U.warn("forensic anchoring failed (entry stays local-only)",y)}}}catch(M){U.warn("forensic log recording failed",M)}if(f)try{await ps({lookupKey:m,fingerprint:f,axeVersion:Lo,matrixConfigHash:u,disabledRulesHash:h,results:b,delta:V,componentId:k,cachedAt:Date.now()})}catch(M){U.warn("audit-cache write failed",M)}try{await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:()=>{const M=document.getElementById("__wcagcheckr_audit_freeze");M&&M.remove()}})}catch(M){U.debug("audit-end state-freeze cleanup failed",M)}r||H({type:"AUDIT_COMPLETE_EVENT",componentId:k,results:b,delta:V})}else r||H({type:"AUDIT_FAILED_EVENT",error:{code:"AXE_FAILED",message:v?`All audits failed. Last error: ${v}`:"No state produced results. Selector may not exist in the audit target frame.",recoverable:!0}});r||await dt()}catch(O){U.error("single audit failed",O),r||H({type:"AUDIT_FAILED_EVENT",componentId:k||void 0,error:Zn(O)?O.payload:{code:"UNKNOWN",message:String(O),recoverable:!1}}),v=Zn(O)?O.payload.message:String(O)}finally{await $t(i,{type:"LIVE_REGIONS_DISARM_REQUEST"},a).catch(()=>{}),await $t(i,{type:"FOCUS_TRACE_DISARM_REQUEST"},a).catch(()=>{}),await Yt(i,e,a)}return{ok:s,results:b,error:s?void 0:v}}async function ki(e){var t;try{const n=(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{var r;const o=window;return{detected:typeof o.__STORYBOOK_PREVIEW__=="object",version:(r=o.__STORYBOOK_PREVIEW__)==null?void 0:r.version}}})).find(o=>{var r;return(r=o.result)==null?void 0:r.detected});if(n)return{detected:!0,version:(t=n.result)==null?void 0:t.version,frameId:n.frameId}}catch(a){U.warn("storybook detection scripting failed",a)}return{detected:!1}}async function Ou(e){if(await He()){H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const t=await vt(),a=await Si(t);if(await chrome.storage.local.set({"storybook:lastDetected":{detected:a.kind==="storybook"&&a.detected,version:a.version,detectedAt:new Date().toISOString()},"playground:lastDetected":{kind:a.kind,detected:a.detected,version:a.version,detectedAt:new Date().toISOString()}}),!a.detected){H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:"No supported component playground detected on this tab. Open a Storybook (iframe.html / storybook-static), Ladle, or Bit page and try again.",recoverable:!0}});return}if(a.kind==="bit"){H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:"Bit detected. Auto-iterate is not yet supported for Bit (compositions are iframe-per-component without a unified listing API). Use the element picker to audit individual compositions one at a time.",recoverable:!0}});return}const n=a.frameId??0,o=a.kind==="storybook"?await Nu(t,n):await Pu(t,n);if(!o.length){U.warn(`${a.kind} detected but no stories returned`),H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:`${a.kind==="ladle"?"Ladle":"Storybook"} detected but no stories were returned. Try reloading the page.`,recoverable:!0}});return}await at({sessionId:_t(),mode:"storybook-all",totalStories:o.length,completedStories:[],startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});for(const r of o){if(e.isCanceled()){U.info(`${a.kind} iteration canceled by user`);break}try{if(a.kind==="storybook"){await Lu(t,n,r.id);const c=await $t(t,{type:"STORYBOOK_GET_STORY_TARGET_REQUEST",tabId:t},n);await pt(c.selector,e,n)}else await Fu(t,n,r.id),await pt("#ladle-root",e,n)}catch(c){U.warn(`story ${r.id} failed; continuing with next`,c)}const i=await Ra();if((i==null?void 0:i.state)==="interrupted"){U.info("storybook iteration interrupted");break}await Ft({completedStories:[...(i==null?void 0:i.completedStories)??[],r.id]})}H({type:"SCORECARD_UPDATED_EVENT"}),await dt()}async function Mu(e){if(await He()){H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const t=await pe();if(!he(t,"allFramesAudit")){H({type:"AUDIT_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"All-frames audit is not available on your current plan.",recoverable:!1}});return}const a=await vt();let n=[];try{n=(await chrome.scripting.executeScript({target:{tabId:a,allFrames:!0},func:()=>({url:window.location.href})})).map(r=>{var i;return{frameId:r.frameId,url:((i=r.result)==null?void 0:i.url)??""}}).filter(r=>/^https?:/i.test(r.url))}catch(o){U.warn("multi-frame discovery failed",o)}if(n.length===0){H({type:"AUDIT_FAILED_EVENT",error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:"No auditable frames found on this tab. The page may use only chrome-extension:// or data: frames.",recoverable:!0}});return}await at({sessionId:_t(),mode:"all-frames",totalFrames:n.length,completedFrames:[],startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});for(const o of n){if(e.isCanceled()){U.info("all-frames iteration canceled");break}try{await pt("html",e,o.frameId)}catch(i){U.warn(`frame ${o.frameId} (${o.url.slice(0,80)}) audit failed; continuing`,i)}const r=await Ra();if((r==null?void 0:r.state)==="interrupted"){U.info("all-frames iteration interrupted");break}await Ft({completedFrames:[...(r==null?void 0:r.completedFrames)??[],o.frameId]})}H({type:"SCORECARD_UPDATED_EVENT"}),await dt()}async function Du(e){var o;const t=await pe();if(!he(t,"parallelScan")){H({type:"AUDIT_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Parallel scan is not available on your current plan.",recoverable:!1}});return}const a=await fr();let n;if(a!==null)try{n=(await chrome.tabs.get(a)).url}catch(r){U.warn("failed to get target tab url",r)}if(!n){H({type:"AUDIT_FAILED_EVENT",error:{code:"NETWORK",message:"Could not determine target URL for parallel scan.",recoverable:!1}});return}await at({sessionId:_t(),mode:"single-element",scope:"html",startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});try{const r=await zn(),{runParallelTabAudit:i}=await kn(async()=>{const{runParallelTabAudit:m}=await import("./parallel-tab-flow-CU0Ury3L.js");return{runParallelTabAudit:m}},__vite__mapDeps([0,1,2,3,4])),c=await i({targetUrl:n,scope:"html",matrix:r,parallelism:4,cancel:e});if(U.info(`parallel scan complete: ${c.results.length} results across ${c.tabsCompleted} tabs (${c.tabsFailed} failed) in ${Math.round(c.parallelDurationMs)}ms`),c.results.length===0){H({type:"AUDIT_FAILED_EVENT",error:{code:"NETWORK",message:`All ${c.tabsFailed} worker tabs failed. Falling back to Full Page scan is recommended.`,recoverable:!0}});return}const d=((o=c.results[0])==null?void 0:o.componentId)??"parallel-scan";if(a!==null)try{const m=await Ye("aiConfig",{}),u=ke(m);u.enabled&&u.apiKey&&await pa(a,"html",void 0,u,c.results,d,e)}catch(m){U.warn("parallel scan: ai augmentation skipped",m)}const l=c.results.flatMap(m=>m.violations);let p;try{p=await Gn(d,l)}catch(m){U.warn("parallel scan: baseline compare failed",m),p={new:[],persistent:[],fixed:[],newCount:0,persistentCount:0,fixedCount:0,baselineSnapshotMeta:null,comparedAt:new Date().toISOString()}}H({type:"AUDIT_COMPLETE_EVENT",componentId:d,results:c.results,delta:p}),H({type:"SCORECARD_UPDATED_EVENT"})}catch(r){U.warn("parallel scan failed",r),H({type:"AUDIT_FAILED_EVENT",error:{code:"UNKNOWN",message:r instanceof Error?r.message:String(r),recoverable:!0}})}finally{await dt()}}async function Nu(e,t){var a;try{return((a=(await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",func:async()=>{var d,l;const o=window.__STORYBOOK_PREVIEW__;if(!o)return[];const r=o.storyStoreValue??o.storyStore;if(!r)return[];typeof r.cacheAllCSFFiles=="function"&&await r.cacheAllCSFFiles();const i=((d=r.extract)==null?void 0:d.call(r))??((l=r.cachedCSFFiles)==null?void 0:l.call(r));if(!i)return[];const c=[];if(i instanceof Map)for(const[p,m]of i){const u=m;c.push({id:String(p),name:u.name??String(p),kind:u.title??u.kind??""})}else if(typeof i=="object"&&i!==null)for(const[p,m]of Object.entries(i)){const u=m;c.push({id:p,name:u.name??p,kind:u.title??u.kind??""})}return c}}))[0])==null?void 0:a.result)??[]}catch(n){return U.warn("listStoriesViaMainWorld failed",n),[]}}async function Lu(e,t,a){try{await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",args:[a,3e3],func:async(n,o)=>{const r=new URL(window.location.href);r.searchParams.set("id",n),r.searchParams.set("viewMode","story"),window.location.href!==r.href&&(window.history.pushState({},"",r.href),window.dispatchEvent(new PopStateEvent("popstate"))),await new Promise(i=>{const c=setTimeout(()=>i(),o),d=()=>{clearTimeout(c),i()};window.addEventListener("storyrendered",d,{once:!0})})}})}catch(n){U.warn(`navigateToStoryViaMainWorld(${a}) failed`,n)}}async function xi(e){var t;try{const n=(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{const o=document.getElementById("ladle-root")!==null,r=document.title==="Ladle",i=!!document.querySelector('link[href*="ladle.css"]');return{detected:o&&(r||i),version:void 0}}})).find(o=>{var r;return(r=o.result)==null?void 0:r.detected});if(n)return{detected:!0,version:(t=n.result)==null?void 0:t.version,frameId:n.frameId}}catch(a){U.warn("ladle detection scripting failed",a)}return{detected:!1}}async function Pu(e,t){var a;try{return((a=(await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",func:async()=>{try{const o=await fetch(new URL("/meta.json",window.location.href).href,{credentials:"same-origin"});if(!o.ok)return[];const i=(await o.json()).stories??{};return Object.entries(i).map(([c,d])=>({id:c,name:d.name??c,kind:(d.levels??[]).join(" / ")}))}catch{return[]}}}))[0])==null?void 0:a.result)??[]}catch(n){return U.warn("listLadleStoriesViaMainWorld failed",n),[]}}async function Fu(e,t,a){try{await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",args:[a,3e3],func:async(n,o)=>{const r=new URL(window.location.href);r.searchParams.set("story",n),window.location.href!==r.href&&(window.history.pushState({},"",r.href),window.dispatchEvent(new PopStateEvent("popstate"))),await new Promise(i=>setTimeout(i,Math.min(o,500)))}})}catch(n){U.warn(`navigateToLadleStoryViaMainWorld(${a}) failed`,n)}}async function Ii(e){try{return(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{const a=window.location.href;return/bit\.dev|bit-dev|bitsrc|\/~aspect|\/composition/i.test(a)}})).some(a=>a.result===!0)}catch{return!1}}async function Si(e){const t=await ki(e);if(t.detected)return{kind:"storybook",...t};const a=await xi(e);return a.detected?{kind:"ladle",...a}:await Ii(e)?{kind:"bit",detected:!0}:{kind:null,detected:!1}}const da=200,Ci=6e4;function ua(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function $i(e,t){try{const a=new URL(e,t);return a.hash="",a.toString()}catch{return null}}function Ti(e){try{return/\.(xml|rss|atom|json|txt|csv|ics|rdf|xsl|xslt)$/i.test(new URL(e).pathname)}catch{return!1}}async function Ei(e,t,a){await chrome.tabs.update(e,{url:t}),await new Promise((n,o)=>{const r=setTimeout(()=>{chrome.tabs.onUpdated.removeListener(i),o(new Error(`navigation timeout (${a}ms): ${t}`))},a);function i(c,d){c===e&&d.status==="complete"&&(clearTimeout(r),chrome.tabs.onUpdated.removeListener(i),n())}chrome.tabs.onUpdated.addListener(i)}),await new Promise(n=>setTimeout(n,400))}async function Ri(e){var t;try{return((t=(await chrome.scripting.executeScript({target:{tabId:e},func:()=>Array.from(document.querySelectorAll("a[href]")).map(n=>n.getAttribute("href")).filter(n=>typeof n=="string"&&!n.startsWith("javascript:"))}))[0])==null?void 0:t.result)??[]}catch(a){return U.debug("link discovery failed",a),[]}}async function Oi(e,t){var a,n;try{const r=new URL(t).pathname.toLowerCase().replace(/\/+$/,"");if(/(?:^|\/)(?:404|not-found|page-not-found|error|server-error)$/.test(r))return`URL path "${r||"/"}" matches a common error-route pattern.`}catch{}try{const o=await chrome.scripting.executeScript({target:{tabId:e},func:()=>document.title||""}),r=((n=(a=o==null?void 0:o[0])==null?void 0:a.result)==null?void 0:n.trim())??"";if(!r)return null;const i=[[/^4(?:0[0-46-9]|[1-9]\d)\b/,"title starts with a 4xx error code"],[/^5\d{2}\b/,"title starts with a 5xx error code"],[/^(?:page\s+)?not\s+found\b/i,'title starts with "Not Found"'],[/^error\s*[-:]?\s*\d{3}\b/i,'title starts with "Error" + status code'],[/^(?:oops|whoops)[\s,!:.-]/i,'title leads with "Oops" — common error-template pattern']];for(const[c,d]of i)if(c.test(r))return`${d} (title: "${r.slice(0,80)}").`;return null}catch(o){return U.debug("error-page detection failed; proceeding with audit",o),null}}const Uo=/Linked PDF at (\S+)\./;async function Mi(e,t){if(!he(t,"pdfAudit")){U.info("PDF audit disabled for tier; skipping crawl PDF pass",{tier:t});return}const a=new Map;for(const n of e)if(!n.error)for(const o of n.results)for(const r of o.violations){if(r.ruleId!=="pdf-needs-cli-audit")continue;const i=Uo.exec(r.description);if(!i)continue;const c=i[1];let d;try{d=new URL(c,n.url).href}catch{continue}if(!/^https?:\/\//i.test(d))continue;let l=a.get(d);l||(l=new Set,a.set(d,l)),l.add(n)}if(a.size!==0){U.info(`PDF audit pass: ${a.size} unique PDF(s) across the crawl`);for(const[n,o]of a){let r;try{r=await cl(n)}catch(i){U.warn(`PDF audit threw for ${n}`,i);continue}for(const i of o){const c=i.results[0];if(!c)continue;const d=c.componentId,l=c.state,p=r.findings.map(m=>Wo(m,n,d,l));c.violations=c.violations.filter(m=>{if(m.ruleId!=="pdf-needs-cli-audit")return!0;const u=Uo.exec(m.description);if(!u)return!0;try{return new URL(u[1],i.url).href!==n}catch{return!0}}),c.violations.push(...p),r.fatalError&&c.violations.push(Wo({ruleId:"pdf-audit-skipped",impact:"minor",wcagCriterion:"1.1.1",description:`PDF audit skipped: ${r.fatalError}`,failureSummary:"The PDF could not be audited automatically. Run `wcagcheckr-ci pdf <url>` against this PDF on the command line for a manual audit."},n,d,l))}}}}function Wo(e,t,a,n){return{ruleId:e.ruleId,wcagCriterion:e.wcagCriterion,wcagLevel:"AA",impact:e.impact,description:e.description,helpUrl:"https://www.w3.org/WAI/standards-guidelines/wcag/",target:{selector:t,outerHTML:`<a href="${t}">[PDF]</a>`,failureSummary:e.failureSummary,tagName:"PDF",role:null,accessibleName:null,textSnippet:null,attrId:null,attrTestid:null},componentId:a,currentState:n,axeVersion:"pdf-audit",detectedAt:new Date().toISOString(),matchKey:`pdf::${e.ruleId}::${t}`}}async function _u(e,t,a){if(await He())return H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}}),[];const n=await pe();if(!he(n,"siteCrawl"))return H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Site crawl is not available on your current plan.",recoverable:!1}}),[];const o=await vt(),r=tr(n).siteCrawlMaxPages,i=Number.isFinite(r)?Math.min(r,da):da,c=Math.min(t.maxPages??25,i),d=t.includeRegex?ha(t.includeRegex):null,l=t.excludeRegex?ha(t.excludeRegex):null,p=[e],m=new Set,u=[];try{for(;p.length>0&&u.length<c;){if(a.isCanceled()){U.info("crawl discovery canceled by user");break}const g=p.shift();if(!(!g||m.has(g))&&ua(g,e)&&!(d&&!d.test(g))&&!(l&&l.test(g))){m.add(g);try{if(await Ei(o,g,Ci),!(await Hn(o,0)).ok||await Oi(o,g))continue;u.push(g),H({type:"CRAWL_DISCOVERY_PROGRESS_EVENT",found:u.length,url:g});const w=await Ri(o);for(const b of w){const k=$i(b,g);k&&ua(k,e)&&!Ti(k)&&!m.has(k)&&!p.includes(k)&&p.push(k)}}catch(h){U.debug("discovery: page navigation/link-read failed; skipping",h);continue}await Ft({})}}return H({type:"CRAWL_DISCOVERY_COMPLETE_EVENT",urls:u}),u}catch(g){return U.error("crawl discovery failed",g),H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:"CRAWL_DISCOVERY_FAILED",message:String(g),recoverable:!0}}),[]}}async function Uu(e,t,a){if(await He()){H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const n=await pe();if(!he(n,"siteCrawl")){H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Site crawl is not available on your current plan.",recoverable:!1}});return}const o=await vt(),r=tr(n).siteCrawlMaxPages,i=Number.isFinite(r)?Math.min(r,da):da,c=Array.isArray(t.urls)&&t.urls.length>0,d=Math.min(c?t.urls.length:t.maxPages??25,i),l=t.includeRegex?ha(t.includeRegex):null,p=t.excludeRegex?ha(t.excludeRegex):null,m=new Date().toISOString(),u=Date.now(),g=c?[...t.urls]:[e],h=new Set,f=[];await at({sessionId:_t(),mode:"storybook-all",scope:e,startedAt:m,lastProgressAt:new Date().toISOString(),state:"running"});try{for(;g.length>0&&h.size<d;){if(a.isCanceled()){U.info("site crawl canceled by user");break}const x=g.shift();if(!x||h.has(x)||!ua(x,e)||l&&!l.test(x)||p&&p.test(x))continue;h.add(x);const $=h.size,A=Date.now();H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"auditing"});try{await Ei(o,x,Ci);const C=await Hn(o,0);if(!C.ok)throw new Error(vn(C));const F=await Oi(o,x);if(F){const _=`Skipped — page appears to be an error response. ${F}`;f.push({url:x,results:[],delta:null,componentId:x,durationMs:Date.now()-A,error:_}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:_});continue}await xe(o,{type:"WARMUP_REQUEST"},0).catch(()=>{});const T=await pt("html",a,0,void 0,{asSubroutine:!0,tabIdOverride:o,verifyFixesOnly:t.verifyFixesOnly}),I=T.results,D=T.ok?void 0:T.error,S=Date.now()-A;if(!T.ok&&T.skipped)f.push({url:x,results:[],delta:null,componentId:x,durationMs:S,error:T.error,skipped:!0}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"skipped",error:T.error});else if(I.length>0){const _=await ll(o,x).catch(()=>null),N=I.reduce((O,W)=>O+W.violations.length,0);f.push({url:x,results:I,delta:null,componentId:I[0].componentId,durationMs:S,snapshot:_??void 0}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"completed",violations:N})}else{const _=D??"audit returned no result";f.push({url:x,results:[],delta:null,componentId:x,durationMs:S,error:_}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:_})}if(!c){const _=await Ri(o);for(const N of _){const O=$i(N,x);O&&ua(O,e)&&!Ti(O)&&!h.has(O)&&!g.includes(O)&&g.push(O)}}}catch(C){const F=Date.now()-A,T=C instanceof Error?C.message:String(C);f.push({url:x,results:[],delta:null,componentId:x,durationMs:F,error:T}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:T})}await Ft({})}try{const x=await pe();await Mi(f,x)}catch(x){U.warn("PDF audit pass failed",x)}const w=new Date().toISOString(),b=Date.now()-u,k=f.flatMap(x=>x.results),v=await Le(k,[e]),s=qr(e,f,m,w,b,v.walkthroughsByComponent,v.walkthroughAcksByComponent,v.ackedKeysByComponent,v.humanVerdictsByComponent,v.incompleteResolutionsByComponent,v.attestations);try{s.auditSettings=await _n(w)}catch(x){U.warn("audit-settings capture failed",x)}if(s.consistencyFindings.length>0)try{const x=await Ll(s.consistencyFindings);s.consistencyFindings=x.emitted}catch(x){U.warn("consistency AI suppression failed; emitting heuristic findings",x)}try{const x=f.map($=>({...$,results:$.results.map(({screenshotDataUrl:A,...C})=>C)}));await pr(x,{startUrl:e,finishedAt:w})}catch(x){const $=x instanceof Error?x.message:String(x);U.error("persisting siteCrawlPerUrlResults failed",x),H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"CRAWL_PERSIST_FAILED",message:`Crawl finished but persistence failed (${$}). The AI fix prompt export won't have per-page data.`,recoverable:!1}})}H({type:"SITE_CRAWL_COMPLETE_EVENT",report:s}),await Di(s),await dt()}catch(w){U.error("site crawl failed",w),H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"UNKNOWN",message:String(w),recoverable:!1}}),await dt()}}function ha(e){try{return new RegExp(e)}catch{return null}}async function Wu(){const[e,t]=await Promise.all([En(),Zt()]);if(!e)return{ok:!1,reason:"No crawl report cached. Run a site crawl first."};if(!t||t.length===0)return{ok:!1,reason:"Crawl report exists but per-URL audit data was not retained. Re-run the crawl once; future regrades will work."};const a=t.flatMap(i=>i.results),n=await Le(a,[e.startUrl]),o=new Date().toISOString(),r=qr(e.startUrl,t,e.startedAt,o,e.totalDurationMs,n.walkthroughsByComponent,n.walkthroughAcksByComponent,n.ackedKeysByComponent,n.humanVerdictsByComponent,n.incompleteResolutionsByComponent,n.attestations);return r.auditSettings=e.auditSettings??await _n(o),await hr(r),H({type:"SITE_CRAWL_COMPLETE_EVENT",report:r}),await Di(r),{ok:!0}}async function Di(e){try{if(e.siteGrade==="pending")return;const t=await pe();if(!he(t,"forensicAnchoring"))return;const a={domain:Au(e.startUrl),grade:e.siteGrade,scope:"site",pageCount:e.pagesAudited,wcagLevel:`${Nt} ${In}`,auditedAt:e.finishedAt,productSlug:"wcagcheckr"},n=await vu(a),o=await ga(),r=await Ai(n,e.startUrl,e.finishedAt,o??void 0);await Iu({domain:a.domain,claim:a,hash:n,receipt:r}),H({type:"SITE_CLAIM_SEALED_EVENT",domain:a.domain})}catch(t){U.warn("site-claim seal/anchor failed (badge unavailable for this crawl)",t)}}const en=5*6e4,Go=9e4,Vo={altText:"Verifying alt text…",headings:"Judging heading quality…",sensory:"Scanning for sensory-only instructions…",aria:"Reviewing ARIA semantics…",imageOfText:"Detecting baked-in text in images…",colorOnlyMeaning:"Checking for color-only meaning…",genericLinkText:"Reviewing link clarity…",wallOfText:"Detecting walls of text…",languageMismatch:"Verifying page language…"},Gu={altText:["1.1.1"],headings:["2.4.6"],sensory:["1.3.3"],aria:["4.1.2"],imageOfText:["1.4.5"],colorOnlyMeaning:["1.4.1"],genericLinkText:["2.4.4"],wallOfText:[],languageMismatch:["3.1.1","3.1.2"]};async function pa(e,t,a,n,o,r,i){const c=await pe();if(!he(c,"aiJudgment")){U.debug("aiJudgment not allowed on current tier — skipping AI augmentation");return}let d;try{d=await xe(e,{type:"AI_CANDIDATES_REQUEST",selector:t},a)}catch(S){U.debug("ai candidates fetch failed",S);return}const l=o[0];if(!l)return;const p={componentId:r,currentState:l.state,axeVersion:l.axeVersion},m={at:new Date().toISOString(),componentId:r,pageUrl:l.pageUrl??t,enabledChecks:n.enabledChecks,candidateCounts:{images:d.images.length,headings:d.headings.length,instructions:d.instructions.length,ariaElements:d.ariaElements.length,links:d.links.length,longTextBlocks:d.longTextBlocks.length,colorOnlyRegions:d.colorOnlyRegions.length,languageInfo:d.languageInfo?"present":"null"}};U.info("ai augmentation gate snapshot",JSON.stringify(m));try{await chrome.storage.local.set({aiDiagnosticLatest:m})}catch(S){U.warn("failed to persist ai diagnostic to storage.local",S)}const u=[];if(n.enabledChecks.altText&&u.push({key:"altText",run:S=>{const _=d.images.map(N=>({imageUrl:N.imageUrl,alt:N.alt,selector:N.selector,outerHTML:N.outerHTML,surroundingContext:N.surroundingContext,...p}));return fd(_,n,S)}}),n.enabledChecks.headings&&u.push({key:"headings",run:S=>ou(d.headings,p,n,S)}),n.enabledChecks.sensory&&u.push({key:"sensory",run:S=>ru(d.instructions,p,n,S)}),n.enabledChecks.aria&&u.push({key:"aria",run:S=>iu(d.ariaElements,p,n,S)}),n.enabledChecks.imageOfText&&u.push({key:"imageOfText",run:S=>{const _=d.images.map(N=>({imageUrl:N.imageUrl,accessibleName:N.alt||void 0,selector:N.selector,outerHTML:N.outerHTML,pixelArea:N.pixelArea}));return du(_,p,n,S)}}),n.enabledChecks.colorOnlyMeaning&&u.push({key:"colorOnlyMeaning",run:S=>uu(d.colorOnlyRegions,p,n,S)}),n.enabledChecks.genericLinkText&&u.push({key:"genericLinkText",run:S=>su(d.links,p,n,S)}),n.enabledChecks.wallOfText&&u.push({key:"wallOfText",run:S=>cu(d.longTextBlocks,p,n,S)}),n.enabledChecks.languageMismatch){const S=d.languageInfo;u.push({key:"languageMismatch",run:_=>lu(S?[S]:[],p,n,_)})}if(u.length===0)return;let g=0,h=0,f=!1;const w={};let b=0,k=0,v=0;const s=[];let x=!1,$=!1;function A(S,_){if(w[S]=(w[S]??0)+_.totalCostUsd,g+=_.totalCostUsd,h+=_.findings.length,f=f||_.capExceeded,b++,_.errors.length>0){v++;for(const N of _.errors)s.includes(N)||s.push(N)}else k++;U.info(`ai ${S}: ${_.findings.length} findings, $${_.totalCostUsd.toFixed(4)}, errs=${_.errors.length}`),_.capExceeded&&U.warn(`ai cost cap exceeded after $${_.totalCostUsd.toFixed(4)} during ${S}`)}const C=(async()=>{for(let S=0;S<u.length;S++){if(i!=null&&i.isCanceled()){$=!0;break}const _=u[S];H({type:"AI_AUGMENTATION_PROGRESS_EVENT",componentId:r,currentCheck:_.key,currentCheckLabel:Vo[_.key],current:S+1,total:u.length});const N=new AbortController,O=setTimeout(()=>N.abort(),Go),W=i?setInterval(()=>{i.isCanceled()&&N.abort()},500):null;let P;try{P=await _.run({signal:N.signal,onProgress:(V,M)=>{M>0&&H({type:"AI_AUGMENTATION_PROGRESS_EVENT",componentId:r,currentCheck:_.key,currentCheckLabel:Vo[_.key],current:S+1,total:u.length,candidatesDone:V,candidatesTotal:M})}}),N.signal.aborted&&(i!=null&&i.isCanceled())?P.errors=[...P.errors,`${_.key} canceled by user`]:N.signal.aborted}catch(V){const M=V instanceof Error?V.message:String(V),j=N.signal.aborted,q=j&&(i!=null&&i.isCanceled())?`${_.key} canceled by user`:j?`${_.key} hit per-check ${Go/1e3}s cap — analyzer aborted`:`${_.key} threw: ${M}`;P={findings:[],totalCostUsd:0,capExceeded:!1,errors:[q]}}finally{clearTimeout(O),W&&clearInterval(W)}if(P.findings.length>0&&(l.violations=[...l.violations,...P.findings]),P.errors.length===0){const V=Gu[_.key];if(V&&V.length>0&&l.axeRulesEvaluated)for(const M of V)l.axeRulesEvaluated.passed.push({ruleId:`ai-${_.key}-coverage`,wcagCriterion:M})}A(_.key,P)}})(),F=new Promise(S=>{setTimeout(()=>S("timeout"),en)});await Promise.race([C.then(()=>"done"),F])==="timeout"&&(x=!0,U.warn(`ai augmentation hit global ${en/1e3}s timeout after ${b}/${u.length} checks`));let I;if(v>0||x||$){x?I=`AI augmentation timed out after ${en/1e3}s`:$?I="AI augmentation canceled":I=s[0]??"AI analyzer error";const S=k===0?"total":"partial";H({type:"AI_AUGMENTATION_FAILED_EVENT",componentId:r,severity:S,reason:I,checksAttempted:b,checksSucceeded:k,checksErrored:v,errorDetails:x||$?[I,...s.slice(0,4)]:s.slice(0,5)}),U.warn(`ai augmentation ${S} failure: ${v}/${b} checks errored — ${I}`)}(g>0||h>0||I)&&await fs({at:new Date().toISOString(),pageUrl:l.pageUrl??t,componentId:r,totalCostUsd:g,byCheck:w,findingsCount:h,capExceeded:f,failureReason:I})}const nf=Object.freeze(Object.defineProperty({__proto__:null,auditCrawlPdfs:Mi,detectBit:Ii,detectLadleAcrossFrames:xi,detectPlayground:Si,detectStorybookAcrossFrames:ki,discoverCrawlUrls:_u,getActiveTabId:vt,getMatrixSettings:zn,regradeSiteCrawl:Wu,runAiAugmentation:pa,runAllFramesAudit:Mu,runParallelScan:Du,runSingleElementAudit:pt,runSiteCrawl:Uu,runStorybookAllAudit:Ou},Symbol.toStringTag,{value:"Module"})),St=Z("alert-sender"),Vu="wcagcheckr",ju="https://api.wcagcheckr.com",Bu=`${ju}/v1/products/${Vu}/alerts/send`,Hu=1e4,An="alertConfig:v1",qu={emailEnabled:!1,webhookEnabled:!1,webhookUrl:"",minImpact:"serious"},zt={minor:1,moderate:2,serious:3,critical:4};async function zu(){const t=(await chrome.storage.local.get(An))[An];return{...qu,...t??{}}}async function of(e){await chrome.storage.local.set({[An]:e})}async function Ku(e){let t;try{t=await zu()}catch(h){return St.warn("failed to read alert config",h),{fired:!1,reason:"config_read_failed"}}if(!t.emailEnabled&&!t.webhookEnabled)return{fired:!1,reason:"no_channel_enabled"};const a=await pe(),n=he(a,"emailAlerts"),o=he(a,"webhookAlerts"),r=t.emailEnabled&&n,i=t.webhookEnabled&&o;if(!r&&!i)return{fired:!1,reason:"no_channel_enabled"};const c=[];for(const h of e.results){const f=h.delta;f!=null&&f.new&&c.push(...f.new)}const d=zt[t.minImpact],l=c.filter(h=>zt[h.impact]>=d);if(l.length===0)return{fired:!1,reason:"below_impact_threshold"};const p=await ga();if(!p)return St.debug("no license token; alert skipped"),{fired:!1,reason:"no_license_token"};l.sort((h,f)=>zt[f.impact]-zt[h.impact]);const m=l.slice(0,10).map(h=>({wcag:h.wcagCriterion,impact:h.impact,selector:h.target.selector,help:h.description.slice(0,480),helpUrl:h.helpUrl})),u=e.results.reduce((h,f)=>h+f.violations.length,0),g={token:p,scheduleId:e.scheduleId,auditedUrl:e.auditedUrl,totalViolations:u,newViolationCount:l.length,topViolations:m,webhookUrl:i&&t.webhookUrl?t.webhookUrl:void 0,emailEnabled:r,ranAt:e.ranAt};try{const h=await fetch(Bu,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(g),signal:AbortSignal.timeout(Hu)}),f=await h.json().catch(()=>null);return h.ok?(St.info("alert delivered",{emailSent:f==null?void 0:f.emailSent,webhookSent:f==null?void 0:f.webhookSent}),{fired:!0,emailSent:(f==null?void 0:f.emailSent)??!1,webhookSent:(f==null?void 0:f.webhookSent)??!1,serverStatus:h.status}):(St.warn(`alert server returned ${h.status}`,f),{fired:!1,reason:`server_${h.status}`,serverStatus:h.status})}catch(h){return St.warn("alert send failed",h),{fired:!1,reason:h instanceof Error?h.message:"unknown_error"}}}const Yu="#dc2626",Ju="#f59e0b",Xu="#059669",Qu="#94a3b8";function Zu(e){const t=e.filter(c=>c.enabled);let a=0,n=0,o=0,r=0;for(const c of t){const d=c.lastNewViolationCount??0;c.lastResult==="failed"?n++:c.lastResult==="ok"?d>0?a+=d:o++:r++}let i;return t.length===0?i="no-schedules":a>0?i="new-violations":n>0?i="failed":o>0?i="all-clear":i="pending-first-run",{state:i,newViolationsTotal:a,failingCount:n,okCount:o,pendingCount:r,totalEnabled:t.length}}async function eh(e){switch(e.state){case"new-violations":{const t=e.newViolationsTotal>99?"99+":String(e.newViolationsTotal);await chrome.action.setBadgeText({text:t}),await chrome.action.setBadgeBackgroundColor({color:Yu}),await chrome.action.setTitle({title:`wcagcheckr — ${e.newViolationsTotal} new WCAG violation${e.newViolationsTotal===1?"":"s"} vs baseline across ${e.totalEnabled} scheduled audit${e.totalEnabled===1?"":"s"}`});break}case"failed":{await chrome.action.setBadgeText({text:"!"}),await chrome.action.setBadgeBackgroundColor({color:Ju}),await chrome.action.setTitle({title:`wcagcheckr — ${e.failingCount} scheduled audit${e.failingCount===1?"":"s"} failed to run`});break}case"all-clear":{await chrome.action.setBadgeText({text:"✓"}),await chrome.action.setBadgeBackgroundColor({color:Xu}),await chrome.action.setTitle({title:`wcagcheckr — all ${e.okCount} scheduled audit${e.okCount===1?"":"s"} passing`});break}case"pending-first-run":{await chrome.action.setBadgeText({text:""}),await chrome.action.setBadgeBackgroundColor({color:Qu}),await chrome.action.setTitle({title:`wcagcheckr — ${e.pendingCount} scheduled audit${e.pendingCount===1?"":"s"} awaiting first run`});break}case"no-schedules":default:{await chrome.action.setBadgeText({text:""}),await chrome.action.setTitle({title:"wcagcheckr"});break}}}async function th(){const e=await pe();if(!he(e,"statusBadge")){try{await chrome.action.setBadgeText({text:""})}catch{}return{state:"no-schedules",newViolationsTotal:0,failingCount:0,okCount:0,pendingCount:0,totalEnabled:0}}const t=await cr(),a=Zu(t);try{await eh(a)}catch(n){console.warn("[status-badge] failed to apply",n)}return a}const jo=Z("deposition-packet");function J(e){return e.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function ah(e,t,a){if(!e)return`<section class="dp-cover dp-cover-error">
|
|
1027
|
+
`;await chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:t})}async function Do(e,t){let a;try{a=await chrome.debugger.sendCommand({tabId:e},"Page.captureScreenshot",{format:"png",captureBeyondViewport:!0,clip:{x:t.x,y:t.y,width:t.width,height:t.height,scale:1}})}catch(n){return Xe.warn(`captureElementClip failed: ${n instanceof Error?n.message:String(n)}`),null}if(!(a!=null&&a.data))return null;try{const n=`data:image/png;base64,${a.data}`,o=await fetch(n).then(d=>d.blob()),r=await createImageBitmap(o),c=new OffscreenCanvas(r.width,r.height).getContext("2d");return c?(c.drawImage(r,0,0),c.getImageData(0,0,r.width,r.height)):null}catch(n){return Xe.warn(`clip decode failed: ${n instanceof Error?n.message:String(n)}`),null}}const Xd=25,Jt=8,Qd=150,Zd=.95,eu=4,tu=400;function au(e,t,a){if(e.width!==t.width||e.height!==t.height)return null;const n=e.width,o=e.height;let r=0,i=0;for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2],F=e.data[x],T=e.data[x+1],I=e.data[x+2],D=Math.abs(F-$)+Math.abs(T-A)+Math.abs(I-C);D>i&&(i=D),D>=Xd&&r++}if(r<Jt)return null;const c=i*Zd;let d=0,l=0,p=0,m=0;if(i>=tu)for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2],F=e.data[x],T=e.data[x+1],I=e.data[x+2];Math.abs(F-$)+Math.abs(T-A)+Math.abs(I-C)>=c&&(d+=$,l+=A,p+=C,m++)}const u=m>=eu?{r:Math.round(d/m),g:Math.round(l/m),b:Math.round(p/m)}:a,g=new Map;let h=0;for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=t.data[x],A=t.data[x+1],C=t.data[x+2];if(Math.abs($-u.r)+Math.abs(A-u.g)+Math.abs(C-u.b)>=Qd){h++;const T=$>>4<<8|A>>4<<4|C>>4,I=g.get(T);I?(I.r+=$,I.g+=A,I.b+=C,I.count++):g.set(T,{r:$,g:A,b:C,count:1})}}const f=n*o;if(h<f*.2){g.clear();for(let v=0;v<o;v++)for(let s=0;s<n;s++){const x=(v*n+s)*4,$=e.data[x],A=e.data[x+1],C=e.data[x+2],F=$>>4<<8|A>>4<<4|C>>4,T=g.get(F);T?(T.r+=$,T.g+=A,T.b+=C,T.count++):g.set(F,{r:$,g:A,b:C,count:1})}}let w={r:0,g:0,b:0,count:0};for(const v of g.values())v.count>w.count&&(w=v);const b={r:Math.round(w.r/w.count),g:Math.round(w.g/w.count),b:Math.round(w.b/w.count)},k=Et(u,b);return{textPixelCount:r,worstRatio:k,worstBackground:b,worstForeground:u}}async function nu(e,t,a){var d,l,p,m,u,g;const n=new Map;for(const h of t){const f=h.pageUrl??h.scope??"";for(const w of((d=h.axeRulesEvaluated)==null?void 0:d.incomplete)??[])if(w.ruleId==="color-contrast")for(const b of w.elements??[]){const k=`${f}::${w.ruleId}::${b.selector}`;n.has(k)||n.set(k,{pageUrl:f,ruleId:w.ruleId,selector:b.selector,wcagCriterion:w.wcagCriterion??"1.4.3",foreground:(l=b.styles)==null?void 0:l.foreground,fontSize:(p=b.styles)==null?void 0:p.fontSize,fontWeight:(m=b.styles)==null?void 0:m.fontWeight,failureSummary:b.failureSummary})}}if(n.size===0)return{resolved:0,skipped:0};let o=!1,r=null;for(let h=1;h<=6;h++)try{await chrome.debugger.attach({tabId:e},Hd),o=!0;break}catch(f){r=f;const w=f instanceof Error?f.message:String(f);if(/already attached/i.test(w)){await new Promise(b=>setTimeout(b,500));continue}break}if(!o)return Xe.warn("debugger attach failed after retries; skipping pixel sampling",r),{resolved:0,skipped:n.size};let i=0,c=0;try{const h=Array.from(n.values()),f=h.map(I=>I.selector),w=await Kd(e,f);if(a!=null&&a.aborted)return{resolved:0,skipped:n.size};const b=I=>{const D=w.get(I);return D&&!("decorative"in D)?D:null},k=new Set;for(const[I,D]of w)D&&"decorative"in D&&k.add(I);for(const I of h){if(!k.has(I.selector))continue;const D={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"pass",reasoning:'Not applicable to WCAG 1.4.3 (contrast minimum): this element is decorative / removed from the accessibility tree — it sits inside an aria-hidden="true" subtree, or is visually hidden (display:none, sr-only clip, off-screen, or zero opacity). Decorative and incidental content is exempt from the contrast-minimum requirement, so it is recorded as not-applicable and does not count as a violation.',resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:await Oo({...I,bgFingerprint:null})};await De(D),i++}const v=h.filter(I=>!k.has(I.selector));if(v.length===0)return Xe.info(`pixel-contrast sampler: all ${h.length} targets decorative/not-applicable (1.4.3)`),{resolved:i,skipped:c};const s=((u=h[0])==null?void 0:u.pageUrl)??"",x=s?await ka(s):[],$=new Map;for(const I of x)$.set(`${I.ruleId}::${I.selector}`,I);const A=new Map,C=[];for(const I of v){const D=await Oo({...I,bgFingerprint:((g=b(I.selector))==null?void 0:g.bgFingerprint)??null});A.set(I.selector,D);const S=$.get(`${I.ruleId}::${I.selector}`);if(S&&S.inputHash===D&&S.verdict!=="uncertain"){const _={...S,resolvedAt:new Date().toISOString(),reasoning:S.reasoning.includes("(cached, hash-match)")?S.reasoning:`${S.reasoning} (cached, hash-match)`};await De(_),i++;continue}C.push(I)}if(C.length===0)return Xe.info(`pixel-contrast sampler: all ${h.length} targets reused from hash-cache`),{resolved:i,skipped:c};await Yd(e);const F=new Map;for(const I of C){if(a!=null&&a.aborted)break;const D=b(I.selector);if(!D)continue;const S=await Do(e,D);S&&F.set(I.selector,S)}if(await Jd(e),a!=null&&a.aborted)return{resolved:0,skipped:n.size};const T=new Map;for(const I of C){if(a!=null&&a.aborted)break;const D=b(I.selector);if(!D)continue;const S=await Do(e,D);S&&T.set(I.selector,S)}for(const I of C){if(a!=null&&a.aborted)break;const D=A.get(I.selector),S=b(I.selector);if(!S){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:"Hide-text observation: element's bounding rect could not be resolved at audit time (element may be display:none, detached from DOM, or zero-size). Cannot sample contrast empirically. Manual verification required if you believe this element is visible.",resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const _=F.get(I.selector),N=T.get(I.selector);if(!_||!N){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:"Hide-text observation: per-element clip capture failed via chrome.debugger Page.captureScreenshot. Manual verification required.",resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const O=qd(I.foreground);if(!O){c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:`Hide-text observation: element's computed CSS foreground color could not be parsed (got ${JSON.stringify(I.foreground)}). Cannot compute contrast against rendered background without an intended foreground color. Manual verification required.`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const W=au(_,N,O);if(!W){if(S.resolvedBg){const re=Ja(I.fontSize,I.fontWeight),oe=re?Ya:Ka,le=Et(O,S.resolvedBg),ie=le>=oe;i++,await De({pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:ie?"pass":"fail",reasoning:`Too few text pixels for an empirical screenshot reading (under ${Jt} after diffing hidden vs visible). Resolved DETERMINISTICALLY from CSS: foreground rgb(${O.r},${O.g},${O.b}) on resolved background rgb(${S.resolvedBg.r},${S.resolvedBg.g},${S.resolvedBg.b}) = ${le.toFixed(2)}:1 vs AA ${oe}:1 (${re?"large":"normal"} text) → ${ie?"PASS":"FAIL"}. (rc.413 — known-fg/known-bg text isn't left 'uncertain' when the pixel diff is sparse; that caused A↔B grade flip-flop.)`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D});continue}if(S.resolvedBgGradient&&S.resolvedBgGradient.length>=2){const re=Ja(I.fontSize,I.fontWeight),oe=re?Ya:Ka,le=S.resolvedBgGradient;let ie=1/0,ge=le[0];for(const Oe of le){const ve=Et(O,Oe);ve<ie&&(ie=ve,ge=Oe)}const Re=ie>=oe;i++,await De({pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:Re?"pass":"fail",reasoning:`Too few text pixels for an empirical screenshot reading (under ${Jt}). Background is a linear-gradient; resolved DETERMINISTICALLY from CSS worst-case stop: foreground rgb(${O.r},${O.g},${O.b}) on least-contrasting stop rgb(${ge.r},${ge.g},${ge.b}) = ${ie.toFixed(2)}:1 vs AA ${oe}:1 (${re?"large":"normal"} text) → ${Re?"PASS":"FAIL"}. (rc.413 — small text on a gradient isn't left 'uncertain'; that caused the A↔B grade flip-flop.)`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D});continue}c++;const X={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:"uncertain",reasoning:`Hide-text observation: too few text pixels detected (under ${Jt} after diffing hidden vs visible captures) AND the background is a raster image / otherwise unresolvable, so neither an empirical nor a CSS contrast reading is possible. Element may be canvas-rendered or SVG. Manual verification required.`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(X);continue}const P=Ja(I.fontSize,I.fontWeight),V=P?Ya:Ka,M=X=>`rgb(${X.r},${X.g},${X.b})`;let j=W.worstRatio>=V,q="";if(zd(W.worstRatio,O,S.resolvedBg,V)){const X=Et(O,S.resolvedBg);j=!0,q=` Cross-check (rc.356): computed CSS contrast ${M(O)} on resolved background ${M(S.resolvedBg)} = ${X.toFixed(2)}:1, which PASSES ${V}:1 — the sub-threshold pixel reading is an anti-aliasing/sampling artifact, not a real failure. Suppressed.`}const z={pageUrl:I.pageUrl,ruleId:I.ruleId,selector:I.selector,verdict:j?"pass":"fail",reasoning:`Hide-text observation: ${W.textPixelCount} text-core pixels detected by diffing hidden-vs-visible viewport screenshots. Worst per-pixel contrast: ${W.worstRatio.toFixed(2)}:1 against AA threshold ${V}:1 (${P?"large text":"normal text"}). At worst pixel: rendered foreground ${M(W.worstForeground)} on rendered background ${M(W.worstBackground)}. ${j&&q?"Passes (computed cross-check).":j?"Passes threshold.":"Falls below threshold — at least one text pixel reads against a background that fails contrast."}`+q,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:I.wcagCriterion,inputHash:D};await De(z),i++}}finally{try{await chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:`(() => { const el = document.getElementById(${JSON.stringify(Bn)}); if (el) el.remove(); return true; })()`})}catch{}try{await chrome.debugger.detach({tabId:e})}catch{}}return Xe.info(`pixel-contrast sampler: resolved ${i}, skipped ${c}/${n.size}`),{resolved:i,skipped:c}}const mt=Z("ai-text");function bt(e){if(e!=null&&e.aborted){const t=new Error("aborted");throw t.name="AbortError",t}}function yt(e){return e instanceof Error&&(e.name==="AbortError"||e.name==="ExternalAbortError"||e.message==="aborted")}async function ou(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.headings)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeHeading({headingText:h.text,sectionContent:h.sectionContent,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-heading-not-descriptive","2.4.6","AA","moderate","AI judged this heading does not describe its section content.",h.selector,h.outerHTML,h.text,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("heading judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function ru(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.sensory)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeSensoryLanguage({instructionText:h.text,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-sensory-instruction","1.3.3","A","serious","AI flagged this instruction as relying on sensory characteristics (shape, color, location) without a programmatic identifier.",h.selector,h.outerHTML,h.text.slice(0,100),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("sensory judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function iu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.aria)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeAriaSemantics({elementHtml:h.outerHTML,computedRole:h.role,surroundingHtml:h.surroundingHtml,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&c.push(await wt("ai-aria-misuse","4.1.2","A","serious",`AI judged role="${h.role}" is being used inappropriately on this element.`,h.selector,h.outerHTML,h.role,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("aria judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function su(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.genericLinkText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeGenericLinkText({linkText:h.linkText,surroundingText:h.surroundingText,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-generic-link-text","2.4.4","A","serious","AI judged this link's purpose is not clear from its text or surrounding context.",h.selector,h.outerHTML,h.linkText,f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("generic-link judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function cu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.wallOfText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeWallOfText({blockText:h.blockText,structuralChildrenCount:h.structuralChildrenCount,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.6&&c.push(await wt("ai-wall-of-text","3.1.5","AAA","moderate","AI flagged this block as a wall of text with insufficient structural breaks (subheadings, lists, paragraphs).",h.selector,h.outerHTML,h.blockText.slice(0,80),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("wall-of-text judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function lu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.languageMismatch)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bt(n.signal);const f=await r.judgeLanguageMismatch({declaredLang:h.declaredLang,bodyTextSample:h.bodyTextSample,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.7&&c.push(await wt("ai-language-mismatch","3.1.1","A","serious",`AI judged the page's content does not match the declared lang="${h.declaredLang||"(none)"}".`,h.selector,h.outerHTML,h.bodyTextSample.slice(0,80),f,t))}catch(f){if(yt(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(`${h.selector}: ${w}`),mt.warn("language-mismatch judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function wt(e,t,a,n,o,r,i,c,d,l){const p={selector:r,outerHTML:i.slice(0,500),failureSummary:`AI assessment: ${d.reasoning}`,tagName:"AI",role:null,accessibleName:null,textSnippet:c.slice(0,100)||null,attrId:null,attrTestid:null},m=await xn({ruleId:e,componentId:l.componentId,currentState:l.currentState,target:p});return{ruleId:e,wcagCriterion:t,wcagLevel:a,impact:n,description:o,helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/",target:p,componentId:l.componentId,currentState:l.currentState,axeVersion:l.axeVersion,detectedAt:new Date().toISOString(),matchKey:m,ai:{reasoning:d.reasoning,confidence:d.confidence,model:d.model,costUsd:d.costUsd}}}const mi=Z("ai-vision");function bi(e){if(e!=null&&e.aborted){const t=new Error("aborted");throw t.name="AbortError",t}}function yi(e){return e instanceof Error&&(e.name==="AbortError"||e.name==="ExternalAbortError"||e.message==="aborted")}async function du(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.imageOfText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${o.reason}`]};const r=o.client,i=_e(a.costCapUsd),c=Math.max(1,a.imageOfTextMaxImages??5),d=[...e].sort((g,h)=>h.pixelArea-g.pixelArea).slice(0,c),l=d.length,p=[],m=[];for(let g=0;g<d.length;g++){const h=d[g];if(!i.canCharge())break;try{bi(n.signal);const f=await r.judgeImageOfText({imageUrl:h.imageUrl,accessibleName:h.accessibleName,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&p.push(await wi("ai-image-of-text","1.4.5","AA","moderate","AI judged this image bakes substantial text into the raster — should be presented as actual HTML text instead.",h.selector,h.outerHTML,h.accessibleName??"",f,t))}catch(f){if(yi(f)){m.push(`canceled after ${g}/${l} candidates`);break}const w=f instanceof Error?f.message:String(f);m.push(`${h.selector}: ${w}`),mi.warn("image-of-text judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,l)}return{findings:p,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:m}}async function uu(e,t,a,n={}){var u;if(!a.enabled||!a.enabledChecks.colorOnlyMeaning)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const o=fe(a);if(!o.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[o.reason]};const r=o.client,i=_e(a.costCapUsd),c=[],d=[],l=Math.max(1,a.maxCandidatesPerCheck??10),p=e.slice(0,l),m=p.length;for(let g=0;g<p.length;g++){const h=p[g];if(!i.canCharge())break;try{bi(n.signal);const f=await r.judgeColorOnlyMeaning({elementHtml:h.elementHtml,contextDescription:h.contextDescription,signal:n.signal});i.recordCharge(f.costUsd),f.verdict==="fail"&&f.confidence>=.65&&c.push(await wi("ai-color-only-meaning","1.4.1","A","serious","AI judged this region conveys information only through color (no text label, icon glyph, or shape difference).",h.selector,h.outerHTML,h.contextDescription,f,t))}catch(f){if(yi(f)){d.push(`canceled after ${g}/${m} candidates`);break}const w=f instanceof Error?f.message:String(f);d.push(w),mi.warn("color-only judgment failed",f)}(u=n.onProgress)==null||u.call(n,g+1,m)}return{findings:c,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded,errors:d}}async function wi(e,t,a,n,o,r,i,c,d,l){const p={selector:r,outerHTML:i.slice(0,500),failureSummary:`AI assessment: ${d.reasoning}`,tagName:"AI",role:null,accessibleName:null,textSnippet:c.slice(0,100)||null,attrId:null,attrTestid:null},m=await xn({ruleId:e,componentId:l.componentId,currentState:l.currentState,target:p});return{ruleId:e,wcagCriterion:t,wcagLevel:a,impact:n,description:o,helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/",target:p,componentId:l.componentId,currentState:l.currentState,axeVersion:l.axeVersion,detectedAt:new Date().toISOString(),matchKey:m,ai:{reasoning:d.reasoning,confidence:d.confidence,model:d.model,costUsd:d.costUsd}}}const wn=Z("ensure-content-script"),hu=1500,pu=300;async function Hn(e,t){if(await No(e,t))return{ok:!0};const a=chrome.runtime.getManifest(),n=[];for(const o of a.content_scripts??[])Array.isArray(o.js)&&n.push(...o.js);if(n.length===0)return wn.error("manifest declares no content_scripts"),{ok:!1,reason:"inject-failed",detail:"no content_scripts declared in manifest"};try{const o=t!==void 0?{tabId:e,frameIds:[t]}:{tabId:e,allFrames:!0};await chrome.scripting.executeScript({target:o,files:n})}catch(o){return fu(o)}return await gu(pu),await No(e,t)?(wn.info("content script injected on demand",{tabId:e,frameId:t}),{ok:!0}):{ok:!1,reason:"unresponsive-after-inject",detail:"content script injected but did not register handlers — likely Content Security Policy on this page is blocking it"}}async function No(e,t){try{const a=t!==void 0?{frameId:t}:void 0,n=await Promise.race([chrome.tabs.sendMessage(e,{type:"PING_REQUEST"},a),new Promise((o,r)=>setTimeout(()=>r(new Error("ping timeout")),hu))]);return(n==null?void 0:n.type)==="PING_RESPONSE"}catch{return!1}}function fu(e){const t=e instanceof Error?e.message:String(e);return/cannot access contents of (?:the page|url)/i.test(t)||/chrome:\/\//i.test(t)||/chrome-extension:\/\//i.test(t)||/devtools:\/\//i.test(t)||/chrome\.google\.com\/webstore/i.test(t)||/the extensions gallery/i.test(t)?{ok:!1,reason:"restricted-url",detail:t}:/no tab with id/i.test(t)||/tab .* was closed/i.test(t)?{ok:!1,reason:"tab-gone",detail:t}:(wn.warn("content-script injection failed",e),{ok:!1,reason:"inject-failed",detail:t})}function gu(e){return new Promise(t=>setTimeout(t,e))}function vn(e){switch(e.reason){case"restricted-url":return"Chrome blocks extensions on this page (chrome:// pages, the Chrome Web Store, view-source: pages, and a few others). Open a regular https:// page and try again.";case"tab-gone":return"The tab was closed or navigated away while the audit was starting. Click into the tab you want audited and click Scan again.";case"unresponsive-after-inject":return"We loaded our auditor onto the page, but the page's Content Security Policy appears to be blocking it. Some sites (banks, gov, strict CSPs) prevent extensions from running. Try a different page on the same site, or open DevTools → Console to confirm a CSP error.";case"inject-failed":return`Could not load our auditor onto the page. Try a hard refresh (Ctrl+Shift+R) on the page and click Scan again. If it persists, the page may be using an unusual document type or origin restriction.${e.detail?` (Detail: ${e.detail})`:""}`;case"unknown":default:return"Could not establish connection with the page. Hard-refresh (Ctrl+Shift+R) the tab you want audited and try again."}}const Xa=Z("forensic-anchor-client"),mu="https://api.wcagcheckr.com",bu="wcagcheckr",yu=15e3;function wu(e){if(typeof e!="object"||e===null)return!1;const t=e;return t.schemaVersion!==1&&t.schemaVersion!==2||!(typeof t.anchoredAt=="string"&&typeof t.tsaName=="string"&&typeof t.rfc3161TokenBase64=="string"&&t.rfc3161TokenBase64.length>0&&typeof t.serverSignatureBase64=="string"&&t.serverSignatureBase64.length>0&&typeof t.serverKeyFingerprint=="string"&&t.serverKeyFingerprint.length>0)?!1:t.schemaVersion===2?typeof t.prevAuditHash=="string"&&/^[0-9a-f]{64}$/.test(t.prevAuditHash):!0}async function vi(e,t){return Ai(e.hash,e.pageUrl,e.capturedAt,t)}async function Ai(e,t,a,n){const o={auditHash:e,pageUrl:t,capturedAt:a,...n?{licenseId:n}:{}},r=`${mu}/v1/products/${bu}/forensic/anchor`;try{const i=await fetch(r,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(o),signal:AbortSignal.timeout(yu)});if(!i.ok)return Xa.warn(`anchor HTTP ${i.status}; entry stays local-only`),null;const c=await i.json();return wu(c)?c:(Xa.warn("anchor returned malformed receipt; entry stays local-only",c),null)}catch(i){return Xa.warn("anchor request failed; entry stays local-only",i),null}}async function vu(e){const t=na(e),a=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",a);return Array.from(new Uint8Array(n)).map(o=>o.toString(16).padStart(2,"0")).join("")}function Au(e){try{return new URL(e).hostname}catch{return e}}const ku="wcag-site-claims",xu=1,Dt="claims";let Qa=null;function qn(){return Qa||(Qa=Sn(ku,xu,{upgrade(e){e.objectStoreNames.contains(Dt)||e.createObjectStore(Dt,{keyPath:"domain"})}})),Qa}async function Iu(e){await(await qn()).put(Dt,e)}async function tf(e){return await(await qn()).get(Dt,e)??null}async function af(){return(await qn()).getAll(Dt)}const Lo="4.11.4";async function Su(e){try{return(await chrome.tabs.get(e)).url??""}catch{return""}}const U=Z("flows");async function vt(){const e=await fr();if(!e)throw new Error("no audit target tab found");return e}async function zn(){var a,n,o,r,i;const e=await Ye("stateMatrix",nn);return((a=e.pseudoStates)==null?void 0:a.length)>0&&((n=e.themes)==null?void 0:n.length)>0&&((o=e.directions)==null?void 0:o.length)>0&&((r=e.breakpoints)==null?void 0:r.length)>0&&((i=e.breakpointPresets)==null?void 0:i.length)>0?e:(U.warn("stored stateMatrix is invalid; using defaults"),nn)}async function Cu(e,t,a){const n=t.themes.includes("light"),o=t.themes.includes("dark");if(!n||!o)return t;let r=null;try{r=await xe(e,{type:"THEME_AWARENESS_REQUEST"},a)}catch{return t}return!r||r.hasUnreadableSheets?t:r.hasDarkModeCss&&!r.hasLightModeCss?(U.info("theme-axis prune: site is dark-only, skipping light pass"),{...t,themes:t.themes.filter(i=>i!=="light")}):r.hasLightModeCss&&!r.hasDarkModeCss?(U.info("theme-axis prune: site is light-only, skipping dark pass"),{...t,themes:t.themes.filter(i=>i!=="dark")}):t}const $u=200,Za=3,Po=8;async function Tu(e,t){const a=[];let n=null,o=null;for(let i=0;i<Po&&!t();i++){const c=await e();if(c.error&&(o=c.error),!c.result)break;if(n=c.result,a.push(c.violations),i===1&&a[0].length===0&&a[1].length===0)return{violations:[],lastResult:n,sampleCount:2,stabilized:!0,lastError:o};if(a.length>=Za){const d=a.slice(-Za);if(Eu(d))return{violations:d[d.length-1],lastResult:n,sampleCount:a.length,stabilized:!0,lastError:o}}i<Po-1&&await new Promise(d=>setTimeout(d,$u))}const r=a.slice(-Za);return{violations:Ru(r),lastResult:n,sampleCount:a.length,stabilized:!1,lastError:o}}function Eu(e){if(e.length<2)return!0;const t=Fo(e[0]);for(let a=1;a<e.length;a++){const n=Fo(e[a]);if(n.size!==t.size)return!1;for(const o of t)if(!n.has(o))return!1}return!0}function Fo(e){return new Set(e.map(t=>`${t.ruleId}::${t.target.selector}::${t.matchKey}`))}function Ru(e){const t=new Map,a="Audit detected this finding intermittently across multiple samples — likely an animation or transitional state was in progress. Verify manually.";for(const n of e)for(const o of n){const r=`${o.ruleId}::${o.target.selector}::${o.matchKey}`;t.has(r)||t.set(r,{...o,needsReview:!0,flakyAcrossRuns:!0,target:{...o.target,failureSummary:o.target.failureSummary?`${o.target.failureSummary} ${a}`:a}})}return Array.from(t.values())}async function _o(e,t,a,n,o){await Promise.all([(async()=>{var r;try{const i=await xe(e,{type:"READING_ORDER_REQUEST",selector:t},a);n[0]&&(i.issues.length>0?(n[0].readingOrderIssues=i.issues,n[0].positionAnalysisCapturedAt=o):(r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-reading-order-clean",wcagCriterion:"1.3.2"}))}catch(i){U.debug("reading-order analysis skipped",i)}})(),(async()=>{var r;try{const i=await xe(e,{type:"TAB_ORDER_ANALYZE_REQUEST"},a);n[0]&&(i.issues.length>0?(n[0].tabOrderIssues=i.issues,n[0].positionAnalysisCapturedAt=o):(r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-tab-order-clean",wcagCriterion:"2.4.3"}))}catch(i){U.debug("tab-order analysis skipped",i)}})(),(async()=>{var r;try{const i=await xe(e,{type:"TYPOGRAPHY_ANALYZE_REQUEST",selector:t},a);i.issues.length>0&&n[0]?n[0].typographyIssues=i.issues:n[0]&&((r=n[0].axeRulesEvaluated)==null||r.passed.push({ruleId:"wcc-typography-clean",wcagCriterion:"1.4.12"}))}catch(i){U.debug("typography analysis skipped",i)}})(),(async()=>{try{const r=await xe(e,{type:"CUSTOM_PROPERTY_REQUEST"},a);r.undefined.length>0&&n[0]&&(n[0].undefinedCustomProperties=r.undefined)}catch(r){U.debug("custom-property analysis skipped",r)}})()])}async function pt(e,t,a,n,o={}){var I,D,S,_,N;const r=o.asSubroutine===!0;if(await He())return r||H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}}),{ok:!1,results:[],error:Ze};const i=o.tabIdOverride??await vt(),c=await Hn(i,a);if(!c.ok)return r||H({type:"AUDIT_FAILED_EVENT",error:{code:c.reason==="restricted-url"?"RESTRICTED_URL":"CONTENT_SCRIPT_UNREACHABLE",message:vn(c),recoverable:c.reason!=="restricted-url"}}),{ok:!1,results:[],error:vn(c)};try{const[O]=await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},func:()=>document.contentType}),W=String((O==null?void 0:O.result)??"").toLowerCase();if(!(W===""||W==="text/html"||W==="application/xhtml+xml")){const V=`This page is not an HTML document (Content-Type: ${W||"unknown"}). WCAG HTML checks don't apply to XML sitemaps, RSS/Atom feeds, JSON, or plain text — skipped.`;return r||H({type:"AUDIT_FAILED_EVENT",error:{code:"NOT_HTML_DOCUMENT",message:V,recoverable:!1}}),{ok:!1,results:[],error:V,skipped:!0}}}catch(O){U.debug("content-type probe failed (non-fatal); proceeding with audit",O)}try{await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:()=>{try{let O=document.getElementById("__wcagcheckr_audit_freeze");O||(O=document.createElement("style"),O.id="__wcagcheckr_audit_freeze",O.textContent="*, *::before, *::after { animation-duration: 0s !important; animation-delay: 0s !important; transition-duration: 0s !important; transition-delay: 0s !important; } html, body { scroll-behavior: auto !important; }",document.documentElement.appendChild(O)),window.scrollTo(0,0);const W=document.activeElement;W&&W instanceof HTMLElement&&W!==document.body&&W.blur()}catch{}}}),await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:async()=>{try{await document.fonts.ready}catch{}}})}catch(O){U.debug("audit-start state stabilization failed (non-fatal)",O)}const d=n??await zn(),l=await Cu(i,d,a),p=Fl(l),m=await ls(`${await Su(i)}|${e}|${a??0}`),u=await ds(l),g=await Ye("axeDisabledRules",[]),h=await us(g);let f=null;try{f=(await xe(i,{type:"SCOPE_FINGERPRINT_REQUEST",selector:e},a)).fingerprint}catch(O){U.debug("scope fingerprint failed; skipping cache fast-path",O)}if(f){const O=await hs(m);if(O&&O.fingerprint===f&&O.axeVersion===Lo&&O.matrixConfigHash===u&&O.disabledRulesHash===h)return U.info(`audit-cache HIT for ${O.componentId} — skipping matrix iteration`),r||(H({type:"AUDIT_COMPLETE_EVENT",componentId:O.componentId,results:O.results,delta:O.delta}),H({type:"SCORECARD_UPDATED_EVENT"})),{ok:!0,results:O.results}}r||await at({sessionId:_t(),mode:"single-element",scope:e,startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"}),await $t(i,{type:"LIVE_REGIONS_ARM_REQUEST"},a).catch(()=>{}),await $t(i,{type:"FOCUS_TRACE_ARM_REQUEST"},a).catch(()=>{}),await xe(i,{type:"WARMUP_REQUEST"},a).catch(()=>{});const w=[],b=[];let k="",v,s=!1,x=null,$=null,A=null,C=null,F=!1,T=null;try{for(let O=0;O<p.length;O++){if(t.isCanceled()){U.info("single audit canceled by user");break}const W=p[O];try{const P=await bn(i,W,e,a);if(!P.success){v=(I=P.error)==null?void 0:I.message,U.warn(`state ${O+1}/${p.length} drive failed`,v);continue}W.breakpoint.id!==x&&(await xe(i,{type:"WARMUP_REQUEST"},a).catch(()=>{}),x=W.breakpoint.id);const V=O===0?void 0:[...ii],M=await Tu(async()=>{var z;const q=await xe(i,{type:"AUDIT_REQUEST",selector:e,currentState:W,rulesToRun:V},a);return q.success&&q.result?{result:q.result,violations:q.result.violations,error:null}:{result:null,violations:[],error:((z=q.error)==null?void 0:z.message)??null}},()=>t.isCanceled());M.lastError&&(v=M.lastError,U.warn(`state ${O+1}/${p.length} sampling: ${M.lastError}`));const j=M.lastResult;if(!M.stabilized&&M.sampleCount>0&&U.info(`state ${O+1}/${p.length} did not stabilize after ${M.sampleCount} samples — ${M.violations.length} finding(s) routed to needs-review as flickering`),j){s=!0;const q=M.violations;U.info(`[adaptive-sample] state ${O+1}/${p.length} ${W.pseudoState}·${W.theme}·${W.direction}·${W.breakpoint.id}: ${M.sampleCount} sample(s), ${M.stabilized?"stabilized":"flickering"}, ${q.length} finding(s)`);const z=await ad(i,{quality:75})??void 0;let X,re;try{X=(await xe(i,{type:"LIVE_REGIONS_DRAIN_REQUEST"},a)).announcements}catch{}try{re=(await xe(i,{type:"FOCUS_TRACE_DRAIN_REQUEST"},a)).focusEvents}catch{}if(b.push({...j,violations:q,frameId:a,announcements:X,focusEvents:re,screenshotDataUrl:z}),w.push(...q),k=j.componentId,O===0&&$===null)try{const oe=await Ye("aiConfig",{}),le=ke(oe);if(le.enabled&&le.apiKey&&k){$=pa(i,e,a,le,b,k,t).catch(ge=>{U.warn("ai augmentation (parallel) failed",ge)});const ie=((D=b[0])==null?void 0:D.pageUrl)??((S=b[0])==null?void 0:S.scope)??"";A=jd({tabId:i,componentId:k,pageUrl:ie,results:b,verifyFixesOnly:o.verifyFixesOnly}).catch(ge=>(U.warn("1.4.11 walkthrough (parallel) failed",ge),{criterionId:"1.4.11",ran:!0,ok:!1,error:String(ge)}))}}catch(oe){U.debug("ai augmentation (parallel) gate-read failed",oe)}!F&&W.pseudoState==="default"&&W.theme==="light"&&W.direction==="ltr"&&W.breakpoint.id==="desktop"&&b[0]&&(F=!0,T=_o(i,e,a,b,W).catch(le=>{U.debug("lightweight deep analyzers (parallel) failed",le)}))}}catch(P){v=P instanceof Error?P.message:String(P),U.warn(`state ${O+1}/${p.length} threw`,P)}H({type:"AUDIT_PROGRESS_EVENT",current:O+1,total:p.length,currentState:W,componentId:k||void 0}),r||await Ft({})}if(s&&k){const O={pseudoState:"default",ariaVariation:null,theme:"light",direction:"ltr",breakpoint:{id:"desktop",label:"Desktop",width:1280,height:800,deviceScaleFactor:1,mobile:!1}};if(F){if(T)try{await T}catch{}}else{try{await bn(i,O,e,a),await new Promise(M=>setTimeout(M,200))}catch(M){U.debug("reference-state drive failed; analyzers will use last matrix state",M)}await _o(i,e,a,b,O).catch(M=>{U.debug("lightweight deep analyzers (post-matrix fallback) failed",M)})}try{const M=await Ye("aiConfig",{}),j=ke(M);if(j.enabled&&j.apiKey&&k&&b[0]){const q=b[0].pageUrl??b[0].scope??"";C=Vd({tabId:i,componentId:k,pageUrl:q,results:b,verifyFixesOnly:o.verifyFixesOnly}).catch(z=>(U.warn("1.3.2 walkthrough (parallel) failed",z),{criterionId:"1.3.2",ran:!0,ok:!1,error:String(z)}))}}catch(M){U.debug("1.3.2 walkthrough (parallel) gate-read failed",M)}try{if($)await $;else{const M=await Ye("aiConfig",{}),j=ke(M);j.enabled&&j.apiKey&&await pa(i,e,a,j,b,k,t)}}catch(M){U.warn("ai augmentation skipped",M)}try{const M=await Ye("aiConfig",{}),j=ke(M);if(j.enabled&&j.apiKey&&k&&b[0]){await Yt(i,e,a).catch(oe=>U.warn("pre-walkthrough resetState failed",oe));const q=b[0].pageUrl??b[0].scope??"",z=new AbortController,X=setInterval(()=>{t.isCanceled()&&z.abort()},250),re=await Gd({tabId:i,componentId:k,pageUrl:q,results:b,signal:z.signal,verifyFixesOnly:o.verifyFixesOnly}).finally(()=>clearInterval(X));U.info("keyboard walkthroughs complete",re)}}catch(M){U.warn("keyboard walkthroughs failed",M)}try{const M=[];A&&M.push(await A),C&&M.push(await C),M.length>0&&U.info("parallel AI walkthroughs joined",M)}catch(M){U.warn("parallel AI walkthrough join failed",M)}try{if(k&&b[0]){const M=b[0].pageUrl??b[0].scope??"",j=new AbortController,q=setInterval(()=>{t.isCanceled()&&j.abort()},250),z=await Bd({tabId:i,componentId:k,pageUrl:M,results:b,signal:j.signal,verifyFixesOnly:o.verifyFixesOnly}).finally(()=>clearInterval(q));U.info("2.5.3 label-in-name walkthrough complete",z)}}catch(M){U.warn("2.5.3 walkthrough failed",M)}try{if(k&&b[0]){await Yt(i,e,a).catch(X=>U.warn("pre-sampler resetState failed",X));const M=new AbortController,j=setInterval(()=>{t.isCanceled()&&M.abort()},250),{resolved:q,skipped:z}=await nu(i,b,M.signal).finally(()=>clearInterval(j));U.info(`pixel contrast sampler: resolved=${q} skipped=${z}`)}}catch(M){U.warn("pixel contrast sampler failed",M)}const W=b.flatMap(M=>M.announcements??[]),P=b.flatMap(M=>M.focusEvents??[]),V=await Gn(k,w,{announcements:W,focusEvents:P},d);try{const M=await xa(b.map(de=>de.componentId)),j=await $r(b.map(de=>de.componentId)),q=new Set;for(const de of new Set(b.map(y=>y.componentId))){const y=await va(de);for(const L of y)q.add(L)}const z=[...new Set(b.map(de=>de.componentId))],X=await Fr(z),re=((_=b[0])==null?void 0:_.pageUrl)??((N=b[0])==null?void 0:N.scope)??"",oe=re?await ka(re):[],le=new Set(b.map(de=>de.pageUrl??de.scope??"").filter(Boolean)).size>1?"site-crawl":"single-page",ie=et(w,{runs:[],workflows:Pe},b,q,M,j,X,le,oe),ge={...ie.score,letter:ie.combined},Re=b.reduce((de,y)=>de+y.durationMs,0),Oe=await pe(),ve=o.recordForensic!==!1&&he(Oe,"forensicLog")?await zr(b,ge,Re):null;if(ve){const de=await pe();if(he(de,"forensicAnchoring"))try{const y=await ga(),L=await vi(ve,y??void 0);L&&await Kr(ve.componentId,ve.capturedAt,L)}catch(y){U.warn("forensic anchoring failed (entry stays local-only)",y)}}}catch(M){U.warn("forensic log recording failed",M)}if(f)try{await ps({lookupKey:m,fingerprint:f,axeVersion:Lo,matrixConfigHash:u,disabledRulesHash:h,results:b,delta:V,componentId:k,cachedAt:Date.now()})}catch(M){U.warn("audit-cache write failed",M)}try{await chrome.scripting.executeScript({target:{tabId:i,frameIds:a!==void 0?[a]:void 0},world:"MAIN",func:()=>{const M=document.getElementById("__wcagcheckr_audit_freeze");M&&M.remove()}})}catch(M){U.debug("audit-end state-freeze cleanup failed",M)}r||H({type:"AUDIT_COMPLETE_EVENT",componentId:k,results:b,delta:V})}else r||H({type:"AUDIT_FAILED_EVENT",error:{code:"AXE_FAILED",message:v?`All audits failed. Last error: ${v}`:"No state produced results. Selector may not exist in the audit target frame.",recoverable:!0}});r||await dt()}catch(O){U.error("single audit failed",O),r||H({type:"AUDIT_FAILED_EVENT",componentId:k||void 0,error:Zn(O)?O.payload:{code:"UNKNOWN",message:String(O),recoverable:!1}}),v=Zn(O)?O.payload.message:String(O)}finally{await $t(i,{type:"LIVE_REGIONS_DISARM_REQUEST"},a).catch(()=>{}),await $t(i,{type:"FOCUS_TRACE_DISARM_REQUEST"},a).catch(()=>{}),await Yt(i,e,a)}return{ok:s,results:b,error:s?void 0:v}}async function ki(e){var t;try{const n=(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{var r;const o=window;return{detected:typeof o.__STORYBOOK_PREVIEW__=="object",version:(r=o.__STORYBOOK_PREVIEW__)==null?void 0:r.version}}})).find(o=>{var r;return(r=o.result)==null?void 0:r.detected});if(n)return{detected:!0,version:(t=n.result)==null?void 0:t.version,frameId:n.frameId}}catch(a){U.warn("storybook detection scripting failed",a)}return{detected:!1}}async function Ou(e){if(await He()){H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const t=await vt(),a=await Si(t);if(await chrome.storage.local.set({"storybook:lastDetected":{detected:a.kind==="storybook"&&a.detected,version:a.version,detectedAt:new Date().toISOString()},"playground:lastDetected":{kind:a.kind,detected:a.detected,version:a.version,detectedAt:new Date().toISOString()}}),!a.detected){H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:"No supported component playground detected on this tab. Open a Storybook (iframe.html / storybook-static), Ladle, or Bit page and try again.",recoverable:!0}});return}if(a.kind==="bit"){H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:"Bit detected. Auto-iterate is not yet supported for Bit (compositions are iframe-per-component without a unified listing API). Use the element picker to audit individual compositions one at a time.",recoverable:!0}});return}const n=a.frameId??0,o=a.kind==="storybook"?await Nu(t,n):await Pu(t,n);if(!o.length){U.warn(`${a.kind} detected but no stories returned`),H({type:"AUDIT_FAILED_EVENT",error:{code:"STORYBOOK_NOT_DETECTED",message:`${a.kind==="ladle"?"Ladle":"Storybook"} detected but no stories were returned. Try reloading the page.`,recoverable:!0}});return}await at({sessionId:_t(),mode:"storybook-all",totalStories:o.length,completedStories:[],startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});for(const r of o){if(e.isCanceled()){U.info(`${a.kind} iteration canceled by user`);break}try{if(a.kind==="storybook"){await Lu(t,n,r.id);const c=await $t(t,{type:"STORYBOOK_GET_STORY_TARGET_REQUEST",tabId:t},n);await pt(c.selector,e,n)}else await Fu(t,n,r.id),await pt("#ladle-root",e,n)}catch(c){U.warn(`story ${r.id} failed; continuing with next`,c)}const i=await Ra();if((i==null?void 0:i.state)==="interrupted"){U.info("storybook iteration interrupted");break}await Ft({completedStories:[...(i==null?void 0:i.completedStories)??[],r.id]})}H({type:"SCORECARD_UPDATED_EVENT"}),await dt()}async function Mu(e){if(await He()){H({type:"AUDIT_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const t=await pe();if(!he(t,"allFramesAudit")){H({type:"AUDIT_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"All-frames audit is not available on your current plan.",recoverable:!1}});return}const a=await vt();let n=[];try{n=(await chrome.scripting.executeScript({target:{tabId:a,allFrames:!0},func:()=>({url:window.location.href})})).map(r=>{var i;return{frameId:r.frameId,url:((i=r.result)==null?void 0:i.url)??""}}).filter(r=>/^https?:/i.test(r.url))}catch(o){U.warn("multi-frame discovery failed",o)}if(n.length===0){H({type:"AUDIT_FAILED_EVENT",error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:"No auditable frames found on this tab. The page may use only chrome-extension:// or data: frames.",recoverable:!0}});return}await at({sessionId:_t(),mode:"all-frames",totalFrames:n.length,completedFrames:[],startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});for(const o of n){if(e.isCanceled()){U.info("all-frames iteration canceled");break}try{await pt("html",e,o.frameId)}catch(i){U.warn(`frame ${o.frameId} (${o.url.slice(0,80)}) audit failed; continuing`,i)}const r=await Ra();if((r==null?void 0:r.state)==="interrupted"){U.info("all-frames iteration interrupted");break}await Ft({completedFrames:[...(r==null?void 0:r.completedFrames)??[],o.frameId]})}H({type:"SCORECARD_UPDATED_EVENT"}),await dt()}async function Du(e){var o;const t=await pe();if(!he(t,"parallelScan")){H({type:"AUDIT_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Parallel scan is not available on your current plan.",recoverable:!1}});return}const a=await fr();let n;if(a!==null)try{n=(await chrome.tabs.get(a)).url}catch(r){U.warn("failed to get target tab url",r)}if(!n){H({type:"AUDIT_FAILED_EVENT",error:{code:"NETWORK",message:"Could not determine target URL for parallel scan.",recoverable:!1}});return}await at({sessionId:_t(),mode:"single-element",scope:"html",startedAt:new Date().toISOString(),lastProgressAt:new Date().toISOString(),state:"running"});try{const r=await zn(),{runParallelTabAudit:i}=await kn(async()=>{const{runParallelTabAudit:m}=await import("./parallel-tab-flow-DN_z0IGA.js");return{runParallelTabAudit:m}},__vite__mapDeps([0,1,2,3,4])),c=await i({targetUrl:n,scope:"html",matrix:r,parallelism:4,cancel:e});if(U.info(`parallel scan complete: ${c.results.length} results across ${c.tabsCompleted} tabs (${c.tabsFailed} failed) in ${Math.round(c.parallelDurationMs)}ms`),c.results.length===0){H({type:"AUDIT_FAILED_EVENT",error:{code:"NETWORK",message:`All ${c.tabsFailed} worker tabs failed. Falling back to Full Page scan is recommended.`,recoverable:!0}});return}const d=((o=c.results[0])==null?void 0:o.componentId)??"parallel-scan";if(a!==null)try{const m=await Ye("aiConfig",{}),u=ke(m);u.enabled&&u.apiKey&&await pa(a,"html",void 0,u,c.results,d,e)}catch(m){U.warn("parallel scan: ai augmentation skipped",m)}const l=c.results.flatMap(m=>m.violations);let p;try{p=await Gn(d,l)}catch(m){U.warn("parallel scan: baseline compare failed",m),p={new:[],persistent:[],fixed:[],newCount:0,persistentCount:0,fixedCount:0,baselineSnapshotMeta:null,comparedAt:new Date().toISOString()}}H({type:"AUDIT_COMPLETE_EVENT",componentId:d,results:c.results,delta:p}),H({type:"SCORECARD_UPDATED_EVENT"})}catch(r){U.warn("parallel scan failed",r),H({type:"AUDIT_FAILED_EVENT",error:{code:"UNKNOWN",message:r instanceof Error?r.message:String(r),recoverable:!0}})}finally{await dt()}}async function Nu(e,t){var a;try{return((a=(await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",func:async()=>{var d,l;const o=window.__STORYBOOK_PREVIEW__;if(!o)return[];const r=o.storyStoreValue??o.storyStore;if(!r)return[];typeof r.cacheAllCSFFiles=="function"&&await r.cacheAllCSFFiles();const i=((d=r.extract)==null?void 0:d.call(r))??((l=r.cachedCSFFiles)==null?void 0:l.call(r));if(!i)return[];const c=[];if(i instanceof Map)for(const[p,m]of i){const u=m;c.push({id:String(p),name:u.name??String(p),kind:u.title??u.kind??""})}else if(typeof i=="object"&&i!==null)for(const[p,m]of Object.entries(i)){const u=m;c.push({id:p,name:u.name??p,kind:u.title??u.kind??""})}return c}}))[0])==null?void 0:a.result)??[]}catch(n){return U.warn("listStoriesViaMainWorld failed",n),[]}}async function Lu(e,t,a){try{await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",args:[a,3e3],func:async(n,o)=>{const r=new URL(window.location.href);r.searchParams.set("id",n),r.searchParams.set("viewMode","story"),window.location.href!==r.href&&(window.history.pushState({},"",r.href),window.dispatchEvent(new PopStateEvent("popstate"))),await new Promise(i=>{const c=setTimeout(()=>i(),o),d=()=>{clearTimeout(c),i()};window.addEventListener("storyrendered",d,{once:!0})})}})}catch(n){U.warn(`navigateToStoryViaMainWorld(${a}) failed`,n)}}async function xi(e){var t;try{const n=(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{const o=document.getElementById("ladle-root")!==null,r=document.title==="Ladle",i=!!document.querySelector('link[href*="ladle.css"]');return{detected:o&&(r||i),version:void 0}}})).find(o=>{var r;return(r=o.result)==null?void 0:r.detected});if(n)return{detected:!0,version:(t=n.result)==null?void 0:t.version,frameId:n.frameId}}catch(a){U.warn("ladle detection scripting failed",a)}return{detected:!1}}async function Pu(e,t){var a;try{return((a=(await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",func:async()=>{try{const o=await fetch(new URL("/meta.json",window.location.href).href,{credentials:"same-origin"});if(!o.ok)return[];const i=(await o.json()).stories??{};return Object.entries(i).map(([c,d])=>({id:c,name:d.name??c,kind:(d.levels??[]).join(" / ")}))}catch{return[]}}}))[0])==null?void 0:a.result)??[]}catch(n){return U.warn("listLadleStoriesViaMainWorld failed",n),[]}}async function Fu(e,t,a){try{await chrome.scripting.executeScript({target:{tabId:e,frameIds:[t]},world:"MAIN",args:[a,3e3],func:async(n,o)=>{const r=new URL(window.location.href);r.searchParams.set("story",n),window.location.href!==r.href&&(window.history.pushState({},"",r.href),window.dispatchEvent(new PopStateEvent("popstate"))),await new Promise(i=>setTimeout(i,Math.min(o,500)))}})}catch(n){U.warn(`navigateToLadleStoryViaMainWorld(${a}) failed`,n)}}async function Ii(e){try{return(await chrome.scripting.executeScript({target:{tabId:e,allFrames:!0},world:"MAIN",func:()=>{const a=window.location.href;return/bit\.dev|bit-dev|bitsrc|\/~aspect|\/composition/i.test(a)}})).some(a=>a.result===!0)}catch{return!1}}async function Si(e){const t=await ki(e);if(t.detected)return{kind:"storybook",...t};const a=await xi(e);return a.detected?{kind:"ladle",...a}:await Ii(e)?{kind:"bit",detected:!0}:{kind:null,detected:!1}}const da=200,Ci=6e4;function ua(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function $i(e,t){try{const a=new URL(e,t);return a.hash="",a.toString()}catch{return null}}function Ti(e){try{return/\.(xml|rss|atom|json|txt|csv|ics|rdf|xsl|xslt)$/i.test(new URL(e).pathname)}catch{return!1}}async function Ei(e,t,a){await chrome.tabs.update(e,{url:t}),await new Promise((n,o)=>{const r=setTimeout(()=>{chrome.tabs.onUpdated.removeListener(i),o(new Error(`navigation timeout (${a}ms): ${t}`))},a);function i(c,d){c===e&&d.status==="complete"&&(clearTimeout(r),chrome.tabs.onUpdated.removeListener(i),n())}chrome.tabs.onUpdated.addListener(i)}),await new Promise(n=>setTimeout(n,400))}async function Ri(e){var t;try{return((t=(await chrome.scripting.executeScript({target:{tabId:e},func:()=>Array.from(document.querySelectorAll("a[href]")).map(n=>n.getAttribute("href")).filter(n=>typeof n=="string"&&!n.startsWith("javascript:"))}))[0])==null?void 0:t.result)??[]}catch(a){return U.debug("link discovery failed",a),[]}}async function Oi(e,t){var a,n;try{const r=new URL(t).pathname.toLowerCase().replace(/\/+$/,"");if(/(?:^|\/)(?:404|not-found|page-not-found|error|server-error)$/.test(r))return`URL path "${r||"/"}" matches a common error-route pattern.`}catch{}try{const o=await chrome.scripting.executeScript({target:{tabId:e},func:()=>document.title||""}),r=((n=(a=o==null?void 0:o[0])==null?void 0:a.result)==null?void 0:n.trim())??"";if(!r)return null;const i=[[/^4(?:0[0-46-9]|[1-9]\d)\b/,"title starts with a 4xx error code"],[/^5\d{2}\b/,"title starts with a 5xx error code"],[/^(?:page\s+)?not\s+found\b/i,'title starts with "Not Found"'],[/^error\s*[-:]?\s*\d{3}\b/i,'title starts with "Error" + status code'],[/^(?:oops|whoops)[\s,!:.-]/i,'title leads with "Oops" — common error-template pattern']];for(const[c,d]of i)if(c.test(r))return`${d} (title: "${r.slice(0,80)}").`;return null}catch(o){return U.debug("error-page detection failed; proceeding with audit",o),null}}const Uo=/Linked PDF at (\S+)\./;async function Mi(e,t){if(!he(t,"pdfAudit")){U.info("PDF audit disabled for tier; skipping crawl PDF pass",{tier:t});return}const a=new Map;for(const n of e)if(!n.error)for(const o of n.results)for(const r of o.violations){if(r.ruleId!=="pdf-needs-cli-audit")continue;const i=Uo.exec(r.description);if(!i)continue;const c=i[1];let d;try{d=new URL(c,n.url).href}catch{continue}if(!/^https?:\/\//i.test(d))continue;let l=a.get(d);l||(l=new Set,a.set(d,l)),l.add(n)}if(a.size!==0){U.info(`PDF audit pass: ${a.size} unique PDF(s) across the crawl`);for(const[n,o]of a){let r;try{r=await cl(n)}catch(i){U.warn(`PDF audit threw for ${n}`,i);continue}for(const i of o){const c=i.results[0];if(!c)continue;const d=c.componentId,l=c.state,p=r.findings.map(m=>Wo(m,n,d,l));c.violations=c.violations.filter(m=>{if(m.ruleId!=="pdf-needs-cli-audit")return!0;const u=Uo.exec(m.description);if(!u)return!0;try{return new URL(u[1],i.url).href!==n}catch{return!0}}),c.violations.push(...p),r.fatalError&&c.violations.push(Wo({ruleId:"pdf-audit-skipped",impact:"minor",wcagCriterion:"1.1.1",description:`PDF audit skipped: ${r.fatalError}`,failureSummary:"The PDF could not be audited automatically. Run `wcagcheckr-ci pdf <url>` against this PDF on the command line for a manual audit."},n,d,l))}}}}function Wo(e,t,a,n){return{ruleId:e.ruleId,wcagCriterion:e.wcagCriterion,wcagLevel:"AA",impact:e.impact,description:e.description,helpUrl:"https://www.w3.org/WAI/standards-guidelines/wcag/",target:{selector:t,outerHTML:`<a href="${t}">[PDF]</a>`,failureSummary:e.failureSummary,tagName:"PDF",role:null,accessibleName:null,textSnippet:null,attrId:null,attrTestid:null},componentId:a,currentState:n,axeVersion:"pdf-audit",detectedAt:new Date().toISOString(),matchKey:`pdf::${e.ruleId}::${t}`}}async function _u(e,t,a){if(await He())return H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}}),[];const n=await pe();if(!he(n,"siteCrawl"))return H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Site crawl is not available on your current plan.",recoverable:!1}}),[];const o=await vt(),r=tr(n).siteCrawlMaxPages,i=Number.isFinite(r)?Math.min(r,da):da,c=Math.min(t.maxPages??25,i),d=t.includeRegex?ha(t.includeRegex):null,l=t.excludeRegex?ha(t.excludeRegex):null,p=[e],m=new Set,u=[];try{for(;p.length>0&&u.length<c;){if(a.isCanceled()){U.info("crawl discovery canceled by user");break}const g=p.shift();if(!(!g||m.has(g))&&ua(g,e)&&!(d&&!d.test(g))&&!(l&&l.test(g))){m.add(g);try{if(await Ei(o,g,Ci),!(await Hn(o,0)).ok||await Oi(o,g))continue;u.push(g),H({type:"CRAWL_DISCOVERY_PROGRESS_EVENT",found:u.length,url:g});const w=await Ri(o);for(const b of w){const k=$i(b,g);k&&ua(k,e)&&!Ti(k)&&!m.has(k)&&!p.includes(k)&&p.push(k)}}catch(h){U.debug("discovery: page navigation/link-read failed; skipping",h);continue}await Ft({})}}return H({type:"CRAWL_DISCOVERY_COMPLETE_EVENT",urls:u}),u}catch(g){return U.error("crawl discovery failed",g),H({type:"CRAWL_DISCOVERY_FAILED_EVENT",error:{code:"CRAWL_DISCOVERY_FAILED",message:String(g),recoverable:!0}}),[]}}async function Uu(e,t,a){if(await He()){H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:Lt,message:Ze,recoverable:!1}});return}const n=await pe();if(!he(n,"siteCrawl")){H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"FEATURE_NOT_AVAILABLE",message:"Site crawl is not available on your current plan.",recoverable:!1}});return}const o=await vt(),r=tr(n).siteCrawlMaxPages,i=Number.isFinite(r)?Math.min(r,da):da,c=Array.isArray(t.urls)&&t.urls.length>0,d=Math.min(c?t.urls.length:t.maxPages??25,i),l=t.includeRegex?ha(t.includeRegex):null,p=t.excludeRegex?ha(t.excludeRegex):null,m=new Date().toISOString(),u=Date.now(),g=c?[...t.urls]:[e],h=new Set,f=[];await at({sessionId:_t(),mode:"storybook-all",scope:e,startedAt:m,lastProgressAt:new Date().toISOString(),state:"running"});try{for(;g.length>0&&h.size<d;){if(a.isCanceled()){U.info("site crawl canceled by user");break}const x=g.shift();if(!x||h.has(x)||!ua(x,e)||l&&!l.test(x)||p&&p.test(x))continue;h.add(x);const $=h.size,A=Date.now();H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"auditing"});try{await Ei(o,x,Ci);const C=await Hn(o,0);if(!C.ok)throw new Error(vn(C));const F=await Oi(o,x);if(F){const _=`Skipped — page appears to be an error response. ${F}`;f.push({url:x,results:[],delta:null,componentId:x,durationMs:Date.now()-A,error:_}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:_});continue}await xe(o,{type:"WARMUP_REQUEST"},0).catch(()=>{});const T=await pt("html",a,0,void 0,{asSubroutine:!0,tabIdOverride:o,verifyFixesOnly:t.verifyFixesOnly,recordForensic:t.recordForensic}),I=T.results,D=T.ok?void 0:T.error,S=Date.now()-A;if(!T.ok&&T.skipped)f.push({url:x,results:[],delta:null,componentId:x,durationMs:S,error:T.error,skipped:!0}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"skipped",error:T.error});else if(I.length>0){const _=await ll(o,x).catch(()=>null),N=I.reduce((O,W)=>O+W.violations.length,0);f.push({url:x,results:I,delta:null,componentId:I[0].componentId,durationMs:S,snapshot:_??void 0}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"completed",violations:N})}else{const _=D??"audit returned no result";f.push({url:x,results:[],delta:null,componentId:x,durationMs:S,error:_}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:_})}if(!c){const _=await Ri(o);for(const N of _){const O=$i(N,x);O&&ua(O,e)&&!Ti(O)&&!h.has(O)&&!g.includes(O)&&g.push(O)}}}catch(C){const F=Date.now()-A,T=C instanceof Error?C.message:String(C);f.push({url:x,results:[],delta:null,componentId:x,durationMs:F,error:T}),H({type:"SITE_CRAWL_PROGRESS_EVENT",current:$,total:Math.min(d,h.size+g.length),url:x,status:"failed",error:T})}await Ft({})}try{const x=await pe();await Mi(f,x)}catch(x){U.warn("PDF audit pass failed",x)}const w=new Date().toISOString(),b=Date.now()-u,k=f.flatMap(x=>x.results),v=await Le(k,[e]),s=qr(e,f,m,w,b,v.walkthroughsByComponent,v.walkthroughAcksByComponent,v.ackedKeysByComponent,v.humanVerdictsByComponent,v.incompleteResolutionsByComponent,v.attestations);try{s.auditSettings=await _n(w)}catch(x){U.warn("audit-settings capture failed",x)}if(s.consistencyFindings.length>0)try{const x=await Ll(s.consistencyFindings);s.consistencyFindings=x.emitted}catch(x){U.warn("consistency AI suppression failed; emitting heuristic findings",x)}try{const x=f.map($=>({...$,results:$.results.map(({screenshotDataUrl:A,...C})=>C)}));await pr(x,{startUrl:e,finishedAt:w})}catch(x){const $=x instanceof Error?x.message:String(x);U.error("persisting siteCrawlPerUrlResults failed",x),H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"CRAWL_PERSIST_FAILED",message:`Crawl finished but persistence failed (${$}). The AI fix prompt export won't have per-page data.`,recoverable:!1}})}H({type:"SITE_CRAWL_COMPLETE_EVENT",report:s}),await Di(s),await dt()}catch(w){U.error("site crawl failed",w),H({type:"SITE_CRAWL_FAILED_EVENT",error:{code:"UNKNOWN",message:String(w),recoverable:!1}}),await dt()}}function ha(e){try{return new RegExp(e)}catch{return null}}async function Wu(){const[e,t]=await Promise.all([En(),Zt()]);if(!e)return{ok:!1,reason:"No crawl report cached. Run a site crawl first."};if(!t||t.length===0)return{ok:!1,reason:"Crawl report exists but per-URL audit data was not retained. Re-run the crawl once; future regrades will work."};const a=t.flatMap(i=>i.results),n=await Le(a,[e.startUrl]),o=new Date().toISOString(),r=qr(e.startUrl,t,e.startedAt,o,e.totalDurationMs,n.walkthroughsByComponent,n.walkthroughAcksByComponent,n.ackedKeysByComponent,n.humanVerdictsByComponent,n.incompleteResolutionsByComponent,n.attestations);return r.auditSettings=e.auditSettings??await _n(o),await hr(r),H({type:"SITE_CRAWL_COMPLETE_EVENT",report:r}),await Di(r),{ok:!0}}async function Di(e){try{if(e.siteGrade==="pending")return;const t=await pe();if(!he(t,"forensicAnchoring"))return;const a={domain:Au(e.startUrl),grade:e.siteGrade,scope:"site",pageCount:e.pagesAudited,wcagLevel:`${Nt} ${In}`,auditedAt:e.finishedAt,productSlug:"wcagcheckr"},n=await vu(a),o=await ga(),r=await Ai(n,e.startUrl,e.finishedAt,o??void 0);await Iu({domain:a.domain,claim:a,hash:n,receipt:r}),H({type:"SITE_CLAIM_SEALED_EVENT",domain:a.domain})}catch(t){U.warn("site-claim seal/anchor failed (badge unavailable for this crawl)",t)}}const en=5*6e4,Go=9e4,Vo={altText:"Verifying alt text…",headings:"Judging heading quality…",sensory:"Scanning for sensory-only instructions…",aria:"Reviewing ARIA semantics…",imageOfText:"Detecting baked-in text in images…",colorOnlyMeaning:"Checking for color-only meaning…",genericLinkText:"Reviewing link clarity…",wallOfText:"Detecting walls of text…",languageMismatch:"Verifying page language…"},Gu={altText:["1.1.1"],headings:["2.4.6"],sensory:["1.3.3"],aria:["4.1.2"],imageOfText:["1.4.5"],colorOnlyMeaning:["1.4.1"],genericLinkText:["2.4.4"],wallOfText:[],languageMismatch:["3.1.1","3.1.2"]};async function pa(e,t,a,n,o,r,i){const c=await pe();if(!he(c,"aiJudgment")){U.debug("aiJudgment not allowed on current tier — skipping AI augmentation");return}let d;try{d=await xe(e,{type:"AI_CANDIDATES_REQUEST",selector:t},a)}catch(S){U.debug("ai candidates fetch failed",S);return}const l=o[0];if(!l)return;const p={componentId:r,currentState:l.state,axeVersion:l.axeVersion},m={at:new Date().toISOString(),componentId:r,pageUrl:l.pageUrl??t,enabledChecks:n.enabledChecks,candidateCounts:{images:d.images.length,headings:d.headings.length,instructions:d.instructions.length,ariaElements:d.ariaElements.length,links:d.links.length,longTextBlocks:d.longTextBlocks.length,colorOnlyRegions:d.colorOnlyRegions.length,languageInfo:d.languageInfo?"present":"null"}};U.info("ai augmentation gate snapshot",JSON.stringify(m));try{await chrome.storage.local.set({aiDiagnosticLatest:m})}catch(S){U.warn("failed to persist ai diagnostic to storage.local",S)}const u=[];if(n.enabledChecks.altText&&u.push({key:"altText",run:S=>{const _=d.images.map(N=>({imageUrl:N.imageUrl,alt:N.alt,selector:N.selector,outerHTML:N.outerHTML,surroundingContext:N.surroundingContext,...p}));return fd(_,n,S)}}),n.enabledChecks.headings&&u.push({key:"headings",run:S=>ou(d.headings,p,n,S)}),n.enabledChecks.sensory&&u.push({key:"sensory",run:S=>ru(d.instructions,p,n,S)}),n.enabledChecks.aria&&u.push({key:"aria",run:S=>iu(d.ariaElements,p,n,S)}),n.enabledChecks.imageOfText&&u.push({key:"imageOfText",run:S=>{const _=d.images.map(N=>({imageUrl:N.imageUrl,accessibleName:N.alt||void 0,selector:N.selector,outerHTML:N.outerHTML,pixelArea:N.pixelArea}));return du(_,p,n,S)}}),n.enabledChecks.colorOnlyMeaning&&u.push({key:"colorOnlyMeaning",run:S=>uu(d.colorOnlyRegions,p,n,S)}),n.enabledChecks.genericLinkText&&u.push({key:"genericLinkText",run:S=>su(d.links,p,n,S)}),n.enabledChecks.wallOfText&&u.push({key:"wallOfText",run:S=>cu(d.longTextBlocks,p,n,S)}),n.enabledChecks.languageMismatch){const S=d.languageInfo;u.push({key:"languageMismatch",run:_=>lu(S?[S]:[],p,n,_)})}if(u.length===0)return;let g=0,h=0,f=!1;const w={};let b=0,k=0,v=0;const s=[];let x=!1,$=!1;function A(S,_){if(w[S]=(w[S]??0)+_.totalCostUsd,g+=_.totalCostUsd,h+=_.findings.length,f=f||_.capExceeded,b++,_.errors.length>0){v++;for(const N of _.errors)s.includes(N)||s.push(N)}else k++;U.info(`ai ${S}: ${_.findings.length} findings, $${_.totalCostUsd.toFixed(4)}, errs=${_.errors.length}`),_.capExceeded&&U.warn(`ai cost cap exceeded after $${_.totalCostUsd.toFixed(4)} during ${S}`)}const C=(async()=>{for(let S=0;S<u.length;S++){if(i!=null&&i.isCanceled()){$=!0;break}const _=u[S];H({type:"AI_AUGMENTATION_PROGRESS_EVENT",componentId:r,currentCheck:_.key,currentCheckLabel:Vo[_.key],current:S+1,total:u.length});const N=new AbortController,O=setTimeout(()=>N.abort(),Go),W=i?setInterval(()=>{i.isCanceled()&&N.abort()},500):null;let P;try{P=await _.run({signal:N.signal,onProgress:(V,M)=>{M>0&&H({type:"AI_AUGMENTATION_PROGRESS_EVENT",componentId:r,currentCheck:_.key,currentCheckLabel:Vo[_.key],current:S+1,total:u.length,candidatesDone:V,candidatesTotal:M})}}),N.signal.aborted&&(i!=null&&i.isCanceled())?P.errors=[...P.errors,`${_.key} canceled by user`]:N.signal.aborted}catch(V){const M=V instanceof Error?V.message:String(V),j=N.signal.aborted,q=j&&(i!=null&&i.isCanceled())?`${_.key} canceled by user`:j?`${_.key} hit per-check ${Go/1e3}s cap — analyzer aborted`:`${_.key} threw: ${M}`;P={findings:[],totalCostUsd:0,capExceeded:!1,errors:[q]}}finally{clearTimeout(O),W&&clearInterval(W)}if(P.findings.length>0&&(l.violations=[...l.violations,...P.findings]),P.errors.length===0){const V=Gu[_.key];if(V&&V.length>0&&l.axeRulesEvaluated)for(const M of V)l.axeRulesEvaluated.passed.push({ruleId:`ai-${_.key}-coverage`,wcagCriterion:M})}A(_.key,P)}})(),F=new Promise(S=>{setTimeout(()=>S("timeout"),en)});await Promise.race([C.then(()=>"done"),F])==="timeout"&&(x=!0,U.warn(`ai augmentation hit global ${en/1e3}s timeout after ${b}/${u.length} checks`));let I;if(v>0||x||$){x?I=`AI augmentation timed out after ${en/1e3}s`:$?I="AI augmentation canceled":I=s[0]??"AI analyzer error";const S=k===0?"total":"partial";H({type:"AI_AUGMENTATION_FAILED_EVENT",componentId:r,severity:S,reason:I,checksAttempted:b,checksSucceeded:k,checksErrored:v,errorDetails:x||$?[I,...s.slice(0,4)]:s.slice(0,5)}),U.warn(`ai augmentation ${S} failure: ${v}/${b} checks errored — ${I}`)}(g>0||h>0||I)&&await fs({at:new Date().toISOString(),pageUrl:l.pageUrl??t,componentId:r,totalCostUsd:g,byCheck:w,findingsCount:h,capExceeded:f,failureReason:I})}const nf=Object.freeze(Object.defineProperty({__proto__:null,auditCrawlPdfs:Mi,detectBit:Ii,detectLadleAcrossFrames:xi,detectPlayground:Si,detectStorybookAcrossFrames:ki,discoverCrawlUrls:_u,getActiveTabId:vt,getMatrixSettings:zn,regradeSiteCrawl:Wu,runAiAugmentation:pa,runAllFramesAudit:Mu,runParallelScan:Du,runSingleElementAudit:pt,runSiteCrawl:Uu,runStorybookAllAudit:Ou},Symbol.toStringTag,{value:"Module"})),St=Z("alert-sender"),Vu="wcagcheckr",ju="https://api.wcagcheckr.com",Bu=`${ju}/v1/products/${Vu}/alerts/send`,Hu=1e4,An="alertConfig:v1",qu={emailEnabled:!1,webhookEnabled:!1,webhookUrl:"",minImpact:"serious"},zt={minor:1,moderate:2,serious:3,critical:4};async function zu(){const t=(await chrome.storage.local.get(An))[An];return{...qu,...t??{}}}async function of(e){await chrome.storage.local.set({[An]:e})}async function Ku(e){let t;try{t=await zu()}catch(h){return St.warn("failed to read alert config",h),{fired:!1,reason:"config_read_failed"}}if(!t.emailEnabled&&!t.webhookEnabled)return{fired:!1,reason:"no_channel_enabled"};const a=await pe(),n=he(a,"emailAlerts"),o=he(a,"webhookAlerts"),r=t.emailEnabled&&n,i=t.webhookEnabled&&o;if(!r&&!i)return{fired:!1,reason:"no_channel_enabled"};const c=[];for(const h of e.results){const f=h.delta;f!=null&&f.new&&c.push(...f.new)}const d=zt[t.minImpact],l=c.filter(h=>zt[h.impact]>=d);if(l.length===0)return{fired:!1,reason:"below_impact_threshold"};const p=await ga();if(!p)return St.debug("no license token; alert skipped"),{fired:!1,reason:"no_license_token"};l.sort((h,f)=>zt[f.impact]-zt[h.impact]);const m=l.slice(0,10).map(h=>({wcag:h.wcagCriterion,impact:h.impact,selector:h.target.selector,help:h.description.slice(0,480),helpUrl:h.helpUrl})),u=e.results.reduce((h,f)=>h+f.violations.length,0),g={token:p,scheduleId:e.scheduleId,auditedUrl:e.auditedUrl,totalViolations:u,newViolationCount:l.length,topViolations:m,webhookUrl:i&&t.webhookUrl?t.webhookUrl:void 0,emailEnabled:r,ranAt:e.ranAt};try{const h=await fetch(Bu,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(g),signal:AbortSignal.timeout(Hu)}),f=await h.json().catch(()=>null);return h.ok?(St.info("alert delivered",{emailSent:f==null?void 0:f.emailSent,webhookSent:f==null?void 0:f.webhookSent}),{fired:!0,emailSent:(f==null?void 0:f.emailSent)??!1,webhookSent:(f==null?void 0:f.webhookSent)??!1,serverStatus:h.status}):(St.warn(`alert server returned ${h.status}`,f),{fired:!1,reason:`server_${h.status}`,serverStatus:h.status})}catch(h){return St.warn("alert send failed",h),{fired:!1,reason:h instanceof Error?h.message:"unknown_error"}}}const Yu="#dc2626",Ju="#f59e0b",Xu="#059669",Qu="#94a3b8";function Zu(e){const t=e.filter(c=>c.enabled);let a=0,n=0,o=0,r=0;for(const c of t){const d=c.lastNewViolationCount??0;c.lastResult==="failed"?n++:c.lastResult==="ok"?d>0?a+=d:o++:r++}let i;return t.length===0?i="no-schedules":a>0?i="new-violations":n>0?i="failed":o>0?i="all-clear":i="pending-first-run",{state:i,newViolationsTotal:a,failingCount:n,okCount:o,pendingCount:r,totalEnabled:t.length}}async function eh(e){switch(e.state){case"new-violations":{const t=e.newViolationsTotal>99?"99+":String(e.newViolationsTotal);await chrome.action.setBadgeText({text:t}),await chrome.action.setBadgeBackgroundColor({color:Yu}),await chrome.action.setTitle({title:`wcagcheckr — ${e.newViolationsTotal} new WCAG violation${e.newViolationsTotal===1?"":"s"} vs baseline across ${e.totalEnabled} scheduled audit${e.totalEnabled===1?"":"s"}`});break}case"failed":{await chrome.action.setBadgeText({text:"!"}),await chrome.action.setBadgeBackgroundColor({color:Ju}),await chrome.action.setTitle({title:`wcagcheckr — ${e.failingCount} scheduled audit${e.failingCount===1?"":"s"} failed to run`});break}case"all-clear":{await chrome.action.setBadgeText({text:"✓"}),await chrome.action.setBadgeBackgroundColor({color:Xu}),await chrome.action.setTitle({title:`wcagcheckr — all ${e.okCount} scheduled audit${e.okCount===1?"":"s"} passing`});break}case"pending-first-run":{await chrome.action.setBadgeText({text:""}),await chrome.action.setBadgeBackgroundColor({color:Qu}),await chrome.action.setTitle({title:`wcagcheckr — ${e.pendingCount} scheduled audit${e.pendingCount===1?"":"s"} awaiting first run`});break}case"no-schedules":default:{await chrome.action.setBadgeText({text:""}),await chrome.action.setTitle({title:"wcagcheckr"});break}}}async function th(){const e=await pe();if(!he(e,"statusBadge")){try{await chrome.action.setBadgeText({text:""})}catch{}return{state:"no-schedules",newViolationsTotal:0,failingCount:0,okCount:0,pendingCount:0,totalEnabled:0}}const t=await cr(),a=Zu(t);try{await eh(a)}catch(n){console.warn("[status-badge] failed to apply",n)}return a}const jo=Z("deposition-packet");function J(e){return e.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function ah(e,t,a){if(!e)return`<section class="dp-cover dp-cover-error">
|
|
1028
1028
|
<h2 style="margin:0 0 8pt 0; color:#b91c1c">⚠ Chain-of-Custody: UNAVAILABLE</h2>
|
|
1029
1029
|
<p>This packet could not be sealed because the underlying audit record was empty. Provenance cannot be verified.</p>
|
|
1030
1030
|
</section>`;const n=Jr(e.hash);return t?`<section class="dp-cover dp-cover-sealed" style="border:2pt solid #059669; background:#ecfdf5; padding:14pt; border-radius:4pt; margin:0 0 14pt 0">
|