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.
Files changed (140) hide show
  1. package/.agents/README.md +13 -0
  2. package/{agents/prompts/creating-a-model.md → .agents/skills/creating-a-model/SKILL.md} +7 -1
  3. package/{agents/prompts/devtools-imports.md → .agents/skills/devtools-imports/SKILL.md} +10 -5
  4. package/{agents/prompts/merging-devtools-module.md → .agents/skills/merging-devtools-module/SKILL.md} +5 -0
  5. package/{agents/prompts/ui-widgets.md → .agents/skills/ui-widgets/SKILL.md} +5 -0
  6. package/{agents/prompts/verification.md → .agents/skills/verification/SKILL.md} +5 -0
  7. package/docs/ui_engineering.md +6 -6
  8. package/front_end/core/host/AidaClient.ts +2 -0
  9. package/front_end/core/host/GcaTypes.ts +518 -0
  10. package/front_end/core/host/UserMetrics.ts +0 -1
  11. package/front_end/core/host/host.ts +2 -0
  12. package/front_end/core/root/ExperimentNames.ts +0 -1
  13. package/front_end/entrypoints/main/MainImpl.ts +0 -2
  14. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  15. package/front_end/generated/protocol.ts +2 -1
  16. package/front_end/models/ai_assistance/AiConversation.ts +28 -15
  17. package/front_end/models/ai_assistance/AiHistoryStorage.snapshot.txt +1 -1
  18. package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
  19. package/front_end/models/ai_assistance/ConversationHandler.ts +8 -2
  20. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +3 -18
  21. package/front_end/models/ai_assistance/agents/AiAgent.ts +39 -5
  22. package/front_end/models/ai_assistance/agents/BreakpointDebuggerAgent.ts +0 -1
  23. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -0
  24. package/front_end/models/ai_assistance/agents/ConversationSummaryAgent.ts +108 -0
  25. package/front_end/models/ai_assistance/agents/FileAgent.ts +0 -15
  26. package/front_end/models/ai_assistance/agents/NetworkAgent.ts +0 -5
  27. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +76 -13
  28. package/front_end/models/ai_assistance/agents/PerformanceAnnotationsAgent.ts +0 -10
  29. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -6
  30. package/front_end/models/ai_assistance/agents/StylingAgent.ts +0 -5
  31. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  32. package/front_end/models/emulation/DeviceModeModel.ts +5 -1
  33. package/front_end/models/emulation/EmulatedDevices.ts +3 -2
  34. package/front_end/models/issues_manager/SharedDictionaryIssue.ts +15 -5
  35. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorNoCorpCrossOriginNoCorsRequest.md +3 -0
  36. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorNoCorpCossOriginNoCorsRequest.md +3 -0
  37. package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
  38. package/front_end/models/lighthouse/RunTypes.ts +41 -0
  39. package/front_end/models/lighthouse/lighthouse.ts +2 -0
  40. package/front_end/models/trace/ModelImpl.ts +4 -0
  41. package/front_end/models/trace/helpers/SamplesIntegrator.ts +1 -8
  42. package/front_end/models/trace/types/Configuration.ts +0 -5
  43. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +90 -14
  44. package/front_end/panels/ai_assistance/PatchWidget.ts +1 -1
  45. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -0
  46. package/front_end/panels/ai_assistance/components/ChatMessage.ts +153 -42
  47. package/front_end/panels/ai_assistance/components/ChatView.ts +1 -1
  48. package/front_end/panels/ai_assistance/components/chatMessage.css +61 -0
  49. package/front_end/panels/application/AppManifestView.ts +2 -2
  50. package/front_end/panels/application/CookieItemsView.ts +9 -15
  51. package/front_end/panels/application/DeviceBoundSessionsView.ts +3 -5
  52. package/front_end/panels/application/FrameDetailsView.ts +2 -2
  53. package/front_end/panels/application/ReportingApiView.ts +2 -2
  54. package/front_end/panels/application/preloading/PreloadingView.ts +20 -7
  55. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +6 -3
  56. package/front_end/panels/application/preloading/components/PreloadingString.ts +15 -2
  57. package/front_end/panels/application/preloading/helper/PreloadingForward.ts +31 -2
  58. package/front_end/panels/changes/ChangesView.ts +7 -11
  59. package/front_end/panels/coverage/CoverageView.ts +4 -4
  60. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +3 -3
  61. package/front_end/panels/elements/ElementsTreeOutline.ts +34 -8
  62. package/front_end/panels/elements/StylePropertiesSection.ts +129 -1
  63. package/front_end/panels/elements/StylePropertyHighlighter.ts +3 -0
  64. package/front_end/panels/elements/stylesSidebarPane.css +34 -0
  65. package/front_end/panels/issues/AffectedSelectivePermissionsInterventionView.ts +3 -5
  66. package/front_end/panels/layer_viewer/LayerDetailsView.ts +2 -1
  67. package/front_end/panels/lighthouse/LighthouseController.ts +148 -162
  68. package/front_end/panels/lighthouse/LighthousePanel.ts +2 -7
  69. package/front_end/panels/lighthouse/LighthouseStartView.ts +7 -6
  70. package/front_end/panels/lighthouse/LighthouseStatusView.ts +3 -3
  71. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +7 -3
  72. package/front_end/panels/network/RequestConditionsDrawer.ts +4 -4
  73. package/front_end/panels/network/RequestCookiesView.ts +2 -2
  74. package/front_end/panels/network/RequestHeadersView.ts +4 -4
  75. package/front_end/panels/network/RequestResponseView.ts +2 -2
  76. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +2 -2
  77. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +3 -3
  78. package/front_end/panels/recorder/components/StepView.ts +2 -1
  79. package/front_end/panels/search/SearchView.ts +2 -2
  80. package/front_end/panels/sensors/SensorsView.ts +32 -22
  81. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +18 -4
  82. package/front_end/panels/timeline/StatusDialog.ts +159 -83
  83. package/front_end/panels/timeline/TimelineController.ts +0 -4
  84. package/front_end/panels/timeline/TimelineDetailsView.ts +8 -6
  85. package/front_end/panels/timeline/TimelinePanel.ts +29 -2
  86. package/front_end/panels/timeline/components/LiveMetricsView.ts +2 -2
  87. package/front_end/panels/timeline/components/Sidebar.ts +1 -1
  88. package/front_end/panels/timeline/components/SidebarInsightsTab.ts +1 -1
  89. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +62 -34
  90. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +53 -28
  91. package/front_end/panels/timeline/components/insights/CharacterSet.ts +2 -6
  92. package/front_end/panels/timeline/components/insights/EventRef.ts +2 -2
  93. package/front_end/panels/timeline/components/insights/baseInsightComponent.css +7 -0
  94. package/front_end/panels/timeline/components/insights/insights.ts +0 -2
  95. package/front_end/panels/timeline/timeline-meta.ts +11 -0
  96. package/front_end/panels/webauthn/WebauthnPane.ts +2 -2
  97. package/front_end/third_party/chromium/README.chromium +1 -1
  98. package/front_end/third_party/puppeteer/README.chromium +2 -2
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Realm.js +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Realm.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts +4 -0
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js +13 -0
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/util.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/third_party/mitt/mitt.js +2 -2
  113. package/front_end/third_party/puppeteer/package/lib/cjs/third_party/parsel-js/parsel-js.js +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/third_party/rxjs/rxjs.js +446 -446
  115. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +166 -167
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Realm.js +2 -2
  117. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Realm.js.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts +4 -0
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js +12 -0
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/util.js.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt/mitt.js +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js/parsel-js.js +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs/rxjs.js +97 -97
  130. package/front_end/third_party/puppeteer/package/package.json +1 -1
  131. package/front_end/third_party/puppeteer/package/src/bidi/Realm.ts +2 -2
  132. package/front_end/third_party/puppeteer/package/src/bidi/util.ts +17 -0
  133. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  134. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  135. package/front_end/ui/legacy/Widget.ts +47 -9
  136. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -1
  137. package/package.json +1 -1
  138. package/agents/prompts/README.md +0 -18
  139. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +0 -1
  140. 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", {UseErrorCrossOriginNoCorsRequest: "UseErrorCrossOriginNoCorsRequest", UseErrorDictionaryLoadFailure: "UseErrorDictionaryLoadFailure", UseErrorMatchingDictionaryNotUsed: "UseErrorMatchingDictionaryNotUsed", UseErrorUnexpectedContentDictionaryHeader: "UseErrorUnexpectedContentDictionaryHeader", WriteErrorCossOriginNoCorsRequest: "WriteErrorCossOriginNoCorsRequest", WriteErrorDisallowedBySettings: "WriteErrorDisallowedBySettings", WriteErrorExpiredResponse: "WriteErrorExpiredResponse", WriteErrorFeatureDisabled: "WriteErrorFeatureDisabled", WriteErrorInsufficientResources: "WriteErrorInsufficientResources", WriteErrorInvalidMatchField: "WriteErrorInvalidMatchField", WriteErrorInvalidStructuredHeader: "WriteErrorInvalidStructuredHeader", WriteErrorInvalidTTLField: "WriteErrorInvalidTTLField", WriteErrorNavigationRequest: "WriteErrorNavigationRequest", WriteErrorNoMatchField: "WriteErrorNoMatchField", WriteErrorNonIntegerTTLField: "WriteErrorNonIntegerTTLField", WriteErrorNonListMatchDestField: "WriteErrorNonListMatchDestField", WriteErrorNonSecureContext: "WriteErrorNonSecureContext", WriteErrorNonStringIdField: "WriteErrorNonStringIdField", WriteErrorNonStringInMatchDestList: "WriteErrorNonStringInMatchDestList", WriteErrorNonStringMatchField: "WriteErrorNonStringMatchField", WriteErrorNonTokenTypeField: "WriteErrorNonTokenTypeField", WriteErrorRequestAborted: "WriteErrorRequestAborted", WriteErrorShuttingDown: "WriteErrorShuttingDown", WriteErrorTooLongIdField: "WriteErrorTooLongIdField", WriteErrorUnsupportedType: "WriteErrorUnsupportedType"});
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(`### ${item.title}`);
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
- if (item.type === ResponseType.CONTEXT_CHANGE) {
269
- return null;
270
- }
271
-
272
- if (item.type === ResponseType.USER_QUERY) {
273
- return {...item, imageInput: undefined};
274
- }
275
- // Remove the `confirm()`-function because `structuredClone()` throws on functions
276
- if (item.type === ResponseType.SIDE_EFFECT) {
277
- return {...item, confirm: undefined};
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
 
@@ -12,7 +12,7 @@ What is the color of the sky?
12
12
 
13
13
  ## AI
14
14
 
15
- ### Analyzing context
15
+ ### Analyzing data
16
16
 
17
17
  **Detail 1:**
18
18
  ````
@@ -14,6 +14,7 @@ export const enum ConversationType {
14
14
  NETWORK = 'drjones-network-request',
15
15
  PERFORMANCE = 'drjones-performance-full',
16
16
  BREAKPOINT = 'breakpoint',
17
+ ACCESSIBILITY = 'accessibility',
17
18
  }
18
19
 
19
20
  export interface SerializedConversation {
@@ -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.CONTEXT || data.type === ResponseType.TITLE) {
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
- response: result,
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
- }|{context: ConversationContext<unknown>, description: string}> {
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
  }