opera-devtools-mcp 0.2.4 → 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 +232 -1061
  52. package/build/src/third_party/bundled-packages.json +6 -8
  53. package/build/src/third_party/devtools-formatter-worker.js +63 -22
  54. package/build/src/third_party/devtools-heap-snapshot-worker.js +809 -182
  55. package/build/src/third_party/index.js +69558 -74691
  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
@@ -4,11 +4,19 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { zod } from '../third_party/index.js';
7
- import { ensureExtension } from '../utils/files.js';
8
7
  import { ToolCategory } from './categories.js';
9
8
  import { definePageTool, defineTool } from './ToolDefinition.js';
10
- export const takeMemorySnapshot = definePageTool({
11
- name: 'take_memory_snapshot',
9
+ const HEAP_SNAPSHOT_FILTERS = [
10
+ 'objectsRetainedByDetachedDomNodes',
11
+ 'objectsRetainedByConsole',
12
+ 'objectsRetainedByEventHandlers',
13
+ 'objectsRetainedByContexts',
14
+ 'sharedNativeContext',
15
+ 'noNativeContext',
16
+ 'attributedToSpecificNativeContext',
17
+ ];
18
+ export const takeHeapSnapshot = definePageTool({
19
+ name: 'take_heapsnapshot',
12
20
  description: `Capture a heap snapshot of the currently selected page. Use to analyze the memory distribution of JavaScript objects and debug memory leaks.`,
13
21
  annotations: {
14
22
  category: ToolCategory.MEMORY,
@@ -20,44 +28,59 @@ export const takeMemorySnapshot = definePageTool({
20
28
  .describe('A path to a .heapsnapshot file to save the heapsnapshot to.'),
21
29
  },
22
30
  blockedByDialog: true,
31
+ verifyFilesSchema: {
32
+ filePath: true,
33
+ },
23
34
  handler: async (request, response, context) => {
24
35
  const page = request.page;
25
- context.validatePath(request.params.filePath);
36
+ const snapshotPath = await context.ensureExtension(request.params.filePath, '.heapsnapshot');
26
37
  await page.pptrPage.captureHeapSnapshot({
27
- path: ensureExtension(request.params.filePath, '.heapsnapshot'),
38
+ path: snapshotPath,
28
39
  });
29
- response.appendResponseLine(`Heap snapshot saved to ${request.params.filePath}`);
40
+ response.appendResponseLine(`Heap snapshot saved to ${snapshotPath}`);
30
41
  },
31
42
  });
32
- export const exploreMemorySnapshot = defineTool({
33
- name: 'load_memory_snapshot',
34
- description: 'Loads a memory heapsnapshot and returns snapshot summary stats.',
43
+ export const getHeapSnapshotSummary = defineTool({
44
+ name: 'get_heapsnapshot_summary',
45
+ description: 'Loads a memory heapsnapshot and returns snapshot summary stats, including native contexts and their sizes, and retained by context summary.',
35
46
  annotations: {
36
47
  category: ToolCategory.MEMORY,
37
48
  readOnlyHint: true,
38
- conditions: ['experimentalMemory'],
49
+ conditions: ['memoryDebugging'],
39
50
  },
40
51
  schema: {
41
52
  filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
42
53
  },
43
54
  blockedByDialog: false,
55
+ verifyFilesSchema: {
56
+ filePath: true,
57
+ },
44
58
  handler: async (request, response, context) => {
45
- context.validatePath(request.params.filePath);
46
59
  const stats = await context.getHeapSnapshotStats(request.params.filePath);
47
60
  const staticData = await context.getHeapSnapshotStaticData(request.params.filePath);
48
- response.setHeapSnapshotStats(stats, staticData);
61
+ const nativeContextSizes = await context.getHeapSnapshotNativeContextSizes(request.params.filePath);
62
+ const retainedByContextSummary = await context.getHeapSnapshotRetainedByContextSummary(request.params.filePath);
63
+ response.setHeapSnapshotStats(stats, staticData, nativeContextSizes, retainedByContextSummary);
49
64
  },
50
65
  });
51
- export const getMemorySnapshotDetails = defineTool({
52
- name: 'get_memory_snapshot_details',
66
+ export const getHeapSnapshotDetails = defineTool({
67
+ name: 'get_heapsnapshot_details',
53
68
  description: 'Loads a memory heapsnapshot and returns all available information including statistics, static data, and aggregated node information. Supports pagination for aggregates.',
54
69
  annotations: {
55
70
  category: ToolCategory.MEMORY,
56
71
  readOnlyHint: true,
57
- conditions: ['experimentalMemory'],
72
+ conditions: ['memoryDebugging'],
58
73
  },
59
74
  schema: {
60
75
  filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
76
+ filterName: zod
77
+ .enum(HEAP_SNAPSHOT_FILTERS)
78
+ .optional()
79
+ .describe('An optional filter to apply to the aggregates.'),
80
+ objectId: zod
81
+ .number()
82
+ .optional()
83
+ .describe('The object ID (nodeId) of the specific native context to filter by when filterName is attributedToSpecificNativeContext.'),
61
84
  pageIdx: zod
62
85
  .number()
63
86
  .optional()
@@ -68,39 +91,280 @@ export const getMemorySnapshotDetails = defineTool({
68
91
  .describe('The page size for pagination of aggregates.'),
69
92
  },
70
93
  blockedByDialog: false,
94
+ verifyFilesSchema: {
95
+ filePath: true,
96
+ },
71
97
  handler: async (request, response, context) => {
72
- context.validatePath(request.params.filePath);
73
- const aggregates = await context.getHeapSnapshotAggregates(request.params.filePath);
98
+ const aggregates = await context.getHeapSnapshotAggregates(request.params.filePath, request.params.filterName, request.params.objectId);
74
99
  response.setHeapSnapshotAggregates(aggregates, {
75
100
  pageIdx: request.params.pageIdx,
76
101
  pageSize: request.params.pageSize,
77
102
  });
78
103
  },
79
104
  });
80
- export const getNodesByClass = defineTool({
81
- name: 'get_nodes_by_class',
82
- description: 'Loads a memory heapsnapshot and returns instances of a specific class with their stable IDs.',
105
+ export const getHeapSnapshotClassNodes = defineTool({
106
+ name: 'get_heapsnapshot_class_nodes',
107
+ description: 'Loads a memory heapsnapshot and returns instances of a specific class with their IDs.',
83
108
  annotations: {
84
109
  category: ToolCategory.MEMORY,
85
110
  readOnlyHint: true,
86
- conditions: ['experimentalMemory'],
111
+ conditions: ['memoryDebugging'],
87
112
  },
88
113
  schema: {
89
114
  filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
90
- uid: zod
115
+ id: zod.number().describe('The ID for the class, obtained from details.'),
116
+ filterName: zod
117
+ .enum(HEAP_SNAPSHOT_FILTERS)
118
+ .optional()
119
+ .describe('An optional filter to apply to the nodes.'),
120
+ objectId: zod
91
121
  .number()
92
- .describe('The unique UID for the class, obtained from aggregates listing.'),
122
+ .optional()
123
+ .describe('The object ID (nodeId) of the specific native context to filter by when filterName is attributedToSpecificNativeContext.'),
93
124
  pageIdx: zod.number().optional().describe('The page index for pagination.'),
94
125
  pageSize: zod.number().optional().describe('The page size for pagination.'),
95
126
  },
96
127
  blockedByDialog: false,
128
+ verifyFilesSchema: {
129
+ filePath: true,
130
+ },
97
131
  handler: async (request, response, context) => {
98
- context.validatePath(request.params.filePath);
99
- const nodes = await context.getHeapSnapshotNodesByUid(request.params.filePath, request.params.uid);
132
+ const nodes = await context.getHeapSnapshotNodesById(request.params.filePath, request.params.id, request.params.filterName, request.params.objectId);
100
133
  response.setHeapSnapshotNodes(nodes, {
101
134
  pageIdx: request.params.pageIdx,
102
135
  pageSize: request.params.pageSize,
103
136
  });
104
137
  },
105
138
  });
139
+ export const getHeapSnapshotRetainers = defineTool({
140
+ name: 'get_heapsnapshot_retainers',
141
+ description: 'Loads a memory heapsnapshot and returns retainers for a specific node ID.',
142
+ annotations: {
143
+ category: ToolCategory.MEMORY,
144
+ readOnlyHint: true,
145
+ conditions: ['memoryDebugging'],
146
+ },
147
+ blockedByDialog: false,
148
+ verifyFilesSchema: {
149
+ filePath: true,
150
+ },
151
+ schema: {
152
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
153
+ nodeId: zod.number().describe('The node ID to get retainers for.'),
154
+ pageIdx: zod.number().optional().describe('The page index for pagination.'),
155
+ pageSize: zod.number().optional().describe('The page size for pagination.'),
156
+ },
157
+ handler: async (request, response, context) => {
158
+ const retainers = await context.getHeapSnapshotRetainers(request.params.filePath, request.params.nodeId);
159
+ response.setHeapSnapshotNodes(retainers, {
160
+ pageIdx: request.params.pageIdx,
161
+ pageSize: request.params.pageSize,
162
+ });
163
+ },
164
+ });
165
+ export const closeHeapSnapshot = defineTool({
166
+ name: 'close_heapsnapshot',
167
+ description: 'Closes a previously loaded memory heapsnapshot, freeing its memory.',
168
+ annotations: {
169
+ category: ToolCategory.MEMORY,
170
+ readOnlyHint: false,
171
+ conditions: ['memoryDebugging'],
172
+ },
173
+ verifyFilesSchema: {
174
+ filePath: true,
175
+ },
176
+ schema: {
177
+ filePath: zod
178
+ .string()
179
+ .describe('A path to the .heapsnapshot file to close.'),
180
+ },
181
+ blockedByDialog: false,
182
+ handler: async (request, response, context) => {
183
+ const closed = await context.closeHeapSnapshot(request.params.filePath);
184
+ if (!closed) {
185
+ throw new Error(`Failed to close heap snapshot: ${request.params.filePath} was not loaded.`);
186
+ }
187
+ response.appendResponseLine(`Closed heap snapshot: ${request.params.filePath}`);
188
+ },
189
+ });
190
+ export const getHeapSnapshotRetainingPaths = defineTool({
191
+ name: 'get_heapsnapshot_retaining_paths',
192
+ description: 'Loads a memory heapsnapshot and returns retaining paths for a specific node ID. This helps to understand why a node is not being garbage collected.',
193
+ annotations: {
194
+ category: ToolCategory.MEMORY,
195
+ readOnlyHint: true,
196
+ conditions: ['memoryDebugging'],
197
+ },
198
+ verifyFilesSchema: {
199
+ filePath: true,
200
+ },
201
+ blockedByDialog: false,
202
+ schema: {
203
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
204
+ nodeId: zod.number().describe('The node ID to get retaining paths for.'),
205
+ maxDepth: zod
206
+ .number()
207
+ .optional()
208
+ .describe('The maximum depth to search for retaining paths.'),
209
+ maxNodes: zod
210
+ .number()
211
+ .optional()
212
+ .describe('The maximum number of nodes to return.'),
213
+ maxSiblings: zod
214
+ .number()
215
+ .optional()
216
+ .describe('The maximum number of siblings to return.'),
217
+ },
218
+ handler: async (request, response, context) => {
219
+ const retainingPaths = await context.getHeapSnapshotRetainingPaths(request.params.filePath, request.params.nodeId, request.params.maxDepth, request.params.maxNodes, request.params.maxSiblings);
220
+ response.setHeapSnapshotRetainingPaths(retainingPaths);
221
+ },
222
+ });
223
+ export const getHeapSnapshotEdges = defineTool({
224
+ name: 'get_heapsnapshot_edges',
225
+ description: 'Loads a memory heapsnapshot and returns outgoing edges (references) for a specific node ID.',
226
+ annotations: {
227
+ category: ToolCategory.MEMORY,
228
+ readOnlyHint: true,
229
+ conditions: ['memoryDebugging'],
230
+ },
231
+ blockedByDialog: false,
232
+ verifyFilesSchema: {
233
+ filePath: true,
234
+ },
235
+ schema: {
236
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
237
+ nodeId: zod.number().describe('The node ID to get outgoing edges for.'),
238
+ sortBy: zod
239
+ .enum(['retainedSize', 'selfSize', 'name'])
240
+ .optional()
241
+ .describe('Sort order for edges. Default is retainedSize.'),
242
+ minRetainedSize: zod
243
+ .number()
244
+ .optional()
245
+ .describe('Minimum retained size in bytes for target nodes.'),
246
+ excludePrimitives: zod
247
+ .boolean()
248
+ .optional()
249
+ .describe('Whether to exclude primitive target nodes. Default is true.'),
250
+ pageIdx: zod.number().optional().describe('The page index for pagination.'),
251
+ pageSize: zod.number().optional().describe('The page size for pagination.'),
252
+ },
253
+ handler: async (request, response, context) => {
254
+ const edges = await context.getHeapSnapshotEdges(request.params.filePath, request.params.nodeId, {
255
+ sortBy: request.params.sortBy ?? 'retainedSize',
256
+ minRetainedSize: request.params.minRetainedSize,
257
+ excludePrimitives: request.params.excludePrimitives ?? true,
258
+ });
259
+ response.setHeapSnapshotNodes(edges, {
260
+ pageIdx: request.params.pageIdx,
261
+ pageSize: request.params.pageSize,
262
+ });
263
+ },
264
+ });
265
+ export const getHeapSnapshotDominators = defineTool({
266
+ name: 'get_heapsnapshot_dominators',
267
+ description: 'Loads a memory heapsnapshot and returns the dominator chain for a specific node ID. This helps to identify which objects are keeping the target node alive.',
268
+ annotations: {
269
+ category: ToolCategory.MEMORY,
270
+ readOnlyHint: true,
271
+ conditions: ['memoryDebugging'],
272
+ },
273
+ blockedByDialog: false,
274
+ verifyFilesSchema: {
275
+ filePath: true,
276
+ },
277
+ schema: {
278
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
279
+ nodeId: zod
280
+ .number()
281
+ .describe('The node ID to get the dominator chain for.'),
282
+ },
283
+ handler: async (request, response, context) => {
284
+ const dominators = await context.getHeapSnapshotDominators(request.params.filePath, request.params.nodeId);
285
+ response.setHeapSnapshotDominators(dominators);
286
+ },
287
+ });
288
+ export const compareHeapSnapshots = defineTool({
289
+ name: 'compare_heapsnapshots',
290
+ description: 'Loads two memory heapsnapshots and returns the comparison. If classIndex is provided, returns detailed diff for that class, otherwise returns summary diff.',
291
+ annotations: {
292
+ category: ToolCategory.MEMORY,
293
+ readOnlyHint: true,
294
+ conditions: ['memoryDebugging'],
295
+ },
296
+ verifyFilesSchema: {
297
+ baseFilePath: true,
298
+ currentFilePath: true,
299
+ },
300
+ schema: {
301
+ baseFilePath: zod
302
+ .string()
303
+ .describe('A path to the base .heapsnapshot file (earlier snapshot).'),
304
+ currentFilePath: zod
305
+ .string()
306
+ .describe('A path to the current .heapsnapshot file (later snapshot).'),
307
+ classIndex: zod
308
+ .number()
309
+ .optional()
310
+ .describe('Optional 0-based index of the class in the summary list to filter results, showing individual objects.'),
311
+ },
312
+ blockedByDialog: false,
313
+ handler: async (request, response, context) => {
314
+ if (request.params.classIndex !== undefined) {
315
+ const classDiffResult = await context.getHeapSnapshotDetailedClassDiff(request.params.baseFilePath, request.params.currentFilePath, request.params.classIndex);
316
+ response.setHeapSnapshotDetailedClassDiff(classDiffResult);
317
+ }
318
+ else {
319
+ const diff = await context.getHeapSnapshotClassDiffs(request.params.baseFilePath, request.params.currentFilePath);
320
+ response.setHeapSnapshotClassDiffs(diff);
321
+ }
322
+ },
323
+ });
324
+ export const getHeapSnapshotDuplicateStrings = defineTool({
325
+ name: 'get_heapsnapshot_duplicate_strings',
326
+ description: 'Loads a memory heapsnapshot and returns duplicate strings grouped by their value.',
327
+ annotations: {
328
+ category: ToolCategory.MEMORY,
329
+ readOnlyHint: true,
330
+ conditions: ['memoryDebugging'],
331
+ },
332
+ blockedByDialog: false,
333
+ verifyFilesSchema: {
334
+ filePath: true,
335
+ },
336
+ schema: {
337
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
338
+ pageIdx: zod.number().optional().describe('The page index for pagination.'),
339
+ pageSize: zod.number().optional().describe('The page size for pagination.'),
340
+ },
341
+ handler: async (request, response, context) => {
342
+ const duplicateStrings = await context.getHeapSnapshotDuplicateStrings(request.params.filePath);
343
+ response.setHeapSnapshotDuplicateStrings(duplicateStrings, {
344
+ pageIdx: request.params.pageIdx,
345
+ pageSize: request.params.pageSize,
346
+ });
347
+ },
348
+ });
349
+ export const getHeapSnapshotObjectDetails = defineTool({
350
+ name: 'get_heapsnapshot_object_details',
351
+ description: 'Loads a memory heapsnapshot and returns detailed information about a specific object by its node ID, including size, type, distance, and DOM detachedness.',
352
+ annotations: {
353
+ category: ToolCategory.MEMORY,
354
+ readOnlyHint: true,
355
+ conditions: ['memoryDebugging'],
356
+ },
357
+ blockedByDialog: false,
358
+ verifyFilesSchema: {
359
+ filePath: true,
360
+ },
361
+ schema: {
362
+ filePath: zod.string().describe('A path to a .heapsnapshot file to read.'),
363
+ nodeId: zod.number().describe('The node ID to get object details for.'),
364
+ },
365
+ handler: async (request, response, context) => {
366
+ const objectInfo = await context.getHeapSnapshotObjectDetails(request.params.filePath, request.params.nodeId);
367
+ response.setHeapSnapshotObjectDetails(objectInfo);
368
+ },
369
+ });
106
370
  //# sourceMappingURL=memory.js.map
@@ -29,7 +29,7 @@ const FILTERABLE_RESOURCE_TYPES = [
29
29
  ];
30
30
  export const listNetworkRequests = definePageTool({
31
31
  name: 'list_network_requests',
32
- description: `List all requests for the currently selected page since the last navigation.`,
32
+ description: `Lists the most recent requests for the currently selected page since the last navigation.`,
33
33
  annotations: {
34
34
  category: ToolCategory.NETWORK,
35
35
  readOnlyHint: true,
@@ -58,11 +58,12 @@ export const listNetworkRequests = definePageTool({
58
58
  .describe('Set to true to return the preserved requests over the last 3 navigations.'),
59
59
  },
60
60
  blockedByDialog: false,
61
- handler: async (request, response, context) => {
61
+ verifyFilesSchema: {},
62
+ handler: async (request, response) => {
62
63
  const data = await request.page.getDevToolsData();
63
64
  response.attachDevToolsData(data);
64
65
  const reqid = data?.cdpRequestId
65
- ? context.resolveCdpRequestId(request.page, data.cdpRequestId)
66
+ ? request.page.resolveCdpRequestId(data.cdpRequestId)
66
67
  : undefined;
67
68
  response.setIncludeNetworkRequests(true, {
68
69
  pageSize: request.params.pageSize,
@@ -95,9 +96,11 @@ export const getNetworkRequest = definePageTool({
95
96
  .describe('The absolute or relative path to a .network-response file to save the response body to. If omitted, the body is returned inline.'),
96
97
  },
97
98
  blockedByDialog: true,
98
- handler: async (request, response, context) => {
99
- context.validatePath(request.params.requestFilePath);
100
- context.validatePath(request.params.responseFilePath);
99
+ verifyFilesSchema: {
100
+ requestFilePath: true,
101
+ responseFilePath: true,
102
+ },
103
+ handler: async (request, response) => {
101
104
  if (request.params.reqid) {
102
105
  response.attachNetworkRequest(request.params.reqid, {
103
106
  requestFilePath: request.params.requestFilePath,
@@ -108,7 +111,7 @@ export const getNetworkRequest = definePageTool({
108
111
  const data = await request.page.getDevToolsData();
109
112
  response.attachDevToolsData(data);
110
113
  const reqid = data?.cdpRequestId
111
- ? context.resolveCdpRequestId(request.page, data.cdpRequestId)
114
+ ? request.page.resolveCdpRequestId(data.cdpRequestId)
112
115
  : undefined;
113
116
  if (reqid) {
114
117
  response.attachNetworkRequest(reqid, {