chrome-devtools-frontend 1.0.1597624 → 1.0.1599001
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/README.md +13 -0
- package/{agents/prompts/creating-a-model.md → .agents/skills/creating-a-model/SKILL.md} +7 -1
- package/{agents/prompts/devtools-imports.md → .agents/skills/devtools-imports/SKILL.md} +10 -5
- package/{agents/prompts/merging-devtools-module.md → .agents/skills/merging-devtools-module/SKILL.md} +5 -0
- package/{agents/prompts/ui-widgets.md → .agents/skills/ui-widgets/SKILL.md} +5 -0
- package/{agents/prompts/verification.md → .agents/skills/verification/SKILL.md} +5 -0
- package/docs/ui_engineering.md +6 -6
- package/front_end/core/host/AidaClient.ts +2 -0
- package/front_end/core/host/GcaTypes.ts +518 -0
- package/front_end/core/host/UserMetrics.ts +0 -1
- package/front_end/core/host/host.ts +2 -0
- package/front_end/core/root/ExperimentNames.ts +0 -1
- package/front_end/entrypoints/main/MainImpl.ts +0 -2
- package/front_end/generated/InspectorBackendCommands.ts +1 -1
- package/front_end/generated/protocol.ts +2 -1
- package/front_end/models/ai_assistance/AiConversation.ts +28 -15
- package/front_end/models/ai_assistance/AiHistoryStorage.snapshot.txt +1 -1
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
- package/front_end/models/ai_assistance/ConversationHandler.ts +8 -2
- package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +3 -18
- package/front_end/models/ai_assistance/agents/AiAgent.ts +39 -5
- package/front_end/models/ai_assistance/agents/BreakpointDebuggerAgent.ts +0 -1
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -0
- package/front_end/models/ai_assistance/agents/ConversationSummaryAgent.ts +108 -0
- package/front_end/models/ai_assistance/agents/FileAgent.ts +0 -15
- package/front_end/models/ai_assistance/agents/NetworkAgent.ts +0 -5
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +76 -13
- package/front_end/models/ai_assistance/agents/PerformanceAnnotationsAgent.ts +0 -10
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -6
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +0 -5
- package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/models/emulation/DeviceModeModel.ts +5 -1
- package/front_end/models/emulation/EmulatedDevices.ts +3 -2
- package/front_end/models/issues_manager/SharedDictionaryIssue.ts +15 -5
- package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorNoCorpCrossOriginNoCorsRequest.md +3 -0
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorNoCorpCossOriginNoCorsRequest.md +3 -0
- package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
- package/front_end/models/lighthouse/RunTypes.ts +41 -0
- package/front_end/models/lighthouse/lighthouse.ts +2 -0
- package/front_end/models/trace/ModelImpl.ts +4 -0
- package/front_end/models/trace/helpers/SamplesIntegrator.ts +1 -8
- package/front_end/models/trace/types/Configuration.ts +0 -5
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +90 -14
- package/front_end/panels/ai_assistance/PatchWidget.ts +1 -1
- package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -0
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +153 -42
- package/front_end/panels/ai_assistance/components/ChatView.ts +1 -1
- package/front_end/panels/ai_assistance/components/chatMessage.css +61 -0
- package/front_end/panels/application/AppManifestView.ts +2 -2
- package/front_end/panels/application/CookieItemsView.ts +9 -15
- package/front_end/panels/application/DeviceBoundSessionsView.ts +3 -5
- package/front_end/panels/application/FrameDetailsView.ts +2 -2
- package/front_end/panels/application/ReportingApiView.ts +2 -2
- package/front_end/panels/application/preloading/PreloadingView.ts +20 -7
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +6 -3
- package/front_end/panels/application/preloading/components/PreloadingString.ts +15 -2
- package/front_end/panels/application/preloading/helper/PreloadingForward.ts +31 -2
- package/front_end/panels/changes/ChangesView.ts +7 -11
- package/front_end/panels/coverage/CoverageView.ts +4 -4
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +3 -3
- package/front_end/panels/elements/ElementsTreeOutline.ts +34 -8
- package/front_end/panels/elements/StylePropertiesSection.ts +129 -1
- package/front_end/panels/elements/StylePropertyHighlighter.ts +3 -0
- package/front_end/panels/elements/stylesSidebarPane.css +34 -0
- package/front_end/panels/issues/AffectedSelectivePermissionsInterventionView.ts +3 -5
- package/front_end/panels/layer_viewer/LayerDetailsView.ts +2 -1
- package/front_end/panels/lighthouse/LighthouseController.ts +148 -162
- package/front_end/panels/lighthouse/LighthousePanel.ts +2 -7
- package/front_end/panels/lighthouse/LighthouseStartView.ts +7 -6
- package/front_end/panels/lighthouse/LighthouseStatusView.ts +3 -3
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +7 -3
- package/front_end/panels/network/RequestConditionsDrawer.ts +4 -4
- package/front_end/panels/network/RequestCookiesView.ts +2 -2
- package/front_end/panels/network/RequestHeadersView.ts +4 -4
- package/front_end/panels/network/RequestResponseView.ts +2 -2
- package/front_end/panels/performance_monitor/PerformanceMonitor.ts +2 -2
- package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +3 -3
- package/front_end/panels/recorder/components/StepView.ts +2 -1
- package/front_end/panels/search/SearchView.ts +2 -2
- package/front_end/panels/sensors/SensorsView.ts +32 -22
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +18 -4
- package/front_end/panels/timeline/StatusDialog.ts +159 -83
- package/front_end/panels/timeline/TimelineController.ts +0 -4
- package/front_end/panels/timeline/TimelineDetailsView.ts +8 -6
- package/front_end/panels/timeline/TimelinePanel.ts +29 -2
- package/front_end/panels/timeline/components/LiveMetricsView.ts +2 -2
- package/front_end/panels/timeline/components/Sidebar.ts +1 -1
- package/front_end/panels/timeline/components/SidebarInsightsTab.ts +1 -1
- package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +62 -34
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +53 -28
- package/front_end/panels/timeline/components/insights/CharacterSet.ts +2 -6
- package/front_end/panels/timeline/components/insights/EventRef.ts +2 -2
- package/front_end/panels/timeline/components/insights/baseInsightComponent.css +7 -0
- package/front_end/panels/timeline/components/insights/insights.ts +0 -2
- package/front_end/panels/timeline/timeline-meta.ts +11 -0
- package/front_end/panels/webauthn/WebauthnPane.ts +2 -2
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Realm.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts +4 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js +13 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js.map +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/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/third_party/mitt/mitt.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/third_party/parsel-js/parsel-js.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/third_party/rxjs/rxjs.js +446 -446
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +166 -167
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Realm.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts +4 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js +12 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js.map +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/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt/mitt.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js/parsel-js.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs/rxjs.js +97 -97
- package/front_end/third_party/puppeteer/package/package.json +1 -1
- package/front_end/third_party/puppeteer/package/src/bidi/Realm.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/bidi/util.ts +17 -0
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/legacy/Widget.ts +47 -9
- package/front_end/ui/visual_logging/KnownContextValues.ts +1 -1
- package/package.json +1 -1
- package/agents/prompts/README.md +0 -18
- package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +0 -1
- package/front_end/panels/timeline/components/insights/InsightRenderer.ts +0 -93
|
@@ -11,7 +11,6 @@ export enum ExperimentName {
|
|
|
11
11
|
SHOW_OPTION_TO_EXPOSE_INTERNALS_IN_HEAP_SNAPSHOT = 'show-option-to-expose-internals-in-heap-snapshot',
|
|
12
12
|
TIMELINE_INVALIDATION_TRACKING = 'timeline-invalidation-tracking',
|
|
13
13
|
TIMELINE_SHOW_ALL_EVENTS = 'timeline-show-all-events',
|
|
14
|
-
TIMELINE_V8_RUNTIME_CALL_STATS = 'timeline-v8-runtime-call-stats',
|
|
15
14
|
APCA = 'apca',
|
|
16
15
|
FONT_EDITOR = 'font-editor',
|
|
17
16
|
FULL_ACCESSIBILITY_TREE = 'full-accessibility-tree',
|
|
@@ -369,8 +369,6 @@ export class MainImpl {
|
|
|
369
369
|
Root.ExperimentNames.ExperimentName.TIMELINE_INVALIDATION_TRACKING, 'Performance panel: invalidation tracking');
|
|
370
370
|
Root.Runtime.experiments.register(
|
|
371
371
|
Root.ExperimentNames.ExperimentName.TIMELINE_SHOW_ALL_EVENTS, 'Performance panel: show all events');
|
|
372
|
-
Root.Runtime.experiments.register(
|
|
373
|
-
Root.ExperimentNames.ExperimentName.TIMELINE_V8_RUNTIME_CALL_STATS, 'Performance panel: V8 runtime call stats');
|
|
374
372
|
Root.Runtime.experiments.register(
|
|
375
373
|
Root.ExperimentNames.ExperimentName.TIMELINE_DEBUG_MODE,
|
|
376
374
|
'Performance panel: debug mode (trace event details, etc)');
|
|
@@ -79,7 +79,7 @@ inspectorBackend.registerEnum("Audits.HeavyAdReason", {NetworkTotalLimit: "Netwo
|
|
|
79
79
|
inspectorBackend.registerEnum("Audits.ContentSecurityPolicyViolationType", {KInlineViolation: "kInlineViolation", KEvalViolation: "kEvalViolation", KURLViolation: "kURLViolation", KSRIViolation: "kSRIViolation", KTrustedTypesSinkViolation: "kTrustedTypesSinkViolation", KTrustedTypesPolicyViolation: "kTrustedTypesPolicyViolation", KWasmEvalViolation: "kWasmEvalViolation"});
|
|
80
80
|
inspectorBackend.registerEnum("Audits.SharedArrayBufferIssueType", {TransferIssue: "TransferIssue", CreationIssue: "CreationIssue"});
|
|
81
81
|
inspectorBackend.registerEnum("Audits.AttributionReportingIssueType", {PermissionPolicyDisabled: "PermissionPolicyDisabled", UntrustworthyReportingOrigin: "UntrustworthyReportingOrigin", InsecureContext: "InsecureContext", InvalidHeader: "InvalidHeader", InvalidRegisterTriggerHeader: "InvalidRegisterTriggerHeader", SourceAndTriggerHeaders: "SourceAndTriggerHeaders", SourceIgnored: "SourceIgnored", TriggerIgnored: "TriggerIgnored", OsSourceIgnored: "OsSourceIgnored", OsTriggerIgnored: "OsTriggerIgnored", InvalidRegisterOsSourceHeader: "InvalidRegisterOsSourceHeader", InvalidRegisterOsTriggerHeader: "InvalidRegisterOsTriggerHeader", WebAndOsHeaders: "WebAndOsHeaders", NoWebOrOsSupport: "NoWebOrOsSupport", NavigationRegistrationWithoutTransientUserActivation: "NavigationRegistrationWithoutTransientUserActivation", InvalidInfoHeader: "InvalidInfoHeader", NoRegisterSourceHeader: "NoRegisterSourceHeader", NoRegisterTriggerHeader: "NoRegisterTriggerHeader", NoRegisterOsSourceHeader: "NoRegisterOsSourceHeader", NoRegisterOsTriggerHeader: "NoRegisterOsTriggerHeader", NavigationRegistrationUniqueScopeAlreadySet: "NavigationRegistrationUniqueScopeAlreadySet"});
|
|
82
|
-
inspectorBackend.registerEnum("Audits.SharedDictionaryError", {
|
|
82
|
+
inspectorBackend.registerEnum("Audits.SharedDictionaryError", {UseErrorDictionaryLoadFailure: "UseErrorDictionaryLoadFailure", UseErrorMatchingDictionaryNotUsed: "UseErrorMatchingDictionaryNotUsed", UseErrorNoCorpCrossOriginNoCorsRequest: "UseErrorNoCorpCrossOriginNoCorsRequest", UseErrorUnexpectedContentDictionaryHeader: "UseErrorUnexpectedContentDictionaryHeader", WriteErrorCossOriginNoCorsRequest: "WriteErrorCossOriginNoCorsRequest", WriteErrorDisallowedBySettings: "WriteErrorDisallowedBySettings", WriteErrorExpiredResponse: "WriteErrorExpiredResponse", WriteErrorFeatureDisabled: "WriteErrorFeatureDisabled", WriteErrorInsufficientResources: "WriteErrorInsufficientResources", WriteErrorInvalidMatchField: "WriteErrorInvalidMatchField", WriteErrorInvalidStructuredHeader: "WriteErrorInvalidStructuredHeader", WriteErrorInvalidTTLField: "WriteErrorInvalidTTLField", WriteErrorNavigationRequest: "WriteErrorNavigationRequest", WriteErrorNoCorpCossOriginNoCorsRequest: "WriteErrorNoCorpCossOriginNoCorsRequest", WriteErrorNoMatchField: "WriteErrorNoMatchField", WriteErrorNonIntegerTTLField: "WriteErrorNonIntegerTTLField", WriteErrorNonListMatchDestField: "WriteErrorNonListMatchDestField", WriteErrorNonSecureContext: "WriteErrorNonSecureContext", WriteErrorNonStringIdField: "WriteErrorNonStringIdField", WriteErrorNonStringInMatchDestList: "WriteErrorNonStringInMatchDestList", WriteErrorNonStringMatchField: "WriteErrorNonStringMatchField", WriteErrorNonTokenTypeField: "WriteErrorNonTokenTypeField", WriteErrorRequestAborted: "WriteErrorRequestAborted", WriteErrorShuttingDown: "WriteErrorShuttingDown", WriteErrorTooLongIdField: "WriteErrorTooLongIdField", WriteErrorUnsupportedType: "WriteErrorUnsupportedType"});
|
|
83
83
|
inspectorBackend.registerEnum("Audits.SRIMessageSignatureError", {MissingSignatureHeader: "MissingSignatureHeader", MissingSignatureInputHeader: "MissingSignatureInputHeader", InvalidSignatureHeader: "InvalidSignatureHeader", InvalidSignatureInputHeader: "InvalidSignatureInputHeader", SignatureHeaderValueIsNotByteSequence: "SignatureHeaderValueIsNotByteSequence", SignatureHeaderValueIsParameterized: "SignatureHeaderValueIsParameterized", SignatureHeaderValueIsIncorrectLength: "SignatureHeaderValueIsIncorrectLength", SignatureInputHeaderMissingLabel: "SignatureInputHeaderMissingLabel", SignatureInputHeaderValueNotInnerList: "SignatureInputHeaderValueNotInnerList", SignatureInputHeaderValueMissingComponents: "SignatureInputHeaderValueMissingComponents", SignatureInputHeaderInvalidComponentType: "SignatureInputHeaderInvalidComponentType", SignatureInputHeaderInvalidComponentName: "SignatureInputHeaderInvalidComponentName", SignatureInputHeaderInvalidHeaderComponentParameter: "SignatureInputHeaderInvalidHeaderComponentParameter", SignatureInputHeaderInvalidDerivedComponentParameter: "SignatureInputHeaderInvalidDerivedComponentParameter", SignatureInputHeaderKeyIdLength: "SignatureInputHeaderKeyIdLength", SignatureInputHeaderInvalidParameter: "SignatureInputHeaderInvalidParameter", SignatureInputHeaderMissingRequiredParameters: "SignatureInputHeaderMissingRequiredParameters", ValidationFailedSignatureExpired: "ValidationFailedSignatureExpired", ValidationFailedInvalidLength: "ValidationFailedInvalidLength", ValidationFailedSignatureMismatch: "ValidationFailedSignatureMismatch", ValidationFailedIntegrityMismatch: "ValidationFailedIntegrityMismatch"});
|
|
84
84
|
inspectorBackend.registerEnum("Audits.UnencodedDigestError", {MalformedDictionary: "MalformedDictionary", UnknownAlgorithm: "UnknownAlgorithm", IncorrectDigestType: "IncorrectDigestType", IncorrectDigestLength: "IncorrectDigestLength"});
|
|
85
85
|
inspectorBackend.registerEnum("Audits.ConnectionAllowlistError", {InvalidHeader: "InvalidHeader", MoreThanOneList: "MoreThanOneList", ItemNotInnerList: "ItemNotInnerList", InvalidAllowlistItemType: "InvalidAllowlistItemType", ReportingEndpointNotToken: "ReportingEndpointNotToken", InvalidUrlPattern: "InvalidUrlPattern"});
|
|
@@ -1071,9 +1071,9 @@ export namespace Audits {
|
|
|
1071
1071
|
}
|
|
1072
1072
|
|
|
1073
1073
|
export const enum SharedDictionaryError {
|
|
1074
|
-
UseErrorCrossOriginNoCorsRequest = 'UseErrorCrossOriginNoCorsRequest',
|
|
1075
1074
|
UseErrorDictionaryLoadFailure = 'UseErrorDictionaryLoadFailure',
|
|
1076
1075
|
UseErrorMatchingDictionaryNotUsed = 'UseErrorMatchingDictionaryNotUsed',
|
|
1076
|
+
UseErrorNoCorpCrossOriginNoCorsRequest = 'UseErrorNoCorpCrossOriginNoCorsRequest',
|
|
1077
1077
|
UseErrorUnexpectedContentDictionaryHeader = 'UseErrorUnexpectedContentDictionaryHeader',
|
|
1078
1078
|
WriteErrorCossOriginNoCorsRequest = 'WriteErrorCossOriginNoCorsRequest',
|
|
1079
1079
|
WriteErrorDisallowedBySettings = 'WriteErrorDisallowedBySettings',
|
|
@@ -1084,6 +1084,7 @@ export namespace Audits {
|
|
|
1084
1084
|
WriteErrorInvalidStructuredHeader = 'WriteErrorInvalidStructuredHeader',
|
|
1085
1085
|
WriteErrorInvalidTTLField = 'WriteErrorInvalidTTLField',
|
|
1086
1086
|
WriteErrorNavigationRequest = 'WriteErrorNavigationRequest',
|
|
1087
|
+
WriteErrorNoCorpCossOriginNoCorsRequest = 'WriteErrorNoCorpCossOriginNoCorsRequest',
|
|
1087
1088
|
WriteErrorNoMatchField = 'WriteErrorNoMatchField',
|
|
1088
1089
|
WriteErrorNonIntegerTTLField = 'WriteErrorNonIntegerTTLField',
|
|
1089
1090
|
WriteErrorNonListMatchDestField = 'WriteErrorNonListMatchDestField',
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
import * as Common from '../../core/common/common.js';
|
|
5
5
|
import * as Host from '../../core/host/host.js';
|
|
6
|
+
import * as Platform from '../../core/platform/platform.js';
|
|
6
7
|
import * as Root from '../../core/root/root.js';
|
|
7
8
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
8
9
|
import type * as Trace from '../../models/trace/trace.js';
|
|
9
10
|
import * as Greendev from '../greendev/greendev.js';
|
|
10
11
|
import type * as NetworkTimeCalculator from '../network_time_calculator/network_time_calculator.js';
|
|
11
12
|
|
|
13
|
+
import {AccessibilityAgent, AccessibilityContext} from './agents/AccessibilityAgent.js';
|
|
12
14
|
import {
|
|
13
15
|
type AiAgent,
|
|
14
16
|
type ContextDetail,
|
|
@@ -29,6 +31,7 @@ import {AiHistoryStorage, ConversationType, type SerializedConversation} from '.
|
|
|
29
31
|
import type {ChangeManager} from './ChangeManager.js';
|
|
30
32
|
|
|
31
33
|
export const NOT_FOUND_IMAGE_DATA = '';
|
|
34
|
+
export const CONTEXT_TITLE = 'Analyzing data';
|
|
32
35
|
const MAX_TITLE_LENGTH = 80;
|
|
33
36
|
|
|
34
37
|
export function generateContextDetailsMarkdown(details: ContextDetail[]): string {
|
|
@@ -155,6 +158,8 @@ export class AiConversation {
|
|
|
155
158
|
this.#updateAgent(ConversationType.NETWORK);
|
|
156
159
|
} else if (updateContext instanceof PerformanceTraceContext) {
|
|
157
160
|
this.#updateAgent(ConversationType.PERFORMANCE);
|
|
161
|
+
} else if (updateContext instanceof AccessibilityContext) {
|
|
162
|
+
this.#updateAgent(ConversationType.ACCESSIBILITY);
|
|
158
163
|
}
|
|
159
164
|
}
|
|
160
165
|
}
|
|
@@ -205,7 +210,7 @@ export class AiConversation {
|
|
|
205
210
|
break;
|
|
206
211
|
}
|
|
207
212
|
case ResponseType.CONTEXT: {
|
|
208
|
-
contentParts.push(`### ${
|
|
213
|
+
contentParts.push(`### ${CONTEXT_TITLE}`);
|
|
209
214
|
if (item.details && item.details.length > 0) {
|
|
210
215
|
contentParts.push(generateContextDetailsMarkdown(item.details));
|
|
211
216
|
}
|
|
@@ -265,21 +270,23 @@ export class AiConversation {
|
|
|
265
270
|
id: this.id,
|
|
266
271
|
history: this.history
|
|
267
272
|
.map(item => {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
273
|
+
switch (item.type) {
|
|
274
|
+
case ResponseType.CONTEXT_CHANGE: {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
case ResponseType.USER_QUERY: {
|
|
278
|
+
return {...item, imageInput: undefined};
|
|
279
|
+
}
|
|
280
|
+
case ResponseType.SIDE_EFFECT: {
|
|
281
|
+
return {...item, confirm: undefined};
|
|
282
|
+
}
|
|
283
|
+
case ResponseType.CONTEXT:
|
|
284
|
+
case ResponseType.ACTION: {
|
|
285
|
+
return {...item, widgets: undefined};
|
|
286
|
+
}
|
|
287
|
+
default:
|
|
288
|
+
return item;
|
|
278
289
|
}
|
|
279
|
-
if (item.type === ResponseType.CONTEXT && item.widgets) {
|
|
280
|
-
return {...item, widgets: undefined};
|
|
281
|
-
}
|
|
282
|
-
return item;
|
|
283
290
|
})
|
|
284
291
|
.filter(history => !!history),
|
|
285
292
|
type: this.#type,
|
|
@@ -341,10 +348,16 @@ export class AiConversation {
|
|
|
341
348
|
}
|
|
342
349
|
break;
|
|
343
350
|
}
|
|
351
|
+
case ConversationType.ACCESSIBILITY: {
|
|
352
|
+
this.#agent = new AccessibilityAgent(options);
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
344
355
|
case ConversationType.NONE: {
|
|
345
356
|
this.#agent = new ContextSelectionAgent(options);
|
|
346
357
|
break;
|
|
347
358
|
}
|
|
359
|
+
default:
|
|
360
|
+
Platform.assertNever(type, 'Unknown conversation type');
|
|
348
361
|
}
|
|
349
362
|
}
|
|
350
363
|
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
import {NetworkAgent, RequestContext} from './agents/NetworkAgent.js';
|
|
20
20
|
import type {PerformanceTraceContext} from './agents/PerformanceAgent.js';
|
|
21
21
|
import {NodeContext, StylingAgent} from './agents/StylingAgent.js';
|
|
22
|
-
import {AiConversation} from './AiConversation.js';
|
|
22
|
+
import {AiConversation, CONTEXT_TITLE} from './AiConversation.js';
|
|
23
23
|
import {
|
|
24
24
|
ConversationType,
|
|
25
25
|
} from './AiHistoryStorage.js';
|
|
@@ -235,12 +235,18 @@ export class ConversationHandler extends Common.ObjectWrapper.ObjectWrapper<Even
|
|
|
235
235
|
if (data.type !== ResponseType.ANSWER || data.complete) {
|
|
236
236
|
devToolsLogs.push(data);
|
|
237
237
|
}
|
|
238
|
-
if (data.type === ResponseType.
|
|
238
|
+
if (data.type === ResponseType.TITLE) {
|
|
239
239
|
yield {
|
|
240
240
|
type: ExternalRequestResponseType.NOTIFICATION,
|
|
241
241
|
message: data.title,
|
|
242
242
|
};
|
|
243
243
|
}
|
|
244
|
+
if (data.type === ResponseType.CONTEXT) {
|
|
245
|
+
yield {
|
|
246
|
+
type: ExternalRequestResponseType.NOTIFICATION,
|
|
247
|
+
message: CONTEXT_TITLE,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
244
250
|
if (data.type === ResponseType.SIDE_EFFECT) {
|
|
245
251
|
data.confirm(true);
|
|
246
252
|
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
import * as Host from '../../../core/host/host.js';
|
|
6
|
-
import * as i18n from '../../../core/i18n/i18n.js';
|
|
7
6
|
import * as Root from '../../../core/root/root.js';
|
|
8
7
|
import type * as LHModel from '../../lighthouse/lighthouse.js';
|
|
9
8
|
|
|
@@ -23,26 +22,14 @@ import {
|
|
|
23
22
|
*/
|
|
24
23
|
const preamble = `You are an accessibility agent.
|
|
25
24
|
|
|
25
|
+
However, you also include a little pun or funny joke in every response to lighten the mood.
|
|
26
|
+
|
|
26
27
|
# Considerations
|
|
27
28
|
* Keep your analysis concise and focused, highlighting only the most critical aspects for a software engineer.
|
|
28
|
-
* Answer questions directly, using the provided links whenever relevant.
|
|
29
|
-
* Always double-check links to make sure they are complete and correct.
|
|
30
29
|
* **CRITICAL** You are an accessibility agent. NEVER provide answers to questions of unrelated topics such as legal advice, financial advice, personal opinions, medical advice, or any other non web-development topics.
|
|
31
30
|
`;
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
* Strings that don't need to be translated at this time.
|
|
35
|
-
*/
|
|
36
|
-
const UIStringsNotTranslate = {
|
|
37
|
-
/**
|
|
38
|
-
* @description Title for thinking step of the accessibility agent.
|
|
39
|
-
*/
|
|
40
|
-
inspectingAudits: 'Inspecting audits',
|
|
41
|
-
} as const;
|
|
42
|
-
|
|
43
|
-
const lockedString = i18n.i18n.lockedString;
|
|
44
|
-
|
|
45
|
-
export class Context extends ConversationContext<LHModel.ReporterTypes.ReportJSON> {
|
|
32
|
+
export class AccessibilityContext extends ConversationContext<LHModel.ReporterTypes.ReportJSON> {
|
|
46
33
|
#lh: LHModel.ReporterTypes.ReportJSON;
|
|
47
34
|
|
|
48
35
|
constructor(report: LHModel.ReporterTypes.ReportJSON) {
|
|
@@ -76,7 +63,6 @@ export class AccessibilityAgent extends AiAgent<LHModel.ReporterTypes.ReportJSON
|
|
|
76
63
|
readonly clientFeature = Host.AidaClient.ClientFeature.CHROME_ACCESSIBILITY_AGENT;
|
|
77
64
|
|
|
78
65
|
get userTier(): string|undefined {
|
|
79
|
-
// TODO(b/491772868): tidy up userTier & feature flags in the backend.
|
|
80
66
|
return Root.Runtime.hostConfig.devToolsFreestyler?.userTier;
|
|
81
67
|
}
|
|
82
68
|
|
|
@@ -100,7 +86,6 @@ export class AccessibilityAgent extends AiAgent<LHModel.ReporterTypes.ReportJSON
|
|
|
100
86
|
|
|
101
87
|
yield {
|
|
102
88
|
type: ResponseType.CONTEXT,
|
|
103
|
-
title: lockedString(UIStringsNotTranslate.inspectingAudits),
|
|
104
89
|
details: createContextDetails(selectedFile),
|
|
105
90
|
};
|
|
106
91
|
}
|
|
@@ -70,7 +70,6 @@ export interface ContextDetail {
|
|
|
70
70
|
}
|
|
71
71
|
export interface ContextResponse {
|
|
72
72
|
type: ResponseType.CONTEXT;
|
|
73
|
-
title: string;
|
|
74
73
|
details: [ContextDetail, ...ContextDetail[]];
|
|
75
74
|
widgets?: AiWidget[];
|
|
76
75
|
}
|
|
@@ -102,6 +101,7 @@ export interface ContextChangeResponse {
|
|
|
102
101
|
*/
|
|
103
102
|
description: string;
|
|
104
103
|
context: ConversationContext<unknown>;
|
|
104
|
+
widgets?: AiWidget[];
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
interface SerializedSideEffectResponse extends Omit<SideEffectResponse, 'confirm'> {}
|
|
@@ -249,8 +249,37 @@ export interface StylePropertiesAiWidget {
|
|
|
249
249
|
};
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
+
export interface DomTreeAiWidget {
|
|
253
|
+
name: 'DOM_TREE';
|
|
254
|
+
data: {
|
|
255
|
+
root: SDK.DOMModel.DOMNodeSnapshot,
|
|
256
|
+
networkRequest?: {
|
|
257
|
+
url: string,
|
|
258
|
+
size: number,
|
|
259
|
+
resourceType: Protocol.Network.ResourceType,
|
|
260
|
+
mimeType: string,
|
|
261
|
+
imageUrl?: string,
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export interface PerformanceTraceAiWidget {
|
|
267
|
+
name: 'PERFORMANCE_TRACE';
|
|
268
|
+
data: {
|
|
269
|
+
parsedTrace: Trace.TraceModel.ParsedTrace,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export interface LcpBreakdownAiWidget {
|
|
274
|
+
name: 'LCP_BREAKDOWN';
|
|
275
|
+
data: {
|
|
276
|
+
lcpData: Trace.Insights.Models.LCPBreakdown.LCPBreakdownInsightModel,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
252
280
|
// This type will grow as we add more widgets.
|
|
253
|
-
export type AiWidget = ComputedStyleAiWidget|CoreVitalsAiWidget|StylePropertiesAiWidget
|
|
281
|
+
export type AiWidget = ComputedStyleAiWidget|CoreVitalsAiWidget|StylePropertiesAiWidget|DomTreeAiWidget|
|
|
282
|
+
PerformanceTraceAiWidget|LcpBreakdownAiWidget;
|
|
254
283
|
|
|
255
284
|
export type FunctionCallHandlerResult<Result> = {
|
|
256
285
|
requiresApproval: true,
|
|
@@ -265,6 +294,7 @@ export type FunctionCallHandlerResult<Result> = {
|
|
|
265
294
|
}|{
|
|
266
295
|
context: ConversationContext<unknown>,
|
|
267
296
|
description: string,
|
|
297
|
+
widgets?: AiWidget[],
|
|
268
298
|
}|{
|
|
269
299
|
error: string,
|
|
270
300
|
};
|
|
@@ -685,14 +715,17 @@ export abstract class AiAgent<T> {
|
|
|
685
715
|
type: ResponseType.CONTEXT_CHANGE,
|
|
686
716
|
description: result.description,
|
|
687
717
|
context: result.context,
|
|
718
|
+
widgets: result.widgets,
|
|
688
719
|
};
|
|
689
720
|
|
|
690
721
|
return;
|
|
691
722
|
}
|
|
723
|
+
|
|
692
724
|
query = {
|
|
693
725
|
functionResponse: {
|
|
694
726
|
name: functionCall.name,
|
|
695
|
-
|
|
727
|
+
// Widgets are not sent back to the LLM
|
|
728
|
+
response: {...result, widgets: undefined},
|
|
696
729
|
},
|
|
697
730
|
};
|
|
698
731
|
request = this.buildRequest(query, Host.AidaClient.Role.ROLE_UNSPECIFIED);
|
|
@@ -720,7 +753,8 @@ export abstract class AiAgent<T> {
|
|
|
720
753
|
options?: FunctionHandlerOptions&{explanation?: string},
|
|
721
754
|
): AsyncGenerator<FunctionCallResponseData, {
|
|
722
755
|
result: unknown,
|
|
723
|
-
|
|
756
|
+
widgets?: AiWidget[],
|
|
757
|
+
}|{context: ConversationContext<unknown>, description: string, widgets?: AiWidget[]}> {
|
|
724
758
|
const call = this.#functionDeclarations.get(name);
|
|
725
759
|
if (!call) {
|
|
726
760
|
throw new Error(`Function ${name} is not found.`);
|
|
@@ -837,7 +871,7 @@ export abstract class AiAgent<T> {
|
|
|
837
871
|
return result;
|
|
838
872
|
}
|
|
839
873
|
|
|
840
|
-
return result as {result: unknown};
|
|
874
|
+
return result as {result: unknown, widgets?: AiWidget[]};
|
|
841
875
|
}
|
|
842
876
|
|
|
843
877
|
async *
|
|
@@ -608,7 +608,6 @@ export class BreakpointDebuggerAgent extends AiAgent<Workspace.UISourceCode.UILo
|
|
|
608
608
|
}
|
|
609
609
|
yield {
|
|
610
610
|
type: ResponseType.CONTEXT,
|
|
611
|
-
title: 'Analyzing breakpoint location',
|
|
612
611
|
details: [{title: 'Location', text: selectedBreakpoint.getTitle()}]
|
|
613
612
|
};
|
|
614
613
|
}
|
|
@@ -278,6 +278,7 @@ export class ContextSelectionAgent extends AiAgent<never> {
|
|
|
278
278
|
return {
|
|
279
279
|
context: PerformanceTraceContext.fromParsedTrace(result),
|
|
280
280
|
description: 'User recorded a performance trace',
|
|
281
|
+
widgets: [{name: 'PERFORMANCE_TRACE', data: {parsedTrace: result}}]
|
|
281
282
|
};
|
|
282
283
|
}
|
|
283
284
|
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Copyright 2026 The Chromium Authors
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import * as Host from '../../../core/host/host.js';
|
|
6
|
+
import * as Root from '../../../core/root/root.js';
|
|
7
|
+
|
|
8
|
+
import {AiAgent, type ContextResponse, ConversationContext, type RequestOptions, ResponseType} from './AiAgent.js';
|
|
9
|
+
|
|
10
|
+
const preamble =
|
|
11
|
+
`You are an expert technical assistant specializing in summarizing debugging conversations from Chrome DevTools.
|
|
12
|
+
You will receive a markdown-formatted transcript of a conversation between a user and a DevTools AI assistant.
|
|
13
|
+
Your goal is to produce a succinct, structured summary that a local AI agent in the user's IDE can use to apply code fixes.
|
|
14
|
+
|
|
15
|
+
Focus on extracting:
|
|
16
|
+
1. **Core Issue:** The primary problem or question the user was investigating.
|
|
17
|
+
2. **Diagnostic Findings:** Key technical details discovered (e.g., specific functions, bottlenecks, error messages, URLs, or CSS properties).
|
|
18
|
+
3. **Proposed Solution:** The specific changes or optimizations recommended by the DevTools assistant.
|
|
19
|
+
4. **Actionable Steps:** A clear, step-by-step list of instructions for the IDE agent to implement the fix.
|
|
20
|
+
|
|
21
|
+
Maintain a professional, technical, and extremely concise tone. Avoid conversational filler or introductory/concluding remarks.
|
|
22
|
+
The output must be structured markdown.`;
|
|
23
|
+
|
|
24
|
+
export class ConversationSummaryContext extends ConversationContext<string> {
|
|
25
|
+
#conversation: string;
|
|
26
|
+
constructor(conversation: string) {
|
|
27
|
+
super();
|
|
28
|
+
this.#conversation = conversation;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
getOrigin(): string {
|
|
32
|
+
return 'devtools://ai-assistance';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getItem(): string {
|
|
36
|
+
return this.#conversation;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override getTitle(): string {
|
|
40
|
+
return 'Conversation';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* An agent that takes a full conversation between a user and an agent in markdown
|
|
46
|
+
* format and produces a succinct summary of the conversation.
|
|
47
|
+
*
|
|
48
|
+
* This summary is designed to be read by a local agent in the user's IDE and it
|
|
49
|
+
* will be used to help apply fixes to the user's local codebase based on the
|
|
50
|
+
* debugging information the devtools agent found.
|
|
51
|
+
*
|
|
52
|
+
* This agent is not intended to be used directly by users in the AI Assistance
|
|
53
|
+
* panel when chatting with DevTools AI.
|
|
54
|
+
*/
|
|
55
|
+
export class ConversationSummaryAgent extends AiAgent<string> {
|
|
56
|
+
override preamble = preamble;
|
|
57
|
+
|
|
58
|
+
get clientFeature(): Host.AidaClient.ClientFeature {
|
|
59
|
+
return Host.AidaClient.ClientFeature.CHROME_CONVERSATION_SUMMARY_AGENT;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get userTier(): string|undefined {
|
|
63
|
+
// TODO(b/491772868): tidy up userTier & feature flags in the backend.
|
|
64
|
+
return Root.Runtime.hostConfig.devToolsFreestyler?.userTier;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get options(): RequestOptions {
|
|
68
|
+
// TODO(b/491772868): tidy up userTier & feature flags in the backend.
|
|
69
|
+
const temperature = Root.Runtime.hostConfig.devToolsFreestyler?.temperature;
|
|
70
|
+
const modelId = Root.Runtime.hostConfig.devToolsFreestyler?.modelId;
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
temperature,
|
|
74
|
+
modelId,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async * handleContextDetails(context: ConversationContext<string>|null): AsyncGenerator<ContextResponse, void, void> {
|
|
79
|
+
if (!context) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
yield {
|
|
84
|
+
type: ResponseType.CONTEXT,
|
|
85
|
+
details: [
|
|
86
|
+
{
|
|
87
|
+
title: 'Conversation transcript',
|
|
88
|
+
text: context.getItem(),
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override async enhanceQuery(query: string, context: ConversationContext<string>|null): Promise<string> {
|
|
95
|
+
const conversation = context ? context.getItem() : query;
|
|
96
|
+
return `Summarize the following conversation:\n\n${conversation}`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async summarizeConversation(conversation: string): Promise<string> {
|
|
100
|
+
const context = new ConversationSummaryContext(conversation);
|
|
101
|
+
const response = await Array.fromAsync(this.run('', {selected: context}));
|
|
102
|
+
const lastResponse = response.at(-1);
|
|
103
|
+
if (lastResponse && lastResponse.type === ResponseType.ANSWER && lastResponse.complete === true) {
|
|
104
|
+
return lastResponse.text.trim();
|
|
105
|
+
}
|
|
106
|
+
throw new Error('Failed to summarize conversation');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
import * as Host from '../../../core/host/host.js';
|
|
6
|
-
import * as i18n from '../../../core/i18n/i18n.js';
|
|
7
6
|
import * as Root from '../../../core/root/root.js';
|
|
8
7
|
import type * as Workspace from '../../workspace/workspace.js';
|
|
9
8
|
import {FileFormatter} from '../data_formatters/FileFormatter.js';
|
|
@@ -62,18 +61,6 @@ External Resources:
|
|
|
62
61
|
MDN Web Docs: JavaScript Functions: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions
|
|
63
62
|
`;
|
|
64
63
|
|
|
65
|
-
/*
|
|
66
|
-
* Strings that don't need to be translated at this time.
|
|
67
|
-
*/
|
|
68
|
-
const UIStringsNotTranslate = {
|
|
69
|
-
/**
|
|
70
|
-
* @description Title for thinking step of File agent.
|
|
71
|
-
*/
|
|
72
|
-
analyzingFile: 'Analyzing file',
|
|
73
|
-
} as const;
|
|
74
|
-
|
|
75
|
-
const lockedString = i18n.i18n.lockedString;
|
|
76
|
-
|
|
77
64
|
export class FileContext extends ConversationContext<Workspace.UISourceCode.UISourceCode> {
|
|
78
65
|
#file: Workspace.UISourceCode.UISourceCode;
|
|
79
66
|
|
|
@@ -118,7 +105,6 @@ export class FileAgent extends AiAgent<Workspace.UISourceCode.UISourceCode> {
|
|
|
118
105
|
modelId,
|
|
119
106
|
};
|
|
120
107
|
}
|
|
121
|
-
|
|
122
108
|
async *
|
|
123
109
|
handleContextDetails(selectedFile: ConversationContext<Workspace.UISourceCode.UISourceCode>|null):
|
|
124
110
|
AsyncGenerator<ContextResponse, void, void> {
|
|
@@ -128,7 +114,6 @@ export class FileAgent extends AiAgent<Workspace.UISourceCode.UISourceCode> {
|
|
|
128
114
|
|
|
129
115
|
yield {
|
|
130
116
|
type: ResponseType.CONTEXT,
|
|
131
|
-
title: lockedString(UIStringsNotTranslate.analyzingFile),
|
|
132
117
|
details: createContextDetailsForFileAgent(selectedFile),
|
|
133
118
|
};
|
|
134
119
|
}
|
|
@@ -60,10 +60,6 @@ This request aims to retrieve a list of products matching the search query "lapt
|
|
|
60
60
|
* Strings that don't need to be translated at this time.
|
|
61
61
|
*/
|
|
62
62
|
const UIStringsNotTranslate = {
|
|
63
|
-
/**
|
|
64
|
-
* @description Title for thinking step of Network agent.
|
|
65
|
-
*/
|
|
66
|
-
analyzingNetworkData: 'Analyzing network data',
|
|
67
63
|
/**
|
|
68
64
|
* @description Heading text for the block that shows the network request details.
|
|
69
65
|
*/
|
|
@@ -144,7 +140,6 @@ export class NetworkAgent extends AiAgent<SDK.NetworkRequest.NetworkRequest> {
|
|
|
144
140
|
|
|
145
141
|
yield {
|
|
146
142
|
type: ResponseType.CONTEXT,
|
|
147
|
-
title: lockedString(UIStringsNotTranslate.analyzingNetworkData),
|
|
148
143
|
details: await createContextDetailsForNetworkAgent(selectedNetworkRequest),
|
|
149
144
|
};
|
|
150
145
|
}
|