mcp-accessibility-scanner 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +232 -7
  2. package/lib/browserContextFactory.js +645 -32
  3. package/lib/browserContextFactory.js.map +1 -1
  4. package/lib/browserServerBackend.js +8 -2
  5. package/lib/browserServerBackend.js.map +1 -1
  6. package/lib/context.js +179 -62
  7. package/lib/context.js.map +1 -1
  8. package/lib/extension/extensionContextFactory.js +3 -0
  9. package/lib/extension/extensionContextFactory.js.map +1 -1
  10. package/lib/mcp/proxyBackend.js +1 -0
  11. package/lib/mcp/proxyBackend.js.map +1 -1
  12. package/lib/networkPolicy.js +73 -0
  13. package/lib/networkPolicy.js.map +1 -0
  14. package/lib/program.js +21 -3
  15. package/lib/program.js.map +1 -1
  16. package/lib/response.js +8 -3
  17. package/lib/response.js.map +1 -1
  18. package/lib/tab.js +117 -16
  19. package/lib/tab.js.map +1 -1
  20. package/lib/tools/auditKeyboard.js +203 -0
  21. package/lib/tools/auditKeyboard.js.map +1 -1
  22. package/lib/tools/auditScreenReader.js +826 -0
  23. package/lib/tools/auditScreenReader.js.map +1 -0
  24. package/lib/tools/auditSite.js +267 -86
  25. package/lib/tools/auditSite.js.map +1 -1
  26. package/lib/tools/axe.js +479 -21
  27. package/lib/tools/axe.js.map +1 -1
  28. package/lib/tools/dialogs.js +18 -4
  29. package/lib/tools/dialogs.js.map +1 -1
  30. package/lib/tools/evaluate.js +34 -5
  31. package/lib/tools/evaluate.js.map +1 -1
  32. package/lib/tools/keyboard.js +1 -2
  33. package/lib/tools/keyboard.js.map +1 -1
  34. package/lib/tools/navigate.js +2 -1
  35. package/lib/tools/navigate.js.map +1 -1
  36. package/lib/tools/network.js +225 -8
  37. package/lib/tools/network.js.map +1 -1
  38. package/lib/tools/scanPageMatrix.js +134 -43
  39. package/lib/tools/scanPageMatrix.js.map +1 -1
  40. package/lib/tools/screenshot.js +3 -3
  41. package/lib/tools/screenshot.js.map +1 -1
  42. package/lib/tools/snapshot.js +269 -8
  43. package/lib/tools/snapshot.js.map +1 -1
  44. package/lib/tools/tool.js.map +1 -1
  45. package/lib/tools/utils.js +62 -6
  46. package/lib/tools/utils.js.map +1 -1
  47. package/lib/tools.js +5 -2
  48. package/lib/tools.js.map +1 -1
  49. package/lib/utils/dataUrl.js +58 -35
  50. package/lib/utils/dataUrl.js.map +1 -1
  51. package/lib/utils/jsSource.js +187 -0
  52. package/lib/utils/jsSource.js.map +1 -0
  53. package/lib/vscode/browserContextFactory.js +83 -0
  54. package/lib/vscode/browserContextFactory.js.map +1 -0
  55. package/lib/vscode/host.js +16 -1
  56. package/lib/vscode/host.js.map +1 -1
  57. package/lib/vscode/main.js +1 -33
  58. package/lib/vscode/main.js.map +1 -1
  59. package/package.json +6 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auditScreenReader.js","sourceRoot":"","sources":["../../src/tools/auditScreenReader.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import RE2 from 're2';
3
3
  import { z } from 'zod';
4
4
  import { defineTabTool } from './tool.js';
5
5
  import { sanitizeForFilePath } from '../utils/fileUtils.js';
6
- import { axeTagValues, dedupeAxeNodes, runAxeScan, summarizeAxeViolations, trimAxeResults } from './axe.js';
6
+ import { assertRuleOptionsValid, axeRuleSchemaShape, axeScopeSchemaShape, axeTagValues, defaultAxeTags, prepareAxeResults, runAxeScan, summarizeAxeViolations, } from './axe.js';
7
7
  const defaultIgnoreQueryParams = [
8
8
  'utm_source',
9
9
  'utm_medium',
@@ -36,10 +36,13 @@ const auditSiteSchema = z.object({
36
36
  includeSubdomains: z.boolean().default(false).describe('Only applies when sameOriginOnly=true. When enabled, also allows subdomains of the start host (e.g. blog.example.com when start host is example.com). Ignored when sameOriginOnly=false.'),
37
37
  excludePathPatterns: z.array(z.string()).default(defaultExcludePathPatterns).describe('Regex patterns applied to pathname+query. Avoid complex nested quantifiers to prevent performance issues.'),
38
38
  ignoreQueryParams: z.array(z.string()).default(defaultIgnoreQueryParams).describe('Query parameters dropped during URL normalization.'),
39
- violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...axeTagValues]).describe('Axe tags to include in scans.'),
39
+ violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...defaultAxeTags]).describe('Axe tags to include in scans.'),
40
+ includeIncomplete: z.boolean().default(true).describe('Also collect Axe "incomplete" results — checks Axe could not decide automatically. They are reported separately from violations.'),
40
41
  maxNodesPerViolation: z.number().int().min(1).max(50).default(10).describe('Maximum nodes kept per violation in the report.'),
41
42
  waitAfterNavigationMs: z.number().int().min(0).max(5000).default(250).describe('Extra wait after navigation before scanning.'),
42
43
  reportFile: z.string().optional().describe('Output JSON report file name.'),
44
+ ...axeScopeSchemaShape,
45
+ ...axeRuleSchemaShape,
43
46
  }).superRefine((value, context) => {
44
47
  if (value.strategy === 'provided' && (!value.urls || !value.urls.length)) {
45
48
  context.addIssue({
@@ -139,21 +142,75 @@ function normalizeUrl(rawUrl, baseUrl, ignoredParams) {
139
142
  url.pathname = url.pathname.slice(0, -1);
140
143
  return url;
141
144
  }
142
- async function extractLinks(page) {
143
- return await page.evaluate(() => {
144
- return Array.from(document.querySelectorAll('a[href]'))
145
- .map(anchor => anchor.href)
146
- .filter(Boolean);
147
- });
145
+ /**
146
+ * Cookies the crawled URLs would actually send, keyed by name + domain + path and
147
+ * mapped to the name and expiry needed to report on them. Scoping to the crawl URLs
148
+ * keeps an unrelated origin's expiring cookie from raising a false alarm, and keying
149
+ * on the full identity stops a same-named cookie elsewhere from masking a deleted one.
150
+ * Values are deliberately not compared: a rotating CSRF token is not a lost session.
151
+ * Ceiling: a session cookie scoped to a path below the crawl URLs is not tracked.
152
+ */
153
+ async function readCrawlCookies(page, urls) {
154
+ const cookies = await page.context().cookies(urls);
155
+ return new Map(cookies.map(cookie => [`${cookie.name}\n${cookie.domain}\n${cookie.path}`, { name: cookie.name, expires: cookie.expires }]));
148
156
  }
149
- async function extractNavLinks(page) {
150
- return await page.evaluate(() => {
151
- const selectors = 'nav a[href], header a[href], [role="navigation"] a[href]';
152
- return Array.from(document.querySelectorAll(selectors))
153
- .map(anchor => anchor.href)
154
- .filter(Boolean);
155
- });
157
+ /**
158
+ * Baseline cookies the context no longer carries, or null when nothing is missing.
159
+ *
160
+ * A cookie whose own expiry has already passed was deleted by the clock rather than
161
+ * by the site, so it is not a lost session: Cloudflare's `__cf_bm` lives 30 minutes
162
+ * and would otherwise warn on any longer crawl. Cookies are still not classified as
163
+ * "authentication" ones — no cookie attribute marks that, and every proxy for it
164
+ * (httpOnly, session scope) misfires both ways on real sites, which would turn a
165
+ * false warning into a missed logout.
166
+ *
167
+ * A cookie read failure yields no loss: the context is gone, and aborting here would
168
+ * throw away the pages already scanned along with the navigation error for this one.
169
+ *
170
+ * The identities of the missing cookies are returned so the caller can drop them
171
+ * from the baseline: each cookie is reported once, at the URL where it vanished,
172
+ * and monitoring continues afterwards — an analytics cookie expiring early in the
173
+ * crawl must not mask the real session cookie being dropped ten pages later.
174
+ */
175
+ async function findCookieLoss(page, urls, baseline, requestedUrl, urlBeforeNavigation) {
176
+ const current = await readCrawlCookies(page, urls).catch(() => null);
177
+ if (!current)
178
+ return null;
179
+ const now = Date.now();
180
+ const missing = [...baseline]
181
+ .filter(([identity, cookie]) => !current.has(identity) && !(cookie.expires > 0 && cookie.expires * 1000 <= now));
182
+ if (!missing.length)
183
+ return null;
184
+ // The page reached after redirects is the one that dropped the cookie, and the one
185
+ // worth excluding; the queued URL may only have pointed at it. A navigation that
186
+ // never committed leaves the tab on the previous page, which is innocent — there
187
+ // the URL asked for is the one whose response dropped the cookie.
188
+ const reachedUrl = page.url();
189
+ const url = !reachedUrl || reachedUrl === urlBeforeNavigation ? requestedUrl : reachedUrl;
190
+ return {
191
+ url,
192
+ cookies: [...new Set(missing.map(([, cookie]) => cookie.name))],
193
+ identities: missing.map(([identity]) => identity),
194
+ };
156
195
  }
196
+ /**
197
+ * Title and outgoing links in one round trip: both are wanted for every crawled
198
+ * page, and a second evaluate per page is pure latency on a 200-page crawl.
199
+ * `linkSelector` is empty when this page contributes no links (depth exhausted,
200
+ * or a strategy that only reads the entry page).
201
+ */
202
+ async function readPage(page, linkSelector) {
203
+ return await page.evaluate(selector => ({
204
+ title: document.title,
205
+ links: selector
206
+ ? Array.from(document.querySelectorAll(selector))
207
+ .map(anchor => anchor.href)
208
+ .filter(Boolean)
209
+ : [],
210
+ }), linkSelector);
211
+ }
212
+ const allLinksSelector = 'a[href]';
213
+ const navLinksSelector = 'nav a[href], header a[href], [role="navigation"] a[href]';
157
214
  async function extractSitemapUrls(page, sitemapUrl) {
158
215
  const response = await page.request.get(sitemapUrl, { timeout: 15000 });
159
216
  if (!response.ok())
@@ -162,6 +219,62 @@ async function extractSitemapUrls(page, sitemapUrl) {
162
219
  const matches = [...xmlText.matchAll(/<loc>([\s\S]*?)<\/loc>/gi)];
163
220
  return matches.map(match => match[1].replace('<![CDATA[', '').replace(']]>', '').trim()).filter(Boolean);
164
221
  }
222
+ function aggregateIntoSummary(summaryByRuleId, violations, pageUrl) {
223
+ for (const violation of violations) {
224
+ const existingSummary = summaryByRuleId.get(violation.id);
225
+ const summary = existingSummary ?? {
226
+ id: violation.id,
227
+ impact: violation.impact,
228
+ tags: [...violation.tags],
229
+ help: violation.help,
230
+ helpUrl: violation.helpUrl,
231
+ description: violation.description,
232
+ pagesAffected: new Set(),
233
+ totalOccurrences: 0,
234
+ fingerprints: new Set(),
235
+ sampleNodes: [],
236
+ };
237
+ summary.pagesAffected.add(pageUrl);
238
+ summary.totalOccurrences += violation.nodes.length;
239
+ for (const node of violation.nodes) {
240
+ // The fingerprint set is scoped to one violation id, so the
241
+ // normalized node HTML alone identifies a unique occurrence.
242
+ const fingerprint = fastFingerprint(normalizeWhitespace(node.html ?? ''));
243
+ if (summary.fingerprints.has(fingerprint))
244
+ continue;
245
+ summary.fingerprints.add(fingerprint);
246
+ if (summary.sampleNodes.length < 3) {
247
+ summary.sampleNodes.push({
248
+ pageUrl,
249
+ target: [...(node.target ?? [])],
250
+ html: node.html ?? '',
251
+ failureSummary: node.failureSummary ?? null,
252
+ });
253
+ }
254
+ }
255
+ summaryByRuleId.set(violation.id, summary);
256
+ }
257
+ }
258
+ function toSortedSummaryViolations(summaryByRuleId) {
259
+ return [...summaryByRuleId.values()].map(summary => ({
260
+ id: summary.id,
261
+ impact: summary.impact,
262
+ tags: summary.tags,
263
+ help: summary.help,
264
+ helpUrl: summary.helpUrl,
265
+ description: summary.description,
266
+ pagesAffected: [...summary.pagesAffected],
267
+ totalOccurrences: summary.totalOccurrences,
268
+ uniqueOccurrences: summary.fingerprints.size,
269
+ sampleNodes: summary.sampleNodes,
270
+ })).sort((first, second) => {
271
+ const firstImpact = impactPriority[first.impact ?? 'unknown'] ?? impactPriority.unknown;
272
+ const secondImpact = impactPriority[second.impact ?? 'unknown'] ?? impactPriority.unknown;
273
+ if (firstImpact !== secondImpact)
274
+ return firstImpact - secondImpact;
275
+ return second.pagesAffected.length - first.pagesAffected.length;
276
+ });
277
+ }
165
278
  function summarizeTopViolations(violations, count) {
166
279
  return violations
167
280
  .slice(0, count)
@@ -187,6 +300,10 @@ const auditSite = defineTabTool({
187
300
  type: 'destructive',
188
301
  },
189
302
  handle: async (tab, params, response) => {
303
+ // Rule ids apply to the whole run, so a bad one must fail before any tab is
304
+ // opened or any URL visited; leaving it to the per-page scan would crawl the
305
+ // entire site and write a "completed" report of nothing but errored pages.
306
+ assertRuleOptionsValid({ rules: params.withRules, disableRules: params.disableRules });
190
307
  const context = tab.context;
191
308
  const originalTab = tab;
192
309
  const queue = [];
@@ -205,6 +322,7 @@ const auditSite = defineTabTool({
205
322
  const ignoredParams = new Set(params.ignoreQueryParams.map(param => param.toLowerCase()));
206
323
  const excludePatterns = buildExcludePathPatterns(params.excludePathPatterns);
207
324
  const summaryByViolation = new Map();
325
+ const summaryByIncomplete = new Map();
208
326
  const enqueueUrl = (rawUrl, depth, discoveredFrom) => {
209
327
  const normalizedUrl = normalizeUrl(rawUrl, startUrl, ignoredParams);
210
328
  if (!normalizedUrl) {
@@ -228,8 +346,11 @@ const auditSite = defineTabTool({
228
346
  skippedUrls++;
229
347
  return;
230
348
  }
349
+ const cookieUrl = new URL(rawUrl, startUrl);
350
+ cookieUrl.hash = '';
231
351
  queue.push({
232
352
  url: normalizedUrlString,
353
+ cookieUrl: cookieUrl.toString(),
233
354
  depth,
234
355
  discoveredFrom,
235
356
  });
@@ -262,6 +383,19 @@ const auditSite = defineTabTool({
262
383
  message: `Initialized site audit with ${queue.length} queued URL(s).`,
263
384
  });
264
385
  const crawlTab = await context.newTab();
386
+ // Cookies the crawl URLs carry before the crawl are the session the caller
387
+ // signed in with. If one disappears mid-crawl every later page is audited as a
388
+ // signed-out user, which still looks like a clean run, so record where it happened.
389
+ const cookieScopeUrls = queue.map(item => item.cookieUrl);
390
+ const cookieScope = new Set(cookieScopeUrls);
391
+ // The whole jar is snapshotted once, so a URL discovered mid-crawl can only
392
+ // add identities that existed when the crawl started. Without this, a cookie
393
+ // minted by an earlier crawled page would enter the baseline at discovery
394
+ // and its later removal would be misreported as losing a crawl-start cookie.
395
+ const initialCookieIdentities = new Set((await crawlTab.page.context().cookies().catch(() => []))
396
+ .map(cookie => `${cookie.name}\n${cookie.domain}\n${cookie.path}`));
397
+ const baselineCookies = await readCrawlCookies(crawlTab.page, cookieScopeUrls);
398
+ const sessionLosses = [];
265
399
  let processedPages = 0;
266
400
  try {
267
401
  while (queue.length && pages.length < params.maxPages) {
@@ -281,64 +415,63 @@ const auditSite = defineTabTool({
281
415
  error: null,
282
416
  summary: null,
283
417
  violations: [],
418
+ incomplete: [],
419
+ unscannedFrames: [],
284
420
  };
285
421
  pages.push(pageReport);
422
+ // URLs discovered mid-crawl join cookie tracking before they are visited:
423
+ // a session cookie scoped below the start URL (say /app, discovered from /)
424
+ // is invisible to the start-URL baseline, so deleting it later would
425
+ // otherwise never raise a warning. Read before navigating — the visit
426
+ // itself may be what drops the cookie. Only identities from the crawl-start
427
+ // jar snapshot may join, so the warning's "present when the crawl started"
428
+ // stays literally true. Ceiling: a crawl-start cookie deleted before its
429
+ // scope URL is discovered is not seen by this live read and goes
430
+ // unreported — accepted, because deciding which snapshot cookies apply to
431
+ // a URL ourselves would reimplement browser cookie matching, and getting
432
+ // that wrong turns into false session-loss warnings.
433
+ if (!cookieScope.has(item.cookieUrl)) {
434
+ cookieScope.add(item.cookieUrl);
435
+ cookieScopeUrls.push(item.cookieUrl);
436
+ const discovered = await readCrawlCookies(crawlTab.page, [item.cookieUrl]).catch(() => null);
437
+ for (const [identity, cookie] of discovered ?? []) {
438
+ if (initialCookieIdentities.has(identity) && !baselineCookies.has(identity))
439
+ baselineCookies.set(identity, cookie);
440
+ }
441
+ }
442
+ const urlBeforeNavigation = crawlTab.page.url();
286
443
  try {
287
444
  await crawlTab.navigate(item.url);
288
445
  await crawlTab.waitForTimeout(params.waitAfterNavigationMs);
289
- pageReport.title = await crawlTab.page.title();
290
- const axeResult = await runAxeScan(crawlTab.page, params.violationsTag);
291
- const dedupedViolations = axeResult.violations.map(violation => ({
292
- ...violation,
293
- nodes: dedupeAxeNodes(violation.nodes),
294
- }));
295
- const trimmedViolations = trimAxeResults({ violations: dedupedViolations }, { maxNodesPerViolation: params.maxNodesPerViolation, dedupe: false });
446
+ // Discover before scanning. A scoped scan throws when an
447
+ // includeSelectors entry is absent from this page, and that must not
448
+ // silently drop every descendant reachable only through it.
449
+ let linkSelector = '';
450
+ if (params.strategy === 'links' && item.depth < params.maxDepth)
451
+ linkSelector = allLinksSelector;
452
+ else if (params.strategy === 'nav' && item.depth === 0)
453
+ linkSelector = navLinksSelector;
454
+ const { title, links } = await readPage(crawlTab.page, linkSelector);
455
+ pageReport.title = title;
456
+ for (const link of links)
457
+ enqueueUrl(link, item.depth + 1, item.url);
458
+ const axeResult = await runAxeScan(crawlTab.page, {
459
+ tags: params.violationsTag,
460
+ rules: params.withRules,
461
+ disableRules: params.disableRules,
462
+ include: params.includeSelectors,
463
+ exclude: params.excludeSelectors,
464
+ });
465
+ const violations = prepareAxeResults(axeResult.violations, params.maxNodesPerViolation);
296
466
  pageReport.status = 'scanned';
297
- pageReport.violations = trimmedViolations;
298
- pageReport.summary = summarizeAxeViolations(trimmedViolations);
299
- for (const violation of dedupedViolations) {
300
- const existingSummary = summaryByViolation.get(violation.id);
301
- const summary = existingSummary ?? {
302
- id: violation.id,
303
- impact: violation.impact,
304
- tags: [...violation.tags],
305
- help: violation.help,
306
- helpUrl: violation.helpUrl,
307
- description: violation.description,
308
- pagesAffected: new Set(),
309
- totalOccurrences: 0,
310
- fingerprints: new Set(),
311
- sampleNodes: [],
312
- };
313
- summary.pagesAffected.add(item.url);
314
- summary.totalOccurrences += violation.nodes.length;
315
- for (const node of violation.nodes) {
316
- // The fingerprint set is scoped to one violation id, so the
317
- // normalized node HTML alone identifies a unique occurrence.
318
- const fingerprint = fastFingerprint(normalizeWhitespace(node.html ?? ''));
319
- if (summary.fingerprints.has(fingerprint))
320
- continue;
321
- summary.fingerprints.add(fingerprint);
322
- if (summary.sampleNodes.length < 3) {
323
- summary.sampleNodes.push({
324
- pageUrl: item.url,
325
- target: [...(node.target ?? [])],
326
- html: node.html ?? '',
327
- failureSummary: node.failureSummary ?? null,
328
- });
329
- }
330
- }
331
- summaryByViolation.set(violation.id, summary);
332
- }
333
- if (params.strategy === 'links' && item.depth < params.maxDepth) {
334
- const links = await extractLinks(crawlTab.page);
335
- for (const link of links)
336
- enqueueUrl(link, item.depth + 1, item.url);
337
- }
338
- if (params.strategy === 'nav' && item.depth === 0) {
339
- const links = await extractNavLinks(crawlTab.page);
340
- for (const link of links)
341
- enqueueUrl(link, item.depth + 1, item.url);
467
+ pageReport.unscannedFrames = axeResult.unscannedFrames;
468
+ pageReport.violations = violations.trimmed;
469
+ pageReport.summary = summarizeAxeViolations(violations.trimmed);
470
+ aggregateIntoSummary(summaryByViolation, violations.deduped, item.url);
471
+ if (params.includeIncomplete) {
472
+ const incomplete = prepareAxeResults(axeResult.incomplete, params.maxNodesPerViolation);
473
+ pageReport.incomplete = incomplete.trimmed;
474
+ aggregateIntoSummary(summaryByIncomplete, incomplete.deduped, item.url);
342
475
  }
343
476
  }
344
477
  catch (error) {
@@ -347,6 +480,25 @@ const auditSite = defineTabTool({
347
480
  pageReport.error = error instanceof Error ? error.message : String(error);
348
481
  }
349
482
  finally {
483
+ // Checked after failed navigations too: a logout URL that clears the cookie
484
+ // and then times out still ended the session, and skipping it pins the
485
+ // warning on the next page that happens to load — an innocent route.
486
+ // Monitoring never stops at the first loss: reported cookies leave the
487
+ // baseline, so each later disappearance is still caught and attributed
488
+ // to its own URL instead of being masked by an earlier, unrelated one.
489
+ if (baselineCookies.size) {
490
+ const loss = await findCookieLoss(crawlTab.page, cookieScopeUrls, baselineCookies, item.url, urlBeforeNavigation);
491
+ if (loss) {
492
+ sessionLosses.push({ url: loss.url, cookies: loss.cookies });
493
+ // Removed from the jar snapshot too, or a later-discovered URL
494
+ // could re-admit an already-reported cookie to the baseline and
495
+ // report the same loss twice.
496
+ for (const identity of loss.identities) {
497
+ baselineCookies.delete(identity);
498
+ initialCookieIdentities.delete(identity);
499
+ }
500
+ }
501
+ }
350
502
  processedPages++;
351
503
  const message = pageReport.status === 'scanned'
352
504
  ? `Scanned page ${processedPages}/${params.maxPages}: ${item.url}`
@@ -367,24 +519,11 @@ const auditSite = defineTabTool({
367
519
  if (originalTabIndex !== -1)
368
520
  await context.selectTab(originalTabIndex);
369
521
  }
370
- const summaryViolations = [...summaryByViolation.values()].map(summary => ({
371
- id: summary.id,
372
- impact: summary.impact,
373
- tags: summary.tags,
374
- help: summary.help,
375
- helpUrl: summary.helpUrl,
376
- description: summary.description,
377
- pagesAffected: [...summary.pagesAffected],
378
- totalOccurrences: summary.totalOccurrences,
379
- uniqueOccurrences: summary.fingerprints.size,
380
- sampleNodes: summary.sampleNodes,
381
- })).sort((first, second) => {
382
- const firstImpact = impactPriority[first.impact ?? 'unknown'] ?? impactPriority.unknown;
383
- const secondImpact = impactPriority[second.impact ?? 'unknown'] ?? impactPriority.unknown;
384
- if (firstImpact !== secondImpact)
385
- return firstImpact - secondImpact;
386
- return second.pagesAffected.length - first.pagesAffected.length;
387
- });
522
+ const summaryViolations = toSortedSummaryViolations(summaryByViolation);
523
+ const summaryIncomplete = toSortedSummaryViolations(summaryByIncomplete);
524
+ // A partly-scanned page reports fewer violations, and a reader counting them
525
+ // must know which pages those numbers are incomplete for.
526
+ const pagesWithUnscannedFrames = pages.filter(page => page.unscannedFrames.length);
388
527
  const scannedPagesByViolations = sortScannedPagesByViolations(pages);
389
528
  const summary = {
390
529
  totals: {
@@ -394,9 +533,12 @@ const auditSite = defineTabTool({
394
533
  queuedUrls: visited.size,
395
534
  },
396
535
  violations: summaryViolations,
536
+ incomplete: summaryIncomplete,
397
537
  };
398
538
  const report = {
399
- version: 'v1',
539
+ // v2: the singular `sessionLoss` object became the `sessionLosses` list,
540
+ // so a consumer keying its parser on the version has a signal.
541
+ version: 'v2',
400
542
  metadata: {
401
543
  startUrl: startUrl.toString(),
402
544
  strategy: params.strategy,
@@ -408,6 +550,11 @@ const auditSite = defineTabTool({
408
550
  excludePathPatterns: params.excludePathPatterns,
409
551
  ignoreQueryParams: params.ignoreQueryParams,
410
552
  violationsTag: params.violationsTag,
553
+ includeIncomplete: params.includeIncomplete,
554
+ includeSelectors: params.includeSelectors ?? null,
555
+ excludeSelectors: params.excludeSelectors ?? null,
556
+ withRules: params.withRules ?? null,
557
+ disableRules: params.disableRules ?? null,
411
558
  maxNodesPerViolation: params.maxNodesPerViolation,
412
559
  waitAfterNavigationMs: params.waitAfterNavigationMs,
413
560
  },
@@ -417,6 +564,7 @@ const auditSite = defineTabTool({
417
564
  },
418
565
  pages,
419
566
  summary,
567
+ sessionLosses,
420
568
  };
421
569
  const reportFileName = sanitizeForFilePath(params.reportFile ?? `audit-site-${safeIsoTimestampForFileName()}.json`);
422
570
  const reportPath = await context.outputFile(reportFileName);
@@ -429,6 +577,9 @@ const auditSite = defineTabTool({
429
577
  });
430
578
  response.setStructuredContent({
431
579
  kind: 'audit_site',
580
+ // Mirrors the JSON report version: v2 replaced the singular sessionLoss
581
+ // object with the sessionLosses list on both surfaces.
582
+ version: 'v2',
432
583
  report: {
433
584
  path: reportPath,
434
585
  uri: reportResourceLink.uri,
@@ -442,6 +593,11 @@ const auditSite = defineTabTool({
442
593
  durationMs: report.metadata.durationMs,
443
594
  },
444
595
  totals: summary.totals,
596
+ sessionLosses,
597
+ pagesWithUnscannedFrames: pagesWithUnscannedFrames.map(page => ({
598
+ url: page.url,
599
+ unscannedFrames: page.unscannedFrames,
600
+ })),
445
601
  topViolations: summaryViolations.slice(0, 5).map(violation => ({
446
602
  id: violation.id,
447
603
  impact: violation.impact ?? null,
@@ -449,6 +605,13 @@ const auditSite = defineTabTool({
449
605
  totalOccurrences: violation.totalOccurrences,
450
606
  helpUrl: violation.helpUrl,
451
607
  })),
608
+ topIncomplete: summaryIncomplete.slice(0, 5).map(item => ({
609
+ id: item.id,
610
+ impact: item.impact ?? null,
611
+ pagesAffected: item.pagesAffected.length,
612
+ totalOccurrences: item.totalOccurrences,
613
+ helpUrl: item.helpUrl,
614
+ })),
452
615
  topPages: scannedPagesByViolations
453
616
  .slice(0, 5)
454
617
  .map(page => ({
@@ -459,15 +622,33 @@ const auditSite = defineTabTool({
459
622
  })),
460
623
  });
461
624
  const topViolations = summarizeTopViolations(summaryViolations, 10);
625
+ const topIncomplete = summarizeTopViolations(summaryIncomplete, 10);
462
626
  const topPages = summarizeTopPages(scannedPagesByViolations, 20);
627
+ const frameWarning = pagesWithUnscannedFrames.length ? [
628
+ `WARNING: Axe could not be installed in frames on ${pagesWithUnscannedFrames.length} page(s); their contents were not scanned and contribute no findings below.`,
629
+ ...pagesWithUnscannedFrames.slice(0, 10).map(page => `- ${page.url}: ${page.unscannedFrames.join(', ')}`),
630
+ '',
631
+ ] : [];
632
+ const sessionWarning = sessionLosses.length ? [
633
+ ...sessionLosses.map(loss => `WARNING: cookie(s) ${loss.cookies.join(', ')} present when the crawl started disappeared while loading ${loss.url}.`),
634
+ 'If one of these was a session cookie, pages scanned after the URL that dropped it were audited as a signed-out user. Add that URL to excludePathPatterns, sign in again, and re-run.',
635
+ '',
636
+ ] : [];
463
637
  response.addCode('// Crawled pages in a temporary tab and aggregated Axe violations.');
464
638
  response.addResult([
639
+ ...frameWarning,
640
+ ...sessionWarning,
465
641
  `Scanned pages: ${summary.totals.scannedPages}`,
466
642
  `Errored pages: ${summary.totals.erroredPages}`,
467
643
  `Skipped URLs: ${summary.totals.skippedUrls}`,
468
644
  '',
469
645
  'Top violations by pages affected:',
470
646
  ...(topViolations.length ? topViolations : ['- None']),
647
+ ...(params.includeIncomplete ? [
648
+ '',
649
+ 'Top incomplete (needs review — verify these on the page):',
650
+ ...(topIncomplete.length ? topIncomplete : ['- None']),
651
+ ] : []),
471
652
  '',
472
653
  'Per-page summary (top 20 by violation count):',
473
654
  ...(topPages.length ? topPages : ['- None']),