chrome-devtools-frontend 1.0.1675430 → 1.0.1676824

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/WATCHLISTS +0 -4
  2. package/front_end/core/common/Settings.ts +0 -66
  3. package/front_end/core/root/Runtime.ts +0 -5
  4. package/front_end/core/sdk/CSSMetadata.ts +5 -9
  5. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +8 -28
  6. package/front_end/core/sdk/DebuggerModel.ts +50 -30
  7. package/front_end/core/sdk/ResourceTreeModel.ts +20 -1
  8. package/front_end/core/sdk/Script.ts +9 -53
  9. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +213 -23
  10. package/front_end/entrypoints/main/MainImpl.ts +31 -0
  11. package/front_end/generated/InspectorBackendCommands.ts +3 -1
  12. package/front_end/generated/SupportedCSSProperties.ts +21 -4
  13. package/front_end/generated/protocol-mapping.d.ts +14 -0
  14. package/front_end/generated/protocol-proxy-api.d.ts +10 -0
  15. package/front_end/generated/protocol.ts +35 -0
  16. package/front_end/models/ai_assistance/AiAgent2.ts +11 -0
  17. package/front_end/models/ai_assistance/AiConversation.ts +22 -5
  18. package/front_end/models/ai_assistance/README.md +52 -26
  19. package/front_end/models/ai_assistance/agents/AiAgent.ts +54 -8
  20. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  21. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +7 -194
  22. package/front_end/models/ai_assistance/agents/StorageAgent.ts +8 -87
  23. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -1
  24. package/front_end/models/ai_assistance/ai_assistance.ts +16 -0
  25. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +124 -0
  26. package/front_end/models/ai_assistance/contexts/StorageContext.ts +111 -0
  27. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +69 -1
  28. package/front_end/models/ai_assistance/skills/README.md +63 -1
  29. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  30. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +4 -0
  31. package/front_end/models/ai_assistance/skills/performance.md +8 -0
  32. package/front_end/models/ai_assistance/skills/sources.md +16 -0
  33. package/front_end/models/ai_assistance/skills/storage.md +31 -0
  34. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +101 -0
  35. package/front_end/models/ai_assistance/tools/GetTraceEventByKey.ts +83 -0
  36. package/front_end/models/ai_assistance/tools/GetTraceMainThreadSummary.ts +106 -0
  37. package/front_end/models/ai_assistance/tools/GetTraceNetworkSummary.ts +104 -0
  38. package/front_end/models/ai_assistance/tools/ListPageOrigins.ts +81 -0
  39. package/front_end/models/ai_assistance/tools/ListSources.ts +116 -0
  40. package/front_end/models/ai_assistance/tools/SelectTraceEventByKey.ts +90 -0
  41. package/front_end/models/ai_assistance/tools/Tool.ts +22 -1
  42. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +14 -0
  43. package/front_end/models/bindings/CSSWorkspaceBinding.ts +4 -0
  44. package/front_end/models/bindings/CompilerScriptMapping.ts +4 -0
  45. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  46. package/front_end/models/bindings/ResourceScriptMapping.ts +3 -201
  47. package/front_end/models/bindings/SASSSourceMapping.ts +6 -0
  48. package/front_end/models/breakpoints/BreakpointManager.ts +2 -49
  49. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +27 -0
  50. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +10 -2
  51. package/front_end/models/issues_manager/descriptions/connectionAllowlistEmbeddingRequirementNotSatisfied.md +26 -0
  52. package/front_end/models/issues_manager/descriptions/connectionAllowlistIFrameAttributeLoosensEmbeddingRequirement.md +19 -0
  53. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowConnectionAllowlistFrom.md +21 -0
  54. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  55. package/front_end/models/persistence/IsolatedFileSystem.ts +7 -8
  56. package/front_end/models/persistence/IsolatedFileSystemManager.ts +2 -2
  57. package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
  58. package/front_end/models/persistence/persistence-meta.ts +9 -9
  59. package/front_end/models/trace/types/TraceEvents.ts +36 -0
  60. package/front_end/panels/accessibility/ARIAAttributesView.ts +3 -3
  61. package/front_end/panels/accessibility/AccessibilityNodeView.ts +36 -36
  62. package/front_end/panels/accessibility/AccessibilityStrings.ts +168 -168
  63. package/front_end/panels/accessibility/SourceOrderView.ts +7 -7
  64. package/front_end/panels/accessibility/accessibility-meta.ts +2 -2
  65. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -5
  66. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +2 -3
  67. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  68. package/front_end/panels/ai_assistance/components/ChatMessage.ts +27 -2
  69. package/front_end/panels/application/IndexedDBViews.ts +65 -63
  70. package/front_end/panels/application/WebMCPView.ts +16 -7
  71. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +5 -5
  72. package/front_end/panels/common/BadgeNotification.ts +8 -8
  73. package/front_end/panels/common/ExtensionServer.ts +21 -1
  74. package/front_end/panels/common/GdpSignUpDialog.ts +16 -16
  75. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +5 -6
  76. package/front_end/panels/common/PersistenceUtils.ts +2 -2
  77. package/front_end/panels/common/common.ts +0 -97
  78. package/front_end/panels/console/ConsoleInsightTeaser.ts +2 -2
  79. package/front_end/panels/console/ConsolePinPane.ts +2 -2
  80. package/front_end/panels/console/ConsoleView.ts +20 -19
  81. package/front_end/panels/elements/LayoutPane.ts +2 -8
  82. package/front_end/panels/event_listeners/EventListenersView.ts +8 -4
  83. package/front_end/panels/issues/AffectedTrackingSitesView.ts +25 -14
  84. package/front_end/panels/media/PlayerMessagesView.ts +149 -68
  85. package/front_end/panels/network/NetworkPanel.ts +1 -1
  86. package/front_end/panels/network/RequestPayloadView.ts +1 -0
  87. package/front_end/panels/profiler/HeapSnapshotView.ts +0 -2
  88. package/front_end/panels/profiler/heapProfiler.css +0 -9
  89. package/front_end/panels/recorder/RecorderPanel.ts +2 -3
  90. package/front_end/panels/screencast/ScreencastView.ts +148 -138
  91. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -2
  92. package/front_end/panels/sources/DebuggerPlugin.ts +9 -58
  93. package/front_end/panels/sources/ScopeChainSidebarPane.ts +1 -1
  94. package/front_end/panels/sources/UISourceCodeFrame.ts +3 -8
  95. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +4 -2
  96. package/front_end/panels/timeline/TimelineController.ts +36 -64
  97. package/front_end/panels/timeline/TimelinePanel.ts +11 -8
  98. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  99. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +2 -2
  100. package/front_end/panels/timeline/timelinePanel.css +0 -10
  101. package/front_end/panels/utils/utils.ts +7 -7
  102. package/front_end/services/tracing/PerformanceTracing.ts +5 -17
  103. package/front_end/third_party/chromium/README.chromium +1 -1
  104. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  105. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  106. package/front_end/third_party/codemirror.next/package.json +2 -2
  107. package/front_end/third_party/codemirror.next/rebuild.sh +4 -1
  108. package/front_end/ui/comments/CommentAnchorResolver.ts +436 -10
  109. package/front_end/ui/comments/CommentManager.ts +640 -0
  110. package/front_end/ui/comments/CommentsOverlayWidget.ts +121 -0
  111. package/front_end/ui/comments/comments.ts +4 -0
  112. package/front_end/ui/comments/commentsOverlay.css +49 -0
  113. package/front_end/{panels/common → ui/components/dialogs}/FreDialog.ts +6 -6
  114. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +96 -0
  115. package/front_end/ui/components/dialogs/dialogs.ts +4 -0
  116. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
  117. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionDisclaimer.ts +13 -13
  118. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +7 -6
  119. package/front_end/{panels/common → ui/components/text_editor}/AiCodeCompletionTeaser.ts +43 -46
  120. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +22 -26
  121. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationTeaser.ts +10 -10
  122. package/front_end/{panels/common → ui/components/text_editor}/AiCodeGenerationUpgradeDialog.ts +5 -5
  123. package/front_end/ui/components/text_editor/text_editor.ts +4 -0
  124. package/front_end/ui/legacy/Toolbar.ts +1 -1
  125. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +11 -3
  126. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +270 -162
  127. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +5 -0
  128. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -16
  129. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +5 -12
  130. package/front_end/ui/legacy/components/source_frame/JSONView.ts +8 -1
  131. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -2
  132. package/front_end/ui/settings/SettingUIRegistration.ts +55 -6
  133. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  134. package/mcp/mcp.ts +6 -1
  135. package/package.json +1 -1
  136. package/front_end/Images/toolbarResizerVertical.png +0 -0
  137. package/front_end/emulated_devices/MotoG4-landscape.svg +0 -155
  138. package/front_end/emulated_devices/MotoG4-portrait.svg +0 -155
  139. package/front_end/emulated_devices/Nexus5X-landscape.svg +0 -19
  140. package/front_end/emulated_devices/Nexus5X-portrait.svg +0 -19
  141. package/front_end/emulated_devices/Nexus6P-landscape.svg +0 -50
  142. package/front_end/emulated_devices/Nexus6P-portrait.svg +0 -54
  143. package/front_end/emulated_devices/google-nest-hub-horizontal.png +0 -0
  144. package/front_end/emulated_devices/google-nest-hub-max-horizontal.png +0 -0
  145. package/front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png +0 -0
  146. package/front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png +0 -0
  147. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png +0 -0
  148. package/front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png +0 -0
  149. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png +0 -0
  150. package/front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png +0 -0
  151. package/front_end/emulated_devices/google-nexus-5-vertical-default-1x.png +0 -0
  152. package/front_end/emulated_devices/google-nexus-5-vertical-default-2x.png +0 -0
  153. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png +0 -0
  154. package/front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png +0 -0
  155. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png +0 -0
  156. package/front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png +0 -0
  157. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png +0 -0
  158. package/front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png +0 -0
  159. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png +0 -0
  160. package/front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png +0 -0
  161. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png +0 -0
  162. package/front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png +0 -0
  163. package/front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png +0 -0
  164. package/front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png +0 -0
  165. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png +0 -0
  166. package/front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png +0 -0
  167. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png +0 -0
  168. package/front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png +0 -0
  169. package/front_end/emulated_devices/iPad-landscape.svg +0 -73
  170. package/front_end/emulated_devices/iPad-portrait.svg +0 -76
  171. package/front_end/emulated_devices/iPhone5-landscape.svg +0 -99
  172. package/front_end/emulated_devices/iPhone5-portrait.svg +0 -83
  173. package/front_end/emulated_devices/iPhone6-landscape.svg +0 -111
  174. package/front_end/emulated_devices/iPhone6-portrait.svg +0 -116
  175. package/front_end/emulated_devices/iPhone6Plus-landscape.svg +0 -118
  176. package/front_end/emulated_devices/iPhone6Plus-portrait.svg +0 -116
  177. package/front_end/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
  178. package/front_end/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
  179. package/front_end/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
  180. package/front_end/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
  181. package/front_end/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
  182. package/front_end/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
  183. package/front_end/emulated_devices/optimized/README.md +0 -9
  184. package/front_end/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
  185. package/front_end/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
  186. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
  187. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
  188. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
  189. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
  190. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
  191. package/front_end/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
  192. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
  193. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
  194. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
  195. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
  196. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
  197. package/front_end/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
  198. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
  199. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
  200. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
  201. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
  202. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
  203. package/front_end/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
  204. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
  205. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
  206. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
  207. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
  208. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
  209. package/front_end/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
  210. package/front_end/emulated_devices/optimized/iPad-landscape.avif +0 -0
  211. package/front_end/emulated_devices/optimized/iPad-portrait.avif +0 -0
  212. package/front_end/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
  213. package/front_end/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
  214. package/front_end/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
  215. package/front_end/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
  216. package/front_end/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
  217. package/front_end/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
  218. package/front_end/emulated_devices/optimized/optimized_images.gni +0 -53
  219. package/front_end/models/ai_assistance/agents/README.md +0 -136
  220. /package/front_end/{panels/common → ui/components/dialogs}/freDialog.css +0 -0
  221. /package/front_end/{panels/common/common.css → ui/components/dialogs/typeToAllowDialog.css} +0 -0
  222. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionDisclaimer.css +0 -0
  223. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeCompletionTeaser.css +0 -0
  224. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationTeaser.css +0 -0
  225. /package/front_end/{panels/common → ui/components/text_editor}/aiCodeGenerationUpgradeDialog.css +0 -0
@@ -501,21 +501,11 @@ export class HeapSnapshotNode implements HeapSnapshotItem {
501
501
  }
502
502
 
503
503
  #detachednessAndClassIndex(): number {
504
- const {snapshot, nodeIndex} = this;
505
- const nodeDetachednessAndClassIndexOffset = snapshot.nodeDetachednessAndClassIndexOffset;
506
- return nodeDetachednessAndClassIndexOffset !== -1 ?
507
- snapshot.nodes.getValue(nodeIndex + nodeDetachednessAndClassIndexOffset) :
508
- (snapshot.detachednessAndClassIndexArray as Uint32Array)[nodeIndex / snapshot.nodeFieldCount];
504
+ return this.snapshot.detachednessAndClassIndexArray[this.nodeIndex / this.snapshot.nodeFieldCount];
509
505
  }
510
506
 
511
507
  #setDetachednessAndClassIndex(value: number): void {
512
- const {snapshot, nodeIndex} = this;
513
- const nodeDetachednessAndClassIndexOffset = snapshot.nodeDetachednessAndClassIndexOffset;
514
- if (nodeDetachednessAndClassIndexOffset !== -1) {
515
- snapshot.nodes.setValue(nodeIndex + nodeDetachednessAndClassIndexOffset, value);
516
- } else {
517
- (snapshot.detachednessAndClassIndexArray as Uint32Array)[nodeIndex / snapshot.nodeFieldCount] = value;
518
- }
508
+ this.snapshot.detachednessAndClassIndexArray[this.nodeIndex / this.snapshot.nodeFieldCount] = value;
519
509
  }
520
510
 
521
511
  detachedness(): HeapSnapshotModel.HeapSnapshotModel.DOMLinkState {
@@ -1010,7 +1000,7 @@ export abstract class HeapSnapshot {
1010
1000
  #ignoredEdgesInRetainersView = new Set<number>();
1011
1001
  #nodeDistancesForRetainersView: Int32Array|undefined;
1012
1002
  #edgeNamesThatAreNotWeakMaps: Platform.TypedArrayUtilities.BitVector;
1013
- detachednessAndClassIndexArray?: Uint32Array;
1003
+ detachednessAndClassIndexArray!: Uint32Array;
1014
1004
  nodeNativeContextAttribution!: Int32Array;
1015
1005
  #nativeContextSizes!: HeapSnapshotModel.HeapSnapshotModel.NativeContextSizes;
1016
1006
  #nativeContextOrdinals!: number[];
@@ -1092,6 +1082,7 @@ export abstract class HeapSnapshot {
1092
1082
  this.#progress.updateStatus('Building retainers…');
1093
1083
  const resultsFromSecondWorker = this.startInitStep1InSecondThread(secondWorker);
1094
1084
  this.#progress.updateStatus('Propagating DOM state…');
1085
+ this.initDetachednessAndClassIndex();
1095
1086
  this.propagateDOMState();
1096
1087
  this.#progress.updateStatus('Calculating node flags…');
1097
1088
  this.calculateFlags();
@@ -2400,12 +2391,6 @@ export abstract class HeapSnapshot {
2400
2391
  nodeRegExpType,
2401
2392
  } = this;
2402
2393
 
2403
- // If the snapshot doesn't contain a detachedness field in each node, then
2404
- // allocate a separate array so there is somewhere to store the class index.
2405
- if (this.nodeDetachednessAndClassIndexOffset === -1) {
2406
- this.detachednessAndClassIndexArray = new Uint32Array(nodeCount);
2407
- }
2408
-
2409
2394
  // We'll add some new values to the `strings` array during the processing below.
2410
2395
  // This map lets us easily find the index for each added string.
2411
2396
  const stringTable = new Map<string, number>();
@@ -2707,6 +2692,49 @@ export abstract class HeapSnapshot {
2707
2692
  return this.#nativeContextSizes;
2708
2693
  }
2709
2694
 
2695
+ getRetainedByContextSummary(): HeapSnapshotModel.HeapSnapshotModel.RetainedByContextSummary {
2696
+ // Use the exact same implementation here as aggregateWithFilter('objectsRetainedByContexts').
2697
+ const isRetainedByContext = this.createNamedFilter('objectsRetainedByContexts');
2698
+
2699
+ let contextCount = 0;
2700
+ let retainedByContextSize = 0;
2701
+ let retainedByContextCount = 0;
2702
+ let notRetainedByContextSize = 0;
2703
+ let notRetainedByContextCount = 0;
2704
+
2705
+ const node = this.rootNode();
2706
+ const {nodes, nodeFieldCount, nodeSelfSizeOffset: selfSizeOffset} = this;
2707
+ const nodesLength = nodes.length;
2708
+
2709
+ for (let nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
2710
+ const selfSize = nodes.getValue(nodeIndex + selfSizeOffset);
2711
+ if (!selfSize) {
2712
+ continue;
2713
+ }
2714
+ node.nodeIndex = nodeIndex;
2715
+ if (isRetainedByContext(node)) {
2716
+ retainedByContextCount++;
2717
+ retainedByContextSize += selfSize;
2718
+ } else {
2719
+ notRetainedByContextCount++;
2720
+ notRetainedByContextSize += selfSize;
2721
+ }
2722
+
2723
+ if (this.isContextObject(node)) {
2724
+ contextCount++;
2725
+ }
2726
+ }
2727
+
2728
+ return {
2729
+ contextCount,
2730
+ retainedByContextSize,
2731
+ retainedByContextCount,
2732
+ notRetainedByContextSize,
2733
+ notRetainedByContextCount,
2734
+ totalSize: retainedByContextSize + notRetainedByContextSize,
2735
+ };
2736
+ }
2737
+
2710
2738
  nodeNativeContext(nodeIndex: number): number {
2711
2739
  const ordinal = nodeIndex / this.nodeFieldCount;
2712
2740
  const nativeContextOrdinal = this.nodeNativeContextAttribution[ordinal];
@@ -2987,6 +3015,30 @@ export abstract class HeapSnapshot {
2987
3015
  return null;
2988
3016
  }
2989
3017
 
3018
+ private initDetachednessAndClassIndex(): void {
3019
+ this.detachednessAndClassIndexArray = new Uint32Array(this.nodeCount);
3020
+ if (this.nodeDetachednessAndClassIndexOffset !== -1) {
3021
+ // Seed this array from the detachedness field of the snapshot.
3022
+ const {nodeFieldCount, nodeDetachednessAndClassIndexOffset: offset} = this;
3023
+ for (let i = 0; i < this.nodeCount; ++i) {
3024
+ this.detachednessAndClassIndexArray[i] = Number(this.nodes.getValue(i * nodeFieldCount + offset));
3025
+ }
3026
+ } else {
3027
+ // For old snapshots, treat native objects named 'Detached ...' as detached.
3028
+ const node = this.rootNode();
3029
+ const nodesLength = this.nodes.length;
3030
+ const {nodeFieldCount, nodeNativeType, nodeTypeOffset} = this;
3031
+ for (let nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
3032
+ if (this.nodes.getValue(nodeIndex + nodeTypeOffset) === nodeNativeType) {
3033
+ node.nodeIndex = nodeIndex;
3034
+ if (node.name().startsWith('Detached ')) {
3035
+ node.setDetachedness(HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED);
3036
+ }
3037
+ }
3038
+ }
3039
+ }
3040
+ }
3041
+
2990
3042
  /**
2991
3043
  * The phase propagates whether a node is attached or detached through the
2992
3044
  * graph and adjusts the low-level representation of nodes.
@@ -3292,11 +3344,58 @@ export abstract class HeapSnapshot {
3292
3344
  return null;
3293
3345
  }
3294
3346
 
3295
- createEdgesProvider(nodeIndex: number): HeapSnapshotEdgesProvider {
3347
+ createEdgesProvider(nodeIndex: number,
3348
+ options?: HeapSnapshotModel.HeapSnapshotModel.HeapEdgesQueryOptions): HeapSnapshotEdgesProvider {
3296
3349
  const node = this.createNode(nodeIndex);
3297
- const filter = this.containmentEdgesFilter();
3350
+ const defaultFilter = this.containmentEdgesFilter();
3351
+ const minRetainedSize = options?.minRetainedSize;
3352
+ const excludePrimitives = options?.excludePrimitives ?? false;
3353
+
3354
+ let filter: ((arg0: HeapSnapshotEdge) => boolean)|null = defaultFilter;
3355
+
3356
+ if (minRetainedSize !== undefined || excludePrimitives) {
3357
+ filter = (edge: HeapSnapshotEdge): boolean => {
3358
+ if (defaultFilter && !defaultFilter(edge)) {
3359
+ return false;
3360
+ }
3361
+ const targetNode = edge.node();
3362
+ if (minRetainedSize !== undefined && targetNode.retainedSize() < minRetainedSize) {
3363
+ return false;
3364
+ }
3365
+ if (excludePrimitives) {
3366
+ const rawType = targetNode.rawType();
3367
+ if (rawType === this.nodeNumberType) {
3368
+ return false;
3369
+ }
3370
+ if (rawType === this.nodeNativeType) {
3371
+ const targetName = targetNode.rawName();
3372
+ if (targetName === 'undefined' || targetName === 'null' || targetName === 'true' ||
3373
+ targetName === 'false') {
3374
+ return false;
3375
+ }
3376
+ }
3377
+ }
3378
+ return true;
3379
+ };
3380
+ }
3381
+
3298
3382
  const indexProvider = new HeapSnapshotEdgeIndexProvider(this);
3299
- return new HeapSnapshotEdgesProvider(this, filter, node.edges(), indexProvider);
3383
+ const provider = new HeapSnapshotEdgesProvider(this, filter, node.edges(), indexProvider);
3384
+
3385
+ if (options?.sortBy) {
3386
+ const sortBy = options.sortBy;
3387
+ let comparator: HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig;
3388
+ if (sortBy === 'selfSize') {
3389
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('selfSize', false, '!edgeName', true);
3390
+ } else if (sortBy === 'name') {
3391
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('!edgeName', true, 'retainedSize', false);
3392
+ } else {
3393
+ comparator = new HeapSnapshotModel.HeapSnapshotModel.ComparatorConfig('retainedSize', false, '!edgeName', true);
3394
+ }
3395
+ provider.sortAndRewind(comparator);
3396
+ }
3397
+
3398
+ return provider;
3300
3399
  }
3301
3400
 
3302
3401
  createEdgesProviderForTest(nodeIndex: number, filter: ((arg0: HeapSnapshotEdge) => boolean)|null):
@@ -3512,6 +3611,97 @@ export abstract class HeapSnapshot {
3512
3611
  return new HeapSnapshotNodesProvider(this, this.aggregatesWithFilter(nodeFilter)[classKey].idxs);
3513
3612
  }
3514
3613
 
3614
+ queryObjects(queryOptions: HeapSnapshotModel.HeapSnapshotModel.HeapQueryOptions): HeapSnapshotNodesProvider {
3615
+ const {nodes, nodeFieldCount, retainedSizes} = this;
3616
+ const nodesLength = nodes.length;
3617
+
3618
+ const matchingIndexes: number[] = [];
3619
+
3620
+ const classNamePattern = queryOptions.className ? new RegExp(queryOptions.className, 'i') : null;
3621
+ const propertyNamePattern = queryOptions.propertyName ? new RegExp(queryOptions.propertyName, 'i') : null;
3622
+ const targetNodeType = queryOptions.nodeType ? queryOptions.nodeType.toLowerCase() : null;
3623
+
3624
+ const node = this.rootNode();
3625
+
3626
+ for (let nodeIndex = 0, ordinal = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount, ordinal++) {
3627
+ node.nodeIndex = nodeIndex;
3628
+
3629
+ if (queryOptions.minSelfSize !== undefined && node.selfSize() < queryOptions.minSelfSize) {
3630
+ continue;
3631
+ }
3632
+ if (queryOptions.maxSelfSize !== undefined && node.selfSize() > queryOptions.maxSelfSize) {
3633
+ continue;
3634
+ }
3635
+
3636
+ const retainedSize = retainedSizes[ordinal];
3637
+ if (queryOptions.minRetainedSize !== undefined && retainedSize < queryOptions.minRetainedSize) {
3638
+ continue;
3639
+ }
3640
+ if (queryOptions.maxRetainedSize !== undefined && retainedSize > queryOptions.maxRetainedSize) {
3641
+ continue;
3642
+ }
3643
+
3644
+ if (queryOptions.isDetached !== undefined) {
3645
+ const isDetached = node.detachedness() === HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED;
3646
+ if (isDetached !== queryOptions.isDetached) {
3647
+ continue;
3648
+ }
3649
+ }
3650
+
3651
+ if (classNamePattern) {
3652
+ const name = node.name();
3653
+ if (!classNamePattern.test(name)) {
3654
+ continue;
3655
+ }
3656
+ }
3657
+
3658
+ if (targetNodeType) {
3659
+ const typeStr = node.type();
3660
+ if (typeStr.toLowerCase() !== targetNodeType) {
3661
+ continue;
3662
+ }
3663
+ }
3664
+
3665
+ if (propertyNamePattern) {
3666
+ let propMatch = false;
3667
+ for (const iter = node.edges(); iter.hasNext(); iter.next()) {
3668
+ if (propertyNamePattern.test(iter.edge.name())) {
3669
+ propMatch = true;
3670
+ break;
3671
+ }
3672
+ }
3673
+ if (!propMatch) {
3674
+ continue;
3675
+ }
3676
+ }
3677
+
3678
+ matchingIndexes.push(nodeIndex);
3679
+ }
3680
+
3681
+ const sortBy = queryOptions.sortBy ?? 'retainedSize';
3682
+ if (sortBy === 'retainedSize') {
3683
+ matchingIndexes.sort((a, b) => retainedSizes[b / nodeFieldCount] - retainedSizes[a / nodeFieldCount]);
3684
+ } else if (sortBy === 'selfSize') {
3685
+ matchingIndexes.sort((a, b) => {
3686
+ node.nodeIndex = b;
3687
+ const sizeB = node.selfSize();
3688
+ node.nodeIndex = a;
3689
+ const sizeA = node.selfSize();
3690
+ return sizeB - sizeA;
3691
+ });
3692
+ } else if (sortBy === 'id') {
3693
+ matchingIndexes.sort((a, b) => {
3694
+ node.nodeIndex = b;
3695
+ const idB = node.id();
3696
+ node.nodeIndex = a;
3697
+ const idA = node.id();
3698
+ return idA - idB;
3699
+ });
3700
+ }
3701
+
3702
+ return new HeapSnapshotNodesProvider(this, matchingIndexes);
3703
+ }
3704
+
3515
3705
  private maxJsNodeId(): number {
3516
3706
  const nodeFieldCount = this.nodeFieldCount;
3517
3707
  const nodes = this.nodes;
@@ -4196,7 +4386,7 @@ export class JSHeapSnapshot extends HeapSnapshot {
4196
4386
  continue;
4197
4387
  }
4198
4388
  node.nodeIndex = nodeIndex;
4199
- if (node.name().startsWith('Detached ')) {
4389
+ if (node.detachedness() === HeapSnapshotModel.HeapSnapshotModel.DOMLinkState.DETACHED) {
4200
4390
  this.flags[ordinal] |= flag;
4201
4391
  }
4202
4392
  }
@@ -49,6 +49,7 @@ import * as Persistence from '../../models/persistence/persistence.js';
49
49
  import * as Workspace from '../../models/workspace/workspace.js';
50
50
  import * as PanelCommon from '../../panels/common/common.js';
51
51
  import * as Snippets from '../../panels/snippets/snippets.js';
52
+ import type * as Comments from '../../ui/comments/comments.js';
52
53
  import * as Buttons from '../../ui/components/buttons/buttons.js';
53
54
  import * as Snackbar from '../../ui/components/snackbars/snackbars.js';
54
55
  import * as UIHelpers from '../../ui/helpers/helpers.js';
@@ -998,3 +999,33 @@ export class ReloadActionDelegate implements UI.ActionRegistration.ActionDelegat
998
999
  return false;
999
1000
  }
1000
1001
  }
1002
+
1003
+ let activeCommentManager: Comments.CommentManager.CommentManager|null = null;
1004
+ let activeOverlayWidget: Comments.CommentsOverlayWidget.CommentsOverlayWidget|null = null;
1005
+
1006
+ // Temporary for manual testing and experimentation.
1007
+ export async function comments(): Promise<Comments.CommentManager.CommentManager> {
1008
+ const Comments = await import('../../ui/comments/comments.js');
1009
+ if (!activeCommentManager || !activeOverlayWidget) {
1010
+ activeCommentManager = new Comments.CommentManager.CommentManager();
1011
+ activeCommentManager.start();
1012
+
1013
+ activeOverlayWidget = new Comments.CommentsOverlayWidget.CommentsOverlayWidget(activeCommentManager);
1014
+ activeOverlayWidget.markAsRoot();
1015
+ activeOverlayWidget.show(document.body);
1016
+ activeCommentManager.setCommentMode(true);
1017
+ return activeCommentManager;
1018
+ }
1019
+
1020
+ const newMode = !activeCommentManager.isCommentMode();
1021
+ activeCommentManager.setCommentMode(newMode);
1022
+ if (newMode) {
1023
+ activeOverlayWidget.show(document.body);
1024
+ } else {
1025
+ activeOverlayWidget.detach();
1026
+ }
1027
+ return activeCommentManager;
1028
+ }
1029
+
1030
+ // @ts-expect-error global helper for manual testing
1031
+ globalThis.comments = comments;
@@ -1136,6 +1136,8 @@ inspectorBackend.registerEnum("Page.SetTouchEmulationEnabledRequestConfiguration
1136
1136
  inspectorBackend.registerCommand("Page.setTouchEmulationEnabled", [{"name": "enabled", "type": "boolean", "optional": false, "description": "Whether the touch event emulation should be enabled.", "typeRef": null}, {"name": "configuration", "type": "string", "optional": true, "description": "Touch/gesture events configuration. Default: current platform.", "typeRef": "Page.SetTouchEmulationEnabledRequestConfiguration"}], [], "Toggles mouse event-based touch event emulation.");
1137
1137
  inspectorBackend.registerEnum("Page.StartScreencastRequestFormat", {Jpeg: "jpeg", Png: "png"});
1138
1138
  inspectorBackend.registerCommand("Page.startScreencast", [{"name": "format", "type": "string", "optional": true, "description": "Image compression format.", "typeRef": "Page.StartScreencastRequestFormat"}, {"name": "quality", "type": "number", "optional": true, "description": "Compression quality from range [0..100].", "typeRef": null}, {"name": "maxWidth", "type": "number", "optional": true, "description": "Maximum screenshot width.", "typeRef": null}, {"name": "maxHeight", "type": "number", "optional": true, "description": "Maximum screenshot height.", "typeRef": null}, {"name": "everyNthFrame", "type": "number", "optional": true, "description": "Send every n-th frame.", "typeRef": null}], [], "Starts sending each frame using the `screencastFrame` event.");
1139
+ inspectorBackend.registerCommand("Page.startScreenRecording", [{"name": "audio", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "maxWidth", "type": "number", "optional": true, "description": "Maximum frame width in pixels.", "typeRef": null}, {"name": "maxHeight", "type": "number", "optional": true, "description": "Maximum frame height in pixels.", "typeRef": null}, {"name": "frameRate", "type": "number", "optional": true, "description": "Maximum frame rate in frames per second.", "typeRef": null}], ["stream"], "Starts screencast video recording.");
1140
+ inspectorBackend.registerCommand("Page.stopScreenRecording", [], ["stream"], "Stops screencast video recording.");
1139
1141
  inspectorBackend.registerCommand("Page.stopLoading", [], [], "Force the page stop all navigations and pending resource fetches.");
1140
1142
  inspectorBackend.registerCommand("Page.crash", [], [], "Crashes renderer on the IO thread, generates minidumps.");
1141
1143
  inspectorBackend.registerCommand("Page.close", [], [], "Tries to close page, running its beforeunload hooks, if any.");
@@ -1464,7 +1466,7 @@ inspectorBackend.registerType("WebAudio.AudioParam", [{"name": "paramId", "type"
1464
1466
  // WebAuthn.
1465
1467
  inspectorBackend.registerEnum("WebAuthn.AuthenticatorProtocol", {U2f: "u2f", Ctap2: "ctap2"});
1466
1468
  inspectorBackend.registerEnum("WebAuthn.Ctap2Version", {Ctap2_0: "ctap2_0", Ctap2_1: "ctap2_1", Ctap2_2: "ctap2_2"});
1467
- inspectorBackend.registerEnum("WebAuthn.AuthenticatorTransport", {Usb: "usb", Nfc: "nfc", Ble: "ble", Cable: "cable", Internal: "internal"});
1469
+ inspectorBackend.registerEnum("WebAuthn.AuthenticatorTransport", {Usb: "usb", Nfc: "nfc", Ble: "ble", Cable: "cable", Hybrid: "hybrid", SmartCard: "smart-card", Internal: "internal"});
1468
1470
  inspectorBackend.registerEvent("WebAuthn.credentialAdded", ["authenticatorId", "credential"]);
1469
1471
  inspectorBackend.registerEvent("WebAuthn.credentialDeleted", ["authenticatorId", "credentialId"]);
1470
1472
  inspectorBackend.registerEvent("WebAuthn.credentialUpdated", ["authenticatorId", "credential"]);
@@ -1026,6 +1026,11 @@ export const generatedProperties = [
1026
1026
  "runtime_flag_status": "stable"
1027
1027
  },
1028
1028
  {
1029
+ "devtools_keywords": [
1030
+ "none",
1031
+ "move",
1032
+ "no-drag"
1033
+ ],
1029
1034
  "name": "app-region"
1030
1035
  },
1031
1036
  {
@@ -5163,7 +5168,8 @@ export const generatedProperties = [
5163
5168
  "inline",
5164
5169
  "both",
5165
5170
  "mandatory",
5166
- "proximity"
5171
+ "proximity",
5172
+ "pair"
5167
5173
  ],
5168
5174
  "name": "scroll-snap-type"
5169
5175
  },
@@ -6078,6 +6084,10 @@ export const generatedProperties = [
6078
6084
  "name": "will-change"
6079
6085
  },
6080
6086
  {
6087
+ "devtools_keywords": [
6088
+ "none",
6089
+ "move"
6090
+ ],
6081
6091
  "inherited": true,
6082
6092
  "keywords": [
6083
6093
  "none",
@@ -6415,6 +6425,13 @@ export const generatedPropertyValues = {
6415
6425
  "none"
6416
6426
  ]
6417
6427
  },
6428
+ "app-region": {
6429
+ "values": [
6430
+ "none",
6431
+ "move",
6432
+ "no-drag"
6433
+ ]
6434
+ },
6418
6435
  "appearance": {
6419
6436
  "values": [
6420
6437
  "auto",
@@ -8694,7 +8711,8 @@ export const generatedPropertyValues = {
8694
8711
  "inline",
8695
8712
  "both",
8696
8713
  "mandatory",
8697
- "proximity"
8714
+ "proximity",
8715
+ "pair"
8698
8716
  ]
8699
8717
  },
8700
8718
  "scroll-target-group": {
@@ -9208,8 +9226,7 @@ export const generatedPropertyValues = {
9208
9226
  "window-drag": {
9209
9227
  "values": [
9210
9228
  "none",
9211
- "move",
9212
- "no-drag"
9229
+ "move"
9213
9230
  ]
9214
9231
  },
9215
9232
  "word-break": {
@@ -4323,6 +4323,20 @@ export namespace ProtocolMapping {
4323
4323
  paramsType: [Protocol.Page.StartScreencastRequest?];
4324
4324
  returnType: void;
4325
4325
  };
4326
+ /**
4327
+ * Starts screencast video recording.
4328
+ */
4329
+ 'Page.startScreenRecording': {
4330
+ paramsType: [Protocol.Page.StartScreenRecordingRequest?];
4331
+ returnType: Protocol.Page.StartScreenRecordingResponse;
4332
+ };
4333
+ /**
4334
+ * Stops screencast video recording.
4335
+ */
4336
+ 'Page.stopScreenRecording': {
4337
+ paramsType: [];
4338
+ returnType: Protocol.Page.StopScreenRecordingResponse;
4339
+ };
4326
4340
  /**
4327
4341
  * Force the page stop all navigations and pending resource fetches.
4328
4342
  */
@@ -3478,6 +3478,16 @@ declare namespace ProtocolProxyApi {
3478
3478
  */
3479
3479
  invoke_startScreencast(params: Protocol.Page.StartScreencastRequest): Promise<Protocol.ProtocolResponseWithError>;
3480
3480
 
3481
+ /**
3482
+ * Starts screencast video recording.
3483
+ */
3484
+ invoke_startScreenRecording(params: Protocol.Page.StartScreenRecordingRequest): Promise<Protocol.Page.StartScreenRecordingResponse>;
3485
+
3486
+ /**
3487
+ * Stops screencast video recording.
3488
+ */
3489
+ invoke_stopScreenRecording(): Promise<Protocol.Page.StopScreenRecordingResponse>;
3490
+
3481
3491
  /**
3482
3492
  * Force the page stop all navigations and pending resource fetches.
3483
3493
  */
@@ -16288,6 +16288,36 @@ export namespace Page {
16288
16288
  everyNthFrame?: integer;
16289
16289
  }
16290
16290
 
16291
+ export interface StartScreenRecordingRequest {
16292
+ audio?: boolean;
16293
+ /**
16294
+ * Maximum frame width in pixels.
16295
+ */
16296
+ maxWidth?: integer;
16297
+ /**
16298
+ * Maximum frame height in pixels.
16299
+ */
16300
+ maxHeight?: integer;
16301
+ /**
16302
+ * Maximum frame rate in frames per second.
16303
+ */
16304
+ frameRate?: integer;
16305
+ }
16306
+
16307
+ export interface StartScreenRecordingResponse extends ProtocolResponseWithError {
16308
+ /**
16309
+ * A handle of the stream that holds resulting screencast data.
16310
+ */
16311
+ stream: IO.StreamHandle;
16312
+ }
16313
+
16314
+ export interface StopScreenRecordingResponse extends ProtocolResponseWithError {
16315
+ /**
16316
+ * A handle of the stream that holds resulting screencast data.
16317
+ */
16318
+ stream: IO.StreamHandle;
16319
+ }
16320
+
16291
16321
  export const enum SetWebLifecycleStateRequestState {
16292
16322
  Frozen = 'frozen',
16293
16323
  Active = 'active',
@@ -20069,11 +20099,16 @@ export namespace WebAuthn {
20069
20099
  Ctap2_2 = 'ctap2_2',
20070
20100
  }
20071
20101
 
20102
+ /**
20103
+ * LINT_SKIP.IfChange(AuthenticatorTransport)
20104
+ */
20072
20105
  export const enum AuthenticatorTransport {
20073
20106
  Usb = 'usb',
20074
20107
  Nfc = 'nfc',
20075
20108
  Ble = 'ble',
20076
20109
  Cable = 'cable',
20110
+ Hybrid = 'hybrid',
20111
+ SmartCard = 'smart-card',
20077
20112
  Internal = 'internal',
20078
20113
  }
20079
20114
 
@@ -30,6 +30,8 @@ const SKILL_DISPLAY_NAMES: Record<SkillName, string> = {
30
30
  network: 'Network requests',
31
31
  accessibility: 'Accessibility',
32
32
  performance: 'Performance',
33
+ storage: 'Storage',
34
+ sources: 'Workspace files and sources',
33
35
  };
34
36
 
35
37
  const preamble = `You are the most advanced unified AI assistant integrated into Chrome DevTools.
@@ -81,6 +83,12 @@ export class AiAgent2 extends AiAgent<unknown> {
81
83
  return {};
82
84
  }
83
85
 
86
+ protected override async preRun(): Promise<void> {
87
+ if (this.context && !this.context.isLoggingEnabled()) {
88
+ this.setServerSideLoggingActive(false);
89
+ }
90
+ }
91
+
84
92
  readonly #activeSkills = new Set<SkillName>();
85
93
  readonly #declaredTools = new Set<string>();
86
94
 
@@ -242,6 +250,9 @@ User query: ${enhancedQuery}`;
242
250
  getEstablishedOrigin: () => this.#getConversationOrigin(),
243
251
  lighthouseRecording: this.#lighthouseRecording,
244
252
  performanceRecordAndReload: this.#performanceRecordAndReload,
253
+ setLoggingEnabled: (enabled: boolean) => {
254
+ this.setServerSideLoggingActive(enabled);
255
+ },
245
256
  };
246
257
  return tool.handler(args, context, options);
247
258
  },
@@ -27,7 +27,7 @@ import {ContextSelectionAgent} from './agents/ContextSelectionAgent.js';
27
27
  import {FileAgent} from './agents/FileAgent.js';
28
28
  import {NetworkAgent} from './agents/NetworkAgent.js';
29
29
  import {PerformanceAgent} from './agents/PerformanceAgent.js';
30
- import {StorageAgent, StorageContext} from './agents/StorageAgent.js';
30
+ import {StorageAgent} from './agents/StorageAgent.js';
31
31
  import {StylingAgent} from './agents/StylingAgent.js';
32
32
  import {AiAgent2} from './AiAgent2.js';
33
33
  import {AiHistoryStorage, ConversationType, type SerializedConversation} from './AiHistoryStorage.js';
@@ -37,6 +37,9 @@ import {DOMNodeContext} from './contexts/DOMNodeContext.js';
37
37
  import {FileContext} from './contexts/FileContext.js';
38
38
  import {PerformanceTraceContext} from './contexts/PerformanceTraceContext.js';
39
39
  import {RequestContext} from './contexts/RequestContext.js';
40
+ import {StorageContext} from './contexts/StorageContext.js';
41
+ import {ToolAnnotation} from './tools/Tool.js';
42
+ import {ToolRegistry} from './tools/ToolRegistry.js';
40
43
 
41
44
  export const NOT_FOUND_IMAGE_DATA = '';
42
45
  export const CONTEXT_TITLE = 'Analyzing data';
@@ -324,10 +327,18 @@ export class AiConversation {
324
327
  case ResponseType.SIDE_EFFECT: {
325
328
  return {...item, confirm: undefined};
326
329
  }
327
- case ResponseType.CONTEXT:
328
- case ResponseType.ACTION: {
330
+ case ResponseType.CONTEXT: {
329
331
  return {...item, widgets: undefined};
330
332
  }
333
+ case ResponseType.ACTION: {
334
+ const tool = item.toolName ? ToolRegistry.get(item.toolName) : undefined;
335
+ const shouldRedact = tool?.annotations?.includes(ToolAnnotation.REDACT_FROM_HISTORY);
336
+ return {
337
+ ...item,
338
+ output: shouldRedact ? '<redacted>' : item.output,
339
+ widgets: undefined,
340
+ };
341
+ }
331
342
  default:
332
343
  return item;
333
344
  }
@@ -361,7 +372,7 @@ export class AiConversation {
361
372
 
362
373
  const options = {
363
374
  aidaClient: this.#aidaClient,
364
- serverSideLoggingEnabled: isAiAssistanceServerSideLoggingEnabled(),
375
+ serverSideLoggingAllowed: isAiAssistanceServerSideLoggingAllowed(),
365
376
  sessionId: this.id,
366
377
  changeManager: this.#changeManager,
367
378
  performanceRecordAndReload: this.#performanceRecordAndReload,
@@ -540,7 +551,13 @@ export class AiConversation {
540
551
  };
541
552
  }
542
553
 
543
- function isAiAssistanceServerSideLoggingEnabled(): boolean {
554
+ /**
555
+ * Checks whether server-side logging is allowed by the global system policy.
556
+ * Note that even if this returns true, individual agents can still dynamically
557
+ * deactivate/activate logging during their execution (e.g., when handling
558
+ * sensitive tools).
559
+ */
560
+ function isAiAssistanceServerSideLoggingAllowed(): boolean {
544
561
  return !Root.Runtime.hostConfig.aidaAvailability?.disallowLogging;
545
562
  }
546
563