chrome-devtools-frontend 1.0.1674545 → 1.0.1676824
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/.agents/skills/devtools-ux-writing-refactor/SKILL.md +26 -9
- package/WATCHLISTS +0 -4
- package/front_end/core/common/ParsedURL.ts +5 -1
- package/front_end/core/common/SettingRegistration.ts +29 -8
- package/front_end/core/common/Settings.ts +0 -77
- package/front_end/core/root/Runtime.ts +4 -5
- package/front_end/core/sdk/CSSMetadata.ts +5 -9
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +8 -28
- package/front_end/core/sdk/DebuggerModel.ts +50 -30
- package/front_end/core/sdk/ResourceTreeModel.ts +20 -1
- package/front_end/core/sdk/Script.ts +9 -53
- package/front_end/core/sdk/TargetManager.ts +18 -0
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +213 -23
- package/front_end/entrypoints/main/MainImpl.ts +32 -0
- package/front_end/foundation/Universe.ts +44 -29
- package/front_end/generated/InspectorBackendCommands.ts +3 -1
- package/front_end/generated/SupportedCSSProperties.ts +21 -4
- package/front_end/generated/protocol-mapping.d.ts +14 -0
- package/front_end/generated/protocol-proxy-api.d.ts +10 -0
- package/front_end/generated/protocol.ts +35 -0
- package/front_end/models/ai_assistance/AiAgent2.ts +11 -0
- package/front_end/models/ai_assistance/AiConversation.ts +22 -5
- package/front_end/models/ai_assistance/README.md +52 -26
- package/front_end/models/ai_assistance/agents/AiAgent.ts +54 -8
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +15 -192
- package/front_end/models/ai_assistance/agents/StorageAgent.ts +8 -87
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -1
- package/front_end/models/ai_assistance/ai_assistance.ts +16 -0
- package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +124 -0
- package/front_end/models/ai_assistance/contexts/StorageContext.ts +111 -0
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +69 -1
- package/front_end/models/ai_assistance/skills/README.md +63 -1
- package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
- package/front_end/models/ai_assistance/skills/SkillRegistry.ts +4 -0
- package/front_end/models/ai_assistance/skills/performance.md +8 -0
- package/front_end/models/ai_assistance/skills/sources.md +16 -0
- package/front_end/models/ai_assistance/skills/storage.md +31 -0
- package/front_end/models/ai_assistance/tools/GetSourceContent.ts +101 -0
- package/front_end/models/ai_assistance/tools/GetTraceEventByKey.ts +83 -0
- package/front_end/models/ai_assistance/tools/GetTraceMainThreadSummary.ts +106 -0
- package/front_end/models/ai_assistance/tools/GetTraceNetworkSummary.ts +104 -0
- package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +81 -0
- package/front_end/models/ai_assistance/tools/ListSources.ts +116 -0
- package/front_end/models/ai_assistance/tools/SelectTraceEventByKey.ts +90 -0
- package/front_end/models/ai_assistance/tools/Tool.ts +22 -1
- package/front_end/models/ai_assistance/tools/ToolRegistry.ts +14 -0
- package/front_end/models/bindings/CSSWorkspaceBinding.ts +4 -0
- package/front_end/models/bindings/CompilerScriptMapping.ts +4 -0
- package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
- package/front_end/models/bindings/ResourceScriptMapping.ts +3 -201
- package/front_end/models/bindings/SASSSourceMapping.ts +6 -0
- package/front_end/models/breakpoints/BreakpointManager.ts +2 -49
- package/front_end/models/emulation/DeviceModeModel.ts +60 -71
- package/front_end/models/emulation/EmulatedDevices.ts +18 -66
- package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +27 -0
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +10 -2
- package/front_end/models/issues_manager/descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
- package/front_end/models/issues_manager/descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
- package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
- package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
- package/front_end/models/persistence/AutomaticFileSystemManager.ts +2 -2
- package/front_end/models/persistence/IsolatedFileSystem.ts +7 -8
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +22 -31
- package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
- package/front_end/models/persistence/persistence-meta.ts +9 -9
- package/front_end/models/trace/types/TraceEvents.ts +36 -0
- package/front_end/models/workspace/FileManager.ts +13 -6
- package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -3
- package/front_end/panels/accessibility/AccessibilityNodeView.ts +36 -36
- package/front_end/panels/accessibility/AccessibilityStrings.ts +168 -168
- package/front_end/panels/accessibility/SourceOrderView.ts +7 -7
- package/front_end/panels/accessibility/accessibility-meta.ts +2 -2
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -5
- package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +2 -3
- package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +27 -2
- package/front_end/panels/application/IndexedDBViews.ts +65 -63
- package/front_end/panels/application/WebMCPView.ts +29 -12
- package/front_end/panels/application/components/AdsView.ts +24 -1
- package/front_end/panels/application/components/adsView.css +27 -21
- package/front_end/panels/autofill/AutofillView.ts +12 -12
- package/front_end/panels/autofill/autofill-meta.ts +2 -2
- package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +5 -5
- package/front_end/panels/common/BadgeNotification.ts +8 -8
- package/front_end/panels/common/ExtensionServer.ts +21 -1
- package/front_end/panels/common/GdpSignUpDialog.ts +16 -16
- package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -6
- package/front_end/panels/common/PersistenceUtils.ts +2 -2
- package/front_end/panels/common/common.ts +0 -97
- package/front_end/panels/console/ConsoleInsightTeaser.ts +2 -2
- package/front_end/panels/console/ConsolePinPane.ts +2 -2
- package/front_end/panels/console/ConsoleView.ts +20 -19
- package/front_end/panels/elements/ElementsTreeElement.ts +550 -327
- package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
- package/front_end/panels/elements/LayoutPane.ts +2 -8
- package/front_end/panels/event_listeners/EventListenersView.ts +8 -4
- package/front_end/panels/issues/AffectedTrackingSitesView.ts +25 -14
- package/front_end/panels/js_timeline/js_timeline-meta.ts +8 -8
- package/front_end/panels/layer_viewer/LayerDetailsView.ts +30 -30
- package/front_end/panels/layer_viewer/LayerTreeOutline.ts +6 -6
- package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
- package/front_end/panels/layer_viewer/Layers3DView.ts +11 -11
- package/front_end/panels/layer_viewer/PaintProfilerView.ts +8 -8
- package/front_end/panels/layer_viewer/TransformController.ts +3 -3
- package/front_end/panels/layer_viewer/layer_viewer-meta.ts +11 -11
- package/front_end/panels/media/PlayerMessagesView.ts +149 -68
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -58
- package/front_end/panels/mobile_throttling/mobile_throttling.ts +0 -10
- package/front_end/panels/network/NetworkPanel.ts +1 -1
- package/front_end/panels/network/RequestPayloadView.ts +1 -0
- package/front_end/panels/profiler/HeapSnapshotView.ts +0 -2
- package/front_end/panels/profiler/heapProfiler.css +0 -9
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +7 -0
- package/front_end/panels/recorder/RecorderPanel.ts +2 -3
- package/front_end/panels/screencast/ScreencastView.ts +148 -138
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +1 -2
- package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -2
- package/front_end/panels/sources/DebuggerPlugin.ts +9 -58
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
- package/front_end/panels/sources/UISourceCodeFrame.ts +3 -8
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -2
- package/front_end/panels/timeline/TimelineController.ts +36 -64
- package/front_end/panels/timeline/TimelinePanel.ts +11 -8
- package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
- package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
- package/front_end/panels/timeline/timelinePanel.css +0 -10
- package/front_end/panels/utils/utils.ts +7 -7
- package/front_end/services/tracing/PerformanceTracing.ts +5 -17
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
- package/front_end/third_party/codemirror.next/package.json +2 -2
- package/front_end/third_party/codemirror.next/rebuild.sh +4 -1
- package/front_end/ui/comments/CommentAnchorResolver.ts +558 -0
- package/front_end/ui/comments/CommentManager.ts +640 -0
- package/front_end/ui/comments/CommentsOverlayWidget.ts +121 -0
- package/front_end/ui/comments/comments.ts +13 -0
- package/front_end/ui/comments/commentsOverlay.css +49 -0
- package/front_end/{panels/common → ui/components/dialogs}/FreDialog.ts +6 -6
- package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +96 -0
- package/front_end/ui/components/dialogs/dialogs.ts +4 -0
- package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
- package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionDisclaimer.ts +13 -13
- package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +7 -6
- package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionTeaser.ts +43 -46
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +22 -26
- package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationTeaser.ts +10 -10
- package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationUpgradeDialog.ts +5 -5
- package/front_end/ui/components/text_editor/text_editor.ts +4 -0
- package/front_end/ui/legacy/Toolbar.ts +1 -1
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +40 -0
- package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +11 -3
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +270 -162
- package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +5 -0
- package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -16
- package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +5 -12
- package/front_end/ui/legacy/components/source_frame/JSONView.ts +8 -1
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -2
- package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -0
- package/front_end/ui/settings/SettingUIRegistration.ts +59 -6
- package/front_end/ui/visual_logging/Debugging.ts +1 -5
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
- package/front_end/ui/visual_logging/LoggingConfig.ts +21 -0
- package/front_end/ui/visual_logging/visual_logging.ts +9 -0
- package/mcp/mcp.ts +6 -1
- package/package.json +1 -1
- package/front_end/Images/toolbarResizerVertical.png +0 -0
- package/front_end/emulated_devices/MotoG4-landscape.svg +0 -155
- package/front_end/emulated_devices/MotoG4-portrait.svg +0 -155
- package/front_end/emulated_devices/Nexus5X-landscape.svg +0 -19
- package/front_end/emulated_devices/Nexus5X-portrait.svg +0 -19
- package/front_end/emulated_devices/Nexus6P-landscape.svg +0 -50
- package/front_end/emulated_devices/Nexus6P-portrait.svg +0 -54
- package/front_end/emulated_devices/google-nest-hub-horizontal.png +0 -0
- package/front_end/emulated_devices/google-nest-hub-max-horizontal.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-default-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-default-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png +0 -0
- package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png +0 -0
- package/front_end/emulated_devices/iPad-landscape.svg +0 -73
- package/front_end/emulated_devices/iPad-portrait.svg +0 -76
- package/front_end/emulated_devices/iPhone5-landscape.svg +0 -99
- package/front_end/emulated_devices/iPhone5-portrait.svg +0 -83
- package/front_end/emulated_devices/iPhone6-landscape.svg +0 -111
- package/front_end/emulated_devices/iPhone6-portrait.svg +0 -116
- package/front_end/emulated_devices/iPhone6Plus-landscape.svg +0 -118
- package/front_end/emulated_devices/iPhone6Plus-portrait.svg +0 -116
- package/front_end/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/README.md +0 -9
- package/front_end/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
- package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
- package/front_end/emulated_devices/optimized/iPad-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/iPad-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
- package/front_end/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
- package/front_end/emulated_devices/optimized/optimized_images.gni +0 -53
- package/front_end/models/ai_assistance/agents/README.md +0 -136
- package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +0 -92
- /package/front_end/{panels/common → ui/components/dialogs}/freDialog.css +0 -0
- /package/front_end/{panels/common/common.css → ui/components/dialogs/typeToAllowDialog.css} +0 -0
- /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionDisclaimer.css +0 -0
- /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionTeaser.css +0 -0
- /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationTeaser.css +0 -0
- /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationUpgradeDialog.css +0 -0
|
@@ -1136,6 +1136,8 @@ inspectorBackend.registerEnum("Page.SetTouchEmulationEnabledRequestConfiguration
|
|
|
1136
1136
|
inspectorBackend.registerCommand("Page.setTouchEmulationEnabled", [{"name": "enabled", "type": "boolean", "optional": false, "description": "Whether the touch event emulation should be enabled.", "typeRef": null}, {"name": "configuration", "type": "string", "optional": true, "description": "Touch/gesture events configuration. Default: current platform.", "typeRef": "Page.SetTouchEmulationEnabledRequestConfiguration"}], [], "Toggles mouse event-based touch event emulation.");
|
|
1137
1137
|
inspectorBackend.registerEnum("Page.StartScreencastRequestFormat", {Jpeg: "jpeg", Png: "png"});
|
|
1138
1138
|
inspectorBackend.registerCommand("Page.startScreencast", [{"name": "format", "type": "string", "optional": true, "description": "Image compression format.", "typeRef": "Page.StartScreencastRequestFormat"}, {"name": "quality", "type": "number", "optional": true, "description": "Compression quality from range [0..100].", "typeRef": null}, {"name": "maxWidth", "type": "number", "optional": true, "description": "Maximum screenshot width.", "typeRef": null}, {"name": "maxHeight", "type": "number", "optional": true, "description": "Maximum screenshot height.", "typeRef": null}, {"name": "everyNthFrame", "type": "number", "optional": true, "description": "Send every n-th frame.", "typeRef": null}], [], "Starts sending each frame using the `screencastFrame` event.");
|
|
1139
|
+
inspectorBackend.registerCommand("Page.startScreenRecording", [{"name": "audio", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "maxWidth", "type": "number", "optional": true, "description": "Maximum frame width in pixels.", "typeRef": null}, {"name": "maxHeight", "type": "number", "optional": true, "description": "Maximum frame height in pixels.", "typeRef": null}, {"name": "frameRate", "type": "number", "optional": true, "description": "Maximum frame rate in frames per second.", "typeRef": null}], ["stream"], "Starts screencast video recording.");
|
|
1140
|
+
inspectorBackend.registerCommand("Page.stopScreenRecording", [], ["stream"], "Stops screencast video recording.");
|
|
1139
1141
|
inspectorBackend.registerCommand("Page.stopLoading", [], [], "Force the page stop all navigations and pending resource fetches.");
|
|
1140
1142
|
inspectorBackend.registerCommand("Page.crash", [], [], "Crashes renderer on the IO thread, generates minidumps.");
|
|
1141
1143
|
inspectorBackend.registerCommand("Page.close", [], [], "Tries to close page, running its beforeunload hooks, if any.");
|
|
@@ -1464,7 +1466,7 @@ inspectorBackend.registerType("WebAudio.AudioParam", [{"name": "paramId", "type"
|
|
|
1464
1466
|
// WebAuthn.
|
|
1465
1467
|
inspectorBackend.registerEnum("WebAuthn.AuthenticatorProtocol", {U2f: "u2f", Ctap2: "ctap2"});
|
|
1466
1468
|
inspectorBackend.registerEnum("WebAuthn.Ctap2Version", {Ctap2_0: "ctap2_0", Ctap2_1: "ctap2_1", Ctap2_2: "ctap2_2"});
|
|
1467
|
-
inspectorBackend.registerEnum("WebAuthn.AuthenticatorTransport", {Usb: "usb", Nfc: "nfc", Ble: "ble", Cable: "cable", Internal: "internal"});
|
|
1469
|
+
inspectorBackend.registerEnum("WebAuthn.AuthenticatorTransport", {Usb: "usb", Nfc: "nfc", Ble: "ble", Cable: "cable", Hybrid: "hybrid", SmartCard: "smart-card", Internal: "internal"});
|
|
1468
1470
|
inspectorBackend.registerEvent("WebAuthn.credentialAdded", ["authenticatorId", "credential"]);
|
|
1469
1471
|
inspectorBackend.registerEvent("WebAuthn.credentialDeleted", ["authenticatorId", "credentialId"]);
|
|
1470
1472
|
inspectorBackend.registerEvent("WebAuthn.credentialUpdated", ["authenticatorId", "credential"]);
|
|
@@ -1026,6 +1026,11 @@ export const generatedProperties = [
|
|
|
1026
1026
|
"runtime_flag_status": "stable"
|
|
1027
1027
|
},
|
|
1028
1028
|
{
|
|
1029
|
+
"devtools_keywords": [
|
|
1030
|
+
"none",
|
|
1031
|
+
"move",
|
|
1032
|
+
"no-drag"
|
|
1033
|
+
],
|
|
1029
1034
|
"name": "app-region"
|
|
1030
1035
|
},
|
|
1031
1036
|
{
|
|
@@ -5163,7 +5168,8 @@ export const generatedProperties = [
|
|
|
5163
5168
|
"inline",
|
|
5164
5169
|
"both",
|
|
5165
5170
|
"mandatory",
|
|
5166
|
-
"proximity"
|
|
5171
|
+
"proximity",
|
|
5172
|
+
"pair"
|
|
5167
5173
|
],
|
|
5168
5174
|
"name": "scroll-snap-type"
|
|
5169
5175
|
},
|
|
@@ -6078,6 +6084,10 @@ export const generatedProperties = [
|
|
|
6078
6084
|
"name": "will-change"
|
|
6079
6085
|
},
|
|
6080
6086
|
{
|
|
6087
|
+
"devtools_keywords": [
|
|
6088
|
+
"none",
|
|
6089
|
+
"move"
|
|
6090
|
+
],
|
|
6081
6091
|
"inherited": true,
|
|
6082
6092
|
"keywords": [
|
|
6083
6093
|
"none",
|
|
@@ -6415,6 +6425,13 @@ export const generatedPropertyValues = {
|
|
|
6415
6425
|
"none"
|
|
6416
6426
|
]
|
|
6417
6427
|
},
|
|
6428
|
+
"app-region": {
|
|
6429
|
+
"values": [
|
|
6430
|
+
"none",
|
|
6431
|
+
"move",
|
|
6432
|
+
"no-drag"
|
|
6433
|
+
]
|
|
6434
|
+
},
|
|
6418
6435
|
"appearance": {
|
|
6419
6436
|
"values": [
|
|
6420
6437
|
"auto",
|
|
@@ -8694,7 +8711,8 @@ export const generatedPropertyValues = {
|
|
|
8694
8711
|
"inline",
|
|
8695
8712
|
"both",
|
|
8696
8713
|
"mandatory",
|
|
8697
|
-
"proximity"
|
|
8714
|
+
"proximity",
|
|
8715
|
+
"pair"
|
|
8698
8716
|
]
|
|
8699
8717
|
},
|
|
8700
8718
|
"scroll-target-group": {
|
|
@@ -9208,8 +9226,7 @@ export const generatedPropertyValues = {
|
|
|
9208
9226
|
"window-drag": {
|
|
9209
9227
|
"values": [
|
|
9210
9228
|
"none",
|
|
9211
|
-
"move"
|
|
9212
|
-
"no-drag"
|
|
9229
|
+
"move"
|
|
9213
9230
|
]
|
|
9214
9231
|
},
|
|
9215
9232
|
"word-break": {
|
|
@@ -4323,6 +4323,20 @@ export namespace ProtocolMapping {
|
|
|
4323
4323
|
paramsType: [Protocol.Page.StartScreencastRequest?];
|
|
4324
4324
|
returnType: void;
|
|
4325
4325
|
};
|
|
4326
|
+
/**
|
|
4327
|
+
* Starts screencast video recording.
|
|
4328
|
+
*/
|
|
4329
|
+
'Page.startScreenRecording': {
|
|
4330
|
+
paramsType: [Protocol.Page.StartScreenRecordingRequest?];
|
|
4331
|
+
returnType: Protocol.Page.StartScreenRecordingResponse;
|
|
4332
|
+
};
|
|
4333
|
+
/**
|
|
4334
|
+
* Stops screencast video recording.
|
|
4335
|
+
*/
|
|
4336
|
+
'Page.stopScreenRecording': {
|
|
4337
|
+
paramsType: [];
|
|
4338
|
+
returnType: Protocol.Page.StopScreenRecordingResponse;
|
|
4339
|
+
};
|
|
4326
4340
|
/**
|
|
4327
4341
|
* Force the page stop all navigations and pending resource fetches.
|
|
4328
4342
|
*/
|
|
@@ -3478,6 +3478,16 @@ declare namespace ProtocolProxyApi {
|
|
|
3478
3478
|
*/
|
|
3479
3479
|
invoke_startScreencast(params: Protocol.Page.StartScreencastRequest): Promise<Protocol.ProtocolResponseWithError>;
|
|
3480
3480
|
|
|
3481
|
+
/**
|
|
3482
|
+
* Starts screencast video recording.
|
|
3483
|
+
*/
|
|
3484
|
+
invoke_startScreenRecording(params: Protocol.Page.StartScreenRecordingRequest): Promise<Protocol.Page.StartScreenRecordingResponse>;
|
|
3485
|
+
|
|
3486
|
+
/**
|
|
3487
|
+
* Stops screencast video recording.
|
|
3488
|
+
*/
|
|
3489
|
+
invoke_stopScreenRecording(): Promise<Protocol.Page.StopScreenRecordingResponse>;
|
|
3490
|
+
|
|
3481
3491
|
/**
|
|
3482
3492
|
* Force the page stop all navigations and pending resource fetches.
|
|
3483
3493
|
*/
|
|
@@ -16288,6 +16288,36 @@ export namespace Page {
|
|
|
16288
16288
|
everyNthFrame?: integer;
|
|
16289
16289
|
}
|
|
16290
16290
|
|
|
16291
|
+
export interface StartScreenRecordingRequest {
|
|
16292
|
+
audio?: boolean;
|
|
16293
|
+
/**
|
|
16294
|
+
* Maximum frame width in pixels.
|
|
16295
|
+
*/
|
|
16296
|
+
maxWidth?: integer;
|
|
16297
|
+
/**
|
|
16298
|
+
* Maximum frame height in pixels.
|
|
16299
|
+
*/
|
|
16300
|
+
maxHeight?: integer;
|
|
16301
|
+
/**
|
|
16302
|
+
* Maximum frame rate in frames per second.
|
|
16303
|
+
*/
|
|
16304
|
+
frameRate?: integer;
|
|
16305
|
+
}
|
|
16306
|
+
|
|
16307
|
+
export interface StartScreenRecordingResponse extends ProtocolResponseWithError {
|
|
16308
|
+
/**
|
|
16309
|
+
* A handle of the stream that holds resulting screencast data.
|
|
16310
|
+
*/
|
|
16311
|
+
stream: IO.StreamHandle;
|
|
16312
|
+
}
|
|
16313
|
+
|
|
16314
|
+
export interface StopScreenRecordingResponse extends ProtocolResponseWithError {
|
|
16315
|
+
/**
|
|
16316
|
+
* A handle of the stream that holds resulting screencast data.
|
|
16317
|
+
*/
|
|
16318
|
+
stream: IO.StreamHandle;
|
|
16319
|
+
}
|
|
16320
|
+
|
|
16291
16321
|
export const enum SetWebLifecycleStateRequestState {
|
|
16292
16322
|
Frozen = 'frozen',
|
|
16293
16323
|
Active = 'active',
|
|
@@ -20069,11 +20099,16 @@ export namespace WebAuthn {
|
|
|
20069
20099
|
Ctap2_2 = 'ctap2_2',
|
|
20070
20100
|
}
|
|
20071
20101
|
|
|
20102
|
+
/**
|
|
20103
|
+
* LINT_SKIP.IfChange(AuthenticatorTransport)
|
|
20104
|
+
*/
|
|
20072
20105
|
export const enum AuthenticatorTransport {
|
|
20073
20106
|
Usb = 'usb',
|
|
20074
20107
|
Nfc = 'nfc',
|
|
20075
20108
|
Ble = 'ble',
|
|
20076
20109
|
Cable = 'cable',
|
|
20110
|
+
Hybrid = 'hybrid',
|
|
20111
|
+
SmartCard = 'smart-card',
|
|
20077
20112
|
Internal = 'internal',
|
|
20078
20113
|
}
|
|
20079
20114
|
|
|
@@ -30,6 +30,8 @@ const SKILL_DISPLAY_NAMES: Record<SkillName, string> = {
|
|
|
30
30
|
network: 'Network requests',
|
|
31
31
|
accessibility: 'Accessibility',
|
|
32
32
|
performance: 'Performance',
|
|
33
|
+
storage: 'Storage',
|
|
34
|
+
sources: 'Workspace files and sources',
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
const preamble = `You are the most advanced unified AI assistant integrated into Chrome DevTools.
|
|
@@ -81,6 +83,12 @@ export class AiAgent2 extends AiAgent<unknown> {
|
|
|
81
83
|
return {};
|
|
82
84
|
}
|
|
83
85
|
|
|
86
|
+
protected override async preRun(): Promise<void> {
|
|
87
|
+
if (this.context && !this.context.isLoggingEnabled()) {
|
|
88
|
+
this.setServerSideLoggingActive(false);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
84
92
|
readonly #activeSkills = new Set<SkillName>();
|
|
85
93
|
readonly #declaredTools = new Set<string>();
|
|
86
94
|
|
|
@@ -242,6 +250,9 @@ User query: ${enhancedQuery}`;
|
|
|
242
250
|
getEstablishedOrigin: () => this.#getConversationOrigin(),
|
|
243
251
|
lighthouseRecording: this.#lighthouseRecording,
|
|
244
252
|
performanceRecordAndReload: this.#performanceRecordAndReload,
|
|
253
|
+
setLoggingEnabled: (enabled: boolean) => {
|
|
254
|
+
this.setServerSideLoggingActive(enabled);
|
|
255
|
+
},
|
|
245
256
|
};
|
|
246
257
|
return tool.handler(args, context, options);
|
|
247
258
|
},
|
|
@@ -27,7 +27,7 @@ import {ContextSelectionAgent} from './agents/ContextSelectionAgent.js';
|
|
|
27
27
|
import {FileAgent} from './agents/FileAgent.js';
|
|
28
28
|
import {NetworkAgent} from './agents/NetworkAgent.js';
|
|
29
29
|
import {PerformanceAgent} from './agents/PerformanceAgent.js';
|
|
30
|
-
import {StorageAgent
|
|
30
|
+
import {StorageAgent} from './agents/StorageAgent.js';
|
|
31
31
|
import {StylingAgent} from './agents/StylingAgent.js';
|
|
32
32
|
import {AiAgent2} from './AiAgent2.js';
|
|
33
33
|
import {AiHistoryStorage, ConversationType, type SerializedConversation} from './AiHistoryStorage.js';
|
|
@@ -37,6 +37,9 @@ import {DOMNodeContext} from './contexts/DOMNodeContext.js';
|
|
|
37
37
|
import {FileContext} from './contexts/FileContext.js';
|
|
38
38
|
import {PerformanceTraceContext} from './contexts/PerformanceTraceContext.js';
|
|
39
39
|
import {RequestContext} from './contexts/RequestContext.js';
|
|
40
|
+
import {StorageContext} from './contexts/StorageContext.js';
|
|
41
|
+
import {ToolAnnotation} from './tools/Tool.js';
|
|
42
|
+
import {ToolRegistry} from './tools/ToolRegistry.js';
|
|
40
43
|
|
|
41
44
|
export const NOT_FOUND_IMAGE_DATA = '';
|
|
42
45
|
export const CONTEXT_TITLE = 'Analyzing data';
|
|
@@ -324,10 +327,18 @@ export class AiConversation {
|
|
|
324
327
|
case ResponseType.SIDE_EFFECT: {
|
|
325
328
|
return {...item, confirm: undefined};
|
|
326
329
|
}
|
|
327
|
-
case ResponseType.CONTEXT:
|
|
328
|
-
case ResponseType.ACTION: {
|
|
330
|
+
case ResponseType.CONTEXT: {
|
|
329
331
|
return {...item, widgets: undefined};
|
|
330
332
|
}
|
|
333
|
+
case ResponseType.ACTION: {
|
|
334
|
+
const tool = item.toolName ? ToolRegistry.get(item.toolName) : undefined;
|
|
335
|
+
const shouldRedact = tool?.annotations?.includes(ToolAnnotation.REDACT_FROM_HISTORY);
|
|
336
|
+
return {
|
|
337
|
+
...item,
|
|
338
|
+
output: shouldRedact ? '<redacted>' : item.output,
|
|
339
|
+
widgets: undefined,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
331
342
|
default:
|
|
332
343
|
return item;
|
|
333
344
|
}
|
|
@@ -361,7 +372,7 @@ export class AiConversation {
|
|
|
361
372
|
|
|
362
373
|
const options = {
|
|
363
374
|
aidaClient: this.#aidaClient,
|
|
364
|
-
|
|
375
|
+
serverSideLoggingAllowed: isAiAssistanceServerSideLoggingAllowed(),
|
|
365
376
|
sessionId: this.id,
|
|
366
377
|
changeManager: this.#changeManager,
|
|
367
378
|
performanceRecordAndReload: this.#performanceRecordAndReload,
|
|
@@ -540,7 +551,13 @@ export class AiConversation {
|
|
|
540
551
|
};
|
|
541
552
|
}
|
|
542
553
|
|
|
543
|
-
|
|
554
|
+
/**
|
|
555
|
+
* Checks whether server-side logging is allowed by the global system policy.
|
|
556
|
+
* Note that even if this returns true, individual agents can still dynamically
|
|
557
|
+
* deactivate/activate logging during their execution (e.g., when handling
|
|
558
|
+
* sensitive tools).
|
|
559
|
+
*/
|
|
560
|
+
function isAiAssistanceServerSideLoggingAllowed(): boolean {
|
|
544
561
|
return !Root.Runtime.hostConfig.aidaAvailability?.disallowLogging;
|
|
545
562
|
}
|
|
546
563
|
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
# AI in DevTools
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Architecture Overview
|
|
4
4
|
|
|
5
|
-
When the user interacts with AI via the AI Assistance Panel, they are having a _conversation_ with an agent.
|
|
5
|
+
When the user interacts with AI via the AI Assistance Panel, they are having a _conversation_ with an agent. DevTools currently contains two architectural generations for AI assistance:
|
|
6
|
+
|
|
7
|
+
- **Legacy V1 (Multi-Agent Architecture)**: Implemented in `agents/`. Each domain is handled by a specialized agent subclass extending `AiAgent` (for example, `PerformanceAgent`, `StylingAgent`, `NetworkAgent`).
|
|
8
|
+
- **AIAgentV2 (Unified Single-Agent Architecture)**: Implemented in `AiAgent2.ts`. We are migrating from the siloed multi-agent architecture to a unified, skill-based single-agent architecture. In V2, a single agent (`AiAgent2`) handles multiple domains by dynamically loading **Skills** (`skills/`) and calling type-safe **Tools** (`tools/`).
|
|
9
|
+
|
|
10
|
+
Both architectures share the core **Contexts**, **Formatters**, and **Security & Origin Isolation** mechanisms described below.
|
|
11
|
+
|
|
12
|
+
## Core Concepts & Lifecycle
|
|
6
13
|
|
|
7
14
|
### Contexts
|
|
8
15
|
|
|
@@ -24,21 +31,47 @@ Encapsulating prompt formatting and UI generation within the context classes sim
|
|
|
24
31
|
|
|
25
32
|
To deal with the work to take an object that is the AI agent's context and turn it into a text representation that can be sent to the AI, we use _formatters_. These are typically classes with `static` methods that can take in objects and return their text representation that we want to pass to the AI.
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
### Lifecycle & Cache Clearing
|
|
35
|
+
|
|
36
|
+
AI Agents can maintain internal stateful variables to optimize performance or store context (such as stashed tool results, formatters, or instruction flags). However, this state must be carefully managed to prevent security leaks (such as cross-origin data leaks after page navigation) or stale results.
|
|
37
|
+
|
|
38
|
+
The `AiAgent` base class defines a `clearCache()` method. This method is automatically invoked by the system when:
|
|
39
|
+
- An execution error occurs.
|
|
40
|
+
- The user aborts the execution.
|
|
41
|
+
- A cross-origin navigation is detected (via the top-level origin blocking mechanism).
|
|
42
|
+
|
|
43
|
+
If you introduce new stateful member variables in an `AiAgent` subclass, you **must** override `clearCache()` to reset them:
|
|
44
|
+
1. Always call `super.clearCache()` to ensure base class cleanup is executed.
|
|
45
|
+
2. Reset any subclass-specific state (such as setting formatters to `null`, clearing lists, or resetting boolean flags).
|
|
46
|
+
|
|
47
|
+
Example from `PerformanceAgent`:
|
|
48
|
+
```typescript
|
|
49
|
+
override clearCache(): void {
|
|
50
|
+
super.clearCache();
|
|
51
|
+
this.#functionCallCacheForFocus.clear();
|
|
52
|
+
this.#formatter = null;
|
|
53
|
+
this.#traceFacts = [];
|
|
54
|
+
// ... reset other stateful fields
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Security & Origin Isolation
|
|
28
59
|
|
|
29
|
-
|
|
60
|
+
To prevent prompt injection attacks and cross-origin data leaks, the AI Assistance panel enforces strict origin-lock boundaries:
|
|
61
|
+
|
|
62
|
+
- **Origin Locking**: Once a conversation session begins, it locks to the origin of the initial data context (e.g. `https://google.com` or a specific file path).
|
|
63
|
+
- **Opaque Origins**: Any origin classified as opaque (e.g. `data:`, `about:`, `detached` nodes, unparsed `undefined://` or empty origins) is blocked from starting AI assistance (`isOpaqueOrigin()`).
|
|
64
|
+
- **File Isolation**: Local files (`file://`) do not share a single wildcard origin. Instead, the path is appended (e.g. `file:///path/to/file.js`) to treat each local file as its own unique origin. Swapping local files in the same conversation is blocked.
|
|
65
|
+
- **Trace Isolation**: Imported performance trace recordings are isolated using the virtual origin `imported-trace://${domain}`. This ensures that loaded local trace files do not share origins with live pages, preventing potential cross-origin prompt injection attacks when switching contexts.
|
|
66
|
+
- **Equivalence**: `areOriginsEquivalent()` ensures opaque origins are never equivalent to anything (including themselves), forcing a conversation reset on transitions.
|
|
30
67
|
|
|
31
|
-
|
|
32
|
-
- A single agent (`AIAgent2`) handles multiple domains.
|
|
33
|
-
- Capabilities are defined as **Skills** in Markdown files.
|
|
34
|
-
- The agent can dynamically load skills as needed via a `learnSkill` tool.
|
|
68
|
+
## AIAgentV2 (Unified Architecture)
|
|
35
69
|
|
|
36
|
-
|
|
70
|
+
We are migrating DevTools AI Assistance from a siloed multi-agent architecture to a unified, skill-based single-agent architecture (`AiAgent2`). In this new architecture, capabilities are defined as **Skills** in Markdown files, and the agent can dynamically load skills as needed via a `learnSkills` tool.
|
|
37
71
|
|
|
38
72
|
### Skills Build System
|
|
39
73
|
|
|
40
|
-
To support dynamic loading of skills, we generate JavaScript files from Markdown files containing skill definitions.
|
|
41
|
-
We use a nested `BUILD.gn` file in the `skills/` subdirectory specifically for this purpose. This ensures that GN's `target_gen_dir` points to `gen/front_end/models/ai_assistance/skills/`, placing the generated `.skill.js` files in the same relative structure as their source `.md` files. This allows TypeScript files in the `skills/` directory (like `map.ts`) to import the generated files using relative paths (e.g., `./styling.skill.js`) seamlessly. See the [Skills README](skills/README.md) for full details.
|
|
74
|
+
To support dynamic loading of skills, we generate JavaScript files from Markdown files containing skill definitions. We use a nested `BUILD.gn` file in the `skills/` subdirectory specifically for this purpose. This ensures that GN's `target_gen_dir` points to `gen/front_end/models/ai_assistance/skills/`, placing the generated `.skill.js` files in the same relative structure as their source `.md` files. This allows TypeScript files in the `skills/` directory (like `map.ts`) to import the generated files using relative paths (e.g., `./styling.skill.js`) seamlessly. See the [Skills README](skills/README.md) for full details.
|
|
42
75
|
|
|
43
76
|
### Tools and ToolRegistry
|
|
44
77
|
|
|
@@ -49,9 +82,13 @@ To support skills requiring execution of code or fetching page state (like compu
|
|
|
49
82
|
- **Capability Contexts**: Instead of passing a monolithic grab-bag context to all tools, dependencies are broken into narrow capability interfaces (e.g. `PageExecutionCapability`, `StyleMutationCapability`, `TargetCapability`, `OriginLockCapability`). Tools declare their required dependencies by intersecting these interfaces on their generic `ContextType` definition. The caller/Agent fulfills the complete capability context (`AllToolsCapabilities`), guaranteeing 100% compile-time type safety for dependencies without runtime checks.
|
|
50
83
|
- **ToolRegistry**: A static registry (`ToolRegistry`) storing instantiated tools. It uses TypeScript function overloading and generic lookups (`static get<K extends keyof typeof TOOLS>(name: K): typeof TOOLS[K]`) to return the precise class type of each tool, preventing type-erasure and escape-hatches (such as `any` or `as unknown` type assertions) at integration points like `AiAgent2.ts`. See the [Tools README](tools/README.md) for authoring instructions.
|
|
51
84
|
|
|
52
|
-
|
|
85
|
+
### Adding a new skill
|
|
86
|
+
|
|
87
|
+
See the [Skills README](skills/README.md) for detailed instructions.
|
|
53
88
|
|
|
54
|
-
|
|
89
|
+
## Extending Domain Support (Performance Insights)
|
|
90
|
+
|
|
91
|
+
### PerformanceTraceContext
|
|
55
92
|
|
|
56
93
|
The context for `PerformanceAgent` is `PerformanceTraceContext`, which wraps `AgentFocus`. `AgentFocus` supports different behavior for different entry-points of the "Ask AI" feature for a trace (such as a specific performance insight, flame chart call tree, trace event, or the whole parsed trace). `PerformanceTraceContext` implements `ConversationContext<AgentFocus>` to fetch prompt details, user-facing accordion details, and context-specific AI suggestions.
|
|
57
94
|
|
|
@@ -73,16 +110,15 @@ In general, the trace bounds are defined by the insight's overlays. If there are
|
|
|
73
110
|
|
|
74
111
|
See the `insightBounds` function in `InsightAIContext.ts`.
|
|
75
112
|
|
|
76
|
-
|
|
77
113
|
### Testing the new Insight
|
|
78
114
|
|
|
79
115
|
Once it's working, it's a good idea to manually experiment with the new Insight and ask a bunch of questions on different traces. Try to find (or create) websites that cause the insight to identify a variety of outputs and see how far you can push the AI. Look for instances where you can perhaps clarify the data you are passing into it, or tweak your wording, to try to make it clearer. You can also take the data you are sending and paste it into Gemini to get feedback on your prompt from the AI.
|
|
80
116
|
|
|
81
117
|
(We are working on a better, more automated way, of evaluating these responses).
|
|
82
118
|
|
|
83
|
-
## Debugging
|
|
119
|
+
## Debugging & Local Development
|
|
84
120
|
|
|
85
|
-
To test the AI code, you must be running DevTools in a branded Chrome (e.g. official Chrome Canary) and be signed in. You can use the `npm start` with a canary flag in this repository to run against Chromium, or by running Chrome Canary and pointing it to your local DevTools
|
|
121
|
+
To test the AI code, you must be running DevTools in a branded Chrome (e.g. official Chrome Canary) and be signed in. You can use the `npm start` with a canary flag in this repository to run against Chromium, or by running Chrome Canary and pointing it to your local DevTools:
|
|
86
122
|
|
|
87
123
|
```
|
|
88
124
|
npm start -- --browser=canary
|
|
@@ -108,13 +144,3 @@ Now, when interacting with the AI and sending requests, you will see output logg
|
|
|
108
144
|
### Testing the Accessibility Skill
|
|
109
145
|
|
|
110
146
|
The accessibility skill (`accessibility.md`) relies on an active Lighthouse report. Before interacting with the agent using this skill, ensure you have run a Lighthouse audit on the page you are inspecting so that the `getLighthouseAudits` tool can retrieve the report data.
|
|
111
|
-
|
|
112
|
-
## Security & Origin Isolation
|
|
113
|
-
|
|
114
|
-
To prevent prompt injection attacks and cross-origin data leaks, the AI Assistance panel enforces strict origin-lock boundaries:
|
|
115
|
-
|
|
116
|
-
* **Origin Locking**: Once a conversation session begins, it locks to the origin of the initial data context (e.g. `https://google.com` or a specific file path).
|
|
117
|
-
* **Opaque Origins**: Any origin classified as opaque (e.g. `data:`, `about:`, `detached` nodes, unparsed `undefined://` or empty origins) is blocked from starting AI assistance (`isOpaqueOrigin()`).
|
|
118
|
-
* **File Isolation**: Local files (`file://`) do not share a single wildcard origin. Instead, the path is appended (e.g. `file:///path/to/file.js`) to treat each local file as its own unique origin. Swapping local files in the same conversation is blocked.
|
|
119
|
-
* **Trace Isolation**: Imported performance trace recordings are isolated using the virtual origin `imported-trace://${domain}`. This ensures that loaded local trace files do not share origins with live pages, preventing potential cross-origin prompt injection attacks when switching contexts.
|
|
120
|
-
* **Equivalence**: `areOriginsEquivalent()` ensures opaque origins are never equivalent to anything (including themselves), forcing a conversation reset on transitions.
|
|
@@ -122,6 +122,10 @@ export interface ActionResponse {
|
|
|
122
122
|
output?: string;
|
|
123
123
|
canceled: boolean;
|
|
124
124
|
widgets?: AiWidget[];
|
|
125
|
+
/**
|
|
126
|
+
* The name of the executed tool. Only populated for AI v2.
|
|
127
|
+
*/
|
|
128
|
+
toolName?: string;
|
|
125
129
|
}
|
|
126
130
|
|
|
127
131
|
export interface QueryingResponse {
|
|
@@ -161,7 +165,7 @@ export type AllowedOriginResult = {
|
|
|
161
165
|
|
|
162
166
|
export interface AgentOptions {
|
|
163
167
|
aidaClient: Host.AidaClient.AidaClient;
|
|
164
|
-
|
|
168
|
+
serverSideLoggingAllowed?: boolean;
|
|
165
169
|
sessionId?: string;
|
|
166
170
|
confirmSideEffectForTest?: typeof Promise.withResolvers;
|
|
167
171
|
onInspectElement?: () => Promise<SDK.DOMModel.DOMNode|null>;
|
|
@@ -193,6 +197,14 @@ export abstract class ConversationContext<T> {
|
|
|
193
197
|
abstract getItem(): T;
|
|
194
198
|
abstract getTitle(): string;
|
|
195
199
|
|
|
200
|
+
/**
|
|
201
|
+
* Returns true if the server-side logging is enabled when this context is active.
|
|
202
|
+
* Currently only used for AI v2.
|
|
203
|
+
*/
|
|
204
|
+
isLoggingEnabled(): boolean {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
|
|
196
208
|
getOrigin(): string {
|
|
197
209
|
return extractContextOrigin(this.getURL());
|
|
198
210
|
}
|
|
@@ -387,10 +399,22 @@ export interface SourceCodeAiWidget {
|
|
|
387
399
|
};
|
|
388
400
|
}
|
|
389
401
|
|
|
402
|
+
export interface StorageBreakdownAiWidget {
|
|
403
|
+
name: 'STORAGE_BREAKDOWN';
|
|
404
|
+
data: {
|
|
405
|
+
totalUsageBytes: number,
|
|
406
|
+
totalQuotaBytes: number,
|
|
407
|
+
usageBreakdown: Array<{
|
|
408
|
+
storageType: string,
|
|
409
|
+
bytes: number,
|
|
410
|
+
}>,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
390
414
|
export type AiWidget = ComputedStyleAiWidget|CoreVitalsAiWidget|StylePropertiesAiWidget|DomTreeAiWidget|
|
|
391
415
|
PerformanceTraceAiWidget|PerfInsightAiWidget|TimelineRangeSummaryAiWidget|BottomUpTreeAiWidget|SourceFileAiWidget|
|
|
392
416
|
LighthouseReportAiWidget|TimelineEventSummaryAiWidget|NetworkRequestGeneralHeadersAiWidget|SourceCodeAiWidget|
|
|
393
|
-
SourceFilesListAiWidget|NetworkRequestsListAiWidget|NetworkTrackAiWidget;
|
|
417
|
+
SourceFilesListAiWidget|NetworkRequestsListAiWidget|NetworkTrackAiWidget|StorageBreakdownAiWidget;
|
|
394
418
|
|
|
395
419
|
/**
|
|
396
420
|
* @deprecated Used for v1 agents. Once v2 is shipped, this can be removed.
|
|
@@ -472,7 +496,16 @@ export abstract class AiAgent<T> {
|
|
|
472
496
|
|
|
473
497
|
readonly #sessionId: string;
|
|
474
498
|
readonly #aidaClient: Host.AidaClient.AidaClient;
|
|
475
|
-
|
|
499
|
+
/**
|
|
500
|
+
* Whether server-side logging is permitted by the system policy (based on
|
|
501
|
+
* user preferences, feature flags, or branding configurations).
|
|
502
|
+
*/
|
|
503
|
+
readonly #serverSideLoggingAllowed: boolean;
|
|
504
|
+
/**
|
|
505
|
+
* Tracks the dynamic runtime state of logging. Even if logging is allowed
|
|
506
|
+
* by policy, tools can temporarily deactivate this to avoid logging sensitive data.
|
|
507
|
+
*/
|
|
508
|
+
#serverSideLoggingActive: boolean;
|
|
476
509
|
readonly confirmSideEffect: typeof Promise.withResolvers;
|
|
477
510
|
readonly #functionDeclarations = new Map<string, FunctionDeclaration<Record<string, unknown>, unknown>>();
|
|
478
511
|
readonly #allowedOrigin?: () => AllowedOriginResult;
|
|
@@ -499,13 +532,15 @@ export abstract class AiAgent<T> {
|
|
|
499
532
|
|
|
500
533
|
constructor(opts: AgentOptions) {
|
|
501
534
|
this.#aidaClient = opts.aidaClient;
|
|
502
|
-
|
|
535
|
+
let serverSideLoggingAllowed = opts.serverSideLoggingAllowed ?? false;
|
|
503
536
|
// Disable logging for now.
|
|
504
537
|
// For context, see b/454563259#comment35.
|
|
505
538
|
// We should be able to remove this ~end of April.
|
|
506
539
|
if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
|
|
507
|
-
|
|
540
|
+
serverSideLoggingAllowed = false;
|
|
508
541
|
}
|
|
542
|
+
this.#serverSideLoggingAllowed = serverSideLoggingAllowed;
|
|
543
|
+
this.#serverSideLoggingActive = serverSideLoggingAllowed;
|
|
509
544
|
this.#sessionId = opts.sessionId ?? crypto.randomUUID();
|
|
510
545
|
this.confirmSideEffect = opts.confirmSideEffectForTest ?? (() => Promise.withResolvers());
|
|
511
546
|
this.#history = opts.history ?? [];
|
|
@@ -558,8 +593,17 @@ export abstract class AiAgent<T> {
|
|
|
558
593
|
clearCache(): void {
|
|
559
594
|
}
|
|
560
595
|
|
|
561
|
-
|
|
562
|
-
|
|
596
|
+
/**
|
|
597
|
+
* Toggles whether server-side logging is active.
|
|
598
|
+
* Note that logging can only be activated if it was allowed by policy/configuration
|
|
599
|
+
* at startup (i.e., `#serverSideLoggingAllowed` is true).
|
|
600
|
+
*/
|
|
601
|
+
protected setServerSideLoggingActive(active: boolean): void {
|
|
602
|
+
if (active && this.#serverSideLoggingAllowed) {
|
|
603
|
+
this.#serverSideLoggingActive = true;
|
|
604
|
+
} else {
|
|
605
|
+
this.#serverSideLoggingActive = false;
|
|
606
|
+
}
|
|
563
607
|
}
|
|
564
608
|
|
|
565
609
|
popPendingMultimodalInput(): MultimodalInput|undefined {
|
|
@@ -618,7 +662,7 @@ export abstract class AiAgent<T> {
|
|
|
618
662
|
model_id: this.options.modelId || undefined,
|
|
619
663
|
},
|
|
620
664
|
metadata: {
|
|
621
|
-
disable_user_content_logging: !(this.#
|
|
665
|
+
disable_user_content_logging: !(this.#serverSideLoggingActive ?? false),
|
|
622
666
|
string_session_id: this.#sessionId,
|
|
623
667
|
user_tier: userTier,
|
|
624
668
|
client_version:
|
|
@@ -1027,6 +1071,7 @@ export abstract class AiAgent<T> {
|
|
|
1027
1071
|
output: typeof result.result === 'string' ? result.result : JSON.stringify(result.result),
|
|
1028
1072
|
widgets: result.widgets,
|
|
1029
1073
|
canceled: false,
|
|
1074
|
+
toolName: name,
|
|
1030
1075
|
};
|
|
1031
1076
|
}
|
|
1032
1077
|
|
|
@@ -1036,6 +1081,7 @@ export abstract class AiAgent<T> {
|
|
|
1036
1081
|
code,
|
|
1037
1082
|
output: result.error,
|
|
1038
1083
|
canceled: false,
|
|
1084
|
+
toolName: name,
|
|
1039
1085
|
};
|
|
1040
1086
|
}
|
|
1041
1087
|
|
|
@@ -19,6 +19,7 @@ import {DOMNodeContext} from '../contexts/DOMNodeContext.js';
|
|
|
19
19
|
import {FileContext} from '../contexts/FileContext.js';
|
|
20
20
|
import {PerformanceTraceContext} from '../contexts/PerformanceTraceContext.js';
|
|
21
21
|
import {getRequestContextOrigin, RequestContext} from '../contexts/RequestContext.js';
|
|
22
|
+
import {StorageContext} from '../contexts/StorageContext.js';
|
|
22
23
|
import {formatBytesToKb, seconds} from '../data_formatters/UnitFormatters.js';
|
|
23
24
|
import {debugLog} from '../debug.js';
|
|
24
25
|
import {StorageItem} from '../StorageItem.js';
|
|
@@ -30,7 +31,6 @@ import {
|
|
|
30
31
|
type ContextResponse,
|
|
31
32
|
type RequestOptions,
|
|
32
33
|
} from './AiAgent.js';
|
|
33
|
-
import {StorageContext} from './StorageAgent.js';
|
|
34
34
|
|
|
35
35
|
const lockedString = i18n.i18n.lockedString;
|
|
36
36
|
/**
|