opera-devtools-mcp 0.2.3 → 0.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.
Files changed (330) hide show
  1. package/README.md +104 -7
  2. package/build/src/McpContext.js +365 -365
  3. package/build/src/McpPage.js +475 -48
  4. package/build/src/McpResponse.js +462 -288
  5. package/build/src/SlimMcpResponse.js +1 -1
  6. package/build/src/TextSnapshot.js +101 -22
  7. package/build/src/ToolHandler.js +142 -20
  8. package/build/src/bin/check-latest-version.js +27 -1
  9. package/build/src/bin/chrome-devtools-cli-options.js +573 -10
  10. package/build/src/bin/chrome-devtools-mcp-cli-options.js +119 -32
  11. package/build/src/bin/chrome-devtools-mcp-main.js +50 -7
  12. package/build/src/bin/chrome-devtools-mcp.js +7 -4
  13. package/build/src/bin/chrome-devtools.js +57 -14
  14. package/build/src/bin/opera-devtools-cli-options.js +3 -829
  15. package/build/src/bin/opera-devtools-mcp-cli-options.js +3 -348
  16. package/build/src/bin/opera-devtools-mcp-main.js +3 -37
  17. package/build/src/bin/opera-devtools-mcp.js +4 -19
  18. package/build/src/bin/opera-devtools.js +4 -185
  19. package/build/src/browser.js +45 -5
  20. package/build/src/{PageCollector.js → collectors/PageCollector.js} +64 -133
  21. package/build/src/collectors/ServiceWorkerCollector.js +171 -0
  22. package/build/src/daemon/client.js +75 -17
  23. package/build/src/daemon/daemon.js +92 -30
  24. package/build/src/daemon/utils.js +24 -8
  25. package/build/src/{DevtoolsUtils.js → devtools/DevtoolsUtils.js} +94 -88
  26. package/build/src/devtools/McpHostBindingAdapter.js +165 -0
  27. package/build/src/{issue-descriptions.js → devtools/issueDescriptions.js} +8 -6
  28. package/build/src/formatters/ConsoleFormatter.js +44 -11
  29. package/build/src/formatters/HeapSnapshotFormatter.js +140 -9
  30. package/build/src/formatters/IssueFormatter.js +7 -7
  31. package/build/src/formatters/NetworkFormatter.js +10 -8
  32. package/build/src/index.js +101 -232
  33. package/build/src/opera/branding.js +34 -0
  34. package/build/src/opera/browserFlags.js +85 -0
  35. package/build/src/opera/browserLaunch.js +52 -0
  36. package/build/src/opera/policy.js +50 -0
  37. package/build/src/opera/serviceWorkerRetry.js +37 -0
  38. package/build/src/opera/toolHandlerHooks.js +39 -0
  39. package/build/src/{tools → opera/tools}/opera.js +9 -21
  40. package/build/src/processors/HeapSnapshotManager.js +258 -0
  41. package/build/src/{trace-processing/parse.js → processors/PerformanceTrace.js} +9 -9
  42. package/build/src/telemetry/ClearcutLogger.js +12 -119
  43. package/build/src/telemetry/WatchdogClient.js +5 -5
  44. package/build/src/telemetry/errors.js +1 -1
  45. package/build/src/telemetry/flagUtils.js +6 -6
  46. package/build/src/telemetry/{toolMetricsUtils.js → metricsRegistry.js} +4 -11
  47. package/build/src/telemetry/persistence.js +3 -3
  48. package/build/src/telemetry/transformation.js +184 -0
  49. package/build/src/telemetry/watchdog/ClearcutSender.js +11 -11
  50. package/build/src/telemetry/watchdog/main.js +6 -6
  51. package/build/src/third_party/THIRD_PARTY_NOTICES +3493 -0
  52. package/build/src/third_party/bundled-packages.json +9 -0
  53. package/build/src/third_party/devtools-formatter-worker.js +15340 -7
  54. package/build/src/third_party/devtools-heap-snapshot-worker.js +10337 -7
  55. package/build/src/third_party/index.js +179960 -26
  56. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOrigin.md +2 -2
  57. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +3 -3
  58. package/build/src/third_party/issue-descriptions/CoepCorpNotSameSite.md +2 -2
  59. package/build/src/third_party/issue-descriptions/CoepFrameResourceNeedsCoepHeader.md +1 -1
  60. package/build/src/third_party/issue-descriptions/CompatibilityModeQuirks.md +1 -1
  61. package/build/src/third_party/issue-descriptions/CookieAttributeValueExceedsMaxSize.md +2 -2
  62. package/build/src/third_party/issue-descriptions/LowTextContrast.md +1 -1
  63. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorRead.md +1 -1
  64. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorSet.md +1 -1
  65. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnRead.md +1 -1
  66. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnSet.md +1 -1
  67. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +3 -3
  68. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +3 -3
  69. package/build/src/third_party/issue-descriptions/bounceTrackingMitigations.md +1 -1
  70. package/build/src/third_party/issue-descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
  71. package/build/src/third_party/issue-descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
  72. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
  73. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidAllowlistItemType.md +2 -2
  74. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidHeader.md +2 -2
  75. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidUrlPattern.md +3 -3
  76. package/build/src/third_party/issue-descriptions/connectionAllowlistItemNotInnerList.md +2 -2
  77. package/build/src/third_party/issue-descriptions/connectionAllowlistMoreThanOneList.md +2 -2
  78. package/build/src/third_party/issue-descriptions/connectionAllowlistReportingEndpointNotToken.md +1 -1
  79. package/build/src/third_party/issue-descriptions/cookieCrossSiteRedirectDowngrade.md +3 -3
  80. package/build/src/third_party/issue-descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +1 -1
  81. package/build/src/third_party/issue-descriptions/cookieExcludePortMismatch.md +1 -1
  82. package/build/src/third_party/issue-descriptions/cookieExcludeSchemeMismatch.md +1 -1
  83. package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutSet.md +1 -1
  84. package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutRead.md +1 -1
  85. package/build/src/third_party/issue-descriptions/corsAllowCredentialsRequired.md +1 -1
  86. package/build/src/third_party/issue-descriptions/corsDisabledScheme.md +2 -2
  87. package/build/src/third_party/issue-descriptions/corsDisallowedByMode.md +2 -2
  88. package/build/src/third_party/issue-descriptions/corsHeaderDisallowedByPreflightResponse.md +1 -1
  89. package/build/src/third_party/issue-descriptions/corsInvalidHeaderValues.md +3 -3
  90. package/build/src/third_party/issue-descriptions/corsLocalNetworkAccessPermissionDenied.md +1 -1
  91. package/build/src/third_party/issue-descriptions/corsMethodDisallowedByPreflightResponse.md +1 -1
  92. package/build/src/third_party/issue-descriptions/corsNoCorsRedirectModeNotFollow.md +1 -1
  93. package/build/src/third_party/issue-descriptions/corsOriginMismatch.md +3 -3
  94. package/build/src/third_party/issue-descriptions/corsPreflightResponseInvalid.md +2 -2
  95. package/build/src/third_party/issue-descriptions/corsRedirectContainsCredentials.md +3 -3
  96. package/build/src/third_party/issue-descriptions/corsWildcardOriginNotAllowed.md +4 -3
  97. package/build/src/third_party/issue-descriptions/cspEvalViolation.md +4 -4
  98. package/build/src/third_party/issue-descriptions/cspInlineViolation.md +2 -2
  99. package/build/src/third_party/issue-descriptions/cspTrustedTypesPolicyViolation.md +2 -2
  100. package/build/src/third_party/issue-descriptions/cspTrustedTypesSinkViolation.md +4 -4
  101. package/build/src/third_party/issue-descriptions/cspURLViolation.md +4 -4
  102. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsEmptyList.md +1 -0
  103. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsHttpNotFound.md +1 -0
  104. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsInvalidContentType.md +1 -0
  105. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsInvalidResponse.md +1 -0
  106. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsNoResponse.md +1 -0
  107. package/build/src/third_party/issue-descriptions/emailVerificationRequestDnsFetchFailed.md +1 -0
  108. package/build/src/third_party/issue-descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -0
  109. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownHttpNotFound.md +1 -0
  110. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidContentType.md +1 -0
  111. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidResponse.md +1 -0
  112. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownNoResponse.md +1 -0
  113. package/build/src/third_party/issue-descriptions/emailVerificationRequestInvalidEmail.md +1 -0
  114. package/build/src/third_party/issue-descriptions/emailVerificationRequestJwksHttpNotFound.md +1 -0
  115. package/build/src/third_party/issue-descriptions/emailVerificationRequestJwksInvalidResponse.md +1 -0
  116. package/build/src/third_party/issue-descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -0
  117. package/build/src/third_party/issue-descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -0
  118. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -0
  119. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -0
  120. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -0
  121. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -0
  122. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -0
  123. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenNoResponse.md +1 -0
  124. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidAudience.md +1 -0
  125. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidIssuedAt.md +1 -0
  126. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidNonce.md +1 -0
  127. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidSdHash.md +1 -0
  128. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidTyp.md +1 -0
  129. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingAud.md +1 -0
  130. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingCnf.md +1 -0
  131. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingIat.md +1 -0
  132. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingNonce.md +1 -0
  133. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingSdHash.md +1 -0
  134. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbSignatureFailed.md +1 -0
  135. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmail.md +1 -0
  136. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmailVerified.md +1 -0
  137. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidHolderKey.md +1 -0
  138. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuedAt.md +1 -0
  139. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuer.md +1 -0
  140. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtJwksMissingKeys.md +1 -0
  141. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingCnf.md +1 -0
  142. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingEmail.md +1 -0
  143. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIat.md +1 -0
  144. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIss.md +1 -0
  145. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtSignatureFailed.md +1 -0
  146. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtUnsupportedHeaderAlg.md +1 -0
  147. package/build/src/third_party/issue-descriptions/emailVerificationRequestUserLoggedOut.md +1 -0
  148. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -0
  149. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -0
  150. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -0
  151. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -0
  152. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -0
  153. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -0
  154. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -0
  155. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -0
  156. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -0
  157. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -0
  158. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -1
  159. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -1
  160. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsNoResponse.md +1 -1
  161. package/build/src/third_party/issue-descriptions/federatedAuthRequestApprovalDeclined.md +1 -1
  162. package/build/src/third_party/issue-descriptions/federatedAuthRequestCanceled.md +1 -1
  163. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -1
  164. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorIdToken.md +1 -1
  165. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -1
  166. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -1
  167. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -1
  168. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -1
  169. package/build/src/third_party/issue-descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -1
  170. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -1
  171. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -1
  172. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestNoResponse.md +1 -1
  173. package/build/src/third_party/issue-descriptions/federatedAuthRequestTooManyRequests.md +1 -1
  174. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -1
  175. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -1
  176. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -1
  177. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -1
  178. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -1
  179. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -1
  180. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -1
  181. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -1
  182. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -1
  183. package/build/src/third_party/issue-descriptions/fetchingPartitionedBlobURL.md +2 -2
  184. package/build/src/third_party/issue-descriptions/genericBackUINavigationWouldSkipAd.md +4 -0
  185. package/build/src/third_party/issue-descriptions/genericFormAriaLabelledByToNonExistingIdError.md +2 -2
  186. package/build/src/third_party/issue-descriptions/genericFormAutocompleteAttributeEmptyError.md +1 -1
  187. package/build/src/third_party/issue-descriptions/genericFormDuplicateIdForInputError.md +1 -1
  188. package/build/src/third_party/issue-descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +2 -2
  189. package/build/src/third_party/issue-descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +2 -2
  190. package/build/src/third_party/issue-descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +1 -1
  191. package/build/src/third_party/issue-descriptions/genericFormInputWithNoLabelError.md +1 -1
  192. package/build/src/third_party/issue-descriptions/genericFormLabelForMatchesNonExistingIdError.md +2 -2
  193. package/build/src/third_party/issue-descriptions/genericFormLabelForNameError.md +1 -1
  194. package/build/src/third_party/issue-descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +1 -1
  195. package/build/src/third_party/issue-descriptions/genericFormModelContextMissingToolName.md +1 -1
  196. package/build/src/third_party/issue-descriptions/genericFormModelContextParameterMissingName.md +1 -1
  197. package/build/src/third_party/issue-descriptions/genericFormModelContextRequiredParameterMissingName.md +1 -1
  198. package/build/src/third_party/issue-descriptions/genericNavigationEntryMarkedSkippable.md +2 -2
  199. package/build/src/third_party/issue-descriptions/heavyAd.md +1 -1
  200. package/build/src/third_party/issue-descriptions/lazyLoadImageZeroSize.md +7 -0
  201. package/build/src/third_party/issue-descriptions/navigatingPartitionedBlobURL.md +3 -3
  202. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabled.md +1 -1
  203. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluder.md +1 -1
  204. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluderParent.md +1 -1
  205. package/build/src/third_party/issue-descriptions/permissionElementFencedFrameDisallowed.md +2 -2
  206. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooLarge.md +2 -2
  207. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooSmall.md +2 -2
  208. package/build/src/third_party/issue-descriptions/permissionElementInsetBoxShadowUnsupported.md +1 -1
  209. package/build/src/third_party/issue-descriptions/permissionElementInvalidDisplayStyle.md +2 -2
  210. package/build/src/third_party/issue-descriptions/permissionElementInvalidSizeValue.md +2 -2
  211. package/build/src/third_party/issue-descriptions/permissionElementInvalidType.md +2 -2
  212. package/build/src/third_party/issue-descriptions/permissionElementInvalidTypeActivation.md +2 -2
  213. package/build/src/third_party/issue-descriptions/permissionElementNonOpaqueColor.md +1 -1
  214. package/build/src/third_party/issue-descriptions/permissionElementPaddingBottomUnsupported.md +2 -2
  215. package/build/src/third_party/issue-descriptions/permissionElementPaddingRightUnsupported.md +2 -2
  216. package/build/src/third_party/issue-descriptions/permissionElementRequestInProgress.md +2 -2
  217. package/build/src/third_party/issue-descriptions/permissionElementSecurityChecksFailed.md +1 -1
  218. package/build/src/third_party/issue-descriptions/permissionElementTypeNotSupported.md +2 -2
  219. package/build/src/third_party/issue-descriptions/permissionElementUntrustedEvent.md +1 -1
  220. package/build/src/third_party/issue-descriptions/placeholderDescriptionForInvisibleIssues.md +1 -1
  221. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +1 -1
  222. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedSelectChild.md +1 -1
  223. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +1 -1
  224. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +1 -1
  225. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +1 -1
  226. package/build/src/third_party/issue-descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +1 -1
  227. package/build/src/third_party/issue-descriptions/selectivePermissionsIntervention.md +3 -3
  228. package/build/src/third_party/issue-descriptions/sharedArrayBuffer.md +1 -1
  229. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -1
  230. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +1 -1
  231. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -1
  232. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -1
  233. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -1
  234. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorExpiredResponse.md +1 -1
  235. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +2 -2
  236. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -1
  237. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNavigationRequest.md +2 -2
  238. package/build/src/third_party/issue-descriptions/sriInvalidSignatureHeader.md +4 -4
  239. package/build/src/third_party/issue-descriptions/sriInvalidSignatureInputHeader.md +4 -4
  240. package/build/src/third_party/issue-descriptions/sriMissingSignatureHeader.md +1 -1
  241. package/build/src/third_party/issue-descriptions/sriMissingSignatureInputHeader.md +2 -2
  242. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsIncorrectLength.md +2 -2
  243. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsNotByteSequence.md +4 -4
  244. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsParameterized.md +4 -4
  245. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentName.md +1 -1
  246. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentType.md +2 -2
  247. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +1 -1
  248. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +1 -1
  249. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidParameter.md +2 -2
  250. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderKeyIdLength.md +5 -5
  251. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingLabel.md +3 -3
  252. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +2 -2
  253. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueMissingComponents.md +2 -2
  254. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueNotInnerList.md +2 -2
  255. package/build/src/third_party/issue-descriptions/sriValidationFailedIntegrityMismatch.md +4 -4
  256. package/build/src/third_party/issue-descriptions/sriValidationFailedInvalidLength.md +3 -3
  257. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureExpired.md +2 -2
  258. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureMismatch.md +2 -2
  259. package/build/src/third_party/issue-descriptions/stylesheetLateImport.md +1 -1
  260. package/build/src/third_party/issue-descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +1 -1
  261. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestLength.md +2 -2
  262. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestType.md +3 -3
  263. package/build/src/third_party/issue-descriptions/unencodedDigestMalformedDictionary.md +2 -2
  264. package/build/src/third_party/issue-descriptions/unencodedDigestUnknownAlgorithm.md +1 -1
  265. package/build/src/third_party/lighthouse-devtools-mcp-bundle.js +3177 -6340
  266. package/build/src/tools/ToolDefinition.js +2 -2
  267. package/build/src/tools/categories.js +3 -0
  268. package/build/src/tools/console.js +13 -0
  269. package/build/src/tools/emulation.js +30 -3
  270. package/build/src/tools/extensions.js +8 -1
  271. package/build/src/tools/input.js +246 -128
  272. package/build/src/tools/lighthouse.js +14 -7
  273. package/build/src/tools/memory.js +289 -25
  274. package/build/src/tools/network.js +10 -7
  275. package/build/src/tools/pages.js +33 -92
  276. package/build/src/tools/performance.js +67 -52
  277. package/build/src/tools/pwa.js +128 -0
  278. package/build/src/tools/screencast.js +35 -12
  279. package/build/src/tools/screenshot.js +234 -75
  280. package/build/src/tools/script.js +130 -45
  281. package/build/src/tools/slim/tools.js +3 -0
  282. package/build/src/tools/snapshot.js +7 -4
  283. package/build/src/tools/thirdPartyDeveloper.js +19 -9
  284. package/build/src/tools/tools.js +3 -1
  285. package/build/src/tools/webmcp.js +3 -1
  286. package/build/src/utils/WaitForHelper.js +299 -0
  287. package/build/src/utils/check-for-updates.js +8 -2
  288. package/build/src/utils/files.js +42 -3
  289. package/build/src/utils/logger.js +51 -0
  290. package/build/src/utils/polyfill.js +11 -0
  291. package/build/src/utils/url.js +43 -0
  292. package/build/src/version.js +1 -1
  293. package/package.json +42 -33
  294. package/build/src/DevToolsConnectionAdapter.js +0 -70
  295. package/build/src/HeapSnapshotManager.js +0 -110
  296. package/build/src/Mutex.js +0 -38
  297. package/build/src/WaitForHelper.js +0 -195
  298. package/build/src/bin/cliDefinitions.js +0 -616
  299. package/build/src/logger.js +0 -37
  300. package/build/src/polyfill.js +0 -8
  301. package/build/src/telemetry/metricUtils.js +0 -15
  302. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeRead.md +0 -8
  303. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeSet.md +0 -8
  304. package/build/src/third_party/issue-descriptions/SameSiteExcludeNavigationContextDowngrade.md +0 -8
  305. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeRead.md +0 -8
  306. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeSet.md +0 -8
  307. package/build/src/third_party/issue-descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +0 -8
  308. package/build/src/third_party/issue-descriptions/arInsecureContext.md +0 -7
  309. package/build/src/third_party/issue-descriptions/arInvalidInfoHeader.md +0 -5
  310. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
  311. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
  312. package/build/src/third_party/issue-descriptions/arInvalidRegisterSourceHeader.md +0 -5
  313. package/build/src/third_party/issue-descriptions/arInvalidRegisterTriggerHeader.md +0 -5
  314. package/build/src/third_party/issue-descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
  315. package/build/src/third_party/issue-descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
  316. package/build/src/third_party/issue-descriptions/arNoRegisterOsSourceHeader.md +0 -5
  317. package/build/src/third_party/issue-descriptions/arNoRegisterOsTriggerHeader.md +0 -5
  318. package/build/src/third_party/issue-descriptions/arNoRegisterSourceHeader.md +0 -5
  319. package/build/src/third_party/issue-descriptions/arNoRegisterTriggerHeader.md +0 -5
  320. package/build/src/third_party/issue-descriptions/arNoWebOrOsSupport.md +0 -4
  321. package/build/src/third_party/issue-descriptions/arOsSourceIgnored.md +0 -18
  322. package/build/src/third_party/issue-descriptions/arOsTriggerIgnored.md +0 -19
  323. package/build/src/third_party/issue-descriptions/arPermissionPolicyDisabled.md +0 -8
  324. package/build/src/third_party/issue-descriptions/arSourceAndTriggerHeaders.md +0 -9
  325. package/build/src/third_party/issue-descriptions/arSourceIgnored.md +0 -13
  326. package/build/src/third_party/issue-descriptions/arTriggerIgnored.md +0 -12
  327. package/build/src/third_party/issue-descriptions/arUntrustworthyReportingOrigin.md +0 -10
  328. package/build/src/third_party/issue-descriptions/arWebAndOsHeaders.md +0 -11
  329. package/build/src/utils/string.js +0 -37
  330. package/build/src/utils/types.js +0 -7
@@ -3,9 +3,8 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { PuppeteerDevToolsConnection } from './DevToolsConnectionAdapter.js';
7
- import { Mutex } from './Mutex.js';
8
- import { DevTools } from './third_party/index.js';
6
+ import { DevTools } from '../third_party/index.js';
7
+ import { McpHostBindingAdapter } from './McpHostBindingAdapter.js';
9
8
  /**
10
9
  * A mock implementation of an issues manager that only implements the methods
11
10
  * that are actually used by the IssuesAggregator
@@ -16,82 +15,83 @@ export class FakeIssuesManager extends DevTools.Common.ObjectWrapper
16
15
  return [];
17
16
  }
18
17
  }
19
- // DevTools CDP errors can get noisy.
20
- DevTools.ProtocolClient.InspectorBackend.test.suppressRequestErrors = true;
21
- DevTools.I18n.DevToolsLocale.DevToolsLocale.instance({
22
- create: true,
23
- data: {
24
- navigatorLanguage: 'en-US',
25
- settingLanguage: 'en-US',
26
- lookupClosestDevToolsLocale: l => l,
27
- },
28
- });
29
- DevTools.I18n.i18n.registerLocaleDataForTest('en-US', {});
30
- DevTools.Formatter.FormatterWorkerPool.FormatterWorkerPool.instance({
31
- forceNew: true,
32
- entrypointURL: import.meta
33
- .resolve('./third_party/devtools-formatter-worker.js'),
34
- });
35
- export class UniverseManager {
36
- #browser;
37
- #createUniverseFor;
38
- #universes = new WeakMap();
39
- /** Guard access to #universes so we don't create unnecessary universes */
40
- #mutex = new Mutex();
41
- constructor(browser, factory = DEFAULT_FACTORY) {
42
- this.#browser = browser;
43
- this.#createUniverseFor = factory;
44
- }
45
- async init(pages) {
46
- try {
47
- await this.#mutex.acquire();
48
- const promises = [];
49
- for (const page of pages) {
50
- promises.push(this.#createUniverseFor(page).then(targetUniverse => this.#universes.set(page, targetUniverse)));
51
- }
52
- this.#browser.on('targetcreated', this.#onTargetCreated);
53
- this.#browser.on('targetdestroyed', this.#onTargetDestroyed);
54
- await Promise.all(promises);
55
- }
56
- finally {
57
- this.#mutex.release();
58
- }
59
- }
60
- get(page) {
61
- return this.#universes.get(page) ?? null;
62
- }
63
- dispose() {
64
- this.#browser.off('targetcreated', this.#onTargetCreated);
65
- this.#browser.off('targetdestroyed', this.#onTargetDestroyed);
18
+ export function overrideDevToolsGlobals({ loadResource, }) {
19
+ DevTools.Host.InspectorFrontendHost.installInspectorFrontendHost(new McpHostBindingAdapter(loadResource));
20
+ // DevTools CDP errors can get noisy.
21
+ DevTools.ProtocolClient.InspectorBackend.test.suppressRequestErrors = true;
22
+ // Stub out Network emulation commands on the DevTools Agent prototype globally.
23
+ // This prevents the DevTools Frontend from ever resetting/clearing Puppeteer's
24
+ // active network blocking/throttling rules during target setup or session lifetime.
25
+ const networkAgentPrototype = DevTools.ProtocolClient.InspectorBackend.inspectorBackend.agentPrototypes.get('Network');
26
+ if (networkAgentPrototype) {
27
+ Object.defineProperty(networkAgentPrototype, 'invoke_emulateNetworkConditionsByRule', {
28
+ value: () => {
29
+ return Promise.resolve({
30
+ ruleIds: [],
31
+ getError: () => undefined,
32
+ });
33
+ },
34
+ writable: true,
35
+ configurable: true,
36
+ enumerable: true,
37
+ });
38
+ Object.defineProperty(networkAgentPrototype, 'invoke_overrideNetworkState', {
39
+ value: () => {
40
+ return Promise.resolve({
41
+ getError: () => undefined,
42
+ });
43
+ },
44
+ writable: true,
45
+ configurable: true,
46
+ enumerable: true,
47
+ });
48
+ Object.defineProperty(networkAgentPrototype, 'invoke_enable', {
49
+ value: () => {
50
+ return Promise.resolve({
51
+ getError: () => undefined,
52
+ });
53
+ },
54
+ writable: true,
55
+ configurable: true,
56
+ enumerable: true,
57
+ });
58
+ Object.defineProperty(networkAgentPrototype, 'invoke_disable', {
59
+ value: () => {
60
+ return Promise.resolve({
61
+ getError: () => undefined,
62
+ });
63
+ },
64
+ writable: true,
65
+ configurable: true,
66
+ enumerable: true,
67
+ });
68
+ Object.defineProperty(networkAgentPrototype, 'invoke_setBlockedURLs', {
69
+ value: () => {
70
+ return Promise.resolve({
71
+ getError: () => undefined,
72
+ });
73
+ },
74
+ writable: true,
75
+ configurable: true,
76
+ enumerable: true,
77
+ });
66
78
  }
67
- #onTargetCreated = async (target) => {
68
- const page = await target.page();
69
- try {
70
- await this.#mutex.acquire();
71
- if (!page || this.#universes.has(page)) {
72
- return;
73
- }
74
- this.#universes.set(page, await this.#createUniverseFor(page));
75
- }
76
- finally {
77
- this.#mutex.release();
78
- }
79
- };
80
- #onTargetDestroyed = async (target) => {
81
- const page = await target.page();
82
- try {
83
- await this.#mutex.acquire();
84
- if (!page || !this.#universes.has(page)) {
85
- return;
86
- }
87
- this.#universes.delete(page);
88
- }
89
- finally {
90
- this.#mutex.release();
91
- }
92
- };
79
+ DevTools.I18n.DevToolsLocale.DevToolsLocale.instance({
80
+ create: true,
81
+ data: {
82
+ navigatorLanguage: 'en-US',
83
+ settingLanguage: 'en-US',
84
+ lookupClosestDevToolsLocale: l => l,
85
+ },
86
+ });
87
+ DevTools.I18n.i18n.registerLocaleDataForTest('en-US', {});
88
+ DevTools.Formatter.FormatterWorkerPool.FormatterWorkerPool.instance({
89
+ forceNew: true,
90
+ entrypointURL: import.meta
91
+ .resolve('../third_party/devtools-formatter-worker.js'),
92
+ });
93
93
  }
94
- const DEFAULT_FACTORY = async (page) => {
94
+ export async function createTargetUniverse(session) {
95
95
  const settingStorage = new DevTools.Common.Settings.SettingsStorage({});
96
96
  const universe = new DevTools.Foundation.Universe.Universe({
97
97
  settingsCreationOptions: {
@@ -101,23 +101,29 @@ const DEFAULT_FACTORY = async (page) => {
101
101
  settingRegistrations: DevTools.Common.SettingRegistration.getRegisteredSettings(),
102
102
  },
103
103
  overrideAutoStartModels: new Set([DevTools.DebuggerModel]),
104
+ hostConfig: {},
105
+ inspectorFrontendHost: DevTools.Host.InspectorFrontendHost.InspectorFrontendHostInstance,
106
+ supportsEmulation: false,
104
107
  });
105
- const session = await page.createCDPSession();
106
- const connection = new PuppeteerDevToolsConnection(session);
108
+ const setting = universe.settings.resolve(DevTools.SourceMapManager.lazyLoadingSettingDescriptor);
109
+ setting.set(true);
110
+ const skipAllPausesSetting = universe.settings.resolve(DevTools.skipAllPausesSettingDescriptor);
111
+ skipAllPausesSetting.set(true);
112
+ // @ts-expect-error devtools-frontend has diffrent types.
113
+ const connection = new DevTools.PuppeteerDevToolsConnection(session);
107
114
  const targetManager = universe.context.get(DevTools.TargetManager);
108
- targetManager.observeModels(DevTools.DebuggerModel, SKIP_ALL_PAUSES);
115
+ targetManager.observeModels(DevTools.NetworkManager.NetworkManager, DISABLE_NETWORK);
109
116
  const target = targetManager.createTarget('main', '', 'frame', // eslint-disable-line @typescript-eslint/no-explicit-any
110
117
  /* parentTarget */ null, session.id(), undefined, connection);
111
- return { target, universe };
112
- };
113
- // We don't want to pause any DevTools universe session ever on the MCP side.
118
+ return { target, universe, session };
119
+ }
120
+ // Not recording network requests in the DevTools universe.
114
121
  //
115
- // Note that calling `setSkipAllPauses` only affects the session on which it was
116
- // sent. This means DevTools can still pause, step and do whatever. We just won't
117
- // see the `Debugger.paused`/`Debugger.resumed` events on the MCP side.
118
- const SKIP_ALL_PAUSES = {
122
+ // The network requests are collected through pptr and there isn't a use case for
123
+ // enabling devtools SDK's network domain.
124
+ const DISABLE_NETWORK = {
119
125
  modelAdded(model) {
120
- void model.agent.invoke_setSkipAllPauses({ skip: true });
126
+ void model.target().networkAgent().invoke_disable();
121
127
  },
122
128
  modelRemoved() {
123
129
  // Do nothing.
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /* eslint-disable @typescript-eslint/no-empty-function */
7
+ import { DevTools } from '../third_party/index.js';
8
+ /**
9
+ * BaseClass that is noop or throws for methods.
10
+ * the McpHostBindingAdapter should only implement methods
11
+ * that it needs to support.
12
+ */
13
+ class BaseMcpHostBindingAdapter {
14
+ connectAutomaticFileSystem() { }
15
+ disconnectAutomaticFileSystem() { }
16
+ addFileSystem() { }
17
+ loadCompleted() { }
18
+ indexPath() { }
19
+ setInspectedPageBounds() { }
20
+ showCertificateViewer() { }
21
+ setWhitelistedShortcuts() { }
22
+ setEyeDropperActive() { }
23
+ inspectElementCompleted() { }
24
+ openInNewTab() { }
25
+ openSearchResultsInNewTab() { }
26
+ showItemInFolder() { }
27
+ removeFileSystem() { }
28
+ requestFileSystems() { }
29
+ save() { }
30
+ append() { }
31
+ close() { }
32
+ searchInPath() { }
33
+ stopIndexing() { }
34
+ bringToFront() { }
35
+ closeWindow() { }
36
+ copyText() { }
37
+ inspectedURLChanged() { }
38
+ isolatedFileSystem() {
39
+ throw new Error('Not implemented');
40
+ }
41
+ registerPreference() { }
42
+ getPreferences() { }
43
+ getPreference() { }
44
+ setPreference() { }
45
+ removePreference() { }
46
+ clearPreferences() { }
47
+ getSyncInformation() { }
48
+ getHostConfig() { }
49
+ upgradeDraggedFileSystemPermissions() { }
50
+ platform() {
51
+ throw new Error('Not implemented');
52
+ }
53
+ recordCountHistogram() { }
54
+ recordEnumeratedHistogram() { }
55
+ recordPerformanceHistogram() { }
56
+ recordPerformanceHistogramMedium() { }
57
+ recordUserMetricsAction() { }
58
+ recordNewBadgeUsage() { }
59
+ sendMessageToBackend() { }
60
+ setDevicesDiscoveryConfig() { }
61
+ setDevicesUpdatesEnabled() { }
62
+ openRemotePage() { }
63
+ openNodeFrontend() { }
64
+ setInjectedScriptForOrigin() { }
65
+ setIsDocked() { }
66
+ showSurvey() { }
67
+ canShowSurvey() { }
68
+ zoomFactor() {
69
+ throw new Error('Not implemented');
70
+ }
71
+ zoomIn() { }
72
+ zoomOut() { }
73
+ resetZoom() { }
74
+ showContextMenuAtPoint() { }
75
+ reattach() { }
76
+ readyForTest() { }
77
+ connectionReady() { }
78
+ setOpenNewWindowForPopups() { }
79
+ isHostedMode() {
80
+ throw new Error('Not implemented');
81
+ }
82
+ setAddExtensionCallback() { }
83
+ initialTargetId() {
84
+ throw new Error('Not implemented');
85
+ }
86
+ doAidaConversation(_request, _streamId, cb) {
87
+ cb({
88
+ error: 'Not implemented',
89
+ });
90
+ }
91
+ registerAidaClientEvent(_request, cb) {
92
+ cb({
93
+ error: 'Not implemented',
94
+ });
95
+ }
96
+ aidaCodeComplete(_request, cb) {
97
+ cb({
98
+ error: 'Not implemented',
99
+ });
100
+ }
101
+ dispatchHttpRequest(_request, cb) {
102
+ cb({
103
+ error: 'Not implemented',
104
+ });
105
+ }
106
+ recordImpression() { }
107
+ recordResize() { }
108
+ recordClick() { }
109
+ recordHover() { }
110
+ recordDrag() { }
111
+ recordChange() { }
112
+ recordKeyDown() { }
113
+ recordSettingAccess() { }
114
+ recordFunctionCall() { }
115
+ setChromeFlag() { }
116
+ requestRestart() { }
117
+ loadNetworkResource(_urlString, _headers, _streamId, _callback) { }
118
+ }
119
+ export class McpHostBindingAdapter extends BaseMcpHostBindingAdapter {
120
+ #loadResource;
121
+ constructor(loadResource) {
122
+ super();
123
+ this.#loadResource = loadResource;
124
+ }
125
+ isolatedFileSystem() {
126
+ return null;
127
+ }
128
+ platform() {
129
+ switch (process.platform) {
130
+ case 'darwin':
131
+ return 'mac';
132
+ case 'win32':
133
+ return 'windows';
134
+ default:
135
+ return 'linux';
136
+ }
137
+ }
138
+ zoomFactor() {
139
+ return 1;
140
+ }
141
+ isHostedMode() {
142
+ return true;
143
+ }
144
+ initialTargetId() {
145
+ return Promise.resolve(null);
146
+ }
147
+ loadNetworkResource(urlString, _headers, streamId, callback) {
148
+ if (!URL.canParse(urlString)) {
149
+ callback({
150
+ statusCode: 404,
151
+ urlValid: false,
152
+ });
153
+ return;
154
+ }
155
+ this.#loadResource(urlString)
156
+ .then(content => {
157
+ DevTools.Host.ResourceLoader.streamWrite(streamId, content);
158
+ callback({ statusCode: 200 });
159
+ })
160
+ .catch(() => {
161
+ callback({ statusCode: 404 });
162
+ });
163
+ }
164
+ }
165
+ //# sourceMappingURL=McpHostBindingAdapter.js.map
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import * as fs from 'node:fs';
7
7
  import * as path from 'node:path';
8
- const DESCRIPTIONS_PATH = path.join(import.meta.dirname, 'third_party/issue-descriptions');
8
+ const DESCRIPTIONS_PATH = path.join(import.meta.dirname, '../third_party/issue-descriptions');
9
9
  let issueDescriptions = {};
10
10
  /**
11
11
  * Reads all issue descriptions from the filesystem into memory.
@@ -16,11 +16,13 @@ export async function loadIssueDescriptions() {
16
16
  }
17
17
  const files = await fs.promises.readdir(DESCRIPTIONS_PATH);
18
18
  const descriptions = {};
19
- for (const file of files) {
20
- if (!file.endsWith('.md')) {
21
- continue;
22
- }
19
+ const results = await Promise.all(files
20
+ .filter(file => file.endsWith('.md'))
21
+ .map(async (file) => {
23
22
  const content = await fs.promises.readFile(path.join(DESCRIPTIONS_PATH, file), 'utf-8');
23
+ return { file, content };
24
+ }));
25
+ for (const { file, content } of results) {
24
26
  descriptions[file] = content;
25
27
  }
26
28
  issueDescriptions = descriptions;
@@ -37,4 +39,4 @@ export const ISSUE_UTILS = {
37
39
  loadIssueDescriptions,
38
40
  getIssueDescription,
39
41
  };
40
- //# sourceMappingURL=issue-descriptions.js.map
42
+ //# sourceMappingURL=issueDescriptions.js.map
@@ -3,8 +3,8 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { createStackTraceForConsoleMessage, SymbolizedError, } from '../DevtoolsUtils.js';
7
- import { UncaughtError } from '../PageCollector.js';
6
+ import { createStackTraceForConsoleMessage, SymbolizedError, } from '../devtools/DevtoolsUtils.js';
7
+ import { UncaughtError } from '../collectors/PageCollector.js';
8
8
  import * as DevTools from '../third_party/index.js';
9
9
  export class ConsoleFormatter {
10
10
  #id;
@@ -14,6 +14,7 @@ export class ConsoleFormatter {
14
14
  #resolvedArgs;
15
15
  #stack;
16
16
  #cause;
17
+ #includeStackInConcise;
17
18
  isIgnored;
18
19
  constructor(params) {
19
20
  this.#id = params.id;
@@ -23,6 +24,7 @@ export class ConsoleFormatter {
23
24
  this.#resolvedArgs = params.resolvedArgs ?? [];
24
25
  this.#stack = params.stack;
25
26
  this.#cause = params.cause;
27
+ this.#includeStackInConcise = params.includeStackInConcise ?? false;
26
28
  this.isIgnored = params.isIgnored;
27
29
  }
28
30
  static async from(msg, options) {
@@ -45,7 +47,7 @@ export class ConsoleFormatter {
45
47
  devTools: options?.devTools,
46
48
  details: msg.details,
47
49
  targetId: msg.targetId,
48
- includeStackAndCause: options?.fetchDetailedData,
50
+ includeStackAndCause: options?.fetchDetailedData || options?.fetchStackTrace,
49
51
  resolvedStackTraceForTesting: options?.resolvedStackTraceForTesting,
50
52
  resolvedCauseForTesting: options?.resolvedCauseForTesting,
51
53
  });
@@ -55,6 +57,7 @@ export class ConsoleFormatter {
55
57
  text: error.message,
56
58
  stack: error.stackTrace,
57
59
  cause: error.cause,
60
+ includeStackInConcise: options.fetchStackTrace,
58
61
  isIgnored,
59
62
  });
60
63
  }
@@ -86,7 +89,8 @@ export class ConsoleFormatter {
86
89
  if (options.resolvedStackTraceForTesting) {
87
90
  stack = options.resolvedStackTraceForTesting;
88
91
  }
89
- else if (options.fetchDetailedData && options.devTools) {
92
+ else if ((options.fetchDetailedData || options.fetchStackTrace) &&
93
+ options.devTools) {
90
94
  try {
91
95
  stack = await createStackTraceForConsoleMessage(options.devTools, msg);
92
96
  }
@@ -101,6 +105,7 @@ export class ConsoleFormatter {
101
105
  argCount: resolvedArgs.length || msg.args().length,
102
106
  resolvedArgs,
103
107
  stack,
108
+ includeStackInConcise: options.fetchStackTrace,
104
109
  isIgnored,
105
110
  });
106
111
  }
@@ -112,6 +117,15 @@ export class ConsoleFormatter {
112
117
  toStringDetailed() {
113
118
  return convertConsoleMessageConciseDetailedToString(this.toJSONDetailed());
114
119
  }
120
+ #getText() {
121
+ if (this.#text) {
122
+ return this.#text;
123
+ }
124
+ if (this.#resolvedArgs.length > 0) {
125
+ return formatArg(this.#resolvedArgs[0], this);
126
+ }
127
+ return '';
128
+ }
115
129
  #getArgs() {
116
130
  if (this.#resolvedArgs.length > 0) {
117
131
  const args = [...this.#resolvedArgs];
@@ -124,12 +138,18 @@ export class ConsoleFormatter {
124
138
  return [];
125
139
  }
126
140
  toJSON() {
127
- return {
141
+ const json = {
128
142
  type: this.#type,
129
- text: this.#text,
143
+ text: this.#getText(),
130
144
  argsCount: this.#argCount,
131
145
  id: this.#id,
132
146
  };
147
+ if (this.#includeStackInConcise && this.#stack) {
148
+ json.stackTrace = formatStackTrace(this.#stack, this.#cause, this, {
149
+ includeNote: false,
150
+ });
151
+ }
152
+ return json;
133
153
  }
134
154
  /**
135
155
  * Groups consecutive messages with the same type, text, and argument count.
@@ -143,7 +163,7 @@ export class ConsoleFormatter {
143
163
  prev.message instanceof ConsoleFormatter &&
144
164
  msg instanceof ConsoleFormatter &&
145
165
  prev.message.#type === msg.#type &&
146
- prev.message.#text === msg.#text &&
166
+ prev.message.#getText() === msg.#getText() &&
147
167
  prev.message.#argCount === msg.#argCount) {
148
168
  prev.count++;
149
169
  }
@@ -157,6 +177,9 @@ export class ConsoleFormatter {
157
177
  type: message.#type,
158
178
  text: message.#text,
159
179
  argCount: message.#argCount,
180
+ stack: message.#stack,
181
+ cause: message.#cause,
182
+ includeStackInConcise: message.#includeStackInConcise,
160
183
  isIgnored: message.isIgnored,
161
184
  }, count)
162
185
  : message);
@@ -165,7 +188,7 @@ export class ConsoleFormatter {
165
188
  return {
166
189
  id: this.#id,
167
190
  type: this.#type,
168
- text: this.#text,
191
+ text: this.#getText(),
169
192
  argsCount: this.#argCount,
170
193
  args: this.#getArgs().map(arg => formatArg(arg, this)),
171
194
  stackTrace: this.#stack
@@ -191,7 +214,15 @@ export class GroupedConsoleFormatter extends ConsoleFormatter {
191
214
  }
192
215
  function convertConsoleMessageConciseToString(msg) {
193
216
  const countSuffix = msg.count && msg.count > 1 ? ` [${msg.count} times]` : '';
194
- return `msgid=${msg.id} [${msg.type}] ${msg.text} (${msg.argsCount} args)${countSuffix}`;
217
+ const messageLine = `msgid=${msg.id} [${msg.type}] ${msg.text} (${msg.argsCount} args)${countSuffix}`;
218
+ if (!msg.stackTrace) {
219
+ return messageLine;
220
+ }
221
+ const indentedStackTrace = msg.stackTrace
222
+ .split('\n')
223
+ .map(line => ` ${line}`)
224
+ .join('\n');
225
+ return `${messageLine}\n${indentedStackTrace}`;
195
226
  }
196
227
  function convertConsoleMessageConciseDetailedToString(msg) {
197
228
  const result = [
@@ -227,14 +258,16 @@ function formatArg(arg, formatter) {
227
258
  return typeof arg === 'object' ? JSON.stringify(arg) : String(arg);
228
259
  }
229
260
  const STACK_TRACE_MAX_LINES = 50;
230
- function formatStackTrace(stackTrace, cause, formatter) {
261
+ function formatStackTrace(stackTrace, cause, formatter, options) {
231
262
  const lines = formatStackTraceInner(stackTrace, cause, formatter);
232
263
  const includedLines = lines.slice(0, STACK_TRACE_MAX_LINES);
233
264
  const reminderCount = lines.length - includedLines.length;
234
265
  return [
235
266
  ...includedLines,
236
267
  reminderCount > 0 ? `... and ${reminderCount} more frames` : '',
237
- 'Note: line and column numbers use 1-based indexing',
268
+ options?.includeNote === false
269
+ ? ''
270
+ : 'Note: line and column numbers use 1-based indexing',
238
271
  ]
239
272
  .filter(line => !!line)
240
273
  .join('\n');