@wcag-checkr/ci 1.0.0-rc.296 → 1.0.0-rc.297
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-CkcnHkrk.js","assets/crash-reporter-Dc5lvxvY.js","assets/scheduled-audit-runner-lRj-3bwG.js","assets/diff-DA41zYPc.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{m as D,_ as F}from"./diff-DA41zYPc.js";import{ac as ae,ad as ne,ae as W,af as j,g as oe,y as se,ag as ie,ah as ce,ai as le,aj as ue,ak as de,al as fe,am as ge,an as Ee,ao as pe,ap as he,aq as Se,ar as Te,as as me,at as Ie,a6 as Re,au as we,av as Ae,aw as ye,ax as _e,ay as Ce,az as be,p as _,aA as O,aB as Oe,aC as ve,aD as Q,aE as Pe}from"./scheduled-audit-runner-lRj-3bwG.js";import{v as R,T as $,w as X}from"./ai-usage-log-CkcnHkrk.js";import{c as S,o as E,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,Fe=24*60*60*1e3,$e=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<Fe?"stale":r<$e?"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 p=n(t.exportJunit);p!==void 0&&(r.exportJunit=p);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,M="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($[r],a):{...$[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(M,{periodInMinutes:Qe}),chrome.alarms.onAlarm.addListener(e=>{e.name===M&&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",V="storybook:lastDetected";async function at(e){if(!e)return;const t=await chrome.runtime.getPlatformInfo(),a=(await chrome.storage.local.get(V))[V];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 E("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await nt())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:D("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:D("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 E("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 H(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 G(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=G(e),a=G(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;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)return null;const o=H(n),s=H(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(p=>p.toString(16).padStart(2,"0")).join("")}const A=S("ai-incomplete-resolver");function B(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 gt(){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}`),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) — math overrides cache + AI`),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}if(l&&l.inputHash===c&&l.verdict!=="uncertain"){A.info(`Reusing cached resolution for ${e.ruleId} on ${i.selector} (hash match, verdict=${l.verdict})`);const d=B(l.reasoning,l.verdict);n.push({...l,verdict:d,resolvedAt:new Date().toISOString(),costUsd:0,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 p=B(d.reasoning,d.verdict);n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:i.selector,verdict:p,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 pt(){return E("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await gt();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 ht(){return E("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 St=S("ax-tree-snapshot"),Tt="1.3";function mt(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 It(e){let t=!1;try{try{await chrome.debugger.attach({tabId:e},Tt),t=!0}catch(n){if(!(n instanceof Error?n.message:String(n)).includes("Another debugger"))throw St.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(mt)}finally{if(t)try{await chrome.debugger.detach({tabId:e})}catch{}}}const ee=S("perf-throttle"),Rt="1.3",wt={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 At(e){try{return await chrome.debugger.attach({tabId:e},Rt),!0}catch(t){if((t instanceof Error?t.message:String(t)).includes("Another debugger"))return!1;throw t}}async function yt(e,t){const r=wt[t];await At(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 _t(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));Ee();pe();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();pt();ht();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)}}E("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-CkcnHkrk.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-lRj-3bwG.js").then(s=>s.aO);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()})});E("CANCEL_AUDIT",async()=>{U=!0,f.info("cancel requested")});let k=!1;const Ct={isCanceled:()=>k};E("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},Ct).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()})});E("CANCEL_SITE_CRAWL",async()=>{k=!0,f.info("site crawl cancel requested")});E("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});E("PERF_THROTTLE_APPLY_REQUEST",async e=>{try{return await yt(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)}}});E("PERF_THROTTLE_CLEAR_REQUEST",async e=>{try{return await _t(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)}}});E("AX_TREE_SNAPSHOT_REQUEST",async e=>{try{return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!0,nodes:await It(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");
|
package/dist/manifest.json
CHANGED
|
@@ -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.
|
|
6
|
-
"version_name": "1.0.0-rc.
|
|
5
|
+
"version": "1.0.0.297",
|
|
6
|
+
"version_name": "1.0.0-rc.297",
|
|
7
7
|
"author": "Locustware",
|
|
8
8
|
"homepage_url": "https://wcagcheckr.com",
|
|
9
9
|
"icons": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import './assets/service-worker.ts-
|
|
1
|
+
import './assets/service-worker.ts-DoZEKEB4.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcag-checkr/ci",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.297",
|
|
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-CkcnHkrk.js","assets/crash-reporter-Dc5lvxvY.js","assets/scheduled-audit-runner-lRj-3bwG.js","assets/diff-DA41zYPc.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{m as F,_ as $}from"./diff-DA41zYPc.js";import{ac as ne,ad as oe,ae as j,af as Q,g as se,y as ie,ag as ce,ah as le,ai as ue,aj as de,ak as fe,al as ge,am as Ee,an as pe,ao as he,ap as Se,aq as Te,ar as me,as as Ie,at as Re,a6 as we,au as Ae,av as ye,aw as _e,ax as Ce,ay as be,az as Oe,p as _,aA as O,aB as ve,aC as Pe,aD as X,aE as Ue}from"./scheduled-audit-runner-lRj-3bwG.js";import{v as R,T as M,w as q}from"./ai-usage-log-CkcnHkrk.js";import{c as S,o as E,f as Ne,g as ke,i as xe,h as Le,b as Y,e as De}from"./crash-reporter-Dc5lvxvY.js";const P="tierConfig:cache",Fe=60*60*1e3,$e=24*60*60*1e3,Me=7*24*60*60*1e3;async function Ve(){return(await chrome.storage.local.get(P))[P]??null}async function He(e){await chrome.storage.local.set({[P]:e})}function Ge(e,t=Date.now()){const r=t-e.fetchedAt;return r<Fe?"fresh":r<$e?"stale":r<Me?"grace":"expired"}function Be(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 p=n(t.exportJunit);p!==void 0&&(r.exportJunit=p);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 Ke(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"),We="wcagcheckr",je=`https://api.wcagcheckr.com/v1/products/${We}/tier-config`,Qe=1e4,V="tier-config-refresh",Xe=60,qe=["trial","free","solo","team"];function z(e){const t={};for(const r of qe){const a=Ke(r,e);t[r]=a?Be(M[r],a):{...M[r]}}return t}async function Ye(){const e=await Ve();if(!e){R(null);return}if(Ge(e)==="expired"){w.warn("cached tier-config is expired (>7d); using hardcoded defaults"),R(null);return}R(z(e.config))}async function J(){try{const e=await fetch(je,{signal:AbortSignal.timeout(Qe),headers:{accept:"application/json"}});if(!e.ok)throw new Error(`http ${e.status}`);const t=await e.json();await He({fetchedAt:Date.now(),config:t}),R(z(t));const r=t.wcagTargetVersion;if(r==="2.1"||r==="2.2")try{await chrome.storage.local.set({wcagTargetVersion:r}),ne(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 ze(){chrome.alarms.create(V,{periodInMinutes:Xe}),chrome.alarms.onAlarm.addListener(e=>{e.name===V&&J()})}const Je=S("support-messenger"),Ze="https://api.wcagcheckr.com/v1/products/wcagcheckr/support",v="support:rate-window",et=5,tt=10*60*1e3,rt=2,at="wcagcheckr",H="storybook:lastDetected";async function nt(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 oe(),logTail:Ne(ke())}}async function ot(e=Date.now()){const r=((await chrome.storage.local.get(v))[v]??[]).filter(a=>e-a<tt);return r.length>=et?!1:(r.push(e),await chrome.storage.local.set({[v]:r}),!0)}async function Z(e,t=0){try{const r=await fetch(Ze,{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<rt){const a=(t+1)*1e3;return await new Promise(n=>setTimeout(n,a)),Z(e,t+1)}throw r}}function st(){return E("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await ot())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:F("NETWORK","Rate limit reached. Try again in 10 minutes.",!0)};try{const t=await nt(e.includeContext);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!0,ticketRef:(await Z({productSlug:at,subject:e.subject,body:e.body,replyEmail:e.replyEmail,context:t,extensionVersion:chrome.runtime.getManifest().version,timestamp:new Date().toISOString()})).ticketRef}}catch(t){Je.error("send failed",t);const r=t instanceof Error?t.message:String(t);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:F("NETWORK",r,!0)}}})}const ee=S("ai-color-suggester");async function it(e,t,r=[]){if(!t.enabled||e.length===0)return{results:[],totalCostUsd:0,capExceeded:!1};const a=j(t);if(!a.ok)return{results:[],totalCostUsd:0,capExceeded:!1};const n=a.client,o=Q(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){ee.warn(`color-fix suggestion failed for ${i.matchKey}`,c)}}return{results:s,totalCostUsd:o.state.spentUsd,capExceeded:o.state.exceeded}}async function ct(){const e=await chrome.storage.local.get("aiConfig");return q(e.aiConfig)}function lt(){return E("AI_COLOR_SUGGEST_REQUEST",async e=>{const t=await ct();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 it(e.inputs,t,e.paletteHints);return{type:"AI_COLOR_SUGGEST_RESPONSE",results:r,totalCostUsd:a,capExceeded:n}}catch(r){return ee.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 ut(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 dt(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 ft(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?dt(o,s):{r:o.r,g:o.g,b:o.b},c=ut(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})`,ae=`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:ae}}async function gt(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(p=>p.toString(16).padStart(2,"0")).join("")}const A=S("ai-incomplete-resolver");function K(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 Et(){const e=await chrome.storage.local.get("aiConfig");return q(e.aiConfig)}async function pt(e){if(!e.aiConfig.enabled||e.elements.length===0)return{resolutions:[],totalCostUsd:0};const t=j(e.aiConfig);if(!t.ok)return{resolutions:[],totalCostUsd:0};const r=t.client,a=Q(e.aiConfig.costCapUsd),n=[],o=await se(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 gt(e.ruleId,i.selector,i),l=s.get(`${e.ruleId}::${i.selector}`),u=ft(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) — math overrides cache + AI`),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}if(l&&l.inputHash===c&&l.verdict!=="uncertain"){A.info(`Reusing cached resolution for ${e.ruleId} on ${i.selector} (hash match, verdict=${l.verdict})`);const d=K(l.reasoning,l.verdict);n.push({...l,verdict:d,resolvedAt:new Date().toISOString(),costUsd:0,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 p=K(d.reasoning,d.verdict);n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:i.selector,verdict:p,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 ie(n),{resolutions:n,totalCostUsd:a.state.spentUsd}}function ht(){return E("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await Et();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 pt({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 E("INTERACTIVE_AUDIT_REQUEST",async e=>{try{switch(e.criterionId){case"2.4.3":{const t=await ge({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 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.4.7":{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"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 ue({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 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"2.5.3":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=await ce({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 te=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}),te.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){te.debug("throttle reset commands failed (debugger may not be attached)",t)}}const f=S("service-worker");xe("service-worker");Ee();var I,W;(W=(I=chrome.sidePanel)==null?void 0:I.setPanelBehavior)==null||W.call(I,{openPanelOnActionClick:!0}).catch(e=>f.warn("setPanelBehavior failed",e));pe();he();Se();Te().catch(e=>f.warn("initial cloud pull failed",e));(async()=>(await me(),await Ye(),J(),Ie(),Re(),we()))();chrome.alarms.onAlarm.addListener(e=>{const t=Ae(e.name);t!==null&&ye(t).catch(r=>f.warn(`scheduled audit ${t} threw at top level`,r))});ze();_e();Ce();st();lt();be();ht();St();self.addEventListener("unhandledrejection",e=>{const t=e.reason;Le(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 Oe()});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 re(){const e=await _();if(e)try{await Y(e,{type:"SIDEBAR_HIDE_REQUEST"})}catch(t){f.warn("sidebar hide failed",t)}}async function N(){const e=await _();if(e)try{await Y(e,{type:"SIDEBAR_SHOW_REQUEST"})}catch(t){f.warn("sidebar show failed",t)}}E("START_AUDIT",async e=>{U=!1,await re();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 $(async()=>{const{QUICK_SCAN_MATRIX_SETTINGS:o}=await import("./ai-usage-log-CkcnHkrk.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=ve(T);else if(e.mode==="parallel-scan"){const{runParallelScan:n}=await $(async()=>{const{runParallelScan:o}=await import("./scheduled-audit-runner-lRj-3bwG.js").then(s=>s.aO);return{runParallelScan:o}},__vite__mapDeps([2,3,1,0]));r=n(T)}else r=Pe(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);De({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&&X(t).catch(n=>f.debug("post-audit debugger release failed (best-effort)",n)),y||N()})});E("CANCEL_AUDIT",async()=>{U=!0,f.info("cancel requested")});let k=!1;const bt={isCanceled:()=>k};E("START_SITE_CRAWL",async e=>{k=!1,await re();const t=await _();Ue(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&&X(t).catch(r=>f.debug("post-crawl debugger release failed (best-effort)",r)),y||N()})});E("CANCEL_SITE_CRAWL",async()=>{k=!0,f.info("site crawl cancel requested")});E("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});E("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)}}});E("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)}}});E("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");
|