lighthouse 13.2.0 → 13.4.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 (212) hide show
  1. package/cli/cli-flags.d.ts +8 -9
  2. package/cli/cli-flags.js +2 -2
  3. package/cli/test/smokehouse/config/exclusions.js +2 -0
  4. package/cli/test/smokehouse/lighthouse-runners/bundle.js +7 -3
  5. package/cli/test/smokehouse/lighthouse-runners/cli.js +5 -1
  6. package/cli/test/smokehouse/lighthouse-runners/devtools-mcp.js +7 -3
  7. package/cli/test/smokehouse/lighthouse-runners/devtools.js +4 -1
  8. package/cli/test/smokehouse/smokehouse.js +7 -2
  9. package/cli/test/smokehouse/version-check.d.ts +1 -1
  10. package/core/audits/accessibility/accesskeys.js +1 -1
  11. package/core/audits/accessibility/aria-allowed-attr.js +1 -1
  12. package/core/audits/accessibility/aria-allowed-role.js +1 -1
  13. package/core/audits/accessibility/aria-command-name.js +1 -1
  14. package/core/audits/accessibility/aria-conditional-attr.js +1 -1
  15. package/core/audits/accessibility/aria-deprecated-role.js +1 -1
  16. package/core/audits/accessibility/aria-dialog-name.js +1 -1
  17. package/core/audits/accessibility/aria-hidden-body.js +1 -1
  18. package/core/audits/accessibility/aria-hidden-focus.js +1 -1
  19. package/core/audits/accessibility/aria-input-field-name.js +1 -1
  20. package/core/audits/accessibility/aria-meter-name.js +1 -1
  21. package/core/audits/accessibility/aria-progressbar-name.js +1 -1
  22. package/core/audits/accessibility/aria-prohibited-attr.js +1 -1
  23. package/core/audits/accessibility/aria-required-attr.js +1 -1
  24. package/core/audits/accessibility/aria-required-children.js +1 -1
  25. package/core/audits/accessibility/aria-required-parent.js +1 -1
  26. package/core/audits/accessibility/aria-roles.js +1 -1
  27. package/core/audits/accessibility/aria-text.js +1 -1
  28. package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
  29. package/core/audits/accessibility/aria-tooltip-name.js +1 -1
  30. package/core/audits/accessibility/aria-treeitem-name.js +1 -1
  31. package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
  32. package/core/audits/accessibility/aria-valid-attr.js +1 -1
  33. package/core/audits/accessibility/autocomplete-valid.js +1 -1
  34. package/core/audits/accessibility/button-name.js +1 -1
  35. package/core/audits/accessibility/bypass.js +1 -1
  36. package/core/audits/accessibility/color-contrast.js +1 -1
  37. package/core/audits/accessibility/definition-list.js +1 -1
  38. package/core/audits/accessibility/dlitem.js +1 -1
  39. package/core/audits/accessibility/document-title.js +1 -1
  40. package/core/audits/accessibility/duplicate-id-aria.js +1 -1
  41. package/core/audits/accessibility/empty-heading.js +1 -1
  42. package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
  43. package/core/audits/accessibility/frame-title.js +1 -1
  44. package/core/audits/accessibility/heading-order.js +1 -1
  45. package/core/audits/accessibility/html-has-lang.js +1 -1
  46. package/core/audits/accessibility/html-lang-valid.js +1 -1
  47. package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
  48. package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
  49. package/core/audits/accessibility/image-alt.js +1 -1
  50. package/core/audits/accessibility/image-redundant-alt.js +1 -1
  51. package/core/audits/accessibility/input-button-name.js +1 -1
  52. package/core/audits/accessibility/input-image-alt.js +1 -1
  53. package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
  54. package/core/audits/accessibility/label.js +1 -1
  55. package/core/audits/accessibility/landmark-one-main.js +1 -1
  56. package/core/audits/accessibility/link-in-text-block.js +1 -1
  57. package/core/audits/accessibility/link-name.js +1 -1
  58. package/core/audits/accessibility/list.js +1 -1
  59. package/core/audits/accessibility/listitem.js +1 -1
  60. package/core/audits/accessibility/meta-refresh.js +1 -1
  61. package/core/audits/accessibility/meta-viewport.js +1 -1
  62. package/core/audits/accessibility/object-alt.js +1 -1
  63. package/core/audits/accessibility/presentation-role-conflict.js +1 -1
  64. package/core/audits/accessibility/select-name.js +1 -1
  65. package/core/audits/accessibility/skip-link.js +1 -1
  66. package/core/audits/accessibility/svg-img-alt.js +1 -1
  67. package/core/audits/accessibility/tabindex.js +1 -1
  68. package/core/audits/accessibility/table-duplicate-name.js +1 -1
  69. package/core/audits/accessibility/table-fake-caption.js +1 -1
  70. package/core/audits/accessibility/target-size.js +1 -1
  71. package/core/audits/accessibility/td-has-header.js +1 -1
  72. package/core/audits/accessibility/td-headers-attr.js +1 -1
  73. package/core/audits/accessibility/th-has-data-cells.js +1 -1
  74. package/core/audits/accessibility/valid-lang.js +1 -1
  75. package/core/audits/accessibility/video-caption.js +1 -1
  76. package/core/audits/agentic/agent-accessibility-tree.js +1 -1
  77. package/core/audits/agentic/llms-txt.js +10 -10
  78. package/core/audits/baseline.js +10 -12
  79. package/core/audits/dobetterweb/geolocation-on-start.js +2 -1
  80. package/core/audits/network-requests.js +2 -0
  81. package/core/audits/seo/canonical.js +19 -7
  82. package/core/audits/webmcp-form-coverage.js +2 -2
  83. package/core/audits/webmcp-registered-tools.js +1 -1
  84. package/core/audits/webmcp-schema-validity.js +1 -1
  85. package/core/computed/js-bundles.d.ts +1 -1
  86. package/core/computed/load-simulator.d.ts +1 -1
  87. package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -1
  88. package/core/computed/metrics/first-contentful-paint.d.ts +1 -1
  89. package/core/computed/metrics/interactive.d.ts +1 -1
  90. package/core/computed/metrics/lantern-metric.d.ts +6 -6
  91. package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -1
  92. package/core/computed/metrics/largest-contentful-paint.d.ts +1 -1
  93. package/core/computed/metrics/max-potential-fid.d.ts +1 -1
  94. package/core/computed/metrics/speed-index.d.ts +1 -1
  95. package/core/computed/metrics/time-to-first-byte.d.ts +1 -1
  96. package/core/computed/metrics/total-blocking-time.d.ts +1 -1
  97. package/core/computed/module-duplication.d.ts +1 -1
  98. package/core/computed/page-dependency-graph.d.ts +1 -1
  99. package/core/computed/unused-css.d.ts +1 -1
  100. package/core/config/agentic-browsing-config.d.ts +1 -0
  101. package/core/config/agentic-browsing-config.js +3 -2
  102. package/core/config/config-helpers.d.ts +1 -0
  103. package/core/config/config-helpers.js +1 -1
  104. package/core/config/config-plugin.d.ts +1 -0
  105. package/core/config/config-plugin.js +1 -0
  106. package/core/config/config.d.ts +1 -0
  107. package/core/config/config.js +1 -0
  108. package/core/config/constants.d.ts +1 -0
  109. package/core/config/constants.js +1 -0
  110. package/core/config/default-config.js +45 -0
  111. package/core/config/experimental-config.d.ts +1 -9
  112. package/core/config/experimental-config.js +2 -0
  113. package/core/config/filters.d.ts +1 -0
  114. package/core/config/filters.js +1 -0
  115. package/core/config/full-config.d.ts +1 -5
  116. package/core/config/full-config.js +2 -0
  117. package/core/config/lr-desktop-config.d.ts +1 -0
  118. package/core/config/lr-desktop-config.js +1 -0
  119. package/core/config/lr-mobile-config.d.ts +1 -5
  120. package/core/config/lr-mobile-config.js +2 -0
  121. package/core/config/perf-config.d.ts +1 -5
  122. package/core/config/perf-config.js +2 -0
  123. package/core/config/validation.d.ts +1 -0
  124. package/core/config/validation.js +1 -0
  125. package/core/gather/driver/execution-context.d.ts +23 -0
  126. package/core/gather/driver/execution-context.js +86 -1
  127. package/core/gather/driver/storage.js +13 -0
  128. package/core/gather/driver.d.ts +1 -1
  129. package/core/gather/gatherers/accessibility.js +1 -0
  130. package/core/gather/gatherers/trace-elements.d.ts +4 -1
  131. package/core/gather/gatherers/trace-elements.js +24 -28
  132. package/core/gather/gatherers/webmcp-schema.js +9 -16
  133. package/core/gather/gatherers/webmcp.d.ts +5 -0
  134. package/core/gather/gatherers/webmcp.js +34 -27
  135. package/core/index.d.ts +0 -1
  136. package/core/index.js +0 -1
  137. package/core/lib/baseline/web-features-data.json +1177 -0
  138. package/core/lib/baseline/web-features-metadata.json +1 -1
  139. package/core/lib/deprecations-strings.d.ts +45 -23
  140. package/core/lib/deprecations-strings.js +23 -0
  141. package/core/lib/script-helpers.js +13 -1
  142. package/core/scoring.d.ts +58 -58
  143. package/dist/report/bundle.esm.js +4 -7
  144. package/dist/report/flow.js +6 -9
  145. package/dist/report/standalone.js +20 -12
  146. package/flow-report/types/flow-report.d.ts +2 -2
  147. package/package.json +23 -26
  148. package/report/assets/styles.css +1 -4
  149. package/report/renderer/components.js +1 -1
  150. package/report/renderer/details-renderer.d.ts +6 -1
  151. package/report/renderer/details-renderer.js +11 -3
  152. package/report/renderer/explodey-gauge.js +9 -7
  153. package/report/renderer/i18n-formatter.d.ts +1 -1
  154. package/report/renderer/logger.js +18 -4
  155. package/report/renderer/text-encoding.js +1 -1
  156. package/report/types/html-renderer.d.ts +2 -2
  157. package/shared/localization/locales/ar-XB.json +290 -65
  158. package/shared/localization/locales/ar.json +290 -65
  159. package/shared/localization/locales/bg.json +290 -65
  160. package/shared/localization/locales/ca.json +295 -70
  161. package/shared/localization/locales/cs.json +290 -65
  162. package/shared/localization/locales/da.json +294 -69
  163. package/shared/localization/locales/de.json +295 -70
  164. package/shared/localization/locales/el.json +290 -65
  165. package/shared/localization/locales/en-GB.json +290 -65
  166. package/shared/localization/locales/en-US.json +105 -75
  167. package/shared/localization/locales/en-XA.json +253 -64
  168. package/shared/localization/locales/en-XL.json +105 -75
  169. package/shared/localization/locales/es-419.json +290 -65
  170. package/shared/localization/locales/es.json +298 -73
  171. package/shared/localization/locales/fi.json +290 -65
  172. package/shared/localization/locales/fil.json +290 -65
  173. package/shared/localization/locales/fr.json +294 -69
  174. package/shared/localization/locales/he.json +293 -68
  175. package/shared/localization/locales/hi.json +291 -66
  176. package/shared/localization/locales/hr.json +290 -65
  177. package/shared/localization/locales/hu.json +290 -65
  178. package/shared/localization/locales/id.json +290 -65
  179. package/shared/localization/locales/it.json +294 -69
  180. package/shared/localization/locales/ja.json +290 -65
  181. package/shared/localization/locales/ko.json +290 -65
  182. package/shared/localization/locales/lt.json +290 -65
  183. package/shared/localization/locales/lv.json +290 -65
  184. package/shared/localization/locales/nl.json +290 -65
  185. package/shared/localization/locales/no.json +290 -65
  186. package/shared/localization/locales/pl.json +290 -65
  187. package/shared/localization/locales/pt-PT.json +291 -66
  188. package/shared/localization/locales/pt.json +290 -65
  189. package/shared/localization/locales/ro.json +290 -65
  190. package/shared/localization/locales/ru.json +301 -76
  191. package/shared/localization/locales/sk.json +291 -66
  192. package/shared/localization/locales/sl.json +290 -65
  193. package/shared/localization/locales/sr-Latn.json +290 -65
  194. package/shared/localization/locales/sr.json +290 -65
  195. package/shared/localization/locales/sv.json +297 -72
  196. package/shared/localization/locales/ta.json +291 -66
  197. package/shared/localization/locales/te.json +293 -68
  198. package/shared/localization/locales/th.json +291 -66
  199. package/shared/localization/locales/tr.json +290 -65
  200. package/shared/localization/locales/uk.json +290 -65
  201. package/shared/localization/locales/vi.json +291 -66
  202. package/shared/localization/locales/zh-HK.json +292 -67
  203. package/shared/localization/locales/zh-TW.json +291 -66
  204. package/shared/localization/locales/zh.json +291 -66
  205. package/shared/types/shared.d.ts +1 -1
  206. package/tsconfig-base.json +2 -1
  207. package/tsconfig.json +2 -0
  208. package/types/artifacts.d.ts +1 -1
  209. package/types/internal/rxjs.d.ts +1 -1
  210. package/types/internal/smokehouse.d.ts +8 -2
  211. package/types.d.ts +2 -0
  212. package/types.js +11 -0
@@ -1,6 +1,6 @@
1
1
  export { LargestContentfulPaintAllFramesComputed as LargestContentfulPaintAllFrames };
2
2
  declare const LargestContentfulPaintAllFramesComputed: typeof LargestContentfulPaintAllFrames & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  declare class LargestContentfulPaintAllFrames extends NavigationMetric {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  export { LargestContentfulPaintComputed as LargestContentfulPaint };
2
2
  declare const LargestContentfulPaintComputed: typeof LargestContentfulPaint & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  declare class LargestContentfulPaint extends NavigationMetric {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  export { MaxPotentialFIDComputed as MaxPotentialFID };
2
2
  declare const MaxPotentialFIDComputed: typeof MaxPotentialFID & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  declare class MaxPotentialFID extends NavigationMetric {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  export { SpeedIndexComputed as SpeedIndex };
2
2
  declare const SpeedIndexComputed: typeof SpeedIndex & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  declare class SpeedIndex extends NavigationMetric {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  export { TimeToFirstByteComputed as TimeToFirstByte };
2
2
  declare const TimeToFirstByteComputed: typeof TimeToFirstByte & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  declare class TimeToFirstByte extends NavigationMetric {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  export { TotalBlockingTimeComputed as TotalBlockingTime };
2
2
  declare const TotalBlockingTimeComputed: typeof TotalBlockingTime & {
3
- request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.Metric | import("../../index.js").Artifacts.LanternMetric>;
3
+ request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
4
4
  };
5
5
  /**
6
6
  * @fileoverview This audit determines Total Blocking Time.
@@ -1,6 +1,6 @@
1
1
  export { ModuleDuplicationComputed as ModuleDuplication };
2
2
  declare const ModuleDuplicationComputed: typeof ModuleDuplication & {
3
- request: (dependencies: Pick<import("../index.js").Artifacts, "Scripts" | "SourceMaps">, context: LH.Artifacts.ComputedContext) => Promise<Map<string, {
3
+ request: (dependencies: Pick<import("../index.js").Artifacts, "SourceMaps" | "Scripts">, context: LH.Artifacts.ComputedContext) => Promise<Map<string, {
4
4
  scriptId: string;
5
5
  scriptUrl: string;
6
6
  resourceSize: number;
@@ -8,7 +8,7 @@ declare const PageDependencyGraphComputed: typeof PageDependencyGraph & {
8
8
  SourceMaps: LH.Artifacts["SourceMaps"];
9
9
  HostDPR: LH.Artifacts["HostDPR"];
10
10
  fromTrace: boolean;
11
- }, context: LH.Artifacts.ComputedContext) => Promise<import("../../types/gatherer.js").default.Simulation.GraphNode>;
11
+ }, context: LH.Artifacts.ComputedContext) => Promise<import("../../types.js").Gatherer.Simulation.GraphNode>;
12
12
  };
13
13
  declare class PageDependencyGraph {
14
14
  /**
@@ -8,7 +8,7 @@ declare const UnusedCSSComputed: typeof UnusedCSS & {
8
8
  Stylesheets: LH.Artifacts["Stylesheets"];
9
9
  CSSUsage: LH.Artifacts["CSSUsage"];
10
10
  devtoolsLog: LH.DevtoolsLog;
11
- }, context: LH.Artifacts.ComputedContext) => Promise<import("../../types/audit.js").default.ByteEfficiencyItem[]>;
11
+ }, context: LH.Artifacts.ComputedContext) => Promise<import("../../types.js").Audit.ByteEfficiencyItem[]>;
12
12
  };
13
13
  /** @typedef {LH.Artifacts.CSSStyleSheetInfo & {networkRecord: LH.Artifacts.NetworkRequest, usedRules: Array<LH.Crdp.CSS.RuleUsage>}} StyleSheetInfo */
14
14
  declare class UnusedCSS {
@@ -9,4 +9,5 @@ export namespace UIStrings {
9
9
  let agentAccessibilityGroupTitle: string;
10
10
  let agentAccessibilityGroupDescription: string;
11
11
  }
12
+ import * as LH from '../../types/lh.js';
12
13
  //# sourceMappingURL=agentic-browsing-config.d.ts.map
@@ -4,14 +4,15 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import * as i18n from '../lib/i18n/i18n.js';
8
9
 
9
10
  const UIStrings = {
10
11
  /** Title of the Agentic Browsing category of audits. */
11
12
  agenticBrowsingCategoryTitle: 'Agentic Browsing',
12
13
  /** Description of the Agentic Browsing category. */
13
- agenticBrowsingCategoryDescription: 'These checks ensure high-quality, browsable ' +
14
- 'websites for AI agents and validate the correctness of WebMCP integrations. ' +
14
+ agenticBrowsingCategoryDescription: 'These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) ' +
15
+ 'and validate the correctness of WebMCP integrations. ' +
15
16
  'This category is still under development and subject to change.',
16
17
  /** Title of the WebMCP group of audits. */
17
18
  webmcpGroupTitle: 'WebMCP',
@@ -91,4 +91,5 @@ export function resolveModulePath(moduleIdentifier: string, configDir?: string |
91
91
  * @return {LH.Config.Settings}
92
92
  */
93
93
  export function resolveSettings(settingsJson?: LH.SharedFlagsSettings, overrides?: LH.Flags | undefined): LH.Config.Settings;
94
+ import * as LH from '../../types/lh.js';
94
95
  //# sourceMappingURL=config-helpers.d.ts.map
@@ -3,13 +3,13 @@
3
3
  * Copyright 2019 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
-
7
6
  import path from 'path';
8
7
  import {createRequire} from 'module';
9
8
  import url from 'url';
10
9
 
11
10
  import {isEqual} from 'lodash-es';
12
11
 
12
+ import * as LH from '../../types/lh.js';
13
13
  import * as constants from './constants.js';
14
14
  import ConfigPlugin from './config-plugin.js';
15
15
  import {Runner} from '../runner.js';
@@ -43,4 +43,5 @@ declare class ConfigPlugin {
43
43
  */
44
44
  static parsePlugin(pluginJson: unknown, pluginName: string): LH.Config;
45
45
  }
46
+ import * as LH from '../../types/lh.js';
46
47
  //# sourceMappingURL=config-plugin.d.ts.map
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import * as i18n from '../lib/i18n/i18n.js';
8
9
 
9
10
  /**
@@ -24,4 +24,5 @@ export function initializeConfig(gatherMode: LH.Gatherer.GatherMode, config?: LH
24
24
  * @return {string}
25
25
  */
26
26
  export function getConfigDisplayString(resolvedConfig: LH.Config.ResolvedConfig): string;
27
+ import * as LH from '../../types/lh.js';
27
28
  //# sourceMappingURL=config.d.ts.map
@@ -8,6 +8,7 @@ import path from 'path';
8
8
 
9
9
  import log from 'lighthouse-logger';
10
10
 
11
+ import * as LH from '../../types/lh.js';
11
12
  import {Runner} from '../runner.js';
12
13
  import defaultConfig from './default-config.js';
13
14
  import {nonSimulatedSettingsOverrides} from './constants.js';
@@ -53,5 +53,6 @@ declare const MOTOGPOWER_EMULATION_METRICS: Required<LH.SharedFlagsSettings["scr
53
53
  declare const DESKTOP_EMULATION_METRICS: Required<LH.SharedFlagsSettings["screenEmulation"]>;
54
54
  declare const MOTOG4_USERAGENT: "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36";
55
55
  declare const DESKTOP_USERAGENT: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36";
56
+ import * as LH from '../../types/lh.js';
56
57
  export {};
57
58
  //# sourceMappingURL=constants.d.ts.map
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import * as Lantern from '../lib/lantern/lantern.js';
8
9
 
9
10
  const throttling = Lantern.Simulation.Constants.throttling;
@@ -100,6 +100,21 @@ const UIStrings = {
100
100
  bestPracticesBrowserCompatGroupTitle: 'Browser Compatibility',
101
101
  /** Title of the General group of the Best Practices category. Within this section are the audits that don't belong to a specific group but are of general interest. */
102
102
  bestPracticesGeneralGroupTitle: 'General',
103
+ /** Title of the Agentic Browsing category of audits. */
104
+ agenticBrowsingCategoryTitle: 'Agentic Browsing',
105
+ /** Description of the Agentic Browsing category. */
106
+ agenticBrowsingCategoryDescription: 'These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) ' +
107
+ 'and validate the correctness of WebMCP integrations. ' +
108
+ 'This category is still under development and subject to change.',
109
+ /** Title of the WebMCP group of audits. */
110
+ webmcpGroupTitle: 'WebMCP',
111
+ /** Description of the WebMCP group. */
112
+ webmcpGroupDescription: 'Audits validating WebMCP integration.',
113
+ /** Title of the Agent Accessibility group of audits. */
114
+ agentAccessibilityGroupTitle: 'Agent Accessibility',
115
+ /** Description of the Agent Accessibility group of audits. */
116
+ agentAccessibilityGroupDescription: 'These audits highlight best practices for improving the ' +
117
+ 'accessibility of the website for AI agents.',
103
118
  };
104
119
 
105
120
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -108,6 +123,9 @@ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
108
123
  const defaultConfig = {
109
124
  settings: constants.defaultSettings,
110
125
  artifacts: [
126
+ {id: 'WebMCP', gatherer: 'webmcp'},
127
+ {id: 'WebMcpSchemaIssues', gatherer: 'webmcp-schema'},
128
+ {id: 'LlmsTxt', gatherer: 'agentic/llms-txt'},
111
129
  // Artifacts which can be depended on come first.
112
130
  {id: 'DevtoolsLog', gatherer: 'devtools-log'},
113
131
  {id: 'Trace', gatherer: 'trace'},
@@ -279,6 +297,11 @@ const defaultConfig = {
279
297
  'seo/hreflang',
280
298
  'seo/canonical',
281
299
  'seo/manual/structured-data',
300
+ 'agentic/agent-accessibility-tree',
301
+ 'webmcp-registered-tools',
302
+ 'webmcp-form-coverage',
303
+ 'webmcp-schema-validity',
304
+ 'agentic/llms-txt',
282
305
  'bf-cache',
283
306
  'insights/cache-insight',
284
307
  'insights/cls-culprits-insight',
@@ -366,6 +389,14 @@ const defaultConfig = {
366
389
  'best-practices-general': {
367
390
  title: str_(UIStrings.bestPracticesGeneralGroupTitle),
368
391
  },
392
+ 'webmcp': {
393
+ title: str_(UIStrings.webmcpGroupTitle),
394
+ description: str_(UIStrings.webmcpGroupDescription),
395
+ },
396
+ 'agent-accessibility': {
397
+ title: str_(UIStrings.agentAccessibilityGroupTitle),
398
+ description: str_(UIStrings.agentAccessibilityGroupDescription),
399
+ },
369
400
  // Group for audits that should not be displayed.
370
401
  'hidden': {title: ''},
371
402
  },
@@ -601,6 +632,20 @@ const defaultConfig = {
601
632
  {id: 'structured-data', weight: 0},
602
633
  ],
603
634
  },
635
+ 'agentic-browsing': {
636
+ title: str_(UIStrings.agenticBrowsingCategoryTitle),
637
+ description: str_(UIStrings.agenticBrowsingCategoryDescription),
638
+ supportedModes: ['navigation', 'snapshot'],
639
+ categoryScoreDisplayMode: 'fraction',
640
+ auditRefs: [
641
+ {id: 'agent-accessibility-tree', weight: 1, group: 'agent-accessibility'},
642
+ {id: 'webmcp-form-coverage', weight: 1, group: 'webmcp'},
643
+ {id: 'webmcp-registered-tools', weight: 1, group: 'webmcp'},
644
+ {id: 'webmcp-schema-validity', weight: 1, group: 'webmcp'},
645
+ {id: 'cumulative-layout-shift', weight: 1, acronym: 'CLS'},
646
+ {id: 'llms-txt', weight: 1, group: 'agent-accessibility'},
647
+ ],
648
+ },
604
649
  },
605
650
  };
606
651
 
@@ -1,13 +1,5 @@
1
1
  export default config;
2
- /**
3
- * @license
4
- * Copyright 2020 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
- /**
8
- * @fileoverview Config for new audits that aren't quite ready for
9
- * being enabled by default.
10
- */
11
2
  /** @type {LH.Config} */
12
3
  declare const config: LH.Config;
4
+ import * as LH from '../../types/lh.js';
13
5
  //# sourceMappingURL=experimental-config.d.ts.map
@@ -9,6 +9,8 @@
9
9
  * being enabled by default.
10
10
  */
11
11
 
12
+ import * as LH from '../../types/lh.js';
13
+
12
14
  /** @type {LH.Config} */
13
15
  const config = {
14
16
  extends: 'lighthouse:default',
@@ -72,4 +72,5 @@ export function filterCategoriesByExplicitFilters(categories: LH.Config.Resolved
72
72
  * @return {LH.Config.ResolvedConfig['categories']}
73
73
  */
74
74
  export function filterCategoriesByGatherMode(categories: LH.Config.ResolvedConfig["categories"], mode: LH.Gatherer.GatherMode): LH.Config.ResolvedConfig["categories"];
75
+ import * as LH from '../../types/lh.js';
75
76
  //# sourceMappingURL=filters.d.ts.map
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import {Audit} from '../audits/audit.js';
8
9
 
9
10
  /** @type {Record<keyof LH.BaseArtifacts, string>} */
@@ -1,9 +1,5 @@
1
1
  export default fullConfig;
2
- /**
3
- * @license
4
- * Copyright 2017 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
2
  /** @type {LH.Config} */
8
3
  declare const fullConfig: LH.Config;
4
+ import * as LH from '../../types/lh.js';
9
5
  //# sourceMappingURL=full-config.d.ts.map
@@ -4,6 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
8
+
7
9
  /** @type {LH.Config} */
8
10
  const fullConfig = {
9
11
  extends: 'lighthouse:default',
@@ -1,4 +1,5 @@
1
1
  export default config;
2
2
  /** @type {LH.Config} */
3
3
  declare const config: LH.Config;
4
+ import * as LH from '../../types/lh.js';
4
5
  //# sourceMappingURL=lr-desktop-config.d.ts.map
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import * as constants from './constants.js';
8
9
 
9
10
  /** @type {LH.Config} */
@@ -1,9 +1,5 @@
1
1
  export default config;
2
- /**
3
- * @license
4
- * Copyright 2018 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
2
  /** @type {LH.Config} */
8
3
  declare const config: LH.Config;
4
+ import * as LH from '../../types/lh.js';
9
5
  //# sourceMappingURL=lr-mobile-config.d.ts.map
@@ -4,6 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
8
+
7
9
  /** @type {LH.Config} */
8
10
  const config = {
9
11
  extends: 'lighthouse:default',
@@ -1,9 +1,5 @@
1
1
  export default perfConfig;
2
- /**
3
- * @license
4
- * Copyright 2018 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
2
  /** @type {LH.Config} */
8
3
  declare const perfConfig: LH.Config;
4
+ import * as LH from '../../types/lh.js';
9
5
  //# sourceMappingURL=perf-config.d.ts.map
@@ -4,6 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
8
+
7
9
  /** @type {LH.Config} */
8
10
  const perfConfig = {
9
11
  extends: 'lighthouse:default',
@@ -58,4 +58,5 @@ export function throwInvalidDependencyOrder(artifactId: string, dependencyKey: s
58
58
  * @return {never}
59
59
  */
60
60
  export function throwInvalidArtifactDependency(artifactId: string, dependencyKey: string): never;
61
+ import * as LH from '../../types/lh.js';
61
62
  //# sourceMappingURL=validation.d.ts.map
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import * as LH from '../../types/lh.js';
7
8
  import {Audit} from '../audits/audit.js';
8
9
  import BaseGatherer from '../gather/base-gatherer.js';
9
10
  import * as i18n from '../lib/i18n/i18n.js';
@@ -102,6 +102,29 @@ export class ExecutionContext {
102
102
  args: T;
103
103
  deps?: Array<Function | string>;
104
104
  }): Promise<void>;
105
+ /**
106
+ * Call a function on the given object.
107
+ * Returns a promise that resolves on a value of `mainFn`'s return type.
108
+ * @template {unknown[]} T, R
109
+ * @param {((thisArg: any, ...args: T) => R)} mainFn The main function to call.
110
+ * @param {{args: T, objectId: string, deps?: Array<Function|string>}} options `args` should
111
+ * match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
112
+ * defined for `mainFn` to work.
113
+ * @return {Promise<Awaited<R>>}
114
+ */
115
+ evaluateOnObject<T extends unknown[], R>(mainFn: ((thisArg: any, ...args: T) => R), options: {
116
+ args: T;
117
+ objectId: string;
118
+ deps?: Array<Function | string>;
119
+ }): Promise<Awaited<R>>;
120
+ /**
121
+ * @param {string} functionDeclaration
122
+ * @param {{objectId: string}} options
123
+ * @return {Promise<*>}
124
+ */
125
+ _callFunctionOn(functionDeclaration: string, options: {
126
+ objectId: string;
127
+ }): Promise<any>;
105
128
  /**
106
129
  * Cache native functions/objects inside window so we are sure polyfills do not overwrite the
107
130
  * native implementations when the page loads.
@@ -223,6 +223,7 @@ class ExecutionContext {
223
223
 
224
224
  const expression = `(() => {
225
225
  ${ExecutionContext._cachedNativesPreamble};
226
+ ${pageFunctions.esbuildFunctionWrapperString}
226
227
  ${depsSerialized};
227
228
  (${mainFn})(${argsSerialized});
228
229
  })()
@@ -231,6 +232,87 @@ class ExecutionContext {
231
232
  await this._session.sendCommand('Page.addScriptToEvaluateOnNewDocument', {source: expression});
232
233
  }
233
234
 
235
+ /**
236
+ * Call a function on the given object.
237
+ * Returns a promise that resolves on a value of `mainFn`'s return type.
238
+ * @template {unknown[]} T, R
239
+ * @param {((thisArg: any, ...args: T) => R)} mainFn The main function to call.
240
+ * @param {{args: T, objectId: string, deps?: Array<Function|string>}} options `args` should
241
+ * match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
242
+ * defined for `mainFn` to work.
243
+ * @return {Promise<Awaited<R>>}
244
+ */
245
+ evaluateOnObject(mainFn, options) {
246
+ const argsSerialized = ExecutionContext.serializeArguments(options.args);
247
+ const depsSerialized = ExecutionContext.serializeDeps(options.deps);
248
+
249
+ const argsString = argsSerialized ? `this, ${argsSerialized}` : 'this';
250
+ const functionDeclaration = `function() {
251
+ ${depsSerialized}
252
+ return (${mainFn})(${argsString});
253
+ }`;
254
+ return this._callFunctionOn(functionDeclaration, options);
255
+ }
256
+
257
+ /**
258
+ * @param {string} functionDeclaration
259
+ * @param {{objectId: string}} options
260
+ * @return {Promise<*>}
261
+ */
262
+ async _callFunctionOn(functionDeclaration, options) {
263
+ const timeout = this._session.hasNextProtocolTimeout() ?
264
+ this._session.getNextProtocolTimeout() :
265
+ 60000;
266
+
267
+ const evaluationParams = {
268
+ functionDeclaration: `function wrapInNativePromise() {
269
+ ${ExecutionContext._cachedNativesPreamble};
270
+ ${pageFunctions.esbuildFunctionWrapperString}
271
+ const self = this;
272
+ const args = arguments;
273
+ return new Promise(function (resolve) {
274
+ return Promise.resolve()
275
+ .then(_ => (${functionDeclaration}).apply(self, args))
276
+ .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowser})
277
+ .then(resolve);
278
+ });
279
+ }
280
+ //# sourceURL=_lighthouse-eval.js
281
+ `,
282
+ objectId: options.objectId,
283
+ returnByValue: true,
284
+ awaitPromise: true,
285
+ timeout,
286
+ };
287
+
288
+ this._session.setNextProtocolTimeout(timeout);
289
+ const response = await this._session.sendCommand('Runtime.callFunctionOn', evaluationParams);
290
+
291
+ const ex = response.exceptionDetails;
292
+ if (ex) {
293
+ const elidedExpression = functionDeclaration.replace(/\s+/g, ' ').substring(0, 100);
294
+ const messageLines = [
295
+ 'Runtime.callFunctionOn exception',
296
+ `Expression: ${elidedExpression}\n---- (elided)`,
297
+ !ex.stackTrace ? `Parse error at: ${ex.lineNumber + 1}:${ex.columnNumber + 1}` : null,
298
+ ex.exception?.description || ex.text,
299
+ ].filter(Boolean);
300
+ const evaluationError = new Error(messageLines.join('\n'));
301
+ return Promise.reject(evaluationError);
302
+ }
303
+
304
+ if (response.result === undefined) {
305
+ return Promise.reject(
306
+ new Error('Runtime.callFunctionOn response did not contain a "result" object'));
307
+ }
308
+ const value = response.result.value;
309
+ if (value?.__failedInBrowser) {
310
+ return Promise.reject(Object.assign(new Error(), value));
311
+ } else {
312
+ return value;
313
+ }
314
+ }
315
+
234
316
  /**
235
317
  * Cache native functions/objects inside window so we are sure polyfills do not overwrite the
236
318
  * native implementations when the page loads.
@@ -279,7 +361,10 @@ class ExecutionContext {
279
361
  * @return {string}
280
362
  */
281
363
  static serializeDeps(deps) {
282
- deps = [pageFunctions.esbuildFunctionWrapperString, ...deps || []];
364
+ if (!deps) {
365
+ return '';
366
+ }
367
+
283
368
  return deps.map(dep => {
284
369
  if (typeof dep === 'function') {
285
370
  // esbuild will change the actual function name (ie. function actualName() {})
@@ -7,6 +7,7 @@
7
7
  import log from 'lighthouse-logger';
8
8
 
9
9
  import * as i18n from '../../lib/i18n/i18n.js';
10
+ import {Sentry} from '../../lib/sentry.js';
10
11
 
11
12
  /* eslint-disable max-len */
12
13
  const UIStrings = {
@@ -81,6 +82,18 @@ async function getImportantStorageWarning(session, url) {
81
82
  const usageData = await session.sendCommand('Storage.getUsageAndQuota', {
82
83
  origin: url,
83
84
  });
85
+
86
+ // According to the types, this should never happen. But we've gotten an error
87
+ // report that it does.
88
+ // https://github.com/GoogleChrome/lighthouse/issues/17011
89
+ if (!usageData || !usageData.usageBreakdown) {
90
+ const err = new Error(`missing usageData: ${JSON.stringify(usageData)}`);
91
+ Sentry.captureException(err, {
92
+ level: 'error',
93
+ });
94
+ return;
95
+ }
96
+
84
97
  /** @type {Record<string, string>} */
85
98
  const storageTypeNames = {
86
99
  local_storage: 'Local Storage',
@@ -13,7 +13,7 @@ export class Driver implements LH.Gatherer.Driver {
13
13
  _executionContext: ExecutionContext | undefined;
14
14
  /** @type {Fetcher|undefined} */
15
15
  _fetcher: Fetcher | undefined;
16
- defaultSession: import("../../types/gatherer.js").default.ProtocolSession;
16
+ defaultSession: import("../../types.js").Gatherer.ProtocolSession;
17
17
  /** @return {LH.Gatherer.Driver['executionContext']} */
18
18
  get executionContext(): LH.Gatherer.Driver["executionContext"];
19
19
  get fetcher(): any;
@@ -84,6 +84,7 @@ async function runA11yChecks() {
84
84
  'table-fake-caption': {enabled: true},
85
85
  'target-size': {enabled: true},
86
86
  'td-has-header': {enabled: true},
87
+ 'aria-tab-name': {enabled: false}, // TODO: consider adding.
87
88
  },
88
89
  });
89
90
 
@@ -67,9 +67,12 @@ declare class TraceElements extends BaseGatherer {
67
67
  stopInstrumentation(context: LH.Gatherer.Context): Promise<void>;
68
68
  /**
69
69
  * @param {LH.Gatherer.ProtocolSession} session
70
+ * @param {LH.Gatherer.Driver['executionContext']} executionContext
70
71
  * @param {number} backendNodeId
71
72
  */
72
- getNodeDetails(session: LH.Gatherer.ProtocolSession, backendNodeId: number): Promise<import("devtools-protocol").Protocol.Runtime.CallFunctionOnResponse | null>;
73
+ getNodeDetails(session: LH.Gatherer.ProtocolSession, executionContext: LH.Gatherer.Driver["executionContext"], backendNodeId: number): Promise<{
74
+ node: any;
75
+ } | null | undefined>;
73
76
  /**
74
77
  * @param {LH.Gatherer.Context<'Trace'|'SourceMaps'>} context
75
78
  * @return {Promise<LH.Artifacts.TraceElement[]>}