lighthouse 13.5.0 → 13.6.0-dev.20261028

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 (272) hide show
  1. package/.agents/skills/update-ard-port/SKILL.md +171 -0
  2. package/.agents/skills/update-trace-engine/SKILL.md +154 -0
  3. package/cli/bin.d.ts +2 -2
  4. package/cli/bin.js +5 -4
  5. package/cli/cli-flags.d.ts +16 -1
  6. package/cli/cli-flags.js +53 -2
  7. package/cli/printer.js +5 -8
  8. package/cli/run.d.ts +5 -5
  9. package/cli/run.js +97 -47
  10. package/cli/sentry-prompt.js +3 -4
  11. package/cli/test/smokehouse/__snapshots__/report-assert-test.js.snap +1 -1
  12. package/cli/test/smokehouse/config/exclusions.js +3 -1
  13. package/cli/test/smokehouse/frontends/smokehouse-bin.js +5 -3
  14. package/cli/test/smokehouse/report-assert-test.js +65 -0
  15. package/cli/test/smokehouse/report-assert.js +24 -39
  16. package/cli/test/smokehouse/smokehouse-test.d.ts +2 -0
  17. package/cli/test/smokehouse/smokehouse-test.js +120 -0
  18. package/cli/test/smokehouse/smokehouse.js +37 -15
  19. package/cli/test/smokehouse/version-check-test.js +5 -0
  20. package/cli/test/smokehouse/version-check.d.ts +1 -1
  21. package/cli/test/smokehouse/version-check.js +1 -1
  22. package/commitlint.config.js +1 -1
  23. package/core/audits/accessibility/accesskeys.js +1 -1
  24. package/core/audits/accessibility/aria-allowed-attr.js +1 -1
  25. package/core/audits/accessibility/aria-allowed-role.js +1 -1
  26. package/core/audits/accessibility/aria-command-name.js +1 -1
  27. package/core/audits/accessibility/aria-conditional-attr.js +1 -1
  28. package/core/audits/accessibility/aria-deprecated-role.js +1 -1
  29. package/core/audits/accessibility/aria-dialog-name.js +1 -1
  30. package/core/audits/accessibility/aria-hidden-body.js +1 -1
  31. package/core/audits/accessibility/aria-hidden-focus.js +1 -1
  32. package/core/audits/accessibility/aria-input-field-name.js +1 -1
  33. package/core/audits/accessibility/aria-meter-name.js +1 -1
  34. package/core/audits/accessibility/aria-progressbar-name.js +1 -1
  35. package/core/audits/accessibility/aria-prohibited-attr.js +1 -1
  36. package/core/audits/accessibility/aria-required-attr.js +1 -1
  37. package/core/audits/accessibility/aria-required-children.js +1 -1
  38. package/core/audits/accessibility/aria-required-parent.js +1 -1
  39. package/core/audits/accessibility/aria-roles.js +1 -1
  40. package/core/audits/accessibility/aria-text.js +1 -1
  41. package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
  42. package/core/audits/accessibility/aria-tooltip-name.js +1 -1
  43. package/core/audits/accessibility/aria-treeitem-name.js +1 -1
  44. package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
  45. package/core/audits/accessibility/aria-valid-attr.js +1 -1
  46. package/core/audits/accessibility/autocomplete-valid.js +1 -1
  47. package/core/audits/accessibility/button-name.js +1 -1
  48. package/core/audits/accessibility/bypass.js +1 -1
  49. package/core/audits/accessibility/color-contrast.js +1 -1
  50. package/core/audits/accessibility/definition-list.js +1 -1
  51. package/core/audits/accessibility/dlitem.js +1 -1
  52. package/core/audits/accessibility/document-title.js +1 -1
  53. package/core/audits/accessibility/duplicate-id-aria.js +1 -1
  54. package/core/audits/accessibility/empty-heading.js +1 -1
  55. package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
  56. package/core/audits/accessibility/frame-title.js +1 -1
  57. package/core/audits/accessibility/heading-order.js +1 -1
  58. package/core/audits/accessibility/html-has-lang.js +1 -1
  59. package/core/audits/accessibility/html-lang-valid.js +1 -1
  60. package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
  61. package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
  62. package/core/audits/accessibility/image-alt.js +1 -1
  63. package/core/audits/accessibility/image-redundant-alt.js +1 -1
  64. package/core/audits/accessibility/input-button-name.js +1 -1
  65. package/core/audits/accessibility/input-image-alt.js +1 -1
  66. package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
  67. package/core/audits/accessibility/label.js +1 -1
  68. package/core/audits/accessibility/landmark-one-main.js +1 -1
  69. package/core/audits/accessibility/link-in-text-block.js +1 -1
  70. package/core/audits/accessibility/link-name.js +1 -1
  71. package/core/audits/accessibility/list.js +1 -1
  72. package/core/audits/accessibility/listitem.js +1 -1
  73. package/core/audits/accessibility/meta-refresh.js +1 -1
  74. package/core/audits/accessibility/meta-viewport.js +1 -1
  75. package/core/audits/accessibility/object-alt.js +1 -1
  76. package/core/audits/accessibility/presentation-role-conflict.js +1 -1
  77. package/core/audits/accessibility/select-name.js +1 -1
  78. package/core/audits/accessibility/skip-link.js +1 -1
  79. package/core/audits/accessibility/svg-img-alt.js +1 -1
  80. package/core/audits/accessibility/tabindex.js +1 -1
  81. package/core/audits/accessibility/table-duplicate-name.js +1 -1
  82. package/core/audits/accessibility/table-fake-caption.js +1 -1
  83. package/core/audits/accessibility/target-size.js +1 -1
  84. package/core/audits/accessibility/td-has-header.js +1 -1
  85. package/core/audits/accessibility/td-headers-attr.js +1 -1
  86. package/core/audits/accessibility/th-has-data-cells.js +1 -1
  87. package/core/audits/accessibility/valid-lang.js +1 -1
  88. package/core/audits/accessibility/video-caption.js +1 -1
  89. package/core/audits/agentic/ard-schema.d.ts +13 -0
  90. package/core/audits/agentic/ard-schema.js +81 -33
  91. package/core/audits/agentic/llms-txt.js +5 -2
  92. package/core/audits/baseline.d.ts +29 -7
  93. package/core/audits/baseline.js +19 -6
  94. package/core/audits/byte-efficiency/byte-efficiency-audit.js +2 -2
  95. package/core/audits/insights/insight-audit.d.ts +9 -0
  96. package/core/audits/insights/insight-audit.js +35 -28
  97. package/core/audits/long-tasks.js +2 -1
  98. package/core/audits/predictive-perf.js +2 -2
  99. package/core/audits/screenshot-thumbnails.d.ts +0 -13
  100. package/core/audits/screenshot-thumbnails.js +0 -45
  101. package/core/audits/script-treemap-data.js +26 -6
  102. package/core/audits/seo/robots-txt.js +3 -8
  103. package/core/audits/unsized-images.d.ts +0 -7
  104. package/core/audits/unsized-images.js +7 -26
  105. package/core/computed/lcp-image-record.d.ts +2 -23
  106. package/core/computed/lcp-image-record.js +3 -67
  107. package/core/computed/lcp-network-record.d.ts +24 -0
  108. package/core/computed/lcp-network-record.js +74 -0
  109. package/core/computed/metrics/lantern-metric.js +1 -1
  110. package/core/computed/metrics/lcp-breakdown.js +6 -6
  111. package/core/computed/metrics/time-to-first-byte.js +5 -3
  112. package/core/computed/navigation-insights.js +3 -2
  113. package/core/computed/page-dependency-graph.js +55 -5
  114. package/core/computed/speedline.js +20 -5
  115. package/core/computed/trace-engine-result.js +25 -5
  116. package/core/computed/unused-css.js +15 -2
  117. package/core/config/config-helpers.d.ts +5 -0
  118. package/core/config/config-helpers.js +17 -28
  119. package/core/config/config-plugin.d.ts +7 -0
  120. package/core/config/config-plugin.js +49 -0
  121. package/core/config/config.js +10 -2
  122. package/core/config/constants.d.ts +2 -28
  123. package/core/config/filters.js +1 -0
  124. package/core/config/lr-desktop-config.js +13 -0
  125. package/core/config/lr-mobile-config.js +13 -0
  126. package/core/gather/base-artifacts.js +7 -1
  127. package/core/gather/driver/storage.js +3 -2
  128. package/core/gather/gatherers/agentic/ard.d.ts +59 -4
  129. package/core/gather/gatherers/agentic/ard.js +218 -56
  130. package/core/gather/gatherers/full-page-screenshot.js +2 -2
  131. package/core/gather/gatherers/image-elements.d.ts +7 -0
  132. package/core/gather/gatherers/image-elements.js +75 -24
  133. package/core/gather/gatherers/inspector-issues.js +2 -0
  134. package/core/gather/gatherers/js-usage.js +2 -0
  135. package/core/gather/gatherers/scripts.d.ts +16 -3
  136. package/core/gather/gatherers/scripts.js +157 -14
  137. package/core/gather/gatherers/stylesheets.js +2 -0
  138. package/core/gather/gatherers/trace-elements.js +2 -1
  139. package/core/gather/gatherers/trace.d.ts +6 -0
  140. package/core/gather/gatherers/trace.js +56 -16
  141. package/core/index.d.ts +2 -0
  142. package/core/index.js +2 -0
  143. package/core/lib/arbitrary-equality-map.d.ts +14 -3
  144. package/core/lib/arbitrary-equality-map.js +113 -6
  145. package/core/lib/baseline/web-features-data.json +32 -11
  146. package/core/lib/baseline/web-features-metadata.json +1 -1
  147. package/core/lib/bf-cache-strings.js +237 -254
  148. package/core/lib/cdt/Common.d.ts +1 -1
  149. package/core/lib/cdt/Common.js +2 -2
  150. package/core/lib/cdt/Platform.d.ts +7 -7
  151. package/core/lib/cdt/Platform.js +11 -8
  152. package/core/lib/cdt/SDK.d.ts +5 -1
  153. package/core/lib/cdt/SDK.js +4 -2
  154. package/core/lib/cdt/generated/ParsedURL.d.ts +0 -1
  155. package/core/lib/cdt/generated/ParsedURL.js +3 -9
  156. package/core/lib/cdt/generated/SourceMap.d.ts +24 -25
  157. package/core/lib/cdt/generated/SourceMap.js +7 -15
  158. package/core/lib/deprecations-strings.d.ts +93 -88
  159. package/core/lib/deprecations-strings.js +20 -14
  160. package/core/lib/i18n/i18n.d.ts +2 -1
  161. package/core/lib/i18n/i18n.js +25 -13
  162. package/core/lib/legacy-javascript/legacy-javascript.d.ts +3 -2
  163. package/core/lib/legacy-javascript/legacy-javascript.js +235 -111
  164. package/core/lib/legacy-javascript/polyfill-graph-data.json +94 -89
  165. package/core/lib/legacy-javascript/polyfill-module-data.json +48 -7
  166. package/core/lib/minification-estimator.js +10 -10
  167. package/core/lib/network-request.d.ts +2 -0
  168. package/core/lib/network-request.js +21 -0
  169. package/core/lib/page-functions.js +2 -5
  170. package/core/lib/sentry.d.ts +1 -0
  171. package/core/lib/sentry.js +3 -0
  172. package/core/lib/trace-engine.d.ts +1 -0
  173. package/core/lib/trace-engine.js +2 -0
  174. package/core/runner.js +9 -3
  175. package/dist/report/bundle.esm.js +10 -10
  176. package/dist/report/flow.js +13 -13
  177. package/dist/report/standalone.js +5 -5
  178. package/flow-report/src/common.tsx +5 -2
  179. package/flow-report/src/i18n/i18n.d.ts +2 -0
  180. package/flow-report/src/summary/summary.tsx +9 -1
  181. package/flow-report/src/util.d.ts +1 -1
  182. package/package.json +62 -98
  183. package/readme.md +13 -18
  184. package/report/generator/file-namer.d.ts +1 -1
  185. package/report/generator/file-namer.js +5 -4
  186. package/report/generator/flow-report-assets.js +1 -3
  187. package/report/generator/report-assets.js +1 -2
  188. package/report/renderer/category-renderer.js +2 -2
  189. package/report/renderer/details-renderer.js +3 -2
  190. package/report/renderer/dom.d.ts +8 -2
  191. package/report/renderer/dom.js +29 -1
  192. package/report/renderer/element-screenshot-renderer.js +3 -0
  193. package/report/renderer/performance-category-renderer.js +3 -1
  194. package/report/renderer/report-renderer.js +4 -0
  195. package/report/renderer/report-utils.d.ts +1 -0
  196. package/report/renderer/report-utils.js +2 -0
  197. package/report/renderer/text-encoding.js +2 -2
  198. package/report/types/augment-dom.d.ts +4 -0
  199. package/shared/esm-utils.d.ts +0 -8
  200. package/shared/esm-utils.js +0 -18
  201. package/shared/localization/format.js +5 -3
  202. package/shared/localization/locales/ar-XB.json +157 -142
  203. package/shared/localization/locales/ar.json +157 -142
  204. package/shared/localization/locales/bg.json +154 -139
  205. package/shared/localization/locales/ca.json +157 -142
  206. package/shared/localization/locales/cs.json +148 -133
  207. package/shared/localization/locales/da.json +153 -138
  208. package/shared/localization/locales/de.json +152 -137
  209. package/shared/localization/locales/el.json +153 -138
  210. package/shared/localization/locales/en-GB.json +160 -145
  211. package/shared/localization/locales/en-US.json +239 -218
  212. package/shared/localization/locales/en-XL.json +239 -218
  213. package/shared/localization/locales/es-419.json +150 -135
  214. package/shared/localization/locales/es.json +149 -134
  215. package/shared/localization/locales/fi.json +151 -136
  216. package/shared/localization/locales/fil.json +154 -139
  217. package/shared/localization/locales/fr.json +150 -135
  218. package/shared/localization/locales/he.json +160 -145
  219. package/shared/localization/locales/hi.json +156 -141
  220. package/shared/localization/locales/hr.json +154 -139
  221. package/shared/localization/locales/hu.json +111 -96
  222. package/shared/localization/locales/id.json +153 -138
  223. package/shared/localization/locales/it.json +153 -138
  224. package/shared/localization/locales/ja.json +150 -135
  225. package/shared/localization/locales/ko.json +42 -27
  226. package/shared/localization/locales/lt.json +152 -137
  227. package/shared/localization/locales/lv.json +93 -78
  228. package/shared/localization/locales/nl.json +149 -134
  229. package/shared/localization/locales/no.json +152 -137
  230. package/shared/localization/locales/pl.json +153 -138
  231. package/shared/localization/locales/pt-PT.json +152 -137
  232. package/shared/localization/locales/pt.json +157 -142
  233. package/shared/localization/locales/ro.json +149 -134
  234. package/shared/localization/locales/ru.json +76 -61
  235. package/shared/localization/locales/sk.json +153 -138
  236. package/shared/localization/locales/sl.json +149 -134
  237. package/shared/localization/locales/sr-Latn.json +151 -136
  238. package/shared/localization/locales/sr.json +151 -136
  239. package/shared/localization/locales/sv.json +152 -137
  240. package/shared/localization/locales/ta.json +156 -141
  241. package/shared/localization/locales/te.json +157 -142
  242. package/shared/localization/locales/th.json +111 -96
  243. package/shared/localization/locales/tr.json +153 -138
  244. package/shared/localization/locales/uk.json +149 -134
  245. package/shared/localization/locales/vi.json +162 -147
  246. package/shared/localization/locales/zh-HK.json +150 -135
  247. package/shared/localization/locales/zh-TW.json +154 -139
  248. package/shared/localization/locales/zh.json +152 -137
  249. package/shared/localization/swap-locale.js +10 -5
  250. package/shared/root.js +1 -3
  251. package/third-party/ard/README.md +19 -10
  252. package/third-party/ard/ard-test.js +189 -266
  253. package/third-party/ard/ard.d.ts +18 -1
  254. package/third-party/ard/ard.js +282 -45
  255. package/third-party/ard/schema-validator.d.ts +14 -5
  256. package/third-party/ard/schema-validator.js +921 -1177
  257. package/third-party/ard/spec/schemas/ard-entry.schema.json +176 -0
  258. package/tsconfig.json +0 -2
  259. package/types/artifacts.d.ts +43 -7
  260. package/types/config.d.ts +6 -1
  261. package/types/externs.d.ts +4 -0
  262. package/types/internal/test.d.ts +1 -0
  263. package/build-tracker.config.js +0 -16
  264. package/core/lib/cdt/package.json +0 -4
  265. package/eslint-local-rules.d.cts +0 -9
  266. package/eslint.config.mjs +0 -242
  267. package/third-party/ard/spec/schemas/ai-catalog.schema.json +0 -292
  268. package/third-party/esbuild-plugins-polyfills/LICENSE +0 -3
  269. package/third-party/esbuild-plugins-polyfills/README.md +0 -7
  270. package/third-party/esbuild-plugins-polyfills/esbuild-polyfills.d.ts +0 -9
  271. package/third-party/esbuild-plugins-polyfills/esbuild-polyfills.js +0 -129
  272. package/types/internal/lookup-closest-locale.d.ts +0 -13
@@ -0,0 +1,176 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/ards-project/ard-spec/main/spec/schemas/ard-entry.schema.json",
4
+ "title": "ArdEntry",
5
+ "description": "JSON Schema for an ARD entry — the description of a single agentic resource in a form that can be found by search. An ARD entry is defined by the ARD specification. It adopts the core descriptive terms of the default namespace and additionally requires the terms discovery depends on. Every ARD entry is a well-formed catalog entry; not every catalog entry is an ARD entry.",
6
+ "$ref": "#/$defs/ArdEntry",
7
+ "$defs": {
8
+ "EntryFields": {
9
+ "type": "object",
10
+ "description": "The terms an ARD entry may carry. This definition imposes no required terms; ArdEntry layers its own requirements on top.",
11
+ "properties": {
12
+ "@context": {
13
+ "description": "Optional JSON-LD context. Absent, the entry's unprefixed terms resolve to the default namespace. Present, it MAY declare additional namespaces whose prefixed terms describe the resource and become available as filter dimensions.",
14
+ "oneOf": [
15
+ { "type": "string", "format": "uri" },
16
+ { "type": "object" },
17
+ { "type": "array" }
18
+ ]
19
+ },
20
+ "@id": {
21
+ "type": "string",
22
+ "description": "Optional JSON-LD node identifier. When present alongside `identifier`, both MUST denote the same resource."
23
+ },
24
+ "identifier": {
25
+ "type": "string",
26
+ "pattern": "^urn:air:[a-zA-Z0-9.-]+(:[a-zA-Z0-9._-]+)+$",
27
+ "description": "Globally unique discovery handle. Domain-anchored URN: urn:air:<publisher>:<namespace>:<agent-name>. The <publisher> segment is the authority anchor used for publisher-authority binding."
28
+ },
29
+ "displayName": {
30
+ "type": "string",
31
+ "description": "Human-readable name."
32
+ },
33
+ "type": {
34
+ "type": "string",
35
+ "description": "Artifact type as an IANA Media Type (e.g. application/mcp-server-card+json). Names what the artifact is without constraining its internal schema."
36
+ },
37
+ "url": {
38
+ "type": "string",
39
+ "format": "uri",
40
+ "description": "Reference to the full artifact document. Mutually exclusive with `data`."
41
+ },
42
+ "data": {
43
+ "type": "object",
44
+ "description": "The complete artifact document, inline. Mutually exclusive with `url`."
45
+ },
46
+ "representativeQueries": {
47
+ "type": "array",
48
+ "items": { "type": "string" },
49
+ "description": "Sample natural-language queries this resource can serve — the signal a registry builds its semantic index from. RECOMMENDED on every entry; SHOULD contain 2-5 examples. Neither presence nor count is enforced here so that emitted entries validate; the conformance tester flags absence, or a count outside 2-5, as a warning (§D.2)."
50
+ },
51
+ "capabilities": {
52
+ "type": "array",
53
+ "items": { "type": "string" },
54
+ "description": "Short skill or tool tokens (e.g. [\"WeatherTool\"]) enabling structured filtering without fetching the full artifact."
55
+ },
56
+ "description": {
57
+ "type": "string",
58
+ "description": "Short natural-language description. Contributes to the semantic index."
59
+ },
60
+ "tags": {
61
+ "type": "array",
62
+ "items": { "type": "string" },
63
+ "description": "Keywords for filtering and faceting."
64
+ },
65
+ "version": {
66
+ "type": "string",
67
+ "description": "Version of the artifact."
68
+ },
69
+ "updatedAt": {
70
+ "type": "string",
71
+ "format": "date-time",
72
+ "description": "ISO 8601 timestamp of the last modification."
73
+ },
74
+ "metadata": {
75
+ "type": "object",
76
+ "description": "Custom key-value pairs, available as metadata.* filter keys.",
77
+ "additionalProperties": {
78
+ "type": ["string", "number", "boolean", "null"]
79
+ }
80
+ },
81
+ "TrustManifest": {
82
+ "$ref": "#/$defs/TrustManifest"
83
+ }
84
+ },
85
+ "additionalProperties": true,
86
+ "$comment": "additionalProperties is intentionally true. Terms drawn from namespaces declared in the entry's @context (e.g. okf:taxonomy) are valid and become filter dimensions. Constraining this to false would defeat the namespace extension mechanism."
87
+ },
88
+ "ArdEntry": {
89
+ "description": "A complete ARD entry, as published. Requires the discovery-critical terms and exactly one of url/data.",
90
+ "allOf": [{ "$ref": "#/$defs/EntryFields" }],
91
+ "required": ["identifier", "displayName", "type"],
92
+ "oneOf": [
93
+ {
94
+ "required": ["url"],
95
+ "not": { "required": ["data"] }
96
+ },
97
+ {
98
+ "required": ["data"],
99
+ "not": { "required": ["url"] }
100
+ }
101
+ ]
102
+ },
103
+ "ArdManifest": {
104
+ "type": "object",
105
+ "description": "The document published at /.well-known/ard.json (or any entry source). ARD requires only an `entries` array of ARD entries; any other top-level members are transport-defined and ignored by ARD, so additionalProperties is open.",
106
+ "required": ["entries"],
107
+ "properties": {
108
+ "entries": {
109
+ "type": "array",
110
+ "items": { "$ref": "#/$defs/ArdEntry" }
111
+ }
112
+ },
113
+ "additionalProperties": true
114
+ },
115
+ "TrustManifest": {
116
+ "type": "object",
117
+ "description": "Identity, compliance, and provenance envelope. ARD requires only `identity` (for publisher-authority binding) and does not constrain the internal schema; validation is intentionally permissive (additionalProperties: true) so a trust manifest defined by any framework is structurally valid, including members ARD does not enumerate such as trustSchema. This does not mean consumers ignore it: a federated registry is expected to inspect the manifest and verify it per the framework named in trustSchema (attestations, provenance, signature). Signing and verification procedures are defined by that framework, not by ARD.",
118
+ "required": ["identity"],
119
+ "properties": {
120
+ "identity": {
121
+ "type": "string",
122
+ "description": "Globally unique cryptographic workload identifier (SPIFFE ID, DID, or HTTPS FQDN URI). Its trust domain MUST align with the <publisher> segment of the entry's identifier."
123
+ },
124
+ "identityType": {
125
+ "type": "string",
126
+ "description": "Hint for the cryptographic format of the identity (e.g. spiffe, did, https)."
127
+ },
128
+ "trustSchema": {
129
+ "type": "object",
130
+ "description": "The trust framework the manifest conforms to, and the source of its verification procedure.",
131
+ "properties": {
132
+ "identifier": { "type": "string" },
133
+ "version": { "type": "string" },
134
+ "governanceUri": { "type": "string", "format": "uri" },
135
+ "verificationMethods": { "type": "array", "items": { "type": "string" } }
136
+ },
137
+ "additionalProperties": true
138
+ },
139
+ "attestations": {
140
+ "type": "array",
141
+ "description": "Verifiable claims (e.g., organizational compliance audits, artifact security scans, build provenance, transparency-log receipts, or runtime evaluations).",
142
+ "items": {
143
+ "type": "object",
144
+ "required": ["type", "uri"],
145
+ "properties": {
146
+ "type": { "type": "string" },
147
+ "uri": { "type": "string", "format": "uri" },
148
+ "mediaType": { "type": "string" },
149
+ "digest": { "type": "string" }
150
+ },
151
+ "additionalProperties": true
152
+ }
153
+ },
154
+ "provenance": {
155
+ "type": "array",
156
+ "description": "Lineage trail of the artifact.",
157
+ "items": {
158
+ "type": "object",
159
+ "required": ["relation", "sourceId"],
160
+ "properties": {
161
+ "relation": { "type": "string" },
162
+ "sourceId": { "type": "string" },
163
+ "sourceDigest": { "type": "string" }
164
+ },
165
+ "additionalProperties": true
166
+ }
167
+ },
168
+ "signature": {
169
+ "type": "string",
170
+ "description": "Detached signature over the trust manifest content, per the framework named in trustSchema."
171
+ }
172
+ },
173
+ "additionalProperties": true
174
+ }
175
+ }
176
+ }
package/tsconfig.json CHANGED
@@ -18,9 +18,7 @@
18
18
  "build/**/*.js",
19
19
  "types.js",
20
20
  "./types/**/*.d.ts",
21
- "eslint-local-rules.cjs",
22
21
  "third-party/axe/valid-langs.js",
23
- "third-party/esbuild-plugins-polyfills/esbuild-polyfills.js",
24
22
  "third-party/ard/**/*.js",
25
23
 
26
24
  "core/test/results/sample_v2.json",
@@ -12,7 +12,7 @@ import { parseManifest } from '../core/lib/manifest-parser.js';
12
12
  import { LighthouseError } from '../core/lib/lh-error.js';
13
13
  import { NetworkRequest as _NetworkRequest } from '../core/lib/network-request.js';
14
14
  import speedline from 'speedline-core';
15
- import * as CDTSourceMap from '../core/lib/cdt/generated/SourceMap.js';
15
+ import CDTSourceMap from '../core/lib/cdt/generated/SourceMap.js';
16
16
  import { ArbitraryEqualityMap } from '../core/lib/arbitrary-equality-map.js';
17
17
  import type { TaskNode as _TaskNode } from '../core/lib/tracehouse/main-thread-tasks.js';
18
18
  import AuditDetails from './lhr/audit-details.js'
@@ -124,9 +124,9 @@ export interface GathererArtifacts extends PublicGathererArtifacts {
124
124
  InspectorIssues: Artifacts.InspectorIssues;
125
125
  /** The status and tools registered via WebMCP. */
126
126
  WebMCP: {isSupported: boolean, tools: Artifacts.WebMCPTool[]};
127
- /**
128
- * The WebMCP schema validation issues.
129
- * TODO: fold this into the WebMCP artifact.
127
+ /**
128
+ * The WebMCP schema validation issues.
129
+ * TODO: fold this into the WebMCP artifact.
130
130
  */
131
131
  WebMcpSchemaIssues: Artifacts.WebMcpSchemaIssue[];
132
132
  /** JS coverage information for code used during audit. Keyed by script id. */
@@ -138,18 +138,38 @@ export interface GathererArtifacts extends PublicGathererArtifacts {
138
138
  RobotsTxt: { status: number | null, content: string | null, errorMessage?: string };
139
139
  /** Information on fetching and the content of the /llm.txt file. */
140
140
  LlmsTxt: { status: number | null, content: string | null, errorMessage?: string };
141
- /** Information on fetching and the content of the /ai-catalog.json manifest file. */
141
+ /** Information on discovering, fetching, and the content of the Agentic Resource Discovery (ARD) manifest. */
142
142
  AgentResourceDiscovery: {
143
143
  status: number | null;
144
144
  content: string | null;
145
145
  headers: Record<string, string> | null;
146
- catalogUrl: string | null;
146
+ /** The loaded manifest URL, or if none loaded, the first failed advertised URL (or `/.well-known/ard.json`). */
147
+ catalogUrl: string;
148
+ /** The discovery mechanism `catalogUrl` came from. `legacy*` sources are ARD's predecessor (`ai-catalog`) names. */
149
+ discoverySource: Artifacts.ArdDiscoverySource;
147
150
  discoverySignals: {
148
151
  robotsTxtAgentmap: string | null;
152
+ /** `<link rel="ard">` */
149
153
  htmlLink: string | null;
154
+ /** `Link: <...>; rel="ard"` */
150
155
  httpHeaderLink: string | null;
156
+ /** `<link rel="ai-catalog">` */
157
+ legacyHtmlLink: string | null;
158
+ /** `Link: <...>; rel="ai-catalog"` */
159
+ legacyHttpHeaderLink: string | null;
160
+ /** `/.well-known/ard.json` */
151
161
  wellKnown: string;
162
+ /** `/.well-known/ai-catalog.json` */
163
+ legacyWellKnown: string;
152
164
  };
165
+ /** Advertised locations (not the probed well-known paths) that were tried and failed to load, in discovery order. */
166
+ failedSources: Array<{
167
+ source: Artifacts.ArdDiscoverySource;
168
+ url: string;
169
+ status: number | null;
170
+ /** Set when the fetch itself failed (e.g. a timeout) rather than returning an HTTP error. */
171
+ errorMessage?: string;
172
+ }>;
153
173
  errorMessage?: string;
154
174
  };
155
175
  /** Source maps of scripts executed in the page. */
@@ -165,6 +185,10 @@ export interface GathererArtifacts extends PublicGathererArtifacts {
165
185
  }
166
186
 
167
187
  declare namespace Artifacts {
188
+ /** Agentic Resource Discovery (ARD) manifest locations. `legacy*` sources are ARD's predecessor (`ai-catalog`) names. */
189
+ type ArdDiscoverySource = 'robotsTxtAgentmap' | 'htmlLink' | 'httpHeaderLink' | 'wellKnown' |
190
+ 'legacyHtmlLink' | 'legacyHttpHeaderLink' | 'legacyWellKnown';
191
+
168
192
  interface WebMcpSchemaIssue {
169
193
  errorType: string;
170
194
  violatingNodeId?: number;
@@ -543,7 +567,12 @@ declare namespace Artifacts {
543
567
 
544
568
  type LanternMetric = Lantern.Metrics.MetricResult<Artifacts.NetworkRequest>;
545
569
 
546
- type Speedline = speedline.Output<'speedIndex'>;
570
+ type Speedline = Omit<speedline.Output<'speedIndex'>, 'frames'> & {
571
+ frames: Array<Pick<
572
+ speedline.Output<'speedIndex'>['frames'][number],
573
+ 'getImage' | 'getTimeStamp' | 'isProgressInterpolated'
574
+ >>;
575
+ };
547
576
 
548
577
  interface TraceTimes {
549
578
  timeOrigin: number;
@@ -902,6 +931,13 @@ export interface TraceEvent {
902
931
  protocol?: string;
903
932
  finishTime?: number;
904
933
  headers?: Array<{ name: string, value: string }>;
934
+ scriptId?: number;
935
+ sourceText?: string;
936
+ isolate?: number | string;
937
+ executionContextId?: number;
938
+ sourceUrl?: string;
939
+ splitIndex?: number;
940
+ splitCount?: number;
905
941
  };
906
942
  frame?: string;
907
943
  name?: string;
package/types/config.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import {Audit} from '../core/audits/audit.js';
9
- import {SharedFlagsSettings, ConfigSettings} from './lhr/settings.js';
9
+ import {SharedFlagsSettings, ConfigSettings, Locale} from './lhr/settings.js';
10
10
  import Gatherer from './gatherer.js';
11
11
  import {IcuMessage} from './lhr/i18n.js';
12
12
  import Result from './lhr/lhr.js';
@@ -26,6 +26,7 @@ interface Config {
26
26
  categories?: Record<string, Config.CategoryJson> | null;
27
27
  groups?: Record<string, Config.GroupJson> | null;
28
28
  plugins?: Array<string>;
29
+ locales?: Partial<Record<Locale, Record<string, {message: string}>>> | null;
29
30
  }
30
31
 
31
32
  declare namespace Config {
@@ -43,6 +44,7 @@ declare namespace Config {
43
44
  interface ArtifactJson {
44
45
  id: string;
45
46
  gatherer: GathererJson;
47
+ alwaysGather?: boolean;
46
48
  }
47
49
 
48
50
  type GathererJson = {
@@ -94,6 +96,7 @@ declare namespace Config {
94
96
  dependencies?: TDependencies extends Gatherer.DefaultDependenciesKey ?
95
97
  undefined :
96
98
  Record<Exclude<TDependencies, Gatherer.DefaultDependenciesKey>, {id: string}>;
99
+ alwaysGather?: boolean;
97
100
  }
98
101
 
99
102
  type ArtifactDefnExpander<TDependencies extends Gatherer.DependencyKey> =
@@ -136,6 +139,8 @@ declare namespace Config {
136
139
  category: Config.Category;
137
140
  /** Optionally provide more groups in addition to those specified by the base config. */
138
141
  groups?: Record<string, Config.GroupJson>;
142
+ /** Optionally provide locale messages for translating plugin strings. */
143
+ locales?: Partial<Record<Locale, Record<string, {message: string}>>>;
139
144
  }
140
145
 
141
146
  type Merge = {
@@ -57,6 +57,10 @@ export interface CliFlags extends Flags {
57
57
  precomputedLanternDataPath?: string;
58
58
  /** Path to the file where precomputed lantern data should be written to. */
59
59
  lanternDataOutputPath?: string;
60
+ /** Path to a file containing newline-delimited URLs to audit. */
61
+ urlFile?: string[];
62
+ /** Flag to stop auditing remaining URLs immediately if a run fails. */
63
+ failFast?: boolean;
60
64
 
61
65
  // The following are given defaults in cli-flags, so are not optional like in Flags or SharedFlagsSettings.
62
66
  output: OutputMode[];
@@ -29,6 +29,7 @@ declare module 'expect' {
29
29
  */
30
30
  // tslint:disable-next-line: no-unnecessary-generics
31
31
  toMatchInlineSnapshot<U extends { [P in keyof T]: any }>(propertyMatchers: Partial<U>, snapshot?: string): R;
32
+ toMatchInlineSnapshot(snapshot?: string): R;
32
33
 
33
34
  // The following are custom matchers defined in expect-setup.js
34
35
 
@@ -1,16 +0,0 @@
1
- // https://buildtracker.dev/docs/installation/#upload-your-builds
2
-
3
-
4
- module.exports = {
5
- applicationUrl: 'https://lh-build-tracker.herokuapp.com',
6
- artifacts: [
7
- 'dist/lightrider/lighthouse-lr-bundle.js',
8
- 'dist/extension/scripts/lighthouse-ext-bundle.js',
9
- 'dist/devtools/lighthouse-dt-bundle.js',
10
- 'dist/gh-pages/viewer/src/bundled.js',
11
- 'dist/gh-pages/treemap/src/bundled.js',
12
- 'dist/lightrider/report-generator-bundle.js',
13
- 'dist/dt-report-resources/report.js',
14
- 'dist/dt-report-resources/report-generator.js',
15
- ],
16
- };
@@ -1,4 +0,0 @@
1
- {
2
- "type": "commonjs",
3
- "//": "Temporary file until made esm"
4
- }
@@ -1,9 +0,0 @@
1
- declare namespace _exports {
2
- export { RuleModule };
3
- }
4
- declare const _exports: {
5
- 'require-file-extension': import("eslint").Rule.RuleModule;
6
- };
7
- export = _exports;
8
- type RuleModule = import("eslint").Rule.RuleModule;
9
- //# sourceMappingURL=eslint-local-rules.d.cts.map
package/eslint.config.mjs DELETED
@@ -1,242 +0,0 @@
1
- import path from 'node:path';
2
- import {fileURLToPath} from 'node:url';
3
-
4
- import localRules from 'eslint-plugin-local-rules';
5
- import _import from 'eslint-plugin-import';
6
- import {fixupPluginRules} from '@eslint/compat';
7
- import globals from 'globals';
8
- import tsParser from '@typescript-eslint/parser';
9
- import js from '@eslint/js';
10
- import {FlatCompat} from '@eslint/eslintrc';
11
-
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = path.dirname(__filename);
14
- const compat = new FlatCompat({
15
- baseDirectory: __dirname,
16
- recommendedConfig: js.configs.recommended,
17
- allConfig: js.configs.all,
18
- });
19
-
20
- // See https://eslint.org/docs/latest/use/configure/configuration-files
21
- export default [{
22
- files: [
23
- '**/*.cjs',
24
- '**/*.js',
25
- '**/*.mjs',
26
- '**/*.ts',
27
- '**/*.tsx',
28
- ],
29
- }, {
30
- // Global ignores.
31
- ignores: [
32
- '.cz-config.js',
33
- '**/.tmp',
34
- '**/*.d.cts', // ignore d.ts files until we can properly lint them
35
- '**/*.d.ts',
36
- '**/dist',
37
- '**/fixtures/**',
38
- '**/node_modules/**',
39
- '**/source-maps/**',
40
- '**/third_party/**',
41
- '**/third-party/**',
42
- 'build/test/page-functions-test-case*out*.js',
43
- 'core/scripts/legacy-javascript/variants/**',
44
- 'coverage/**',
45
- ],
46
- }, ...compat.extends('eslint:recommended', 'google'), {
47
- plugins: {
48
- 'local-rules': localRules,
49
- 'import': fixupPluginRules(_import),
50
- },
51
-
52
- languageOptions: {
53
- globals: {
54
- ...globals.node,
55
- },
56
-
57
- parser: tsParser,
58
- ecmaVersion: 2020,
59
- sourceType: 'module',
60
-
61
- parserOptions: {
62
- ecmaFeatures: {
63
- globalReturn: true,
64
- jsx: false,
65
- },
66
- },
67
- },
68
-
69
- rules: {
70
- 'import/order': [2, {
71
- 'groups': ['builtin', 'external', ['sibling', 'parent'], 'index', 'object', 'type'],
72
- 'newlines-between': 'always',
73
- }],
74
-
75
- 'import/group-exports': 2,
76
- 'import/exports-last': 2,
77
- 'eqeqeq': 2,
78
- 'no-console': 2,
79
-
80
- 'indent': [2, 2, {
81
- SwitchCase: 1,
82
- VariableDeclarator: 2,
83
-
84
- CallExpression: {
85
- arguments: 'off',
86
- },
87
-
88
- MemberExpression: 'off',
89
-
90
- FunctionExpression: {
91
- body: 1,
92
- parameters: 2,
93
- },
94
-
95
- ignoredNodes: [
96
- 'ConditionalExpression > :matches(.consequent, .alternate)',
97
- 'VariableDeclarator > ArrowFunctionExpression > :expression.body',
98
- 'CallExpression > ArrowFunctionExpression > :expression.body',
99
- ],
100
- }],
101
-
102
- 'no-floating-decimal': 2,
103
-
104
- 'max-len': [2, 100, {
105
- ignorePattern: 'readJson\\(|^import ',
106
- ignoreComments: true,
107
- ignoreUrls: true,
108
- tabWidth: 2,
109
- }],
110
-
111
- 'no-empty': [2, {
112
- allowEmptyCatch: true,
113
- }],
114
-
115
- 'no-implicit-coercion': [2, {
116
- boolean: false,
117
- number: true,
118
- string: true,
119
- }],
120
-
121
- 'no-unused-expressions': [2, {
122
- allowShortCircuit: true,
123
- allowTernary: false,
124
- }],
125
-
126
- 'no-unused-vars': [2, {
127
- vars: 'all',
128
- args: 'after-used',
129
- caughtErrors: 'none', // TODO: remove for new "all" default.
130
- argsIgnorePattern: '(^reject$|^_+$)',
131
- varsIgnorePattern: '(^_$|^LH$|^Lantern$|^TraceEngine$|^Protocol$)',
132
- }],
133
-
134
- 'no-cond-assign': 2,
135
- 'space-infix-ops': 2,
136
- 'strict': [2, 'global'],
137
- 'prefer-const': 2,
138
- 'curly': [2, 'multi-line'],
139
-
140
- 'comma-dangle': [2, {
141
- arrays: 'always-multiline',
142
- objects: 'always-multiline',
143
- imports: 'always-multiline',
144
- exports: 'always-multiline',
145
- functions: 'never',
146
- }],
147
-
148
- 'operator-linebreak': ['error', 'after', {
149
- overrides: {
150
- '?': 'ignore',
151
- ':': 'ignore',
152
- },
153
- }],
154
-
155
- 'local-rules/require-file-extension': 2,
156
- 'require-jsdoc': 0,
157
- 'valid-jsdoc': 0,
158
- 'arrow-parens': 0,
159
- },
160
- }, {
161
- files: ['cli/test/smokehouse/test-definitions/**'],
162
-
163
- rules: {
164
- 'max-len': 0,
165
- },
166
- }, {
167
- files: [
168
- '**/build/**',
169
- '**/scripts/**',
170
- '**/test/**',
171
- ],
172
-
173
- rules: {
174
- 'no-console': 0,
175
- },
176
- }, {
177
- files: [
178
- 'docs/recipes/auth/**',
179
- ],
180
-
181
- rules: {
182
- 'new-cap': 0,
183
- 'no-console': 0,
184
- 'no-unused-vars': 0,
185
- },
186
- }, {
187
- files: [
188
- '**/test/**',
189
- 'docs/recipes/**',
190
- ],
191
-
192
- languageOptions: {
193
- globals: {
194
- ...globals.jest,
195
- ...globals.mocha,
196
- },
197
- },
198
- }, {
199
- files: [
200
- 'clients/**',
201
- 'core/gather/gatherers/**',
202
- 'docs/recipes/auth/**',
203
- 'flow-report/**',
204
- 'report/**',
205
- 'treemap/**',
206
- 'viewer/**',
207
- ],
208
- ignores: [
209
- 'report/generator/**',
210
- 'report/test/generator/**',
211
- ],
212
-
213
- languageOptions: {
214
- globals: {
215
- ...globals.browser,
216
- },
217
- },
218
- }, {
219
- files: [
220
- 'clients/**',
221
- ],
222
-
223
- languageOptions: {
224
- globals: {
225
- chrome: true,
226
- __lighthouse: true,
227
- },
228
- },
229
- }, {
230
- files: ['flow-report/**'],
231
-
232
- languageOptions: {
233
- globals: {
234
- ...globals.browser,
235
- ...globals.node,
236
- },
237
- },
238
-
239
- rules: {
240
- 'no-undef': 'off',
241
- },
242
- }];