chrome-ai-bridge 1.0.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.
- package/LICENSE +202 -0
- package/README.md +252 -0
- package/build/node_modules/chrome-devtools-frontend/LICENSE +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/App.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/AppProvider.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +43 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/CharacterIdMap.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +2033 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +332 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorUtils.js +221 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/EventTarget.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/JavaScriptMetaData.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Lazy.js +29 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Mutex.js +49 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +86 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +449 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Progress.js +144 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResolverBase.js +69 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +495 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +15 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +164 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Runnable.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +78 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SettingRegistration.js +164 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +1263 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SimpleHistoryManager.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/TextDictionary.js +40 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +71 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Trie.js +127 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +434 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/DispatchHttpRequestClient.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +202 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +92 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +69 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +61 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +220 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +968 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +13 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +60 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Brand.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Constructor.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DateUtilities.js +13 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DevToolsPath.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/KeyboardUtilities.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MapUtilities.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MimeType.js +143 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/NumberUtilities.js +72 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +538 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Timing.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypedArrayUtilities.js +157 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypescriptUtilities.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UIString.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UserVisibleError.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/HostRuntime.js +63 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/ConnectionTransport.js +12 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/DevToolsCDPConnection.js +138 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +539 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +8 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +54 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AccessibilityModel.js +281 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +845 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AutofillModel.js +155 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUProfilerModel.js +99 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +217 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSContainerQuery.js +98 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSFontFace.js +31 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSLayer.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +1318 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMedia.js +100 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +1532 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +908 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +312 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +574 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +1346 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSQuery.js +53 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +403 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSScope.js +22 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStartingStyle.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +275 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleSheetHeader.js +166 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSSupports.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CategorizedBreakpoint.js +29 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +236 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CompilerSourceMappingContentProvider.js +47 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +205 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +629 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModelTypes.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +241 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +198 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieParser.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMDebuggerModel.js +597 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +1635 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1216 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EmulationModel.js +527 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +364 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +127 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameAssociated.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameManager.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +130 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +75 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +80 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +208 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IssuesModel.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LayerTreeBase.js +95 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LogModel.js +34 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +2223 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +1654 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayColorGenerator.js +48 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +765 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayPersistentHighlighter.js +384 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageLoad.js +25 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +310 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PaintProfiler.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PerformanceMetricsModel.js +62 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +608 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +413 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingObject.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +908 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Resource.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +923 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RuntimeModel.js +535 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SDKModel.js +45 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScopeTreeCache.js +36 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +176 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +420 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SecurityOriginManager.js +54 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEvents.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +113 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerTiming.js +216 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerCacheModel.js +271 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerManager.js +511 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +691 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +57 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapFunctionRanges.js +132 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +201 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopeChainEntry.js +156 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +508 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageBucketsModel.js +143 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageKeyManager.js +53 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +257 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +395 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +55 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/WebAuthnModel.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +1166 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +91 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +2640 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +384 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +1532 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +7602 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/protocol.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +289 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +995 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +664 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/UnitFormatters.js +139 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +377 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +131 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +149 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +245 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +486 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ContentProviderBasedProject.js +130 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +992 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +592 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DefaultScriptMapping.js +112 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/FileUtils.js +186 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/LiveLocation.js +60 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/NetworkProject.js +107 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/PresentationConsoleMessageHelper.js +244 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +564 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +437 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceUtils.js +87 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +182 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/StylesSourceMapping.js +268 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/TempFile.js +55 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/bindings.js +20 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +516 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +89 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/cpu_profile.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +285 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/crux-manager.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +775 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +1706 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/emulation.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +145 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/ScriptFormatter.js +77 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/formatter.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/GeometryImpl.js +347 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/geometry/geometry.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/LogManager.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +494 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/RequestResolver.js +49 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs-meta.js +73 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/Calculator.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/NetworkTimeCalculator.js +256 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +122 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/network_time_calculator.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +622 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/ScopeChainModel.js +59 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +121 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/stack_trace_impl.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/CodeMirrorUtils.js +32 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentData.js +173 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentProvider.js +30 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StaticContentProvider.js +32 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StreamingContentData.js +79 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/Text.js +69 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextCursor.js +35 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextRange.js +231 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextUtils.js +355 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/WasmDisassembly.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/text_utils.js +14 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EntityMapper.js +122 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +81 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +371 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +169 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Name.js +114 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +555 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +815 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/FilmStrip.js +44 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/MainThreadActivity.js +76 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ScriptDuplication.js +162 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/StackTraceForEvent.js +191 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ThirdParties.js +118 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceFilter.js +50 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +599 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +10 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationFramesHandler.js +109 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationHandler.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AsyncJSCallsHandler.js +187 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AuctionWorkletsHandler.js +162 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/DOMStatsHandler.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ExtensionTraceDataHandler.js +263 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FlowsHandler.js +148 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +485 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/GPUHandler.js +35 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ImagePaintingHandler.js +147 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InitiatorsHandler.js +180 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InvalidationsHandler.js +126 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +85 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestTextPaintHandler.js +27 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayerTreeHandler.js +103 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +449 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MemoryHandler.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +404 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ModelHandlers.js +33 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +566 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageFramesHandler.js +42 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +349 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/RendererHandler.js +346 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +260 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScreenshotsHandler.js +97 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +276 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SelectorStatsHandler.js +71 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/Threads.js +101 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +317 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +183 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WarningsHandler.js +134 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WorkersHandler.js +33 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/handlers.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +163 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/types.js +1 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Extensions.js +41 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Network.js +102 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SamplesIntegrator.js +495 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SyntheticEvents.js +74 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +186 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +820 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/TreeHelpers.js +254 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/helpers.js +10 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +489 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +209 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +340 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +181 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +258 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +90 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +82 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +161 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +129 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +263 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +199 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +183 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +90 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Models.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +200 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +545 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +192 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +136 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Statistics.js +92 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +98 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +102 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/insights.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/types.js +18 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/LanternError.js +6 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/NetworkAnalyzer.js +488 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/core.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/BaseNode.js +276 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/CPUNode.js +63 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/NetworkNode.js +82 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/PageDependencyGraph.js +551 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/graph.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/lantern.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/FirstContentfulPaint.js +136 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Interactive.js +67 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/LargestContentfulPaint.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/MaxPotentialFID.js +48 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Metric.js +68 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/SpeedIndex.js +101 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TBTUtils.js +64 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TotalBlockingTime.js +78 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/metrics.js +11 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/ConnectionPool.js +115 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Constants.js +42 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/DNSCache.js +47 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/SimulationTimingMap.js +134 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Simulator.js +450 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/TCPConnection.js +154 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/simulation.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/Lantern.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/types.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/trace.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Configuration.js +18 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Extensions.js +37 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/File.js +57 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Overlays.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Timing.js +15 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +580 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/types.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +224 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/trace_source_maps_resolver.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/FileManager.js +64 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +504 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/SearchConfig.js +113 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +601 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +201 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace-meta.js +34 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/codemirror.next/codemirror.next.js +1 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/LICENSE +202 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/legacy-javascript.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +940 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/LICENSE +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.js +196 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.js +226 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +394 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.js +24 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +283 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/mod.js +7 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/util.js +9 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/vlq.js +84 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/source-map-scopes-codec.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/LICENSE +20 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/lib/nostats-subset.js +146 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +118 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +40 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/entities.test.js +26 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.test.js +215 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/nostats-subset.js +2 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/third-party-web.js +2 -0
- package/build/src/McpContext.js +400 -0
- package/build/src/McpResponse.js +237 -0
- package/build/src/Mutex.js +40 -0
- package/build/src/PageCollector.js +68 -0
- package/build/src/WaitForHelper.js +134 -0
- package/build/src/browser-connection-manager.js +373 -0
- package/build/src/browser.js +719 -0
- package/build/src/cli.js +120 -0
- package/build/src/client-detector.js +93 -0
- package/build/src/config.js +38 -0
- package/build/src/formatters/consoleFormatter.js +73 -0
- package/build/src/formatters/extensionsPageFormatter.js +184 -0
- package/build/src/formatters/networkFormatter.js +34 -0
- package/build/src/formatters/snapshotFormatter.js +80 -0
- package/build/src/graceful.js +125 -0
- package/build/src/index.js +13 -0
- package/build/src/logger.js +27 -0
- package/build/src/login-helper.js +431 -0
- package/build/src/main.js +268 -0
- package/build/src/plugin-api.js +189 -0
- package/build/src/profile-migration.js +82 -0
- package/build/src/profile-resolver.js +555 -0
- package/build/src/project-detector.js +71 -0
- package/build/src/project-root-state.js +18 -0
- package/build/src/roots-manager.js +253 -0
- package/build/src/selectors/chatgpt.json +61 -0
- package/build/src/selectors/gemini.json +24 -0
- package/build/src/selectors/loader.js +128 -0
- package/build/src/stable-identity.js +193 -0
- package/build/src/startup-check.js +147 -0
- package/build/src/system-profile.js +181 -0
- package/build/src/tools/ToolDefinition.js +9 -0
- package/build/src/tools/bookmarks.js +170 -0
- package/build/src/tools/categories.js +15 -0
- package/build/src/tools/chatgpt-web.js +507 -0
- package/build/src/tools/console.js +19 -0
- package/build/src/tools/core-tools.js +65 -0
- package/build/src/tools/diagnose-ui.js +328 -0
- package/build/src/tools/emulation.js +67 -0
- package/build/src/tools/extensions.js +185 -0
- package/build/src/tools/gemini-web.js +491 -0
- package/build/src/tools/iframe-popup-tools.js +204 -0
- package/build/src/tools/input.js +185 -0
- package/build/src/tools/network.js +68 -0
- package/build/src/tools/optional-tools.js +69 -0
- package/build/src/tools/pages.js +172 -0
- package/build/src/tools/performance.js +127 -0
- package/build/src/tools/screenshot.js +48 -0
- package/build/src/tools/script.js +39 -0
- package/build/src/tools/snapshot.js +45 -0
- package/build/src/trace-processing/parse.js +93 -0
- package/build/src/utils/pagination.js +49 -0
- package/package.json +90 -0
- package/scripts/cli.mjs +49 -0
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import puppeteer from 'puppeteer-core';
|
|
10
|
+
import { resolveUserDataDir } from './profile-resolver.js';
|
|
11
|
+
import { isProjectRootInitialized, getProjectRoot, } from './project-root-state.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 system Chrome executable path
|
|
105
|
+
*/
|
|
106
|
+
function getSystemChromeExecutable(channel) {
|
|
107
|
+
const platform = os.platform();
|
|
108
|
+
if (platform === 'darwin') {
|
|
109
|
+
// macOS
|
|
110
|
+
if (channel === 'canary') {
|
|
111
|
+
return '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary';
|
|
112
|
+
}
|
|
113
|
+
else if (channel === 'beta') {
|
|
114
|
+
return '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta';
|
|
115
|
+
}
|
|
116
|
+
else if (channel === 'dev') {
|
|
117
|
+
return '/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev';
|
|
118
|
+
}
|
|
119
|
+
return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
|
|
120
|
+
}
|
|
121
|
+
else if (platform === 'win32') {
|
|
122
|
+
// Windows
|
|
123
|
+
const programFiles = process.env['ProgramFiles'] || 'C:\\Program Files';
|
|
124
|
+
const programFilesX86 = process.env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)';
|
|
125
|
+
if (channel === 'canary') {
|
|
126
|
+
return path.join(process.env.LOCALAPPDATA || '', 'Google', 'Chrome SxS', 'Application', 'chrome.exe');
|
|
127
|
+
}
|
|
128
|
+
else if (channel === 'beta') {
|
|
129
|
+
return path.join(programFiles, 'Google', 'Chrome Beta', 'Application', 'chrome.exe');
|
|
130
|
+
}
|
|
131
|
+
else if (channel === 'dev') {
|
|
132
|
+
return path.join(programFiles, 'Google', 'Chrome Dev', 'Application', 'chrome.exe');
|
|
133
|
+
}
|
|
134
|
+
// Try both Program Files locations
|
|
135
|
+
const path1 = path.join(programFiles, 'Google', 'Chrome', 'Application', 'chrome.exe');
|
|
136
|
+
const path2 = path.join(programFilesX86, 'Google', 'Chrome', 'Application', 'chrome.exe');
|
|
137
|
+
if (fs.existsSync(path1))
|
|
138
|
+
return path1;
|
|
139
|
+
if (fs.existsSync(path2))
|
|
140
|
+
return path2;
|
|
141
|
+
return path1; // Default fallback
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Linux
|
|
145
|
+
if (channel === 'canary' || channel === 'dev') {
|
|
146
|
+
return '/usr/bin/google-chrome-unstable';
|
|
147
|
+
}
|
|
148
|
+
else if (channel === 'beta') {
|
|
149
|
+
return '/usr/bin/google-chrome-beta';
|
|
150
|
+
}
|
|
151
|
+
// Try google-chrome first, fallback to chromium
|
|
152
|
+
if (fs.existsSync('/usr/bin/google-chrome')) {
|
|
153
|
+
return '/usr/bin/google-chrome';
|
|
154
|
+
}
|
|
155
|
+
return '/usr/bin/chromium-browser';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get System Chrome User Data directory (not Chrome for Testing)
|
|
160
|
+
*/
|
|
161
|
+
function getSystemChromeUserDataDir(channel) {
|
|
162
|
+
const homeDir = os.homedir();
|
|
163
|
+
const platform = os.platform();
|
|
164
|
+
if (platform === 'darwin') {
|
|
165
|
+
// macOS
|
|
166
|
+
let chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome');
|
|
167
|
+
if (channel === 'canary') {
|
|
168
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Canary');
|
|
169
|
+
}
|
|
170
|
+
else if (channel === 'beta') {
|
|
171
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Beta');
|
|
172
|
+
}
|
|
173
|
+
else if (channel === 'dev') {
|
|
174
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Dev');
|
|
175
|
+
}
|
|
176
|
+
return chromeDataPath;
|
|
177
|
+
}
|
|
178
|
+
else if (platform === 'win32') {
|
|
179
|
+
// Windows
|
|
180
|
+
let chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome', 'User Data');
|
|
181
|
+
if (channel === 'canary') {
|
|
182
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome SxS', 'User Data');
|
|
183
|
+
}
|
|
184
|
+
else if (channel === 'beta') {
|
|
185
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Beta', 'User Data');
|
|
186
|
+
}
|
|
187
|
+
else if (channel === 'dev') {
|
|
188
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Dev', 'User Data');
|
|
189
|
+
}
|
|
190
|
+
return chromeDataPath;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Linux
|
|
194
|
+
let chromeDataPath = path.join(homeDir, '.config', 'google-chrome');
|
|
195
|
+
if (channel === 'canary') {
|
|
196
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
197
|
+
}
|
|
198
|
+
else if (channel === 'beta') {
|
|
199
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-beta');
|
|
200
|
+
}
|
|
201
|
+
else if (channel === 'dev') {
|
|
202
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
203
|
+
}
|
|
204
|
+
// Check if google-chrome exists, fallback to chromium
|
|
205
|
+
if (!fs.existsSync(chromeDataPath)) {
|
|
206
|
+
const chromiumPath = path.join(homeDir, '.config', 'chromium');
|
|
207
|
+
if (fs.existsSync(chromiumPath)) {
|
|
208
|
+
return chromiumPath;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return chromeDataPath;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Read Local State file to get last used profile
|
|
216
|
+
*/
|
|
217
|
+
function readLocalState(userDataDir) {
|
|
218
|
+
const localStatePath = path.join(userDataDir, 'Local State');
|
|
219
|
+
try {
|
|
220
|
+
if (!fs.existsSync(localStatePath)) {
|
|
221
|
+
return {};
|
|
222
|
+
}
|
|
223
|
+
const content = fs.readFileSync(localStatePath, 'utf-8');
|
|
224
|
+
const json = JSON.parse(content);
|
|
225
|
+
const lastUsed = json?.profile?.last_used;
|
|
226
|
+
if (typeof lastUsed === 'string') {
|
|
227
|
+
return { lastUsed };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
console.warn(`Failed to read Local State: ${error instanceof Error ? error.message : String(error)}`);
|
|
232
|
+
}
|
|
233
|
+
return {};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Compare version strings (e.g., "2.3.2_0" vs "2.3.1_0")
|
|
237
|
+
*/
|
|
238
|
+
function compareVersion(a, b) {
|
|
239
|
+
// Normalize: "2.3.2_0" → [2, 3, 2]
|
|
240
|
+
const normalize = (v) => v
|
|
241
|
+
.split('_')[0]
|
|
242
|
+
.split('.')
|
|
243
|
+
.map(x => parseInt(x, 10) || 0);
|
|
244
|
+
const aParts = normalize(a);
|
|
245
|
+
const bParts = normalize(b);
|
|
246
|
+
const maxLen = Math.max(aParts.length, bParts.length);
|
|
247
|
+
for (let i = 0; i < maxLen; i++) {
|
|
248
|
+
const diff = (aParts[i] || 0) - (bParts[i] || 0);
|
|
249
|
+
if (diff !== 0)
|
|
250
|
+
return diff;
|
|
251
|
+
}
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Scan one profile's Extensions directory and return extension paths
|
|
256
|
+
*/
|
|
257
|
+
function scanExtensionsInProfile(profileDir) {
|
|
258
|
+
const extensionPaths = [];
|
|
259
|
+
const extensionsDir = path.join(profileDir, 'Extensions');
|
|
260
|
+
if (!fs.existsSync(extensionsDir)) {
|
|
261
|
+
return extensionPaths;
|
|
262
|
+
}
|
|
263
|
+
try {
|
|
264
|
+
const extensionIds = fs.readdirSync(extensionsDir, { withFileTypes: true });
|
|
265
|
+
for (const extensionEntry of extensionIds) {
|
|
266
|
+
if (!extensionEntry.isDirectory())
|
|
267
|
+
continue;
|
|
268
|
+
const extensionIdPath = path.join(extensionsDir, extensionEntry.name);
|
|
269
|
+
try {
|
|
270
|
+
const versions = fs
|
|
271
|
+
.readdirSync(extensionIdPath, { withFileTypes: true })
|
|
272
|
+
.filter(e => e.isDirectory())
|
|
273
|
+
.map(e => e.name);
|
|
274
|
+
if (versions.length === 0)
|
|
275
|
+
continue;
|
|
276
|
+
// Find the latest version
|
|
277
|
+
const latestVersion = versions.sort(compareVersion).pop();
|
|
278
|
+
const versionPath = path.join(extensionIdPath, latestVersion);
|
|
279
|
+
const manifestPath = path.join(versionPath, 'manifest.json');
|
|
280
|
+
const manifest = validateExtensionManifest(manifestPath);
|
|
281
|
+
if (manifest) {
|
|
282
|
+
extensionPaths.push(versionPath);
|
|
283
|
+
console.error(` ✅ ${manifest.name} v${manifest.version} (MV${manifest.manifest_version})`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
console.warn(`Error processing extension ${extensionEntry.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.error(`Error scanning extensions in ${extensionsDir}: ${error instanceof Error ? error.message : String(error)}`);
|
|
293
|
+
}
|
|
294
|
+
return extensionPaths;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get the Chrome extensions directory path for the current platform
|
|
298
|
+
*/
|
|
299
|
+
function getChromeExtensionsDirectory(channel) {
|
|
300
|
+
const homeDir = os.homedir();
|
|
301
|
+
const platform = os.platform();
|
|
302
|
+
let chromeDataPath;
|
|
303
|
+
const profileName = 'Default';
|
|
304
|
+
if (platform === 'darwin') {
|
|
305
|
+
// macOS
|
|
306
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome');
|
|
307
|
+
if (channel === 'canary') {
|
|
308
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Canary');
|
|
309
|
+
}
|
|
310
|
+
else if (channel === 'beta') {
|
|
311
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Beta');
|
|
312
|
+
}
|
|
313
|
+
else if (channel === 'dev') {
|
|
314
|
+
chromeDataPath = path.join(homeDir, 'Library', 'Application Support', 'Google', 'Chrome Dev');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else if (platform === 'win32') {
|
|
318
|
+
// Windows
|
|
319
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome', 'User Data');
|
|
320
|
+
if (channel === 'canary') {
|
|
321
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome SxS', 'User Data');
|
|
322
|
+
}
|
|
323
|
+
else if (channel === 'beta') {
|
|
324
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Beta', 'User Data');
|
|
325
|
+
}
|
|
326
|
+
else if (channel === 'dev') {
|
|
327
|
+
chromeDataPath = path.join(homeDir, 'AppData', 'Local', 'Google', 'Chrome Dev', 'User Data');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// Linux
|
|
332
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome');
|
|
333
|
+
if (channel === 'canary') {
|
|
334
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
335
|
+
}
|
|
336
|
+
else if (channel === 'beta') {
|
|
337
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-beta');
|
|
338
|
+
}
|
|
339
|
+
else if (channel === 'dev') {
|
|
340
|
+
chromeDataPath = path.join(homeDir, '.config', 'google-chrome-unstable');
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return path.join(chromeDataPath, profileName, 'Extensions');
|
|
344
|
+
}
|
|
345
|
+
function validateExtensionManifest(manifestPath) {
|
|
346
|
+
try {
|
|
347
|
+
if (!fs.existsSync(manifestPath)) {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
|
|
351
|
+
const manifest = JSON.parse(manifestContent);
|
|
352
|
+
// Basic validation
|
|
353
|
+
if (!manifest.manifest_version || !manifest.name || !manifest.version) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
// Ensure it's a valid manifest version (2 or 3)
|
|
357
|
+
if (manifest.manifest_version !== 2 && manifest.manifest_version !== 3) {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
return manifest;
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.warn(`Invalid manifest.json at ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Discover Chrome extensions installed in the system
|
|
369
|
+
* Uses Local State to determine the active profile, or uses specified profile
|
|
370
|
+
*/
|
|
371
|
+
function discoverSystemExtensions(channel, chromeProfile) {
|
|
372
|
+
console.error(`🔍 Discovering system Chrome extensions...`);
|
|
373
|
+
const userDataDir = getSystemChromeUserDataDir(channel);
|
|
374
|
+
console.error(`📁 Chrome User Data: ${userDataDir}`);
|
|
375
|
+
// Determine target profile
|
|
376
|
+
let targetProfile;
|
|
377
|
+
if (chromeProfile) {
|
|
378
|
+
// CLI-specified profile takes priority
|
|
379
|
+
targetProfile = chromeProfile;
|
|
380
|
+
console.error(`🎯 Using CLI-specified profile: ${targetProfile}`);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
// Read Local State to get last used profile
|
|
384
|
+
const { lastUsed } = readLocalState(userDataDir);
|
|
385
|
+
targetProfile = lastUsed || 'Default';
|
|
386
|
+
if (lastUsed) {
|
|
387
|
+
console.error(`🎯 Using last-used profile from Local State: ${targetProfile}`);
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
console.error(`🎯 Local State not found, using Default profile`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Check if target profile exists
|
|
394
|
+
const profileDir = path.join(userDataDir, targetProfile);
|
|
395
|
+
if (!fs.existsSync(profileDir)) {
|
|
396
|
+
console.warn(`⚠️ Profile directory not found: ${targetProfile}`);
|
|
397
|
+
// Fallback to Default
|
|
398
|
+
if (targetProfile !== 'Default') {
|
|
399
|
+
console.error(`📁 Falling back to Default profile`);
|
|
400
|
+
targetProfile = 'Default';
|
|
401
|
+
const defaultProfileDir = path.join(userDataDir, targetProfile);
|
|
402
|
+
if (!fs.existsSync(defaultProfileDir)) {
|
|
403
|
+
console.error(`❌ Default profile also not found. No extensions will be loaded.`);
|
|
404
|
+
return [];
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
console.error(`❌ Default profile not found. No extensions will be loaded.`);
|
|
409
|
+
return [];
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Scan the target profile
|
|
413
|
+
console.error(`📂 Scanning profile: ${targetProfile}`);
|
|
414
|
+
const extensionPaths = scanExtensionsInProfile(path.join(userDataDir, targetProfile));
|
|
415
|
+
console.error(`📦 Total: ${extensionPaths.length} extension(s) found in profile "${targetProfile}"`);
|
|
416
|
+
return extensionPaths;
|
|
417
|
+
}
|
|
418
|
+
// Store development extension paths globally for later retrieval
|
|
419
|
+
let developmentExtensionPaths = [];
|
|
420
|
+
export function getDevelopmentExtensionPaths() {
|
|
421
|
+
return developmentExtensionPaths;
|
|
422
|
+
}
|
|
423
|
+
export async function launch(options) {
|
|
424
|
+
const { channel, executablePath, customDevTools, headless, isolated, loadExtension, loadExtensionsDir, loadSystemExtensions, chromeProfile, } = options;
|
|
425
|
+
// Reset development extension paths
|
|
426
|
+
developmentExtensionPaths = [];
|
|
427
|
+
// Resolve user data directory using new profile resolver (v0.15.0+)
|
|
428
|
+
const resolved = resolveUserDataDir({
|
|
429
|
+
cliUserDataDir: options.userDataDir,
|
|
430
|
+
env: process.env,
|
|
431
|
+
cwd: process.cwd(),
|
|
432
|
+
channel: channel || 'stable',
|
|
433
|
+
rootsInfo: options.rootsInfo, // v0.18.0: Pass Roots info
|
|
434
|
+
});
|
|
435
|
+
const userDataDir = resolved.path;
|
|
436
|
+
await fs.promises.mkdir(userDataDir, { recursive: true });
|
|
437
|
+
// Legacy profile warning (shown if legacy path exists)
|
|
438
|
+
try {
|
|
439
|
+
const legacy = path.join(os.homedir(), '.cache', 'chrome-ai-bridge', 'chrome-profile');
|
|
440
|
+
if (fs.existsSync(legacy)) {
|
|
441
|
+
console.error(`⚠️ Legacy profile detected: ${legacy}\n` +
|
|
442
|
+
`ℹ️ New profile location: ${path.join(os.homedir(), '.cache', 'chrome-ai-bridge', 'profiles', 'project-default', 'stable')}\n` +
|
|
443
|
+
`💡 To continue using the legacy profile, set: MCP_USER_DATA_DIR=${legacy}`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
/* ignore */
|
|
448
|
+
}
|
|
449
|
+
// Profile resolution logs
|
|
450
|
+
console.error(`[profiles] Using: ${userDataDir}`);
|
|
451
|
+
console.error(` Reason: ${resolved.reason}`);
|
|
452
|
+
console.error(` Project: ${resolved.projectName} (${resolved.hash})`);
|
|
453
|
+
console.error(` Client: ${resolved.clientId}`);
|
|
454
|
+
if (resolved.reason === 'AUTO') {
|
|
455
|
+
console.error(` Root: ${process.cwd()}`);
|
|
456
|
+
}
|
|
457
|
+
const usingSystemProfile = false;
|
|
458
|
+
const profileDirectory = 'Default';
|
|
459
|
+
const args = [
|
|
460
|
+
'--hide-crash-restore-bubble',
|
|
461
|
+
`--profile-directory=${profileDirectory}`,
|
|
462
|
+
];
|
|
463
|
+
if (customDevTools) {
|
|
464
|
+
args.push(`--custom-devtools-frontend=file://${customDevTools}`);
|
|
465
|
+
}
|
|
466
|
+
// Collect all extension paths
|
|
467
|
+
const extensionPaths = [];
|
|
468
|
+
if (loadExtension) {
|
|
469
|
+
// Validate single extension path
|
|
470
|
+
if (fs.existsSync(loadExtension)) {
|
|
471
|
+
const manifestPath = path.join(loadExtension, 'manifest.json');
|
|
472
|
+
if (fs.existsSync(manifestPath)) {
|
|
473
|
+
try {
|
|
474
|
+
const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
|
|
475
|
+
const manifest = JSON.parse(manifestContent);
|
|
476
|
+
if (manifest.manifest_version) {
|
|
477
|
+
extensionPaths.push(loadExtension);
|
|
478
|
+
developmentExtensionPaths.push(loadExtension); // Track as development extension
|
|
479
|
+
console.error(`✅ Single extension validated: ${loadExtension}`);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
console.error(`❌ Invalid manifest.json in ${loadExtension}: missing manifest_version`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
console.error(`❌ Invalid manifest.json in ${loadExtension}: ${error instanceof Error ? error.message : String(error)}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
console.error(`❌ Extension path missing manifest.json: ${loadExtension}`);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
console.error(`❌ Extension path does not exist: ${loadExtension}`);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
if (loadExtensionsDir) {
|
|
498
|
+
const scannedExtensions = scanExtensionsDirectory(loadExtensionsDir);
|
|
499
|
+
extensionPaths.push(...scannedExtensions);
|
|
500
|
+
developmentExtensionPaths.push(...scannedExtensions); // Track as development extensions
|
|
501
|
+
}
|
|
502
|
+
// System extension discovery (default: true unless isolated flag is set)
|
|
503
|
+
const shouldLoadSystemExtensions = loadSystemExtensions ?? !isolated;
|
|
504
|
+
if (shouldLoadSystemExtensions) {
|
|
505
|
+
const systemExtensions = discoverSystemExtensions(channel, chromeProfile);
|
|
506
|
+
if (systemExtensions.length > 0) {
|
|
507
|
+
extensionPaths.push(...systemExtensions);
|
|
508
|
+
console.error(`✅ Loaded ${systemExtensions.length} system Chrome extension(s)`);
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
console.warn(`⚠️ No system extensions found or accessible`);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
if (extensionPaths.length > 0) {
|
|
515
|
+
args.push(`--load-extension=${extensionPaths.join(',')}`);
|
|
516
|
+
args.push('--enable-experimental-extension-apis');
|
|
517
|
+
// Fix for Chrome 137+ where --load-extension is disabled by default
|
|
518
|
+
args.push('--disable-features=DisableLoadExtensionCommandLineSwitch');
|
|
519
|
+
console.error(`Loading ${extensionPaths.length} Chrome extension(s):`);
|
|
520
|
+
extensionPaths.forEach((path, index) => {
|
|
521
|
+
console.error(` ${index + 1}. ${path}`);
|
|
522
|
+
});
|
|
523
|
+
console.error(`Chrome args will include: --load-extension=${extensionPaths.join(',')}`);
|
|
524
|
+
console.error('Applied Chrome 137+ extension loading fix');
|
|
525
|
+
}
|
|
526
|
+
// Add Google login automation detection bypass
|
|
527
|
+
args.push('--disable-blink-features=AutomationControlled');
|
|
528
|
+
console.error('Added Google login bypass: --disable-blink-features=AutomationControlled');
|
|
529
|
+
// Use system Chrome instead of Chrome for Testing when loading extensions
|
|
530
|
+
let puppeterChannel;
|
|
531
|
+
let effectiveExecutablePath = executablePath;
|
|
532
|
+
if (!executablePath && extensionPaths.length > 0) {
|
|
533
|
+
// Auto-detect system Chrome executable for extension support
|
|
534
|
+
effectiveExecutablePath = getSystemChromeExecutable(channel);
|
|
535
|
+
console.error(`🔍 Auto-detected system Chrome: ${effectiveExecutablePath}`);
|
|
536
|
+
console.error(`💡 Using system Chrome binary with isolated MCP profile`);
|
|
537
|
+
console.error(`📝 Extensions will be loaded from: ${extensionPaths.join(', ')}`);
|
|
538
|
+
}
|
|
539
|
+
else if (!executablePath) {
|
|
540
|
+
// No extensions, use Chrome for Testing via channel
|
|
541
|
+
puppeterChannel =
|
|
542
|
+
channel && channel !== 'stable'
|
|
543
|
+
? `chrome-${channel}`
|
|
544
|
+
: 'chrome';
|
|
545
|
+
}
|
|
546
|
+
// Log complete Chrome configuration before launch
|
|
547
|
+
console.error('Chrome Launch Configuration:');
|
|
548
|
+
console.error(` Channel: ${puppeterChannel || 'default'}`);
|
|
549
|
+
console.error(` Executable: ${effectiveExecutablePath || 'auto-detected'}`);
|
|
550
|
+
console.error(` User Data Dir: ${userDataDir || 'temporary'}`);
|
|
551
|
+
console.error(` Profile Directory: ${profileDirectory}`);
|
|
552
|
+
console.error(` Profile Type: ${usingSystemProfile ? 'System Profile (auto-detected)' : 'Custom Profile'}`);
|
|
553
|
+
console.error(` Headless: ${headless}`);
|
|
554
|
+
console.error(` Args: ${JSON.stringify(args, null, 2)}`);
|
|
555
|
+
console.error(` Ignored Default Args: ["--disable-extensions", "--enable-automation"]`);
|
|
556
|
+
// IMPORTANT: Chrome extensions (especially MV3 content scripts and service workers)
|
|
557
|
+
// DO NOT work in headless mode. Always use headless:false when loading extensions.
|
|
558
|
+
// Reference: https://groups.google.com/a/chromium.org/g/headless-dev/c/nEoeUkoNI0o/m/9KZ4Os46AQAJ
|
|
559
|
+
const effectiveHeadless = extensionPaths.length > 0 ? false : headless;
|
|
560
|
+
if (extensionPaths.length > 0 && headless) {
|
|
561
|
+
console.warn('⚠️ WARNING: Extensions require headful mode. Forcing headless:false');
|
|
562
|
+
}
|
|
563
|
+
let browser;
|
|
564
|
+
let finalUserDataDir = userDataDir;
|
|
565
|
+
try {
|
|
566
|
+
browser = await puppeteer.launch({
|
|
567
|
+
...connectOptions,
|
|
568
|
+
channel: puppeterChannel,
|
|
569
|
+
executablePath: effectiveExecutablePath,
|
|
570
|
+
defaultViewport: null,
|
|
571
|
+
userDataDir,
|
|
572
|
+
pipe: true,
|
|
573
|
+
headless: effectiveHeadless,
|
|
574
|
+
args,
|
|
575
|
+
ignoreDefaultArgs: ['--disable-extensions', '--enable-automation'],
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
catch (e) {
|
|
579
|
+
// Profile lock collision fallback (v0.15.1)
|
|
580
|
+
const errorMsg = String(e.message || '').toLowerCase();
|
|
581
|
+
const isProfileLocked = errorMsg.includes('in use') ||
|
|
582
|
+
errorMsg.includes('lock') ||
|
|
583
|
+
errorMsg.includes('another chrome') ||
|
|
584
|
+
errorMsg.includes('profile appears to be');
|
|
585
|
+
if (isProfileLocked) {
|
|
586
|
+
// Fallback to ephemeral session
|
|
587
|
+
const sessionId = `${process.pid}-${Date.now()}`;
|
|
588
|
+
const tempPath = path.join(os.homedir(), '.cache', 'chrome-ai-bridge', 'sessions', sessionId, channel || 'stable');
|
|
589
|
+
await fs.promises.mkdir(tempPath, { recursive: true });
|
|
590
|
+
console.error(`⚠️ Profile locked: ${userDataDir}`);
|
|
591
|
+
console.error(`📁 Falling back to ephemeral session: ${tempPath}`);
|
|
592
|
+
console.error(`💡 To avoid this, set MCP_CLIENT_ID (e.g., "claude-code", "codex")`);
|
|
593
|
+
// Clean up on exit
|
|
594
|
+
process.on('exit', () => {
|
|
595
|
+
try {
|
|
596
|
+
fs.rmSync(tempPath, { recursive: true, force: true });
|
|
597
|
+
}
|
|
598
|
+
catch {
|
|
599
|
+
/* ignore */
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
finalUserDataDir = tempPath;
|
|
603
|
+
// Retry with ephemeral profile
|
|
604
|
+
browser = await puppeteer.launch({
|
|
605
|
+
...connectOptions,
|
|
606
|
+
channel: puppeterChannel,
|
|
607
|
+
executablePath: effectiveExecutablePath,
|
|
608
|
+
defaultViewport: null,
|
|
609
|
+
userDataDir: tempPath,
|
|
610
|
+
pipe: true,
|
|
611
|
+
headless: effectiveHeadless,
|
|
612
|
+
args,
|
|
613
|
+
ignoreDefaultArgs: ['--disable-extensions', '--enable-automation'],
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
throw e;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
try {
|
|
621
|
+
// Log actual spawn args for debugging
|
|
622
|
+
const spawnArgs = browser.process()?.spawnargs;
|
|
623
|
+
if (spawnArgs) {
|
|
624
|
+
console.error(`Actual spawn args: ${spawnArgs.join(' ')}`);
|
|
625
|
+
}
|
|
626
|
+
if (options.logFile) {
|
|
627
|
+
// FIXME: we are probably subscribing too late to catch startup logs. We
|
|
628
|
+
// should expose the process earlier or expose the getRecentLogs() getter.
|
|
629
|
+
browser.process()?.stderr?.pipe(options.logFile);
|
|
630
|
+
browser.process()?.stdout?.pipe(options.logFile);
|
|
631
|
+
}
|
|
632
|
+
// Apply Google login automation detection bypass to all pages
|
|
633
|
+
browser.on('targetcreated', async (target) => {
|
|
634
|
+
if (target.type() === 'page') {
|
|
635
|
+
try {
|
|
636
|
+
const page = await target.page();
|
|
637
|
+
if (page) {
|
|
638
|
+
await page.evaluateOnNewDocument(() => {
|
|
639
|
+
Object.defineProperty(window.navigator, 'webdriver', {
|
|
640
|
+
get: () => undefined,
|
|
641
|
+
configurable: true,
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
console.error('Applied navigator.webdriver bypass to new page');
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
catch (error) {
|
|
648
|
+
console.error('Failed to apply webdriver bypass:', error);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
// Apply bypass to existing pages
|
|
653
|
+
const initialPages = await browser.pages();
|
|
654
|
+
for (const page of initialPages) {
|
|
655
|
+
await page.evaluateOnNewDocument(() => {
|
|
656
|
+
Object.defineProperty(window.navigator, 'webdriver', {
|
|
657
|
+
get: () => undefined,
|
|
658
|
+
configurable: true,
|
|
659
|
+
});
|
|
660
|
+
});
|
|
661
|
+
console.error('Applied navigator.webdriver bypass to existing page');
|
|
662
|
+
}
|
|
663
|
+
return browser;
|
|
664
|
+
}
|
|
665
|
+
catch (error) {
|
|
666
|
+
// Fail fast with clear error message - no silent fallback
|
|
667
|
+
console.error(`❌ Failed to launch Chrome`);
|
|
668
|
+
console.error(` User Data Dir: ${userDataDir}`);
|
|
669
|
+
console.error(` Profile Directory: ${profileDirectory}`);
|
|
670
|
+
console.error(` Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
671
|
+
if (usingSystemProfile) {
|
|
672
|
+
console.error('');
|
|
673
|
+
console.error('💡 Troubleshooting:');
|
|
674
|
+
console.error(' 1. Close all Chrome windows and try again');
|
|
675
|
+
console.error(' 2. Use --isolated flag to use temporary profile');
|
|
676
|
+
console.error(' 3. Use --userDataDir to specify custom profile location');
|
|
677
|
+
}
|
|
678
|
+
throw error;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
async function ensureBrowserLaunched(options) {
|
|
682
|
+
console.error(`[ensureBrowserLaunched] browser exists: ${!!browser}, connected: ${browser?.connected}`);
|
|
683
|
+
if (browser?.connected) {
|
|
684
|
+
console.error(`[ensureBrowserLaunched] Reusing existing browser`);
|
|
685
|
+
return browser;
|
|
686
|
+
}
|
|
687
|
+
console.error(`[ensureBrowserLaunched] Launching new browser`);
|
|
688
|
+
browser = await launch(options);
|
|
689
|
+
return browser;
|
|
690
|
+
}
|
|
691
|
+
export async function resolveBrowser(options) {
|
|
692
|
+
// CRITICAL: Project root must be initialized before launching Chrome
|
|
693
|
+
// This ensures proper profile isolation for multi-project environments
|
|
694
|
+
if (!isProjectRootInitialized() &&
|
|
695
|
+
!options.browserUrl &&
|
|
696
|
+
!options.userDataDir) {
|
|
697
|
+
const errorMsg = [
|
|
698
|
+
'❌ CRITICAL ERROR: Project root not initialized',
|
|
699
|
+
'',
|
|
700
|
+
'Chrome cannot be launched because the MCP client did not provide the project root directory.',
|
|
701
|
+
'This is required for proper Chrome profile isolation when using multiple projects.',
|
|
702
|
+
'',
|
|
703
|
+
'📋 Required client behavior:',
|
|
704
|
+
'1. Client must call setProjectRoot() immediately after MCP server starts',
|
|
705
|
+
'2. Or set MCP_PROJECT_ROOT environment variable before launching MCP',
|
|
706
|
+
'3. Or use --project-root CLI flag',
|
|
707
|
+
'',
|
|
708
|
+
`Current state: projectRoot=${getProjectRoot() || 'undefined'}`,
|
|
709
|
+
`Process cwd: ${process.cwd()}`,
|
|
710
|
+
].join('\n');
|
|
711
|
+
console.error(errorMsg);
|
|
712
|
+
throw new Error('Project root not initialized - cannot launch Chrome without profile isolation');
|
|
713
|
+
}
|
|
714
|
+
const resolvedBrowser = options.browserUrl
|
|
715
|
+
? await ensureBrowserConnected(options.browserUrl)
|
|
716
|
+
: await ensureBrowserLaunched(options);
|
|
717
|
+
return resolvedBrowser;
|
|
718
|
+
}
|
|
719
|
+
export { scanExtensionsDirectory, discoverSystemExtensions, getChromeExtensionsDirectory, validateExtensionManifest, };
|