@wcag-checkr/ci 1.0.19 → 1.0.20

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.
@@ -1,7 +1,7 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/parallel-tab-flow-D1lKQI3e.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]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/parallel-tab-flow-CU0Ury3L.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
- (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,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 -->
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 -->
5
5
  <img src="/assets/logo.png" alt="">
6
6
 
7
7
  <!-- Passing — descriptive alt -->
@@ -571,7 +571,7 @@ Accessible name (alt / aria-label) of this image: "${o.slice(0,200)}"`:""}),l=aw
571
571
  `),{text:d,maxTokens:l}=ye(u=>u.labelInName,{pageUrl:n,candidatesList:c}),p=[];if(o){const u=/^data:(image\/[a-z]+);base64,(.+)$/i.exec(o);u&&p.push({type:"image",source:{type:"base64",media_type:u[1],data:u[2]}})}p.push({type:"text",text:d});const m=await se({apiKey:e.apiKey,model:t,maxTokens:l,signal:i,messages:[{role:"user",content:p}]});return me(m,a)},async judgeFocusOrderFallback({pageUrl:n,pageScreenshot:o,tabSequence:r,primaryUncertainReason:i,signal:c}){const{text:d,maxTokens:l}=ye(u=>u.focusOrderFallback,{pageUrl:n,primaryUncertainReason:i.replace(/"/g,"'").slice(0,600),rowBucketPx:String(ra),seq:po(r)}),p=[];if(o){const u=/^data:(image\/[a-z]+);base64,(.+)$/i.exec(o);u&&p.push({type:"image",source:{type:"base64",media_type:u[1],data:u[2]}})}p.push({type:"text",text:d});const m=await se({apiKey:e.apiKey,model:t,maxTokens:l,signal:c,messages:[{role:"user",content:p}]});return me(m,a)}}}function po(e){return Tl(e).map(a=>{const n=a.items.map(o=>` ${o.ordinal}. [${o.role||o.selector.split(" ").pop()||"?"}] "${o.name||"(no name)"}" — selector ${o.selector} — x=${Math.round(o.rect.x)}, w=${Math.round(o.rect.width)}`).join(`
572
572
  `);return` Row ~y=${a.row*ra} (${a.items.length} item${a.items.length===1?"":"s"}):
573
573
  ${n}`}).join(`
574
- `)}class Ot extends Error{constructor(){super("Anthropic API: canceled by caller"),this.name="ExternalAbortError"}}const Zr=3e4,fo=3,wl=1e4;function vl(e){return e===429||e>=500}function Al(e){return e instanceof Error?e.name==="TimeoutError"||e.name==="AbortError"||e instanceof TypeError:!1}function kl(e,t){if(!t)return e;if(typeof AbortSignal.any=="function")return AbortSignal.any([e,t]);const a=new AbortController,n=()=>a.abort();return e.aborted?a.abort():e.addEventListener("abort",n,{once:!0}),t.aborted?a.abort():t.addEventListener("abort",n,{once:!0}),a.signal}async function xl(e){var o,r;const t=AbortSignal.timeout(Zr),a=kl(t,e.signal);let n;try{n=await fetch(ml,{method:"POST",headers:{"x-api-key":e.apiKey,"anthropic-version":bl,"content-type":"application/json","anthropic-dangerous-direct-browser-access":"true"},body:JSON.stringify({model:e.model,max_tokens:e.maxTokens,messages:e.messages,temperature:e.temperature??0}),signal:a})}catch(i){throw(o=e.signal)!=null&&o.aborted?new Ot:i}if(!n.ok){const c=((r=(await n.json().catch(()=>({}))).error)==null?void 0:r.message)??`${n.status} ${n.statusText}`,d=new Error(`Anthropic API: ${c}`);throw d.status=n.status,d}return await n.json()}async function se(e){var a;let t=null;for(let n=1;n<=fo;n++){if((a=e.signal)!=null&&a.aborted)throw new Ot;try{return await xl(e)}catch(o){if(o instanceof Ot)throw o;const r=o.status;if(!(Al(o)||typeof r=="number"&&vl(r))||n===fo)throw o instanceof Error&&(o.name==="TimeoutError"||o.name==="AbortError")?new Error(`Anthropic API: timed out after ${Zr/1e3}s on each of ${n} attempt${n===1?"":"s"}`):o;t=o instanceof Error?o:new Error(String(o)),await Il(n*1e3,e.signal)}}throw t??new Error("Anthropic API: all retries failed")}function Il(e,t){return new Promise((a,n)=>{if(t!=null&&t.aborted){n(new Ot);return}const o=setTimeout(()=>{t==null||t.removeEventListener("abort",r),a()},e),r=()=>{clearTimeout(o),n(new Ot)};t==null||t.addEventListener("abort",r,{once:!0})})}async function go(e,t){var r,i;const a=new AbortController,n=setTimeout(()=>a.abort(),wl),o=()=>a.abort();t&&(t.aborted?a.abort():t.addEventListener("abort",o,{once:!0}));try{const c=await fetch(e,{signal:a.signal});if(!c.ok)return null;const d=((i=(r=c.headers.get("content-type"))==null?void 0:r.split(";")[0])==null?void 0:i.trim())??"image/png";if(!d.startsWith("image/")||d!=="image/jpeg"&&d!=="image/png"&&d!=="image/gif"&&d!=="image/webp")return null;const l=await c.arrayBuffer();let p="";const m=new Uint8Array(l),u=32768;for(let g=0;g<m.length;g+=u)p+=String.fromCharCode(...m.slice(g,g+u));return{data:btoa(p),mediaType:d}}catch{return null}finally{clearTimeout(n),t&&t.removeEventListener("abort",o)}}function me(e,t){var r;const a=((r=e.content.find(i=>i.type==="text"))==null?void 0:r.text)??"",n=Sl(a),o=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;return{verdict:n.verdict,reasoning:n.reasoning,confidence:n.confidence,costUsd:o,model:e.model}}function Sl(e){const a=e.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/);if(!a)return{verdict:"uncertain",reasoning:"Model returned no parseable JSON",confidence:0};try{const n=JSON.parse(a[0]),o=n.verdict==="pass"||n.verdict==="fail"?n.verdict:"uncertain",r=(n.reasoning??"").trim().slice(0,600),i=typeof n.confidence=="number"?n.confidence:.5,c=Math.max(0,Math.min(1,i));return{verdict:o,reasoning:r,confidence:c}}catch{return{verdict:"uncertain",reasoning:"Model returned invalid JSON",confidence:0}}}function mo(e,t,a){return{verdict:"uncertain",reasoning:e,confidence:0,costUsd:t,model:a}}const Cl=`
574
+ `)}class Ot extends Error{constructor(){super("Anthropic API: canceled by caller"),this.name="ExternalAbortError"}}const Zr=3e4,fo=3,wl=1e4;function vl(e){return e===429||e>=500}function Al(e){return e instanceof Error?e.name==="TimeoutError"||e.name==="AbortError"||e instanceof TypeError:!1}function kl(e,t){if(!t)return e;if(typeof AbortSignal.any=="function")return AbortSignal.any([e,t]);const a=new AbortController,n=()=>a.abort();return e.aborted?a.abort():e.addEventListener("abort",n,{once:!0}),t.aborted?a.abort():t.addEventListener("abort",n,{once:!0}),a.signal}async function xl(e){var o,r;const t=AbortSignal.timeout(Zr),a=kl(t,e.signal);let n;try{n=await fetch(ml,{method:"POST",headers:{"x-api-key":e.apiKey,"anthropic-version":bl,"content-type":"application/json","anthropic-dangerous-direct-browser-access":"true"},body:JSON.stringify({model:e.model,max_tokens:e.maxTokens,messages:e.messages,temperature:e.temperature??0}),signal:a})}catch(i){throw(o=e.signal)!=null&&o.aborted?new Ot:i}if(!n.ok){const c=((r=(await n.json().catch(()=>({}))).error)==null?void 0:r.message)??`${n.status} ${n.statusText}`,d=new Error(`Anthropic API: ${c}`);throw d.status=n.status,d}return await n.json()}async function se(e){var a;let t=null;for(let n=1;n<=fo;n++){if((a=e.signal)!=null&&a.aborted)throw new Ot;try{return await xl(e)}catch(o){if(o instanceof Ot)throw o;const r=o.status;if(!(Al(o)||typeof r=="number"&&vl(r))||n===fo)throw o instanceof Error&&(o.name==="TimeoutError"||o.name==="AbortError")?new Error(`Anthropic API: timed out after ${Zr/1e3}s on each of ${n} attempt${n===1?"":"s"}`):o;t=o instanceof Error?o:new Error(String(o)),await Il(n*1e3,e.signal)}}throw t??new Error("Anthropic API: all retries failed")}function Il(e,t){return new Promise((a,n)=>{if(t!=null&&t.aborted){n(new Ot);return}const o=setTimeout(()=>{t==null||t.removeEventListener("abort",r),a()},e),r=()=>{clearTimeout(o),n(new Ot)};t==null||t.addEventListener("abort",r,{once:!0})})}async function go(e,t){var r,i;const a=new AbortController,n=setTimeout(()=>a.abort(),wl),o=()=>a.abort();t&&(t.aborted?a.abort():t.addEventListener("abort",o,{once:!0}));try{const c=await fetch(e,{signal:a.signal});if(!c.ok)return null;const d=((i=(r=c.headers.get("content-type"))==null?void 0:r.split(";")[0])==null?void 0:i.trim())??"image/png";if(!d.startsWith("image/")||d!=="image/jpeg"&&d!=="image/png"&&d!=="image/gif"&&d!=="image/webp")return null;const l=await c.arrayBuffer();let p="";const m=new Uint8Array(l),u=32768;for(let g=0;g<m.length;g+=u)p+=String.fromCharCode(...m.slice(g,g+u));return{data:btoa(p),mediaType:d}}catch{return null}finally{clearTimeout(n),t&&t.removeEventListener("abort",o)}}function me(e,t){var r;const a=((r=e.content.find(i=>i.type==="text"))==null?void 0:r.text)??"",n=Sl(a),o=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;return{verdict:n.verdict,reasoning:n.reasoning,confidence:n.confidence,costUsd:o,model:e.model}}function Sl(e){const a=e.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/);if(!a)return{verdict:"uncertain",reasoning:"Model returned no parseable JSON",confidence:0};try{const n=JSON.parse(a[0]),o=n.verdict==="pass"||n.verdict==="fail"?n.verdict:"uncertain",r=(n.reasoning??"").trim().slice(0,600),i=typeof n.confidence=="number"?n.confidence:.5,c=Math.max(0,Math.min(1,i));return{verdict:o,reasoning:r,confidence:c}}catch{return{verdict:"uncertain",reasoning:"Model returned invalid JSON",confidence:0}}}function mo(e,t,a){return{verdict:"uncertain",reasoning:e,confidence:0,costUsd:t,model:a,unverifiable:!0}}const Cl=`
575
575
  Respond ONLY with a single JSON object — no preamble, no markdown:
576
576
  { "verdict": "pass" | "fail" | "uncertain", "reasoning": "1-3 sentences", "confidence": 0.0-1.0 }
577
577
  `.trim();function $l(e,t,a,n,o){const r=o.map((c,d)=>` ${d+1}. ${c.url}
@@ -739,7 +739,7 @@ Respond with strict JSON (no markdown fences):
739
739
  {
740
740
  "verdict": "pass" | "fail" | "uncertain",
741
741
  "reasoning": "one or two sentences explaining the determination, citing the contrast ratio for color-contrast"
742
- }`}function Dl(e,t,a){var c;const n=((c=e.content.find(d=>d.type==="text"))==null?void 0:c.text)??"",r=n.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/),i=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;if(!r)return{verdict:"uncertain",reasoning:n||"AI returned no parseable response.",costUsd:i,model:e.model||a};try{const d=JSON.parse(r[0]);return{verdict:d.verdict==="pass"||d.verdict==="fail"?d.verdict:"uncertain",reasoning:typeof d.reasoning=="string"&&d.reasoning?d.reasoning:"AI returned no rationale.",costUsd:i,model:e.model||a}}catch{return{verdict:"uncertain",reasoning:n,costUsd:i,model:e.model||a}}}function Nl(e,t){var i;const a=((i=e.content.find(c=>c.type==="text"))==null?void 0:i.text)??"",o=a.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/),r=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;if(!o)return{lead:"",body:a||"Summary generation failed.",closer:"",costUsd:r,model:e.model};try{const c=JSON.parse(o[0]);return{lead:typeof c.lead=="string"?c.lead:"",body:typeof c.body=="string"?c.body:"",closer:typeof c.closer=="string"?c.closer:"",costUsd:r,model:e.model}}catch{return{lead:"",body:a,closer:"",costUsd:r,model:e.model}}}function fe(e){if(!e.enabled)return{ok:!1,reason:"AI augmentation is disabled in settings"};if(!e.apiKey)return{ok:!1,reason:"No API key configured"};switch(e.provider){case"anthropic":return{ok:!0,client:yl({apiKey:e.apiKey,model:e.model})};case"openai":return{ok:!1,reason:"OpenAI provider not yet implemented"};case"gemini":return{ok:!1,reason:"Gemini provider not yet implemented"};default:return{ok:!1,reason:`Unknown provider: ${e.provider}`}}}const At=Z("consistency-ai-suppression");async function Ll(e,t={}){var p;if(e.length===0)return{emitted:[],suppressed:0,uncertain:0,apiCalls:0};const a=await pe();if(!he(a,"aiConsistencySuppression"))return{emitted:e,suppressed:0,uncertain:0,apiCalls:0};let n;try{const m=await chrome.storage.local.get("aiConfig");n=ke(m.aiConfig)}catch{return At.debug("aiConfig load failed; emitting heuristic findings unchanged"),{emitted:e,suppressed:0,uncertain:0,apiCalls:0}}const o=fe(n);if(!o.ok)return At.info(`AI client unavailable (${o.reason}); emitting heuristic findings unchanged`),{emitted:e,suppressed:0,uncertain:0,apiCalls:0};const r=o.client;if(typeof r.judgeConsistencyDivergence!="function")return At.info("AI client does not support judgeConsistencyDivergence; emitting heuristic findings unchanged"),{emitted:e,suppressed:0,uncertain:0,apiCalls:0};const i=[];let c=0,d=0,l=0;for(const m of e){if((p=t.signal)!=null&&p.aborted){i.push(m);continue}try{const u=await r.judgeConsistencyDivergence({wcagCriterion:m.wcagCriterion,ruleId:m.ruleId,description:m.description,details:m.details,pages:m.pages,signal:t.signal});if(l++,u.verdict==="pass"){c++;continue}if(u.verdict==="fail"){i.push({...m,aiVerdict:{verdict:"real-divergence",confidence:u.confidence??0,reasoning:u.reasoning??""}});continue}d++,i.push({...m,aiVerdict:{verdict:"uncertain",confidence:u.confidence??0,reasoning:u.reasoning??""}})}catch(u){At.warn(`AI suppression failed for ${m.ruleId} ${m.wcagCriterion}: ${u instanceof Error?u.message:String(u)}`),i.push(m)}}return At.info(`consistency AI suppression: ${l} API calls, ${c} false-positives suppressed, ${d} uncertain, ${i.length} emitted`),{emitted:i,suppressed:c,uncertain:d,apiCalls:l}}const zp=3,ei=["default","hover","focus","focus-visible","active","disabled"],ti=["light","dark","forced-colors-active","forced-colors-none"],ai=["desktop","mobile","tablet"],ni="ltr",Kp={pseudoStates:[...ei],ariaVariations:[],themes:[...ti],directions:[ni],breakpoints:[...ai],breakpointPresets:cs};function Pl(e){const t=[],a=e.stateMatrix??{},n=(c,d)=>d.filter(l=>!(Array.isArray(c)&&c.includes(l))),o=n(a.pseudoStates,ei);o.length&&t.push(`missing pseudo-states: ${o.join(", ")}`);const r=n(a.themes,ti);r.length&&t.push(`missing themes: ${r.join(", ")}`);const i=n(a.breakpoints,ai);return i.length&&t.push(`missing breakpoints: ${i.join(", ")}`),Array.isArray(a.directions)&&a.directions.includes(ni)||t.push("LTR direction not enabled"),e.aiEnabled||t.push("AI checks off (an AI key is required for the criteria axe-core cannot cover)"),t}async function _n(e){var w;let t={},a=1,n={};try{if(typeof chrome<"u"&&((w=chrome.storage)!=null&&w.local)){const b=await chrome.storage.local.get(["stateMatrix","runsPerState","aiConfig"]);t=b.stateMatrix??{},a=b.runsPerState,n=b.aiConfig??{}}}catch{}const o=(b,k)=>Array.isArray(b)&&b.length>0?b:k,r=o(t.pseudoStates,["default"]),i=o(t.themes,["light"]),c=o(t.directions,["ltr"]),d=o(t.breakpoints,["desktop"]),l=Array.isArray(t.ariaVariations)?t.ariaVariations.length:0,p=r.length*i.length*c.length*d.length*Math.max(l,1),m=typeof a=="number"&&a>0?a:1,u=!!n.enabled&&!!n.apiKey,g=n.enabledChecks,h=u&&g?Object.values(g).filter(Boolean).length:0,f=Pl({stateMatrix:{pseudoStates:r,themes:i,directions:c,breakpoints:d,ariaVariations:[]},aiEnabled:u});return{stateCount:p,pseudoStates:r,themes:i,directions:c,breakpoints:d,ariaVariations:l,runsPerState:m,aiEnabled:u,aiCheckCount:h,wcagTarget:"WCAG 2.1 AA",isConformance:f.length===0,conformanceGaps:f,capturedAt:e}}function oi(e){return e?`${((a,n)=>`${a} ${n}${a===1?"":"s"}`)(e.stateCount,"UI state")} (${e.pseudoStates.length} pseudo × ${e.themes.length} theme${e.themes.length===1?"":"s"} × ${e.directions.length} dir × ${e.breakpoints.length} breakpoint${e.breakpoints.length===1?"":"s"}${e.ariaVariations?` × ${e.ariaVariations} ARIA`:""}) · each screen re-checked until results stabilized · AI ${e.aiEnabled?`ON (${e.aiCheckCount} checks)`:"OFF"} · ${e.wcagTarget}`:"Audit settings: not recorded."}function ri(e){return e?e.isConformance?null:`Quick check — NOT a Full 2.1 AA audit${e.conformanceGaps.length?` (${e.conformanceGaps.join("; ")})`:""}. This grade reflects a LIMITED run and is not a conformance result; run the Full 2.1 AA audit before relying on it.`:"Audit settings were not recorded — treat this grade as unverified."}function Fl(e){const t=new Map(e.breakpointPresets.map(n=>[n.id,n])),a=[];for(const n of e.breakpoints){const o=t.get(n);if(o)for(const r of e.directions)for(const i of e.themes){const c=e.ariaVariations.length===0?[null]:e.ariaVariations;for(const d of c)for(const l of e.pseudoStates)a.push({pseudoState:l,ariaVariation:d,theme:i,direction:r,breakpoint:o})}}return a}const ii=["color-contrast","color-contrast-enhanced","link-in-text-block"],_l=["image-alt","input-image-alt","area-alt","svg-img-alt","object-alt","role-img-alt","label","select-name","aria-input-field-name","aria-toggle-field-name","form-field-multiple-labels","autocomplete-valid","label-content-name-mismatch","label-title-only","button-name","input-button-name","link-name","empty-button","empty-heading","empty-link","frame-title","heading-order","page-has-heading-one","landmark-one-main","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","landmark-unique","landmark-banner-is-top-level","landmark-complementary-is-top-level","landmark-contentinfo-is-top-level","landmark-main-is-top-level","region","bypass","empty-table-header","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","aria-allowed-role","aria-prohibited-attr","presentation-role-conflict","aria-text","aria-deprecated-role","aria-conditional-attr","aria-braille-equivalent","html-has-lang","html-lang-valid","html-xml-lang-mismatch","valid-lang","nested-interactive","tabindex","frame-focusable-content","no-focusable-content","focus-order-semantics","meta-viewport","meta-refresh","duplicate-id","duplicate-id-active","duplicate-id-aria","video-caption","audio-caption","table-fake-caption","scope-attr-valid","th-has-data-cells","td-headers-attr"];{const e=new Set(ii),t=_l.filter(a=>e.has(a));t.length>0&&console.error("axe-rule-classification: rule(s) classified as BOTH state-dependent and markup-eligible:",t)}const Ul=Z("chrome-api"),Wl="1.3",bo=3e4;class Gl extends Error{constructor(t,a){super(`CDP ${t} timed out after ${a}ms`),this.method=t,this.timeoutMs=a,this.name="CdpTimeoutError"}}class si{constructor(t){this.target=t}async attach(){await chrome.debugger.attach(this.target,Wl)}async detach(){try{await chrome.debugger.detach(this.target)}catch(t){Ul.debug("detach soft-failure",t)}}async send(t,a){const n=chrome.debugger.sendCommand(this.target,t,a);let o;const r=new Promise((i,c)=>{o=setTimeout(()=>c(new Gl(t,bo)),bo)});try{return await Promise.race([n,r])}finally{o!==void 0&&clearTimeout(o)}}}function Vl(e){const t=e instanceof Error?e.message:String(e);return/Another debugger is already attached|Cannot attach to/i.test(t)}function ci(e){const t=e instanceof Error?e.message:String(e);return Vl(e)?Xn("DEBUGGER_BUSY","DevTools is open on this tab. Close it to run the audit.",!0,{raw:t}):Xn("STATE_DRIVE_FAILED",t,!1)}function jl(e){const t=(a,n)=>e(a,n);return chrome.debugger.onDetach.addListener(t),()=>chrome.debugger.onDetach.removeListener(t)}const we=Z("state-driver"),Bl=60*1e3,Ve=new Map,ia=new Map,gt=new Map,ut=new Map,Hl='button, a[href], input, textarea, select, summary, [tabindex]:not([tabindex="-1"]), [role="button"], [role="link"], [role="checkbox"], [role="radio"], [role="tab"], [role="menuitem"], [role="switch"], [role="combobox"], [role="option"]',Mt=new Map,ql={default:[],hover:["hover"],focus:["focus"],"focus-visible":["focus","focus-visible"],active:["active"],disabled:[]};async function li(e){let t=Ve.get(e);if(!t){t=new si({tabId:e});try{await t.attach(),await t.send("Runtime.enable"),await t.send("Page.enable"),await t.send("DOM.enable"),await t.send("DOM.getDocument",{depth:-1,pierce:!0}),await t.send("CSS.enable")}catch(a){try{await t.detach()}catch{}throw a}Ve.set(e,t),gt.set(e,new Map),zl(e),we.info("attached",{tabId:e})}return Yl(e),t}function zl(e){const t=(a,n,o)=>{var i,c;if(a.tabId!==e)return;const r=gt.get(e);if(r)if(n==="Runtime.executionContextCreated"){const d=o,l=d==null?void 0:d.context;l&&((i=l.auxData)!=null&&i.isDefault)&&((c=l.auxData)!=null&&c.frameId)&&r.set(l.auxData.frameId,l.id)}else if(n==="Runtime.executionContextDestroyed"){const d=o,l=d==null?void 0:d.executionContextId;if(l!==void 0)for(const[p,m]of r.entries())m===l&&r.delete(p)}else n==="Runtime.executionContextsCleared"&&r.clear()};chrome.debugger.onEvent.addListener(t)}async function Kl(e){const t=Ve.get(e);if(Ve.delete(e),gt.delete(e),ut.delete(e),Mt.delete(e),t)try{await t.detach()}catch{}}function Yl(e){const t=ia.get(e);t&&clearTimeout(t),ia.set(e,setTimeout(()=>{Oa(e).catch(a=>we.warn("idle detach failed",a))},Bl))}async function Oa(e){const t=Ve.get(e);t&&(await t.detach(),Ve.delete(e)),gt.delete(e),ut.delete(e),Mt.delete(e);const a=ia.get(e);a&&(clearTimeout(a),ia.delete(e))}function di(e){const t=[{id:e.frame.id,url:e.frame.url}];for(const a of e.childFrames??[])t.push(...di(a));return t}async function Jl(e,t,a){var r;if(!a||a===0)return;const n=gt.get(t);if(!n)return;let o;try{o=(r=(await chrome.scripting.executeScript({target:{tabId:t,frameIds:[a]},func:()=>location.href}))[0])==null?void 0:r.result}catch(i){we.debug("frame URL lookup failed",i)}try{const i=await e.send("Page.getFrameTree"),c=di(i.frameTree);if(o){const p=c.find(m=>m.url===o);if(p){const m=n.get(p.id);if(m!==void 0)return m}}const d=i.frameTree.frame.id,l=c.find(p=>p.id!==d);return l?n.get(l.id):void 0}catch(i){we.warn("Page.getFrameTree failed",i);return}}async function Xl(e,t,a){var i;const n={expression:`document.querySelector(${JSON.stringify(t)})`,objectGroup:"wcag-auditor",returnByValue:!1};a!==void 0&&(n.contextId=a);const r=(i=(await e.send("Runtime.evaluate",n)).result)==null?void 0:i.objectId;if(!r)return null;try{return(await e.send("DOM.requestNode",{objectId:r})).nodeId??null}finally{e.send("Runtime.releaseObject",{objectId:r}).catch(()=>{})}}async function ui(e){const t=ut.get(e);if(!t||t.length===0)return;const a=Ve.get(e);if(a){for(const n of t)try{await a.send("CSS.forcePseudoState",{nodeId:n,forcedPseudoClasses:[]})}catch(o){we.debug("forcePseudoState clear failed (node may be gone)",o)}ut.delete(e)}}async function Ql(e,t){try{return(await e.send("DOM.querySelectorAll",{nodeId:t,selector:Hl})).nodeIds??[]}catch(a){return we.debug("querySelectorAll for interactive descendants failed",a),[]}}async function mn(e,t,a,n){await chrome.scripting.executeScript({target:Un(e,t),func:(o,r)=>{const i=document.querySelector(o);i&&(r?i.setAttribute("disabled",""):i.removeAttribute("disabled"))},args:[a,n]})}async function hi(e,t){await chrome.scripting.executeScript({target:Un(e,t),func:()=>{const a=document.activeElement;a&&typeof a.blur=="function"&&a.blur()}})}async function pi(e,t){await chrome.scripting.executeScript({target:{tabId:e,frameIds:[0]},func:a=>{document.documentElement.setAttribute("dir",a)},args:[t]})}async function Zl(e,t,a,n){await chrome.scripting.executeScript({target:Un(e,t),func:(o,r)=>{const i=document.querySelector(o);if(i)for(const[c,d]of Object.entries(r))i.setAttribute(c,d)},args:[a,n]})}function Un(e,t){return t!==void 0&&t!==0?{tabId:e,frameIds:[t]}:{tabId:e}}async function ed(e,t,a,n){const o=await li(e),r=Mt.get(e),i=(r==null?void 0:r.scope)===a&&(r==null?void 0:r.frameId)===n,c=t.ariaVariation?JSON.stringify(t.ariaVariation.attributes):"",d=!i||(r==null?void 0:r.pseudoState)!==t.pseudoState,l=!r||r.theme!==t.theme,p=!r||r.direction!==t.direction,m=!r||r.breakpointId!==t.breakpoint.id,u=!i||(r==null?void 0:r.ariaVariationKey)!==c;if(d&&(await ui(e),a)){t.pseudoState==="disabled"?await mn(e,n,a,!0):(await mn(e,n,a,!1),await hi(e,n));const g=ql[t.pseudoState];if(g.length>0){const h=await Jl(o,e,n),f=await Xl(o,a,h);if(f!==null){const w=await Ql(o,f),b=[f,...w];for(const k of b)try{await o.send("CSS.forcePseudoState",{nodeId:k,forcedPseudoClasses:g})}catch(v){we.debug(`CSS.forcePseudoState failed for nodeId=${k}`,v)}ut.set(e,b),we.debug(`forced :${t.pseudoState} on ${b.length} node(s)`)}else we.debug(`could not resolve nodeId for ${a} (frameId=${n})`)}}if(l){const g=[{name:"prefers-reduced-motion",value:"reduce"}];t.theme==="dark"?(g.push({name:"prefers-color-scheme",value:"dark"}),g.push({name:"forced-colors",value:"none"})):t.theme==="light"?(g.push({name:"prefers-color-scheme",value:"light"}),g.push({name:"forced-colors",value:"none"})):t.theme==="forced-colors-active"?g.push({name:"forced-colors",value:"active"}):t.theme==="forced-colors-none"&&g.push({name:"forced-colors",value:"none"}),await o.send("Emulation.setEmulatedMedia",{features:g}),await new Promise(h=>setTimeout(h,50))}p&&await pi(e,t.direction),m&&await o.send("Emulation.setDeviceMetricsOverride",{width:t.breakpoint.width,height:t.breakpoint.height,deviceScaleFactor:t.breakpoint.deviceScaleFactor,mobile:t.breakpoint.mobile}),u&&t.ariaVariation&&a&&await Zl(e,n,a,t.ariaVariation.attributes),Mt.set(e,{scope:a,frameId:n,pseudoState:t.pseudoState,theme:t.theme,direction:t.direction,breakpointId:t.breakpoint.id,ariaVariationKey:c})}async function td(e,t,a){const n=Ve.get(e);if(n){if(await ui(e),Mt.delete(e),t)try{await mn(e,a,t,!1),await hi(e,a),await pi(e,"ltr")}catch(o){we.warn("element-level reset partial failure",o)}try{await n.send("Emulation.setEmulatedMedia",{features:[]}),await n.send("Emulation.clearDeviceMetricsOverride")}catch(o){we.warn("reset partial failure",o)}await Oa(e)}}async function bn(e,t,a,n){try{return await ed(e,t,a,n),H({type:"STATE_CHANGED_EVENT",tabId:e,currentState:t}),{type:"STATE_DRIVE_RESPONSE",success:!0,appliedState:t}}catch(o){return we.error("state drive failed",o),await Kl(e),{type:"STATE_DRIVE_RESPONSE",success:!1,error:ci(o)}}}async function Yt(e,t,a){await td(e,t,a)}async function Yp(e){await Oa(e);try{await chrome.debugger.detach({tabId:e})}catch{}}async function ad(e,t={}){try{const a=await li(e),n={format:"jpeg",quality:t.quality??75};t.fullPage&&(n.captureBeyondViewport=!0);const o=await a.send("Page.captureScreenshot",n);return o!=null&&o.data?`data:image/jpeg;base64,${o.data}`:null}catch(a){return we.debug("Page.captureScreenshot failed",a),null}}function Jp(){var a;const e=[];if(e.push($e("STATE_DRIVE_REQUEST",n=>bn(n.tabId,n.state,n.scope,n.frameId))),e.push($e("STATE_RESET_REQUEST",n=>Yt(n.tabId))),(a=chrome.tabs)!=null&&a.onRemoved){const n=o=>{Oa(o).catch(()=>{})};chrome.tabs.onRemoved.addListener(n),e.push(()=>chrome.tabs.onRemoved.removeListener(n))}const t=jl((n,o)=>{n.tabId!==void 0&&(Ve.delete(n.tabId),gt.delete(n.tabId),ut.delete(n.tabId),we.warn("unexpected detach",{tabId:n.tabId,reason:o}))});return e.push(t),we.info("handlers registered"),()=>e.forEach(n=>n())}const st=Z("cloud-sync"),yo="cloudSyncEnabled",Ga="cloudSyncEndpoint",Va="licenseToken",yn="cloudSyncVersionCache";async function Wn(){try{const e=await pe();if(!he(e,"cloudSync"))return null;const t=await chrome.storage.local.get([yo,Ga,Va]),a=t[yo]===!0,n=typeof t[Ga]=="string"?t[Ga]:"",o=typeof t[Va]=="string"?t[Va]:"";return!a||!n||!o?null:{endpoint:n.replace(/\/$/,""),token:o,enabled:a}}catch{return null}}async function fi(){try{const t=(await chrome.storage.local.get(yn))[yn];return t&&typeof t=="object"?t:{}}catch{return{}}}async function sa(e){try{await chrome.storage.local.set({[yn]:e})}catch{}}async function nd(e,t,a){const n=await Wn();if(!n)return!1;const o=await fi(),r=o[e];try{const i=`${n.endpoint}/v1/products/wcagcheckr/baselines/${encodeURIComponent(e)}`,c=await fetch(i,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify({snapshot:t,axeVersion:a,expectedVersion:r})});if(c.status===409)return st.warn(`baseline ${e} version conflict on push`,{expectedVersion:r}),delete o[e],await sa(o),!1;if(!c.ok)return st.warn("baseline push failed",{status:c.status}),!1;const d=await c.json();return typeof d.version=="number"&&(o[e]=d.version,await sa(o)),!0}catch(i){return st.debug("push network failure (offline?)",i),!1}}async function od(e){const t=await Wn();if(!t)return!1;try{const a=`${t.endpoint}/v1/products/wcagcheckr/baselines/${encodeURIComponent(e)}`,n=await fetch(a,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`}});if(n.ok){const o=await fi();delete o[e],await sa(o)}return n.ok}catch(a){return st.debug("delete network failure",a),!1}}async function rd(){const e=await Wn();if(!e)return[];try{const t=await fetch(`${e.endpoint}/v1/products/wcagcheckr/baselines`,{headers:{Authorization:`Bearer ${e.token}`}});if(!t.ok)return st.warn("pull failed",{status:t.status}),[];const n=(await t.json()).items??[],o={};for(const r of n)o[r.componentId]=r.version;return await sa(o),n}catch(t){return st.debug("pull network failure",t),[]}}const gi=Z("baseline-store"),wo="componentIdAliases";async function ht(e,t){try{return await t()}catch(a){const n=a instanceof Error?a.message:String(a);throw gi.error(`baseline IDB ${e} failed: ${n}`),new rs({code:"BASELINE_DB_ERROR",message:`Baseline storage is unavailable (${e}: ${n}).`,recoverable:!1,details:n})}}async function Ma(e){return((await chrome.storage.local.get(wo))[wo]??{})[e]??e}async function id(e){const t=await Ma(e),a=await ht("get",()=>ya(t));return a?{violations:a.violations,snapshotMeta:a.snapshotMeta}:null}async function sd(e,t,a,n){const o=await Ma(e),r=await ht("get-for-set",()=>ya(o)),i=(r==null?void 0:r.seenOnUrls)??[],c=i.includes(a.url)?i:[...i,a.url];await ht("set",()=>Cn({componentId:o,violations:t,snapshotMeta:a,lastUpdated:new Date().toISOString(),axeVersion:a.axeVersion,announcements:n==null?void 0:n.announcements,focusEvents:n==null?void 0:n.focusEvents,seenOnUrls:c})),nd(o,{violations:t,snapshotMeta:a},a.axeVersion).catch(()=>{})}function cd(e,t){if(!e||!t||Qn(e)===Qn(t))return;const a=r=>{var i,c,d,l,p;return(((i=r.pseudoStates)==null?void 0:i.length)??0)*Math.max(1,((c=r.ariaVariations)==null?void 0:c.length)??0)*(((d=r.themes)==null?void 0:d.length)??0)*(((l=r.directions)==null?void 0:l.length)??0)*(((p=r.breakpoints)==null?void 0:p.length)??0)},n=a(e),o=a(t);return`Baseline was captured under a different state-matrix configuration (${n} states) than this run (${o} states). Per-state-instance deltas inflate when the matrix changes — the unique-violation deltas above are still reliable.`}async function Gn(e,t,a,n){var l;const o=await Ma(e),r=await va(o),i=await ht("compare",()=>ya(o));if(!i){const p=t.filter(u=>r.has(u.matchKey)),m=t.filter(u=>!r.has(u.matchKey));return{new:m,persistent:[],fixed:[],newCount:m.length,persistentCount:0,fixedCount:0,baselineSnapshotMeta:null,comparedAt:new Date().toISOString(),newAnnouncements:a==null?void 0:a.announcements,newFocusEvents:a==null?void 0:a.focusEvents,acknowledged:p,acknowledgedCount:p.length}}const c=os(i.violations,t,i.snapshotMeta,{baselineAnnouncements:i.announcements,currentAnnouncements:a==null?void 0:a.announcements,baselineFocusEvents:i.focusEvents,currentFocusEvents:a==null?void 0:a.focusEvents},r),d=cd((l=i.snapshotMeta)==null?void 0:l.matrixConfig,n);return d&&(c.matrixMismatchWarning=d),c}async function ld(e){const t=await Ma(e);await ht("delete",()=>or(t)),od(t).catch(()=>{})}async function Xp(){const e=await rd();for(const t of e)await Cn({componentId:t.componentId,violations:t.snapshot.violations,snapshotMeta:t.snapshot.snapshotMeta,lastUpdated:t.updatedAt,axeVersion:t.axeVersion});return e.length>0&&H({type:"SCORECARD_UPDATED_EVENT"}),e.length}async function dd(e){let t=await ht("list",()=>rr());return e!=null&&e.url&&(t=t.filter(a=>a.snapshotMeta.url===e.url)),t.map(a=>{const n=(a.focusEvents??[]).filter(l=>l.isFocusReset).length,o=(a.announcements??[]).length,r=a.violations.filter(l=>l.ruleId==="target-size").length,i=a.violations.some(l=>l.ruleId==="color-contrast"&&l.currentState.pseudoState==="hover"),c=a.violations.filter(l=>l.impact==="critical").length,d=a.violations.filter(l=>l.impact==="serious").length;return{componentId:a.componentId,violationCount:a.violations.length,lastUpdated:a.lastUpdated,seenOnUrlsCount:(a.seenOnUrls??[]).length,metrics:{criticalCount:c,seriousCount:d,focusResetCount:n,announcementCount:o,targetSizeFailCount:r,hoverContrastFail:i}}})}function Qp(){const e=[];return e.push($e("BASELINE_GET",async t=>({type:"BASELINE_GET_RESPONSE",baseline:await id(t.componentId)}))),e.push($e("BASELINE_SET",async t=>{await sd(t.componentId,t.violations,t.snapshotMeta,{announcements:t.announcements,focusEvents:t.focusEvents}),H({type:"SCORECARD_UPDATED_EVENT"})})),e.push($e("BASELINE_COMPARE",async t=>({type:"BASELINE_COMPARE_RESPONSE",delta:await Gn(t.componentId,t.currentViolations,{announcements:t.announcements,focusEvents:t.focusEvents},t.currentMatrix)}))),e.push($e("BASELINE_DELETE",async t=>{await ld(t.componentId),H({type:"SCORECARD_UPDATED_EVENT"})})),e.push($e("BASELINE_LIST",async t=>({type:"BASELINE_LIST_RESPONSE",items:await dd(t.filter)}))),gi.info("handlers registered"),()=>e.forEach(t=>t())}const ud=Z("settings-store"),vo=1,ja="__schemaVersion",ca={stateMatrix:nn,componentIdAliases:{},ignorePatterns:[]},hd=["stateMatrix","componentIdAliases","ignorePatterns","activePresetId","matrixPresets","userMode","crawlMaxPages","crawlIncludeRegex","crawlExcludeRegex","crawlRememberSettings","crawlReviewEnabled","githubRepoUrl","jiraInstanceUrl","azureDevOpsProjectUrl","gitlabProjectUrl"];async function Ye(e,t){return(await chrome.storage.local.get(e))[e]??t}async function Zp(){const e=await chrome.storage.local.get([ja,...Object.keys(ca)]);if(e[ja]===vo)return;const t={[ja]:vo};for(const[a,n]of Object.entries(ca))a in e||(t[a]=n);await chrome.storage.local.set(t),ud.info("defaults ensured")}function ef(){const e=[];return e.push($e("SETTINGS_GET",async t=>({type:"SETTINGS_RESPONSE",data:(await chrome.storage.local.get(t.key))[t.key]??ca[t.key]}))),e.push($e("SETTINGS_SET",async t=>{await chrome.storage.local.set({[t.key]:t.value})})),e.push($e("SETTINGS_GET_ALL",async()=>{const t=await chrome.storage.local.get([...hd]);return{type:"SETTINGS_RESPONSE",data:{...ca,...t}}})),()=>e.forEach(t=>t())}function _e(e){const t={capUsd:Math.max(0,e),spentUsd:0,exceeded:!1};return{state:t,canCharge(){return!t.exceeded&&t.spentUsd<t.capUsd},recordCharge(a){t.spentUsd+=Math.max(0,a),t.spentUsd>=t.capUsd&&(t.exceeded=!0)}}}const pd=Z("ai-alt-text");async function fd(e,t,a={}){var m,u;if(!t.enabled||!t.enabledChecks.altText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const n=fe(t);if(!n.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${n.reason}`]};const o=n.client,r=_e(t.costCapUsd),i=[],c=[],d=Math.max(1,t.maxCandidatesPerCheck??10),l=e.slice(0,d),p=l.length;for(let g=0;g<l.length;g++){const h=l[g];if(!r.canCharge())break;try{if((m=a.signal)!=null&&m.aborted){c.push(`canceled after ${g}/${p} candidates`);break}const f=await o.judgeAltText({imageUrl:h.imageUrl,alt:h.alt,surroundingContext:h.surroundingContext,signal:a.signal});r.recordCharge(f.costUsd),(f.verdict==="fail"||f.verdict==="uncertain"&&f.confidence<.6)&&i.push(await gd(h,f))}catch(f){if(f instanceof Error&&(f.name==="AbortError"||f.name==="ExternalAbortError")){c.push(`canceled after ${g}/${p} candidates`);break}const b=f instanceof Error?f.message:String(f);c.push(`${h.selector}: ${b}`),pd.warn("alt-text judgment failed",f)}(u=a.onProgress)==null||u.call(a,g+1,p)}return{findings:i,totalCostUsd:r.state.spentUsd,capExceeded:r.state.exceeded,errors:c}}async function gd(e,t){const a=t.verdict==="uncertain"?"ai-alt-uncertain":"ai-alt-misleading",n={selector:e.selector,outerHTML:e.outerHTML.slice(0,500),failureSummary:`AI assessment: ${t.reasoning}`,tagName:"IMG",role:null,accessibleName:e.alt,textSnippet:null,attrId:null,attrTestid:null},o=await xn({ruleId:a,componentId:e.componentId,currentState:e.currentState,target:n}),r=t.verdict==="uncertain";return{ruleId:a,wcagCriterion:"1.1.1",wcagLevel:"A",impact:r?"minor":"serious",description:r?"AI couldn't verify whether this alt text is appropriate — flag for human review.":"AI judged the alt text to be misleading, generic, or otherwise inappropriate.",helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html",target:n,componentId:e.componentId,currentState:e.currentState,axeVersion:e.axeVersion,detectedAt:new Date().toISOString(),matchKey:o,ai:{reasoning:t.reasoning,confidence:t.confidence,model:t.model,costUsd:t.costUsd},...r?{needsReview:!0}:{}}}const kt=Z("interactive-audit"),md="1.3",bd={Tab:{key:"Tab",code:"Tab",windowsVirtualKeyCode:9},Enter:{key:"Enter",code:"Enter",windowsVirtualKeyCode:13},Escape:{key:"Escape",code:"Escape",windowsVirtualKeyCode:27},Space:{key:" ",code:"Space",windowsVirtualKeyCode:32},ArrowLeft:{key:"ArrowLeft",code:"ArrowLeft",windowsVirtualKeyCode:37},ArrowUp:{key:"ArrowUp",code:"ArrowUp",windowsVirtualKeyCode:38},ArrowRight:{key:"ArrowRight",code:"ArrowRight",windowsVirtualKeyCode:39},ArrowDown:{key:"ArrowDown",code:"ArrowDown",windowsVirtualKeyCode:40},Home:{key:"Home",code:"Home",windowsVirtualKeyCode:36},End:{key:"End",code:"End",windowsVirtualKeyCode:35}};class Vn{constructor(t){Wt(this,"session");Wt(this,"attached",!1);Wt(this,"steps",[]);this.tabId=t,this.session=new si({tabId:t})}async attach(){if(!this.attached)try{await chrome.debugger.attach({tabId:this.tabId},md),await this.session.send("Runtime.enable"),await this.session.send("Page.enable"),await this.session.send("DOM.enable"),await this.session.send("DOM.getDocument",{depth:-1,pierce:!0}),await this.session.send("Accessibility.enable"),this.attached=!0}catch(t){throw kt.error("attach failed",t),ci(t)}}async dispose(){if(this.attached){try{await chrome.debugger.detach({tabId:this.tabId})}catch(t){kt.debug("detach soft-failure",t)}this.attached=!1}}async pressKey(t,a){const n=bd[t];if(!n)throw new Error(`Unknown key: ${String(t)}`);const o=a!=null&&a.shift?8:0;await this.session.send("Input.dispatchKeyEvent",{type:"rawKeyDown",key:n.key,code:n.code,windowsVirtualKeyCode:n.windowsVirtualKeyCode,modifiers:o}),await this.session.send("Input.dispatchKeyEvent",{type:"keyUp",key:n.key,code:n.code,windowsVirtualKeyCode:n.windowsVirtualKeyCode,modifiers:o}),await Ao(50)}async pressKeyN(t,a,n){for(let o=0;o<a;o++)await this.pressKey(t,n)}async typeText(t){await this.session.send("Input.insertText",{text:t}),await Ao(50)}async countFocusables(){var a;const t=`(() => {
742
+ }`}function Dl(e,t,a){var c;const n=((c=e.content.find(d=>d.type==="text"))==null?void 0:c.text)??"",r=n.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/),i=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;if(!r)return{verdict:"uncertain",reasoning:n||"AI returned no parseable response.",costUsd:i,model:e.model||a};try{const d=JSON.parse(r[0]);return{verdict:d.verdict==="pass"||d.verdict==="fail"?d.verdict:"uncertain",reasoning:typeof d.reasoning=="string"&&d.reasoning?d.reasoning:"AI returned no rationale.",costUsd:i,model:e.model||a}}catch{return{verdict:"uncertain",reasoning:n,costUsd:i,model:e.model||a}}}function Nl(e,t){var i;const a=((i=e.content.find(c=>c.type==="text"))==null?void 0:i.text)??"",o=a.replace(/```(?:json)?/g,"").trim().match(/\{[\s\S]*\}/),r=e.usage.input_tokens*t.input+e.usage.output_tokens*t.output;if(!o)return{lead:"",body:a||"Summary generation failed.",closer:"",costUsd:r,model:e.model};try{const c=JSON.parse(o[0]);return{lead:typeof c.lead=="string"?c.lead:"",body:typeof c.body=="string"?c.body:"",closer:typeof c.closer=="string"?c.closer:"",costUsd:r,model:e.model}}catch{return{lead:"",body:a,closer:"",costUsd:r,model:e.model}}}function fe(e){if(!e.enabled)return{ok:!1,reason:"AI augmentation is disabled in settings"};if(!e.apiKey)return{ok:!1,reason:"No API key configured"};switch(e.provider){case"anthropic":return{ok:!0,client:yl({apiKey:e.apiKey,model:e.model})};case"openai":return{ok:!1,reason:"OpenAI provider not yet implemented"};case"gemini":return{ok:!1,reason:"Gemini provider not yet implemented"};default:return{ok:!1,reason:`Unknown provider: ${e.provider}`}}}const At=Z("consistency-ai-suppression");async function Ll(e,t={}){var p;if(e.length===0)return{emitted:[],suppressed:0,uncertain:0,apiCalls:0};const a=await pe();if(!he(a,"aiConsistencySuppression"))return{emitted:e,suppressed:0,uncertain:0,apiCalls:0};let n;try{const m=await chrome.storage.local.get("aiConfig");n=ke(m.aiConfig)}catch{return At.debug("aiConfig load failed; emitting heuristic findings unchanged"),{emitted:e,suppressed:0,uncertain:0,apiCalls:0}}const o=fe(n);if(!o.ok)return At.info(`AI client unavailable (${o.reason}); emitting heuristic findings unchanged`),{emitted:e,suppressed:0,uncertain:0,apiCalls:0};const r=o.client;if(typeof r.judgeConsistencyDivergence!="function")return At.info("AI client does not support judgeConsistencyDivergence; emitting heuristic findings unchanged"),{emitted:e,suppressed:0,uncertain:0,apiCalls:0};const i=[];let c=0,d=0,l=0;for(const m of e){if((p=t.signal)!=null&&p.aborted){i.push(m);continue}try{const u=await r.judgeConsistencyDivergence({wcagCriterion:m.wcagCriterion,ruleId:m.ruleId,description:m.description,details:m.details,pages:m.pages,signal:t.signal});if(l++,u.verdict==="pass"){c++;continue}if(u.verdict==="fail"){i.push({...m,aiVerdict:{verdict:"real-divergence",confidence:u.confidence??0,reasoning:u.reasoning??""}});continue}d++,i.push({...m,aiVerdict:{verdict:"uncertain",confidence:u.confidence??0,reasoning:u.reasoning??""}})}catch(u){At.warn(`AI suppression failed for ${m.ruleId} ${m.wcagCriterion}: ${u instanceof Error?u.message:String(u)}`),i.push(m)}}return At.info(`consistency AI suppression: ${l} API calls, ${c} false-positives suppressed, ${d} uncertain, ${i.length} emitted`),{emitted:i,suppressed:c,uncertain:d,apiCalls:l}}const zp=3,ei=["default","hover","focus","focus-visible","active","disabled"],ti=["light","dark","forced-colors-active","forced-colors-none"],ai=["desktop","mobile","tablet"],ni="ltr",Kp={pseudoStates:[...ei],ariaVariations:[],themes:[...ti],directions:[ni],breakpoints:[...ai],breakpointPresets:cs};function Pl(e){const t=[],a=e.stateMatrix??{},n=(c,d)=>d.filter(l=>!(Array.isArray(c)&&c.includes(l))),o=n(a.pseudoStates,ei);o.length&&t.push(`missing pseudo-states: ${o.join(", ")}`);const r=n(a.themes,ti);r.length&&t.push(`missing themes: ${r.join(", ")}`);const i=n(a.breakpoints,ai);return i.length&&t.push(`missing breakpoints: ${i.join(", ")}`),Array.isArray(a.directions)&&a.directions.includes(ni)||t.push("LTR direction not enabled"),e.aiEnabled||t.push("AI checks off (an AI key is required for the criteria axe-core cannot cover)"),t}async function _n(e){var w;let t={},a=1,n={};try{if(typeof chrome<"u"&&((w=chrome.storage)!=null&&w.local)){const b=await chrome.storage.local.get(["stateMatrix","runsPerState","aiConfig"]);t=b.stateMatrix??{},a=b.runsPerState,n=b.aiConfig??{}}}catch{}const o=(b,k)=>Array.isArray(b)&&b.length>0?b:k,r=o(t.pseudoStates,["default"]),i=o(t.themes,["light"]),c=o(t.directions,["ltr"]),d=o(t.breakpoints,["desktop"]),l=Array.isArray(t.ariaVariations)?t.ariaVariations.length:0,p=r.length*i.length*c.length*d.length*Math.max(l,1),m=typeof a=="number"&&a>0?a:1,u=!!n.enabled&&!!n.apiKey,g=n.enabledChecks,h=u&&g?Object.values(g).filter(Boolean).length:0,f=Pl({stateMatrix:{pseudoStates:r,themes:i,directions:c,breakpoints:d,ariaVariations:[]},aiEnabled:u});return{stateCount:p,pseudoStates:r,themes:i,directions:c,breakpoints:d,ariaVariations:l,runsPerState:m,aiEnabled:u,aiCheckCount:h,wcagTarget:"WCAG 2.1 AA",isConformance:f.length===0,conformanceGaps:f,capturedAt:e}}function oi(e){return e?`${((a,n)=>`${a} ${n}${a===1?"":"s"}`)(e.stateCount,"UI state")} (${e.pseudoStates.length} pseudo × ${e.themes.length} theme${e.themes.length===1?"":"s"} × ${e.directions.length} dir × ${e.breakpoints.length} breakpoint${e.breakpoints.length===1?"":"s"}${e.ariaVariations?` × ${e.ariaVariations} ARIA`:""}) · each screen re-checked until results stabilized · AI ${e.aiEnabled?`ON (${e.aiCheckCount} checks)`:"OFF"} · ${e.wcagTarget}`:"Audit settings: not recorded."}function ri(e){return e?e.isConformance?null:`Quick check — NOT a Full 2.1 AA audit${e.conformanceGaps.length?` (${e.conformanceGaps.join("; ")})`:""}. This grade reflects a LIMITED run and is not a conformance result; run the Full 2.1 AA audit before relying on it.`:"Audit settings were not recorded — treat this grade as unverified."}function Fl(e){const t=new Map(e.breakpointPresets.map(n=>[n.id,n])),a=[];for(const n of e.breakpoints){const o=t.get(n);if(o)for(const r of e.directions)for(const i of e.themes){const c=e.ariaVariations.length===0?[null]:e.ariaVariations;for(const d of c)for(const l of e.pseudoStates)a.push({pseudoState:l,ariaVariation:d,theme:i,direction:r,breakpoint:o})}}return a}const ii=["color-contrast","color-contrast-enhanced","link-in-text-block"],_l=["image-alt","input-image-alt","area-alt","svg-img-alt","object-alt","role-img-alt","label","select-name","aria-input-field-name","aria-toggle-field-name","form-field-multiple-labels","autocomplete-valid","label-content-name-mismatch","label-title-only","button-name","input-button-name","link-name","empty-button","empty-heading","empty-link","frame-title","heading-order","page-has-heading-one","landmark-one-main","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","landmark-unique","landmark-banner-is-top-level","landmark-complementary-is-top-level","landmark-contentinfo-is-top-level","landmark-main-is-top-level","region","bypass","empty-table-header","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","aria-allowed-role","aria-prohibited-attr","presentation-role-conflict","aria-text","aria-deprecated-role","aria-conditional-attr","aria-braille-equivalent","html-has-lang","html-lang-valid","html-xml-lang-mismatch","valid-lang","nested-interactive","tabindex","frame-focusable-content","no-focusable-content","focus-order-semantics","meta-viewport","meta-refresh","duplicate-id","duplicate-id-active","duplicate-id-aria","video-caption","audio-caption","table-fake-caption","scope-attr-valid","th-has-data-cells","td-headers-attr"];{const e=new Set(ii),t=_l.filter(a=>e.has(a));t.length>0&&console.error("axe-rule-classification: rule(s) classified as BOTH state-dependent and markup-eligible:",t)}const Ul=Z("chrome-api"),Wl="1.3",bo=3e4;class Gl extends Error{constructor(t,a){super(`CDP ${t} timed out after ${a}ms`),this.method=t,this.timeoutMs=a,this.name="CdpTimeoutError"}}class si{constructor(t){this.target=t}async attach(){await chrome.debugger.attach(this.target,Wl)}async detach(){try{await chrome.debugger.detach(this.target)}catch(t){Ul.debug("detach soft-failure",t)}}async send(t,a){const n=chrome.debugger.sendCommand(this.target,t,a);let o;const r=new Promise((i,c)=>{o=setTimeout(()=>c(new Gl(t,bo)),bo)});try{return await Promise.race([n,r])}finally{o!==void 0&&clearTimeout(o)}}}function Vl(e){const t=e instanceof Error?e.message:String(e);return/Another debugger is already attached|Cannot attach to/i.test(t)}function ci(e){const t=e instanceof Error?e.message:String(e);return Vl(e)?Xn("DEBUGGER_BUSY","DevTools is open on this tab. Close it to run the audit.",!0,{raw:t}):Xn("STATE_DRIVE_FAILED",t,!1)}function jl(e){const t=(a,n)=>e(a,n);return chrome.debugger.onDetach.addListener(t),()=>chrome.debugger.onDetach.removeListener(t)}const we=Z("state-driver"),Bl=60*1e3,Ve=new Map,ia=new Map,gt=new Map,ut=new Map,Hl='button, a[href], input, textarea, select, summary, [tabindex]:not([tabindex="-1"]), [role="button"], [role="link"], [role="checkbox"], [role="radio"], [role="tab"], [role="menuitem"], [role="switch"], [role="combobox"], [role="option"]',Mt=new Map,ql={default:[],hover:["hover"],focus:["focus"],"focus-visible":["focus","focus-visible"],active:["active"],disabled:[]};async function li(e){let t=Ve.get(e);if(!t){t=new si({tabId:e});try{await t.attach(),await t.send("Runtime.enable"),await t.send("Page.enable"),await t.send("DOM.enable"),await t.send("DOM.getDocument",{depth:-1,pierce:!0}),await t.send("CSS.enable")}catch(a){try{await t.detach()}catch{}throw a}Ve.set(e,t),gt.set(e,new Map),zl(e),we.info("attached",{tabId:e})}return Yl(e),t}function zl(e){const t=(a,n,o)=>{var i,c;if(a.tabId!==e)return;const r=gt.get(e);if(r)if(n==="Runtime.executionContextCreated"){const d=o,l=d==null?void 0:d.context;l&&((i=l.auxData)!=null&&i.isDefault)&&((c=l.auxData)!=null&&c.frameId)&&r.set(l.auxData.frameId,l.id)}else if(n==="Runtime.executionContextDestroyed"){const d=o,l=d==null?void 0:d.executionContextId;if(l!==void 0)for(const[p,m]of r.entries())m===l&&r.delete(p)}else n==="Runtime.executionContextsCleared"&&r.clear()};chrome.debugger.onEvent.addListener(t)}async function Kl(e){const t=Ve.get(e);if(Ve.delete(e),gt.delete(e),ut.delete(e),Mt.delete(e),t)try{await t.detach()}catch{}}function Yl(e){const t=ia.get(e);t&&clearTimeout(t),ia.set(e,setTimeout(()=>{Oa(e).catch(a=>we.warn("idle detach failed",a))},Bl))}async function Oa(e){const t=Ve.get(e);t&&(await t.detach(),Ve.delete(e)),gt.delete(e),ut.delete(e),Mt.delete(e);const a=ia.get(e);a&&(clearTimeout(a),ia.delete(e))}function di(e){const t=[{id:e.frame.id,url:e.frame.url}];for(const a of e.childFrames??[])t.push(...di(a));return t}async function Jl(e,t,a){var r;if(!a||a===0)return;const n=gt.get(t);if(!n)return;let o;try{o=(r=(await chrome.scripting.executeScript({target:{tabId:t,frameIds:[a]},func:()=>location.href}))[0])==null?void 0:r.result}catch(i){we.debug("frame URL lookup failed",i)}try{const i=await e.send("Page.getFrameTree"),c=di(i.frameTree);if(o){const p=c.find(m=>m.url===o);if(p){const m=n.get(p.id);if(m!==void 0)return m}}const d=i.frameTree.frame.id,l=c.find(p=>p.id!==d);return l?n.get(l.id):void 0}catch(i){we.warn("Page.getFrameTree failed",i);return}}async function Xl(e,t,a){var i;const n={expression:`document.querySelector(${JSON.stringify(t)})`,objectGroup:"wcag-auditor",returnByValue:!1};a!==void 0&&(n.contextId=a);const r=(i=(await e.send("Runtime.evaluate",n)).result)==null?void 0:i.objectId;if(!r)return null;try{return(await e.send("DOM.requestNode",{objectId:r})).nodeId??null}finally{e.send("Runtime.releaseObject",{objectId:r}).catch(()=>{})}}async function ui(e){const t=ut.get(e);if(!t||t.length===0)return;const a=Ve.get(e);if(a){for(const n of t)try{await a.send("CSS.forcePseudoState",{nodeId:n,forcedPseudoClasses:[]})}catch(o){we.debug("forcePseudoState clear failed (node may be gone)",o)}ut.delete(e)}}async function Ql(e,t){try{return(await e.send("DOM.querySelectorAll",{nodeId:t,selector:Hl})).nodeIds??[]}catch(a){return we.debug("querySelectorAll for interactive descendants failed",a),[]}}async function mn(e,t,a,n){await chrome.scripting.executeScript({target:Un(e,t),func:(o,r)=>{const i=document.querySelector(o);i&&(r?i.setAttribute("disabled",""):i.removeAttribute("disabled"))},args:[a,n]})}async function hi(e,t){await chrome.scripting.executeScript({target:Un(e,t),func:()=>{const a=document.activeElement;a&&typeof a.blur=="function"&&a.blur()}})}async function pi(e,t){await chrome.scripting.executeScript({target:{tabId:e,frameIds:[0]},func:a=>{document.documentElement.setAttribute("dir",a)},args:[t]})}async function Zl(e,t,a,n){await chrome.scripting.executeScript({target:Un(e,t),func:(o,r)=>{const i=document.querySelector(o);if(i)for(const[c,d]of Object.entries(r))i.setAttribute(c,d)},args:[a,n]})}function Un(e,t){return t!==void 0&&t!==0?{tabId:e,frameIds:[t]}:{tabId:e}}async function ed(e,t,a,n){const o=await li(e),r=Mt.get(e),i=(r==null?void 0:r.scope)===a&&(r==null?void 0:r.frameId)===n,c=t.ariaVariation?JSON.stringify(t.ariaVariation.attributes):"",d=!i||(r==null?void 0:r.pseudoState)!==t.pseudoState,l=!r||r.theme!==t.theme,p=!r||r.direction!==t.direction,m=!r||r.breakpointId!==t.breakpoint.id,u=!i||(r==null?void 0:r.ariaVariationKey)!==c;if(d&&(await ui(e),a)){t.pseudoState==="disabled"?await mn(e,n,a,!0):(await mn(e,n,a,!1),await hi(e,n));const g=ql[t.pseudoState];if(g.length>0){const h=await Jl(o,e,n),f=await Xl(o,a,h);if(f!==null){const w=await Ql(o,f),b=[f,...w];for(const k of b)try{await o.send("CSS.forcePseudoState",{nodeId:k,forcedPseudoClasses:g})}catch(v){we.debug(`CSS.forcePseudoState failed for nodeId=${k}`,v)}ut.set(e,b),we.debug(`forced :${t.pseudoState} on ${b.length} node(s)`)}else we.debug(`could not resolve nodeId for ${a} (frameId=${n})`)}}if(l){const g=[{name:"prefers-reduced-motion",value:"reduce"}];t.theme==="dark"?(g.push({name:"prefers-color-scheme",value:"dark"}),g.push({name:"forced-colors",value:"none"})):t.theme==="light"?(g.push({name:"prefers-color-scheme",value:"light"}),g.push({name:"forced-colors",value:"none"})):t.theme==="forced-colors-active"?g.push({name:"forced-colors",value:"active"}):t.theme==="forced-colors-none"&&g.push({name:"forced-colors",value:"none"}),await o.send("Emulation.setEmulatedMedia",{features:g}),await new Promise(h=>setTimeout(h,50))}p&&await pi(e,t.direction),m&&await o.send("Emulation.setDeviceMetricsOverride",{width:t.breakpoint.width,height:t.breakpoint.height,deviceScaleFactor:t.breakpoint.deviceScaleFactor,mobile:t.breakpoint.mobile}),u&&t.ariaVariation&&a&&await Zl(e,n,a,t.ariaVariation.attributes),Mt.set(e,{scope:a,frameId:n,pseudoState:t.pseudoState,theme:t.theme,direction:t.direction,breakpointId:t.breakpoint.id,ariaVariationKey:c})}async function td(e,t,a){const n=Ve.get(e);if(n){if(await ui(e),Mt.delete(e),t)try{await mn(e,a,t,!1),await hi(e,a),await pi(e,"ltr")}catch(o){we.warn("element-level reset partial failure",o)}try{await n.send("Emulation.setEmulatedMedia",{features:[]}),await n.send("Emulation.clearDeviceMetricsOverride")}catch(o){we.warn("reset partial failure",o)}await Oa(e)}}async function bn(e,t,a,n){try{return await ed(e,t,a,n),H({type:"STATE_CHANGED_EVENT",tabId:e,currentState:t}),{type:"STATE_DRIVE_RESPONSE",success:!0,appliedState:t}}catch(o){return we.error("state drive failed",o),await Kl(e),{type:"STATE_DRIVE_RESPONSE",success:!1,error:ci(o)}}}async function Yt(e,t,a){await td(e,t,a)}async function Yp(e){await Oa(e);try{await chrome.debugger.detach({tabId:e})}catch{}}async function ad(e,t={}){try{const a=await li(e),n={format:"jpeg",quality:t.quality??75};t.fullPage&&(n.captureBeyondViewport=!0);const o=await a.send("Page.captureScreenshot",n);return o!=null&&o.data?`data:image/jpeg;base64,${o.data}`:null}catch(a){return we.debug("Page.captureScreenshot failed",a),null}}function Jp(){var a;const e=[];if(e.push($e("STATE_DRIVE_REQUEST",n=>bn(n.tabId,n.state,n.scope,n.frameId))),e.push($e("STATE_RESET_REQUEST",n=>Yt(n.tabId))),(a=chrome.tabs)!=null&&a.onRemoved){const n=o=>{Oa(o).catch(()=>{})};chrome.tabs.onRemoved.addListener(n),e.push(()=>chrome.tabs.onRemoved.removeListener(n))}const t=jl((n,o)=>{n.tabId!==void 0&&(Ve.delete(n.tabId),gt.delete(n.tabId),ut.delete(n.tabId),we.warn("unexpected detach",{tabId:n.tabId,reason:o}))});return e.push(t),we.info("handlers registered"),()=>e.forEach(n=>n())}const st=Z("cloud-sync"),yo="cloudSyncEnabled",Ga="cloudSyncEndpoint",Va="licenseToken",yn="cloudSyncVersionCache";async function Wn(){try{const e=await pe();if(!he(e,"cloudSync"))return null;const t=await chrome.storage.local.get([yo,Ga,Va]),a=t[yo]===!0,n=typeof t[Ga]=="string"?t[Ga]:"",o=typeof t[Va]=="string"?t[Va]:"";return!a||!n||!o?null:{endpoint:n.replace(/\/$/,""),token:o,enabled:a}}catch{return null}}async function fi(){try{const t=(await chrome.storage.local.get(yn))[yn];return t&&typeof t=="object"?t:{}}catch{return{}}}async function sa(e){try{await chrome.storage.local.set({[yn]:e})}catch{}}async function nd(e,t,a){const n=await Wn();if(!n)return!1;const o=await fi(),r=o[e];try{const i=`${n.endpoint}/v1/products/wcagcheckr/baselines/${encodeURIComponent(e)}`,c=await fetch(i,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify({snapshot:t,axeVersion:a,expectedVersion:r})});if(c.status===409)return st.warn(`baseline ${e} version conflict on push`,{expectedVersion:r}),delete o[e],await sa(o),!1;if(!c.ok)return st.warn("baseline push failed",{status:c.status}),!1;const d=await c.json();return typeof d.version=="number"&&(o[e]=d.version,await sa(o)),!0}catch(i){return st.debug("push network failure (offline?)",i),!1}}async function od(e){const t=await Wn();if(!t)return!1;try{const a=`${t.endpoint}/v1/products/wcagcheckr/baselines/${encodeURIComponent(e)}`,n=await fetch(a,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`}});if(n.ok){const o=await fi();delete o[e],await sa(o)}return n.ok}catch(a){return st.debug("delete network failure",a),!1}}async function rd(){const e=await Wn();if(!e)return[];try{const t=await fetch(`${e.endpoint}/v1/products/wcagcheckr/baselines`,{headers:{Authorization:`Bearer ${e.token}`}});if(!t.ok)return st.warn("pull failed",{status:t.status}),[];const n=(await t.json()).items??[],o={};for(const r of n)o[r.componentId]=r.version;return await sa(o),n}catch(t){return st.debug("pull network failure",t),[]}}const gi=Z("baseline-store"),wo="componentIdAliases";async function ht(e,t){try{return await t()}catch(a){const n=a instanceof Error?a.message:String(a);throw gi.error(`baseline IDB ${e} failed: ${n}`),new rs({code:"BASELINE_DB_ERROR",message:`Baseline storage is unavailable (${e}: ${n}).`,recoverable:!1,details:n})}}async function Ma(e){return((await chrome.storage.local.get(wo))[wo]??{})[e]??e}async function id(e){const t=await Ma(e),a=await ht("get",()=>ya(t));return a?{violations:a.violations,snapshotMeta:a.snapshotMeta}:null}async function sd(e,t,a,n){const o=await Ma(e),r=await ht("get-for-set",()=>ya(o)),i=(r==null?void 0:r.seenOnUrls)??[],c=i.includes(a.url)?i:[...i,a.url];await ht("set",()=>Cn({componentId:o,violations:t,snapshotMeta:a,lastUpdated:new Date().toISOString(),axeVersion:a.axeVersion,announcements:n==null?void 0:n.announcements,focusEvents:n==null?void 0:n.focusEvents,seenOnUrls:c})),nd(o,{violations:t,snapshotMeta:a},a.axeVersion).catch(()=>{})}function cd(e,t){if(!e||!t||Qn(e)===Qn(t))return;const a=r=>{var i,c,d,l,p;return(((i=r.pseudoStates)==null?void 0:i.length)??0)*Math.max(1,((c=r.ariaVariations)==null?void 0:c.length)??0)*(((d=r.themes)==null?void 0:d.length)??0)*(((l=r.directions)==null?void 0:l.length)??0)*(((p=r.breakpoints)==null?void 0:p.length)??0)},n=a(e),o=a(t);return`Baseline was captured under a different state-matrix configuration (${n} states) than this run (${o} states). Per-state-instance deltas inflate when the matrix changes — the unique-violation deltas above are still reliable.`}async function Gn(e,t,a,n){var l;const o=await Ma(e),r=await va(o),i=await ht("compare",()=>ya(o));if(!i){const p=t.filter(u=>r.has(u.matchKey)),m=t.filter(u=>!r.has(u.matchKey));return{new:m,persistent:[],fixed:[],newCount:m.length,persistentCount:0,fixedCount:0,baselineSnapshotMeta:null,comparedAt:new Date().toISOString(),newAnnouncements:a==null?void 0:a.announcements,newFocusEvents:a==null?void 0:a.focusEvents,acknowledged:p,acknowledgedCount:p.length}}const c=os(i.violations,t,i.snapshotMeta,{baselineAnnouncements:i.announcements,currentAnnouncements:a==null?void 0:a.announcements,baselineFocusEvents:i.focusEvents,currentFocusEvents:a==null?void 0:a.focusEvents},r),d=cd((l=i.snapshotMeta)==null?void 0:l.matrixConfig,n);return d&&(c.matrixMismatchWarning=d),c}async function ld(e){const t=await Ma(e);await ht("delete",()=>or(t)),od(t).catch(()=>{})}async function Xp(){const e=await rd();for(const t of e)await Cn({componentId:t.componentId,violations:t.snapshot.violations,snapshotMeta:t.snapshot.snapshotMeta,lastUpdated:t.updatedAt,axeVersion:t.axeVersion});return e.length>0&&H({type:"SCORECARD_UPDATED_EVENT"}),e.length}async function dd(e){let t=await ht("list",()=>rr());return e!=null&&e.url&&(t=t.filter(a=>a.snapshotMeta.url===e.url)),t.map(a=>{const n=(a.focusEvents??[]).filter(l=>l.isFocusReset).length,o=(a.announcements??[]).length,r=a.violations.filter(l=>l.ruleId==="target-size").length,i=a.violations.some(l=>l.ruleId==="color-contrast"&&l.currentState.pseudoState==="hover"),c=a.violations.filter(l=>l.impact==="critical").length,d=a.violations.filter(l=>l.impact==="serious").length;return{componentId:a.componentId,violationCount:a.violations.length,lastUpdated:a.lastUpdated,seenOnUrlsCount:(a.seenOnUrls??[]).length,metrics:{criticalCount:c,seriousCount:d,focusResetCount:n,announcementCount:o,targetSizeFailCount:r,hoverContrastFail:i}}})}function Qp(){const e=[];return e.push($e("BASELINE_GET",async t=>({type:"BASELINE_GET_RESPONSE",baseline:await id(t.componentId)}))),e.push($e("BASELINE_SET",async t=>{await sd(t.componentId,t.violations,t.snapshotMeta,{announcements:t.announcements,focusEvents:t.focusEvents}),H({type:"SCORECARD_UPDATED_EVENT"})})),e.push($e("BASELINE_COMPARE",async t=>({type:"BASELINE_COMPARE_RESPONSE",delta:await Gn(t.componentId,t.currentViolations,{announcements:t.announcements,focusEvents:t.focusEvents},t.currentMatrix)}))),e.push($e("BASELINE_DELETE",async t=>{await ld(t.componentId),H({type:"SCORECARD_UPDATED_EVENT"})})),e.push($e("BASELINE_LIST",async t=>({type:"BASELINE_LIST_RESPONSE",items:await dd(t.filter)}))),gi.info("handlers registered"),()=>e.forEach(t=>t())}const ud=Z("settings-store"),vo=1,ja="__schemaVersion",ca={stateMatrix:nn,componentIdAliases:{},ignorePatterns:[]},hd=["stateMatrix","componentIdAliases","ignorePatterns","activePresetId","matrixPresets","userMode","crawlMaxPages","crawlIncludeRegex","crawlExcludeRegex","crawlRememberSettings","crawlReviewEnabled","githubRepoUrl","jiraInstanceUrl","azureDevOpsProjectUrl","gitlabProjectUrl"];async function Ye(e,t){return(await chrome.storage.local.get(e))[e]??t}async function Zp(){const e=await chrome.storage.local.get([ja,...Object.keys(ca)]);if(e[ja]===vo)return;const t={[ja]:vo};for(const[a,n]of Object.entries(ca))a in e||(t[a]=n);await chrome.storage.local.set(t),ud.info("defaults ensured")}function ef(){const e=[];return e.push($e("SETTINGS_GET",async t=>({type:"SETTINGS_RESPONSE",data:(await chrome.storage.local.get(t.key))[t.key]??ca[t.key]}))),e.push($e("SETTINGS_SET",async t=>{await chrome.storage.local.set({[t.key]:t.value})})),e.push($e("SETTINGS_GET_ALL",async()=>{const t=await chrome.storage.local.get([...hd]);return{type:"SETTINGS_RESPONSE",data:{...ca,...t}}})),()=>e.forEach(t=>t())}function _e(e){const t={capUsd:Math.max(0,e),spentUsd:0,exceeded:!1};return{state:t,canCharge(){return!t.exceeded&&t.spentUsd<t.capUsd},recordCharge(a){t.spentUsd+=Math.max(0,a),t.spentUsd>=t.capUsd&&(t.exceeded=!0)}}}const pd=Z("ai-alt-text");async function fd(e,t,a={}){var m,u;if(!t.enabled||!t.enabledChecks.altText)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[]};const n=fe(t);if(!n.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${n.reason}`]};const o=n.client,r=_e(t.costCapUsd),i=[],c=[],d=Math.max(1,t.maxCandidatesPerCheck??10),l=e.slice(0,d),p=l.length;for(let g=0;g<l.length;g++){const h=l[g];if(!r.canCharge())break;try{if((m=a.signal)!=null&&m.aborted){c.push(`canceled after ${g}/${p} candidates`);break}const f=await o.judgeAltText({imageUrl:h.imageUrl,alt:h.alt,surroundingContext:h.surroundingContext,signal:a.signal});r.recordCharge(f.costUsd),(f.verdict==="fail"||f.verdict==="uncertain"&&f.confidence<.6)&&i.push(await gd(h,f))}catch(f){if(f instanceof Error&&(f.name==="AbortError"||f.name==="ExternalAbortError")){c.push(`canceled after ${g}/${p} candidates`);break}const b=f instanceof Error?f.message:String(f);c.push(`${h.selector}: ${b}`),pd.warn("alt-text judgment failed",f)}(u=a.onProgress)==null||u.call(a,g+1,p)}return{findings:i,totalCostUsd:r.state.spentUsd,capExceeded:r.state.exceeded,errors:c}}async function gd(e,t){const a=t.verdict==="uncertain"?"ai-alt-uncertain":"ai-alt-misleading",n=e.alt?`“${e.alt}”`:"(empty / missing alt)",o=t.unverifiable?`This image is a format automated tools can't read (e.g. SVG). Nothing is wrong that we can see — a human just has to confirm the alt text is right. Its alt text is: ${n}. Verify that accurately describes what the image shows or does.`:`AI assessment: ${t.reasoning}`,r={selector:e.selector,outerHTML:e.outerHTML.slice(0,500),failureSummary:o,tagName:"IMG",role:null,accessibleName:e.alt,textSnippet:null,attrId:null,attrTestid:null},i=await xn({ruleId:a,componentId:e.componentId,currentState:e.currentState,target:r}),c=t.verdict==="uncertain";return{ruleId:a,wcagCriterion:"1.1.1",wcagLevel:"A",impact:c?"minor":"serious",description:t.unverifiable?"Automated tools can't read this image's format (e.g. SVG) — a human needs to confirm its alt text is appropriate.":c?"AI couldn't verify whether this alt text is appropriate — flag for human review.":"AI judged the alt text to be misleading, generic, or otherwise inappropriate.",helpUrl:"https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html",target:r,componentId:e.componentId,currentState:e.currentState,axeVersion:e.axeVersion,detectedAt:new Date().toISOString(),matchKey:i,ai:{reasoning:t.reasoning,confidence:t.confidence,model:t.model,costUsd:t.costUsd},...c?{needsReview:!0}:{}}}const kt=Z("interactive-audit"),md="1.3",bd={Tab:{key:"Tab",code:"Tab",windowsVirtualKeyCode:9},Enter:{key:"Enter",code:"Enter",windowsVirtualKeyCode:13},Escape:{key:"Escape",code:"Escape",windowsVirtualKeyCode:27},Space:{key:" ",code:"Space",windowsVirtualKeyCode:32},ArrowLeft:{key:"ArrowLeft",code:"ArrowLeft",windowsVirtualKeyCode:37},ArrowUp:{key:"ArrowUp",code:"ArrowUp",windowsVirtualKeyCode:38},ArrowRight:{key:"ArrowRight",code:"ArrowRight",windowsVirtualKeyCode:39},ArrowDown:{key:"ArrowDown",code:"ArrowDown",windowsVirtualKeyCode:40},Home:{key:"Home",code:"Home",windowsVirtualKeyCode:36},End:{key:"End",code:"End",windowsVirtualKeyCode:35}};class Vn{constructor(t){Wt(this,"session");Wt(this,"attached",!1);Wt(this,"steps",[]);this.tabId=t,this.session=new si({tabId:t})}async attach(){if(!this.attached)try{await chrome.debugger.attach({tabId:this.tabId},md),await this.session.send("Runtime.enable"),await this.session.send("Page.enable"),await this.session.send("DOM.enable"),await this.session.send("DOM.getDocument",{depth:-1,pierce:!0}),await this.session.send("Accessibility.enable"),this.attached=!0}catch(t){throw kt.error("attach failed",t),ci(t)}}async dispose(){if(this.attached){try{await chrome.debugger.detach({tabId:this.tabId})}catch(t){kt.debug("detach soft-failure",t)}this.attached=!1}}async pressKey(t,a){const n=bd[t];if(!n)throw new Error(`Unknown key: ${String(t)}`);const o=a!=null&&a.shift?8:0;await this.session.send("Input.dispatchKeyEvent",{type:"rawKeyDown",key:n.key,code:n.code,windowsVirtualKeyCode:n.windowsVirtualKeyCode,modifiers:o}),await this.session.send("Input.dispatchKeyEvent",{type:"keyUp",key:n.key,code:n.code,windowsVirtualKeyCode:n.windowsVirtualKeyCode,modifiers:o}),await Ao(50)}async pressKeyN(t,a,n){for(let o=0;o<a;o++)await this.pressKey(t,n)}async typeText(t){await this.session.send("Input.insertText",{text:t}),await Ao(50)}async countFocusables(){var a;const t=`(() => {
743
743
  const sel = [
744
744
  'a[href]', 'button', 'input', 'select', 'textarea',
745
745
  '[tabindex]', 'audio[controls]', 'video[controls]', '[contenteditable]'
@@ -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-D1lKQI3e.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=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[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=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=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[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">