@parhelia/core 0.1.12882 → 0.1.12883

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 (414) hide show
  1. package/dist/agents-view/AgentsSidebar.js +1 -1
  2. package/dist/agents-view/AgentsSidebar.js.map +1 -1
  3. package/dist/agents-view/AgentsTitlebar.d.ts +1 -1
  4. package/dist/agents-view/AgentsTitlebar.js +3 -6
  5. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  6. package/dist/agents-view/AgentsView.d.ts +2 -2
  7. package/dist/agents-view/AgentsView.js +2 -2
  8. package/dist/agents-view/AgentsView.js.map +1 -1
  9. package/dist/agents-view/AgentsWorkspaceView.js +1 -12
  10. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  11. package/dist/agents-view/CreateAgentView.d.ts +1 -1
  12. package/dist/agents-view/CreateAgentView.js +1 -1
  13. package/dist/agents-view/DateAgentsGroup.js +12 -1
  14. package/dist/agents-view/DateAgentsGroup.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.js +16 -4
  16. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  17. package/dist/components/ui/card.d.ts +3 -1
  18. package/dist/components/ui/card.js +2 -2
  19. package/dist/components/ui/card.js.map +1 -1
  20. package/dist/components/ui/checkbox.js +1 -1
  21. package/dist/components/ui/checkbox.js.map +1 -1
  22. package/dist/components/ui/context-menu.d.ts +2 -1
  23. package/dist/components/ui/context-menu.js +6 -3
  24. package/dist/components/ui/context-menu.js.map +1 -1
  25. package/dist/components/ui/input.js +2 -2
  26. package/dist/components/ui/input.js.map +1 -1
  27. package/dist/components/ui/select.js +1 -1
  28. package/dist/components/ui/select.js.map +1 -1
  29. package/dist/components/ui/textarea.js +2 -2
  30. package/dist/components/ui/textarea.js.map +1 -1
  31. package/dist/config/config.js +91 -12
  32. package/dist/config/config.js.map +1 -1
  33. package/dist/editor/ContextMenu.d.ts +1 -0
  34. package/dist/editor/ContextMenu.js +4 -4
  35. package/dist/editor/ContextMenu.js.map +1 -1
  36. package/dist/editor/FieldActionsOverlay.d.ts +0 -1
  37. package/dist/editor/FieldActionsOverlay.js +1 -45
  38. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  39. package/dist/editor/FieldHistory.d.ts +2 -1
  40. package/dist/editor/FieldHistory.js +13 -12
  41. package/dist/editor/FieldHistory.js.map +1 -1
  42. package/dist/editor/FieldListField.d.ts +1 -1
  43. package/dist/editor/FieldListField.js +24 -36
  44. package/dist/editor/FieldListField.js.map +1 -1
  45. package/dist/editor/ImageEditor.d.ts +6 -1
  46. package/dist/editor/ImageEditor.js +19 -3
  47. package/dist/editor/ImageEditor.js.map +1 -1
  48. package/dist/editor/LinkEditorDialog.d.ts +9 -2
  49. package/dist/editor/LinkEditorDialog.js +174 -70
  50. package/dist/editor/LinkEditorDialog.js.map +1 -1
  51. package/dist/editor/MainLayout.js +49 -6
  52. package/dist/editor/MainLayout.js.map +1 -1
  53. package/dist/editor/MobileLayout.js +33 -1
  54. package/dist/editor/MobileLayout.js.map +1 -1
  55. package/dist/editor/PictureCropper.js +45 -28
  56. package/dist/editor/PictureCropper.js.map +1 -1
  57. package/dist/editor/PictureEditor.d.ts +2 -1
  58. package/dist/editor/PictureEditor.js +5 -14
  59. package/dist/editor/PictureEditor.js.map +1 -1
  60. package/dist/editor/ai/AgentProfileSelector.js +7 -7
  61. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  62. package/dist/editor/ai/Agents.js +20 -6
  63. package/dist/editor/ai/Agents.js.map +1 -1
  64. package/dist/editor/ai/GuidanceOverlay.js +1 -11
  65. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  66. package/dist/editor/ai/InlineAiDialog.d.ts +1 -0
  67. package/dist/editor/ai/InlineAiDialog.js +254 -202
  68. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  69. package/dist/editor/ai/InlineAiTextEditTooltip.d.ts +8 -0
  70. package/dist/editor/ai/InlineAiTextEditTooltip.js +10 -0
  71. package/dist/editor/ai/InlineAiTextEditTooltip.js.map +1 -0
  72. package/dist/editor/ai/InlineAiTrigger.js +158 -31
  73. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  74. package/dist/editor/ai/dialogs/capturePageDom.js +66 -36
  75. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  76. package/dist/editor/ai/dialogs/capturePageScreenshot.js +281 -162
  77. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  78. package/dist/editor/ai/inlineAiTextEditLabels.d.ts +2 -0
  79. package/dist/editor/ai/inlineAiTextEditLabels.js +8 -0
  80. package/dist/editor/ai/inlineAiTextEditLabels.js.map +1 -0
  81. package/dist/editor/ai/prepareInlineAiTextSelection.d.ts +5 -0
  82. package/dist/editor/ai/prepareInlineAiTextSelection.js +86 -0
  83. package/dist/editor/ai/prepareInlineAiTextSelection.js.map +1 -0
  84. package/dist/editor/ai/terminal/agentSessionState.d.ts +3 -0
  85. package/dist/editor/ai/terminal/agentSessionState.js +3 -1
  86. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  87. package/dist/editor/ai/terminal/agentStartRequest.d.ts +2 -1
  88. package/dist/editor/ai/terminal/agentStartRequest.js +2 -1
  89. package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
  90. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
  91. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  92. package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +7 -0
  93. package/dist/editor/ai/terminal/components/AgentDocumentList.js +55 -13
  94. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  95. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +5 -0
  96. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +12 -0
  97. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +1 -0
  98. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +3 -1
  99. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +22 -14
  100. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  101. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  102. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  103. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  104. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  105. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  106. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  107. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
  108. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +8 -11
  109. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  110. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +1 -4
  111. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +31 -14
  112. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  113. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  114. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  115. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +2 -1
  116. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +2 -4
  117. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  118. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  119. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  120. package/dist/editor/ai/terminal/components/AgentTerminalView.js +13 -2
  121. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  122. package/dist/editor/ai/terminal/components/AiResponseMessage.js +11 -9
  123. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  124. package/dist/editor/ai/terminal/components/ContextInfoBar.js +22 -2
  125. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  126. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +37 -26
  127. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  128. package/dist/editor/ai/terminal/components/ToolCallDisplay.js +3 -1
  129. package/dist/editor/ai/terminal/components/ToolCallDisplay.js.map +1 -1
  130. package/dist/editor/ai/terminal/components/UserMessage.d.ts +2 -1
  131. package/dist/editor/ai/terminal/components/UserMessage.js +144 -8
  132. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  133. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  134. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  135. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +1 -0
  136. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +3 -1
  137. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +9 -3
  138. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  139. package/dist/editor/ai/terminal/useAgentTerminalController.js +7 -0
  140. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  141. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  142. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  143. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +3 -1
  144. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  145. package/dist/editor/ai/useActiveAgentConversation.d.ts +3 -0
  146. package/dist/editor/ai/useActiveAgentConversation.js +32 -0
  147. package/dist/editor/ai/useActiveAgentConversation.js.map +1 -0
  148. package/dist/editor/ai/useInlineAiPosition.d.ts +10 -2
  149. package/dist/editor/ai/useInlineAiPosition.js +32 -71
  150. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  151. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +30 -62
  152. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  153. package/dist/editor/bridge/BridgeClient.d.ts +80 -0
  154. package/dist/editor/bridge/BridgeClient.js +417 -0
  155. package/dist/editor/bridge/BridgeClient.js.map +1 -0
  156. package/dist/editor/client/EditorShell.d.ts +5 -1
  157. package/dist/editor/client/EditorShell.js +295 -127
  158. package/dist/editor/client/EditorShell.js.map +1 -1
  159. package/dist/editor/client/editContext.d.ts +58 -5
  160. package/dist/editor/client/editContext.js.map +1 -1
  161. package/dist/editor/client/fieldModificationStore.d.ts +1 -0
  162. package/dist/editor/client/fieldModificationStore.js +7 -2
  163. package/dist/editor/client/fieldModificationStore.js.map +1 -1
  164. package/dist/editor/client/hooks/useSocketMessageHandler.js +14 -17
  165. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  166. package/dist/editor/client/itemsRepository.d.ts +2 -0
  167. package/dist/editor/client/itemsRepository.js +18 -9
  168. package/dist/editor/client/itemsRepository.js.map +1 -1
  169. package/dist/editor/client/operations.d.ts +1 -1
  170. package/dist/editor/client/operations.js +67 -21
  171. package/dist/editor/client/operations.js.map +1 -1
  172. package/dist/editor/client/pageModelBuilder.js +24 -7
  173. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  174. package/dist/editor/client/ui/EditorChrome.js +1 -1
  175. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  176. package/dist/editor/commands/componentCommands.d.ts +3 -1
  177. package/dist/editor/commands/componentCommands.js +8 -3
  178. package/dist/editor/commands/componentCommands.js.map +1 -1
  179. package/dist/editor/field-types/DateFieldEditor.js +1 -1
  180. package/dist/editor/field-types/DateFieldEditor.js.map +1 -1
  181. package/dist/editor/field-types/DateTimeFieldEditor.js +1 -1
  182. package/dist/editor/field-types/DateTimeFieldEditor.js.map +1 -1
  183. package/dist/editor/field-types/DropLinkEditor.js +1 -1
  184. package/dist/editor/field-types/DropLinkEditor.js.map +1 -1
  185. package/dist/editor/field-types/DropListEditor.js +1 -1
  186. package/dist/editor/field-types/DropListEditor.js.map +1 -1
  187. package/dist/editor/field-types/ImageFieldEditor.js +1 -1
  188. package/dist/editor/field-types/ImageFieldEditor.js.map +1 -1
  189. package/dist/editor/field-types/InternalLinkFieldEditor.js +1 -1
  190. package/dist/editor/field-types/InternalLinkFieldEditor.js.map +1 -1
  191. package/dist/editor/field-types/LinkFieldEditor.js +15 -3
  192. package/dist/editor/field-types/LinkFieldEditor.js.map +1 -1
  193. package/dist/editor/field-types/MultiLineText.js +11 -4
  194. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  195. package/dist/editor/field-types/NameValueListEditor.js +1 -1
  196. package/dist/editor/field-types/NameValueListEditor.js.map +1 -1
  197. package/dist/editor/field-types/PictureFieldEditor.js +2 -2
  198. package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
  199. package/dist/editor/field-types/RawEditor.js +9 -2
  200. package/dist/editor/field-types/RawEditor.js.map +1 -1
  201. package/dist/editor/field-types/RichTextEditorComponent.js +170 -77
  202. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  203. package/dist/editor/field-types/SingleLineText.js +10 -3
  204. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  205. package/dist/editor/field-types/TreeListEditor.js +1 -1
  206. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  207. package/dist/editor/field-types/richtext/bridgeRichTextProfile.d.ts +21 -0
  208. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js +96 -0
  209. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js.map +1 -0
  210. package/dist/editor/field-types/richtext/components/ReactSlate.css +44 -6
  211. package/dist/editor/field-types/richtext/components/ReactSlate.js +191 -36
  212. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  213. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.css +5 -2
  214. package/dist/editor/field-types/richtext/components/SimpleToolbar.js +5 -4
  215. package/dist/editor/field-types/richtext/components/SimpleToolbar.js.map +1 -1
  216. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -15
  217. package/dist/editor/field-types/richtext/contextMenuFactory.js +4 -435
  218. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  219. package/dist/editor/field-types/richtext/richTextToolbarIcons.d.ts +7 -0
  220. package/dist/editor/field-types/richtext/richTextToolbarIcons.js +49 -0
  221. package/dist/editor/field-types/richtext/richTextToolbarIcons.js.map +1 -0
  222. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  223. package/dist/editor/field-types/richtext/types.js.map +1 -1
  224. package/dist/editor/field-types/richtext/utils/conversion.js +23 -2
  225. package/dist/editor/field-types/richtext/utils/conversion.js.map +1 -1
  226. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +13 -0
  227. package/dist/editor/field-types/useFormFieldCaretPresence.js +92 -0
  228. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -0
  229. package/dist/editor/fieldTypes.d.ts +2 -0
  230. package/dist/editor/media-selector/TreeSelector.js +15 -15
  231. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  232. package/dist/editor/menubar/PageSelector.js +8 -2
  233. package/dist/editor/menubar/PageSelector.js.map +1 -1
  234. package/dist/editor/menubar/VersionPreviewCard.js +4 -249
  235. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  236. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  237. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  238. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +310 -187
  239. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  240. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +3 -1
  241. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  242. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  243. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +8 -0
  244. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +407 -0
  245. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -0
  246. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +5 -2
  247. package/dist/editor/page-editor-chrome/CommentHighlightings.js +340 -215
  248. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  249. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +5 -1
  250. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +11 -4
  251. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  252. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +21 -13
  253. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  254. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +23 -29
  255. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  256. package/dist/editor/page-editor-chrome/FrameMenu.js +110 -19
  257. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  258. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +3 -2
  259. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +148 -45
  260. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  261. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +2 -0
  262. package/dist/editor/page-editor-chrome/PageEditorChrome.js +25 -21
  263. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  264. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +163 -128
  265. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  266. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  267. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -3
  268. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  269. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -2
  270. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +83 -146
  271. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  272. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +5 -2
  273. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +144 -63
  274. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  275. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +1 -2
  276. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +101 -30
  277. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  278. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.d.ts +24 -0
  279. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.js +89 -0
  280. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.js.map +1 -0
  281. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +10 -1
  282. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +105 -122
  283. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  284. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +11 -4
  285. package/dist/editor/page-editor-chrome/overlay/geometry.js +139 -36
  286. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  287. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +26 -0
  288. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +228 -0
  289. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -0
  290. package/dist/editor/page-viewer/EditorForm.js +17 -1
  291. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  292. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  293. package/dist/editor/page-viewer/MiniMap.js +176 -364
  294. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  295. package/dist/editor/page-viewer/PageViewer.js +63 -17
  296. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  297. package/dist/editor/page-viewer/PageViewerFrame.d.ts +0 -5
  298. package/dist/editor/page-viewer/PageViewerFrame.js +1685 -1512
  299. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  300. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +20 -0
  301. package/dist/editor/page-viewer/bridgeFieldPatch.js +33 -0
  302. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -0
  303. package/dist/editor/page-viewer/pageViewContext.d.ts +32 -0
  304. package/dist/editor/page-viewer/pageViewContext.js +37 -6
  305. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  306. package/dist/editor/reviews/Comment.d.ts +2 -1
  307. package/dist/editor/reviews/Comment.js +10 -5
  308. package/dist/editor/reviews/Comment.js.map +1 -1
  309. package/dist/editor/reviews/CommentDisplayPopover.js +2 -1
  310. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  311. package/dist/editor/reviews/CommentEditor.d.ts +1 -0
  312. package/dist/editor/reviews/CommentEditor.js +3 -2
  313. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  314. package/dist/editor/reviews/CommentPopover.js +69 -10
  315. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  316. package/dist/editor/reviews/CommentView.js +24 -4
  317. package/dist/editor/reviews/CommentView.js.map +1 -1
  318. package/dist/editor/reviews/Comments.d.ts +0 -2
  319. package/dist/editor/reviews/Comments.js +31 -31
  320. package/dist/editor/reviews/Comments.js.map +1 -1
  321. package/dist/editor/reviews/FeedbackCard.d.ts +4 -2
  322. package/dist/editor/reviews/FeedbackCard.js +8 -10
  323. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  324. package/dist/editor/reviews/SuggestedEdit.js +4 -6
  325. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  326. package/dist/editor/reviews/SuggestionCommentThread.js +3 -3
  327. package/dist/editor/reviews/SuggestionCommentThread.js.map +1 -1
  328. package/dist/editor/reviews/SuggestionDisplayPopover.js +3 -2
  329. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  330. package/dist/editor/reviews/commentAi.js +96 -27
  331. package/dist/editor/reviews/commentAi.js.map +1 -1
  332. package/dist/editor/reviews/commentTransientSelection.d.ts +23 -0
  333. package/dist/editor/reviews/commentTransientSelection.js +7 -0
  334. package/dist/editor/reviews/commentTransientSelection.js.map +1 -0
  335. package/dist/editor/reviews/feedbackOrdering.d.ts +5 -0
  336. package/dist/editor/reviews/feedbackOrdering.js +27 -0
  337. package/dist/editor/reviews/feedbackOrdering.js.map +1 -0
  338. package/dist/editor/reviews/feedbackSelection.js +32 -4
  339. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  340. package/dist/editor/reviews/suggestedEditState.d.ts +12 -0
  341. package/dist/editor/reviews/suggestedEditState.js +90 -0
  342. package/dist/editor/reviews/suggestedEditState.js.map +1 -0
  343. package/dist/editor/reviews/suggestionDisplayValue.d.ts +43 -0
  344. package/dist/editor/reviews/suggestionDisplayValue.js +93 -0
  345. package/dist/editor/reviews/suggestionDisplayValue.js.map +1 -0
  346. package/dist/editor/services/agentService.d.ts +15 -0
  347. package/dist/editor/services/agentService.js +11 -1
  348. package/dist/editor/services/agentService.js.map +1 -1
  349. package/dist/editor/services/reviewsService.d.ts +2 -2
  350. package/dist/editor/services/reviewsService.js.map +1 -1
  351. package/dist/editor/settings/SettingsView.js +2 -2
  352. package/dist/editor/settings/SettingsView.js.map +1 -1
  353. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  354. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  355. package/dist/editor/settings/panels/ProvidersPanel.js +2 -3
  356. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  357. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  358. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  359. package/dist/editor/sidebar/Validation.js +4 -1
  360. package/dist/editor/sidebar/Validation.js.map +1 -1
  361. package/dist/editor/sidebar/Workbox.js +1 -1
  362. package/dist/editor/sidebar/Workbox.js.map +1 -1
  363. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +1 -1
  364. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
  365. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  366. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  367. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  368. package/dist/editor/ui/SimpleIconButton.js +7 -1
  369. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  370. package/dist/editor/ui/Splitter.d.ts +1 -0
  371. package/dist/editor/ui/Splitter.js +12 -2
  372. package/dist/editor/ui/Splitter.js.map +1 -1
  373. package/dist/editor/ui/animationSettle.d.ts +32 -0
  374. package/dist/editor/ui/animationSettle.js +85 -0
  375. package/dist/editor/ui/animationSettle.js.map +1 -0
  376. package/dist/editor/utils/expandSelectionAtCaret.d.ts +15 -0
  377. package/dist/editor/utils/expandSelectionAtCaret.js +183 -0
  378. package/dist/editor/utils/expandSelectionAtCaret.js.map +1 -0
  379. package/dist/editor/utils.d.ts +1 -17
  380. package/dist/editor/utils.js +0 -143
  381. package/dist/editor/utils.js.map +1 -1
  382. package/dist/editor/version-diff/versionDiffTargets.d.ts +3 -8
  383. package/dist/editor/version-diff/versionDiffTargets.js +37 -94
  384. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  385. package/dist/revision.d.ts +2 -2
  386. package/dist/revision.js +2 -2
  387. package/dist/splash-screen/ModernSplashScreen.js +11 -3
  388. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  389. package/dist/splash-screen/NewPage.js +7 -5
  390. package/dist/splash-screen/NewPage.js.map +1 -1
  391. package/dist/splash-screen/OpenPage.js +5 -3
  392. package/dist/splash-screen/OpenPage.js.map +1 -1
  393. package/dist/splash-screen/RecentPages.js +3 -3
  394. package/dist/splash-screen/RecentPages.js.map +1 -1
  395. package/dist/task-board/components/TaskDetailPanel.js +2 -1
  396. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  397. package/dist/task-board/views/DependencyGraphView.d.ts +42 -1
  398. package/dist/task-board/views/DependencyGraphView.js +94 -0
  399. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  400. package/dist/types.d.ts +1 -0
  401. package/package.json +2 -1
  402. package/styles.css +96 -0
  403. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +0 -7
  404. package/dist/editor/page-editor-chrome/InlineEditor.js +0 -1719
  405. package/dist/editor/page-editor-chrome/InlineEditor.js.map +0 -1
  406. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +0 -2
  407. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +0 -21
  408. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +0 -1
  409. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +0 -7
  410. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +0 -758
  411. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +0 -1
  412. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +0 -3
  413. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +0 -796
  414. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +0 -1
@@ -11,6 +11,7 @@ import { useEditContext } from "../../client/editContext";
11
11
  import { cn } from "../../../lib/utils";
12
12
  import { sanitizeSvg } from "../../../lib/sanitize";
13
13
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "../../../components/ui/dropdown-menu";
14
+ import { waitForSelectorAnimations } from "../../ui/animationSettle";
14
15
  /** Render a sanitized SVG string at a specific pixel size. */
15
16
  function SvgIcon({ svg, size, className, }) {
16
17
  const sanitizedSvg = sanitizeSvg(svg).trim();
@@ -37,15 +38,6 @@ function getEditorFormSlider(elements = []) {
37
38
  function isEditorFormSliderHidden(slider) {
38
39
  return slider?.getAttribute(EDITOR_FORM_HIDDEN_ATTRIBUTE) === "true";
39
40
  }
40
- async function waitForEditorFormSliderOpen(slider, timeoutMs = 1000) {
41
- const startedAt = Date.now();
42
- while (Date.now() - startedAt < timeoutMs) {
43
- if (!isEditorFormSliderHidden(slider ?? getEditorFormSlider())) {
44
- return;
45
- }
46
- await waitForDelay(50);
47
- }
48
- }
49
41
  async function waitForResolvedElements(resolveElements, selector, timeoutMs = 1000) {
50
42
  const startedAt = Date.now();
51
43
  while (Date.now() - startedAt < timeoutMs) {
@@ -171,7 +163,8 @@ function parseSelectorToken(selectorToken) {
171
163
  if (!selectorToken.startsWith("@"))
172
164
  return { selector: selectorToken };
173
165
  const raw = selectorToken.slice(1);
174
- // Preserve iframe: selectors (handled specially by expandSelector/highlightElement)
166
+ // Preserve iframe: selectors as unavailable selectors. Page DOM inspection now
167
+ // goes through the editing bridge instead of same-origin iframe probing.
175
168
  if (raw.startsWith("iframe:"))
176
169
  return { selector: selectorToken };
177
170
  // Check for sidebar-only syntax: @sidebar-id-sidebar (e.g., @reviews-sidebar)
@@ -207,7 +200,6 @@ export function expandSelector(selectorShorthand) {
207
200
  return selector;
208
201
  }
209
202
  if (selector.startsWith("iframe:")) {
210
- // Iframe selector: @iframe:selector → iframe:selector (handled by GuidanceOverlay)
211
203
  return selector;
212
204
  }
213
205
  // Default: data-testid selector: @name → [data-testid="name"]
@@ -216,12 +208,7 @@ export function expandSelector(selectorShorthand) {
216
208
  function getElementsForSelector(selector) {
217
209
  const cssSelector = expandSelector(selector);
218
210
  if (cssSelector.startsWith("iframe:")) {
219
- const iframeSelector = cssSelector.substring(7);
220
- const iframe = document.querySelector("iframe.page-iframe");
221
- if (!iframe?.contentDocument) {
222
- return [];
223
- }
224
- return Array.from(iframe.contentDocument.querySelectorAll(iframeSelector));
211
+ return [];
225
212
  }
226
213
  return Array.from(document.querySelectorAll(cssSelector));
227
214
  }
@@ -302,32 +289,6 @@ async function waitForScrollToFinish(element) {
302
289
  previousRect = currentRect;
303
290
  }
304
291
  }
305
- // Wait until an element's box (position and size) stops changing. This avoids
306
- // drawing the highlight overlay mid-animation (e.g. while a sidebar panel is
307
- // still expanding from its collapsed width).
308
- async function waitForStableRect(element, timeoutMs = 1000) {
309
- let previousRect = element.getBoundingClientRect();
310
- let stableFrames = 0;
311
- const startedAt = Date.now();
312
- while (Date.now() - startedAt < timeoutMs) {
313
- await waitForNextFrame();
314
- const currentRect = element.getBoundingClientRect();
315
- const changed = Math.abs(currentRect.width - previousRect.width) > 0.5 ||
316
- Math.abs(currentRect.height - previousRect.height) > 0.5 ||
317
- Math.abs(currentRect.top - previousRect.top) > 0.5 ||
318
- Math.abs(currentRect.left - previousRect.left) > 0.5;
319
- if (changed) {
320
- stableFrames = 0;
321
- }
322
- else {
323
- stableFrames += 1;
324
- if (stableFrames >= 2) {
325
- return;
326
- }
327
- }
328
- previousRect = currentRect;
329
- }
330
- }
331
292
  async function scrollElementForHighlight(element) {
332
293
  if (shouldSkipHighlightScroll(element)) {
333
294
  return;
@@ -347,27 +308,28 @@ export async function highlightElement(selector, duration = HIGHLIGHT_DURATION_M
347
308
  const elements = getElementsForSelector(selector).filter(isElementVisible);
348
309
  if (elements.length === 0)
349
310
  return;
311
+ const overlayLifetimes = [];
350
312
  if (cssSelector.startsWith("iframe:")) {
351
313
  const iframe = document.querySelector("iframe.page-iframe");
352
314
  const iframeRect = iframe?.getBoundingClientRect();
353
315
  if (elements[0]) {
354
316
  await scrollElementForHighlight(elements[0]);
355
- await waitForStableRect(elements[0]);
356
317
  }
357
318
  elements.forEach((element) => {
358
319
  const elementRect = element.getBoundingClientRect();
359
- showHighlightOverlay(elementRect.left + (iframeRect?.left ?? 0), elementRect.top + (iframeRect?.top ?? 0), elementRect.width, elementRect.height, duration);
320
+ overlayLifetimes.push(showHighlightOverlay(elementRect.left + (iframeRect?.left ?? 0), elementRect.top + (iframeRect?.top ?? 0), elementRect.width, elementRect.height, duration));
360
321
  });
322
+ await Promise.all(overlayLifetimes);
361
323
  return;
362
324
  }
363
325
  if (elements[0]) {
364
326
  await scrollElementForHighlight(elements[0]);
365
- await waitForStableRect(elements[0]);
366
327
  }
367
328
  elements.forEach((element) => {
368
329
  const rect = element.getBoundingClientRect();
369
- showHighlightOverlay(rect.left, rect.top, rect.width, rect.height, duration);
330
+ overlayLifetimes.push(showHighlightOverlay(rect.left, rect.top, rect.width, rect.height, duration));
370
331
  });
332
+ await Promise.all(overlayLifetimes);
371
333
  }
372
334
  // Check if an element is currently present in the DOM (regardless of visibility)
373
335
  function isElementPresent(selector) {
@@ -393,7 +355,8 @@ export function deriveSelectorState(params) {
393
355
  }
394
356
  return "disabled";
395
357
  }
396
- // Create a temporary highlight overlay
358
+ // Create a temporary highlight overlay. Resolves when its finite "life"
359
+ // animation ends and the overlay has been removed (event-driven, not a timer).
397
360
  function showHighlightOverlay(x, y, width, height, duration) {
398
361
  const padding = 4;
399
362
  const viewportWidth = window.innerWidth;
@@ -410,9 +373,11 @@ function showHighlightOverlay(x, y, width, height, duration) {
410
373
  const clampedHeight = bottom - top;
411
374
  // Skip if target is fully outside the viewport after clamping.
412
375
  if (clampedWidth <= 0 || clampedHeight <= 0)
413
- return;
376
+ return Promise.resolve();
414
377
  const overlay = document.createElement("div");
415
378
  overlay.className = "selector-highlight-overlay";
379
+ // Two animations: the infinite pulse for the visual, and a finite "life"
380
+ // animation whose animationend drives removal (single source of duration).
416
381
  overlay.style.cssText = `
417
382
  position: fixed;
418
383
  left: ${left}px;
@@ -424,7 +389,7 @@ function showHighlightOverlay(x, y, width, height, duration) {
424
389
  background: color-mix(in srgb, var(--color-component-default) 10%, transparent);
425
390
  pointer-events: none;
426
391
  z-index: 999999;
427
- animation: pulse-highlight 1s ease-in-out infinite;
392
+ animation: pulse-highlight 1s ease-in-out infinite, selector-highlight-life ${duration}ms linear forwards;
428
393
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-component-default) 20%, transparent);
429
394
  `;
430
395
  // Add animation keyframes if not already added
@@ -436,22 +401,62 @@ function showHighlightOverlay(x, y, width, height, duration) {
436
401
  0%, 100% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-component-default) 20%, transparent); }
437
402
  50% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--color-component-default) 10%, transparent); }
438
403
  }
404
+ @keyframes selector-highlight-life {
405
+ from { opacity: 1; }
406
+ to { opacity: 1; }
407
+ }
439
408
  `;
440
409
  document.head.appendChild(style);
441
410
  }
442
411
  document.body.appendChild(overlay);
443
- setTimeout(() => {
444
- overlay.remove();
445
- }, duration);
412
+ return new Promise((resolve) => {
413
+ let finished = false;
414
+ const finish = () => {
415
+ if (finished)
416
+ return;
417
+ finished = true;
418
+ overlay.removeEventListener("animationend", onAnimationEnd);
419
+ overlay.remove();
420
+ resolve();
421
+ };
422
+ const onAnimationEnd = (event) => {
423
+ // Ignore the infinite pulse; only the finite life animation ends.
424
+ if (event.animationName === "selector-highlight-life") {
425
+ finish();
426
+ }
427
+ };
428
+ overlay.addEventListener("animationend", onAnimationEnd);
429
+ // Guardrail: if animationend is ever missed, remove shortly after duration.
430
+ window.setTimeout(finish, duration + 500);
431
+ });
446
432
  }
447
433
  let activeRevealController = null;
448
434
  let revealControllerSeq = 0;
435
+ // Serialize Show-me reveal clicks across ALL buttons so overlapping rapid clicks
436
+ // can never interleave. Each click chains behind the previous handler and grabs
437
+ // a monotonic token. This closes the race where, during the
438
+ // `await superseded.close()` teardown window, no global controller is registered:
439
+ // without serialization a faster later click could start, become active, and
440
+ // then be overwritten by this (older, still-awaiting) handler — i.e. NOT
441
+ // "last click wins". With the chain, a newer click waits for this one to fully
442
+ // settle (and is then properly superseded), and an older handler that has been
443
+ // overtaken while waiting discards its work via the token check.
444
+ let revealClickChain = Promise.resolve();
445
+ let revealClickSeq = 0;
446
+ // Store the new active reveal. Superseding the previous one is done explicitly
447
+ // at click start (see supersedeActiveReveal), so this only records state.
449
448
  function registerActiveReveal(controller) {
450
- const previous = activeRevealController;
451
449
  activeRevealController = controller;
452
- if (previous && previous.id !== controller.id) {
453
- previous.close();
450
+ }
451
+ // Detach and return the currently active reveal unless it belongs to exceptId.
452
+ // The caller is responsible for closing it (and awaiting its teardown).
453
+ function supersedeActiveReveal(exceptId) {
454
+ const current = activeRevealController;
455
+ if (current && current.id !== exceptId) {
456
+ activeRevealController = null;
457
+ return current;
454
458
  }
459
+ return null;
455
460
  }
456
461
  function clearActiveReveal(id) {
457
462
  if (activeRevealController?.id === id) {
@@ -465,6 +470,11 @@ function closeMorePanelsIfOpen() {
465
470
  const trigger = document.querySelector('[data-testid="more-sidebars-button"]');
466
471
  trigger?.click();
467
472
  }
473
+ function isAgentsPanelOpen() {
474
+ const trigger = document.querySelector('[data-testid="agents-panel-button"]');
475
+ return (trigger?.getAttribute("aria-pressed") === "true" ||
476
+ isElementVisibleBySelector("@sidebar-panel-agents-panel"));
477
+ }
468
478
  // Button component for "Show me" functionality with availability detection
469
479
  function SelectorButton({ selectorDef, keyProp, }) {
470
480
  const editContext = useEditContext();
@@ -521,19 +531,21 @@ function SelectorButton({ selectorDef, keyProp, }) {
521
531
  }, []);
522
532
  // Run the undo steps and reset. Used for explicit close (2nd click, auto
523
533
  // timer, or being superseded by another reveal via mutual exclusion).
524
- const runRestore = useCallback(() => {
534
+ const runRestore = useCallback(async () => {
525
535
  const reveal = revealRef.current;
536
+ // Reset button state immediately (button turns blue) while the surface
537
+ // teardown animation plays out; the returned promise resolves once settled.
538
+ clearActiveReveal(reveal?.id ?? controllerIdRef.current);
539
+ revealRef.current = null;
540
+ setIsActiveReveal(false);
526
541
  if (reveal) {
527
542
  try {
528
- reveal.restore();
543
+ await reveal.restore();
529
544
  }
530
545
  catch {
531
546
  // ignore restore failures
532
547
  }
533
548
  }
534
- clearActiveReveal(reveal?.id ?? controllerIdRef.current);
535
- revealRef.current = null;
536
- setIsActiveReveal(false);
537
549
  }, []);
538
550
  const runRestoreRef = useRef(runRestore);
539
551
  runRestoreRef.current = runRestore;
@@ -626,138 +638,249 @@ function SelectorButton({ selectorDef, keyProp, }) {
626
638
  }
627
639
  if (isDisabled)
628
640
  return;
629
- const runId = globalThis.crypto?.randomUUID?.() ??
630
- `manual-${Date.now()}-${Math.random().toString(36).slice(2)}`;
631
- const resolveElements = (selector = selectorDef.selector) => selector ? getElementsForSelector(selector) : [];
632
- const runManualAction = async (actionName, elements) => {
633
- if (!actionName || !editContext || !manualActions?.[actionName]) {
641
+ // Sequence overlapping Show-me clicks across ALL buttons so a rapid
642
+ // second click can't interleave with this one. We chain behind any
643
+ // in-flight reveal and take a monotonic token; if a newer click
644
+ // arrives while we wait our turn, this (now stale) handler bails out
645
+ // instead of overtaking it. This guarantees "last click wins" and
646
+ // closes the teardown-window race where, during
647
+ // `await superseded.close()`, no global controller is registered.
648
+ const clickToken = ++revealClickSeq;
649
+ const previousClick = revealClickChain;
650
+ let releaseClick = () => { };
651
+ revealClickChain = new Promise((resolve) => {
652
+ releaseClick = resolve;
653
+ });
654
+ try {
655
+ await previousClick;
656
+ // A newer click superseded this one while we waited our turn.
657
+ if (clickToken !== revealClickSeq) {
634
658
  return;
635
659
  }
636
- const action = manualActions[actionName];
637
- const actionProps = {
638
- editContext,
639
- selectorDef,
640
- duration: HIGHLIGHT_DURATION_MS,
641
- runId,
642
- elements,
643
- resolveElements,
660
+ // State-machine semantics: any new Show-me action supersedes the
661
+ // currently active State 3 reveal from another button, restoring
662
+ // its UI first. Await the teardown so this reveal samples fresh
663
+ // DOM and avoids a stale "was this surface open?" read. Because
664
+ // clicks are serialized above, the superseded controller is
665
+ // always the previous fully-settled reveal (no race here).
666
+ const superseded = supersedeActiveReveal(controllerIdRef.current);
667
+ if (superseded) {
668
+ try {
669
+ // Await the close so A's surface finishes its teardown
670
+ // animation before B starts revealing (event-driven, not timed).
671
+ await superseded.close();
672
+ }
673
+ catch {
674
+ // ignore supersede failures
675
+ }
676
+ }
677
+ const runId = globalThis.crypto?.randomUUID?.() ??
678
+ `manual-${Date.now()}-${Math.random().toString(36).slice(2)}`;
679
+ const resolveElements = (selector = selectorDef.selector) => selector ? getElementsForSelector(selector) : [];
680
+ const runManualAction = async (actionName, elements) => {
681
+ if (!actionName ||
682
+ !editContext ||
683
+ !manualActions?.[actionName]) {
684
+ return;
685
+ }
686
+ const action = manualActions[actionName];
687
+ const actionProps = {
688
+ editContext,
689
+ selectorDef,
690
+ duration: HIGHLIGHT_DURATION_MS,
691
+ runId,
692
+ elements,
693
+ resolveElements,
694
+ };
695
+ await action(actionProps);
644
696
  };
645
- await action(actionProps);
646
- };
647
- // Undo steps captured as we reveal, plus predicates telling whether
648
- // the revealed container is still open.
649
- const undoSteps = [];
650
- const openPredicates = [];
651
- // 1. Sidebar-only: open the sidebar.
652
- if (isSidebarOnly &&
653
- editContext?.openSidebar &&
654
- selectorDef.location) {
655
- const sidebarId = selectorDef.location;
656
- const wasOpen = !!editContext.openSidebars?.includes(sidebarId);
657
- if (!wasOpen) {
658
- editContext.openSidebar(sidebarId);
659
- undoSteps.push(() => editContextRef.current?.toggleSidebar?.(sidebarId, {
660
- forceClose: true,
661
- }));
662
- // Give the sidebar a moment to render before querying.
663
- await new Promise((resolve) => setTimeout(resolve, 150));
697
+ // Undo steps captured as we reveal, plus predicates telling
698
+ // whether the revealed container is still open.
699
+ const undoSteps = [];
700
+ const openPredicates = [];
701
+ // 1. Sidebar-only: open the sidebar.
702
+ if (isSidebarOnly &&
703
+ editContext?.openSidebar &&
704
+ selectorDef.location) {
705
+ const sidebarId = selectorDef.location;
706
+ const wasOpen = !!editContext.openSidebars?.includes(sidebarId);
707
+ if (!wasOpen) {
708
+ editContext.openSidebar(sidebarId);
709
+ undoSteps.push(async () => {
710
+ editContextRef.current?.toggleSidebar?.(sidebarId, {
711
+ forceClose: true,
712
+ });
713
+ await editContextRef.current?.waitForSurfaceSettled?.(`sidebar:${sidebarId}`);
714
+ });
715
+ // Wait for the sidebar's open animation to finish before querying.
716
+ await editContext.waitForSurfaceSettled?.(`sidebar:${sidebarId}`);
717
+ }
718
+ openPredicates.push(() => !!editContextRef.current?.openSidebars?.includes(sidebarId));
664
719
  }
665
- openPredicates.push(() => !!editContextRef.current?.openSidebars?.includes(sidebarId));
666
- }
667
- const availabilityElements = anchorSelector
668
- ? resolveElements(anchorSelector)
669
- : [];
670
- const relevantElements = !isSidebarOnly
671
- ? [...resolveElements(), ...availabilityElements]
672
- : availabilityElements;
673
- const formSlider = getEditorFormSlider(relevantElements);
674
- const shouldOpenEditorForm = !isSidebarOnly &&
675
- !!formSlider &&
676
- isEditorFormSliderHidden(formSlider);
677
- if (selectorDef.tab) {
678
- editContext?.setActiveEditorTab(selectorDef.tab);
679
- }
680
- // 2. Editor form slider.
681
- if (shouldOpenEditorForm && editContext) {
682
- const slotId = editContext.getActiveSlotId();
683
- editContext.setEditorFormHiddenForSlot(slotId, false);
684
- undoSteps.push(() => editContextRef.current?.setEditorFormHiddenForSlot(slotId, true));
685
- openPredicates.push(() => !isEditorFormSliderHidden(getEditorFormSlider()));
686
- await waitForEditorFormSliderOpen(formSlider);
687
- }
688
- else if (selectorDef.tab) {
689
- await waitForNextFrame();
690
- }
691
- // 3. beforeAction (may open the More-panels flyout, reveal fields, etc.).
692
- const resolvedElements = !isSidebarOnly
693
- ? await waitForResolvedElements(resolveElements, selectorDef.selector)
694
- : [];
695
- const actionElements = resolvedElements.length > 0
696
- ? resolvedElements
697
- : availabilityElements;
698
- const morePanelsWasOpen = isElementPresent("@more-sidebars-panel");
699
- await runManualAction(selectorDef.beforeAction, actionElements);
700
- if (selectorDef.beforeAction === "open-more-sidebars") {
701
- const morePanelsNowOpen = isElementPresent("@more-sidebars-panel");
702
- if (!morePanelsWasOpen && morePanelsNowOpen) {
703
- undoSteps.push(() => closeMorePanelsIfOpen());
704
- openPredicates.push(() => isElementPresent("@more-sidebars-panel"));
720
+ const availabilityElements = anchorSelector
721
+ ? resolveElements(anchorSelector)
722
+ : [];
723
+ const relevantElements = !isSidebarOnly
724
+ ? [...resolveElements(), ...availabilityElements]
725
+ : availabilityElements;
726
+ const formSlider = getEditorFormSlider(relevantElements);
727
+ const shouldOpenEditorForm = !isSidebarOnly &&
728
+ !!formSlider &&
729
+ isEditorFormSliderHidden(formSlider);
730
+ if (selectorDef.tab) {
731
+ editContext?.setActiveEditorTab(selectorDef.tab);
705
732
  }
706
- }
707
- // afterAction is the declared inverse for custom reveals (e.g. field actions).
708
- if (selectorDef.afterAction) {
709
- undoSteps.push(() => {
710
- void runManualAction(selectorDef.afterAction, !isSidebarOnly ? resolveElements() : availabilityElements);
711
- });
712
- }
713
- // Highlight the target. For sidebar-only selectors there is no inner
714
- // target, so we highlight the opened sidebar panel itself. Wait for
715
- // it to become visible first, since a just-revealed element may be
716
- // present but not yet laid out (highlightElement skips invisible ones).
717
- const highlightSelector = isSidebarOnly
718
- ? selectorDef.location
719
- ? `@sidebar-panel-${selectorDef.location}`
720
- : ""
721
- : selectorDef.selector;
722
- if (highlightSelector) {
723
- const highlightTargets = await waitForVisibleElements(highlightSelector, 1500);
724
- if (highlightTargets.length > 0) {
725
- await highlightElement(highlightSelector, HIGHLIGHT_DURATION_MS);
733
+ // 2. Editor form slider.
734
+ if (shouldOpenEditorForm && editContext) {
735
+ const slotId = editContext.getActiveSlotId();
736
+ editContext.setEditorFormHiddenForSlot(slotId, false);
737
+ undoSteps.push(async () => {
738
+ editContextRef.current?.setEditorFormHiddenForSlot(slotId, true);
739
+ await editContextRef.current?.waitForSurfaceSettled?.("editor-form");
740
+ });
741
+ openPredicates.push(() => !isEditorFormSliderHidden(getEditorFormSlider()));
742
+ await editContext.waitForSurfaceSettled?.("editor-form");
726
743
  }
727
- }
728
- // If we opened/undid anything, this was a State-3 reveal: keep the
729
- // button active (green) and register it for mutual exclusion.
730
- if (undoSteps.length > 0) {
731
- const id = ++revealControllerSeq;
732
- controllerIdRef.current = id;
733
- revealRef.current = {
734
- id,
735
- restore: () => {
736
- for (let i = undoSteps.length - 1; i >= 0; i -= 1) {
737
- try {
738
- undoSteps[i]?.();
744
+ else if (selectorDef.tab) {
745
+ await waitForNextFrame();
746
+ }
747
+ // 3. beforeAction (may open the More-panels flyout, reveal fields, etc.).
748
+ const resolvedElements = !isSidebarOnly
749
+ ? await waitForResolvedElements(resolveElements, selectorDef.selector)
750
+ : [];
751
+ const actionElements = resolvedElements.length > 0
752
+ ? resolvedElements
753
+ : availabilityElements;
754
+ const morePanelsWasOpen = isElementPresent("@more-sidebars-panel");
755
+ // Capture pre-reveal state for the AI Assistant reveals so we only
756
+ // restore (close) what THIS button actually opened.
757
+ const agentsPanelWasOpen = isAgentsPanelOpen();
758
+ const agentSettingsWasOpen = !!selectorDef.selector &&
759
+ isElementPresent(selectorDef.selector) &&
760
+ selectorDef.beforeAction === "open-agent-settings";
761
+ await runManualAction(selectorDef.beforeAction, actionElements);
762
+ if (selectorDef.beforeAction === "open-more-sidebars") {
763
+ const morePanelsNowOpen = isElementPresent("@more-sidebars-panel");
764
+ if (!morePanelsWasOpen && morePanelsNowOpen) {
765
+ undoSteps.push(async () => {
766
+ closeMorePanelsIfOpen();
767
+ await waitForSelectorAnimations('[data-testid="more-sidebars-panel"]');
768
+ });
769
+ openPredicates.push(() => isElementPresent("@more-sidebars-panel"));
770
+ }
771
+ }
772
+ if (selectorDef.beforeAction === "open-agents-panel" ||
773
+ selectorDef.beforeAction === "open-agent-settings") {
774
+ // The beforeAction already awaited the panel/popover open
775
+ // animation (see config openAgentsPanel/openAgentSettings), so
776
+ // no polling here.
777
+ const agentsPanelNowOpen = isAgentsPanelOpen();
778
+ // Push the panel-close undo first so that, since undo steps run
779
+ // in reverse, the settings popover is closed before the panel.
780
+ if (!agentsPanelWasOpen && agentsPanelNowOpen) {
781
+ undoSteps.push(async () => {
782
+ if (editContextRef.current?.isMobile) {
783
+ editContextRef.current?.toggleSidebar?.("agents-panel", {
784
+ forceClose: true,
785
+ });
786
+ await editContextRef.current?.waitForSurfaceSettled?.("sidebar:agents-panel");
739
787
  }
740
- catch {
741
- // ignore individual undo failures
788
+ else {
789
+ editContextRef.current?.setShowAgentsPanel?.(false);
790
+ await editContextRef.current?.waitForSurfaceSettled?.("agents-panel");
742
791
  }
792
+ });
793
+ openPredicates.push(() => isAgentsPanelOpen());
794
+ }
795
+ if (selectorDef.beforeAction === "open-agent-settings") {
796
+ const settingsTargetNowOpen = !!selectorDef.selector &&
797
+ isElementPresent(selectorDef.selector);
798
+ if (!agentSettingsWasOpen && settingsTargetNowOpen) {
799
+ undoSteps.push(async () => {
800
+ const trigger = document.querySelector('[data-testid="agent-settings-popover-trigger"]');
801
+ if (trigger &&
802
+ selectorDef.selector &&
803
+ isElementPresent(selectorDef.selector)) {
804
+ trigger.click();
805
+ await waitForSelectorAnimations('[data-testid="agent-settings-popover-content"]');
806
+ }
807
+ });
808
+ openPredicates.push(() => selectorDef.selector
809
+ ? isElementPresent(selectorDef.selector)
810
+ : false);
743
811
  }
744
- },
745
- isStillOpen: () => openPredicates.length === 0
746
- ? true
747
- : openPredicates.some((predicate) => predicate()),
748
- };
749
- registerActiveReveal({
750
- id,
751
- close: () => runRestoreRef.current(),
752
- });
753
- setIsActiveReveal(true);
754
- if (closeMode === "auto") {
755
- window.setTimeout(() => {
756
- if (controllerIdRef.current === id) {
757
- runRestoreRef.current();
758
- }
759
- }, HIGHLIGHT_DURATION_MS);
812
+ }
813
+ }
814
+ // afterAction is the declared inverse for custom reveals (e.g. field actions).
815
+ if (selectorDef.afterAction) {
816
+ undoSteps.push(async () => {
817
+ await runManualAction(selectorDef.afterAction, !isSidebarOnly ? resolveElements() : availabilityElements);
818
+ });
760
819
  }
820
+ // Highlight the target. For sidebar-only selectors there is no
821
+ // inner target, so we highlight the opened sidebar panel itself.
822
+ // Wait for it to become visible first, since a just-revealed
823
+ // element may be present but not yet laid out (highlightElement
824
+ // skips invisible ones).
825
+ const highlightSelector = isSidebarOnly
826
+ ? selectorDef.location
827
+ ? `@sidebar-panel-${selectorDef.location}`
828
+ : ""
829
+ : selectorDef.selector;
830
+ // The highlight runs a finite CSS animation; highlightElement
831
+ // resolves on its animationend. We do NOT await it before
832
+ // registering the reveal (the button must turn green immediately);
833
+ // close=auto instead chains its restore onto this lifetime.
834
+ let highlightLifetime = Promise.resolve();
835
+ if (highlightSelector) {
836
+ const highlightTargets = await waitForVisibleElements(highlightSelector, 1500);
837
+ if (highlightTargets.length > 0) {
838
+ highlightLifetime = highlightElement(highlightSelector, HIGHLIGHT_DURATION_MS);
839
+ }
840
+ }
841
+ // If we opened/undid anything, this was a State-3 reveal: keep the
842
+ // button active (green) and register it for mutual exclusion.
843
+ if (undoSteps.length > 0) {
844
+ const id = ++revealControllerSeq;
845
+ controllerIdRef.current = id;
846
+ revealRef.current = {
847
+ id,
848
+ restore: async () => {
849
+ for (let i = undoSteps.length - 1; i >= 0; i -= 1) {
850
+ try {
851
+ await undoSteps[i]?.();
852
+ }
853
+ catch {
854
+ // ignore individual undo failures
855
+ }
856
+ }
857
+ },
858
+ isStillOpen: () => openPredicates.length === 0
859
+ ? true
860
+ : openPredicates.some((predicate) => predicate()),
861
+ };
862
+ registerActiveReveal({
863
+ id,
864
+ close: () => runRestoreRef.current(),
865
+ isStillOpen: () => revealRef.current?.isStillOpen() ?? false,
866
+ });
867
+ setIsActiveReveal(true);
868
+ if (closeMode === "auto") {
869
+ // Restore right after the highlight animation completes,
870
+ // instead of racing a duration-matched timer.
871
+ void highlightLifetime.then(() => {
872
+ if (controllerIdRef.current === id) {
873
+ void runRestoreRef.current();
874
+ }
875
+ });
876
+ }
877
+ }
878
+ }
879
+ finally {
880
+ // Release our slot so the next queued click can proceed (and then
881
+ // properly supersede us). Runs even if the reveal threw, so the
882
+ // click chain can never deadlock.
883
+ releaseClick();
761
884
  }
762
885
  }, disabled: isDisabled && !isActiveReveal, className: cn("inline-flex h-5 w-5 items-center justify-center rounded border transition-colors", isActiveReveal
763
886
  ? "border-feedback-green bg-feedback-green-light text-feedback-green hover:bg-feedback-green-light cursor-pointer"
@@ -806,10 +929,10 @@ function renderLineWithSelectors(text, uiSelectors, manualLinkTargets, onManualL
806
929
  function renderInlineSelectorsAndFormatting(text, uiSelectors) {
807
930
  const parts = [];
808
931
  let lastIndex = 0;
809
- // Combined regex for {{namedSelector}}, @selector, and **bold**
810
- // Note: @selector can include -sidebar suffix for sidebar-only selectors
811
- // Also supports @iframe:selector syntax (iframe: is special and allowed)
812
- // Now also matches optional parentheses around selectors: ({{name}}) or (@selector)
932
+ // Combined regex for {{namedSelector}}, @selector, and **bold**.
933
+ // @selector can include -sidebar suffix for sidebar-only selectors.
934
+ // The matcher keeps legacy @iframe: tokens parseable, but they are unavailable.
935
+ // Also matches optional parentheses around selectors: ({{name}}) or (@selector).
813
936
  const regex = /(\()?(\{\{([\w\-]+)\}\})|(\()?(@(?:iframe:[\w\-\.#\[\]=]*[\w\-#\[\]=]|[\w\-\.#\[\]=]*[\w\-#\[\]=]))|(\*\*(.+?)\*\*)/g;
814
937
  let match;
815
938
  while ((match = regex.exec(text)) !== null) {