lighthouse 13.2.0 → 13.3.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.
package/cli/cli-flags.js CHANGED
@@ -54,7 +54,7 @@ function getYargsParser(manualArgv) {
54
54
  'Path to JSON file of HTTP Header key/value pairs to send in requests')
55
55
  .example(
56
56
  'lighthouse <url> --only-categories=performance,seo',
57
- 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo')
57
+ 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo, agentic-browsing')
58
58
 
59
59
  // We only have the single string positional argument, the url.
60
60
  .option('_', {
@@ -188,7 +188,7 @@ function getYargsParser(manualArgv) {
188
188
  array: true,
189
189
  type: 'string',
190
190
  coerce: splitCommaSeparatedValues,
191
- describe: 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo',
191
+ describe: 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo, agentic-browsing',
192
192
  },
193
193
  'skip-audits': {
194
194
  array: true,
@@ -80,11 +80,15 @@ async function runBundledLighthouse(url, config, testRunnerOptions) {
80
80
  const thirdPartyWeb = global.thirdPartyWeb;
81
81
  thirdPartyWeb.provideThirdPartyWeb(thirdPartyWebLib);
82
82
 
83
+ const chromeFlags = [];
84
+ if (testRunnerOptions?.headless) chromeFlags.push('--headless=new');
85
+ if (testRunnerOptions?.chromeFlags) {
86
+ chromeFlags.push(...testRunnerOptions.chromeFlags.split(' '));
87
+ }
88
+
83
89
  // Launch and connect to Chrome.
84
90
  const launchedChrome = await ChromeLauncher.launch({
85
- chromeFlags: [
86
- testRunnerOptions?.headless ? '--headless=new' : '',
87
- ],
91
+ chromeFlags,
88
92
  });
89
93
  const port = launchedChrome.port;
90
94
 
@@ -66,7 +66,11 @@ async function internalRun(url, tmpPath, config, logger, options) {
66
66
  '--quiet',
67
67
  ];
68
68
 
69
- if (headless) args.push('--chrome-flags="--headless=new"');
69
+ let chromeFlags = '';
70
+ if (headless) chromeFlags += '--headless=new ';
71
+ if (options && options.chromeFlags) chromeFlags += options.chromeFlags;
72
+
73
+ if (chromeFlags) args.push(`--chrome-flags="${chromeFlags.trim()}"`);
70
74
 
71
75
  // Config can be optionally provided.
72
76
  if (config) {
@@ -56,11 +56,15 @@ async function runBundledLighthouse(url, config, testRunnerOptions) {
56
56
  // Load bundle.
57
57
  const {navigation} = await import(LH_ROOT + '/dist/lighthouse-devtools-mcp-bundle.js');
58
58
 
59
+ const chromeFlags = [];
60
+ if (testRunnerOptions?.headless) chromeFlags.push('--headless=new');
61
+ if (testRunnerOptions?.chromeFlags) {
62
+ chromeFlags.push(...testRunnerOptions.chromeFlags.split(' '));
63
+ }
64
+
59
65
  // Launch and connect to Chrome.
60
66
  const launchedChrome = await ChromeLauncher.launch({
61
- chromeFlags: [
62
- testRunnerOptions?.headless ? '--headless=new' : '',
63
- ],
67
+ chromeFlags,
64
68
  });
65
69
  const port = launchedChrome.port;
66
70
 
@@ -46,9 +46,12 @@ async function setup() {
46
46
  */
47
47
  async function runLighthouse(url, config, logger, testRunnerOptions) {
48
48
  const chromeFlags = [
49
- testRunnerOptions?.headless ? '--headless=new' : '',
50
49
  `--custom-devtools-frontend=file://${devtoolsDir}/out/LighthouseIntegration/gen/front_end`,
51
50
  ];
51
+ if (testRunnerOptions?.headless) chromeFlags.push('--headless=new');
52
+ if (testRunnerOptions?.chromeFlags) {
53
+ chromeFlags.push(...testRunnerOptions.chromeFlags.split(' '));
54
+ }
52
55
  // TODO: `testUrlFromDevtools` should accept a logger, so we get some output even for time outs.
53
56
  const {lhr, artifacts, logs} = await testUrlFromDevtools(url, {
54
57
  config,
@@ -136,7 +136,7 @@ function purpleify(str) {
136
136
  * @return {Promise<SmokehouseResult>}
137
137
  */
138
138
  async function runSmokeTest(smokeTestDefn, testOptions) {
139
- const {id, expectations, config} = smokeTestDefn;
139
+ const {id, expectations, config, testRunnerOptions: customTestRunnerOptions} = smokeTestDefn;
140
140
  const {
141
141
  lighthouseRunner,
142
142
  retries,
@@ -145,6 +145,11 @@ async function runSmokeTest(smokeTestDefn, testOptions) {
145
145
  } = testOptions;
146
146
  const requestedUrl = expectations.lhr.requestedUrl;
147
147
 
148
+ const mergedTestRunnerOptions = {
149
+ ...testRunnerOptions,
150
+ ...customTestRunnerOptions,
151
+ };
152
+
148
153
  console.log(`${purpleify(id)} smoketest starting…`);
149
154
 
150
155
  // Rerun test until there's a passing result or retries are exhausted to prevent flakes.
@@ -170,7 +175,7 @@ async function runSmokeTest(smokeTestDefn, testOptions) {
170
175
  reject(new Error('Timed out waiting for provided lighthouseRunner')), 1000 * 120);
171
176
  });
172
177
  const timedResult = await Promise.race([
173
- lighthouseRunner(requestedUrl, config, logger, testRunnerOptions),
178
+ lighthouseRunner(requestedUrl, config, logger, mergedTestRunnerOptions),
174
179
  timeoutPromise,
175
180
  ]);
176
181
  result = {
@@ -13,7 +13,7 @@ const UIStrings = {
13
13
  /** Title shown when one or more agent accessibility checks fail. */
14
14
  failureTitle: 'Accessibility tree is not well-formed',
15
15
  /** Description of a Lighthouse audit that tells the user *why* they need a well-formed accessibility tree. */
16
- description: 'A well-formed accessibility tree helps AI agents to ' +
16
+ description: 'A well-formed [accessibility tree](http://goo.gle/lighthouse-agentic-a11y) helps AI agents to ' +
17
17
  'navigate and interact with the page.',
18
18
  /** Label of a table column that identifies the accessibility rule that failed. */
19
19
  columnRule: 'Failing Rule',
@@ -11,15 +11,15 @@ const HTTP_CLIENT_ERROR_CODE_LOW = 400;
11
11
  const HTTP_SERVER_ERROR_CODE_LOW = 500;
12
12
 
13
13
  const UIStrings = {
14
- /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file is present and configured correctly. */
15
- title: 'llms.txt is present',
16
- /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file is misconfigured. */
17
- failureTitle: 'llms.txt is missing or incomplete',
18
- /** Description of a Lighthouse audit that tells the user *why* they need to have a valid llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This is displayed after a user expands the section to see more. No character length limits. */
19
- description: 'If your llms.txt file is malformed, large language models may not be able to ' +
20
- 'understand how you want your website to be crawled or used for training. A valid ' +
21
- 'llms.txt should be a Markdown file containing at least one H1 header. ' +
22
- '[Learn more about llms.txt](https://llmstxt.org/).',
14
+ /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file follows community recommendations. */
15
+ title: 'llms.txt follows recommendations',
16
+ /** Title of a Lighthouse audit that provides detail on the site's llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This descriptive title is shown when the llms.txt file does not follow community recommendations. */
17
+ failureTitle: 'llms.txt does not follow recommendations',
18
+ /** Description of a Lighthouse audit that tells the user *why* they should have an llms.txt file. Note: "llms.txt" is a canonical filename and should not be translated. This is displayed after a user expands the section to see more. No character length limits. */
19
+ description: 'If your llms.txt file does not follow recommendations, ' +
20
+ 'large language models may not be able to ' +
21
+ 'understand how you want your website to be crawled or used for training. The ' +
22
+ '[llms.txt](https://llmstxt.org/) file should be a Markdown file containing at least one H1 header.',
23
23
  /**
24
24
  * @description Label for the audit identifying that the request failed with a specific HTTP status code.
25
25
  * @example {500} statusCode
@@ -11,8 +11,8 @@ const UIStrings = {
11
11
  /** Title of a Lighthouse audit that lists forms found in the page for WebMCP coverage. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
12
12
  title: 'WebMCP form coverage',
13
13
  /** Description of a Lighthouse audit that lists forms found in the page and indicates whether they have WebMCP declarative tool annotations. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
14
- description: 'Consider adding WebMCP annotations to the forms listed below. This helps AI ' +
15
- 'agents identify and interact with these forms more reliably.', // TODO: add a learn more link once available
14
+ description: 'Consider adding [WebMCP](http://goo.gle/webmcp-docs) annotations to the forms listed below. This helps AI ' +
15
+ 'agents identify and interact with these forms more reliably.',
16
16
  /** [ICU Syntax] Label for the audit identifying the number of forms missing annotations. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
17
17
  displayValue: `{itemCount, plural,
18
18
  =1 {1 form missing annotations}
@@ -15,7 +15,7 @@ const UIStrings = {
15
15
  /** Title of a Lighthouse audit that lists registered WebMCP tools. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
16
16
  title: 'WebMCP tools registered',
17
17
  /** Description of a Lighthouse audit that lists registered WebMCP tools. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol", neither should be translated. */
18
- description: 'Lists the WebMCP tools registered at the time of analysis. ',
18
+ description: 'Lists the [WebMCP tools](http://goo.gle/webmcp-docs) registered at the time of analysis.',
19
19
  /** Label for a column in a data table; entries will be the name of a WebMCP tool. */
20
20
  columnTool: 'Tool name',
21
21
  /** Label for a column in a data table; entries will be the description of a WebMCP tool. */
@@ -13,7 +13,7 @@ const UIStrings = {
13
13
  /** Title of a Lighthouse audit that provides detail on WebMCP schema validity. This descriptive title is shown to users when there are schema validity issues. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
14
14
  failureTitle: 'WebMCP schemas are invalid',
15
15
  /** Description of a Lighthouse audit that tells the user why they should ensure WebMCP schemas are valid. This is displayed after a user expands the section to see more. No character length limits. "WebMCP" stands for "Web Model Context Protocol" and should not be translated. */
16
- description: 'Valid WebMCP schemas are required for AI agents to ' +
16
+ description: 'Valid [WebMCP schemas](http://goo.gle/webmcp-docs) are required for AI agents to ' +
17
17
  ' understand and interact with tools correctly. ' +
18
18
  'Please fix any errors or warnings reported by the browser.',
19
19
  /** Header of the table column which displays the element. */
@@ -10,8 +10,8 @@ const UIStrings = {
10
10
  /** Title of the Agentic Browsing category of audits. */
11
11
  agenticBrowsingCategoryTitle: 'Agentic Browsing',
12
12
  /** 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. ' +
13
+ agenticBrowsingCategoryDescription: 'These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) ' +
14
+ 'and validate the correctness of WebMCP integrations. ' +
15
15
  'This category is still under development and subject to change.',
16
16
  /** Title of the WebMCP group of audits. */
17
17
  webmcpGroupTitle: 'WebMCP',
@@ -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
 
package/core/index.d.ts CHANGED
@@ -4,7 +4,6 @@ export { default as Gatherer } from "./gather/base-gatherer.js";
4
4
  export { NetworkRecords } from "./computed/network-records.js";
5
5
  export { default as defaultConfig } from "./config/default-config.js";
6
6
  export { default as desktopConfig } from "./config/desktop-config.js";
7
- export { default as agenticBrowsingConfig } from "./config/agentic-browsing-config.js";
8
7
  export * from "../types/lh.js";
9
8
  /**
10
9
  * Run Lighthouse.
package/core/index.js CHANGED
@@ -121,7 +121,6 @@ export {default as Gatherer} from './gather/base-gatherer.js';
121
121
  export {NetworkRecords} from './computed/network-records.js';
122
122
  export {default as defaultConfig} from './config/default-config.js';
123
123
  export {default as desktopConfig} from './config/desktop-config.js';
124
- export {default as agenticBrowsingConfig} from './config/agentic-browsing-config.js';
125
124
  export * from '../types/lh.js';
126
125
  export {
127
126
  startFlow,
@@ -1,3 +1,3 @@
1
1
  {
2
- "date": "2026-03-18"
2
+ "date": "2026-05-01"
3
3
  }
@@ -50,6 +50,7 @@ export namespace UIStrings {
50
50
  let PrefixedVideoExitFullScreen: string;
51
51
  let PrefixedVideoExitFullscreen: string;
52
52
  let PrefixedVideoSupportsFullscreen: string;
53
+ let PreventSvgFilterPaint: string;
53
54
  let RangeExpand: string;
54
55
  let RelatedWebsiteSets: string;
55
56
  let RequestedSubresourceWithEmbeddedCredentials: string;
@@ -237,6 +238,11 @@ export namespace DEPRECATIONS_METADATA {
237
238
  export { milestone_12 as milestone };
238
239
  }
239
240
  export { PersistentQuotaType_1 as PersistentQuotaType };
241
+ export namespace PreventSvgFilterPaint_1 {
242
+ let chromeStatusFeature_25: number;
243
+ export { chromeStatusFeature_25 as chromeStatusFeature };
244
+ }
245
+ export { PreventSvgFilterPaint_1 as PreventSvgFilterPaint };
240
246
  export namespace RTCConstraintEnableDtlsSrtpFalse_1 {
241
247
  let milestone_13: number;
242
248
  export { milestone_13 as milestone };
@@ -248,25 +254,25 @@ export namespace DEPRECATIONS_METADATA {
248
254
  }
249
255
  export { RTCConstraintEnableDtlsSrtpTrue_1 as RTCConstraintEnableDtlsSrtpTrue };
250
256
  export namespace RTCPeerConnectionGetStatsLegacyNonCompliant_1 {
251
- let chromeStatusFeature_25: number;
252
- export { chromeStatusFeature_25 as chromeStatusFeature };
257
+ let chromeStatusFeature_26: number;
258
+ export { chromeStatusFeature_26 as chromeStatusFeature };
253
259
  let milestone_15: number;
254
260
  export { milestone_15 as milestone };
255
261
  }
256
262
  export { RTCPeerConnectionGetStatsLegacyNonCompliant_1 as RTCPeerConnectionGetStatsLegacyNonCompliant };
257
263
  export namespace RelatedWebsiteSets_1 {
258
- let chromeStatusFeature_26: number;
259
- export { chromeStatusFeature_26 as chromeStatusFeature };
264
+ let chromeStatusFeature_27: number;
265
+ export { chromeStatusFeature_27 as chromeStatusFeature };
260
266
  }
261
267
  export { RelatedWebsiteSets_1 as RelatedWebsiteSets };
262
268
  export namespace RequestedSubresourceWithEmbeddedCredentials_1 {
263
- let chromeStatusFeature_27: number;
264
- export { chromeStatusFeature_27 as chromeStatusFeature };
269
+ let chromeStatusFeature_28: number;
270
+ export { chromeStatusFeature_28 as chromeStatusFeature };
265
271
  }
266
272
  export { RequestedSubresourceWithEmbeddedCredentials_1 as RequestedSubresourceWithEmbeddedCredentials };
267
273
  export namespace RtcpMuxPolicyNegotiate_1 {
268
- let chromeStatusFeature_28: number;
269
- export { chromeStatusFeature_28 as chromeStatusFeature };
274
+ let chromeStatusFeature_29: number;
275
+ export { chromeStatusFeature_29 as chromeStatusFeature };
270
276
  let milestone_16: number;
271
277
  export { milestone_16 as milestone };
272
278
  }
@@ -277,25 +283,25 @@ export namespace DEPRECATIONS_METADATA {
277
283
  }
278
284
  export { SharedArrayBufferConstructedWithoutIsolation_1 as SharedArrayBufferConstructedWithoutIsolation };
279
285
  export namespace SharedStorage_1 {
280
- let chromeStatusFeature_29: number;
281
- export { chromeStatusFeature_29 as chromeStatusFeature };
286
+ let chromeStatusFeature_30: number;
287
+ export { chromeStatusFeature_30 as chromeStatusFeature };
282
288
  }
283
289
  export { SharedStorage_1 as SharedStorage };
284
290
  export namespace StorageAccessAPI_requestStorageAccessFor_Method_1 {
285
- let chromeStatusFeature_30: number;
286
- export { chromeStatusFeature_30 as chromeStatusFeature };
291
+ let chromeStatusFeature_31: number;
292
+ export { chromeStatusFeature_31 as chromeStatusFeature };
287
293
  }
288
294
  export { StorageAccessAPI_requestStorageAccessFor_Method_1 as StorageAccessAPI_requestStorageAccessFor_Method };
289
295
  export namespace TextToSpeech_DisallowedByAutoplay_1 {
290
- let chromeStatusFeature_31: number;
291
- export { chromeStatusFeature_31 as chromeStatusFeature };
296
+ let chromeStatusFeature_32: number;
297
+ export { chromeStatusFeature_32 as chromeStatusFeature };
292
298
  let milestone_18: number;
293
299
  export { milestone_18 as milestone };
294
300
  }
295
301
  export { TextToSpeech_DisallowedByAutoplay_1 as TextToSpeech_DisallowedByAutoplay };
296
302
  export namespace UnloadHandler_1 {
297
- let chromeStatusFeature_32: number;
298
- export { chromeStatusFeature_32 as chromeStatusFeature };
303
+ let chromeStatusFeature_33: number;
304
+ export { chromeStatusFeature_33 as chromeStatusFeature };
299
305
  }
300
306
  export { UnloadHandler_1 as UnloadHandler };
301
307
  export namespace V8SharedArrayBufferConstructedInExtensionWithoutIsolation_1 {
@@ -304,8 +310,8 @@ export namespace DEPRECATIONS_METADATA {
304
310
  }
305
311
  export { V8SharedArrayBufferConstructedInExtensionWithoutIsolation_1 as V8SharedArrayBufferConstructedInExtensionWithoutIsolation };
306
312
  export namespace WebBluetoothRemoteCharacteristicWriteValue_1 {
307
- let chromeStatusFeature_33: number;
308
- export { chromeStatusFeature_33 as chromeStatusFeature };
313
+ let chromeStatusFeature_34: number;
314
+ export { chromeStatusFeature_34 as chromeStatusFeature };
309
315
  }
310
316
  export { WebBluetoothRemoteCharacteristicWriteValue_1 as WebBluetoothRemoteCharacteristicWriteValue };
311
317
  export namespace XHRJSONEncodingDetection_1 {
@@ -314,8 +320,8 @@ export namespace DEPRECATIONS_METADATA {
314
320
  }
315
321
  export { XHRJSONEncodingDetection_1 as XHRJSONEncodingDetection };
316
322
  export namespace XSLT_1 {
317
- let chromeStatusFeature_34: number;
318
- export { chromeStatusFeature_34 as chromeStatusFeature };
323
+ let chromeStatusFeature_35: number;
324
+ export { chromeStatusFeature_35 as chromeStatusFeature };
319
325
  let milestone_21: number;
320
326
  export { milestone_21 as milestone };
321
327
  }
@@ -212,6 +212,10 @@ export const UIStrings = {
212
212
  * @description Standard message when one web API is deprecated in favor of another.
213
213
  */
214
214
  PrefixedVideoSupportsFullscreen: "HTMLVideoElement.webkitSupportsFullscreen is deprecated. Please use Document.fullscreenEnabled instead.",
215
+ /**
216
+ * @description Warning displayed to developers when an SVG filter is applied to a disallowed content type.
217
+ */
218
+ PreventSvgFilterPaint: "SVG filters cannot be applied to cross-origin iframes, restricted iframes (e.g., sandboxed), or plugins.",
215
219
  /**
216
220
  * @description Standard message when one web API is deprecated in favor of another.
217
221
  */
@@ -391,6 +395,9 @@ export const DEPRECATIONS_METADATA = {
391
395
  "chromeStatusFeature": 5176235376246784,
392
396
  "milestone": 106
393
397
  },
398
+ "PreventSvgFilterPaint": {
399
+ "chromeStatusFeature": 5117170452398080
400
+ },
394
401
  "RTCConstraintEnableDtlsSrtpFalse": {
395
402
  "milestone": 97
396
403
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lighthouse",
3
3
  "type": "module",
4
- "version": "13.2.0",
4
+ "version": "13.3.0",
5
5
  "description": "Automated auditing, performance metrics, and best practices for the web.",
6
6
  "main": "./core/index.js",
7
7
  "bin": {
@@ -141,7 +141,7 @@
141
141
  "builtin-modules": "^3.3.0",
142
142
  "c8": "^7.11.3",
143
143
  "chalk": "^2.4.1",
144
- "chrome-devtools-frontend": "1.0.1621678",
144
+ "chrome-devtools-frontend": "1.0.1625854",
145
145
  "colors": "^1.4.0",
146
146
  "concurrently": "^9.2.1",
147
147
  "conventional-changelog-cli": "^2.1.1",
@@ -170,7 +170,7 @@
170
170
  "pako": "^2.1.0",
171
171
  "preact": "^10.7.2",
172
172
  "pretty-json-stringify": "^0.0.2",
173
- "puppeteer": "^24.42.0",
173
+ "puppeteer": "^24.43.0",
174
174
  "resolve": "^1.22.10",
175
175
  "rollup-plugin-polyfill-node": "^0.12.0",
176
176
  "source-map-support": "^0.5.21",
@@ -188,7 +188,7 @@
188
188
  "chrome-launcher": "^1.2.1",
189
189
  "configstore": "^7.0.0",
190
190
  "csp_evaluator": "1.1.5",
191
- "devtools-protocol": "0.0.1621552",
191
+ "devtools-protocol": "0.0.1625959",
192
192
  "enquirer": "^2.3.6",
193
193
  "http-link-header": "^1.1.1",
194
194
  "intl-messageformat": "^10.5.3",
@@ -199,19 +199,19 @@
199
199
  "lodash-es": "^4.17.21",
200
200
  "lookup-closest-locale": "6.2.0",
201
201
  "open": "^8.4.0",
202
- "puppeteer-core": "^24.42.0",
202
+ "puppeteer-core": "^24.43.0",
203
203
  "robots-parser": "^3.0.1",
204
204
  "speedline-core": "^1.4.3",
205
205
  "third-party-web": "^0.29.0",
206
- "tldts-icann": "^7.0.29",
207
- "web-features": "^3.25.0",
206
+ "tldts-icann": "^7.0.30",
207
+ "web-features": "^3.26.0",
208
208
  "ws": "^7.0.0",
209
209
  "yargs": "^17.3.1",
210
210
  "yargs-parser": "^21.0.0"
211
211
  },
212
212
  "resolutions": {
213
- "puppeteer/**/devtools-protocol": "0.0.1621552",
214
- "puppeteer-core/**/devtools-protocol": "0.0.1621552"
213
+ "puppeteer/**/devtools-protocol": "0.0.1625959",
214
+ "puppeteer-core/**/devtools-protocol": "0.0.1625959"
215
215
  },
216
216
  "repository": "GoogleChrome/lighthouse",
217
217
  "keywords": [
@@ -603,7 +603,7 @@
603
603
  "message": "Failing Rule"
604
604
  },
605
605
  "core/audits/agentic/agent-accessibility-tree.js | description": {
606
- "message": "A well-formed accessibility tree helps AI agents to navigate and interact with the page."
606
+ "message": "A well-formed [accessibility tree](http://goo.gle/lighthouse-agentic-a11y) helps AI agents to navigate and interact with the page."
607
607
  },
608
608
  "core/audits/agentic/agent-accessibility-tree.js | displayValuePassed": {
609
609
  "message": "All audits passed"
@@ -618,7 +618,7 @@
618
618
  "message": "Accessibility tree is well-formed"
619
619
  },
620
620
  "core/audits/agentic/llms-txt.js | description": {
621
- "message": "If your llms.txt file is malformed, large language models may not be able to understand how you want your website to be crawled or used for training. A valid llms.txt should be a Markdown file containing at least one H1 header. [Learn more about llms.txt](https://llmstxt.org/)."
621
+ "message": "If your llms.txt file does not follow recommendations, large language models may not be able to understand how you want your website to be crawled or used for training. The [llms.txt](https://llmstxt.org/) file should be a Markdown file containing at least one H1 header."
622
622
  },
623
623
  "core/audits/agentic/llms-txt.js | displayValueHttpBadCode": {
624
624
  "message": "Failed with HTTP status {statusCode}"
@@ -627,7 +627,7 @@
627
627
  "message": "Fetch of llms.txt failed"
628
628
  },
629
629
  "core/audits/agentic/llms-txt.js | failureTitle": {
630
- "message": "llms.txt is missing or incomplete"
630
+ "message": "llms.txt does not follow recommendations"
631
631
  },
632
632
  "core/audits/agentic/llms-txt.js | missingH1": {
633
633
  "message": "File is missing a required H1 header (e.g., \"# Title\")."
@@ -636,7 +636,7 @@
636
636
  "message": "File does not appear to contain any links."
637
637
  },
638
638
  "core/audits/agentic/llms-txt.js | title": {
639
- "message": "llms.txt is present"
639
+ "message": "llms.txt follows recommendations"
640
640
  },
641
641
  "core/audits/agentic/llms-txt.js | tooShort": {
642
642
  "message": "File is suspiciously short."
@@ -1350,7 +1350,7 @@
1350
1350
  "message": "Form"
1351
1351
  },
1352
1352
  "core/audits/webmcp-form-coverage.js | description": {
1353
- "message": "Consider adding WebMCP annotations to the forms listed below. This helps AI agents identify and interact with these forms more reliably."
1353
+ "message": "Consider adding [WebMCP](http://goo.gle/webmcp-docs) annotations to the forms listed below. This helps AI agents identify and interact with these forms more reliably."
1354
1354
  },
1355
1355
  "core/audits/webmcp-form-coverage.js | displayValue": {
1356
1356
  "message": "{itemCount, plural,\n =1 {1 form missing annotations}\n other {# forms missing annotations}\n }"
@@ -1374,7 +1374,7 @@
1374
1374
  "message": "Tool name"
1375
1375
  },
1376
1376
  "core/audits/webmcp-registered-tools.js | description": {
1377
- "message": "Lists the WebMCP tools registered at the time of analysis. "
1377
+ "message": "Lists the [WebMCP tools](http://goo.gle/webmcp-docs) registered at the time of analysis."
1378
1378
  },
1379
1379
  "core/audits/webmcp-registered-tools.js | title": {
1380
1380
  "message": "WebMCP tools registered"
@@ -1392,7 +1392,7 @@
1392
1392
  "message": "Issue"
1393
1393
  },
1394
1394
  "core/audits/webmcp-schema-validity.js | description": {
1395
- "message": "Valid WebMCP schemas are required for AI agents to understand and interact with tools correctly. Please fix any errors or warnings reported by the browser."
1395
+ "message": "Valid [WebMCP schemas](http://goo.gle/webmcp-docs) are required for AI agents to understand and interact with tools correctly. Please fix any errors or warnings reported by the browser."
1396
1396
  },
1397
1397
  "core/audits/webmcp-schema-validity.js | failureTitle": {
1398
1398
  "message": "WebMCP schemas are invalid"
@@ -1422,7 +1422,7 @@
1422
1422
  "message": "Agent Accessibility"
1423
1423
  },
1424
1424
  "core/config/agentic-browsing-config.js | agenticBrowsingCategoryDescription": {
1425
- "message": "These checks ensure high-quality, browsable websites for AI agents and validate the correctness of WebMCP integrations. This category is still under development and subject to change."
1425
+ "message": "These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) and validate the correctness of WebMCP integrations. This category is still under development and subject to change."
1426
1426
  },
1427
1427
  "core/config/agentic-browsing-config.js | agenticBrowsingCategoryTitle": {
1428
1428
  "message": "Agentic Browsing"
@@ -1490,6 +1490,18 @@
1490
1490
  "core/config/default-config.js | a11yTablesListsVideoGroupTitle": {
1491
1491
  "message": "Tables and lists"
1492
1492
  },
1493
+ "core/config/default-config.js | agentAccessibilityGroupDescription": {
1494
+ "message": "These audits highlight best practices for improving the accessibility of the website for AI agents."
1495
+ },
1496
+ "core/config/default-config.js | agentAccessibilityGroupTitle": {
1497
+ "message": "Agent Accessibility"
1498
+ },
1499
+ "core/config/default-config.js | agenticBrowsingCategoryDescription": {
1500
+ "message": "These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) and validate the correctness of WebMCP integrations. This category is still under development and subject to change."
1501
+ },
1502
+ "core/config/default-config.js | agenticBrowsingCategoryTitle": {
1503
+ "message": "Agentic Browsing"
1504
+ },
1493
1505
  "core/config/default-config.js | bestPracticesBrowserCompatGroupTitle": {
1494
1506
  "message": "Browser Compatibility"
1495
1507
  },
@@ -1562,6 +1574,12 @@
1562
1574
  "core/config/default-config.js | seoMobileGroupTitle": {
1563
1575
  "message": "Mobile Friendly"
1564
1576
  },
1577
+ "core/config/default-config.js | webmcpGroupDescription": {
1578
+ "message": "Audits validating WebMCP integration."
1579
+ },
1580
+ "core/config/default-config.js | webmcpGroupTitle": {
1581
+ "message": "WebMCP"
1582
+ },
1565
1583
  "core/gather/driver/environment.js | warningSlowHostCpu": {
1566
1584
  "message": "The tested device appears to have a slower CPU than Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/main/docs/throttling.md#cpu-throttling)."
1567
1585
  },
@@ -603,7 +603,7 @@
603
603
  "message": "F̂áîĺîńĝ Ŕûĺê"
604
604
  },
605
605
  "core/audits/agentic/agent-accessibility-tree.js | description": {
606
- "message": "Â ẃêĺl̂-f́ôŕm̂éd̂ áĉćêśŝíb̂íl̂ít̂ý t̂ŕêé ĥél̂ṕŝ ÁÎ áĝén̂t́ŝ t́ô ńâv́îǵât́ê án̂d́ îńt̂ér̂áĉt́ ŵít̂h́ t̂h́ê ṕâǵê."
606
+ "message": "Â ẃêĺl̂-f́ôŕm̂éd̂ [áĉćêśŝíb̂íl̂ít̂ý t̂ŕêé](http://goo.gle/lighthouse-agentic-a11y) ĥél̂ṕŝ ÁÎ áĝén̂t́ŝ t́ô ńâv́îǵât́ê án̂d́ îńt̂ér̂áĉt́ ŵít̂h́ t̂h́ê ṕâǵê."
607
607
  },
608
608
  "core/audits/agentic/agent-accessibility-tree.js | displayValuePassed": {
609
609
  "message": "Âĺl̂ áûd́ît́ŝ ṕâśŝéd̂"
@@ -618,7 +618,7 @@
618
618
  "message": "Âćĉéŝśîb́îĺît́ŷ t́r̂éê íŝ ẃêĺl̂-f́ôŕm̂éd̂"
619
619
  },
620
620
  "core/audits/agentic/llms-txt.js | description": {
621
- "message": "Îf́ ŷóûŕ l̂ĺm̂ś.t̂x́t̂ f́îĺê íŝ ḿâĺf̂ór̂ḿêd́, l̂ár̂ǵê ĺâńĝúâǵêôd́êĺâób̂ĺn̂d́êŕŝt́âń h́ôẃ ŷẃâńt̂ ýôú ẃêb́ŝt̂é t̂ó b̂é ĉŕâẃl̂éd̂ ór̂ úŝé ôŕ t̂ŕâín̂ín̂ǵ. Â v́âĺîd́ l̂ĺm̂ś.t̂x́t̂ śĥóûĺd̂ b́ê á M̂ár̂ḱd̂óŵń f̂íl̂é ĉón̂t́âín̂ín̂ǵ ât́ l̂éâśt̂ ón̂é Ĥ1 h́êád̂ér̂. [Ĺêár̂ń m̂ór̂é âb́ôút̂ ĺl̂ḿŝ.t́x̂t́](https://llmstxt.org/)."
621
+ "message": "Îf́ ŷóûŕ l̂ĺm̂ś.t̂x́t̂ f́îĺê d́ôéńôt́ f̂ól̂ĺôẃ éĉóm̂ḿêd̂át̂íôńŝ, ĺâŕĝéán̂ǵûáĝé m̂ód̂él̂ś m̂áŷ ńôt́ b̂é âb́l̂é t̂ó ûńd̂ér̂śt̂án̂d́ ĥóŵ ýôú ŵán̂t́ ŷóûŕ ŵéb̂śît́ê t́ô b́ê ćr̂áŵĺêd́ ôŕ ûśêd́ f̂ór̂ t́r̂áîńîńĝ. T́ĥé [l̂ĺm̂ś.t̂x́t̂](https://llmstxt.org/) f́îĺê śĥóûĺd̂ b́ê á M̂ár̂ḱd̂óŵń f̂íl̂é ĉón̂t́âín̂ín̂ǵ ât́ l̂éâśt̂ ón̂é Ĥ1 h́êád̂ér̂."
622
622
  },
623
623
  "core/audits/agentic/llms-txt.js | displayValueHttpBadCode": {
624
624
  "message": "F̂áîĺêd́ ŵít̂h́ ĤT́T̂Ṕ ŝt́ât́ûś {statusCode}"
@@ -627,7 +627,7 @@
627
627
  "message": "F̂ét̂ćĥ óf̂ ĺl̂ḿŝ.t́x̂t́ f̂áîĺêd́"
628
628
  },
629
629
  "core/audits/agentic/llms-txt.js | failureTitle": {
630
- "message": "l̂ĺm̂ś.t̂x́t̂ íŝ ḿîśŝín̂ǵ ŕ îńĉóm̂ṕl̂ét̂é"
630
+ "message": "l̂ĺm̂ś.t̂x́t̂ d́ôéńôt́ f̂ól̂ĺôẃ r̂éĉóm̂ḿêńd̂áíôńŝ"
631
631
  },
632
632
  "core/audits/agentic/llms-txt.js | missingH1": {
633
633
  "message": "F̂íl̂é îś m̂íŝśîńĝ á r̂éq̂úîŕêd́ Ĥ1 h́êád̂ér̂ (é.ĝ., \"# T́ît́l̂é\")."
@@ -636,7 +636,7 @@
636
636
  "message": "F̂íl̂é d̂óêś n̂ót̂ áp̂ṕêár̂ t́ô ćôńt̂áîń âńŷ ĺîńk̂ś."
637
637
  },
638
638
  "core/audits/agentic/llms-txt.js | title": {
639
- "message": "l̂ĺm̂ś.t̂x́t̂ íŝ r̂éŝén̂t́"
639
+ "message": "l̂ĺm̂ś.t̂x́t̂ f́ôĺl̂óŵś r̂éĉóm̂ḿêńd̂t̂íôńŝ"
640
640
  },
641
641
  "core/audits/agentic/llms-txt.js | tooShort": {
642
642
  "message": "F̂íl̂é îś ŝúŝṕîćîóûśl̂ý ŝh́ôŕt̂."
@@ -1350,7 +1350,7 @@
1350
1350
  "message": "F̂ór̂ḿ"
1351
1351
  },
1352
1352
  "core/audits/webmcp-form-coverage.js | description": {
1353
- "message": "Ĉón̂śîd́êŕ âd́d̂ín̂ǵ Ŵéb̂ḾĈṔ âńn̂ót̂át̂íôńŝ t́ô t́ĥé f̂ór̂ḿŝ ĺîśt̂éd̂ b́êĺôẃ. T̂h́îś ĥél̂ṕŝ ÁÎ áĝén̂t́ŝ íd̂én̂t́îf́ŷ án̂d́ îńt̂ér̂áĉt́ ŵít̂h́ t̂h́êśê f́ôŕm̂ś m̂ór̂é r̂él̂íâb́l̂ý."
1353
+ "message": "Ĉón̂śîd́êŕ âd́d̂ín̂ǵ [Ŵéb̂ḾĈṔ](http://goo.gle/webmcp-docs) âńn̂ót̂át̂íôńŝ t́ô t́ĥé f̂ór̂ḿŝ ĺîśt̂éd̂ b́êĺôẃ. T̂h́îś ĥél̂ṕŝ ÁÎ áĝén̂t́ŝ íd̂én̂t́îf́ŷ án̂d́ îńt̂ér̂áĉt́ ŵít̂h́ t̂h́êśê f́ôŕm̂ś m̂ór̂é r̂él̂íâb́l̂ý."
1354
1354
  },
1355
1355
  "core/audits/webmcp-form-coverage.js | displayValue": {
1356
1356
  "message": "{itemCount, plural,\n =1 {1 f̂ór̂ḿ m̂íŝśîńĝ án̂ńôt́ât́îón̂ś}\n other {# f̂ór̂ḿŝ ḿîśŝín̂ǵ âńn̂ót̂át̂íôńŝ}\n }"
@@ -1374,7 +1374,7 @@
1374
1374
  "message": "T̂óôĺ n̂ám̂é"
1375
1375
  },
1376
1376
  "core/audits/webmcp-registered-tools.js | description": {
1377
- "message": "L̂íŝt́ŝ t́ĥé Ŵéb̂ḾĈṔ t̂óôĺŝ ŕêǵîśt̂ér̂éd̂ át̂ t́ĥé t̂ím̂é ôf́ âńâĺŷśîś. "
1377
+ "message": "L̂íŝt́ŝ t́ĥé [Ŵéb̂ḾĈṔ t̂óôĺŝ](http://goo.gle/webmcp-docs) ŕêǵîśt̂ér̂éd̂ át̂ t́ĥé t̂ím̂é ôf́ âńâĺŷśîś."
1378
1378
  },
1379
1379
  "core/audits/webmcp-registered-tools.js | title": {
1380
1380
  "message": "Ŵéb̂ḾĈṔ t̂óôĺŝ ŕêǵîśt̂ér̂éd̂"
@@ -1392,7 +1392,7 @@
1392
1392
  "message": "Îśŝúê"
1393
1393
  },
1394
1394
  "core/audits/webmcp-schema-validity.js | description": {
1395
- "message": "V̂ál̂íd̂ Ẃêb́M̂ĆP̂ śĉh́êḿâś âŕê ŕêq́ûír̂éd̂ f́ôŕ ÂÍ âǵêńt̂ś t̂ó ûńd̂ér̂śt̂án̂d́ âńd̂ ín̂t́êŕâćt̂ ẃît́ĥ t́ôól̂ś ĉór̂ŕêćt̂ĺŷ. Ṕl̂éâśê f́îx́ âńŷ ér̂ŕôŕŝ ór̂ ẃâŕn̂ín̂ǵŝ ŕêṕôŕt̂éd̂ b́ŷ t́ĥé b̂ŕôẃŝér̂."
1395
+ "message": "V̂ál̂íd̂ [Ẃêb́M̂ĆP̂ śĉh́êḿâś](http://goo.gle/webmcp-docs) âŕê ŕêq́ûír̂éd̂ f́ôŕ ÂÍ âǵêńt̂ś t̂ó ûńd̂ér̂śt̂án̂d́ âńd̂ ín̂t́êŕâćt̂ ẃît́ĥ t́ôól̂ś ĉór̂ŕêćt̂ĺŷ. Ṕl̂éâśê f́îx́ âńŷ ér̂ŕôŕŝ ór̂ ẃâŕn̂ín̂ǵŝ ŕêṕôŕt̂éd̂ b́ŷ t́ĥé b̂ŕôẃŝér̂."
1396
1396
  },
1397
1397
  "core/audits/webmcp-schema-validity.js | failureTitle": {
1398
1398
  "message": "Ŵéb̂ḾĈṔ ŝćĥém̂áŝ ár̂é îńv̂ál̂íd̂"
@@ -1422,7 +1422,7 @@
1422
1422
  "message": "Âǵêńt̂ Áĉćêśŝíb̂íl̂ít̂ý"
1423
1423
  },
1424
1424
  "core/config/agentic-browsing-config.js | agenticBrowsingCategoryDescription": {
1425
- "message": "T̂h́êśê ćĥéĉḱŝ én̂śûŕê h́îǵĥ-q́ûál̂ít̂ý, b̂ŕôẃŝáb̂ĺê ẃêb́ŝít̂éŝ f́ôŕ ÂÍ âǵêńt̂ś âńd̂ v́âĺîd́ât́ê t́ĥé ĉór̂ŕêćt̂ńêśŝ óf̂ Ẃêb́M̂ĆP̂ ín̂t́êǵr̂át̂íôńŝ. T́ĥíŝ ćât́êǵôŕŷ íŝ śt̂íl̂ĺ ûńd̂ér̂ d́êv́êĺôṕm̂én̂t́ âńd̂ śûb́ĵéĉt́ t̂ó ĉh́âńĝé."
1425
+ "message": "T̂h́êśê ćĥéĉḱŝ én̂śûŕê h́îǵĥ-q́ûál̂ít̂ý, [b̂ŕôẃŝáb̂ĺê ẃêb́ŝít̂éŝ f́ôŕ ÂÍ âǵêńt̂ś](https://goo.gle/lighthouse-agentic-web) âńd̂ v́âĺîd́ât́ê t́ĥé ĉór̂ŕêćt̂ńêśŝ óf̂ Ẃêb́M̂ĆP̂ ín̂t́êǵr̂át̂íôńŝ. T́ĥíŝ ćât́êǵôŕŷ íŝ śt̂íl̂ĺ ûńd̂ér̂ d́êv́êĺôṕm̂én̂t́ âńd̂ śûb́ĵéĉt́ t̂ó ĉh́âńĝé."
1426
1426
  },
1427
1427
  "core/config/agentic-browsing-config.js | agenticBrowsingCategoryTitle": {
1428
1428
  "message": "Âǵêńt̂íĉ B́r̂óŵśîńĝ"
@@ -1490,6 +1490,18 @@
1490
1490
  "core/config/default-config.js | a11yTablesListsVideoGroupTitle": {
1491
1491
  "message": "T̂áb̂ĺêś âńd̂ ĺîśt̂ś"
1492
1492
  },
1493
+ "core/config/default-config.js | agentAccessibilityGroupDescription": {
1494
+ "message": "T̂h́êśê áûd́ît́ŝ h́îǵĥĺîǵĥt́ b̂éŝt́ p̂ŕâćt̂íĉéŝ f́ôŕ îḿp̂ŕôv́îńĝ t́ĥé âćĉéŝśîb́îĺît́ŷ óf̂ t́ĥé ŵéb̂śît́ê f́ôŕ ÂÍ âǵêńt̂ś."
1495
+ },
1496
+ "core/config/default-config.js | agentAccessibilityGroupTitle": {
1497
+ "message": "Âǵêńt̂ Áĉćêśŝíb̂íl̂ít̂ý"
1498
+ },
1499
+ "core/config/default-config.js | agenticBrowsingCategoryDescription": {
1500
+ "message": "T̂h́êśê ćĥéĉḱŝ én̂śûŕê h́îǵĥ-q́ûál̂ít̂ý, [b̂ŕôẃŝáb̂ĺê ẃêb́ŝít̂éŝ f́ôŕ ÂÍ âǵêńt̂ś](https://goo.gle/lighthouse-agentic-web) âńd̂ v́âĺîd́ât́ê t́ĥé ĉór̂ŕêćt̂ńêśŝ óf̂ Ẃêb́M̂ĆP̂ ín̂t́êǵr̂át̂íôńŝ. T́ĥíŝ ćât́êǵôŕŷ íŝ śt̂íl̂ĺ ûńd̂ér̂ d́êv́êĺôṕm̂én̂t́ âńd̂ śûb́ĵéĉt́ t̂ó ĉh́âńĝé."
1501
+ },
1502
+ "core/config/default-config.js | agenticBrowsingCategoryTitle": {
1503
+ "message": "Âǵêńt̂íĉ B́r̂óŵśîńĝ"
1504
+ },
1493
1505
  "core/config/default-config.js | bestPracticesBrowserCompatGroupTitle": {
1494
1506
  "message": "B̂ŕôẃŝér̂ Ćôḿp̂át̂íb̂íl̂ít̂ý"
1495
1507
  },
@@ -1562,6 +1574,12 @@
1562
1574
  "core/config/default-config.js | seoMobileGroupTitle": {
1563
1575
  "message": "M̂ób̂íl̂é F̂ŕîén̂d́l̂ý"
1564
1576
  },
1577
+ "core/config/default-config.js | webmcpGroupDescription": {
1578
+ "message": "Âúd̂ít̂ś v̂ál̂íd̂át̂ín̂ǵ Ŵéb̂ḾĈṔ îńt̂éĝŕât́îón̂."
1579
+ },
1580
+ "core/config/default-config.js | webmcpGroupTitle": {
1581
+ "message": "Ŵéb̂ḾĈṔ"
1582
+ },
1565
1583
  "core/gather/driver/environment.js | warningSlowHostCpu": {
1566
1584
  "message": "T̂h́ê t́êśt̂éd̂ d́êv́îćê áp̂ṕêár̂ś t̂ó ĥáv̂é â śl̂óŵér̂ ĆP̂Ú t̂h́âń L̂íĝh́t̂h́ôúŝé êx́p̂éĉt́ŝ. T́ĥíŝ ćâń n̂éĝát̂ív̂él̂ý âf́f̂éĉt́ ŷóûŕ p̂ér̂f́ôŕm̂án̂ćê śĉór̂é. L̂éâŕn̂ ḿôŕê áb̂óût́ [ĉál̂íb̂ŕât́îńĝ án̂ áp̂ṕr̂óp̂ŕîát̂é ĈṔÛ śl̂óŵd́ôẃn̂ ḿûĺt̂íp̂ĺîér̂](https://github.com/GoogleChrome/lighthouse/blob/main/docs/throttling.md#cpu-throttling)."
1567
1585
  },
@@ -42,6 +42,10 @@ declare global {
42
42
  config?: Config;
43
43
  /** If test is performance sensitive, set to true so that it won't be run parallel to other tests. */
44
44
  runSerially?: boolean;
45
+ /** Custom options for the test runner (e.g., custom Chrome flags). */
46
+ testRunnerOptions?: {
47
+ chromeFlags?: string;
48
+ };
45
49
  }
46
50
 
47
51
  /**
@@ -54,7 +58,7 @@ declare global {
54
58
  {expectations: Smokehouse.ExpectedRunnerResult | Array<Smokehouse.ExpectedRunnerResult>}
55
59
 
56
60
  export type LighthouseRunner =
57
- {runnerName?: string} & ((url: string, config?: Config, logger?: LocalConsole, runnerOptions?: {isDebug?: boolean}) => Promise<{lhr: LHResult, artifacts: Artifacts}>);
61
+ {runnerName?: string} & ((url: string, config?: Config, logger?: LocalConsole, runnerOptions?: SmokehouseOptions['testRunnerOptions']) => Promise<{lhr: LHResult, artifacts: Artifacts}>);
58
62
 
59
63
  export interface SmokehouseOptions {
60
64
  /** Options to pass to the specific Lighthouse runner. */
@@ -63,6 +67,8 @@ declare global {
63
67
  isDebug?: boolean;
64
68
  /** Launch Chrome in the new headless mode (`--headless=new`), rather than the typical desktop headful mode. */
65
69
  headless?: boolean;
70
+ /** Custom Chrome flags to pass to the launched browser. */
71
+ chromeFlags?: string;
66
72
  };
67
73
  /** Manually set the number of jobs to run at once. `1` runs all tests serially. */
68
74
  jobs: number;