@wcag-checkr/ci 1.0.0-rc.294 → 1.0.0-rc.295

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.
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ai-usage-log-C-jq4cW3.js","assets/crash-reporter-Dc5lvxvY.js","assets/scheduled-audit-runner-CGnx3MDX.js","assets/diff-DA41zYPc.js"])))=>i.map(i=>d[i]);
2
+ import{m as $,_ as F}from"./diff-DA41zYPc.js";import{ab as ae,ac as ne,ad as W,ae as j,g as oe,x as se,af as ie,ag as ce,ah as le,ai as ue,aj as de,ak as fe,al as ge,am as pe,an as Ee,ao as he,ap as Se,aq as Te,ar as me,as as Ie,a5 as Re,at as we,au as Ae,av as ye,aw as _e,ax as Ce,ay as be,o as _,az as O,aA as Oe,aB as ve,aC as Q,aD as Pe}from"./scheduled-audit-runner-CGnx3MDX.js";import{v as R,T as M,w as X}from"./ai-usage-log-C-jq4cW3.js";import{c as S,o as p,f as Ue,g as Ne,i as ke,h as xe,b as q,e as Le}from"./crash-reporter-Dc5lvxvY.js";const P="tierConfig:cache",De=60*60*1e3,$e=24*60*60*1e3,Fe=7*24*60*60*1e3;async function Me(){return(await chrome.storage.local.get(P))[P]??null}async function Ve(e){await chrome.storage.local.set({[P]:e})}function He(e,t=Date.now()){const r=t-e.fetchedAt;return r<De?"fresh":r<$e?"stale":r<Fe?"grace":"expired"}function Ge(e,t){const r={...e},a=g=>{if(typeof g=="number")return g===-1?1/0:g},n=g=>typeof g=="boolean"?g:void 0,o=g=>{if(g==="all"||g==="configurable"||g==="default-only")return g},s=a(t.maxComponents);s!==void 0&&(r.maxComponents=s);const i=a(t.maxBaselines);i!==void 0&&(r.maxBaselines=i);const c=o(t.stateMatrix);c!==void 0&&(r.stateMatrix=c);const l=n(t.storybookAutoIterate);l!==void 0&&(r.storybookAutoIterate=l);const u=n(t.exportJson);u!==void 0&&(r.exportJson=u);const d=n(t.exportSarif);d!==void 0&&(r.exportSarif=d);const E=n(t.exportJunit);E!==void 0&&(r.exportJunit=E);const C=n(t.cloudSync);C!==void 0&&(r.cloudSync=C);const h=n(t.forensicAnchoring);return h!==void 0&&(r.forensicAnchoring=h),r}function Be(e,t){var a;if(e==="trial")return((a=t.trial)==null?void 0:a.features)??null;const r=t.plans.find(n=>n.code===e||n.code.startsWith(e+"-"));return(r==null?void 0:r.features)??null}const w=S("tier-config-client"),Ke="wcagcheckr",We=`https://api.wcagcheckr.com/v1/products/${Ke}/tier-config`,je=1e4,V="tier-config-refresh",Qe=60,Xe=["trial","free","solo","team"];function Y(e){const t={};for(const r of Xe){const a=Be(r,e);t[r]=a?Ge(M[r],a):{...M[r]}}return t}async function qe(){const e=await Me();if(!e){R(null);return}if(He(e)==="expired"){w.warn("cached tier-config is expired (>7d); using hardcoded defaults"),R(null);return}R(Y(e.config))}async function z(){try{const e=await fetch(We,{signal:AbortSignal.timeout(je),headers:{accept:"application/json"}});if(!e.ok)throw new Error(`http ${e.status}`);const t=await e.json();await Ve({fetchedAt:Date.now(),config:t}),R(Y(t));const r=t.wcagTargetVersion;if(r==="2.1"||r==="2.2")try{await chrome.storage.local.set({wcagTargetVersion:r}),ae(r)}catch(a){w.warn("failed to persist wcagTargetVersion",a)}w.info("tier-config refreshed from server")}catch(e){w.warn("tier-config refresh failed; keeping prior cache",e)}}function Ye(){chrome.alarms.create(V,{periodInMinutes:Qe}),chrome.alarms.onAlarm.addListener(e=>{e.name===V&&z()})}const ze=S("support-messenger"),Je="https://api.wcagcheckr.com/v1/products/wcagcheckr/support",v="support:rate-window",Ze=5,et=10*60*1e3,tt=2,rt="wcagcheckr",H="storybook:lastDetected";async function at(e){if(!e)return;const t=await chrome.runtime.getPlatformInfo(),a=(await chrome.storage.local.get(H))[H];return{extensionVersion:chrome.runtime.getManifest().version,platform:t,storybookDetected:a!=null&&a.detected?a.version??"detected":"none",licenseTier:await ne(),logTail:Ue(Ne())}}async function nt(e=Date.now()){const r=((await chrome.storage.local.get(v))[v]??[]).filter(a=>e-a<et);return r.length>=Ze?!1:(r.push(e),await chrome.storage.local.set({[v]:r}),!0)}async function J(e,t=0){try{const r=await fetch(Je,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`http ${r.status}`);const a=await r.json();if(!a.success)throw new Error(a.error??"server returned success=false");return{ticketRef:a.ticketRef??""}}catch(r){if(t<tt){const a=(t+1)*1e3;return await new Promise(n=>setTimeout(n,a)),J(e,t+1)}throw r}}function ot(){return p("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await nt())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:$("NETWORK","Rate limit reached. Try again in 10 minutes.",!0)};try{const t=await at(e.includeContext);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!0,ticketRef:(await J({productSlug:rt,subject:e.subject,body:e.body,replyEmail:e.replyEmail,context:t,extensionVersion:chrome.runtime.getManifest().version,timestamp:new Date().toISOString()})).ticketRef}}catch(t){ze.error("send failed",t);const r=t instanceof Error?t.message:String(t);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:$("NETWORK",r,!0)}}})}const Z=S("ai-color-suggester");async function st(e,t,r=[]){if(!t.enabled||e.length===0)return{results:[],totalCostUsd:0,capExceeded:!1};const a=W(t);if(!a.ok)return{results:[],totalCostUsd:0,capExceeded:!1};const n=a.client,o=j(t.costCapUsd),s=[];for(const i of e){if(!o.canCharge())break;try{const c=await n.suggestColorFix({foreground:i.foreground,background:i.background,fontSize:i.fontSize,fontWeight:i.fontWeight,targetLevel:i.targetLevel,paletteHints:r});o.recordCharge(c.costUsd),c.verdict==="suggested"&&c.candidates.length>0&&s.push({matchKey:i.matchKey,suggestions:c.candidates,reasoning:c.reasoning,costUsd:c.costUsd})}catch(c){Z.warn(`color-fix suggestion failed for ${i.matchKey}`,c)}}return{results:s,totalCostUsd:o.state.spentUsd,capExceeded:o.state.exceeded}}async function it(){const e=await chrome.storage.local.get("aiConfig");return X(e.aiConfig)}function ct(){return p("AI_COLOR_SUGGEST_REQUEST",async e=>{const t=await it();if(!t.enabled)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!t.apiKey)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{results:r,totalCostUsd:a,capExceeded:n}=await st(e.inputs,t,e.paletteHints);return{type:"AI_COLOR_SUGGEST_RESPONSE",results:r,totalCostUsd:a,capExceeded:n}}catch(r){return Z.warn("color-suggest handler failed",r),{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:r instanceof Error?r.message:String(r)}}})}function G(e){if(!e)return null;const t=e.match(/rgba?\(\s*([0-9.]+)\s*,?\s*([0-9.]+)\s*,?\s*([0-9.]+)(?:\s*[,/]\s*([0-9.]+))?\s*\)/i);return t?{r:Math.round(parseFloat(t[1])),g:Math.round(parseFloat(t[2])),b:Math.round(parseFloat(t[3])),a:t[4]!==void 0?parseFloat(t[4]):1}:null}function B(e){const t=r=>{const a=r/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)};return .2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b)}function lt(e,t){const r=B(e),a=B(t),n=Math.max(r,a),o=Math.min(r,a);return(n+.05)/(o+.05)}function ut(e,t){const r=Math.max(0,Math.min(1,e.a));return{r:Math.round(e.r*r+t.r*(1-r)),g:Math.round(e.g*r+t.g*(1-r)),b:Math.round(e.b*r+t.b*(1-r))}}function dt(e,t){var L,D;if(e!=="color-contrast"&&e!=="color-contrast-enhanced")return null;const r=t.styles;if(!r)return null;const a=((L=r.effectiveBackground)==null?void 0:L.color)??r.background,n=r.foreground;if(!n||!a||(D=r.effectiveBackground)!=null&&D.hasBackgroundImageInChain)return null;const o=G(n),s=G(a);if(!o||!s||s.a<.999)return null;const i=o.a<.999?ut(o,s):{r:o.r,g:o.g,b:o.b},c=lt(i,s),l=r.fontSize??16,u=r.fontWeight??400,d=l>=24||l>=18.5&&u>=700,h=e==="color-contrast-enhanced"?d?4.5:7:d?3:4.5,g=c>=h?"pass":"fail",x=b=>`rgb(${b.r}, ${b.g}, ${b.b})`,re=`Deterministic WCAG contrast measurement (no AI guessing, no pixel sampling). Foreground ${x(i)}${o.a<.999?` (originally rgba with alpha=${o.a}, composited over background)`:""} against background ${x(s)} yields contrast ratio ${c.toFixed(2)}:1. Text is ${l}px at font-weight ${u}; ${d?"qualifies as large text (threshold 3:1 for AA)":"normal text (threshold 4.5:1 for AA)"}. ${g==="pass"?`Passes AA at ${h}:1.`:`Falls below the ${h}:1 threshold.`}`;return{verdict:g,ratio:c,threshold:h,reasoning:re}}async function ft(e,t,r){var i,c,l,u,d;const a=JSON.stringify({ruleId:e,selector:t,styles:{fg:((i=r.styles)==null?void 0:i.foreground)??null,bg:((c=r.styles)==null?void 0:c.background)??null,fs:((l=r.styles)==null?void 0:l.fontSize)??null,fw:((u=r.styles)==null?void 0:u.fontWeight)??null,ts:((d=r.styles)==null?void 0:d.textSample)??null},failureSummary:r.failureSummary??null}),n=new TextEncoder().encode(a),o=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(o)).map(E=>E.toString(16).padStart(2,"0")).join("")}const A=S("ai-incomplete-resolver");function gt(e,t){if(!e)return t;const r=e.toLowerCase(),a=/verdict\s+corrected\s+to\s+pass|verdict:\s*pass\s+\(corrected\)/i,n=/verdict\s+corrected\s+to\s+fail|verdict:\s*fail\s+\(corrected\)/i,o=m(r,a),s=m(r,n);if(o>s&&o>=0)return"pass";if(s>o&&s>=0)return"fail";const i=/actually\s+passes|in\s+fact\s+passes|passes\s+AA/gi,c=/actually\s+fails|in\s+fact\s+fails|fails\s+AA/gi,l=m(r,i),u=m(r,c);return l<0&&u<0?t:l>u&&l/r.length>=.5?"pass":u>l&&u/r.length>=.5?"fail":t}function m(e,t){let r=-1;const a=t.flags.includes("g")?t.flags:t.flags+"g",n=new RegExp(t.source,a);let o;for(;(o=n.exec(e))!==null;)r=o.index,o.index===n.lastIndex&&n.lastIndex++;return r}async function pt(){const e=await chrome.storage.local.get("aiConfig");return X(e.aiConfig)}async function Et(e){if(!e.aiConfig.enabled||e.elements.length===0)return{resolutions:[],totalCostUsd:0};const t=W(e.aiConfig);if(!t.ok)return{resolutions:[],totalCostUsd:0};const r=t.client,a=j(e.aiConfig.costCapUsd),n=[],o=await oe(e.pageUrl),s=new Map;for(const i of o)s.set(`${i.ruleId}::${i.selector}`,i);for(const i of e.elements){if(!a.canCharge())break;const c=await ft(e.ruleId,i.selector,i),l=s.get(`${e.ruleId}::${i.selector}`);if(l&&l.inputHash===c&&l.verdict!=="uncertain"){A.info(`Reusing cached resolution for ${e.ruleId} on ${i.selector} (hash match, verdict=${l.verdict})`),n.push({...l,resolvedAt:new Date().toISOString(),costUsd:0,inputHash:c});continue}const u=dt(e.ruleId,i);if(u){A.info(`Deterministic verdict for ${e.ruleId} on ${i.selector}: ${u.verdict} (${u.ratio.toFixed(2)}:1 vs ${u.threshold}:1) — skipping AI call`),n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:i.selector,verdict:u.verdict,reasoning:u.reasoning,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:e.wcagCriterion,inputHash:c});continue}try{const d=await r.resolveAxeIncomplete({ruleId:e.ruleId,element:i,pageUrl:e.pageUrl,targetLevel:e.targetLevel});a.recordCharge(d.costUsd);const E=gt(d.reasoning,d.verdict);n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:i.selector,verdict:E,reasoning:d.reasoning,resolvedAt:new Date().toISOString(),costUsd:d.costUsd,wcagCriterion:e.wcagCriterion,inputHash:c})}catch(d){A.warn(`resolveAxeIncomplete failed for ${i.selector}`,d)}}return n.length>0&&await se(n),{resolutions:n,totalCostUsd:a.state.spentUsd}}function ht(){return p("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await pt();if(!t.enabled)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!t.apiKey)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{resolutions:r,totalCostUsd:a}=await Et({ruleId:e.ruleId,pageUrl:e.pageUrl,wcagCriterion:e.wcagCriterion,elements:e.elements,targetLevel:e.targetLevel,aiConfig:t});return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:r,totalCostUsd:a}}catch(r){return A.warn("ai-incomplete-resolver failed",r),{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:r instanceof Error?r.message:"Unknown error during AI resolution."}}})}function St(){return p("INTERACTIVE_AUDIT_REQUEST",async e=>{try{switch(e.criterionId){case"2.4.3":{const t=await fe({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.1.2":{const t=await de({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.4.7":{const t=await ue({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"1.4.11":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first; 1.4.11 needs the page screenshot."};const n=await le({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"1.3.2":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first, then the 1.3.2 walkthrough can judge its reading-order findings."};const n=await ce({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"2.5.3":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=await ie({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl,results:r==null?void 0:r.results});return a.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:a.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:a.error}}default:return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:`Interactive audit for criterion ${e.criterionId} not yet implemented.`}}}catch(t){return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}})}const Tt=S("ax-tree-snapshot"),mt="1.3";function It(e){var r,a,n;const t=[];for(const o of e.properties??[]){const s=(r=o.value)==null?void 0:r.value;s!==void 0&&(typeof s=="string"||typeof s=="number"||typeof s=="boolean"||s===null)&&t.push({name:o.name,value:s})}return{nodeId:e.nodeId,parentId:e.parentId,childIds:e.childIds??[],role:typeof((a=e.role)==null?void 0:a.value)=="string"?e.role.value:"unknown",name:typeof((n=e.name)==null?void 0:n.value)=="string"?e.name.value:"",ignored:!!e.ignored,properties:t,backendDomNodeId:e.backendDOMNodeId}}async function Rt(e){let t=!1;try{try{await chrome.debugger.attach({tabId:e},mt),t=!0}catch(n){if(!(n instanceof Error?n.message:String(n)).includes("Another debugger"))throw Tt.warn("chrome.debugger.attach failed",n),n}await chrome.debugger.sendCommand({tabId:e},"Accessibility.enable");const r=await chrome.debugger.sendCommand({tabId:e},"Accessibility.getFullAXTree");return((r==null?void 0:r.nodes)??[]).map(It)}finally{if(t)try{await chrome.debugger.detach({tabId:e})}catch{}}}const ee=S("perf-throttle"),wt="1.3",At={none:{label:"No throttling",network:null,cpuRate:1},"3g-slow":{label:"Slow 3G",network:{offline:!1,latency:400,downloadThroughput:500*1024/8,uploadThroughput:500*1024/8},cpuRate:6},"3g-fast":{label:"Fast 3G",network:{offline:!1,latency:150,downloadThroughput:1.5*1024*1024/8,uploadThroughput:750*1024/8},cpuRate:4},"4g":{label:"4G LTE",network:{offline:!1,latency:20,downloadThroughput:4*1024*1024/8,uploadThroughput:3*1024*1024/8},cpuRate:2},"cpu-2x":{label:"CPU 2× slowdown (no network throttle)",network:null,cpuRate:2},"cpu-4x":{label:"CPU 4× slowdown (no network throttle)",network:null,cpuRate:4}};async function yt(e){try{return await chrome.debugger.attach({tabId:e},wt),!0}catch(t){if((t instanceof Error?t.message:String(t)).includes("Another debugger"))return!1;throw t}}async function _t(e,t){const r=At[t];await yt(e),await chrome.debugger.sendCommand({tabId:e},"Network.enable"),r.network?await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",r.network):await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:r.cpuRate}),ee.info(`applied ${t} (label="${r.label}", cpu×${r.cpuRate})`)}async function Ct(e){try{await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:1})}catch(t){ee.debug("throttle reset commands failed (debugger may not be attached)",t)}}const f=S("service-worker");ke("service-worker");ge();var I,K;(K=(I=chrome.sidePanel)==null?void 0:I.setPanelBehavior)==null||K.call(I,{openPanelOnActionClick:!0}).catch(e=>f.warn("setPanelBehavior failed",e));pe();Ee();he();Se().catch(e=>f.warn("initial cloud pull failed",e));(async()=>(await Te(),await qe(),z(),me(),Ie(),Re()))();chrome.alarms.onAlarm.addListener(e=>{const t=we(e.name);t!==null&&Ae(t).catch(r=>f.warn(`scheduled audit ${t} threw at top level`,r))});Ye();ye();_e();ot();ct();Ce();ht();St();self.addEventListener("unhandledrejection",e=>{const t=e.reason;xe(t instanceof Error?t:new Error(String(t)))});let y=!1;chrome.runtime.onConnect.addListener(e=>{if(e.name==="audit-keepalive"){f.debug("keepalive connected"),e.onDisconnect.addListener(async()=>{f.debug("keepalive disconnected"),await be()});return}if(e.name==="sidepanel-tracker"){y=!0,f.debug("chrome.sidePanel opened"),e.onDisconnect.addListener(async()=>{y=!1,f.debug("chrome.sidePanel closed — restoring in-page overlay"),await N()});return}});let U=!1;const T={isCanceled:()=>U};async function te(){const e=await _();if(e)try{await q(e,{type:"SIDEBAR_HIDE_REQUEST"})}catch(t){f.warn("sidebar hide failed",t)}}async function N(){const e=await _();if(e)try{await q(e,{type:"SIDEBAR_SHOW_REQUEST"})}catch(t){f.warn("sidebar show failed",t)}}p("START_AUDIT",async e=>{U=!1,await te();const t=await _();let r;const a={verifyFixesOnly:e.verifyFixesOnly};if(e.mode==="single-element"){if(!e.scope)throw new Error("START_AUDIT single-element requires scope");r=O(e.scope,T,e.frameId,e.matrixOverride,a)}else if(e.mode==="full-page")r=O("html",T,0,e.matrixOverride,a);else if(e.mode==="quick-scan"){const{QUICK_SCAN_MATRIX_SETTINGS:n}=await F(async()=>{const{QUICK_SCAN_MATRIX_SETTINGS:o}=await import("./ai-usage-log-C-jq4cW3.js").then(s=>s.I);return{QUICK_SCAN_MATRIX_SETTINGS:o}},__vite__mapDeps([0,1]));r=O(e.scope??"html",T,e.frameId??0,n,a)}else if(e.mode==="all-frames")r=Oe(T);else if(e.mode==="parallel-scan"){const{runParallelScan:n}=await F(async()=>{const{runParallelScan:o}=await import("./scheduled-audit-runner-CGnx3MDX.js").then(s=>s.aN);return{runParallelScan:o}},__vite__mapDeps([2,3,1,0]));r=n(T)}else r=ve(T);r.catch(n=>{f.error("audit failed",n);const o=n instanceof Error?n.message:String(n),s=/no audit target tab/i.test(o);Le({type:"AUDIT_FAILED_EVENT",error:{code:s?"RESTRICTED_URL":"UNKNOWN",message:s?"No audit target tab found. Open a regular http(s) page (not chrome:// or about:blank) and try again.":`Audit failed: ${o}`,recoverable:!0}})}).finally(()=>{t!=null&&Q(t).catch(n=>f.debug("post-audit debugger release failed (best-effort)",n)),y||N()})});p("CANCEL_AUDIT",async()=>{U=!0,f.info("cancel requested")});let k=!1;const bt={isCanceled:()=>k};p("START_SITE_CRAWL",async e=>{k=!1,await te();const t=await _();Pe(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex,verifyFixesOnly:e.verifyFixesOnly},bt).catch(r=>f.error("site crawl failed",r)).finally(()=>{t!=null&&Q(t).catch(r=>f.debug("post-crawl debugger release failed (best-effort)",r)),y||N()})});p("CANCEL_SITE_CRAWL",async()=>{k=!0,f.info("site crawl cancel requested")});p("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});p("PERF_THROTTLE_APPLY_REQUEST",async e=>{try{return await _t(e.tabId,e.profile),{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});p("PERF_THROTTLE_CLEAR_REQUEST",async e=>{try{return await Ct(e.tabId),{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});p("AX_TREE_SNAPSHOT_REQUEST",async e=>{try{return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!0,nodes:await Rt(e.tabId)}}catch(t){return f.warn("ax-tree snapshot failed",t),{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});f.info("service worker ready");
@@ -2,8 +2,8 @@
2
2
  "manifest_version": 3,
3
3
  "name": "wcagcheckr",
4
4
  "description": "Audit components across hover, focus, dark mode, forced colors, RTL — every state your users actually encounter. Per-component baselines surface only NEW violations.",
5
- "version": "1.0.0.294",
6
- "version_name": "1.0.0-rc.294",
5
+ "version": "1.0.0.295",
6
+ "version_name": "1.0.0-rc.295",
7
7
  "author": "Locustware",
8
8
  "homepage_url": "https://wcagcheckr.com",
9
9
  "icons": {
@@ -1 +1 @@
1
- import './assets/service-worker.ts-CFIYmb5K.js';
1
+ import './assets/service-worker.ts-DRuyiAJp.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wcag-checkr/ci",
3
- "version": "1.0.0-rc.294",
3
+ "version": "1.0.0-rc.295",
4
4
  "private": false,
5
5
  "description": "Headless wcagcheckr accessibility audit runner for CI/CD pipelines. Drives the wcagcheckr Chrome extension via Playwright, runs full-page audits across the state matrix (108 combinations: hover, focus, dark mode, RTL, breakpoints), outputs JSON / SARIF / JUnit, exits with severity-aware codes.",
6
6
  "license": "UNLICENSED",
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ai-usage-log-C-jq4cW3.js","assets/crash-reporter-Dc5lvxvY.js","assets/scheduled-audit-runner-CGnx3MDX.js","assets/diff-DA41zYPc.js"])))=>i.map(i=>d[i]);
2
- import{m as v,_ as k}from"./diff-DA41zYPc.js";import{ab as Y,ac as q,ad as M,ae as H,g as J,x as z,af as Z,ag as ee,ah as te,ai as re,aj as ae,ak as oe,al as ne,am as se,an as ie,ao as ce,ap as le,aq as ue,ar as de,as as fe,a5 as ge,at as Ee,au as pe,av as Te,aw as he,ax as Se,ay as Ie,o as w,az as _,aA as Re,aB as me,aC as F,aD as we}from"./scheduled-audit-runner-CGnx3MDX.js";import{v as I,T as L,w as G}from"./ai-usage-log-C-jq4cW3.js";import{c as E,o as d,f as _e,g as ye,i as Ae,h as Ce,b as $,e as Oe}from"./crash-reporter-Dc5lvxvY.js";const A="tierConfig:cache",be=60*60*1e3,Ue=24*60*60*1e3,Pe=7*24*60*60*1e3;async function Ne(){return(await chrome.storage.local.get(A))[A]??null}async function ve(e){await chrome.storage.local.set({[A]:e})}function ke(e,t=Date.now()){const r=t-e.fetchedAt;return r<be?"fresh":r<Ue?"stale":r<Pe?"grace":"expired"}function Le(e,t){const r={...e},a=g=>{if(typeof g=="number")return g===-1?1/0:g},o=g=>typeof g=="boolean"?g:void 0,i=g=>{if(g==="all"||g==="configurable"||g==="default-only")return g},s=a(t.maxComponents);s!==void 0&&(r.maxComponents=s);const n=a(t.maxBaselines);n!==void 0&&(r.maxBaselines=n);const c=i(t.stateMatrix);c!==void 0&&(r.stateMatrix=c);const f=o(t.storybookAutoIterate);f!==void 0&&(r.storybookAutoIterate=f);const u=o(t.exportJson);u!==void 0&&(r.exportJson=u);const T=o(t.exportSarif);T!==void 0&&(r.exportSarif=T);const h=o(t.exportJunit);h!==void 0&&(r.exportJunit=h);const P=o(t.cloudSync);P!==void 0&&(r.cloudSync=P);const N=o(t.forensicAnchoring);return N!==void 0&&(r.forensicAnchoring=N),r}function xe(e,t){var a;if(e==="trial")return((a=t.trial)==null?void 0:a.features)??null;const r=t.plans.find(o=>o.code===e||o.code.startsWith(e+"-"));return(r==null?void 0:r.features)??null}const R=E("tier-config-client"),De="wcagcheckr",Ve=`https://api.wcagcheckr.com/v1/products/${De}/tier-config`,Me=1e4,x="tier-config-refresh",He=60,Fe=["trial","free","solo","team"];function K(e){const t={};for(const r of Fe){const a=xe(r,e);t[r]=a?Le(L[r],a):{...L[r]}}return t}async function Ge(){const e=await Ne();if(!e){I(null);return}if(ke(e)==="expired"){R.warn("cached tier-config is expired (>7d); using hardcoded defaults"),I(null);return}I(K(e.config))}async function B(){try{const e=await fetch(Ve,{signal:AbortSignal.timeout(Me),headers:{accept:"application/json"}});if(!e.ok)throw new Error(`http ${e.status}`);const t=await e.json();await ve({fetchedAt:Date.now(),config:t}),I(K(t));const r=t.wcagTargetVersion;if(r==="2.1"||r==="2.2")try{await chrome.storage.local.set({wcagTargetVersion:r}),Y(r)}catch(a){R.warn("failed to persist wcagTargetVersion",a)}R.info("tier-config refreshed from server")}catch(e){R.warn("tier-config refresh failed; keeping prior cache",e)}}function $e(){chrome.alarms.create(x,{periodInMinutes:He}),chrome.alarms.onAlarm.addListener(e=>{e.name===x&&B()})}const Ke=E("support-messenger"),Be="https://api.wcagcheckr.com/v1/products/wcagcheckr/support",y="support:rate-window",We=5,je=10*60*1e3,Qe=2,Xe="wcagcheckr",D="storybook:lastDetected";async function Ye(e){if(!e)return;const t=await chrome.runtime.getPlatformInfo(),a=(await chrome.storage.local.get(D))[D];return{extensionVersion:chrome.runtime.getManifest().version,platform:t,storybookDetected:a!=null&&a.detected?a.version??"detected":"none",licenseTier:await q(),logTail:_e(ye())}}async function qe(e=Date.now()){const r=((await chrome.storage.local.get(y))[y]??[]).filter(a=>e-a<je);return r.length>=We?!1:(r.push(e),await chrome.storage.local.set({[y]:r}),!0)}async function W(e,t=0){try{const r=await fetch(Be,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`http ${r.status}`);const a=await r.json();if(!a.success)throw new Error(a.error??"server returned success=false");return{ticketRef:a.ticketRef??""}}catch(r){if(t<Qe){const a=(t+1)*1e3;return await new Promise(o=>setTimeout(o,a)),W(e,t+1)}throw r}}function Je(){return d("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await qe())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:v("NETWORK","Rate limit reached. Try again in 10 minutes.",!0)};try{const t=await Ye(e.includeContext);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!0,ticketRef:(await W({productSlug:Xe,subject:e.subject,body:e.body,replyEmail:e.replyEmail,context:t,extensionVersion:chrome.runtime.getManifest().version,timestamp:new Date().toISOString()})).ticketRef}}catch(t){Ke.error("send failed",t);const r=t instanceof Error?t.message:String(t);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:v("NETWORK",r,!0)}}})}const j=E("ai-color-suggester");async function ze(e,t,r=[]){if(!t.enabled||e.length===0)return{results:[],totalCostUsd:0,capExceeded:!1};const a=M(t);if(!a.ok)return{results:[],totalCostUsd:0,capExceeded:!1};const o=a.client,i=H(t.costCapUsd),s=[];for(const n of e){if(!i.canCharge())break;try{const c=await o.suggestColorFix({foreground:n.foreground,background:n.background,fontSize:n.fontSize,fontWeight:n.fontWeight,targetLevel:n.targetLevel,paletteHints:r});i.recordCharge(c.costUsd),c.verdict==="suggested"&&c.candidates.length>0&&s.push({matchKey:n.matchKey,suggestions:c.candidates,reasoning:c.reasoning,costUsd:c.costUsd})}catch(c){j.warn(`color-fix suggestion failed for ${n.matchKey}`,c)}}return{results:s,totalCostUsd:i.state.spentUsd,capExceeded:i.state.exceeded}}async function Ze(){const e=await chrome.storage.local.get("aiConfig");return G(e.aiConfig)}function et(){return d("AI_COLOR_SUGGEST_REQUEST",async e=>{const t=await Ze();if(!t.enabled)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!t.apiKey)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{results:r,totalCostUsd:a,capExceeded:o}=await ze(e.inputs,t,e.paletteHints);return{type:"AI_COLOR_SUGGEST_RESPONSE",results:r,totalCostUsd:a,capExceeded:o}}catch(r){return j.warn("color-suggest handler failed",r),{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:r instanceof Error?r.message:String(r)}}})}async function tt(e,t,r){var n,c,f,u,T;const a=JSON.stringify({ruleId:e,selector:t,styles:{fg:((n=r.styles)==null?void 0:n.foreground)??null,bg:((c=r.styles)==null?void 0:c.background)??null,fs:((f=r.styles)==null?void 0:f.fontSize)??null,fw:((u=r.styles)==null?void 0:u.fontWeight)??null,ts:((T=r.styles)==null?void 0:T.textSample)??null},failureSummary:r.failureSummary??null}),o=new TextEncoder().encode(a),i=await crypto.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(i)).map(h=>h.toString(16).padStart(2,"0")).join("")}const C=E("ai-incomplete-resolver");async function rt(){const e=await chrome.storage.local.get("aiConfig");return G(e.aiConfig)}async function at(e){if(!e.aiConfig.enabled||e.elements.length===0)return{resolutions:[],totalCostUsd:0};const t=M(e.aiConfig);if(!t.ok)return{resolutions:[],totalCostUsd:0};const r=t.client,a=H(e.aiConfig.costCapUsd),o=[],i=await J(e.pageUrl),s=new Map;for(const n of i)s.set(`${n.ruleId}::${n.selector}`,n);for(const n of e.elements){if(!a.canCharge())break;const c=await tt(e.ruleId,n.selector,n),f=s.get(`${e.ruleId}::${n.selector}`);if(f&&f.inputHash===c&&f.verdict!=="uncertain"){C.info(`Reusing cached resolution for ${e.ruleId} on ${n.selector} (hash match, verdict=${f.verdict})`),o.push({...f,resolvedAt:new Date().toISOString(),costUsd:0,inputHash:c});continue}try{const u=await r.resolveAxeIncomplete({ruleId:e.ruleId,element:n,pageUrl:e.pageUrl,targetLevel:e.targetLevel});a.recordCharge(u.costUsd),o.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:n.selector,verdict:u.verdict,reasoning:u.reasoning,resolvedAt:new Date().toISOString(),costUsd:u.costUsd,wcagCriterion:e.wcagCriterion,inputHash:c})}catch(u){C.warn(`resolveAxeIncomplete failed for ${n.selector}`,u)}}return o.length>0&&await z(o),{resolutions:o,totalCostUsd:a.state.spentUsd}}function ot(){return d("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await rt();if(!t.enabled)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!t.apiKey)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{resolutions:r,totalCostUsd:a}=await at({ruleId:e.ruleId,pageUrl:e.pageUrl,wcagCriterion:e.wcagCriterion,elements:e.elements,targetLevel:e.targetLevel,aiConfig:t});return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:r,totalCostUsd:a}}catch(r){return C.warn("ai-incomplete-resolver failed",r),{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:r instanceof Error?r.message:"Unknown error during AI resolution."}}})}function nt(){return d("INTERACTIVE_AUDIT_REQUEST",async e=>{try{switch(e.criterionId){case"2.4.3":{const t=await oe({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.1.2":{const t=await ae({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.4.7":{const t=await re({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"1.4.11":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first; 1.4.11 needs the page screenshot."};const o=await te({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return o.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:o.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:o.error}}case"1.3.2":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first, then the 1.3.2 walkthrough can judge its reading-order findings."};const o=await ee({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return o.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:o.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:o.error}}case"2.5.3":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=await Z({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl,results:r==null?void 0:r.results});return a.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:a.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:a.error}}default:return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:`Interactive audit for criterion ${e.criterionId} not yet implemented.`}}}catch(t){return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}})}const st=E("ax-tree-snapshot"),it="1.3";function ct(e){var r,a,o;const t=[];for(const i of e.properties??[]){const s=(r=i.value)==null?void 0:r.value;s!==void 0&&(typeof s=="string"||typeof s=="number"||typeof s=="boolean"||s===null)&&t.push({name:i.name,value:s})}return{nodeId:e.nodeId,parentId:e.parentId,childIds:e.childIds??[],role:typeof((a=e.role)==null?void 0:a.value)=="string"?e.role.value:"unknown",name:typeof((o=e.name)==null?void 0:o.value)=="string"?e.name.value:"",ignored:!!e.ignored,properties:t,backendDomNodeId:e.backendDOMNodeId}}async function lt(e){let t=!1;try{try{await chrome.debugger.attach({tabId:e},it),t=!0}catch(o){if(!(o instanceof Error?o.message:String(o)).includes("Another debugger"))throw st.warn("chrome.debugger.attach failed",o),o}await chrome.debugger.sendCommand({tabId:e},"Accessibility.enable");const r=await chrome.debugger.sendCommand({tabId:e},"Accessibility.getFullAXTree");return((r==null?void 0:r.nodes)??[]).map(ct)}finally{if(t)try{await chrome.debugger.detach({tabId:e})}catch{}}}const Q=E("perf-throttle"),ut="1.3",dt={none:{label:"No throttling",network:null,cpuRate:1},"3g-slow":{label:"Slow 3G",network:{offline:!1,latency:400,downloadThroughput:500*1024/8,uploadThroughput:500*1024/8},cpuRate:6},"3g-fast":{label:"Fast 3G",network:{offline:!1,latency:150,downloadThroughput:1.5*1024*1024/8,uploadThroughput:750*1024/8},cpuRate:4},"4g":{label:"4G LTE",network:{offline:!1,latency:20,downloadThroughput:4*1024*1024/8,uploadThroughput:3*1024*1024/8},cpuRate:2},"cpu-2x":{label:"CPU 2× slowdown (no network throttle)",network:null,cpuRate:2},"cpu-4x":{label:"CPU 4× slowdown (no network throttle)",network:null,cpuRate:4}};async function ft(e){try{return await chrome.debugger.attach({tabId:e},ut),!0}catch(t){if((t instanceof Error?t.message:String(t)).includes("Another debugger"))return!1;throw t}}async function gt(e,t){const r=dt[t];await ft(e),await chrome.debugger.sendCommand({tabId:e},"Network.enable"),r.network?await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",r.network):await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:r.cpuRate}),Q.info(`applied ${t} (label="${r.label}", cpu×${r.cpuRate})`)}async function Et(e){try{await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:1})}catch(t){Q.debug("throttle reset commands failed (debugger may not be attached)",t)}}const l=E("service-worker");Ae("service-worker");ne();var S,V;(V=(S=chrome.sidePanel)==null?void 0:S.setPanelBehavior)==null||V.call(S,{openPanelOnActionClick:!0}).catch(e=>l.warn("setPanelBehavior failed",e));se();ie();ce();le().catch(e=>l.warn("initial cloud pull failed",e));(async()=>(await ue(),await Ge(),B(),de(),fe(),ge()))();chrome.alarms.onAlarm.addListener(e=>{const t=Ee(e.name);t!==null&&pe(t).catch(r=>l.warn(`scheduled audit ${t} threw at top level`,r))});$e();Te();he();Je();et();Se();ot();nt();self.addEventListener("unhandledrejection",e=>{const t=e.reason;Ce(t instanceof Error?t:new Error(String(t)))});let m=!1;chrome.runtime.onConnect.addListener(e=>{if(e.name==="audit-keepalive"){l.debug("keepalive connected"),e.onDisconnect.addListener(async()=>{l.debug("keepalive disconnected"),await Ie()});return}if(e.name==="sidepanel-tracker"){m=!0,l.debug("chrome.sidePanel opened"),e.onDisconnect.addListener(async()=>{m=!1,l.debug("chrome.sidePanel closed — restoring in-page overlay"),await b()});return}});let O=!1;const p={isCanceled:()=>O};async function X(){const e=await w();if(e)try{await $(e,{type:"SIDEBAR_HIDE_REQUEST"})}catch(t){l.warn("sidebar hide failed",t)}}async function b(){const e=await w();if(e)try{await $(e,{type:"SIDEBAR_SHOW_REQUEST"})}catch(t){l.warn("sidebar show failed",t)}}d("START_AUDIT",async e=>{O=!1,await X();const t=await w();let r;const a={verifyFixesOnly:e.verifyFixesOnly};if(e.mode==="single-element"){if(!e.scope)throw new Error("START_AUDIT single-element requires scope");r=_(e.scope,p,e.frameId,e.matrixOverride,a)}else if(e.mode==="full-page")r=_("html",p,0,e.matrixOverride,a);else if(e.mode==="quick-scan"){const{QUICK_SCAN_MATRIX_SETTINGS:o}=await k(async()=>{const{QUICK_SCAN_MATRIX_SETTINGS:i}=await import("./ai-usage-log-C-jq4cW3.js").then(s=>s.I);return{QUICK_SCAN_MATRIX_SETTINGS:i}},__vite__mapDeps([0,1]));r=_(e.scope??"html",p,e.frameId??0,o,a)}else if(e.mode==="all-frames")r=Re(p);else if(e.mode==="parallel-scan"){const{runParallelScan:o}=await k(async()=>{const{runParallelScan:i}=await import("./scheduled-audit-runner-CGnx3MDX.js").then(s=>s.aN);return{runParallelScan:i}},__vite__mapDeps([2,3,1,0]));r=o(p)}else r=me(p);r.catch(o=>{l.error("audit failed",o);const i=o instanceof Error?o.message:String(o),s=/no audit target tab/i.test(i);Oe({type:"AUDIT_FAILED_EVENT",error:{code:s?"RESTRICTED_URL":"UNKNOWN",message:s?"No audit target tab found. Open a regular http(s) page (not chrome:// or about:blank) and try again.":`Audit failed: ${i}`,recoverable:!0}})}).finally(()=>{t!=null&&F(t).catch(o=>l.debug("post-audit debugger release failed (best-effort)",o)),m||b()})});d("CANCEL_AUDIT",async()=>{O=!0,l.info("cancel requested")});let U=!1;const pt={isCanceled:()=>U};d("START_SITE_CRAWL",async e=>{U=!1,await X();const t=await w();we(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex,verifyFixesOnly:e.verifyFixesOnly},pt).catch(r=>l.error("site crawl failed",r)).finally(()=>{t!=null&&F(t).catch(r=>l.debug("post-crawl debugger release failed (best-effort)",r)),m||b()})});d("CANCEL_SITE_CRAWL",async()=>{U=!0,l.info("site crawl cancel requested")});d("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});d("PERF_THROTTLE_APPLY_REQUEST",async e=>{try{return await gt(e.tabId,e.profile),{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});d("PERF_THROTTLE_CLEAR_REQUEST",async e=>{try{return await Et(e.tabId),{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});d("AX_TREE_SNAPSHOT_REQUEST",async e=>{try{return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!0,nodes:await lt(e.tabId)}}catch(t){return l.warn("ax-tree snapshot failed",t),{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});l.info("service worker ready");