chrome-devtools-frontend 1.0.1376716 → 1.0.1380117
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/config/gni/devtools_grd_files.gni +15 -7
- package/config/gni/devtools_image_files.gni +2 -0
- package/front_end/Images/src/animation.svg +3 -0
- package/front_end/Images/src/brush-2.svg +3 -0
- package/front_end/core/common/SettingRegistration.ts +1 -1
- package/front_end/core/host/AidaClient.ts +1 -0
- package/front_end/core/host/InspectorFrontendHost.ts +4 -0
- package/front_end/core/i18n/ByteUtilities.test.ts +34 -0
- package/front_end/core/i18n/ByteUtilities.ts +65 -0
- package/front_end/core/i18n/NumberFormatter.ts +75 -0
- package/front_end/core/i18n/i18n.ts +4 -0
- package/front_end/core/i18n/time-utilities.test.ts +20 -2
- package/front_end/core/i18n/time-utilities.ts +125 -86
- package/front_end/core/platform/NumberUtilities.test.ts +3 -26
- package/front_end/core/platform/NumberUtilities.ts +0 -20
- package/front_end/core/root/Runtime.ts +6 -3
- package/front_end/core/sdk/CPUThrottlingManager.ts +4 -0
- package/front_end/core/sdk/CSSContainerQuery.test.ts +10 -16
- package/front_end/core/sdk/CSSContainerQuery.ts +3 -15
- package/front_end/core/sdk/CSSMatchedStyles.test.ts +4 -0
- package/front_end/core/sdk/CSSMatchedStyles.ts +5 -5
- package/front_end/core/sdk/CSSModel.ts +18 -0
- package/front_end/core/sdk/CSSPropertyParser.test.ts +16 -1
- package/front_end/core/sdk/CSSPropertyParser.ts +2 -2
- package/front_end/core/sdk/sdk-meta.ts +8 -0
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +3 -3
- package/front_end/generated/ARIAProperties.js +4 -0
- package/front_end/generated/InspectorBackendCommands.js +8 -6
- package/front_end/generated/SupportedCSSProperties.js +17 -4
- package/front_end/generated/protocol-mapping.d.ts +15 -1
- package/front_end/generated/protocol-proxy-api.d.ts +14 -1
- package/front_end/generated/protocol.ts +26 -2
- package/front_end/models/extensions/ExtensionAPI.ts +9 -1
- package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +2 -0
- package/front_end/models/javascript_metadata/NativeFunctions.js +8 -21
- package/front_end/models/live-metrics/web-vitals-injected/{rollup.config.js → rollup.config.mjs} +1 -1
- package/front_end/models/persistence/EditFileSystemView.ts +19 -9
- package/front_end/models/persistence/WorkspaceSettingsTab.ts +50 -54
- package/front_end/models/persistence/editFileSystemView.css +35 -15
- package/front_end/models/persistence/workspaceSettingsTab.css +21 -87
- package/front_end/models/timeline_model/timeline_model.ts +0 -6
- package/front_end/models/trace/Processor.test.ts +18 -17
- package/front_end/models/trace/Processor.ts +10 -14
- package/front_end/models/trace/README.md +0 -1
- package/front_end/models/{timeline_model → trace/extras}/TimelineJSProfile.ts +19 -29
- package/front_end/models/{timeline_model/TimelineModelFilter.test.ts → trace/extras/TraceFilter.test.ts} +15 -17
- package/front_end/models/trace/extras/TraceFilter.ts +62 -0
- package/front_end/models/{timeline_model/TimelineProfileTree.test.ts → trace/extras/TraceTree.test.ts} +44 -43
- package/front_end/models/{timeline_model/TimelineProfileTree.ts → trace/extras/TraceTree.ts} +65 -59
- package/front_end/models/trace/extras/extras.ts +3 -0
- package/front_end/models/trace/handlers/AnimationHandler.ts +0 -8
- package/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +1 -11
- package/front_end/models/trace/handlers/FramesHandler.test.ts +1 -6
- package/front_end/models/trace/handlers/FramesHandler.ts +1 -14
- package/front_end/models/trace/handlers/GPUHandler.test.ts +0 -2
- package/front_end/models/trace/handlers/GPUHandler.ts +1 -25
- package/front_end/models/trace/handlers/ImagePaintingHandler.ts +3 -0
- package/front_end/models/trace/handlers/InitiatorsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/InitiatorsHandler.ts +0 -20
- package/front_end/models/trace/handlers/InvalidationsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/InvalidationsHandler.ts +0 -18
- package/front_end/models/trace/handlers/LargestImagePaintHandler.test.ts +2 -2
- package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +63 -3
- package/front_end/models/trace/handlers/LargestTextPaintHandler.ts +3 -0
- package/front_end/models/trace/handlers/LayerTreeHandler.test.ts +0 -2
- package/front_end/models/trace/handlers/LayerTreeHandler.ts +1 -18
- package/front_end/models/trace/handlers/LayoutShiftsHandler.test.ts +0 -3
- package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -20
- package/front_end/models/trace/handlers/MemoryHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/MemoryHandler.ts +3 -0
- package/front_end/models/trace/handlers/MetaHandler.test.ts +1 -32
- package/front_end/models/trace/handlers/MetaHandler.ts +2 -30
- package/front_end/models/trace/handlers/NetworkRequestsHandler.test.ts +0 -26
- package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +4 -23
- package/front_end/models/trace/handlers/PageFramesHandler.ts +3 -0
- package/front_end/models/trace/handlers/RendererHandler.test.ts +0 -4
- package/front_end/models/trace/handlers/RendererHandler.ts +1 -24
- package/front_end/models/trace/handlers/SamplesHandler.test.ts +0 -5
- package/front_end/models/trace/handlers/SamplesHandler.ts +0 -26
- package/front_end/models/trace/handlers/ScreenshotsHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/SelectorStatsHandler.ts +3 -0
- package/front_end/models/trace/handlers/ServerTimingsHandler.ts +1 -16
- package/front_end/models/trace/handlers/Threads.test.ts +1 -2
- package/front_end/models/trace/handlers/UserInteractionsHandler.test.ts +4 -27
- package/front_end/models/trace/handlers/UserInteractionsHandler.ts +16 -25
- package/front_end/models/trace/handlers/UserTimingsHandler.ts +0 -17
- package/front_end/models/trace/handlers/WorkersHandler.test.ts +0 -1
- package/front_end/models/trace/handlers/WorkersHandler.ts +0 -23
- package/front_end/models/trace/handlers/types.ts +1 -8
- package/front_end/models/trace/insights/{CumulativeLayoutShift.test.ts → CLSCulprits.test.ts} +21 -21
- package/front_end/models/trace/insights/{CumulativeLayoutShift.ts → CLSCulprits.ts} +24 -5
- package/front_end/models/trace/insights/Common.ts +5 -55
- package/front_end/models/trace/insights/DocumentLatency.test.ts +2 -2
- package/front_end/models/trace/insights/DocumentLatency.ts +26 -6
- package/front_end/models/trace/insights/FontDisplay.ts +24 -5
- package/front_end/models/trace/insights/InteractionToNextPaint.test.ts +1 -1
- package/front_end/models/trace/insights/InteractionToNextPaint.ts +26 -6
- package/front_end/models/trace/insights/LCPDiscovery.test.ts +58 -0
- package/front_end/models/trace/insights/LCPDiscovery.ts +101 -0
- package/front_end/models/trace/insights/{LargestContentfulPaint.test.ts → LCPPhases.test.ts} +6 -28
- package/front_end/models/trace/insights/{LargestContentfulPaint.ts → LCPPhases.ts} +37 -38
- package/front_end/models/trace/insights/{InsightRunners.ts → Models.ts} +4 -3
- package/front_end/models/trace/insights/RenderBlocking.test.ts +1 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +33 -28
- package/front_end/models/trace/insights/SlowCSSSelector.ts +26 -5
- package/front_end/models/trace/insights/{ThirdPartyWeb.test.ts → ThirdParties.test.ts} +3 -3
- package/front_end/models/trace/insights/{ThirdPartyWeb.ts → ThirdParties.ts} +24 -5
- package/front_end/models/trace/insights/Viewport.test.ts +1 -1
- package/front_end/models/trace/insights/Viewport.ts +27 -9
- package/front_end/models/trace/insights/insights.ts +1 -1
- package/front_end/models/trace/insights/types.ts +11 -9
- package/front_end/models/trace/types/TraceEvents.ts +51 -22
- package/front_end/panels/application/SharedStorageItemsView.test.ts +3 -3
- package/front_end/panels/application/SharedStorageItemsView.ts +5 -3
- package/front_end/panels/application/StorageView.ts +3 -3
- package/front_end/panels/application/components/StorageMetadataView.ts +1 -2
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +34 -31
- package/front_end/panels/coverage/CoverageView.ts +3 -3
- package/front_end/panels/elements/ComputedStyleModel.ts +9 -2
- package/front_end/panels/elements/ComputedStyleWidget.test.ts +72 -0
- package/front_end/panels/elements/ComputedStyleWidget.ts +12 -0
- package/front_end/panels/elements/ElementStatePaneWidget.test.ts +84 -30
- package/front_end/panels/elements/ElementStatePaneWidget.ts +42 -24
- package/front_end/panels/elements/ElementsTreeElement.ts +24 -11
- package/front_end/panels/elements/MetricsSidebarPane.ts +12 -7
- package/front_end/panels/elements/PropertyMatchers.ts +3 -0
- package/front_end/panels/elements/StylePropertiesSection.ts +15 -6
- package/front_end/panels/elements/StylePropertyTreeElement.test.ts +3 -1
- package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -3
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -2
- package/front_end/panels/explain/components/ConsoleInsight.ts +8 -18
- package/front_end/panels/freestyler/AiAgent.test.ts +58 -1
- package/front_end/panels/freestyler/AiAgent.ts +58 -3
- package/front_end/panels/freestyler/DrJonesFileAgent.test.ts +99 -23
- package/front_end/panels/freestyler/DrJonesFileAgent.ts +53 -20
- package/front_end/panels/freestyler/DrJonesNetworkAgent.test.ts +15 -7
- package/front_end/panels/freestyler/DrJonesNetworkAgent.ts +36 -15
- package/front_end/panels/freestyler/DrJonesPerformanceAgent.test.ts +6 -6
- package/front_end/panels/freestyler/DrJonesPerformanceAgent.ts +48 -8
- package/front_end/panels/freestyler/FreestylerAgent.test.ts +15 -14
- package/front_end/panels/freestyler/FreestylerAgent.ts +52 -8
- package/front_end/panels/freestyler/FreestylerPanel.test.ts +539 -39
- package/front_end/panels/freestyler/FreestylerPanel.ts +349 -215
- package/front_end/panels/freestyler/components/FreestylerChatUi.test.ts +126 -34
- package/front_end/panels/freestyler/components/FreestylerChatUi.ts +320 -268
- package/front_end/panels/freestyler/components/UserActionRow.ts +156 -47
- package/front_end/panels/freestyler/components/freestylerChatUi.css +69 -34
- package/front_end/panels/freestyler/components/userActionRow.css +40 -67
- package/front_end/panels/freestyler/freestyler-meta.ts +3 -11
- package/front_end/panels/issues/components/HideIssuesMenu.ts +2 -11
- package/front_end/panels/layer_viewer/LayerDetailsView.ts +1 -2
- package/front_end/panels/layer_viewer/PaintProfilerView.ts +5 -5
- package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +46 -0
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +26 -17
- package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +25 -19
- package/front_end/panels/network/BinaryResourceView.ts +6 -7
- package/front_end/panels/network/EventSourceMessagesView.ts +1 -1
- package/front_end/panels/network/NetworkDataGridNode.ts +3 -3
- package/front_end/panels/network/NetworkLogView.ts +7 -8
- package/front_end/panels/network/RequestTimingView.test.ts +35 -1
- package/front_end/panels/network/RequestTimingView.ts +96 -0
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +2 -2
- package/front_end/panels/network/networkTimingTable.css +2 -1
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +1 -1
- package/front_end/panels/profiler/HeapProfileView.ts +3 -3
- package/front_end/panels/profiler/HeapSnapshotView.ts +2 -2
- package/front_end/panels/profiler/HeapTimelineOverview.ts +12 -12
- package/front_end/panels/profiler/IsolateSelector.ts +3 -4
- package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +1 -1
- package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +7 -6
- package/front_end/panels/profiler/ProfileView.ts +1 -1
- package/front_end/panels/recorder/components/RecordingView.ts +2 -2
- package/front_end/panels/recorder/injected/{rollup.config.js → rollup.config.mjs} +1 -1
- package/front_end/panels/recorder/recorderController.css +0 -4
- package/front_end/panels/security/CookieReportTreeElement.ts +1 -9
- package/front_end/panels/security/CookieReportView.ts +120 -0
- package/front_end/panels/security/SecurityPanel.ts +8 -2
- package/front_end/panels/security/cookieReportView.css +46 -0
- package/front_end/panels/security/sidebar.css +1 -2
- package/front_end/panels/sensors/LocationsSettingsTab.ts +26 -11
- package/front_end/panels/sensors/locationsSettingsTab.css +18 -18
- package/front_end/panels/settings/AISettingsTab.ts +6 -15
- package/front_end/panels/settings/KeybindsSettingsTab.ts +1 -1
- package/front_end/panels/settings/SettingsScreen.ts +61 -56
- package/front_end/panels/settings/aiSettingsTab.css +3 -14
- package/front_end/panels/settings/components/SyncSection.ts +1 -2
- package/front_end/panels/settings/components/syncSection.css +0 -10
- package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +3 -1
- package/front_end/panels/settings/keybindsSettingsTab.css +7 -10
- package/front_end/panels/settings/settingsScreen.css +27 -125
- package/front_end/panels/sources/DebuggerPlugin.ts +9 -4
- package/front_end/panels/sources/NavigatorView.ts +11 -13
- package/front_end/panels/timeline/ActiveFilters.ts +3 -4
- package/front_end/panels/timeline/AnimationsTrackAppender.ts +1 -2
- package/front_end/panels/timeline/CountersGraph.ts +2 -4
- package/front_end/panels/timeline/EventsTimelineTreeView.ts +7 -8
- package/front_end/panels/timeline/README.md +2 -1
- package/front_end/panels/timeline/TimelineController.ts +14 -4
- package/front_end/panels/timeline/TimelineEventOverview.ts +3 -4
- package/front_end/panels/timeline/TimelineFilters.ts +3 -4
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.test.ts +1 -1
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +3 -10
- package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +1 -2
- package/front_end/panels/timeline/TimelineFlameChartView.ts +21 -12
- package/front_end/panels/timeline/TimelineLoader.test.ts +1 -2
- package/front_end/panels/timeline/TimelineLoader.ts +3 -4
- package/front_end/panels/timeline/TimelineMiniMap.ts +10 -0
- package/front_end/panels/timeline/TimelinePanel.ts +20 -8
- package/front_end/panels/timeline/TimelineTreeView.test.ts +12 -13
- package/front_end/panels/timeline/TimelineTreeView.ts +35 -40
- package/front_end/panels/timeline/TimelineUIUtils.test.ts +2 -2
- package/front_end/panels/timeline/TimelineUIUtils.ts +12 -14
- package/front_end/panels/timeline/components/LayoutShiftDetails.ts +6 -7
- package/front_end/panels/timeline/components/LiveMetricsView.test.ts +3 -3
- package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -26
- package/front_end/panels/timeline/components/MetricCard.test.ts +1 -1
- package/front_end/panels/timeline/components/MetricCard.ts +46 -0
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +3 -4
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +2 -0
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +41 -36
- package/front_end/panels/timeline/components/insights/CLSCulprits.ts +19 -33
- package/front_end/panels/timeline/components/insights/DocumentLatency.ts +29 -40
- package/front_end/panels/timeline/components/insights/FontDisplay.ts +17 -23
- package/front_end/panels/timeline/components/insights/Helpers.ts +12 -16
- package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +14 -26
- package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +25 -37
- package/front_end/panels/timeline/components/insights/LCPPhases.ts +20 -47
- package/front_end/panels/timeline/components/insights/RenderBlocking.ts +19 -28
- package/front_end/panels/timeline/components/insights/SidebarInsight.ts +1 -2
- package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +18 -31
- package/front_end/panels/timeline/components/insights/Table.ts +5 -3
- package/front_end/panels/timeline/components/insights/ThirdParties.ts +18 -25
- package/front_end/panels/timeline/components/insights/Viewport.ts +14 -25
- package/front_end/panels/timeline/components/liveMetricsView.css +5 -13
- package/front_end/panels/timeline/components/metricCard.css +11 -0
- package/front_end/panels/timeline/components/sidebarInsightsTab.css +1 -1
- package/front_end/panels/timeline/overlays/OverlaysImpl.test.ts +5 -5
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +13 -12
- package/front_end/panels/timeline/timelineFlameChartView.css +1 -1
- package/front_end/panels/timeline/utils/AICallTree.test.ts +105 -0
- package/front_end/panels/timeline/utils/AICallTree.ts +25 -24
- package/front_end/testing/EnvironmentHelpers.ts +5 -18
- package/front_end/testing/InsightHelpers.ts +4 -4
- package/front_end/testing/TraceHelpers.ts +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts +14 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js +16 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts +34 -5
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js +51 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts +14 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js +57 -23
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js +13 -10
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts +15 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js +55 -26
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts +0 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js +2 -11
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +7 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +9 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js +0 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts +14 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js +18 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +51 -10
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +215 -97
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +2 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts +14 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js +16 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +34 -5
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js +51 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts +14 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js +57 -23
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js +13 -10
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts +15 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js +55 -26
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts +0 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js +1 -9
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +5 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +7 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js +0 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts +14 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js +15 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +51 -10
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +2 -3
- package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +21 -3
- package/front_end/third_party/puppeteer/package/src/api/Input.ts +57 -8
- package/front_end/third_party/puppeteer/package/src/bidi/ElementHandle.ts +9 -7
- package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/bidi/Input.ts +72 -31
- package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +14 -9
- package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +71 -26
- package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +1 -15
- package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +8 -1
- package/front_end/third_party/puppeteer/package/src/common/Errors.ts +7 -0
- package/front_end/third_party/puppeteer/package/src/common/WaitTask.ts +9 -9
- package/front_end/third_party/puppeteer/package/src/environment.ts +1 -4
- package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/incremental-id-generator.ts +20 -0
- package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
- package/front_end/ui/components/buttons/Button.test.ts +14 -0
- package/front_end/ui/components/buttons/Button.ts +27 -4
- package/front_end/ui/components/cards/card.css +7 -4
- package/front_end/ui/components/dialogs/Dialog.ts +2 -4
- package/front_end/ui/components/dialogs/ShortcutDialog.ts +15 -13
- package/front_end/ui/components/dialogs/dialog.css +2 -6
- package/front_end/ui/components/dialogs/shortcutDialog.css +33 -41
- package/front_end/ui/components/docs/freestyler/basic.ts +6 -8
- package/front_end/ui/components/docs/freestyler/empty_state.ts +6 -8
- package/front_end/ui/components/docs/performance_panel/track_example.html +1 -1
- package/front_end/ui/components/markdown_view/MarkdownView.test.ts +39 -17
- package/front_end/ui/components/markdown_view/MarkdownView.ts +77 -14
- package/front_end/ui/components/markdown_view/markdownView.css +15 -0
- package/front_end/ui/components/settings/SettingCheckbox.ts +3 -2
- package/front_end/ui/legacy/ContextMenu.ts +2 -2
- package/front_end/ui/legacy/InplaceEditor.ts +18 -14
- package/front_end/ui/legacy/TabbedPane.ts +0 -14
- package/front_end/ui/legacy/UIUtils.ts +0 -7
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +7 -2
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +8 -4
- package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +20 -11
- package/front_end/ui/legacy/components/inline_editor/LinkSwatch.test.ts +19 -0
- package/front_end/ui/legacy/components/inline_editor/LinkSwatch.ts +1 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +5 -22
- package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +129 -100
- package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +4 -2
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.test.ts +9 -4
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.ts +6 -6
- package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +22 -4
- package/front_end/ui/legacy/components/perf_ui/flameChart.css +0 -2
- package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.test.ts +49 -0
- package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +23 -46
- package/front_end/ui/legacy/components/source_frame/ImageView.ts +1 -1
- package/front_end/ui/legacy/components/utils/ImagePreview.ts +1 -1
- package/front_end/ui/legacy/textPrompt.css +1 -1
- package/front_end/ui/legacy/toolbar.css +4 -5
- package/front_end/ui/visual_logging/KnownContextValues.ts +174 -0
- package/front_end/ui/visual_logging/LoggingConfig.ts +6 -2
- package/package.json +7 -6
- package/scripts/build/ninja/bundle.gni +3 -3
- package/scripts/build/{rollup.config.js → rollup.config.mjs} +4 -4
- package/scripts/devtools_paths.py +8 -4
- package/scripts/eslint_rules/tests/check_test_definitions_test.js +8 -3
- package/scripts/tools/update_goldens_v2.py +1 -1
- package/front_end/models/timeline_model/TimelineModelFilter.ts +0 -61
- /package/front_end/Images/{rollup.config.js → rollup.config.mjs} +0 -0
@@ -36,6 +36,7 @@ describeWithMockConnection('StylePropertyTreeElement', () => {
|
|
36
36
|
'--garbage-space': 'this-is-garbage-text',
|
37
37
|
'--prop': 'customproperty',
|
38
38
|
'--zero': '0',
|
39
|
+
'--empty': '',
|
39
40
|
};
|
40
41
|
|
41
42
|
mockStylePropertiesSection = sinon.createStubInstance(Elements.StylePropertiesSection.StylePropertiesSection);
|
@@ -319,7 +320,7 @@ describeWithMockConnection('StylePropertyTreeElement', () => {
|
|
319
320
|
|
320
321
|
it('should clicking on the jump-to icon reveal the resolved animation group', async () => {
|
321
322
|
const stubAnimationGroup = sinon.createStubInstance(SDK.AnimationModel.AnimationGroup);
|
322
|
-
const revealerSpy = sinon.
|
323
|
+
const revealerSpy = sinon.stub(Common.Revealer.RevealerRegistry.instance(), 'reveal');
|
323
324
|
const getAnimationGroupForAnimationStub =
|
324
325
|
sinon.stub(SDK.AnimationModel.AnimationModel.prototype, 'getAnimationGroupForAnimation')
|
325
326
|
.resolves(stubAnimationGroup);
|
@@ -788,6 +789,7 @@ describeWithMockConnection('StylePropertyTreeElement', () => {
|
|
788
789
|
assert.deepStrictEqual(
|
789
790
|
await matchProperty('var(--no, var(--no2))'),
|
790
791
|
{hasUnresolvedVars: true, computedText: 'color: var(--no, var(--no2))'});
|
792
|
+
assert.deepStrictEqual(await matchProperty(''), {hasUnresolvedVars: false, computedText: 'color:'});
|
791
793
|
});
|
792
794
|
|
793
795
|
it('layers correctly with the font renderer', () => {
|
@@ -141,6 +141,10 @@ const UIStrings = {
|
|
141
141
|
*@description A context menu item in Styles panel to copy all declarations of CSS rule as JavaScript properties.
|
142
142
|
*/
|
143
143
|
copyAllCssDeclarationsAsJs: 'Copy all declarations as JS',
|
144
|
+
/**
|
145
|
+
*@description Title of the link in Styles panel to jump to the Animations panel.
|
146
|
+
*/
|
147
|
+
jumpToAnimationsPanel: 'Jump to Animations panel',
|
144
148
|
};
|
145
149
|
const str_ = i18n.i18n.registerUIStrings('panels/elements/StylePropertyTreeElement.ts', UIStrings);
|
146
150
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
@@ -259,7 +263,7 @@ export class VariableRenderer implements MatchRenderer<SDK.CSSPropertyParser.Var
|
|
259
263
|
const renderedFallback = match.fallback.length > 0 ? Renderer.render(match.fallback, context) : undefined;
|
260
264
|
|
261
265
|
const {declaration, value: variableValue} = this.resolveVariable(match) ?? {};
|
262
|
-
const fromFallback =
|
266
|
+
const fromFallback = variableValue === undefined;
|
263
267
|
const computedValue = variableValue ?? this.fallbackValue(match);
|
264
268
|
|
265
269
|
const varSwatch = new InlineEditor.LinkSwatch.CSSVarSwatch();
|
@@ -770,9 +774,10 @@ export class LinkableNameRenderer implements MatchRenderer<LinkableNameMatch> {
|
|
770
774
|
return;
|
771
775
|
}
|
772
776
|
|
773
|
-
const icon = IconButton.Icon.create('
|
777
|
+
const icon = IconButton.Icon.create('animation', 'open-in-animations-panel');
|
774
778
|
icon.setAttribute('jslog', `${VisualLogging.link('open-in-animations-panel').track({click: true})}`);
|
775
779
|
icon.setAttribute('role', 'button');
|
780
|
+
icon.setAttribute('title', i18nString(UIStrings.jumpToAnimationsPanel));
|
776
781
|
icon.addEventListener('mouseup', ev => {
|
777
782
|
ev.consume(true);
|
778
783
|
|
@@ -1706,7 +1711,7 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
|
|
1706
1711
|
})]);
|
1707
1712
|
|
1708
1713
|
const decl = SDK.CSSPropertyParser.ASTUtils.siblings(SDK.CSSPropertyParser.ASTUtils.declValue(matching.ast.tree));
|
1709
|
-
return matching.getComputedTextRange(decl[0], decl[decl.length - 1]);
|
1714
|
+
return decl.length > 0 ? matching.getComputedTextRange(decl[0], decl[decl.length - 1]) : '';
|
1710
1715
|
}
|
1711
1716
|
|
1712
1717
|
refreshIfComputedValueChanged(): void {
|
@@ -281,10 +281,10 @@ devtools-icon.open-in-animations-panel {
|
|
281
281
|
transform: scale(0.7);
|
282
282
|
margin: -5px -2px -3px -4px;
|
283
283
|
user-select: none;
|
284
|
-
color: var(--icon-
|
284
|
+
color: var(--icon-css);
|
285
285
|
cursor: default;
|
286
286
|
|
287
287
|
&:hover {
|
288
|
-
color: var(--icon-
|
288
|
+
color: var(--icon-css-hover);
|
289
289
|
}
|
290
290
|
}
|
@@ -8,7 +8,6 @@ import * as Common from '../../../core/common/common.js';
|
|
8
8
|
import * as Host from '../../../core/host/host.js';
|
9
9
|
import * as i18n from '../../../core/i18n/i18n.js';
|
10
10
|
import type * as Platform from '../../../core/platform/platform.js';
|
11
|
-
import * as SDK from '../../../core/sdk/sdk.js';
|
12
11
|
import * as Marked from '../../../third_party/marked/marked.js';
|
13
12
|
import * as Buttons from '../../../ui/components/buttons/buttons.js';
|
14
13
|
import type * as IconButton from '../../../ui/components/icon_button/icon_button.js';
|
@@ -95,9 +94,9 @@ const UIStrings = {
|
|
95
94
|
*/
|
96
95
|
notLoggedIn: 'This feature is only available when you sign into Chrome with your Google account.',
|
97
96
|
/**
|
98
|
-
* @description The title of
|
97
|
+
* @description The title of a button which opens the Chrome SignIn page.
|
99
98
|
*/
|
100
|
-
|
99
|
+
signIn: 'Sign in',
|
101
100
|
/**
|
102
101
|
* @description The header shown when the internet connection is not
|
103
102
|
* available.
|
@@ -168,7 +167,7 @@ const CODE_SNIPPET_WARNING_URL = 'https://support.google.com/legal/answer/135054
|
|
168
167
|
const LEARNMORE_URL = 'https://goo.gle/devtools-console-messages-ai' as Platform.DevToolsPath.UrlString;
|
169
168
|
const REPORT_URL = 'https://support.google.com/legal/troubleshooter/1114905?hl=en#ts=1115658%2C13380504' as
|
170
169
|
Platform.DevToolsPath.UrlString;
|
171
|
-
const
|
170
|
+
const SIGN_IN_URL = 'https://accounts.google.com' as Platform.DevToolsPath.UrlString;
|
172
171
|
|
173
172
|
const enum State {
|
174
173
|
INSIGHT = 'insight',
|
@@ -529,17 +528,8 @@ export class ConsoleInsight extends HTMLElement {
|
|
529
528
|
}
|
530
529
|
}
|
531
530
|
|
532
|
-
#
|
533
|
-
|
534
|
-
if (rootTarget === null) {
|
535
|
-
return;
|
536
|
-
}
|
537
|
-
const url = CHROME_SETTINGS_URL;
|
538
|
-
void rootTarget.targetAgent().invoke_createTarget({url}).then(result => {
|
539
|
-
if (result.getError()) {
|
540
|
-
Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(url);
|
541
|
-
}
|
542
|
-
});
|
531
|
+
#onGoToSignIn(): void {
|
532
|
+
Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(SIGN_IN_URL);
|
543
533
|
}
|
544
534
|
|
545
535
|
#focusHeader(): void {
|
@@ -594,7 +584,7 @@ export class ConsoleInsight extends HTMLElement {
|
|
594
584
|
<main jslog=${jslog}>
|
595
585
|
${
|
596
586
|
this.#state.validMarkdown ? html`<devtools-markdown-view
|
597
|
-
.data=${{tokens: this.#state.tokens, renderer: this.#renderer} as MarkdownView.MarkdownView.MarkdownViewData}>
|
587
|
+
.data=${{tokens: this.#state.tokens, renderer: this.#renderer, animationEnabled: true} as MarkdownView.MarkdownView.MarkdownViewData}>
|
598
588
|
</devtools-markdown-view>`: this.#state.explanation
|
599
589
|
}
|
600
590
|
<details style="--list-height: ${(this.#state.sources.length + (this.#state.isPageReloadRecommended ? 1 : 0)) * 20}px;" jslog=${VisualLogging.expand('sources').track({click: true})}>
|
@@ -740,7 +730,7 @@ export class ConsoleInsight extends HTMLElement {
|
|
740
730
|
<div class="filler"></div>
|
741
731
|
<div>
|
742
732
|
<devtools-button
|
743
|
-
@click=${this.#
|
733
|
+
@click=${this.#onGoToSignIn}
|
744
734
|
.data=${
|
745
735
|
{
|
746
736
|
variant: Buttons.Button.Variant.PRIMARY,
|
@@ -748,7 +738,7 @@ export class ConsoleInsight extends HTMLElement {
|
|
748
738
|
} as Buttons.Button.ButtonData
|
749
739
|
}
|
750
740
|
>
|
751
|
-
${UIStrings.
|
741
|
+
${UIStrings.signIn}
|
752
742
|
</devtools-button>
|
753
743
|
</div>
|
754
744
|
</footer>`;
|
@@ -9,7 +9,7 @@ import {
|
|
9
9
|
|
10
10
|
import * as Freestyler from './freestyler.js';
|
11
11
|
|
12
|
-
const {AiAgent, ResponseType} = Freestyler;
|
12
|
+
const {AiAgent, ResponseType, ConversationContext} = Freestyler;
|
13
13
|
|
14
14
|
class AiAgentMock extends AiAgent<unknown> {
|
15
15
|
type = Freestyler.AgentType.FREESTYLER;
|
@@ -225,4 +225,61 @@ describeWithEnvironment('AiAgent', () => {
|
|
225
225
|
]);
|
226
226
|
});
|
227
227
|
});
|
228
|
+
|
229
|
+
describe('ConversationContext', () => {
|
230
|
+
function getTestContext(origin: string) {
|
231
|
+
class TestContext extends ConversationContext<undefined> {
|
232
|
+
override getIcon(): HTMLElement {
|
233
|
+
throw new Error('Method not implemented.');
|
234
|
+
}
|
235
|
+
override getTitle(): string {
|
236
|
+
throw new Error('Method not implemented.');
|
237
|
+
}
|
238
|
+
override getOrigin(): string {
|
239
|
+
return origin;
|
240
|
+
}
|
241
|
+
override getItem(): undefined {
|
242
|
+
return undefined;
|
243
|
+
}
|
244
|
+
}
|
245
|
+
return new TestContext();
|
246
|
+
}
|
247
|
+
it('checks context origins', () => {
|
248
|
+
const tests = [
|
249
|
+
{
|
250
|
+
contextOrigin: 'https://google.test',
|
251
|
+
agentOrigin: 'https://google.test',
|
252
|
+
isAllowed: true,
|
253
|
+
},
|
254
|
+
{
|
255
|
+
contextOrigin: 'https://google.test',
|
256
|
+
agentOrigin: 'about:blank',
|
257
|
+
isAllowed: false,
|
258
|
+
},
|
259
|
+
{
|
260
|
+
contextOrigin: 'https://google.test',
|
261
|
+
agentOrigin: 'https://www.google.test',
|
262
|
+
isAllowed: false,
|
263
|
+
},
|
264
|
+
{
|
265
|
+
contextOrigin: 'https://a.test',
|
266
|
+
agentOrigin: 'https://b.test',
|
267
|
+
isAllowed: false,
|
268
|
+
},
|
269
|
+
{
|
270
|
+
contextOrigin: 'https://a.test',
|
271
|
+
agentOrigin: 'file:///tmp',
|
272
|
+
isAllowed: false,
|
273
|
+
},
|
274
|
+
{
|
275
|
+
contextOrigin: 'https://a.test',
|
276
|
+
agentOrigin: 'http://a.test',
|
277
|
+
isAllowed: false,
|
278
|
+
},
|
279
|
+
];
|
280
|
+
for (const test of tests) {
|
281
|
+
assert.strictEqual(getTestContext(test.contextOrigin).isOriginAllowed(test.agentOrigin), test.isAllowed);
|
282
|
+
}
|
283
|
+
});
|
284
|
+
});
|
228
285
|
});
|
@@ -3,6 +3,7 @@
|
|
3
3
|
// found in the LICENSE file.
|
4
4
|
|
5
5
|
import * as Host from '../../core/host/host.js';
|
6
|
+
import type * as LitHtml from '../../ui/lit-html/lit-html.js';
|
6
7
|
|
7
8
|
export const enum ResponseType {
|
8
9
|
CONTEXT = 'context',
|
@@ -127,6 +128,24 @@ export const enum AgentType {
|
|
127
128
|
|
128
129
|
const MAX_STEP = 10;
|
129
130
|
|
131
|
+
export abstract class ConversationContext<T> {
|
132
|
+
abstract getOrigin(): string;
|
133
|
+
abstract getItem(): T;
|
134
|
+
abstract getIcon(): HTMLElement;
|
135
|
+
abstract getTitle(): string|ReturnType<typeof LitHtml.Directives.until>;
|
136
|
+
|
137
|
+
isOriginAllowed(agentOrigin: string|undefined): boolean {
|
138
|
+
if (!agentOrigin) {
|
139
|
+
return true;
|
140
|
+
}
|
141
|
+
// Currently does not handle opaque origins because they
|
142
|
+
// are not available to DevTools, instead checks
|
143
|
+
// that serialization of the origin is the same
|
144
|
+
// https://html.spec.whatwg.org/#ascii-serialisation-of-an-origin.
|
145
|
+
return this.getOrigin() === agentOrigin;
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
130
149
|
export abstract class AiAgent<T> {
|
131
150
|
static validTemperature(temperature: number|undefined): number|undefined {
|
132
151
|
return typeof temperature === 'number' && temperature >= 0 ? temperature : undefined;
|
@@ -140,13 +159,20 @@ export abstract class AiAgent<T> {
|
|
140
159
|
abstract readonly options: AidaRequestOptions;
|
141
160
|
abstract readonly clientFeature: Host.AidaClient.ClientFeature;
|
142
161
|
abstract readonly userTier: string|undefined;
|
143
|
-
abstract handleContextDetails(select: T
|
162
|
+
abstract handleContextDetails(select: ConversationContext<T>|null): AsyncGenerator<ContextResponse, void, void>;
|
163
|
+
#generatedFromHistory = false;
|
144
164
|
|
145
165
|
/**
|
146
166
|
* Mapping between the unique request id and
|
147
167
|
* the history chuck it created
|
148
168
|
*/
|
149
169
|
#history = new Map<number, ResponseData[]>();
|
170
|
+
/**
|
171
|
+
* Might need to be part of history in case we allow chatting in
|
172
|
+
* historical conversations.
|
173
|
+
*/
|
174
|
+
#origin?: string;
|
175
|
+
#context?: ConversationContext<T>;
|
150
176
|
|
151
177
|
constructor(opts: AgentOptions) {
|
152
178
|
this.#aidaClient = opts.aidaClient;
|
@@ -165,6 +191,14 @@ export abstract class AiAgent<T> {
|
|
165
191
|
return this.#history.size <= 0;
|
166
192
|
}
|
167
193
|
|
194
|
+
get origin(): string|undefined {
|
195
|
+
return this.#origin;
|
196
|
+
}
|
197
|
+
|
198
|
+
get context(): ConversationContext<T>|undefined {
|
199
|
+
return this.#context;
|
200
|
+
}
|
201
|
+
|
168
202
|
get title(): string|undefined {
|
169
203
|
return [...this.#history.values()]
|
170
204
|
.flat()
|
@@ -175,6 +209,10 @@ export abstract class AiAgent<T> {
|
|
175
209
|
?.query;
|
176
210
|
}
|
177
211
|
|
212
|
+
get isHistoryEntry(): boolean {
|
213
|
+
return this.#generatedFromHistory;
|
214
|
+
}
|
215
|
+
|
178
216
|
#structuredLog: Array<{
|
179
217
|
request: Host.AidaClient.AidaRequest,
|
180
218
|
response: string,
|
@@ -248,7 +286,7 @@ export abstract class AiAgent<T> {
|
|
248
286
|
throw new Error('Unexpected action found');
|
249
287
|
}
|
250
288
|
|
251
|
-
async enhanceQuery(query: string, selected: T
|
289
|
+
async enhanceQuery(query: string, selected: ConversationContext<T>|null): Promise<string>;
|
252
290
|
async enhanceQuery(query: string): Promise<string> {
|
253
291
|
return query;
|
254
292
|
}
|
@@ -359,8 +397,20 @@ STOP`;
|
|
359
397
|
|
360
398
|
#runId = 0;
|
361
399
|
async * run(query: string, options: {
|
362
|
-
signal?: AbortSignal, selected: T
|
400
|
+
signal?: AbortSignal, selected: ConversationContext<T>|null,
|
363
401
|
}): AsyncGenerator<ResponseData, void, void> {
|
402
|
+
if (this.#generatedFromHistory) {
|
403
|
+
throw new Error('History entries are read-only.');
|
404
|
+
}
|
405
|
+
|
406
|
+
// First context set on the agent determines its origin from now on.
|
407
|
+
if (options.selected && this.#origin === undefined && options.selected) {
|
408
|
+
this.#origin = options.selected.getOrigin();
|
409
|
+
}
|
410
|
+
// Remember if the context that is set.
|
411
|
+
if (options.selected && !this.#context) {
|
412
|
+
this.#context = options.selected;
|
413
|
+
}
|
364
414
|
const id = this.#runId++;
|
365
415
|
|
366
416
|
const response = {
|
@@ -500,6 +550,11 @@ STOP`;
|
|
500
550
|
}
|
501
551
|
|
502
552
|
async * runFromHistory(): AsyncGenerator<ResponseData, void, void> {
|
553
|
+
if (this.isEmpty) {
|
554
|
+
return;
|
555
|
+
}
|
556
|
+
|
557
|
+
this.#generatedFromHistory = true;
|
503
558
|
for (const historyChunk of this.#history.values()) {
|
504
559
|
for (const entry of historyChunk) {
|
505
560
|
yield entry;
|
@@ -16,7 +16,7 @@ import {describeWithMockConnection} from '../../testing/MockConnection.js';
|
|
16
16
|
import {loadBasicSourceMapExample} from '../../testing/SourceMapHelpers.js';
|
17
17
|
import {createContentProviderUISourceCodes} from '../../testing/UISourceCodeHelpers.js';
|
18
18
|
|
19
|
-
import {DrJonesFileAgent, formatSourceMapDetails, ResponseType} from './freestyler.js';
|
19
|
+
import {DrJonesFileAgent, FileContext, formatFile, formatSourceMapDetails, ResponseType} from './freestyler.js';
|
20
20
|
|
21
21
|
describeWithMockConnection('DrJonesFileAgent', () => {
|
22
22
|
function mockHostConfig(modelId?: string, temperature?: number) {
|
@@ -133,6 +133,34 @@ describeWithMockConnection('DrJonesFileAgent', () => {
|
|
133
133
|
});
|
134
134
|
});
|
135
135
|
|
136
|
+
async function createUISourceCode(options?: {
|
137
|
+
content?: string,
|
138
|
+
mimeType?: string,
|
139
|
+
url?: Platform.DevToolsPath.UrlString,
|
140
|
+
resourceType?: Common.ResourceType.ResourceType,
|
141
|
+
}): Promise<Workspace.UISourceCode.UISourceCode> {
|
142
|
+
const url = options?.url ?? 'http://example.test/script.js' as Platform.DevToolsPath.UrlString;
|
143
|
+
const {project} = createContentProviderUISourceCodes({
|
144
|
+
items: [
|
145
|
+
{
|
146
|
+
url,
|
147
|
+
mimeType: options?.mimeType ?? 'application/javascript',
|
148
|
+
resourceType: options?.resourceType ?? Common.ResourceType.resourceTypes.Script,
|
149
|
+
content: options?.content ?? undefined,
|
150
|
+
},
|
151
|
+
],
|
152
|
+
target: createTarget(),
|
153
|
+
});
|
154
|
+
|
155
|
+
const uiSourceCode = project.uiSourceCodeForURL(url);
|
156
|
+
|
157
|
+
if (!uiSourceCode) {
|
158
|
+
throw new Error('Failed to create a test uiSourceCode');
|
159
|
+
}
|
160
|
+
await uiSourceCode.requestContentData();
|
161
|
+
return uiSourceCode;
|
162
|
+
}
|
163
|
+
|
136
164
|
describe('run', () => {
|
137
165
|
it('generates an answer', async () => {
|
138
166
|
async function* generateAnswer() {
|
@@ -149,20 +177,9 @@ describeWithMockConnection('DrJonesFileAgent', () => {
|
|
149
177
|
aidaClient: mockAidaClient(generateAnswer),
|
150
178
|
});
|
151
179
|
|
152
|
-
const
|
153
|
-
const
|
154
|
-
|
155
|
-
{
|
156
|
-
url,
|
157
|
-
mimeType: 'application/javascript',
|
158
|
-
resourceType: Common.ResourceType.resourceTypes.Script,
|
159
|
-
},
|
160
|
-
],
|
161
|
-
target: createTarget(),
|
162
|
-
});
|
163
|
-
|
164
|
-
const uiSourceCode = project.uiSourceCodeForURL(url);
|
165
|
-
const responses = await Array.fromAsync(agent.run('test', {selected: uiSourceCode}));
|
180
|
+
const uiSourceCode = await createUISourceCode();
|
181
|
+
const responses =
|
182
|
+
await Array.fromAsync(agent.run('test', {selected: uiSourceCode ? new FileContext(uiSourceCode) : null}));
|
166
183
|
|
167
184
|
assert.deepStrictEqual(responses, [
|
168
185
|
{
|
@@ -175,17 +192,28 @@ describeWithMockConnection('DrJonesFileAgent', () => {
|
|
175
192
|
details: [
|
176
193
|
{
|
177
194
|
title: 'Selected file',
|
178
|
-
text: `File
|
179
|
-
URL: http://example.
|
180
|
-
File
|
195
|
+
text: `File name: script.js
|
196
|
+
URL: http://example.test/script.js
|
197
|
+
File content:
|
198
|
+
\`\`\`
|
199
|
+
|
181
200
|
\`\`\``,
|
182
201
|
},
|
183
202
|
],
|
184
203
|
},
|
185
204
|
{
|
186
205
|
type: ResponseType.QUERYING,
|
187
|
-
query:
|
188
|
-
|
206
|
+
query: `# Selected file
|
207
|
+
File name: script.js
|
208
|
+
URL: http://example.test/script.js
|
209
|
+
File content:
|
210
|
+
\`\`\`
|
211
|
+
|
212
|
+
\`\`\`
|
213
|
+
|
214
|
+
# User request
|
215
|
+
|
216
|
+
test`,
|
189
217
|
},
|
190
218
|
{
|
191
219
|
type: ResponseType.ANSWER,
|
@@ -198,9 +226,17 @@ File Content:\n\`\`\`
|
|
198
226
|
assert.deepStrictEqual(agent.chatHistoryForTesting, [
|
199
227
|
{
|
200
228
|
entity: 1,
|
201
|
-
text: `# Selected file
|
202
|
-
|
203
|
-
|
229
|
+
text: `# Selected file
|
230
|
+
File name: script.js
|
231
|
+
URL: http://example.test/script.js
|
232
|
+
File content:
|
233
|
+
\`\`\`
|
234
|
+
|
235
|
+
\`\`\`
|
236
|
+
|
237
|
+
# User request
|
238
|
+
|
239
|
+
test`,
|
204
240
|
},
|
205
241
|
{
|
206
242
|
entity: 2,
|
@@ -225,4 +261,44 @@ File Content:\n\`\`\`\n\`\`\`\n\n# User request\n\ntest`,
|
|
225
261
|
assert.strictEqual(response, 'Source map: file://gen.js.map');
|
226
262
|
});
|
227
263
|
});
|
264
|
+
|
265
|
+
describe('formatFile', () => {
|
266
|
+
it('formats file content', async () => {
|
267
|
+
const uiSourceCode = await createUISourceCode({
|
268
|
+
content: 'lorem ipsum',
|
269
|
+
});
|
270
|
+
assert.strictEqual(formatFile(uiSourceCode), `File name: script.js
|
271
|
+
URL: http://example.test/script.js
|
272
|
+
File content:
|
273
|
+
\`\`\`
|
274
|
+
lorem ipsum
|
275
|
+
\`\`\``);
|
276
|
+
});
|
277
|
+
|
278
|
+
it('formats file content of a binary file', async () => {
|
279
|
+
const uiSourceCode = await createUISourceCode({
|
280
|
+
resourceType: Common.ResourceType.resourceTypes.Image,
|
281
|
+
mimeType: 'application/png',
|
282
|
+
url: 'http://example.test/test.png' as Platform.DevToolsPath.UrlString,
|
283
|
+
});
|
284
|
+
assert.strictEqual(formatFile(uiSourceCode), `File name: test.png
|
285
|
+
URL: http://example.test/test.png
|
286
|
+
File content:
|
287
|
+
\`\`\`
|
288
|
+
<binary data>
|
289
|
+
\`\`\``);
|
290
|
+
});
|
291
|
+
|
292
|
+
it('truncates long file content', async () => {
|
293
|
+
const uiSourceCode = await createUISourceCode({
|
294
|
+
content: 'lorem ipsum'.repeat(10_000),
|
295
|
+
});
|
296
|
+
assert.strictEqual(formatFile(uiSourceCode), `File name: script.js
|
297
|
+
URL: http://example.test/script.js
|
298
|
+
File content:
|
299
|
+
\`\`\`
|
300
|
+
lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsuml...
|
301
|
+
\`\`\``);
|
302
|
+
});
|
303
|
+
});
|
228
304
|
});
|
@@ -7,6 +7,7 @@ import * as Host from '../../core/host/host.js';
|
|
7
7
|
import * as i18n from '../../core/i18n/i18n.js';
|
8
8
|
import * as Bindings from '../../models/bindings/bindings.js';
|
9
9
|
import type * as Workspace from '../../models/workspace/workspace.js';
|
10
|
+
import * as PanelUtils from '../utils/utils.js';
|
10
11
|
|
11
12
|
import {
|
12
13
|
AgentType,
|
@@ -14,6 +15,7 @@ import {
|
|
14
15
|
type AidaRequestOptions,
|
15
16
|
type ContextDetail,
|
16
17
|
type ContextResponse,
|
18
|
+
ConversationContext,
|
17
19
|
type ParsedResponse,
|
18
20
|
ResponseType,
|
19
21
|
} from './AiAgent.js';
|
@@ -69,6 +71,31 @@ const lockedString = i18n.i18n.lockedString;
|
|
69
71
|
|
70
72
|
const MAX_FILE_SIZE = 10000;
|
71
73
|
|
74
|
+
export class FileContext extends ConversationContext<Workspace.UISourceCode.UISourceCode> {
|
75
|
+
#file: Workspace.UISourceCode.UISourceCode;
|
76
|
+
|
77
|
+
constructor(file: Workspace.UISourceCode.UISourceCode) {
|
78
|
+
super();
|
79
|
+
this.#file = file;
|
80
|
+
}
|
81
|
+
|
82
|
+
override getOrigin(): string {
|
83
|
+
return new URL(this.#file.url()).origin;
|
84
|
+
}
|
85
|
+
|
86
|
+
override getItem(): Workspace.UISourceCode.UISourceCode {
|
87
|
+
return this.#file;
|
88
|
+
}
|
89
|
+
|
90
|
+
override getIcon(): HTMLElement {
|
91
|
+
return PanelUtils.PanelUtils.getIconForSourceFile(this.#file);
|
92
|
+
}
|
93
|
+
|
94
|
+
override getTitle(): string {
|
95
|
+
return this.#file.displayName();
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
72
99
|
/**
|
73
100
|
* One agent instance handles one conversation. Create a new agent
|
74
101
|
* instance for a new conversation.
|
@@ -79,14 +106,12 @@ export class DrJonesFileAgent extends AiAgent<Workspace.UISourceCode.UISourceCod
|
|
79
106
|
readonly clientFeature = Host.AidaClient.ClientFeature.CHROME_DRJONES_FILE_AGENT;
|
80
107
|
get userTier(): string|undefined {
|
81
108
|
const config = Common.Settings.Settings.instance().getHostConfig();
|
82
|
-
return config.devToolsAiAssistanceFileAgent?.userTier
|
109
|
+
return config.devToolsAiAssistanceFileAgent?.userTier;
|
83
110
|
}
|
84
111
|
get options(): AidaRequestOptions {
|
85
112
|
const config = Common.Settings.Settings.instance().getHostConfig();
|
86
|
-
const temperature =
|
87
|
-
|
88
|
-
const modelId =
|
89
|
-
config.devToolsAiAssistanceFileAgent?.modelId ?? config.devToolsAiAssistanceFileAgentDogfood?.modelId;
|
113
|
+
const temperature = config.devToolsAiAssistanceFileAgent?.temperature;
|
114
|
+
const modelId = config.devToolsAiAssistanceFileAgent?.modelId;
|
90
115
|
|
91
116
|
return {
|
92
117
|
temperature,
|
@@ -95,7 +120,7 @@ export class DrJonesFileAgent extends AiAgent<Workspace.UISourceCode.UISourceCod
|
|
95
120
|
}
|
96
121
|
|
97
122
|
async *
|
98
|
-
handleContextDetails(selectedFile: Workspace.UISourceCode.UISourceCode
|
123
|
+
handleContextDetails(selectedFile: ConversationContext<Workspace.UISourceCode.UISourceCode>|null):
|
99
124
|
AsyncGenerator<ContextResponse, void, void> {
|
100
125
|
if (!selectedFile) {
|
101
126
|
return;
|
@@ -108,9 +133,10 @@ export class DrJonesFileAgent extends AiAgent<Workspace.UISourceCode.UISourceCod
|
|
108
133
|
};
|
109
134
|
}
|
110
135
|
|
111
|
-
override async enhanceQuery(
|
136
|
+
override async enhanceQuery(
|
137
|
+
query: string, selectedFile: ConversationContext<Workspace.UISourceCode.UISourceCode>|null): Promise<string> {
|
112
138
|
const fileEnchantmentQuery =
|
113
|
-
selectedFile ? `# Selected file\n${formatFile(selectedFile)}\n\n# User request\n\n` : '';
|
139
|
+
selectedFile ? `# Selected file\n${formatFile(selectedFile.getItem())}\n\n# User request\n\n` : '';
|
114
140
|
return `${fileEnchantmentQuery}${query}`;
|
115
141
|
}
|
116
142
|
|
@@ -121,28 +147,35 @@ export class DrJonesFileAgent extends AiAgent<Workspace.UISourceCode.UISourceCod
|
|
121
147
|
}
|
122
148
|
}
|
123
149
|
|
124
|
-
function createContextDetailsForDrJonesFileAgent(
|
125
|
-
[ContextDetail, ...ContextDetail[]] {
|
150
|
+
function createContextDetailsForDrJonesFileAgent(
|
151
|
+
selectedFile: ConversationContext<Workspace.UISourceCode.UISourceCode>): [ContextDetail, ...ContextDetail[]] {
|
126
152
|
return [
|
127
153
|
{
|
128
154
|
title: 'Selected file',
|
129
|
-
text: formatFile(selectedFile),
|
155
|
+
text: formatFile(selectedFile.getItem()),
|
130
156
|
},
|
131
157
|
];
|
132
158
|
}
|
133
159
|
|
134
|
-
function formatFile(selectedFile: Workspace.UISourceCode.UISourceCode): string {
|
160
|
+
export function formatFile(selectedFile: Workspace.UISourceCode.UISourceCode): string {
|
135
161
|
const debuggerWorkspaceBinding = Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance();
|
136
|
-
|
137
|
-
|
138
|
-
${
|
139
|
-
|
140
|
-
|
162
|
+
const sourceMapDetails = formatSourceMapDetails(selectedFile, debuggerWorkspaceBinding);
|
163
|
+
const lines = [
|
164
|
+
`File name: ${selectedFile.displayName()}`,
|
165
|
+
`URL: ${selectedFile.url()}`,
|
166
|
+
sourceMapDetails,
|
167
|
+
`File content:
|
168
|
+
${formatFileContent(selectedFile)}`,
|
169
|
+
];
|
170
|
+
return lines.filter(line => line.trim() !== '').join('\n');
|
141
171
|
}
|
142
172
|
|
143
|
-
function formatFileContent(
|
144
|
-
const
|
145
|
-
|
173
|
+
function formatFileContent(selectedFile: Workspace.UISourceCode.UISourceCode): string {
|
174
|
+
const content = selectedFile.contentType().isTextType() ? selectedFile.content() : '<binary data>';
|
175
|
+
const truncated = content.length > MAX_FILE_SIZE ? content.slice(0, MAX_FILE_SIZE) + '...' : content;
|
176
|
+
return `\`\`\`
|
177
|
+
${truncated}
|
178
|
+
\`\`\``;
|
146
179
|
}
|
147
180
|
|
148
181
|
export function formatSourceMapDetails(
|