@gabrielbryk/arc-devtools-mcp 1.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 (367) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +977 -0
  3. package/build/src/HeapSnapshotManager.js +148 -0
  4. package/build/src/McpContext.js +737 -0
  5. package/build/src/McpPage.js +315 -0
  6. package/build/src/McpResponse.js +990 -0
  7. package/build/src/Mutex.js +38 -0
  8. package/build/src/PageCollector.js +297 -0
  9. package/build/src/ServiceWorkerCollector.js +171 -0
  10. package/build/src/SlimMcpResponse.js +19 -0
  11. package/build/src/TextSnapshot.js +236 -0
  12. package/build/src/ToolHandler.js +223 -0
  13. package/build/src/WaitForHelper.js +190 -0
  14. package/build/src/bin/check-latest-version.js +50 -0
  15. package/build/src/bin/chrome-devtools-cli-options.js +978 -0
  16. package/build/src/bin/chrome-devtools-mcp-cli-options.js +412 -0
  17. package/build/src/bin/chrome-devtools-mcp-main.js +72 -0
  18. package/build/src/bin/chrome-devtools-mcp.js +23 -0
  19. package/build/src/bin/chrome-devtools.js +189 -0
  20. package/build/src/browser.js +253 -0
  21. package/build/src/daemon/client.js +160 -0
  22. package/build/src/daemon/daemon.js +261 -0
  23. package/build/src/daemon/types.js +7 -0
  24. package/build/src/daemon/utils.js +115 -0
  25. package/build/src/devtools/DevToolsConnectionAdapter.js +70 -0
  26. package/build/src/devtools/DevtoolsUtils.js +369 -0
  27. package/build/src/devtools/McpHostBindingAdapter.js +165 -0
  28. package/build/src/formatters/ConsoleFormatter.js +288 -0
  29. package/build/src/formatters/HeapSnapshotFormatter.js +97 -0
  30. package/build/src/formatters/IssueFormatter.js +193 -0
  31. package/build/src/formatters/NetworkFormatter.js +238 -0
  32. package/build/src/formatters/SnapshotFormatter.js +135 -0
  33. package/build/src/index.js +153 -0
  34. package/build/src/issue-descriptions.js +40 -0
  35. package/build/src/logger.js +37 -0
  36. package/build/src/polyfill.js +8 -0
  37. package/build/src/telemetry/ClearcutLogger.js +169 -0
  38. package/build/src/telemetry/WatchdogClient.js +61 -0
  39. package/build/src/telemetry/errors.js +18 -0
  40. package/build/src/telemetry/flagUtils.js +89 -0
  41. package/build/src/telemetry/metricsRegistry.js +89 -0
  42. package/build/src/telemetry/persistence.js +72 -0
  43. package/build/src/telemetry/transformation.js +134 -0
  44. package/build/src/telemetry/types.js +31 -0
  45. package/build/src/telemetry/watchdog/ClearcutSender.js +205 -0
  46. package/build/src/telemetry/watchdog/main.js +128 -0
  47. package/build/src/third_party/THIRD_PARTY_NOTICES +3637 -0
  48. package/build/src/third_party/bundled-packages.json +12 -0
  49. package/build/src/third_party/devtools-formatter-worker.js +15301 -0
  50. package/build/src/third_party/devtools-heap-snapshot-worker.js +9870 -0
  51. package/build/src/third_party/index.js +159597 -0
  52. package/build/src/third_party/issue-descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md +4 -0
  53. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOrigin.md +8 -0
  54. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +18 -0
  55. package/build/src/third_party/issue-descriptions/CoepCorpNotSameSite.md +7 -0
  56. package/build/src/third_party/issue-descriptions/CoepFrameResourceNeedsCoepHeader.md +10 -0
  57. package/build/src/third_party/issue-descriptions/CompatibilityModeQuirks.md +5 -0
  58. package/build/src/third_party/issue-descriptions/CookieAttributeValueExceedsMaxSize.md +5 -0
  59. package/build/src/third_party/issue-descriptions/LowTextContrast.md +5 -0
  60. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeRead.md +8 -0
  61. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeSet.md +8 -0
  62. package/build/src/third_party/issue-descriptions/SameSiteExcludeNavigationContextDowngrade.md +8 -0
  63. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorRead.md +8 -0
  64. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorSet.md +8 -0
  65. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnRead.md +8 -0
  66. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnSet.md +8 -0
  67. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +9 -0
  68. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +9 -0
  69. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeRead.md +8 -0
  70. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeSet.md +8 -0
  71. package/build/src/third_party/issue-descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +8 -0
  72. package/build/src/third_party/issue-descriptions/arInsecureContext.md +7 -0
  73. package/build/src/third_party/issue-descriptions/arInvalidInfoHeader.md +5 -0
  74. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsSourceHeader.md +5 -0
  75. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsTriggerHeader.md +5 -0
  76. package/build/src/third_party/issue-descriptions/arInvalidRegisterSourceHeader.md +5 -0
  77. package/build/src/third_party/issue-descriptions/arInvalidRegisterTriggerHeader.md +5 -0
  78. package/build/src/third_party/issue-descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +5 -0
  79. package/build/src/third_party/issue-descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +6 -0
  80. package/build/src/third_party/issue-descriptions/arNoRegisterOsSourceHeader.md +5 -0
  81. package/build/src/third_party/issue-descriptions/arNoRegisterOsTriggerHeader.md +5 -0
  82. package/build/src/third_party/issue-descriptions/arNoRegisterSourceHeader.md +5 -0
  83. package/build/src/third_party/issue-descriptions/arNoRegisterTriggerHeader.md +5 -0
  84. package/build/src/third_party/issue-descriptions/arNoWebOrOsSupport.md +4 -0
  85. package/build/src/third_party/issue-descriptions/arOsSourceIgnored.md +18 -0
  86. package/build/src/third_party/issue-descriptions/arOsTriggerIgnored.md +19 -0
  87. package/build/src/third_party/issue-descriptions/arPermissionPolicyDisabled.md +8 -0
  88. package/build/src/third_party/issue-descriptions/arSourceAndTriggerHeaders.md +9 -0
  89. package/build/src/third_party/issue-descriptions/arSourceIgnored.md +13 -0
  90. package/build/src/third_party/issue-descriptions/arTriggerIgnored.md +12 -0
  91. package/build/src/third_party/issue-descriptions/arUntrustworthyReportingOrigin.md +10 -0
  92. package/build/src/third_party/issue-descriptions/arWebAndOsHeaders.md +11 -0
  93. package/build/src/third_party/issue-descriptions/bounceTrackingMitigations.md +3 -0
  94. package/build/src/third_party/issue-descriptions/clientHintMetaTagAllowListInvalidOrigin.md +4 -0
  95. package/build/src/third_party/issue-descriptions/clientHintMetaTagModifiedHTML.md +4 -0
  96. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidAllowlistItemType.md +12 -0
  97. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidHeader.md +12 -0
  98. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidUrlPattern.md +8 -0
  99. package/build/src/third_party/issue-descriptions/connectionAllowlistItemNotInnerList.md +12 -0
  100. package/build/src/third_party/issue-descriptions/connectionAllowlistMoreThanOneList.md +7 -0
  101. package/build/src/third_party/issue-descriptions/connectionAllowlistReportingEndpointNotToken.md +10 -0
  102. package/build/src/third_party/issue-descriptions/cookieCrossSiteRedirectDowngrade.md +12 -0
  103. package/build/src/third_party/issue-descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +4 -0
  104. package/build/src/third_party/issue-descriptions/cookieExcludeDomainNonAscii.md +11 -0
  105. package/build/src/third_party/issue-descriptions/cookieExcludePortMismatch.md +8 -0
  106. package/build/src/third_party/issue-descriptions/cookieExcludeSchemeMismatch.md +7 -0
  107. package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutRead.md +6 -0
  108. package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutSet.md +6 -0
  109. package/build/src/third_party/issue-descriptions/cookieWarnDomainNonAscii.md +11 -0
  110. package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantRead.md +4 -0
  111. package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantSet.md +4 -0
  112. package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutRead.md +6 -0
  113. package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutSet.md +6 -0
  114. package/build/src/third_party/issue-descriptions/corsAllowCredentialsRequired.md +6 -0
  115. package/build/src/third_party/issue-descriptions/corsDisabledScheme.md +7 -0
  116. package/build/src/third_party/issue-descriptions/corsDisallowedByMode.md +7 -0
  117. package/build/src/third_party/issue-descriptions/corsHeaderDisallowedByPreflightResponse.md +5 -0
  118. package/build/src/third_party/issue-descriptions/corsInvalidHeaderValues.md +7 -0
  119. package/build/src/third_party/issue-descriptions/corsLocalNetworkAccessPermissionDenied.md +19 -0
  120. package/build/src/third_party/issue-descriptions/corsMethodDisallowedByPreflightResponse.md +5 -0
  121. package/build/src/third_party/issue-descriptions/corsNoCorsRedirectModeNotFollow.md +5 -0
  122. package/build/src/third_party/issue-descriptions/corsOriginMismatch.md +6 -0
  123. package/build/src/third_party/issue-descriptions/corsPreflightResponseInvalid.md +5 -0
  124. package/build/src/third_party/issue-descriptions/corsRedirectContainsCredentials.md +5 -0
  125. package/build/src/third_party/issue-descriptions/corsWildcardOriginNotAllowed.md +8 -0
  126. package/build/src/third_party/issue-descriptions/cspEvalViolation.md +9 -0
  127. package/build/src/third_party/issue-descriptions/cspInlineViolation.md +10 -0
  128. package/build/src/third_party/issue-descriptions/cspTrustedTypesPolicyViolation.md +5 -0
  129. package/build/src/third_party/issue-descriptions/cspTrustedTypesSinkViolation.md +8 -0
  130. package/build/src/third_party/issue-descriptions/cspURLViolation.md +10 -0
  131. package/build/src/third_party/issue-descriptions/deprecation.md +3 -0
  132. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsEmptyList.md +1 -0
  133. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsHttpNotFound.md +1 -0
  134. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsInvalidContentType.md +1 -0
  135. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsInvalidResponse.md +1 -0
  136. package/build/src/third_party/issue-descriptions/emailVerificationRequestAccountsNoResponse.md +1 -0
  137. package/build/src/third_party/issue-descriptions/emailVerificationRequestDnsFetchFailed.md +1 -0
  138. package/build/src/third_party/issue-descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -0
  139. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownHttpNotFound.md +1 -0
  140. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidContentType.md +1 -0
  141. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidResponse.md +1 -0
  142. package/build/src/third_party/issue-descriptions/emailVerificationRequestEmailVerificationWellKnownNoResponse.md +1 -0
  143. package/build/src/third_party/issue-descriptions/emailVerificationRequestInvalidEmail.md +1 -0
  144. package/build/src/third_party/issue-descriptions/emailVerificationRequestJwksHttpNotFound.md +1 -0
  145. package/build/src/third_party/issue-descriptions/emailVerificationRequestJwksInvalidResponse.md +1 -0
  146. package/build/src/third_party/issue-descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -0
  147. package/build/src/third_party/issue-descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -0
  148. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -0
  149. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -0
  150. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -0
  151. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -0
  152. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -0
  153. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenNoResponse.md +1 -0
  154. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidAudience.md +1 -0
  155. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidIssuedAt.md +1 -0
  156. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidNonce.md +1 -0
  157. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidSdHash.md +1 -0
  158. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbInvalidTyp.md +1 -0
  159. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingAud.md +1 -0
  160. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingCnf.md +1 -0
  161. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingIat.md +1 -0
  162. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingNonce.md +1 -0
  163. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbMissingSdHash.md +1 -0
  164. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationKbSignatureFailed.md +1 -0
  165. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmail.md +1 -0
  166. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmailVerified.md +1 -0
  167. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidHolderKey.md +1 -0
  168. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuedAt.md +1 -0
  169. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuer.md +1 -0
  170. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtJwksMissingKeys.md +1 -0
  171. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingCnf.md +1 -0
  172. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingEmail.md +1 -0
  173. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIat.md +1 -0
  174. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIss.md +1 -0
  175. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtSignatureFailed.md +1 -0
  176. package/build/src/third_party/issue-descriptions/emailVerificationRequestTokenVerificationSdJwtUnsupportedHeaderAlg.md +1 -0
  177. package/build/src/third_party/issue-descriptions/emailVerificationRequestUserLoggedOut.md +1 -0
  178. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -0
  179. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -0
  180. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -0
  181. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -0
  182. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -0
  183. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -0
  184. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -0
  185. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -0
  186. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -0
  187. package/build/src/third_party/issue-descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -0
  188. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -0
  189. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -0
  190. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsNoResponse.md +1 -0
  191. package/build/src/third_party/issue-descriptions/federatedAuthRequestApprovalDeclined.md +1 -0
  192. package/build/src/third_party/issue-descriptions/federatedAuthRequestCanceled.md +1 -0
  193. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -0
  194. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorIdToken.md +1 -0
  195. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -0
  196. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -0
  197. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -0
  198. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -0
  199. package/build/src/third_party/issue-descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -0
  200. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -0
  201. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -0
  202. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestNoResponse.md +1 -0
  203. package/build/src/third_party/issue-descriptions/federatedAuthRequestTooManyRequests.md +1 -0
  204. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -0
  205. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -0
  206. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -0
  207. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -0
  208. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -0
  209. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -0
  210. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -0
  211. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -0
  212. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -0
  213. package/build/src/third_party/issue-descriptions/fetchingPartitionedBlobURL.md +7 -0
  214. package/build/src/third_party/issue-descriptions/genericBackUINavigationWouldSkipAd.md +4 -0
  215. package/build/src/third_party/issue-descriptions/genericFormAriaLabelledByToNonExistingIdError.md +8 -0
  216. package/build/src/third_party/issue-descriptions/genericFormAutocompleteAttributeEmptyError.md +5 -0
  217. package/build/src/third_party/issue-descriptions/genericFormDuplicateIdForInputError.md +5 -0
  218. package/build/src/third_party/issue-descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +5 -0
  219. package/build/src/third_party/issue-descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +5 -0
  220. package/build/src/third_party/issue-descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +5 -0
  221. package/build/src/third_party/issue-descriptions/genericFormInputWithNoLabelError.md +5 -0
  222. package/build/src/third_party/issue-descriptions/genericFormLabelForMatchesNonExistingIdError.md +5 -0
  223. package/build/src/third_party/issue-descriptions/genericFormLabelForNameError.md +5 -0
  224. package/build/src/third_party/issue-descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +5 -0
  225. package/build/src/third_party/issue-descriptions/genericFormModelContextMissingToolDescription.md +5 -0
  226. package/build/src/third_party/issue-descriptions/genericFormModelContextMissingToolName.md +5 -0
  227. package/build/src/third_party/issue-descriptions/genericFormModelContextParameterMissingName.md +5 -0
  228. package/build/src/third_party/issue-descriptions/genericFormModelContextParameterMissingTitleAndDescription.md +5 -0
  229. package/build/src/third_party/issue-descriptions/genericFormModelContextRequiredParameterMissingName.md +5 -0
  230. package/build/src/third_party/issue-descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
  231. package/build/src/third_party/issue-descriptions/genericResponseWasBlockedByORB.md +4 -0
  232. package/build/src/third_party/issue-descriptions/heavyAd.md +10 -0
  233. package/build/src/third_party/issue-descriptions/mixedContent.md +5 -0
  234. package/build/src/third_party/issue-descriptions/navigatingPartitionedBlobURL.md +5 -0
  235. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabled.md +7 -0
  236. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  237. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  238. package/build/src/third_party/issue-descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  239. package/build/src/third_party/issue-descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  240. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooLarge.md +5 -0
  241. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooSmall.md +5 -0
  242. package/build/src/third_party/issue-descriptions/permissionElementGeolocationDeprecated.md +5 -0
  243. package/build/src/third_party/issue-descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  244. package/build/src/third_party/issue-descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  245. package/build/src/third_party/issue-descriptions/permissionElementInvalidSizeValue.md +5 -0
  246. package/build/src/third_party/issue-descriptions/permissionElementInvalidType.md +5 -0
  247. package/build/src/third_party/issue-descriptions/permissionElementInvalidTypeActivation.md +5 -0
  248. package/build/src/third_party/issue-descriptions/permissionElementLowContrast.md +5 -0
  249. package/build/src/third_party/issue-descriptions/permissionElementNonOpaqueColor.md +5 -0
  250. package/build/src/third_party/issue-descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  251. package/build/src/third_party/issue-descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  252. package/build/src/third_party/issue-descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  253. package/build/src/third_party/issue-descriptions/permissionElementRegistrationFailed.md +5 -0
  254. package/build/src/third_party/issue-descriptions/permissionElementRequestInProgress.md +5 -0
  255. package/build/src/third_party/issue-descriptions/permissionElementSecurityChecksFailed.md +5 -0
  256. package/build/src/third_party/issue-descriptions/permissionElementTypeNotSupported.md +5 -0
  257. package/build/src/third_party/issue-descriptions/permissionElementUntrustedEvent.md +7 -0
  258. package/build/src/third_party/issue-descriptions/placeholderDescriptionForInvisibleIssues.md +3 -0
  259. package/build/src/third_party/issue-descriptions/propertyRuleInvalidNameIssue.md +3 -0
  260. package/build/src/third_party/issue-descriptions/propertyRuleIssue.md +7 -0
  261. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +7 -0
  262. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedSelectChild.md +7 -0
  263. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +3 -0
  264. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +3 -0
  265. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +3 -0
  266. package/build/src/third_party/issue-descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +3 -0
  267. package/build/src/third_party/issue-descriptions/selectivePermissionsIntervention.md +7 -0
  268. package/build/src/third_party/issue-descriptions/sharedArrayBuffer.md +7 -0
  269. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -0
  270. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorDictionaryLoadFailure.md +3 -0
  271. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +3 -0
  272. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -0
  273. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -0
  274. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -0
  275. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorExpiredResponse.md +3 -0
  276. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +3 -0
  277. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInsufficientResources.md +1 -0
  278. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidMatchField.md +1 -0
  279. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -0
  280. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidTTLField.md +1 -0
  281. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNavigationRequest.md +3 -0
  282. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNoMatchField.md +1 -0
  283. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonIntegerTTLField.md +1 -0
  284. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonListMatchDestField.md +1 -0
  285. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonSecureContext.md +3 -0
  286. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringIdField.md +1 -0
  287. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringInMatchDestList.md +1 -0
  288. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringMatchField.md +1 -0
  289. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonTokenTypeField.md +1 -0
  290. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorRequestAborted.md +1 -0
  291. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorShuttingDown.md +1 -0
  292. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorTooLongIdField.md +3 -0
  293. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorUnsupportedType.md +3 -0
  294. package/build/src/third_party/issue-descriptions/sriInvalidSignatureHeader.md +14 -0
  295. package/build/src/third_party/issue-descriptions/sriInvalidSignatureInputHeader.md +15 -0
  296. package/build/src/third_party/issue-descriptions/sriMissingSignatureHeader.md +8 -0
  297. package/build/src/third_party/issue-descriptions/sriMissingSignatureInputHeader.md +7 -0
  298. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsIncorrectLength.md +11 -0
  299. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsNotByteSequence.md +14 -0
  300. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsParameterized.md +15 -0
  301. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentName.md +8 -0
  302. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentType.md +13 -0
  303. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +4 -0
  304. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +5 -0
  305. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidParameter.md +11 -0
  306. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderKeyIdLength.md +12 -0
  307. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingLabel.md +6 -0
  308. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +8 -0
  309. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueMissingComponents.md +11 -0
  310. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueNotInnerList.md +11 -0
  311. package/build/src/third_party/issue-descriptions/sriValidationFailedIntegrityMismatch.md +10 -0
  312. package/build/src/third_party/issue-descriptions/sriValidationFailedInvalidLength.md +5 -0
  313. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureExpired.md +6 -0
  314. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureMismatch.md +11 -0
  315. package/build/src/third_party/issue-descriptions/stylesheetLateImport.md +4 -0
  316. package/build/src/third_party/issue-descriptions/stylesheetRequestFailed.md +3 -0
  317. package/build/src/third_party/issue-descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +3 -0
  318. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestLength.md +12 -0
  319. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestType.md +17 -0
  320. package/build/src/third_party/issue-descriptions/unencodedDigestMalformedDictionary.md +14 -0
  321. package/build/src/third_party/issue-descriptions/unencodedDigestUnknownAlgorithm.md +15 -0
  322. package/build/src/third_party/lighthouse-devtools-mcp-bundle.js +61598 -0
  323. package/build/src/tools/ToolDefinition.js +73 -0
  324. package/build/src/tools/categories.js +36 -0
  325. package/build/src/tools/console.js +98 -0
  326. package/build/src/tools/emulation.js +84 -0
  327. package/build/src/tools/extensions.js +101 -0
  328. package/build/src/tools/input.js +469 -0
  329. package/build/src/tools/lighthouse.js +136 -0
  330. package/build/src/tools/memory.js +227 -0
  331. package/build/src/tools/network.js +125 -0
  332. package/build/src/tools/pages.js +419 -0
  333. package/build/src/tools/performance.js +200 -0
  334. package/build/src/tools/screencast.js +117 -0
  335. package/build/src/tools/screenshot.js +169 -0
  336. package/build/src/tools/script.js +151 -0
  337. package/build/src/tools/slim/tools.js +88 -0
  338. package/build/src/tools/snapshot.js +61 -0
  339. package/build/src/tools/thirdPartyDeveloper.js +85 -0
  340. package/build/src/tools/tools.js +56 -0
  341. package/build/src/tools/webmcp.js +66 -0
  342. package/build/src/trace-processing/parse.js +85 -0
  343. package/build/src/types.js +7 -0
  344. package/build/src/utils/check-for-updates.js +74 -0
  345. package/build/src/utils/files.js +61 -0
  346. package/build/src/utils/id.js +16 -0
  347. package/build/src/utils/keyboard.js +297 -0
  348. package/build/src/utils/pagination.js +50 -0
  349. package/build/src/utils/string.js +37 -0
  350. package/build/src/utils/types.js +7 -0
  351. package/build/src/version.js +10 -0
  352. package/package.json +100 -0
  353. package/skills/a11y-debugging/SKILL.md +89 -0
  354. package/skills/a11y-debugging/references/a11y-snippets.md +92 -0
  355. package/skills/chrome-devtools/SKILL.md +72 -0
  356. package/skills/chrome-devtools-cli/SKILL.md +153 -0
  357. package/skills/chrome-devtools-cli/references/installation.md +14 -0
  358. package/skills/debug-optimize-lcp/SKILL.md +121 -0
  359. package/skills/debug-optimize-lcp/references/elements-and-size.md +27 -0
  360. package/skills/debug-optimize-lcp/references/lcp-breakdown.md +23 -0
  361. package/skills/debug-optimize-lcp/references/lcp-snippets.md +79 -0
  362. package/skills/debug-optimize-lcp/references/optimization-strategies.md +38 -0
  363. package/skills/memory-leak-debugging/SKILL.md +50 -0
  364. package/skills/memory-leak-debugging/references/common-leaks.md +33 -0
  365. package/skills/memory-leak-debugging/references/compare_snapshots.js +109 -0
  366. package/skills/memory-leak-debugging/references/memlab.md +29 -0
  367. package/skills/troubleshooting/SKILL.md +98 -0
@@ -0,0 +1,369 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Mutex } from '../Mutex.js';
7
+ import { DevTools } from '../third_party/index.js';
8
+ import { PuppeteerDevToolsConnection } from './DevToolsConnectionAdapter.js';
9
+ import { McpHostBindingAdapter } from './McpHostBindingAdapter.js';
10
+ /**
11
+ * A mock implementation of an issues manager that only implements the methods
12
+ * that are actually used by the IssuesAggregator
13
+ */
14
+ export class FakeIssuesManager extends DevTools.Common.ObjectWrapper
15
+ .ObjectWrapper {
16
+ issues() {
17
+ return [];
18
+ }
19
+ }
20
+ export function overrideDevToolsGlobals({ loadResource, }) {
21
+ DevTools.Host.InspectorFrontendHost.installInspectorFrontendHost(new McpHostBindingAdapter(loadResource));
22
+ // DevTools CDP errors can get noisy.
23
+ DevTools.ProtocolClient.InspectorBackend.test.suppressRequestErrors = true;
24
+ // Stub out Network emulation commands on the DevTools Agent prototype globally.
25
+ // This prevents the DevTools Frontend from ever resetting/clearing Puppeteer's
26
+ // active network blocking/throttling rules during target setup or session lifetime.
27
+ const networkAgentPrototype = DevTools.ProtocolClient.InspectorBackend.inspectorBackend.agentPrototypes.get('Network');
28
+ if (networkAgentPrototype) {
29
+ Object.defineProperty(networkAgentPrototype, 'invoke_emulateNetworkConditionsByRule', {
30
+ value: () => {
31
+ return Promise.resolve({
32
+ ruleIds: [],
33
+ getError: () => undefined,
34
+ });
35
+ },
36
+ writable: true,
37
+ configurable: true,
38
+ enumerable: true,
39
+ });
40
+ Object.defineProperty(networkAgentPrototype, 'invoke_overrideNetworkState', {
41
+ value: () => {
42
+ return Promise.resolve({
43
+ getError: () => undefined,
44
+ });
45
+ },
46
+ writable: true,
47
+ configurable: true,
48
+ enumerable: true,
49
+ });
50
+ Object.defineProperty(networkAgentPrototype, 'invoke_enable', {
51
+ value: () => {
52
+ return Promise.resolve({
53
+ getError: () => undefined,
54
+ });
55
+ },
56
+ writable: true,
57
+ configurable: true,
58
+ enumerable: true,
59
+ });
60
+ Object.defineProperty(networkAgentPrototype, 'invoke_disable', {
61
+ value: () => {
62
+ return Promise.resolve({
63
+ getError: () => undefined,
64
+ });
65
+ },
66
+ writable: true,
67
+ configurable: true,
68
+ enumerable: true,
69
+ });
70
+ Object.defineProperty(networkAgentPrototype, 'invoke_setBlockedURLs', {
71
+ value: () => {
72
+ return Promise.resolve({
73
+ getError: () => undefined,
74
+ });
75
+ },
76
+ writable: true,
77
+ configurable: true,
78
+ enumerable: true,
79
+ });
80
+ }
81
+ DevTools.I18n.DevToolsLocale.DevToolsLocale.instance({
82
+ create: true,
83
+ data: {
84
+ navigatorLanguage: 'en-US',
85
+ settingLanguage: 'en-US',
86
+ lookupClosestDevToolsLocale: l => l,
87
+ },
88
+ });
89
+ DevTools.I18n.i18n.registerLocaleDataForTest('en-US', {});
90
+ DevTools.Formatter.FormatterWorkerPool.FormatterWorkerPool.instance({
91
+ forceNew: true,
92
+ entrypointURL: import.meta
93
+ .resolve('../third_party/devtools-formatter-worker.js'),
94
+ });
95
+ }
96
+ export class UniverseManager {
97
+ #browser;
98
+ #createUniverseFor;
99
+ #universes = new WeakMap();
100
+ /** Guard access to #universes so we don't create unnecessary universes */
101
+ #mutex = new Mutex();
102
+ constructor(browser, factory = DEFAULT_FACTORY) {
103
+ this.#browser = browser;
104
+ this.#createUniverseFor = factory;
105
+ }
106
+ async init(pages) {
107
+ try {
108
+ await this.#mutex.acquire();
109
+ const promises = [];
110
+ for (const page of pages) {
111
+ promises.push(this.#createUniverseFor(page).then(targetUniverse => this.#universes.set(page, targetUniverse)));
112
+ }
113
+ this.#browser.on('targetcreated', this.#onTargetCreated);
114
+ this.#browser.on('targetdestroyed', this.#onTargetDestroyed);
115
+ await Promise.all(promises);
116
+ }
117
+ finally {
118
+ this.#mutex.release();
119
+ }
120
+ }
121
+ get(page) {
122
+ return this.#universes.get(page) ?? null;
123
+ }
124
+ dispose() {
125
+ this.#browser.off('targetcreated', this.#onTargetCreated);
126
+ this.#browser.off('targetdestroyed', this.#onTargetDestroyed);
127
+ }
128
+ #onTargetCreated = async (target) => {
129
+ const page = await target.page();
130
+ try {
131
+ await this.#mutex.acquire();
132
+ if (!page || this.#universes.has(page)) {
133
+ return;
134
+ }
135
+ this.#universes.set(page, await this.#createUniverseFor(page));
136
+ }
137
+ finally {
138
+ this.#mutex.release();
139
+ }
140
+ };
141
+ #onTargetDestroyed = async (target) => {
142
+ const page = await target.page();
143
+ try {
144
+ await this.#mutex.acquire();
145
+ if (!page || !this.#universes.has(page)) {
146
+ return;
147
+ }
148
+ this.#universes.delete(page);
149
+ }
150
+ finally {
151
+ this.#mutex.release();
152
+ }
153
+ };
154
+ }
155
+ const DEFAULT_FACTORY = async (page) => {
156
+ const settingStorage = new DevTools.Common.Settings.SettingsStorage({});
157
+ const universe = new DevTools.Foundation.Universe.Universe({
158
+ settingsCreationOptions: {
159
+ syncedStorage: settingStorage,
160
+ globalStorage: settingStorage,
161
+ localStorage: settingStorage,
162
+ settingRegistrations: DevTools.Common.SettingRegistration.getRegisteredSettings(),
163
+ },
164
+ overrideAutoStartModels: new Set([DevTools.DebuggerModel]),
165
+ });
166
+ const session = await page.createCDPSession();
167
+ const connection = new PuppeteerDevToolsConnection(session);
168
+ const targetManager = universe.context.get(DevTools.TargetManager);
169
+ targetManager.observeModels(DevTools.DebuggerModel, SKIP_ALL_PAUSES);
170
+ targetManager.observeModels(DevTools.NetworkManager.NetworkManager, DISABLE_NETWORK);
171
+ const target = targetManager.createTarget('main', '', 'frame', // eslint-disable-line @typescript-eslint/no-explicit-any
172
+ /* parentTarget */ null, session.id(), undefined, connection);
173
+ return { target, universe, session };
174
+ };
175
+ // We don't want to pause any DevTools universe session ever on the MCP side.
176
+ //
177
+ // Note that calling `setSkipAllPauses` only affects the session on which it was
178
+ // sent. This means DevTools can still pause, step and do whatever. We just won't
179
+ // see the `Debugger.paused`/`Debugger.resumed` events on the MCP side.
180
+ const SKIP_ALL_PAUSES = {
181
+ modelAdded(model) {
182
+ void model.agent.invoke_setSkipAllPauses({ skip: true });
183
+ },
184
+ modelRemoved() {
185
+ // Do nothing.
186
+ },
187
+ };
188
+ // Not recording network requests in the DevTools universe.
189
+ //
190
+ // The network requests are collected through pptr and there isn't a use case for
191
+ // enabling devtools SDK's network domain.
192
+ const DISABLE_NETWORK = {
193
+ modelAdded(model) {
194
+ void model.target().networkAgent().invoke_disable();
195
+ },
196
+ modelRemoved() {
197
+ // Do nothing.
198
+ },
199
+ };
200
+ /**
201
+ * Constructed from Runtime.ExceptionDetails of an uncaught error.
202
+ *
203
+ * TODO: Also construct from a RemoteObject of subtype 'error'.
204
+ *
205
+ * Consists of the message, a fully resolved stack trace and a fully resolved 'cause' chain.
206
+ */
207
+ export class SymbolizedError {
208
+ message;
209
+ stackTrace;
210
+ cause;
211
+ constructor(message, stackTrace, cause) {
212
+ this.message = message;
213
+ this.stackTrace = stackTrace;
214
+ this.cause = cause;
215
+ }
216
+ static async fromDetails(opts) {
217
+ const message = SymbolizedError.#getMessage(opts.details);
218
+ if (!opts.includeStackAndCause || !opts.devTools) {
219
+ return new SymbolizedError(message, opts.resolvedStackTraceForTesting, opts.resolvedCauseForTesting);
220
+ }
221
+ let stackTrace;
222
+ if (opts.resolvedStackTraceForTesting) {
223
+ stackTrace = opts.resolvedStackTraceForTesting;
224
+ }
225
+ else if (opts.details.stackTrace) {
226
+ try {
227
+ stackTrace = await createStackTrace(opts.devTools, opts.details.stackTrace, opts.targetId);
228
+ }
229
+ catch {
230
+ // ignore
231
+ }
232
+ }
233
+ // TODO: Turn opts.details.exception into a JSHandle and retrieve the 'cause' property.
234
+ // If its an Error, recursively create a SymbolizedError.
235
+ let cause;
236
+ if (opts.resolvedCauseForTesting) {
237
+ cause = opts.resolvedCauseForTesting;
238
+ }
239
+ else if (opts.details.exception) {
240
+ try {
241
+ const causeRemoteObj = await SymbolizedError.#lookupCause(opts.devTools, opts.details.exception, opts.targetId);
242
+ if (causeRemoteObj) {
243
+ cause = await SymbolizedError.fromError({
244
+ devTools: opts.devTools,
245
+ error: causeRemoteObj,
246
+ targetId: opts.targetId,
247
+ });
248
+ }
249
+ }
250
+ catch {
251
+ // Ignore
252
+ }
253
+ }
254
+ return new SymbolizedError(message, stackTrace, cause);
255
+ }
256
+ static async fromError(opts) {
257
+ const details = await SymbolizedError.#getExceptionDetails(opts.devTools, opts.error, opts.targetId);
258
+ if (details) {
259
+ return SymbolizedError.fromDetails({
260
+ details,
261
+ devTools: opts.devTools,
262
+ targetId: opts.targetId,
263
+ includeStackAndCause: true,
264
+ });
265
+ }
266
+ return new SymbolizedError(SymbolizedError.#getMessageFromException(opts.error));
267
+ }
268
+ static #getMessage(details) {
269
+ // For Runtime.exceptionThrown with a present exception object, `details.text` will be "Uncaught" and
270
+ // we have to manually parse out the error text from the exception description.
271
+ // In the case of Runtime.getExceptionDetails, `details.text` has the Error.message.
272
+ if (details.text === 'Uncaught' && details.exception) {
273
+ return ('Uncaught ' +
274
+ SymbolizedError.#getMessageFromException(details.exception));
275
+ }
276
+ return details.text;
277
+ }
278
+ static #getMessageFromException(error) {
279
+ const messageWithRest = error.description?.split('\n at ', 2) ?? [];
280
+ return messageWithRest[0] ?? '';
281
+ }
282
+ static async #getExceptionDetails(devTools, error, targetId) {
283
+ if (!devTools || (error.type !== 'object' && error.subtype !== 'error')) {
284
+ return null;
285
+ }
286
+ const targetManager = devTools.universe.context.get(DevTools.TargetManager);
287
+ const target = targetId
288
+ ? targetManager.targetById(targetId) || devTools.target
289
+ : devTools.target;
290
+ const model = target.model(DevTools.RuntimeModel);
291
+ return ((await model.getExceptionDetails(error.objectId)) ?? null);
292
+ }
293
+ static async #lookupCause(devTools, error, targetId) {
294
+ if (!devTools || (error.type !== 'object' && error.subtype !== 'error')) {
295
+ return null;
296
+ }
297
+ const targetManager = devTools.universe.context.get(DevTools.TargetManager);
298
+ const target = targetId
299
+ ? targetManager.targetById(targetId) || devTools.target
300
+ : devTools.target;
301
+ const properties = await target.runtimeAgent().invoke_getProperties({
302
+ objectId: error.objectId,
303
+ });
304
+ if (properties.getError()) {
305
+ return null;
306
+ }
307
+ return properties.result.find(prop => prop.name === 'cause')?.value ?? null;
308
+ }
309
+ static createForTesting(message, stackTrace, cause) {
310
+ return new SymbolizedError(message, stackTrace, cause);
311
+ }
312
+ }
313
+ export async function createStackTraceForConsoleMessage(devTools, consoleMessage) {
314
+ const message = consoleMessage;
315
+ const rawStackTrace = message._rawStackTrace();
316
+ if (rawStackTrace) {
317
+ return createStackTrace(devTools, rawStackTrace, message._targetId());
318
+ }
319
+ return undefined;
320
+ }
321
+ export async function createStackTrace(devTools, rawStackTrace, targetId) {
322
+ const targetManager = devTools.universe.context.get(DevTools.TargetManager);
323
+ const target = targetId
324
+ ? targetManager.targetById(targetId) || devTools.target
325
+ : devTools.target;
326
+ const model = target.model(DevTools.DebuggerModel);
327
+ // DevTools doesn't wait for source maps to attach before building a stack trace, rather it'll send
328
+ // an update event once a source map was attached and the stack trace retranslated. This doesn't
329
+ // work in the MCP case, so we'll collect all script IDs upfront and wait for any pending source map
330
+ // loads before creating the stack trace. We might also have to wait for Debugger.ScriptParsed events if
331
+ // the stack trace is created particularly early.
332
+ const scriptIds = new Set();
333
+ for (const frame of rawStackTrace.callFrames) {
334
+ scriptIds.add(frame.scriptId);
335
+ }
336
+ for (let asyncStack = rawStackTrace.parent; asyncStack; asyncStack = asyncStack.parent) {
337
+ for (const frame of asyncStack.callFrames) {
338
+ scriptIds.add(frame.scriptId);
339
+ }
340
+ }
341
+ const signal = AbortSignal.timeout(1_000);
342
+ await Promise.all([...scriptIds].map(id => waitForScript(model, id, signal)
343
+ .then(script => model.sourceMapManager().sourceMapForClientPromise(script))
344
+ .catch()));
345
+ const binding = devTools.universe.context.get(DevTools.DebuggerWorkspaceBinding);
346
+ // DevTools uses branded types for ScriptId and others. Casting the puppeteer protocol type to the DevTools protocol type is safe.
347
+ return binding.createStackTraceFromProtocolRuntime(rawStackTrace, target);
348
+ }
349
+ // Waits indefinitely for the script so pair it with Promise.race.
350
+ async function waitForScript(model, scriptId, signal) {
351
+ while (true) {
352
+ if (signal.aborted) {
353
+ throw signal.reason;
354
+ }
355
+ const script = model.scriptForId(scriptId);
356
+ if (script) {
357
+ return script;
358
+ }
359
+ await new Promise((resolve, reject) => {
360
+ signal.addEventListener('abort', () => reject(signal.reason), {
361
+ once: true,
362
+ });
363
+ void model
364
+ .once('ParsedScriptSource')
365
+ .then(resolve);
366
+ });
367
+ }
368
+ }
369
+ //# sourceMappingURL=DevtoolsUtils.js.map
@@ -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