lighthouse 13.4.1-dev.20260825 → 13.4.1-dev.20260831

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 (111) hide show
  1. package/core/audits/accessibility/accesskeys.js +1 -1
  2. package/core/audits/accessibility/aria-allowed-attr.js +1 -1
  3. package/core/audits/accessibility/aria-allowed-role.js +1 -1
  4. package/core/audits/accessibility/aria-command-name.js +1 -1
  5. package/core/audits/accessibility/aria-conditional-attr.js +1 -1
  6. package/core/audits/accessibility/aria-deprecated-role.js +1 -1
  7. package/core/audits/accessibility/aria-dialog-name.js +1 -1
  8. package/core/audits/accessibility/aria-hidden-body.js +1 -1
  9. package/core/audits/accessibility/aria-hidden-focus.js +1 -1
  10. package/core/audits/accessibility/aria-input-field-name.js +1 -1
  11. package/core/audits/accessibility/aria-meter-name.js +1 -1
  12. package/core/audits/accessibility/aria-progressbar-name.js +1 -1
  13. package/core/audits/accessibility/aria-prohibited-attr.js +1 -1
  14. package/core/audits/accessibility/aria-required-attr.js +1 -1
  15. package/core/audits/accessibility/aria-required-children.js +1 -1
  16. package/core/audits/accessibility/aria-required-parent.js +1 -1
  17. package/core/audits/accessibility/aria-roles.js +1 -1
  18. package/core/audits/accessibility/aria-text.js +1 -1
  19. package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
  20. package/core/audits/accessibility/aria-tooltip-name.js +1 -1
  21. package/core/audits/accessibility/aria-treeitem-name.js +1 -1
  22. package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
  23. package/core/audits/accessibility/aria-valid-attr.js +1 -1
  24. package/core/audits/accessibility/autocomplete-valid.js +1 -1
  25. package/core/audits/accessibility/button-name.js +1 -1
  26. package/core/audits/accessibility/bypass.js +1 -1
  27. package/core/audits/accessibility/color-contrast.js +1 -1
  28. package/core/audits/accessibility/definition-list.js +1 -1
  29. package/core/audits/accessibility/dlitem.js +1 -1
  30. package/core/audits/accessibility/document-title.js +1 -1
  31. package/core/audits/accessibility/duplicate-id-aria.js +1 -1
  32. package/core/audits/accessibility/empty-heading.js +1 -1
  33. package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
  34. package/core/audits/accessibility/frame-title.js +1 -1
  35. package/core/audits/accessibility/heading-order.js +1 -1
  36. package/core/audits/accessibility/html-has-lang.js +1 -1
  37. package/core/audits/accessibility/html-lang-valid.js +1 -1
  38. package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
  39. package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
  40. package/core/audits/accessibility/image-alt.js +1 -1
  41. package/core/audits/accessibility/image-redundant-alt.js +1 -1
  42. package/core/audits/accessibility/input-button-name.js +1 -1
  43. package/core/audits/accessibility/input-image-alt.js +1 -1
  44. package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
  45. package/core/audits/accessibility/label.js +1 -1
  46. package/core/audits/accessibility/landmark-one-main.js +1 -1
  47. package/core/audits/accessibility/link-in-text-block.js +1 -1
  48. package/core/audits/accessibility/link-name.js +1 -1
  49. package/core/audits/accessibility/list.js +1 -1
  50. package/core/audits/accessibility/listitem.js +1 -1
  51. package/core/audits/accessibility/meta-refresh.js +1 -1
  52. package/core/audits/accessibility/meta-viewport.js +1 -1
  53. package/core/audits/accessibility/object-alt.js +1 -1
  54. package/core/audits/accessibility/presentation-role-conflict.js +1 -1
  55. package/core/audits/accessibility/select-name.js +1 -1
  56. package/core/audits/accessibility/skip-link.js +1 -1
  57. package/core/audits/accessibility/svg-img-alt.js +1 -1
  58. package/core/audits/accessibility/tabindex.js +1 -1
  59. package/core/audits/accessibility/table-duplicate-name.js +1 -1
  60. package/core/audits/accessibility/table-fake-caption.js +1 -1
  61. package/core/audits/accessibility/target-size.js +1 -1
  62. package/core/audits/accessibility/td-has-header.js +1 -1
  63. package/core/audits/accessibility/td-headers-attr.js +1 -1
  64. package/core/audits/accessibility/th-has-data-cells.js +1 -1
  65. package/core/audits/accessibility/valid-lang.js +1 -1
  66. package/core/audits/accessibility/video-caption.js +1 -1
  67. package/core/audits/agentic/ard-schema.d.ts +19 -0
  68. package/core/audits/agentic/ard-schema.js +135 -0
  69. package/core/audits/baseline.d.ts +10 -5
  70. package/core/config/agentic-browsing-config.d.ts +2 -0
  71. package/core/config/agentic-browsing-config.js +12 -0
  72. package/core/config/default-config.js +12 -0
  73. package/core/gather/driver/execution-context.js +0 -2
  74. package/core/gather/driver/wait-for-condition.js +0 -6
  75. package/core/gather/fetcher.d.ts +9 -2
  76. package/core/gather/fetcher.js +30 -4
  77. package/core/gather/gatherers/accessibility.js +0 -2
  78. package/core/gather/gatherers/agentic/ard.d.ts +30 -0
  79. package/core/gather/gatherers/agentic/ard.js +125 -0
  80. package/core/gather/gatherers/anchor-elements.js +0 -2
  81. package/core/gather/gatherers/full-page-screenshot.js +0 -4
  82. package/core/gather/gatherers/iframe-elements.js +0 -2
  83. package/core/gather/gatherers/image-elements.js +0 -12
  84. package/core/gather/gatherers/inputs.js +0 -2
  85. package/core/gather/gatherers/link-elements.js +0 -2
  86. package/core/gather/gatherers/meta-elements.js +0 -3
  87. package/core/gather/gatherers/seo/robots-txt.d.ts +1 -0
  88. package/core/gather/gatherers/seo/robots-txt.js +3 -0
  89. package/core/gather/gatherers/stacks.js +0 -2
  90. package/core/gather/gatherers/trace-elements.js +0 -2
  91. package/core/gather/gatherers/viewport-dimensions.js +0 -2
  92. package/core/gather/session.js +1 -0
  93. package/core/lib/baseline/web-features-data.json +26 -13
  94. package/core/lib/baseline/web-features-metadata.json +1 -1
  95. package/core/lib/page-functions.d.ts +0 -3
  96. package/core/lib/page-functions.js +0 -3
  97. package/core/lib/rect-helpers.js +0 -8
  98. package/package.json +16 -11
  99. package/shared/localization/locales/en-US.json +99 -66
  100. package/shared/localization/locales/en-XL.json +99 -66
  101. package/third-party/ard/LICENSE +201 -0
  102. package/third-party/ard/README.md +27 -0
  103. package/third-party/ard/ard-test.d.ts +2 -0
  104. package/third-party/ard/ard-test.js +358 -0
  105. package/third-party/ard/ard.d.ts +34 -0
  106. package/third-party/ard/ard.js +204 -0
  107. package/third-party/ard/schema-validator.d.ts +20 -0
  108. package/third-party/ard/schema-validator.js +1700 -0
  109. package/third-party/ard/spec/schemas/ai-catalog.schema.json +292 -0
  110. package/tsconfig.json +1 -0
  111. package/types/artifacts.d.ts +14 -0
@@ -22,7 +22,7 @@ const UIStrings = {
22
22
  'or `role="presentation"` does not resolve to none or presentation. To ensure the ' +
23
23
  'element remains removed from the accessibility tree, you should not add any global ' +
24
24
  'ARIA attributes to the element or make it focusable. ' +
25
- '[Learn more about presentation role conflict](https://dequeuniversity.com/rules/axe/4.12/presentation-role-conflict).',
25
+ '[Learn more about presentation role conflict](https://dequeuniversity.com/rules/axe/4.13/presentation-role-conflict).',
26
26
  };
27
27
 
28
28
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'Form elements without effective labels can create frustrating experiences ' +
22
22
  'for screen reader users. ' +
23
- '[Learn more about the `select` element](https://dequeuniversity.com/rules/axe/4.12/select-name).',
23
+ '[Learn more about the `select` element](https://dequeuniversity.com/rules/axe/4.13/select-name).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -19,7 +19,7 @@ const UIStrings = {
19
19
  failureTitle: 'Skip links are not focusable.',
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'Including a skip link can help users skip to the main content to save time. ' +
22
- '[Learn more about skip links](https://dequeuniversity.com/rules/axe/4.12/skip-link).',
22
+ '[Learn more about skip links](https://dequeuniversity.com/rules/axe/4.13/skip-link).',
23
23
  };
24
24
 
25
25
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with \'Learn\' becomes link text to additional documentation. */
21
21
  description: 'Ensures SVG elements with an `img`, `graphics-document` or `graphics-symbol` ' +
22
22
  'role have an accessible text alternative. ' +
23
- '[Learn more about SVG alt text](https://dequeuniversity.com/rules/axe/4.12/svg-img-alt).',
23
+ '[Learn more about SVG alt text](https://dequeuniversity.com/rules/axe/4.13/svg-img-alt).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'A value greater than 0 implies an explicit navigation ordering. ' +
22
22
  'Although technically valid, this often creates frustrating experiences ' +
23
- 'for users who rely on assistive technologies. [Learn more about the `tabindex` attribute](https://dequeuniversity.com/rules/axe/4.12/tabindex).',
23
+ 'for users who rely on assistive technologies. [Learn more about the `tabindex` attribute](https://dequeuniversity.com/rules/axe/4.13/tabindex).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'The summary attribute should describe the table structure, while `<caption>` ' +
22
22
  'should have the onscreen title. Accurate table mark-up helps users of screen readers. ' +
23
- '[Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.12/table-duplicate-name).',
23
+ '[Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.13/table-duplicate-name).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -23,7 +23,7 @@ const UIStrings = {
23
23
  description: 'Screen readers have features to make navigating tables easier. Ensuring ' +
24
24
  'that tables use the actual caption element instead of cells with the `[colspan]` ' +
25
25
  'attribute may improve the experience for screen reader users. ' +
26
- '[Learn more about captions](https://dequeuniversity.com/rules/axe/4.12/table-fake-caption).',
26
+ '[Learn more about captions](https://dequeuniversity.com/rules/axe/4.13/table-fake-caption).',
27
27
  };
28
28
 
29
29
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'Touch targets with sufficient size and spacing help users who may have ' +
22
22
  'difficulty targeting small controls to activate the targets. ' +
23
- '[Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.12/target-size).',
23
+ '[Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.13/target-size).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -21,7 +21,7 @@ const UIStrings = {
21
21
  description: 'Screen readers have features to make navigating tables easier. Ensuring ' +
22
22
  'that `<td>` elements in a large table (3 or more cells in width and height) have an ' +
23
23
  'associated table header may improve the experience for screen reader users. ' +
24
- '[Learn more about table headers](https://dequeuniversity.com/rules/axe/4.12/td-has-header).',
24
+ '[Learn more about table headers](https://dequeuniversity.com/rules/axe/4.13/td-has-header).',
25
25
  };
26
26
 
27
27
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -24,7 +24,7 @@ const UIStrings = {
24
24
  description: 'Screen readers have features to make navigating tables easier. Ensuring ' +
25
25
  '`<td>` cells using the `[headers]` attribute only refer to other cells in the same ' +
26
26
  'table may improve the experience for screen reader users. ' +
27
- '[Learn more about the `headers` attribute](https://dequeuniversity.com/rules/axe/4.12/td-headers-attr).',
27
+ '[Learn more about the `headers` attribute](https://dequeuniversity.com/rules/axe/4.13/td-headers-attr).',
28
28
  };
29
29
 
30
30
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -23,7 +23,7 @@ const UIStrings = {
23
23
  description: 'Screen readers have features to make navigating tables easier. Ensuring ' +
24
24
  'table headers always refer to some set of cells may improve the experience for screen ' +
25
25
  'reader users. ' +
26
- '[Learn more about table headers](https://dequeuniversity.com/rules/axe/4.12/th-has-data-cells).',
26
+ '[Learn more about table headers](https://dequeuniversity.com/rules/axe/4.13/th-has-data-cells).',
27
27
  };
28
28
 
29
29
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -20,7 +20,7 @@ const UIStrings = {
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) ' +
22
22
  'on elements helps ensure that text is pronounced correctly by a screen reader. ' +
23
- '[Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.12/valid-lang).',
23
+ '[Learn how to use the `lang` attribute](https://dequeuniversity.com/rules/axe/4.13/valid-lang).',
24
24
  };
25
25
 
26
26
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -21,7 +21,7 @@ const UIStrings = {
21
21
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
22
22
  description: 'When a video provides a caption it is easier for deaf and hearing impaired ' +
23
23
  'users to access its information. ' +
24
- '[Learn more about video captions](https://dequeuniversity.com/rules/axe/4.12/video-caption).',
24
+ '[Learn more about video captions](https://dequeuniversity.com/rules/axe/4.13/video-caption).',
25
25
  };
26
26
 
27
27
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -0,0 +1,19 @@
1
+ export default ArdSchema;
2
+ declare class ArdSchema extends Audit {
3
+ /**
4
+ * @param {LH.Artifacts} artifacts
5
+ * @return {LH.Audit.Product}
6
+ */
7
+ static audit(artifacts: LH.Artifacts): LH.Audit.Product;
8
+ }
9
+ export namespace UIStrings {
10
+ let title: string;
11
+ let failureTitle: string;
12
+ let description: string;
13
+ let explanation: string;
14
+ let columnIssue: string;
15
+ let columnSeverity: string;
16
+ let itemSeverityError: string;
17
+ }
18
+ import { Audit } from '../audit.js';
19
+ //# sourceMappingURL=ard-schema.d.ts.map
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Audit that validates ai-catalog.json manifests against the Agentic Resource Discovery (ARD) specification.
9
+ *
10
+ * This implementation is a direct JavaScript port of `validate_manifest` from the official ARD Conformance Test suite:
11
+ * @see https://github.com/ards-project/ard-spec/blob/main/conformance/bin/conformance-test
12
+ * @see https://agenticresourcediscovery.org/spec/
13
+ * @version ARD Spec 1.0 / ADR-0003
14
+ */
15
+
16
+ import {Audit} from '../audit.js';
17
+ import * as i18n from '../../lib/i18n/i18n.js';
18
+ import {ConformanceTester} from '../../../third-party/ard/ard.js';
19
+
20
+ const UIStrings = {
21
+ /** Title of a Lighthouse audit that evaluates whether ai-catalog.json conforms to the ARD specification. Shown when valid. */
22
+ title: '`ai-catalog.json` schema is valid',
23
+ /** Title of a Lighthouse audit that evaluates whether ai-catalog.json conforms to the ARD specification. Shown when invalid. */
24
+ failureTitle: '`ai-catalog.json` schema is invalid',
25
+ /** Description of a Lighthouse audit that tells the user why ai-catalog.json must match the ARD specification. */
26
+ description: 'Valid `ai-catalog.json` manifests are required for autonomous ' +
27
+ 'AI agents and registries to discover and verify your resources. ' +
28
+ '[Learn more about the ARD specification](https://agenticresourcediscovery.org/spec/).',
29
+ /** Explanatory message stating that ai-catalog.json could not be loaded for schema validation. */
30
+ explanation: 'Catalog file could not be loaded for schema validation.',
31
+ /** Header of the table column which displays the issue. */
32
+ columnIssue: 'Issue',
33
+ /** Header of the table column which displays the severity. */
34
+ columnSeverity: 'Severity',
35
+ /** Table item value for an error severity. */
36
+ itemSeverityError: 'Error',
37
+ };
38
+
39
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
40
+
41
+ class ArdSchema extends Audit {
42
+ /**
43
+ * @return {LH.Audit.Meta}
44
+ */
45
+ static get meta() {
46
+ return {
47
+ id: 'ard-schema',
48
+ title: str_(UIStrings.title),
49
+ failureTitle: str_(UIStrings.failureTitle),
50
+ description: str_(UIStrings.description),
51
+ requiredArtifacts: ['AgentResourceDiscovery'],
52
+ supportedModes: ['navigation', 'snapshot'],
53
+ };
54
+ }
55
+
56
+ /**
57
+ * @param {LH.Artifacts} artifacts
58
+ * @return {LH.Audit.Product}
59
+ */
60
+ static audit(artifacts) {
61
+ const ard = artifacts.AgentResourceDiscovery;
62
+ const signals = ard.discoverySignals;
63
+
64
+ const hasExplicitSignal = Boolean(
65
+ signals.robotsTxtAgentmap ||
66
+ signals.htmlLink ||
67
+ signals.httpHeaderLink
68
+ );
69
+ const hasCatalog = hasExplicitSignal || ard.status === 200;
70
+
71
+ if (!hasCatalog) {
72
+ return {
73
+ score: 1,
74
+ notApplicable: true,
75
+ };
76
+ }
77
+
78
+ if (ard.status !== 200 || !ard.content) {
79
+ return {
80
+ score: 0,
81
+ explanation: str_(UIStrings.explanation),
82
+ };
83
+ }
84
+
85
+ const itemSeverityError = str_(UIStrings.itemSeverityError);
86
+ const itemSeverityLow = str_(i18n.UIStrings.itemSeverityLow);
87
+
88
+ /** @type {Array<{element: string, issue: string | LH.IcuMessage, severity: LH.IcuMessage}>} */
89
+ const issues = [];
90
+
91
+ /** @type {LH.Audit.Details.Table['headings']} */
92
+ const headings = [
93
+ {key: 'element', valueType: 'text', label: str_(i18n.UIStrings.columnElement)},
94
+ {key: 'issue', valueType: 'text', label: str_(UIStrings.columnIssue)},
95
+ {key: 'severity', valueType: 'text', label: str_(UIStrings.columnSeverity)},
96
+ ];
97
+
98
+ const tester = new ConformanceTester();
99
+ tester.validate_manifest(ard.content, 'ai-catalog.json');
100
+
101
+ for (const err of tester.errors) {
102
+ issues.push({
103
+ element: err.element,
104
+ issue: err.message,
105
+ severity: itemSeverityError,
106
+ });
107
+ }
108
+
109
+ for (const warn of tester.warnings) {
110
+ issues.push({
111
+ element: warn.element,
112
+ issue: warn.message,
113
+ severity: itemSeverityLow,
114
+ });
115
+ }
116
+
117
+ const hasErrors = issues.some(i => i.severity === itemSeverityError);
118
+ const hasLowSeverity = issues.some(i => i.severity === itemSeverityLow);
119
+
120
+ let score = 1;
121
+ if (hasErrors) {
122
+ score = 0;
123
+ } else if (hasLowSeverity) {
124
+ score = 0.9;
125
+ }
126
+
127
+ return {
128
+ score,
129
+ details: issues.length ? Audit.makeTableDetails(headings, issues) : undefined,
130
+ };
131
+ }
132
+ }
133
+
134
+ export default ArdSchema;
135
+ export {UIStrings};
@@ -34,6 +34,7 @@ declare class Baseline extends Audit {
34
34
  "array-findlast": string;
35
35
  "array-flat": string;
36
36
  "array-from": string;
37
+ "array-fromasync": string;
37
38
  "array-includes": string;
38
39
  "array-isarray": string;
39
40
  "array-iteration-methods": string;
@@ -51,6 +52,7 @@ declare class Baseline extends Audit {
51
52
  "audio-worklet": string;
52
53
  autofocus: string;
53
54
  "autonomous-custom-elements": string;
55
+ avif: string;
54
56
  b: string;
55
57
  backdrop: string;
56
58
  background: string;
@@ -148,6 +150,7 @@ declare class Baseline extends Audit {
148
150
  "data-urls": string;
149
151
  dataset: string;
150
152
  date: string;
153
+ "declarative-shadow-dom": string;
151
154
  "dedicated-workers": string;
152
155
  default: string;
153
156
  del: string;
@@ -186,6 +189,7 @@ declare class Baseline extends Audit {
186
189
  "ext-blend-minmax": string;
187
190
  "ext-color-buffer-float": string;
188
191
  "ext-color-buffer-half-float": string;
192
+ "ext-shader-texture-lod": string;
189
193
  "ext-srgb": string;
190
194
  "ext-texture-filter-anisotropic": string;
191
195
  fetch: string;
@@ -398,6 +402,7 @@ declare class Baseline extends Audit {
398
402
  "oes-texture-float": string;
399
403
  "oes-texture-float-linear": string;
400
404
  "oes-texture-half-float": string;
405
+ "oes-texture-half-float-linear": string;
401
406
  "oes-vertex-array-object": string;
402
407
  "offline-audio-context": string;
403
408
  "offscreen-canvas": string;
@@ -452,6 +457,7 @@ declare class Baseline extends Audit {
452
457
  queuemicrotask: string;
453
458
  quotes: string;
454
459
  "read-write-pseudos": string;
460
+ "rect-xywh": string;
455
461
  "referrer-policy": string;
456
462
  regexp: string;
457
463
  "relative-positioning": string;
@@ -645,7 +651,6 @@ declare class Baseline extends Audit {
645
651
  xhr: string;
646
652
  "xml-serializer": string;
647
653
  xpath: string;
648
- xslt: string;
649
654
  "z-index": string;
650
655
  };
651
656
  low: {
@@ -655,12 +660,10 @@ declare class Baseline extends Audit {
655
660
  "active-view-transition": string;
656
661
  "align-content-block": string;
657
662
  "alt-text-generated-content": string;
658
- "array-fromasync": string;
659
663
  "array-group": string;
660
664
  "async-clipboard": string;
661
665
  "atomics-pause": string;
662
666
  "atomics-wait-async": string;
663
- avif: string;
664
667
  "backdrop-filter": string;
665
668
  "baseline-shift": string;
666
669
  "canvas-2d-willreadfrequently": string;
@@ -673,11 +676,11 @@ declare class Baseline extends Audit {
673
676
  "contrast-color": string;
674
677
  "cookie-enabled": string;
675
678
  "crisp-edges": string;
676
- "declarative-shadow-dom": string;
677
679
  "details-content": string;
678
680
  "details-name": string;
679
681
  "document-caretpositionfrompoint": string;
680
682
  "event-timing": string;
683
+ "ext-texture-compression-rgtc": string;
681
684
  "fetch-priority": string;
682
685
  "field-sizing": string;
683
686
  float16array: string;
@@ -690,6 +693,7 @@ declare class Baseline extends Audit {
690
693
  http3: string;
691
694
  "input-file-webkitdirectory": string;
692
695
  "intl-duration-format": string;
696
+ "intl-locale-info": string;
693
697
  "intl-segmenter": string;
694
698
  "invoker-commands": string;
695
699
  "iterator-concat": string;
@@ -714,7 +718,6 @@ declare class Baseline extends Audit {
714
718
  rcap: string;
715
719
  rch: string;
716
720
  "readable-byte-streams": string;
717
- "rect-xywh": string;
718
721
  "regexp-escape": string;
719
722
  "registered-custom-properties": string;
720
723
  "relative-color": string;
@@ -738,6 +741,7 @@ declare class Baseline extends Audit {
738
741
  "set-methods": string;
739
742
  "shape-function": string;
740
743
  "shared-workers": string;
744
+ "sibling-count": string;
741
745
  "starting-style": string;
742
746
  state: string;
743
747
  "target-text": string;
@@ -758,6 +762,7 @@ declare class Baseline extends Audit {
758
762
  "view-transition-class": string;
759
763
  "view-transitions": string;
760
764
  "wasm-branch-hinting": string;
765
+ "wasm-exnref-exceptions": string;
761
766
  "wasm-extended-constant-expressions": string;
762
767
  "wasm-garbage-collection": string;
763
768
  "wasm-tail-call-optimization": string;
@@ -8,6 +8,8 @@ export namespace UIStrings {
8
8
  let webmcpGroupDescription: string;
9
9
  let agentAccessibilityGroupTitle: string;
10
10
  let agentAccessibilityGroupDescription: string;
11
+ let ardGroupTitle: string;
12
+ let ardGroupDescription: string;
11
13
  }
12
14
  import * as LH from '../../types/lh.js';
13
15
  //# sourceMappingURL=agentic-browsing-config.d.ts.map
@@ -23,6 +23,11 @@ const UIStrings = {
23
23
  /** Description of the Agent Accessibility group of audits. */
24
24
  agentAccessibilityGroupDescription: 'These audits highlight best practices for improving the ' +
25
25
  'accessibility of the website for AI agents.',
26
+ /** Title of the Agentic Resource Discovery (ARD, https://agenticresourcediscovery.org/spec/) group of audits. */
27
+ ardGroupTitle: 'Agentic Resource Discovery',
28
+ /** Description of the Agentic Resource Discovery (ARD, https://agenticresourcediscovery.org/spec/) group of audits. */
29
+ ardGroupDescription: 'These audits validate that agentic resources are ' +
30
+ 'discoverable, reachable, and conform to the ARD specification.',
26
31
  };
27
32
 
28
33
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -36,11 +41,13 @@ const config = {
36
41
  'webmcp-form-coverage',
37
42
  'webmcp-schema-validity',
38
43
  'agentic/llms-txt',
44
+ 'agentic/ard-schema',
39
45
  ],
40
46
  artifacts: [
41
47
  {id: 'WebMCP', gatherer: 'webmcp'},
42
48
  {id: 'WebMcpSchemaIssues', gatherer: 'webmcp-schema'},
43
49
  {id: 'LlmsTxt', gatherer: 'agentic/llms-txt'},
50
+ {id: 'AgentResourceDiscovery', gatherer: 'agentic/ard'},
44
51
  ],
45
52
  groups: {
46
53
  'webmcp': {
@@ -51,6 +58,10 @@ const config = {
51
58
  title: str_(UIStrings.agentAccessibilityGroupTitle),
52
59
  description: str_(UIStrings.agentAccessibilityGroupDescription),
53
60
  },
61
+ 'agent-resource-discovery': {
62
+ title: str_(UIStrings.ardGroupTitle),
63
+ description: str_(UIStrings.ardGroupDescription),
64
+ },
54
65
  },
55
66
  categories: {
56
67
  'agentic-browsing': {
@@ -65,6 +76,7 @@ const config = {
65
76
  {id: 'webmcp-schema-validity', weight: 1, group: 'webmcp'},
66
77
  {id: 'cumulative-layout-shift', weight: 1, acronym: 'CLS'},
67
78
  {id: 'llms-txt', weight: 1, group: 'agent-accessibility'},
79
+ {id: 'ard-schema', weight: 1, group: 'agent-resource-discovery'},
68
80
  ],
69
81
  },
70
82
  },
@@ -115,6 +115,11 @@ const UIStrings = {
115
115
  /** Description of the Agent Accessibility group of audits. */
116
116
  agentAccessibilityGroupDescription: 'These audits highlight best practices for improving the ' +
117
117
  'accessibility of the website for AI agents.',
118
+ /** Title of the Agentic Resource Discovery (ARD, https://agenticresourcediscovery.org/spec/) group of audits. */
119
+ ardGroupTitle: 'Agentic Resource Discovery',
120
+ /** Description of the Agentic Resource Discovery (ARD, https://agenticresourcediscovery.org/spec/) group of audits. */
121
+ ardGroupDescription: 'These audits validate that agentic resources are ' +
122
+ 'discoverable, reachable, and conform to the ARD specification.',
118
123
  };
119
124
 
120
125
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -145,6 +150,7 @@ const defaultConfig = {
145
150
  {id: 'MetaElements', gatherer: 'meta-elements'},
146
151
  {id: 'NetworkUserAgent', gatherer: 'network-user-agent'},
147
152
  {id: 'RobotsTxt', gatherer: 'seo/robots-txt'},
153
+ {id: 'AgentResourceDiscovery', gatherer: 'agentic/ard'},
148
154
  {id: 'Scripts', gatherer: 'scripts'},
149
155
  {id: 'SourceMaps', gatherer: 'source-maps'},
150
156
  {id: 'Stacks', gatherer: 'stacks'},
@@ -302,6 +308,7 @@ const defaultConfig = {
302
308
  'webmcp-form-coverage',
303
309
  'webmcp-schema-validity',
304
310
  'agentic/llms-txt',
311
+ 'agentic/ard-schema',
305
312
  'bf-cache',
306
313
  'insights/cache-insight',
307
314
  'insights/cls-culprits-insight',
@@ -397,6 +404,10 @@ const defaultConfig = {
397
404
  title: str_(UIStrings.agentAccessibilityGroupTitle),
398
405
  description: str_(UIStrings.agentAccessibilityGroupDescription),
399
406
  },
407
+ 'agent-resource-discovery': {
408
+ title: str_(UIStrings.ardGroupTitle),
409
+ description: str_(UIStrings.ardGroupDescription),
410
+ },
400
411
  // Group for audits that should not be displayed.
401
412
  'hidden': {title: ''},
402
413
  },
@@ -644,6 +655,7 @@ const defaultConfig = {
644
655
  {id: 'webmcp-schema-validity', weight: 1, group: 'webmcp'},
645
656
  {id: 'cumulative-layout-shift', weight: 1, acronym: 'CLS'},
646
657
  {id: 'llms-txt', weight: 1, group: 'agent-accessibility'},
658
+ {id: 'ard-schema', weight: 1, group: 'agent-resource-discovery'},
647
659
  ],
648
660
  },
649
661
  },
@@ -320,14 +320,12 @@ class ExecutionContext {
320
320
  */
321
321
  async cacheNativesOnNewDocument() {
322
322
  await this.evaluateOnNewDocument(() => {
323
- /* c8 ignore start */
324
323
  window.__nativePromise = window.Promise;
325
324
  window.__nativeURL = window.URL;
326
325
  window.__nativePerformance = window.performance;
327
326
  window.__nativeFetch = window.fetch;
328
327
  window.__ElementMatches = window.Element.prototype.matches;
329
328
  window.__HTMLElementBoundingClientRect = window.HTMLElement.prototype.getBoundingClientRect;
330
- /* c8 ignore stop */
331
329
  }, {args: []});
332
330
  }
333
331
 
@@ -277,8 +277,6 @@ function waitForCPUIdle(session, waitForCPUQuiet) {
277
277
  };
278
278
  }
279
279
 
280
- /* c8 ignore start */
281
-
282
280
  /**
283
281
  * This function is executed in the page itself when the document is first loaded.
284
282
  *
@@ -338,8 +336,6 @@ function checkTimeSinceLastLongTaskInPage() {
338
336
  });
339
337
  }
340
338
 
341
- /* c8 ignore stop */
342
-
343
339
  /**
344
340
  * Return a promise that resolves `pauseAfterLoadMs` after the load event
345
341
  * fires and a method to cancel internal listeners and timeout.
@@ -547,7 +543,6 @@ async function waitForFullyLoaded(session, networkMonitor, options) {
547
543
  * @param {LH.Gatherer.Driver} driver
548
544
  */
549
545
  function waitForUserToContinue(driver) {
550
- /* c8 ignore start */
551
546
  function createInPagePromise() {
552
547
  let resolve = () => {};
553
548
  /** @type {Promise<void>} */
@@ -563,7 +558,6 @@ function waitForUserToContinue(driver) {
563
558
  window.continueLighthouseRun = resolve;
564
559
  return promise;
565
560
  }
566
- /* c8 ignore stop */
567
561
 
568
562
  driver.defaultSession.setNextProtocolTimeout(Infinity);
569
563
  return driver.executionContext.evaluate(createInPagePromise, {args: []});
@@ -1,12 +1,13 @@
1
1
  export type FetchResponse = {
2
2
  content: string | null;
3
3
  status: number | null;
4
+ headers?: Record<string, string> | null;
4
5
  };
5
6
  /**
6
7
  * @fileoverview Fetcher is a utility for making requests to any arbitrary resource,
7
8
  * ignoring normal browser constraints such as CORS.
8
9
  */
9
- /** @typedef {{content: string|null, status: number|null}} FetchResponse */
10
+ /** @typedef {{content: string|null, status: number|null, headers?: Record<string, string>|null}} FetchResponse */
10
11
  export class Fetcher {
11
12
  /**
12
13
  * @param {LH.Gatherer.ProtocolSession} session
@@ -23,6 +24,11 @@ export class Fetcher {
23
24
  fetchResource(url: string, options?: {
24
25
  timeout: number;
25
26
  } | undefined): Promise<FetchResponse>;
27
+ /**
28
+ * @param {Headers|Record<string, string|number|boolean>|null|undefined} rawHeaders
29
+ * @return {Record<string, string>|null}
30
+ */
31
+ _normalizeHeaders(rawHeaders: Headers | Record<string, string | number | boolean> | null | undefined): Record<string, string> | null;
26
32
  /**
27
33
  * @param {string} url
28
34
  * @return {Promise<FetchResponse>}
@@ -38,11 +44,12 @@ export class Fetcher {
38
44
  } | undefined): Promise<string>;
39
45
  /**
40
46
  * @param {string} url
41
- * @return {Promise<{stream: LH.Crdp.IO.StreamHandle|null, status: number|null}>}
47
+ * @return {Promise<{stream: LH.Crdp.IO.StreamHandle|null, status: number|null, headers?: Record<string, string>|null}>}
42
48
  */
43
49
  _loadNetworkResource(url: string): Promise<{
44
50
  stream: LH.Crdp.IO.StreamHandle | null;
45
51
  status: number | null;
52
+ headers?: Record<string, string> | null;
46
53
  }>;
47
54
  /**
48
55
  * @param {string} url