chrome-devtools-frontend 1.0.1667564 → 1.0.1669021

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 (211) hide show
  1. package/.agents/skills/devtools-ci/SKILL.md +65 -0
  2. package/.agents/skills/devtools-setting-migration/SKILL.md +290 -0
  3. package/.agents/skills/gerrit-cli/SKILL.md +59 -0
  4. package/.agents/skills/gerrit-cli/references/commands.md +93 -0
  5. package/.agents/skills/gerrit-cli/references/workflows.md +56 -0
  6. package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +47 -0
  7. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +230 -0
  8. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +11 -4
  9. package/.agents/skills/ui-widgets/SKILL.md +25 -1
  10. package/docs/contributing/infrastructure.md +7 -1
  11. package/docs/ui_engineering.md +44 -1
  12. package/front_end/core/common/Settings.ts +11 -4
  13. package/front_end/core/host/AidaClient.ts +66 -47
  14. package/front_end/core/host/GcaClient.ts +4 -6
  15. package/front_end/core/host/ResourceLoader.ts +4 -2
  16. package/front_end/core/root/Runtime.ts +5 -5
  17. package/front_end/core/sdk/CSSModel.test.api.ts +102 -0
  18. package/front_end/core/sdk/CSSModel.ts +3 -2
  19. package/front_end/core/sdk/ConsoleModel.ts +3 -2
  20. package/front_end/core/sdk/DebuggerModel.ts +16 -7
  21. package/front_end/core/sdk/SDKSettings.ts +38 -0
  22. package/front_end/core/sdk/sdk-meta.ts +0 -120
  23. package/front_end/core/sdk/sdk.ts +2 -0
  24. package/front_end/entrypoints/main/MainImpl.ts +10 -3
  25. package/front_end/foundation/Universe.ts +7 -0
  26. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  27. package/front_end/generated/protocol.ts +11 -3
  28. package/front_end/models/ai_assistance/AiAgent2.ts +1 -1
  29. package/front_end/models/ai_assistance/AiUtils.ts +67 -4
  30. package/front_end/models/ai_assistance/BuiltInAi.ts +11 -6
  31. package/front_end/models/ai_assistance/ChangeManager.ts +17 -1
  32. package/front_end/models/ai_assistance/StorageItem.ts +26 -5
  33. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +2 -19
  34. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +2 -3
  35. package/front_end/models/javascript_metadata/NativeFunctions.js +22 -9
  36. package/front_end/models/source_map_scopes/NamesResolver.ts +23 -17
  37. package/front_end/models/trace/handlers/RendererHandler.ts +20 -4
  38. package/front_end/models/trace/types/File.ts +1 -0
  39. package/front_end/models/workspace/UISourceCode.ts +0 -10
  40. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +61 -182
  41. package/front_end/panels/ai_assistance/components/ChatInput.ts +25 -8
  42. package/front_end/panels/ai_assistance/components/ChatMessage.ts +13 -69
  43. package/front_end/panels/ai_assistance/components/ChatView.ts +14 -8
  44. package/front_end/panels/ai_assistance/components/chatMessage.css +2 -20
  45. package/front_end/panels/application/ApplicationPanelSidebar.ts +2 -2
  46. package/front_end/panels/application/ApplicationPanelTreeElement.ts +41 -3
  47. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +131 -134
  48. package/front_end/panels/application/ServiceWorkersView.ts +8 -8
  49. package/front_end/panels/application/application.ts +2 -0
  50. package/front_end/panels/application/components/AdsView.ts +10 -6
  51. package/front_end/panels/application/preloading/PreloadingView.ts +53 -45
  52. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +111 -119
  53. package/front_end/panels/application/preloading/components/preloadingDetailsReportView.css +22 -24
  54. package/front_end/panels/application/serviceWorkerUpdateCycleView.css +105 -102
  55. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +107 -96
  56. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +17 -19
  57. package/front_end/panels/common/AiCodeCompletionTeaser.ts +6 -6
  58. package/front_end/panels/common/AiCodeGenerationTeaser.ts +28 -26
  59. package/front_end/panels/common/common.ts +1 -1
  60. package/front_end/panels/console/ConsoleInsightTeaser.ts +6 -8
  61. package/front_end/panels/console/ConsoleView.ts +6 -4
  62. package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
  63. package/front_end/panels/console/console-meta.ts +28 -0
  64. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
  65. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  66. package/front_end/panels/emulation/DeviceModeToolbar.ts +2 -2
  67. package/front_end/panels/emulation/DeviceModeView.ts +63 -104
  68. package/front_end/panels/emulation/DeviceModeWrapper.ts +18 -4
  69. package/front_end/panels/explain/components/ConsoleInsight.ts +4 -6
  70. package/front_end/panels/explain/explain-meta.ts +7 -49
  71. package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
  72. package/front_end/panels/network/NetworkLogView.ts +1 -0
  73. package/front_end/panels/network/OriginalResourceChunkView.ts +340 -0
  74. package/front_end/panels/network/ResourceChunkView.ts +72 -46
  75. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +3 -2
  76. package/front_end/panels/network/ResourceWebSocketFrameView.ts +3 -3
  77. package/front_end/panels/network/originalResourceChunkView.css +49 -0
  78. package/front_end/panels/screencast/ScreencastView.ts +401 -260
  79. package/front_end/panels/screencast/screencastView.css +113 -100
  80. package/front_end/panels/sensors/LocationsSettingsTab.ts +329 -135
  81. package/front_end/panels/sensors/locationsSettingsTab.css +78 -4
  82. package/front_end/panels/settings/AISettingsTab.ts +17 -100
  83. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +2 -2
  84. package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
  85. package/front_end/panels/sources/AddSourceMapURLDialog.ts +3 -3
  86. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +4 -3
  87. package/front_end/panels/sources/BreakpointEditDialog.ts +14 -14
  88. package/front_end/panels/sources/BreakpointsView.ts +14 -14
  89. package/front_end/panels/sources/CallStackSidebarPane.ts +6 -6
  90. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
  91. package/front_end/panels/sources/CoveragePlugin.ts +7 -7
  92. package/front_end/panels/sources/DebuggerPausedMessage.ts +23 -23
  93. package/front_end/panels/sources/DebuggerPlugin.ts +31 -31
  94. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +2 -2
  95. package/front_end/panels/sources/GoToLineQuickOpen.ts +10 -10
  96. package/front_end/panels/sources/NavigatorView.ts +34 -27
  97. package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
  98. package/front_end/panels/sources/PersistenceActions.ts +9 -9
  99. package/front_end/panels/sources/ProfilePlugin.ts +1 -1
  100. package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -5
  101. package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
  102. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  103. package/front_end/panels/sources/SourcesPanel.ts +26 -25
  104. package/front_end/panels/sources/SourcesView.ts +5 -6
  105. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
  106. package/front_end/panels/sources/ThreadsSidebarPane.ts +1 -1
  107. package/front_end/panels/sources/UISourceCodeFrame.ts +0 -2
  108. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +7 -7
  109. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  110. package/front_end/panels/sources/sources-meta.ts +164 -71
  111. package/front_end/panels/sources/sources.ts +0 -2
  112. package/front_end/panels/timeline/TimelineHistoryManager.ts +14 -3
  113. package/front_end/panels/timeline/TimelineLoader.ts +72 -42
  114. package/front_end/panels/timeline/TimelinePanel.ts +29 -4
  115. package/front_end/panels/timeline/timelineHistoryManager.css +4 -0
  116. package/front_end/third_party/chromium/README.chromium +1 -1
  117. package/front_end/third_party/puppeteer/README.chromium +2 -2
  118. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +187 -1
  119. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +91 -38
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +145 -2
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +0 -2
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts +0 -2
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +0 -2
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts +3 -2
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js +8 -2
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts +0 -2
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +0 -2
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +1 -3
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +0 -2
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts +0 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js +0 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts +5 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +12 -0
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +4 -1
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +5 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +49 -0
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts +0 -6
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +0 -6
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.d.ts.map +1 -1
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js +3 -0
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js.map +1 -1
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +0 -3
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +0 -3
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.d.ts +2 -2
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.js +2 -2
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/types.d.ts +187 -1
  180. package/front_end/third_party/puppeteer/package/package.json +5 -5
  181. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +155 -2
  182. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +0 -2
  183. package/front_end/third_party/puppeteer/package/src/api/Dialog.ts +10 -2
  184. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +0 -2
  185. package/front_end/third_party/puppeteer/package/src/api/Page.ts +1 -3
  186. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +0 -1
  187. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +4 -2
  188. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +17 -0
  189. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +5 -4
  190. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +66 -0
  191. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +0 -6
  192. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  193. package/front_end/third_party/puppeteer/package/src/injected/util.ts +4 -1
  194. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +0 -3
  195. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  196. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  197. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  198. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +9 -7
  199. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +7 -8
  200. package/front_end/ui/legacy/Dialog.ts +103 -4
  201. package/front_end/ui/legacy/InspectorView.ts +1 -5
  202. package/front_end/ui/legacy/PopoverHelper.ts +5 -5
  203. package/front_end/ui/legacy/TabbedPane.ts +7 -2
  204. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +40 -24
  205. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -0
  206. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -4
  207. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +14 -7
  208. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -1
  209. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  210. package/package.json +1 -1
  211. package/front_end/panels/sources/AiWarningInfobarPlugin.ts +0 -78
@@ -100,10 +100,6 @@ const UIStrings = {
100
100
  * @description AI assistance UI text for deleting all local history entries.
101
101
  */
102
102
  clearChatHistory: 'Clear local chats',
103
- /**
104
- * @description AI assistance UI text for the export conversation button.
105
- */
106
- exportConversation: 'Export conversation',
107
103
  /**
108
104
  * @description AI assistance UI text explaining that the user has no past conversations.
109
105
  */
@@ -190,56 +186,6 @@ const UIStringsNotTranslate = {
190
186
  * @description Placeholder text for the chat UI input when AIAgent2 is enabled.
191
187
  */
192
188
  inputPlaceholderForV2: 'Ask a question (AIAgent2 enabled)',
193
- /**
194
- * @description Disclaimer text right after the chat input.
195
- */
196
- inputDisclaimerForStyling:
197
- 'Chat messages and any data the inspected page can access via Web APIs are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
198
- /**
199
- * @description Disclaimer text right after the chat input.
200
- */
201
- inputDisclaimerForStylingEnterpriseNoLogging:
202
- 'Chat messages and any data the inspected page can access via Web APIs are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
203
- /**
204
- * @description Disclaimer text right after the chat input.
205
- */
206
- inputDisclaimerForNetwork:
207
- 'Chat messages and the selected network request are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
208
- /**
209
- * @description Disclaimer text right after the chat input.
210
- */
211
- inputDisclaimerForNetworkEnterpriseNoLogging:
212
- 'Chat messages and the selected network request are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
213
- /**
214
- * @description Disclaimer text right after the chat input.
215
- */
216
- inputDisclaimerForFile:
217
- 'Chat messages and the selected file are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
218
- /**
219
- * @description Disclaimer text right after the chat input.
220
- */
221
- inputDisclaimerForFileEnterpriseNoLogging:
222
- 'Chat messages and the selected file are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
223
- /**
224
- * @description Disclaimer text right after the chat input.
225
- */
226
- inputDisclaimerForPerformance:
227
- 'Chat messages and trace data from your performance trace are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
228
- /**
229
- * @description Disclaimer text right after the chat input.
230
- */
231
- inputDisclaimerForPerformanceEnterpriseNoLogging:
232
- 'Chat messages and data from your performance trace are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
233
- /**
234
- * @description Disclaimer text right after the chat input.
235
- */
236
- inputDisclaimerForNoContext:
237
- 'Chat messages, any data the inspected page can see using Web APIs, and the items you select such as files, network requests, and performance traces are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
238
- /**
239
- * @description Disclaimer text right after the chat input.
240
- */
241
- inputDisclaimerForNoContextEnterpriseNoLogging:
242
- 'Chat messages, any data the inspected page can see using Web APIs, and the items you select such as files, network requests, and performance traces are sent to Google. This data will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
243
189
  /**
244
190
  * @description Placeholder text for the chat UI input.
245
191
  */
@@ -251,22 +197,12 @@ const UIStringsNotTranslate = {
251
197
  /**
252
198
  * @description Disclaimer text right after the chat input.
253
199
  */
254
- inputDisclaimerForAccessibility:
255
- 'Chat messages and the selected Lighthouse report are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
256
- /**
257
- * @description Disclaimer text right after the chat input.
258
- */
259
- inputDisclaimerForAccessibilityEnterpriseNoLogging:
260
- 'Chat messages and the selected Lighthouse report are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
261
- /**
262
- * @description Disclaimer text right after the chat input when V2 is enabled.
263
- */
264
- inputDisclaimerV2:
200
+ inputDisclaimer:
265
201
  'Chat messages, data accessible for this site via DevTools panels and Web APIs, and items you select such as network requests, files, and performance traces are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
266
202
  /**
267
- * @description Disclaimer text right after the chat input when V2 is enabled and enterprise logging is off.
203
+ * @description Disclaimer text right after the chat input when enterprise logging is off.
268
204
  */
269
- inputDisclaimerEnterpriseNoLoggingV2:
205
+ inputDisclaimerEnterpriseNoLogging:
270
206
  'Chat messages, data accessible for this site via DevTools panels and Web APIs, and items you select such as network requests, files, and performance traces are sent to Google. The content submitted to and generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
271
207
  } as const;
272
208
 
@@ -442,7 +378,6 @@ export interface PanelViewOutput {
442
378
  type View = (input: ViewInput, output: PanelViewOutput, target: HTMLElement) => void;
443
379
 
444
380
  function toolbarView(input: ToolbarViewInput): Lit.LitTemplate {
445
- const hasAiV2 = Boolean(Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled);
446
381
  // clang-format off
447
382
  return html`
448
383
  <div class="toolbar-container" role="toolbar" jslog=${VisualLogging.toolbar()}>
@@ -472,19 +407,7 @@ function toolbarView(input: ToolbarViewInput): Lit.LitTemplate {
472
407
  .jslogContext=${'freestyler.delete'}
473
408
  .variant=${Buttons.Button.Variant.TOOLBAR}
474
409
  @click=${input.onDeleteClick}>
475
- </devtools-button>
476
- ${hasAiV2 ? Lit.nothing : html`
477
- <devtools-button
478
- title=${i18nString(UIStrings.exportConversation)}
479
- aria-label=${i18nString(UIStrings.exportConversation)}
480
- .iconName=${'download'}
481
- .disabled=${input.isLoading}
482
- .jslogContext=${'export-ai-conversation'}
483
- .variant=${Buttons.Button.Variant.TOOLBAR}
484
- @click=${input.onExportConversationClick}>
485
- </devtools-button>
486
- `
487
- }` : Lit.nothing}
410
+ </devtools-button>` : Lit.nothing}
488
411
  </devtools-toolbar>
489
412
  <devtools-toolbar class="freestyler-right-toolbar" role="presentation">
490
413
  <devtools-link
@@ -540,51 +463,43 @@ function defaultView(input: ViewInput, output: PanelViewOutput, target: HTMLElem
540
463
  }
541
464
  }
542
465
 
543
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
544
-
545
- const shouldShowWalkthrough = input.state === ViewState.CHAT_VIEW && input.props.walkthrough.isExpanded;
546
- /**
547
- * We want to mark the walkthrough as loading only if it's showing the last
548
- * message. Otherwise, a previous walkthrough will show as loading if we
549
- * rely only on the isLoading flag.
550
- */
551
- let walkthroughIsForLastMessage = false;
552
- if(input.state === ViewState.CHAT_VIEW) {
553
- const lastMessage = input.props.messages.at(-1);
554
- if(lastMessage && input.props.walkthrough.activeSidebarMessage?.id === lastMessage.id) {
555
- walkthroughIsForLastMessage = true;
556
- }
466
+ const shouldShowWalkthrough = input.state === ViewState.CHAT_VIEW && input.props.walkthrough.isExpanded;
467
+ /**
468
+ * We want to mark the walkthrough as loading only if it's showing the last
469
+ * message. Otherwise, a previous walkthrough will show as loading if we
470
+ * rely only on the isLoading flag.
471
+ */
472
+ let walkthroughIsForLastMessage = false;
473
+ if(input.state === ViewState.CHAT_VIEW) {
474
+ const lastMessage = input.props.messages.at(-1);
475
+ if(lastMessage && input.props.walkthrough.activeSidebarMessage?.id === lastMessage.id) {
476
+ walkthroughIsForLastMessage = true;
557
477
  }
558
-
559
- Lit.render(html`
560
- ${toolbarView(input)}
561
- <div class="ai-assistance-view-container">
562
- <devtools-split-view
563
- name="ai-assistance-split-view-state"
564
- direction="column"
565
- sidebar-position="second"
566
- sidebar-visibility=${shouldShowWalkthrough && !input.props.walkthrough.isInlined ? 'visible' : 'hidden'}
567
- sidebar-initial-size=${WALKTHROUGH_SIDEBAR_INITIAL_WIDTH}
568
- >
569
- <div slot="main" class="main-view">
570
- ${renderState()}
571
- </div>
572
- ${shouldShowWalkthrough ? html`
573
- <devtools-widget slot="sidebar" ${widget(WalkthroughView, {
574
- message: input.props.walkthrough.activeSidebarMessage,
575
- isLoading: input.props.isLoading && walkthroughIsForLastMessage,
576
- markdownRenderer: input.props.markdownRenderer,
577
- onToggle: input.props.walkthrough.onToggle,
578
- })}></devtools-widget>` : Lit.nothing}
579
- </devtools-split-view>
580
- </div>
581
- `, target);
582
- } else {
583
- Lit.render(html`
584
- ${toolbarView(input)}
585
- <div class="ai-assistance-view-container">${renderState()}</div>
586
- `, target);
587
478
  }
479
+
480
+ Lit.render(html`
481
+ ${toolbarView(input)}
482
+ <div class="ai-assistance-view-container">
483
+ <devtools-split-view
484
+ name="ai-assistance-split-view-state"
485
+ direction="column"
486
+ sidebar-position="second"
487
+ sidebar-visibility=${shouldShowWalkthrough && !input.props.walkthrough.isInlined ? 'visible' : 'hidden'}
488
+ sidebar-initial-size=${WALKTHROUGH_SIDEBAR_INITIAL_WIDTH}
489
+ >
490
+ <div slot="main" class="main-view">
491
+ ${renderState()}
492
+ </div>
493
+ ${shouldShowWalkthrough ? html`
494
+ <devtools-widget slot="sidebar" ${widget(WalkthroughView, {
495
+ message: input.props.walkthrough.activeSidebarMessage,
496
+ isLoading: input.props.isLoading && walkthroughIsForLastMessage,
497
+ markdownRenderer: input.props.markdownRenderer,
498
+ onToggle: input.props.walkthrough.onToggle,
499
+ })}></devtools-widget>` : Lit.nothing}
500
+ </devtools-split-view>
501
+ </div>
502
+ `, target);
588
503
  // clang-format on
589
504
  }
590
505
 
@@ -709,6 +624,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
709
624
  activeSidebarMessage: null,
710
625
  inlineExpandedMessages: [],
711
626
  };
627
+ #textInputValue = '';
712
628
 
713
629
  constructor(private view: View = defaultView, {aidaClient, aidaAvailability}: {
714
630
  aidaClient: Host.AidaClient.AidaClient,
@@ -725,8 +641,6 @@ export class AiAssistancePanel extends UI.Panel.Panel {
725
641
  this.#toggleSearchElementAction =
726
642
  UI.ActionRegistry.ActionRegistry.instance().getAction('elements.toggle-element-search');
727
643
  }
728
- AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().addEventListener(
729
- AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
730
644
  }
731
645
 
732
646
  #getToolbarInput(): ToolbarViewInput {
@@ -795,6 +709,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
795
709
  emptyStateSuggestions,
796
710
  inputPlaceholder: this.#getChatInputPlaceholder(),
797
711
  disclaimerText: this.#getDisclaimerText(),
712
+ textInputValue: this.#textInputValue,
713
+ onTextChange: (text: string) => {
714
+ this.#textInputValue = text;
715
+ },
798
716
  onExportConversation: this.#onExportConversationClick.bind(this),
799
717
  uploadImageInputEnabled: isAiAssistanceMultimodalUploadInputEnabled() &&
800
718
  this.#conversation.type === AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING,
@@ -816,10 +734,9 @@ export class AiAssistancePanel extends UI.Panel.Panel {
816
734
  void this.#startConversation(text, imageInput, multimodalInputType);
817
735
  };
818
736
 
819
- const isAIV2Enabled = Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled;
820
737
  const seenSetting =
821
738
  Common.Settings.Settings.instance().moduleSetting('ai-assistance-v2-opt-in-change-dialog-seen');
822
- if (isAIV2Enabled && !seenSetting.get()) {
739
+ if (!seenSetting.get()) {
823
740
  OptInChangeDialog.show({
824
741
  onGotIt: () => {
825
742
  seenSetting.set(true);
@@ -864,9 +781,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
864
781
  // Responsive logic for Walkthrough
865
782
  override onResize(): void {
866
783
  super.onResize();
867
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
868
- this.#updateWalkthroughResponsiveness();
869
- }
784
+ this.#updateWalkthroughResponsiveness();
870
785
  }
871
786
 
872
787
  #updateWalkthroughResponsiveness(): void {
@@ -1144,6 +1059,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1144
1059
  createStorageContext(UI.Context.Context.instance().flavor(AiAssistanceModel.StorageItem.StorageItem));
1145
1060
  this.#updateConversationState(this.#conversation);
1146
1061
 
1062
+ AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().addEventListener(
1063
+ AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
1147
1064
  this.#aiAssistanceEnabledSetting?.addChangeListener(this.requestUpdate, this);
1148
1065
  Host.AidaClient.HostConfigTracker.instance().addEventListener(
1149
1066
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#handleAidaAvailabilityChange);
@@ -1188,6 +1105,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1188
1105
 
1189
1106
  override willHide(): void {
1190
1107
  super.willHide();
1108
+ AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().removeEventListener(
1109
+ AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
1191
1110
  this.#aiAssistanceEnabledSetting?.removeChangeListener(this.requestUpdate, this);
1192
1111
  Host.AidaClient.HostConfigTracker.instance().removeEventListener(
1193
1112
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#handleAidaAvailabilityChange);
@@ -1271,12 +1190,12 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1271
1190
  };
1272
1191
 
1273
1192
  #handleNetworkRequestFlavorChange =
1274
- (ev: Common.EventTarget.EventTargetEvent<SDK.NetworkRequest.NetworkRequest>): void => {
1193
+ (ev: Common.EventTarget.EventTargetEvent<SDK.NetworkRequest.NetworkRequest|null>): void => {
1275
1194
  if (this.#selectedRequest?.getItem() === ev.data) {
1276
1195
  return;
1277
1196
  }
1278
1197
 
1279
- if (Boolean(ev.data)) {
1198
+ if (ev.data) {
1280
1199
  const calculator = NetworkPanel.NetworkPanel.NetworkPanel.instance().networkLogView.timeCalculator();
1281
1200
  this.#selectedRequest = new AiAssistanceModel.RequestContext.RequestContext(ev.data, calculator);
1282
1201
  } else {
@@ -1379,14 +1298,14 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1379
1298
  return i18nString(UIStrings.followTheSteps);
1380
1299
  }
1381
1300
 
1382
- if (Root.Runtime.hostConfig.devToolsAiV2Architecture?.enabled) {
1383
- return lockedString(UIStringsNotTranslate.inputPlaceholderForV2);
1384
- }
1385
-
1386
1301
  if (this.#conversation && this.#conversation.isBlockedByOrigin) {
1387
1302
  return lockedString(UIStringsNotTranslate.crossOriginError);
1388
1303
  }
1389
1304
 
1305
+ if (Root.Runtime.hostConfig.devToolsAiV2Architecture?.enabled) {
1306
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForV2);
1307
+ }
1308
+
1390
1309
  switch (this.#conversation.type) {
1391
1310
  case AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING:
1392
1311
  return this.#conversation.selectedContext ?
@@ -1434,51 +1353,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1434
1353
  const loggingEnabled = Root.Runtime.hostConfig.aidaAvailability?.enterprisePolicyValue !==
1435
1354
  Root.Runtime.GenAiEnterprisePolicyValue.ALLOW_WITHOUT_LOGGING;
1436
1355
 
1437
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
1438
- if (loggingEnabled) {
1439
- return lockedString(UIStringsNotTranslate.inputDisclaimerV2);
1440
- }
1441
- return lockedString(UIStringsNotTranslate.inputDisclaimerEnterpriseNoLoggingV2);
1442
- }
1443
-
1444
- switch (this.#conversation.type) {
1445
- case AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING:
1446
- if (loggingEnabled) {
1447
- return lockedString(UIStringsNotTranslate.inputDisclaimerForStyling);
1448
- }
1449
- return lockedString(UIStringsNotTranslate.inputDisclaimerForStylingEnterpriseNoLogging);
1450
- case AiAssistanceModel.AiHistoryStorage.ConversationType.FILE:
1451
- if (loggingEnabled) {
1452
- return lockedString(UIStringsNotTranslate.inputDisclaimerForFile);
1453
- }
1454
- return lockedString(UIStringsNotTranslate.inputDisclaimerForFileEnterpriseNoLogging);
1455
- case AiAssistanceModel.AiHistoryStorage.ConversationType.NETWORK:
1456
- if (loggingEnabled) {
1457
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNetwork);
1458
- }
1459
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNetworkEnterpriseNoLogging);
1460
-
1461
- // It is deliberate that both Performance agents use the same disclaimer
1462
- // text and this has been approved by Privacy.
1463
- case AiAssistanceModel.AiHistoryStorage.ConversationType.PERFORMANCE:
1464
- if (loggingEnabled) {
1465
- return lockedString(UIStringsNotTranslate.inputDisclaimerForPerformance);
1466
- }
1467
- return lockedString(UIStringsNotTranslate.inputDisclaimerForPerformanceEnterpriseNoLogging);
1468
-
1469
- case AiAssistanceModel.AiHistoryStorage.ConversationType.ACCESSIBILITY:
1470
- if (loggingEnabled) {
1471
- return lockedString(UIStringsNotTranslate.inputDisclaimerForAccessibility);
1472
- }
1473
- return lockedString(UIStringsNotTranslate.inputDisclaimerForAccessibilityEnterpriseNoLogging);
1474
-
1475
- case AiAssistanceModel.AiHistoryStorage.ConversationType.STORAGE:
1476
- case AiAssistanceModel.AiHistoryStorage.ConversationType.NONE:
1477
- if (loggingEnabled) {
1478
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNoContext);
1479
- }
1480
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNoContextEnterpriseNoLogging);
1356
+ if (loggingEnabled) {
1357
+ return lockedString(UIStringsNotTranslate.inputDisclaimer);
1481
1358
  }
1359
+ return lockedString(UIStringsNotTranslate.inputDisclaimerEnterpriseNoLogging);
1482
1360
  }
1483
1361
 
1484
1362
  #handleFeedbackSubmit(rpcId: Host.AidaClient.RpcGlobalId, rating: Host.AidaClient.Rating, feedback?: string): void {
@@ -1713,6 +1591,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1713
1591
  }
1714
1592
 
1715
1593
  #handleNewChatRequest(): void {
1594
+ this.#textInputValue = '';
1716
1595
  this.#updateConversationState();
1717
1596
  this.#resetWalkthrough();
1718
1597
  UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.newChatCreated));
@@ -2000,7 +1879,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
2000
1879
  systemMessage.parts.push(newPart);
2001
1880
  }
2002
1881
 
2003
- if (data.widgets && Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
1882
+ if (data.widgets) {
2004
1883
  systemMessage.parts.push({
2005
1884
  type: 'widget',
2006
1885
  widgets: data.widgets,
@@ -158,6 +158,7 @@ export interface ViewInput {
158
158
  imageInput?: ImageInputData;
159
159
  uploadImageInputEnabled: boolean;
160
160
  isReadOnly: boolean;
161
+ textInputValue: string;
161
162
  textAreaRef: Lit.Directives.Ref<HTMLTextAreaElement>;
162
163
 
163
164
  onContextClick: () => void;
@@ -302,6 +303,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
302
303
  .disabled=${input.isTextInputDisabled}
303
304
  wrap="hard"
304
305
  maxlength="10000"
306
+ .value=${input.textInputValue}
305
307
  @keydown=${input.onTextAreaKeyDown}
306
308
  @paste=${input.onImagePaste}
307
309
  @dragover=${input.onImageDragOver}
@@ -523,6 +525,7 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
523
525
  multimodalInputEnabled = false;
524
526
  uploadImageInputEnabled = false;
525
527
  isReadOnly = false;
528
+ textInputValue = '';
526
529
 
527
530
  #textAreaRef = createRef<HTMLTextAreaElement>();
528
531
  #imageInput?: ImageInputData;
@@ -542,21 +545,30 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
542
545
  setInputValue(text: string): void {
543
546
  if (this.#textAreaRef.value) {
544
547
  const maxLength = this.#textAreaRef.value.maxLength;
545
- const truncatedText = (maxLength >= 0) ? text.substring(0, maxLength) : text;
548
+ const truncatedText = maxLength >= 0 ? text.substring(0, maxLength) : text;
546
549
  this.#textAreaRef.value.value = truncatedText;
547
550
  // Place the cursor at the end of the new value.
548
- this.#textAreaRef.value.setSelectionRange(truncatedText.length, truncatedText.length);
551
+ this.#textAreaRef.value.setSelectionRange(
552
+ truncatedText.length,
553
+ truncatedText.length,
554
+ );
555
+ this.textInputValue = truncatedText;
556
+ this.onTextChange(truncatedText);
549
557
  }
550
558
  this.performUpdate();
551
559
  }
552
560
 
553
561
  #isTextInputEmpty(): boolean {
554
- return !this.#textAreaRef.value?.value?.trim();
562
+ const text = this.#textAreaRef?.value?.value ?? this.textInputValue;
563
+ return !text.trim();
555
564
  }
556
565
 
557
- onTextSubmit:
558
- (text: string, imageInput?: Host.AidaClient.Part,
559
- multimodalInputType?: AiAssistanceModel.AiAgent.MultimodalInputType) => void = () => {};
566
+ onTextSubmit: (
567
+ text: string,
568
+ imageInput?: Host.AidaClient.Part,
569
+ multimodalInputType?: AiAssistanceModel.AiAgent.MultimodalInputType,
570
+ ) => void = () => {};
571
+ onTextChange: (text: string) => void = () => {};
560
572
  onContextClick = (): void => {};
561
573
  onInspectElementClick = (): void => {};
562
574
  onCancelClick = (): void => {};
@@ -751,12 +763,15 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
751
763
  imageInput: this.#imageInput,
752
764
  uploadImageInputEnabled: this.uploadImageInputEnabled,
753
765
  isReadOnly: this.isReadOnly,
766
+ textInputValue: this.textInputValue,
754
767
  textAreaRef: this.#textAreaRef,
755
768
  onContextClick: this.onContextClick,
756
769
  onInspectElementClick: this.onInspectElementClick,
757
770
  onImagePaste: this.#handleImagePaste,
758
771
  onNewConversation: this.onNewConversation,
759
- onTextInputChange: () => {
772
+ onTextInputChange: (text: string) => {
773
+ this.textInputValue = text;
774
+ this.onTextChange(text);
760
775
  this.requestUpdate();
761
776
  },
762
777
  onTakeScreenshot: this.#handleTakeScreenshot.bind(this),
@@ -770,7 +785,9 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
770
785
  onContextRemoved: this.onContextRemoved,
771
786
  onContextAdd: this.onContextAdd,
772
787
  },
773
- undefined, this.contentElement);
788
+ undefined,
789
+ this.contentElement,
790
+ );
774
791
  }
775
792
 
776
793
  focusTextInput(): void {