chrome-devtools-mcp-for-extension 0.5.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 (410) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +268 -0
  3. package/build/node_modules/chrome-devtools-frontend/LICENSE +27 -0
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/App.js +4 -0
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/AppProvider.js +17 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +43 -0
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/CharacterIdMap.js +27 -0
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +2029 -0
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +330 -0
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorUtils.js +221 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +86 -0
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +14 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/EventTarget.js +14 -0
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +64 -0
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/JavaScriptMetaData.js +4 -0
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Lazy.js +29 -0
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +34 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +20 -0
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Mutex.js +49 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +86 -0
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +459 -0
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Progress.js +144 -0
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/QueryParamHandler.js +4 -0
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResolverBase.js +69 -0
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +506 -0
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +13 -0
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +159 -0
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Runnable.js +24 -0
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +79 -0
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SettingRegistration.js +164 -0
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +1252 -0
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SimpleHistoryManager.js +97 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +17 -0
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/TextDictionary.js +40 -0
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +71 -0
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Trie.js +127 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Worker.js +44 -0
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +44 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +415 -0
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +186 -0
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +510 -0
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +66 -0
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +59 -0
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +232 -0
  45. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +957 -0
  46. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +12 -0
  47. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +60 -0
  48. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +199 -0
  49. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Brand.js +4 -0
  50. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Constructor.js +4 -0
  51. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +122 -0
  52. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DateUtilities.js +13 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DevToolsPath.js +27 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/KeyboardUtilities.js +21 -0
  55. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MapUtilities.js +79 -0
  56. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MimeType.js +143 -0
  57. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/NumberUtilities.js +72 -0
  58. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +536 -0
  59. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Timing.js +9 -0
  60. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypedArrayUtilities.js +157 -0
  61. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypescriptUtilities.js +24 -0
  62. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UIString.js +4 -0
  63. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UserVisibleError.js +22 -0
  64. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +26 -0
  65. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +802 -0
  66. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/NodeURL.js +31 -0
  67. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +13 -0
  68. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +4 -0
  69. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +5 -0
  70. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AccessibilityModel.js +281 -0
  71. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +846 -0
  72. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AutofillModel.js +155 -0
  73. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUProfilerModel.js +99 -0
  74. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +220 -0
  75. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSContainerQuery.js +98 -0
  76. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSFontFace.js +31 -0
  77. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSLayer.js +22 -0
  78. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +1284 -0
  79. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMedia.js +100 -0
  80. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +1518 -0
  81. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +902 -0
  82. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +315 -0
  83. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +572 -0
  84. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +1336 -0
  85. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSQuery.js +53 -0
  86. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +361 -0
  87. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSScope.js +22 -0
  88. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +275 -0
  89. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleSheetHeader.js +166 -0
  90. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSSupports.js +24 -0
  91. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CategorizedBreakpoint.js +29 -0
  92. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +232 -0
  93. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CompilerSourceMappingContentProvider.js +47 -0
  94. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +242 -0
  95. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +629 -0
  96. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModelTypes.js +14 -0
  97. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +241 -0
  98. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +198 -0
  99. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieParser.js +163 -0
  100. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMDebuggerModel.js +597 -0
  101. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +1610 -0
  102. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1231 -0
  103. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EmulationModel.js +527 -0
  104. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +350 -0
  105. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +125 -0
  106. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameAssociated.js +4 -0
  107. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameManager.js +199 -0
  108. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +130 -0
  109. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +73 -0
  110. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +83 -0
  111. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +208 -0
  112. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IssuesModel.js +41 -0
  113. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LayerTreeBase.js +95 -0
  114. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LogModel.js +34 -0
  115. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +1916 -0
  116. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +1668 -0
  117. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayColorGenerator.js +48 -0
  118. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +765 -0
  119. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayPersistentHighlighter.js +384 -0
  120. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageLoad.js +25 -0
  121. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +300 -0
  122. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PaintProfiler.js +67 -0
  123. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PerformanceMetricsModel.js +62 -0
  124. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +563 -0
  125. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +286 -0
  126. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingObject.js +4 -0
  127. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +905 -0
  128. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Resource.js +163 -0
  129. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +922 -0
  130. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RuntimeModel.js +535 -0
  131. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SDKModel.js +45 -0
  132. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +174 -0
  133. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +395 -0
  134. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SecurityOriginManager.js +54 -0
  135. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEvents.js +67 -0
  136. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +110 -0
  137. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerTiming.js +216 -0
  138. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerCacheModel.js +271 -0
  139. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerManager.js +511 -0
  140. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +651 -0
  141. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +41 -0
  142. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapFunctionRanges.js +132 -0
  143. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +189 -0
  144. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopeChainEntry.js +156 -0
  145. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +276 -0
  146. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageBucketsModel.js +143 -0
  147. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageKeyManager.js +53 -0
  148. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +262 -0
  149. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +386 -0
  150. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +52 -0
  151. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/WebAuthnModel.js +66 -0
  152. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +1117 -0
  153. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +89 -0
  154. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1513 -0
  155. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +339 -0
  156. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +1561 -0
  157. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +7514 -0
  158. package/build/node_modules/chrome-devtools-frontend/front_end/generated/protocol.js +4 -0
  159. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +262 -0
  160. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +979 -0
  161. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +613 -0
  162. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/UnitFormatters.js +139 -0
  163. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +372 -0
  164. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +132 -0
  165. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +105 -0
  166. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +243 -0
  167. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +407 -0
  168. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ContentProviderBasedProject.js +130 -0
  169. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +992 -0
  170. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +574 -0
  171. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DefaultScriptMapping.js +112 -0
  172. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/FileUtils.js +186 -0
  173. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/LiveLocation.js +60 -0
  174. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/NetworkProject.js +107 -0
  175. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/PresentationConsoleMessageHelper.js +244 -0
  176. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +473 -0
  177. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +399 -0
  178. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceUtils.js +87 -0
  179. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +181 -0
  180. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/StylesSourceMapping.js +268 -0
  181. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/TempFile.js +55 -0
  182. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/bindings.js +20 -0
  183. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +514 -0
  184. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +90 -0
  185. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/cpu_profile.js +6 -0
  186. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +283 -0
  187. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/crux-manager.js +4 -0
  188. package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +775 -0
  189. package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +1706 -0
  190. package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/emulation.js +6 -0
  191. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +131 -0
  192. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/ScriptFormatter.js +77 -0
  193. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/formatter.js +6 -0
  194. package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/GeometryImpl.js +347 -0
  195. package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/geometry.js +4 -0
  196. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/LogManager.js +67 -0
  197. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +494 -0
  198. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/RequestResolver.js +49 -0
  199. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs-meta.js +73 -0
  200. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs.js +7 -0
  201. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/Calculator.js +4 -0
  202. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/NetworkTimeCalculator.js +256 -0
  203. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +120 -0
  204. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/network_time_calculator.js +6 -0
  205. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +626 -0
  206. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/ScopeChainModel.js +59 -0
  207. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/ScopeTreeCache.js +32 -0
  208. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +7 -0
  209. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +4 -0
  210. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +67 -0
  211. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +97 -0
  212. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +113 -0
  213. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace.js +5 -0
  214. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace_impl.js +7 -0
  215. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/CodeMirrorUtils.js +32 -0
  216. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentData.js +173 -0
  217. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentProvider.js +30 -0
  218. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StaticContentProvider.js +32 -0
  219. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StreamingContentData.js +79 -0
  220. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/Text.js +69 -0
  221. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextCursor.js +35 -0
  222. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextRange.js +231 -0
  223. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextUtils.js +355 -0
  224. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/WasmDisassembly.js +68 -0
  225. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/text_utils.js +14 -0
  226. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EntityMapper.js +122 -0
  227. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +81 -0
  228. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +370 -0
  229. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +166 -0
  230. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Name.js +114 -0
  231. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +555 -0
  232. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +815 -0
  233. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/FilmStrip.js +44 -0
  234. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/MainThreadActivity.js +76 -0
  235. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ScriptDuplication.js +162 -0
  236. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/StackTraceForEvent.js +191 -0
  237. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ThirdParties.js +118 -0
  238. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceFilter.js +50 -0
  239. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +592 -0
  240. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +10 -0
  241. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationFramesHandler.js +109 -0
  242. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationHandler.js +26 -0
  243. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AsyncJSCallsHandler.js +187 -0
  244. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AuctionWorkletsHandler.js +162 -0
  245. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/DOMStatsHandler.js +21 -0
  246. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ExtensionTraceDataHandler.js +263 -0
  247. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FlowsHandler.js +148 -0
  248. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +483 -0
  249. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/GPUHandler.js +35 -0
  250. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ImagePaintingHandler.js +147 -0
  251. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InitiatorsHandler.js +180 -0
  252. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InvalidationsHandler.js +126 -0
  253. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +85 -0
  254. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestTextPaintHandler.js +27 -0
  255. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayerTreeHandler.js +103 -0
  256. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +445 -0
  257. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MemoryHandler.js +21 -0
  258. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +401 -0
  259. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ModelHandlers.js +33 -0
  260. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +540 -0
  261. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageFramesHandler.js +42 -0
  262. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +349 -0
  263. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/RendererHandler.js +346 -0
  264. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +207 -0
  265. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScreenshotsHandler.js +97 -0
  266. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +251 -0
  267. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SelectorStatsHandler.js +71 -0
  268. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/Threads.js +101 -0
  269. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +317 -0
  270. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +183 -0
  271. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WarningsHandler.js +134 -0
  272. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WorkersHandler.js +33 -0
  273. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/handlers.js +7 -0
  274. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +163 -0
  275. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/types.js +1 -0
  276. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Extensions.js +41 -0
  277. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Network.js +102 -0
  278. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SamplesIntegrator.js +495 -0
  279. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SyntheticEvents.js +74 -0
  280. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +184 -0
  281. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +806 -0
  282. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/TreeHelpers.js +254 -0
  283. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/helpers.js +10 -0
  284. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +488 -0
  285. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +208 -0
  286. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +340 -0
  287. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +180 -0
  288. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +257 -0
  289. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +89 -0
  290. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +81 -0
  291. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +160 -0
  292. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +117 -0
  293. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +262 -0
  294. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +188 -0
  295. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +182 -0
  296. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +88 -0
  297. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Models.js +21 -0
  298. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +199 -0
  299. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +544 -0
  300. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +191 -0
  301. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +135 -0
  302. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Statistics.js +92 -0
  303. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +97 -0
  304. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +101 -0
  305. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/insights.js +9 -0
  306. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/types.js +18 -0
  307. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/LanternError.js +6 -0
  308. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/NetworkAnalyzer.js +488 -0
  309. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/core.js +5 -0
  310. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/BaseNode.js +276 -0
  311. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/CPUNode.js +63 -0
  312. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/NetworkNode.js +82 -0
  313. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/PageDependencyGraph.js +551 -0
  314. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/graph.js +7 -0
  315. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/lantern.js +9 -0
  316. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/FirstContentfulPaint.js +136 -0
  317. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Interactive.js +67 -0
  318. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/LargestContentfulPaint.js +68 -0
  319. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/MaxPotentialFID.js +48 -0
  320. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Metric.js +68 -0
  321. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/SpeedIndex.js +101 -0
  322. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TBTUtils.js +64 -0
  323. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TotalBlockingTime.js +78 -0
  324. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/metrics.js +11 -0
  325. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/ConnectionPool.js +115 -0
  326. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Constants.js +42 -0
  327. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/DNSCache.js +47 -0
  328. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/SimulationTimingMap.js +134 -0
  329. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Simulator.js +450 -0
  330. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/TCPConnection.js +154 -0
  331. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/simulation.js +9 -0
  332. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/Lantern.js +24 -0
  333. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/types.js +4 -0
  334. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/trace.js +17 -0
  335. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Configuration.js +18 -0
  336. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Extensions.js +37 -0
  337. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/File.js +57 -0
  338. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Overlays.js +4 -0
  339. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Timing.js +15 -0
  340. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +574 -0
  341. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/types.js +9 -0
  342. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +201 -0
  343. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/trace_source_maps_resolver.js +4 -0
  344. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/FileManager.js +64 -0
  345. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +511 -0
  346. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/SearchConfig.js +113 -0
  347. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +563 -0
  348. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +204 -0
  349. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace.js +9 -0
  350. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/codemirror.next/codemirror.next.js +1 -0
  351. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/LICENSE +202 -0
  352. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/legacy-javascript.js +2 -0
  353. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +940 -0
  354. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/LICENSE +26 -0
  355. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.js +196 -0
  356. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.js +226 -0
  357. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
  358. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +394 -0
  359. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.js +24 -0
  360. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +283 -0
  361. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/mod.js +7 -0
  362. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/util.js +9 -0
  363. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/vlq.js +84 -0
  364. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/source-map-scopes-codec.js +4 -0
  365. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/LICENSE +20 -0
  366. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/lib/nostats-subset.js +146 -0
  367. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +2 -0
  368. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-subset.js +2 -0
  369. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +118 -0
  370. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +40 -0
  371. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/entities.test.js +26 -0
  372. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.js +4 -0
  373. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.test.js +215 -0
  374. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +4 -0
  375. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +4 -0
  376. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +4 -0
  377. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/nostats-subset.js +2 -0
  378. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/third-party-web.js +2 -0
  379. package/build/src/McpContext.js +283 -0
  380. package/build/src/McpResponse.js +223 -0
  381. package/build/src/Mutex.js +40 -0
  382. package/build/src/PageCollector.js +68 -0
  383. package/build/src/WaitForHelper.js +134 -0
  384. package/build/src/browser.js +493 -0
  385. package/build/src/cli.js +156 -0
  386. package/build/src/formatters/consoleFormatter.js +73 -0
  387. package/build/src/formatters/networkFormatter.js +34 -0
  388. package/build/src/formatters/snapshotFormatter.js +75 -0
  389. package/build/src/index.js +13 -0
  390. package/build/src/logger.js +27 -0
  391. package/build/src/main.js +139 -0
  392. package/build/src/system-profile.js +181 -0
  393. package/build/src/tools/ToolDefinition.js +9 -0
  394. package/build/src/tools/bookmarks.js +310 -0
  395. package/build/src/tools/categories.js +15 -0
  396. package/build/src/tools/console.js +19 -0
  397. package/build/src/tools/emulation.js +61 -0
  398. package/build/src/tools/extensions.js +184 -0
  399. package/build/src/tools/input.js +201 -0
  400. package/build/src/tools/network.js +77 -0
  401. package/build/src/tools/pages.js +188 -0
  402. package/build/src/tools/performance.js +145 -0
  403. package/build/src/tools/screenshot.js +65 -0
  404. package/build/src/tools/script.js +57 -0
  405. package/build/src/tools/snapshot.js +42 -0
  406. package/build/src/tools/webstore-auto-screenshot.js +159 -0
  407. package/build/src/tools/webstore-submission.js +332 -0
  408. package/build/src/trace-processing/parse.js +93 -0
  409. package/build/src/utils/pagination.js +49 -0
  410. package/package.json +79 -0
@@ -0,0 +1,134 @@
1
+ import { logger } from './logger.js';
2
+ export class WaitForHelper {
3
+ #abortController = new AbortController();
4
+ #page;
5
+ #stableDomTimeout;
6
+ #stableDomFor;
7
+ #expectNavigationIn;
8
+ #navigationTimeout;
9
+ constructor(page, cpuTimeoutMultiplier, networkTimeoutMultiplier) {
10
+ this.#stableDomTimeout = 3000 * cpuTimeoutMultiplier;
11
+ this.#stableDomFor = 100 * cpuTimeoutMultiplier;
12
+ this.#expectNavigationIn = 100 * cpuTimeoutMultiplier;
13
+ this.#navigationTimeout = 3000 * networkTimeoutMultiplier;
14
+ this.#page = page;
15
+ }
16
+ /**
17
+ * A wrapper that executes a action and waits for
18
+ * a potential navigation, after which it waits
19
+ * for the DOM to be stable before returning.
20
+ */
21
+ async waitForStableDom() {
22
+ const stableDomObserver = await this.#page.evaluateHandle(timeout => {
23
+ let timeoutId;
24
+ function callback() {
25
+ clearTimeout(timeoutId);
26
+ timeoutId = setTimeout(() => {
27
+ domObserver.resolver.resolve();
28
+ domObserver.observer.disconnect();
29
+ }, timeout);
30
+ }
31
+ const domObserver = {
32
+ resolver: Promise.withResolvers(),
33
+ observer: new MutationObserver(callback),
34
+ };
35
+ // It's possible that the DOM is not gonna change so we
36
+ // need to start the timeout initially.
37
+ callback();
38
+ domObserver.observer.observe(document.body, {
39
+ childList: true,
40
+ subtree: true,
41
+ attributes: true,
42
+ });
43
+ return domObserver;
44
+ }, this.#stableDomFor);
45
+ this.#abortController.signal.addEventListener('abort', async () => {
46
+ try {
47
+ await stableDomObserver.evaluate(observer => {
48
+ observer.observer.disconnect();
49
+ observer.resolver.resolve();
50
+ });
51
+ await stableDomObserver.dispose();
52
+ }
53
+ catch {
54
+ // Ignored cleanup errors
55
+ }
56
+ });
57
+ return Promise.race([
58
+ stableDomObserver.evaluate(async (observer) => {
59
+ return await observer.resolver.promise;
60
+ }),
61
+ this.timeout(this.#stableDomTimeout).then(() => {
62
+ throw new Error('Timeout');
63
+ }),
64
+ ]);
65
+ }
66
+ async waitForNavigationStarted() {
67
+ // Currently Puppeteer does not have API
68
+ // For when a navigation is about to start
69
+ const navigationStartedPromise = new Promise(resolve => {
70
+ const listener = (event) => {
71
+ if ([
72
+ 'historySameDocument',
73
+ 'historyDifferentDocument',
74
+ 'sameDocument',
75
+ ].includes(event.navigationType)) {
76
+ resolve(false);
77
+ return;
78
+ }
79
+ resolve(true);
80
+ };
81
+ this.#page._client().on('Page.frameStartedNavigating', listener);
82
+ this.#abortController.signal.addEventListener('abort', () => {
83
+ resolve(false);
84
+ this.#page._client().off('Page.frameStartedNavigating', listener);
85
+ });
86
+ });
87
+ return await Promise.race([
88
+ navigationStartedPromise,
89
+ this.timeout(this.#expectNavigationIn).then(() => false),
90
+ ]);
91
+ }
92
+ timeout(time) {
93
+ return new Promise(res => {
94
+ const id = setTimeout(res, time);
95
+ this.#abortController.signal.addEventListener('abort', () => {
96
+ res();
97
+ clearTimeout(id);
98
+ });
99
+ });
100
+ }
101
+ async waitForEventsAfterAction(action) {
102
+ const navigationFinished = this.waitForNavigationStarted()
103
+ .then(navigationStated => {
104
+ if (navigationStated) {
105
+ return this.#page.waitForNavigation({
106
+ timeout: this.#navigationTimeout,
107
+ signal: this.#abortController.signal,
108
+ });
109
+ }
110
+ return;
111
+ })
112
+ .catch(error => logger(error));
113
+ try {
114
+ await action();
115
+ }
116
+ catch (error) {
117
+ // Clear up pending promises
118
+ this.#abortController.abort();
119
+ throw error;
120
+ }
121
+ try {
122
+ await navigationFinished;
123
+ // Wait for stable dom after navigation so we execute in
124
+ // the correct context
125
+ await this.waitForStableDom();
126
+ }
127
+ catch (error) {
128
+ logger(error);
129
+ }
130
+ finally {
131
+ this.#abortController.abort();
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,493 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs';
7
+ import { promises as fsPromises } from 'node:fs';
8
+ import os from 'node:os';
9
+ import path from 'node:path';
10
+ import puppeteer from 'puppeteer-core';
11
+ import { detectSystemChromeProfile, detectAnySystemChromeProfile, } from './system-profile.js';
12
+ let browser;
13
+ const ignoredPrefixes = new Set([
14
+ 'chrome://',
15
+ 'chrome-extension://',
16
+ 'chrome-untrusted://',
17
+ 'devtools://',
18
+ ]);
19
+ function targetFilter(target) {
20
+ if (target.url() === 'chrome://newtab/') {
21
+ return true;
22
+ }
23
+ for (const prefix of ignoredPrefixes) {
24
+ if (target.url().startsWith(prefix)) {
25
+ return false;
26
+ }
27
+ }
28
+ return true;
29
+ }
30
+ const connectOptions = {
31
+ targetFilter,
32
+ // We do not expect any single CDP command to take more than 10sec.
33
+ protocolTimeout: 10_000,
34
+ };
35
+ async function ensureBrowserConnected(browserURL) {
36
+ if (browser?.connected) {
37
+ return browser;
38
+ }
39
+ browser = await puppeteer.connect({
40
+ ...connectOptions,
41
+ browserURL,
42
+ defaultViewport: null,
43
+ });
44
+ return browser;
45
+ }
46
+ function scanExtensionsDirectory(extensionsDir) {
47
+ const extensionPaths = [];
48
+ try {
49
+ if (!fs.existsSync(extensionsDir)) {
50
+ console.warn(`Extensions directory not found: ${extensionsDir}`);
51
+ return extensionPaths;
52
+ }
53
+ const entries = fs.readdirSync(extensionsDir, { withFileTypes: true });
54
+ for (const entry of entries) {
55
+ if (entry.isDirectory()) {
56
+ const extensionPath = path.join(extensionsDir, entry.name);
57
+ const manifestPath = path.join(extensionPath, 'manifest.json');
58
+ // First, check if manifest.json exists in the root directory
59
+ if (fs.existsSync(manifestPath)) {
60
+ try {
61
+ const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
62
+ const manifest = JSON.parse(manifestContent);
63
+ if (manifest.manifest_version) {
64
+ extensionPaths.push(extensionPath);
65
+ console.error(`Found extension: ${entry.name} (v${manifest.version || 'unknown'})`);
66
+ }
67
+ }
68
+ catch (error) {
69
+ console.warn(`Invalid manifest.json in ${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
70
+ }
71
+ }
72
+ else {
73
+ // If not found in root, check common subdirectories
74
+ const subDirs = ['extension', 'dist', 'dist-simple', 'build', 'src'];
75
+ for (const subDir of subDirs) {
76
+ const subPath = path.join(extensionPath, subDir);
77
+ const subManifestPath = path.join(subPath, 'manifest.json');
78
+ if (fs.existsSync(subManifestPath)) {
79
+ try {
80
+ const manifestContent = fs.readFileSync(subManifestPath, 'utf-8');
81
+ const manifest = JSON.parse(manifestContent);
82
+ if (manifest.manifest_version) {
83
+ extensionPaths.push(subPath);
84
+ console.error(`Found extension: ${entry.name}/${subDir} (v${manifest.version || 'unknown'})`);
85
+ break; // Use the first valid subdirectory found
86
+ }
87
+ }
88
+ catch (error) {
89
+ console.warn(`Invalid manifest.json in ${entry.name}/${subDir}: ${error instanceof Error ? error.message : String(error)}`);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ console.error(`Scanned ${extensionsDir}: found ${extensionPaths.length} valid extensions`);
97
+ }
98
+ catch (error) {
99
+ console.error(`Error scanning extensions directory ${extensionsDir}: ${error instanceof Error ? error.message : String(error)}`);
100
+ }
101
+ return extensionPaths;
102
+ }
103
+ /**
104
+ * Get the Chrome extensions directory path for the current platform
105
+ */
106
+ function getChromeExtensionsDirectory(channel) {
107
+ const homeDir = os.homedir();
108
+ const platform = os.platform();
109
+ let chromeDataPath;
110
+ let profileName = 'Default';
111
+ if (platform === 'darwin') {
112
+ // macOS
113
+ chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome');
114
+ if (channel === 'canary') {
115
+ chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Canary');
116
+ }
117
+ else if (channel === 'beta') {
118
+ chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Beta');
119
+ }
120
+ else if (channel === 'dev') {
121
+ chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Dev');
122
+ }
123
+ }
124
+ else if (platform === 'win32') {
125
+ // Windows
126
+ chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome', 'User Data');
127
+ if (channel === 'canary') {
128
+ chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome SxS', 'User Data');
129
+ }
130
+ else if (channel === 'beta') {
131
+ chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Beta', 'User Data');
132
+ }
133
+ else if (channel === 'dev') {
134
+ chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Dev', 'User Data');
135
+ }
136
+ }
137
+ else {
138
+ // Linux
139
+ chromeDataPath = path.join(homeDir, '.config', 'google-chrome');
140
+ if (channel === 'canary') {
141
+ chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
142
+ }
143
+ else if (channel === 'beta') {
144
+ chromeDataPath = path.join(homeDir, '.config', 'google-chrome-beta');
145
+ }
146
+ else if (channel === 'dev') {
147
+ chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
148
+ }
149
+ }
150
+ return path.join(chromeDataPath, profileName, 'Extensions');
151
+ }
152
+ function validateExtensionManifest(manifestPath) {
153
+ try {
154
+ if (!fs.existsSync(manifestPath)) {
155
+ return null;
156
+ }
157
+ const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
158
+ const manifest = JSON.parse(manifestContent);
159
+ // Basic validation
160
+ if (!manifest.manifest_version || !manifest.name || !manifest.version) {
161
+ return null;
162
+ }
163
+ // Ensure it's a valid manifest version (2 or 3)
164
+ if (manifest.manifest_version !== 2 && manifest.manifest_version !== 3) {
165
+ return null;
166
+ }
167
+ return manifest;
168
+ }
169
+ catch (error) {
170
+ console.warn(`Invalid manifest.json at ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
171
+ return null;
172
+ }
173
+ }
174
+ /**
175
+ * Discover Chrome extensions installed in the system
176
+ */
177
+ function discoverSystemExtensions(channel) {
178
+ const extensionPaths = [];
179
+ const extensionsDir = getChromeExtensionsDirectory(channel);
180
+ console.error(`🔍 Discovering system Chrome extensions in: ${extensionsDir}`);
181
+ try {
182
+ if (!fs.existsSync(extensionsDir)) {
183
+ console.warn(`System Chrome extensions directory not found: ${extensionsDir}`);
184
+ return extensionPaths;
185
+ }
186
+ const extensionIds = fs.readdirSync(extensionsDir, { withFileTypes: true });
187
+ for (const extensionEntry of extensionIds) {
188
+ if (!extensionEntry.isDirectory())
189
+ continue;
190
+ const extensionIdPath = path.join(extensionsDir, extensionEntry.name);
191
+ try {
192
+ // Each extension ID directory contains version subdirectories
193
+ const versions = fs.readdirSync(extensionIdPath, { withFileTypes: true });
194
+ // Find the latest/most recent version
195
+ let latestVersion = '';
196
+ let latestPath = '';
197
+ for (const versionEntry of versions) {
198
+ if (!versionEntry.isDirectory())
199
+ continue;
200
+ const versionPath = path.join(extensionIdPath, versionEntry.name);
201
+ const manifestPath = path.join(versionPath, 'manifest.json');
202
+ const manifest = validateExtensionManifest(manifestPath);
203
+ if (manifest) {
204
+ // Use the first valid version found (Chrome keeps the latest active)
205
+ if (!latestVersion || versionEntry.name > latestVersion) {
206
+ latestVersion = versionEntry.name;
207
+ latestPath = versionPath;
208
+ }
209
+ }
210
+ }
211
+ if (latestPath && latestVersion) {
212
+ const manifest = validateExtensionManifest(path.join(latestPath, 'manifest.json'));
213
+ if (manifest) {
214
+ extensionPaths.push(latestPath);
215
+ console.error(` ✅ Found: ${manifest.name} v${manifest.version} (Manifest v${manifest.manifest_version})`);
216
+ }
217
+ }
218
+ }
219
+ catch (error) {
220
+ console.warn(`Error processing extension ${extensionEntry.name}: ${error instanceof Error ? error.message : String(error)}`);
221
+ }
222
+ }
223
+ console.error(`📦 System extension discovery complete: ${extensionPaths.length} valid extensions found`);
224
+ }
225
+ catch (error) {
226
+ console.error(`Error discovering system extensions: ${error instanceof Error ? error.message : String(error)}`);
227
+ }
228
+ return extensionPaths;
229
+ }
230
+ export async function launch(options) {
231
+ const { channel, executablePath, customDevTools, headless, isolated, loadExtension, loadExtensionsDir, loadSystemExtensions, } = options;
232
+ const profileDirName = channel && channel !== 'stable'
233
+ ? `chrome-profile-${channel}`
234
+ : 'chrome-profile';
235
+ let userDataDir = options.userDataDir;
236
+ let usingSystemProfile = false;
237
+ if (!isolated && !userDataDir) {
238
+ // Try to use system Chrome profile directly
239
+ const systemProfile = detectSystemChromeProfile(channel) || detectAnySystemChromeProfile();
240
+ if (systemProfile) {
241
+ // Use system profile directly for better user experience
242
+ userDataDir = systemProfile.path;
243
+ usingSystemProfile = true;
244
+ console.error(`✅ Using system Chrome profile: ${systemProfile.channel}`);
245
+ console.error(` Path: ${userDataDir}`);
246
+ console.error(` ⚠️ Note: Close regular Chrome if you encounter issues`);
247
+ }
248
+ else {
249
+ // Fallback to isolated profile if no system Chrome found
250
+ userDataDir = path.join(os.homedir(), '.cache', 'chrome-devtools-mcp', profileDirName);
251
+ await fs.promises.mkdir(userDataDir, {
252
+ recursive: true,
253
+ });
254
+ console.error(`📁 Using isolated profile (no system Chrome found)`);
255
+ }
256
+ }
257
+ const args = [
258
+ '--hide-crash-restore-bubble',
259
+ '--profile-directory=Default', // Ensure we use the Default profile
260
+ ];
261
+ if (customDevTools) {
262
+ args.push(`--custom-devtools-frontend=file://${customDevTools}`);
263
+ }
264
+ // Collect all extension paths
265
+ const extensionPaths = [];
266
+ if (loadExtension) {
267
+ // Validate single extension path
268
+ if (fs.existsSync(loadExtension)) {
269
+ const manifestPath = path.join(loadExtension, 'manifest.json');
270
+ if (fs.existsSync(manifestPath)) {
271
+ try {
272
+ const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
273
+ const manifest = JSON.parse(manifestContent);
274
+ if (manifest.manifest_version) {
275
+ extensionPaths.push(loadExtension);
276
+ console.error(`✅ Single extension validated: ${loadExtension}`);
277
+ }
278
+ else {
279
+ console.error(`❌ Invalid manifest.json in ${loadExtension}: missing manifest_version`);
280
+ }
281
+ }
282
+ catch (error) {
283
+ console.error(`❌ Invalid manifest.json in ${loadExtension}: ${error instanceof Error ? error.message : String(error)}`);
284
+ }
285
+ }
286
+ else {
287
+ console.error(`❌ Extension path missing manifest.json: ${loadExtension}`);
288
+ }
289
+ }
290
+ else {
291
+ console.error(`❌ Extension path does not exist: ${loadExtension}`);
292
+ }
293
+ }
294
+ if (loadExtensionsDir) {
295
+ const scannedExtensions = scanExtensionsDirectory(loadExtensionsDir);
296
+ extensionPaths.push(...scannedExtensions);
297
+ }
298
+ // System extension discovery
299
+ if (loadSystemExtensions) {
300
+ const systemExtensions = discoverSystemExtensions(channel);
301
+ if (systemExtensions.length > 0) {
302
+ extensionPaths.push(...systemExtensions);
303
+ console.error(`🔗 Integrated ${systemExtensions.length} system extensions with development extensions`);
304
+ }
305
+ else {
306
+ console.warn(`⚠️ No system extensions found or accessible`);
307
+ }
308
+ }
309
+ if (extensionPaths.length > 0) {
310
+ args.push(`--load-extension=${extensionPaths.join(',')}`);
311
+ args.push('--enable-experimental-extension-apis');
312
+ // Fix for Chrome 137+ where --load-extension is disabled by default
313
+ args.push('--disable-features=DisableLoadExtensionCommandLineSwitch');
314
+ console.error(`Loading ${extensionPaths.length} Chrome extension(s):`);
315
+ extensionPaths.forEach((path, index) => {
316
+ console.error(` ${index + 1}. ${path}`);
317
+ });
318
+ console.error(`Chrome args will include: --load-extension=${extensionPaths.join(',')}`);
319
+ console.error('Applied Chrome 137+ extension loading fix');
320
+ }
321
+ // Add Google login automation detection bypass
322
+ args.push('--disable-blink-features=AutomationControlled');
323
+ console.error('Added Google login bypass: --disable-blink-features=AutomationControlled');
324
+ let puppeterChannel;
325
+ if (!executablePath) {
326
+ puppeterChannel =
327
+ channel && channel !== 'stable'
328
+ ? `chrome-${channel}`
329
+ : 'chrome';
330
+ }
331
+ // Log complete Chrome configuration before launch
332
+ console.error('Chrome Launch Configuration:');
333
+ console.error(` Channel: ${puppeterChannel || 'default'}`);
334
+ console.error(` Executable: ${executablePath || 'auto-detected'}`);
335
+ console.error(` User Data Dir: ${userDataDir || 'temporary'}`);
336
+ console.error(` Profile Type: ${usingSystemProfile ? 'System Profile (auto-detected)' : 'Custom Profile'}`);
337
+ console.error(` Headless: ${headless}`);
338
+ console.error(` Args: ${JSON.stringify(args, null, 2)}`);
339
+ console.error(` Ignored Default Args: ${extensionPaths.length > 0 ? '["--disable-extensions"]' : 'none'}`);
340
+ try {
341
+ const browser = await puppeteer.launch({
342
+ ...connectOptions,
343
+ channel: puppeterChannel,
344
+ executablePath,
345
+ defaultViewport: null,
346
+ userDataDir,
347
+ pipe: true,
348
+ headless,
349
+ args,
350
+ ignoreDefaultArgs: extensionPaths.length > 0 ? ['--disable-extensions', '--enable-automation'] : ['--enable-automation'],
351
+ });
352
+ if (options.logFile) {
353
+ // FIXME: we are probably subscribing too late to catch startup logs. We
354
+ // should expose the process earlier or expose the getRecentLogs() getter.
355
+ browser.process()?.stderr?.pipe(options.logFile);
356
+ browser.process()?.stdout?.pipe(options.logFile);
357
+ }
358
+ // Apply Google login automation detection bypass to all pages
359
+ browser.on('targetcreated', async (target) => {
360
+ if (target.type() === 'page') {
361
+ try {
362
+ const page = await target.page();
363
+ if (page) {
364
+ await page.evaluateOnNewDocument(() => {
365
+ Object.defineProperty(window.navigator, 'webdriver', {
366
+ get: () => undefined,
367
+ configurable: true
368
+ });
369
+ });
370
+ console.error('Applied navigator.webdriver bypass to new page');
371
+ }
372
+ }
373
+ catch (error) {
374
+ console.error('Failed to apply webdriver bypass:', error);
375
+ }
376
+ }
377
+ });
378
+ // Apply bypass to existing pages
379
+ const initialPages = await browser.pages();
380
+ for (const page of initialPages) {
381
+ await page.evaluateOnNewDocument(() => {
382
+ Object.defineProperty(window.navigator, 'webdriver', {
383
+ get: () => undefined,
384
+ configurable: true
385
+ });
386
+ });
387
+ console.error('Applied navigator.webdriver bypass to existing page');
388
+ }
389
+ // Verify extensions were loaded by checking chrome://extensions/
390
+ if (extensionPaths.length > 0) {
391
+ console.error('🔍 Verifying extension loading...');
392
+ try {
393
+ const pages = await browser.pages();
394
+ const page = pages[0] || await browser.newPage();
395
+ // Add a small delay to ensure Chrome is fully started
396
+ await new Promise(resolve => setTimeout(resolve, 2000));
397
+ await page.goto('chrome://extensions/', { waitUntil: 'networkidle0' });
398
+ const loadedExtensions = await page.evaluate(() => {
399
+ const extensionCards = document.querySelectorAll('extensions-item');
400
+ const results = [];
401
+ Array.from(extensionCards).forEach(card => {
402
+ const shadowRoot = card.shadowRoot;
403
+ if (shadowRoot) {
404
+ const name = shadowRoot.querySelector('#name')?.textContent?.trim() || 'Unknown';
405
+ const enabled = !shadowRoot.querySelector('#enable-toggle')?.hasAttribute('disabled');
406
+ const id = card.getAttribute('id') || 'unknown';
407
+ results.push({ name, id, enabled });
408
+ }
409
+ });
410
+ return results;
411
+ });
412
+ console.error(`✅ Extensions verification complete. Found ${loadedExtensions.length} extensions:`);
413
+ loadedExtensions.forEach((ext, index) => {
414
+ console.error(` ${index + 1}. ${ext.name} (${ext.enabled ? 'enabled' : 'disabled'}) - ID: ${ext.id}`);
415
+ });
416
+ if (loadedExtensions.length === 0) {
417
+ console.error('⚠️ No extensions found in chrome://extensions/ - this may indicate loading failure');
418
+ }
419
+ }
420
+ catch (verificationError) {
421
+ console.error(`⚠️ Extension verification failed: ${verificationError}`);
422
+ }
423
+ }
424
+ return browser;
425
+ }
426
+ catch (error) {
427
+ // When system profile is already in use, create a minimal copy for automation
428
+ if (usingSystemProfile &&
429
+ (error.message.includes('The browser is already running') ||
430
+ error.message.includes('Target closed') ||
431
+ error.message.includes('Connection closed'))) {
432
+ console.error(`⚠️ Chrome is already running with system profile.`);
433
+ console.error(`📋 Creating a temporary copy of system profile for automation...`);
434
+ // Create a temporary copy of the system profile
435
+ const tempProfileDir = path.join(os.tmpdir(), `chrome-mcp-${Date.now()}`);
436
+ try {
437
+ // Copy only essential data (bookmarks, extensions) without locking files
438
+ await fsPromises.mkdir(tempProfileDir, { recursive: true });
439
+ // Copy bookmarks if they exist
440
+ const bookmarksPath = path.join(userDataDir, 'Default', 'Bookmarks');
441
+ try {
442
+ await fsPromises.access(bookmarksPath);
443
+ const bookmarksDestDir = path.join(tempProfileDir, 'Default');
444
+ await fsPromises.mkdir(bookmarksDestDir, { recursive: true });
445
+ await fsPromises.copyFile(bookmarksPath, path.join(bookmarksDestDir, 'Bookmarks'));
446
+ console.error(`✅ Bookmarks copied from system profile`);
447
+ }
448
+ catch {
449
+ // Bookmarks don't exist or can't be accessed, skip
450
+ }
451
+ // Retry with the temporary profile by recursively calling launch
452
+ console.error(`🔄 Retrying with temporary profile copy...`);
453
+ const retryOptions = { ...options };
454
+ retryOptions.userDataDir = tempProfileDir;
455
+ return launch(retryOptions);
456
+ }
457
+ catch (copyError) {
458
+ console.error(`❌ Failed to create temporary profile copy: ${copyError}`);
459
+ // Fall through to regular error handling
460
+ }
461
+ }
462
+ // For non-system profiles, maintain the blocking behavior
463
+ if (!usingSystemProfile &&
464
+ userDataDir &&
465
+ (error.message.includes('The browser is already running') ||
466
+ error.message.includes('Target closed') ||
467
+ error.message.includes('Connection closed'))) {
468
+ throw new Error(`The browser is already running for custom profile: ${userDataDir}. Use --isolated to run multiple browser instances.`, {
469
+ cause: error,
470
+ });
471
+ }
472
+ // If system profile failed for other reasons, suggest fallback options
473
+ if (usingSystemProfile) {
474
+ console.error(`❌ Failed to launch Chrome with system profile: ${userDataDir}`);
475
+ console.error(`💡 Suggestion: Try with --isolated flag for temporary profile, or --userDataDir to specify custom location`);
476
+ }
477
+ throw error;
478
+ }
479
+ }
480
+ async function ensureBrowserLaunched(options) {
481
+ if (browser?.connected) {
482
+ return browser;
483
+ }
484
+ browser = await launch(options);
485
+ return browser;
486
+ }
487
+ export async function resolveBrowser(options) {
488
+ const browser = options.browserUrl
489
+ ? await ensureBrowserConnected(options.browserUrl)
490
+ : await ensureBrowserLaunched(options);
491
+ return browser;
492
+ }
493
+ export { scanExtensionsDirectory, discoverSystemExtensions, getChromeExtensionsDirectory, validateExtensionManifest };