@parhelia/core 0.1.12877 → 0.1.12880

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 (290) hide show
  1. package/dist/components/ui/card.d.ts +1 -3
  2. package/dist/components/ui/card.js +2 -2
  3. package/dist/components/ui/card.js.map +1 -1
  4. package/dist/components/ui/context-menu.js +2 -2
  5. package/dist/config/config.js +6 -23
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/config/types.d.ts +7 -0
  8. package/dist/config/types.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.d.ts +1 -0
  10. package/dist/editor/FieldActionsOverlay.js +45 -1
  11. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  12. package/dist/editor/FieldListField.d.ts +1 -1
  13. package/dist/editor/FieldListField.js +18 -20
  14. package/dist/editor/FieldListField.js.map +1 -1
  15. package/dist/editor/ImageEditor.d.ts +1 -6
  16. package/dist/editor/ImageEditor.js +3 -19
  17. package/dist/editor/ImageEditor.js.map +1 -1
  18. package/dist/editor/PictureEditor.d.ts +1 -2
  19. package/dist/editor/PictureEditor.js +14 -5
  20. package/dist/editor/PictureEditor.js.map +1 -1
  21. package/dist/editor/ai/Agents.js +2 -2
  22. package/dist/editor/ai/Agents.js.map +1 -1
  23. package/dist/editor/ai/GuidanceOverlay.js +11 -1
  24. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  25. package/dist/editor/ai/InlineAiDialog.js +11 -22
  26. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  27. package/dist/editor/ai/InlineAiTrigger.js +57 -17
  28. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  29. package/dist/editor/ai/dialogs/capturePageDom.js +36 -66
  30. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  31. package/dist/editor/ai/dialogs/capturePageScreenshot.js +162 -281
  32. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  33. package/dist/editor/ai/terminal/agentSessionState.d.ts +0 -3
  34. package/dist/editor/ai/terminal/agentSessionState.js +1 -3
  35. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  36. package/dist/editor/ai/terminal/agentStartRequest.d.ts +1 -2
  37. package/dist/editor/ai/terminal/agentStartRequest.js +1 -2
  38. package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
  39. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
  40. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  41. package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +0 -7
  42. package/dist/editor/ai/terminal/components/AgentDocumentList.js +13 -55
  43. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  44. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +1 -3
  45. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +14 -22
  46. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  47. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  48. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  49. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  50. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  51. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  52. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  53. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +1 -2
  54. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +11 -8
  55. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  56. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +4 -1
  57. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +13 -29
  58. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  59. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  60. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  61. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +1 -2
  62. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +4 -2
  63. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  64. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  65. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  66. package/dist/editor/ai/terminal/components/AgentTerminalView.js +2 -13
  67. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  68. package/dist/editor/ai/terminal/components/AiResponseMessage.js +14 -16
  69. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  70. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +26 -37
  71. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  72. package/dist/editor/ai/terminal/components/UserMessage.d.ts +1 -2
  73. package/dist/editor/ai/terminal/components/UserMessage.js +8 -130
  74. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  75. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  76. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  77. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +0 -1
  78. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +1 -3
  79. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +3 -9
  80. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  81. package/dist/editor/ai/terminal/useAgentTerminalController.js +0 -7
  82. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  83. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  84. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  85. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +1 -3
  86. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  87. package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
  88. package/dist/editor/ai/useInlineAiPosition.js +52 -22
  89. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  90. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +62 -30
  91. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  92. package/dist/editor/client/EditorShell.d.ts +1 -5
  93. package/dist/editor/client/EditorShell.js +126 -286
  94. package/dist/editor/client/EditorShell.js.map +1 -1
  95. package/dist/editor/client/editContext.d.ts +5 -37
  96. package/dist/editor/client/editContext.js.map +1 -1
  97. package/dist/editor/client/hooks/useSocketMessageHandler.js +17 -14
  98. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  99. package/dist/editor/client/itemsRepository.d.ts +0 -2
  100. package/dist/editor/client/itemsRepository.js +8 -15
  101. package/dist/editor/client/itemsRepository.js.map +1 -1
  102. package/dist/editor/client/operations.d.ts +1 -1
  103. package/dist/editor/client/operations.js +17 -41
  104. package/dist/editor/client/operations.js.map +1 -1
  105. package/dist/editor/client/pageModelBuilder.js +7 -24
  106. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  107. package/dist/editor/field-types/MultiLineText.js +3 -10
  108. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  109. package/dist/editor/field-types/RawEditor.js +1 -8
  110. package/dist/editor/field-types/RawEditor.js.map +1 -1
  111. package/dist/editor/field-types/RichTextEditorComponent.js +45 -156
  112. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  113. package/dist/editor/field-types/SingleLineText.js +3 -10
  114. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  115. package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -8
  116. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  117. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
  118. package/dist/editor/field-types/richtext/contextMenuFactory.js +303 -100
  119. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  120. package/dist/editor/field-types/richtext/types.d.ts +0 -2
  121. package/dist/editor/field-types/richtext/types.js.map +1 -1
  122. package/dist/editor/media-selector/TreeSelector.js +15 -15
  123. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  124. package/dist/editor/menubar/PageSelector.js +2 -8
  125. package/dist/editor/menubar/PageSelector.js.map +1 -1
  126. package/dist/editor/menubar/VersionPreviewCard.js +249 -4
  127. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  128. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  129. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  130. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -0
  131. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +462 -63
  132. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  133. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  134. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +2 -5
  135. package/dist/editor/page-editor-chrome/CommentHighlightings.js +215 -340
  136. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  137. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +1 -5
  138. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +4 -11
  139. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  140. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +13 -21
  141. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  142. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +29 -23
  143. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  144. package/dist/editor/page-editor-chrome/FrameMenu.js +19 -110
  145. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  146. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +7 -0
  147. package/dist/editor/page-editor-chrome/InlineEditor.js +1719 -0
  148. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
  149. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +2 -3
  150. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +45 -148
  151. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  152. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +0 -2
  153. package/dist/editor/page-editor-chrome/PageEditorChrome.js +21 -25
  154. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  155. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +128 -163
  156. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  157. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  158. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +3 -6
  159. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  160. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +2 -1
  161. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +146 -83
  162. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  163. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +2 -5
  164. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +63 -144
  165. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  166. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +2 -1
  167. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -101
  168. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  169. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +1 -10
  170. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +122 -105
  171. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  172. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +4 -11
  173. package/dist/editor/page-editor-chrome/overlay/geometry.js +36 -139
  174. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  175. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +2 -0
  176. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +21 -0
  177. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +1 -0
  178. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
  179. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +758 -0
  180. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
  181. package/dist/editor/page-viewer/EditorForm.js +1 -17
  182. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  183. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  184. package/dist/editor/page-viewer/MiniMap.js +364 -176
  185. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  186. package/dist/editor/page-viewer/PageViewer.js +13 -40
  187. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  188. package/dist/editor/page-viewer/PageViewerFrame.d.ts +5 -0
  189. package/dist/editor/page-viewer/PageViewerFrame.js +1513 -1529
  190. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  191. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
  192. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +796 -0
  193. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
  194. package/dist/editor/page-viewer/pageViewContext.d.ts +0 -32
  195. package/dist/editor/page-viewer/pageViewContext.js +6 -37
  196. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  197. package/dist/editor/reviews/Comment.d.ts +1 -2
  198. package/dist/editor/reviews/Comment.js +4 -9
  199. package/dist/editor/reviews/Comment.js.map +1 -1
  200. package/dist/editor/reviews/CommentEditor.js +1 -1
  201. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  202. package/dist/editor/reviews/CommentPopover.js +9 -68
  203. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  204. package/dist/editor/reviews/CommentView.js +4 -24
  205. package/dist/editor/reviews/CommentView.js.map +1 -1
  206. package/dist/editor/reviews/Comments.d.ts +2 -0
  207. package/dist/editor/reviews/Comments.js +30 -29
  208. package/dist/editor/reviews/Comments.js.map +1 -1
  209. package/dist/editor/reviews/FeedbackCard.d.ts +2 -4
  210. package/dist/editor/reviews/FeedbackCard.js +5 -5
  211. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  212. package/dist/editor/reviews/SuggestedEdit.js +6 -4
  213. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  214. package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -3
  215. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  216. package/dist/editor/reviews/feedbackSelection.js +4 -32
  217. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  218. package/dist/editor/services/agentService.d.ts +0 -14
  219. package/dist/editor/services/agentService.js +1 -11
  220. package/dist/editor/services/agentService.js.map +1 -1
  221. package/dist/editor/services/reviewsService.d.ts +2 -2
  222. package/dist/editor/services/reviewsService.js.map +1 -1
  223. package/dist/editor/settings/SettingsView.js +2 -2
  224. package/dist/editor/settings/SettingsView.js.map +1 -1
  225. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  226. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  227. package/dist/editor/settings/panels/ProvidersPanel.js +3 -2
  228. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  229. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  230. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  231. package/dist/editor/sidebar/Workbox.js +1 -1
  232. package/dist/editor/sidebar/Workbox.js.map +1 -1
  233. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  234. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  235. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  236. package/dist/editor/ui/SimpleIconButton.js +1 -1
  237. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  238. package/dist/editor/utils.d.ts +17 -1
  239. package/dist/editor/utils.js +143 -0
  240. package/dist/editor/utils.js.map +1 -1
  241. package/dist/editor/version-diff/versionDiffTargets.d.ts +8 -3
  242. package/dist/editor/version-diff/versionDiffTargets.js +94 -37
  243. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  244. package/dist/revision.d.ts +2 -2
  245. package/dist/revision.js +2 -2
  246. package/dist/splash-screen/DialogWrappers.js +2 -2
  247. package/dist/splash-screen/DialogWrappers.js.map +1 -1
  248. package/dist/splash-screen/ModernSplashScreen.js +3 -11
  249. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  250. package/dist/splash-screen/NewPage.js +5 -7
  251. package/dist/splash-screen/NewPage.js.map +1 -1
  252. package/dist/splash-screen/OpenPage.js +3 -5
  253. package/dist/splash-screen/OpenPage.js.map +1 -1
  254. package/dist/splash-screen/RecentPages.js +3 -3
  255. package/dist/splash-screen/RecentPages.js.map +1 -1
  256. package/package.json +1 -2
  257. package/styles.css +0 -49
  258. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
  259. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
  260. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
  261. package/dist/editor/bridge/BridgeClient.d.ts +0 -80
  262. package/dist/editor/bridge/BridgeClient.js +0 -416
  263. package/dist/editor/bridge/BridgeClient.js.map +0 -1
  264. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +0 -13
  265. package/dist/editor/field-types/useFormFieldCaretPresence.js +0 -92
  266. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +0 -1
  267. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +0 -6
  268. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +0 -123
  269. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +0 -1
  270. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +0 -26
  271. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +0 -222
  272. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +0 -1
  273. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +0 -20
  274. package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -33
  275. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +0 -1
  276. package/dist/editor/reviews/commentTransientSelection.d.ts +0 -23
  277. package/dist/editor/reviews/commentTransientSelection.js +0 -7
  278. package/dist/editor/reviews/commentTransientSelection.js.map +0 -1
  279. package/dist/editor/reviews/feedbackOrdering.d.ts +0 -5
  280. package/dist/editor/reviews/feedbackOrdering.js +0 -27
  281. package/dist/editor/reviews/feedbackOrdering.js.map +0 -1
  282. package/dist/editor/reviews/suggestedEditState.d.ts +0 -12
  283. package/dist/editor/reviews/suggestedEditState.js +0 -90
  284. package/dist/editor/reviews/suggestedEditState.js.map +0 -1
  285. package/dist/editor/reviews/suggestionDisplayValue.d.ts +0 -43
  286. package/dist/editor/reviews/suggestionDisplayValue.js +0 -93
  287. package/dist/editor/reviews/suggestionDisplayValue.js.map +0 -1
  288. package/dist/editor/sidebar/BridgeDiagnostics.d.ts +0 -1
  289. package/dist/editor/sidebar/BridgeDiagnostics.js +0 -41
  290. package/dist/editor/sidebar/BridgeDiagnostics.js.map +0 -1
@@ -46,7 +46,6 @@ import { QuickItemSwitcher } from "../QuickItemSwitcher";
46
46
  import { useEditorSlotContext, } from "../views/editorSlotContext";
47
47
  import { getComments, getAvailableCommentTags, } from "../services/reviewsService";
48
48
  import { useReviews } from "../reviews/useReviews";
49
- import { COMMENT_TRANSIENT_ELEMENT_KEY, COMMENT_TRANSIENT_SELECTION_RECT, } from "../reviews/commentTransientSelection";
50
49
  import uuid from "react-uuid";
51
50
  import { flushSync } from "react-dom";
52
51
  import { getSuggestedEdits } from "../services/suggestedEditsService";
@@ -68,24 +67,6 @@ import { FeatureGate, LicenseFeatures, LicenseProvider, LicenseOverlay, } from "
68
67
  // nothing open" (param present with this value) so reload can honor the user's intent.
69
68
  const SIDEBAR_NONE_SENTINEL = "none";
70
69
  const sidebarUrlValue = (ids) => ids.length ? ids.join(",") : SIDEBAR_NONE_SENTINEL;
71
- // moved to hooks/useQuota
72
- function isUsableTextSelectionRange(range) {
73
- return !!(range &&
74
- range.text?.trim() &&
75
- typeof range.startOffset === "number" &&
76
- typeof range.endOffset === "number" &&
77
- range.startOffset !== range.endOffset &&
78
- range.fieldId &&
79
- range.itemId);
80
- }
81
- function selectionRangeMatchesField(range, field) {
82
- if (!range || !field)
83
- return false;
84
- return (cleanId(range.fieldId) === cleanId(field.fieldId) &&
85
- cleanId(range.itemId) === cleanId(field.item.id) &&
86
- (!range.language || range.language === field.item.language) &&
87
- (typeof range.version !== "number" || range.version === field.item.version));
88
- }
89
70
  function reconcileSlotSettingsState(previous, slots, defaults) {
90
71
  const next = {};
91
72
  let changed = false;
@@ -153,10 +134,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
153
134
  const [focusedField, setFocusedField] = useState();
154
135
  const focusedFieldRef = useRef(undefined);
155
136
  const [selectedRange, setSelectedRange] = useState();
156
- const lastTextSelectionRangeRef = useRef(undefined);
157
137
  const [validating, setValidating] = useState(false);
158
138
  const [inserting, setInserting] = useState();
159
- const insertingSequenceRef = useRef(0);
160
139
  const [showFullscreenHint, setShowFullscreenHint] = useState(false);
161
140
  // Fullscreen is a shell-level UI mode. Keep it in EditorShell state so the shell can rerender
162
141
  // immediately when toggled, while still syncing the active slot's PageViewContext.fullscreen.
@@ -174,7 +153,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
174
153
  const [activeFieldActions, setActiveFieldActions] = useState([]);
175
154
  const fieldEditorPopupRef = React.useRef(null);
176
155
  const [validationResult, setValidationResult] = useState();
177
- const [bridgeDiagnostics, setBridgeDiagnostics] = useState(undefined);
178
156
  const [editHistory, setEditHistory] = useState([]);
179
157
  const [historyMode, setHistoryMode] = useState("global");
180
158
  const [showOnlyMyChanges, setShowOnlyMyChanges] = useState(true);
@@ -487,6 +465,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
487
465
  // The very first URL sync after initial load should replaceState (not pushState)
488
466
  // so the initial bare URL isn't left as a dead-end history entry.
489
467
  const isFirstUrlSyncRef = useRef(true);
468
+ const [inlineEditingFieldElement, setInlineEditingFieldElement] = useState();
490
469
  const [lockedField, setLockedField] = useState();
491
470
  const [itemLanguages, setItemLanguages] = useState([]);
492
471
  const [itemVersions, setItemVersions] = useState([]);
@@ -576,67 +555,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
576
555
  const [isTourActive, setIsTourActive] = useState(tourRestoredFromUrl);
577
556
  // Track if tour was restored from URL to skip prepareAction on initial render
578
557
  const tourRestoredRef = useRef(tourRestoredFromUrl);
579
- const [mode, setModeState] = useState("edit");
580
- const modeRef = useRef("edit");
581
- modeRef.current = mode;
582
- const modeChangeParticipantsRef = useRef(new Set());
583
- const loadSuggestedEditsRef = useRef(async () => { });
584
- const [modeTransitionRevision, setModeTransitionRevision] = useState(0);
558
+ const [mode, setMode] = useState("edit");
585
559
  const [previewDate, setPreviewDate] = useState();
586
560
  const [layoutMode, setLayoutMode] = useState("final");
587
- const registerModeChangeParticipant = useCallback((participant) => {
588
- modeChangeParticipantsRef.current.add(participant);
589
- return () => {
590
- modeChangeParticipantsRef.current.delete(participant);
591
- };
592
- }, []);
593
- const changeMode = useCallback(async (nextMode, options) => {
594
- const previousMode = modeRef.current;
595
- if (nextMode === previousMode)
596
- return;
597
- const participants = Array.from(modeChangeParticipantsRef.current);
598
- for (const participant of participants) {
599
- await participant.beforeModeChange?.(nextMode, previousMode, options);
600
- }
601
- for (const participant of participants) {
602
- participant.clearInlineDedupe?.(nextMode, previousMode, options);
603
- }
604
- flushSync(() => {
605
- modeRef.current = nextMode;
606
- setModeState(nextMode);
607
- setModeTransitionRevision((revision) => revision + 1);
608
- if (nextMode !== "preview") {
609
- setPreviewDate(undefined);
610
- }
611
- if (nextMode === "suggestions") {
612
- setShowSuggestedEdits(true);
613
- setWorkspaceId("editor");
614
- setOpenSidebars((prev) => {
615
- if (prev.includes("feedback"))
616
- return prev;
617
- const next = [...prev, "feedback"];
618
- openSidebarsRef.current = next;
619
- return next;
620
- });
621
- }
622
- else {
623
- setShowSuggestedEdits(false);
624
- }
625
- });
626
- if (nextMode === "suggestions") {
627
- void loadSuggestedEditsRef.current();
628
- }
629
- }, []);
630
- const setMode = useCallback((nextMode) => {
631
- const resolvedMode = typeof nextMode === "function" ? nextMode(modeRef.current) : nextMode;
632
- void changeMode(resolvedMode);
633
- }, [changeMode]);
634
- const workspaceShowsModeControls = !!configuration.editor.workspaces?.find((workspace) => workspace.id === workspaceId)?.toolbarFactory;
635
- useEffect(() => {
636
- if (workspaceShowsModeControls || mode !== "suggestions")
637
- return;
638
- void changeMode("edit", { reason: "mode-controls-hidden" });
639
- }, [changeMode, mode, workspaceId, workspaceShowsModeControls]);
640
561
  useEffect(() => {
641
562
  if (mode !== "preview") {
642
563
  setPreviewDate(undefined);
@@ -742,6 +663,19 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
742
663
  setSelectedHelpSectionId(helpParam === "contents" || helpParam === "true" ? null : helpParam);
743
664
  }
744
665
  }, [searchParams, isInitialLoad]);
666
+ useEffect(() => {
667
+ if (mode === "suggestions") {
668
+ // Ensure we're in the editor workspace and open the feedback sidebar
669
+ setWorkspaceId("editor");
670
+ // Open the feedback sidebar if not already open
671
+ setOpenSidebars((prev) => {
672
+ if (!prev.includes("comments")) {
673
+ return [...prev, "comments"];
674
+ }
675
+ return prev;
676
+ });
677
+ }
678
+ }, [mode]);
745
679
  useEffect(() => {
746
680
  if (focusedField &&
747
681
  selection.length > 0 &&
@@ -751,19 +685,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
751
685
  }, [selection]);
752
686
  useEffect(() => {
753
687
  focusedFieldRef.current = focusedField;
754
- const lastTextSelection = lastTextSelectionRangeRef.current;
755
- if (focusedField &&
756
- lastTextSelection &&
757
- (focusedField.fieldId !== lastTextSelection.fieldId ||
758
- focusedField.item.id !== lastTextSelection.itemId)) {
759
- lastTextSelectionRangeRef.current = undefined;
760
- }
761
688
  }, [focusedField]);
762
- useEffect(() => {
763
- if (isUsableTextSelectionRange(selectedRange)) {
764
- lastTextSelectionRangeRef.current = selectedRange;
765
- }
766
- }, [selectedRange]);
767
689
  // Track the current page item descriptor for itemsRepository
768
690
  const [currentPageItem, setCurrentPageItem] = useState();
769
691
  // Create itemsRepository with current page item (will be updated when page loads)
@@ -1294,8 +1216,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1294
1216
  const toggleHelpTerminal = useCallback((options) => {
1295
1217
  const isCurrentlyOpen = showHelpTerminal;
1296
1218
  const requestedTab = options?.activeTab;
1297
- if (isCurrentlyOpen &&
1298
- (!requestedTab || requestedTab === helpTerminalActiveTab)) {
1219
+ if (isCurrentlyOpen && (!requestedTab || requestedTab === helpTerminalActiveTab)) {
1299
1220
  // Close when toggling the currently active help view.
1300
1221
  handleSetShowHelpTerminal(false);
1301
1222
  }
@@ -1498,7 +1419,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1498
1419
  }
1499
1420
  // Handle mode changes — always set to avoid stale-closure mismatch
1500
1421
  const urlMode = urlParams.get("mode");
1501
- setMode(urlMode ?? "edit");
1422
+ if (urlMode) {
1423
+ setMode(urlMode);
1424
+ }
1502
1425
  // Handle fullscreen changes (shell-level state)
1503
1426
  const isFullscreen = urlParams.get("fullscreen") === "true";
1504
1427
  if (configuration.forceFullscreen) {
@@ -1775,9 +1698,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1775
1698
  const edits = result.data || [];
1776
1699
  setSuggestedEdits(edits);
1777
1700
  }, [item, searchParams]);
1778
- useEffect(() => {
1779
- loadSuggestedEditsRef.current = loadSuggestedEdits;
1780
- }, [loadSuggestedEdits]);
1781
1701
  const loadFavorites = useCallback(async () => {
1782
1702
  try {
1783
1703
  const result = await getAllFavorites();
@@ -1790,9 +1710,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1790
1710
  setFavorites([]);
1791
1711
  }
1792
1712
  }, []);
1793
- const refreshFavorites = useCallback(async (opts) => {
1794
- await loadFavorites();
1795
- }, [loadFavorites]);
1796
1713
  const page = activePageViewContext.page;
1797
1714
  const currentHistoryScope = useMemo(() => {
1798
1715
  const currentItem = item?.descriptor;
@@ -2189,9 +2106,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
2189
2106
  globalThis.editorRefreshTimer = undefined;
2190
2107
  };
2191
2108
  if (mode === "immediate") {
2192
- if (refreshTimer) {
2193
- clearTimeout(refreshTimer);
2194
- }
2195
2109
  doRefresh();
2196
2110
  return;
2197
2111
  }
@@ -2385,7 +2299,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
2385
2299
  else {
2386
2300
  current.set("compare", "true");
2387
2301
  }
2388
- current.set("mode", workspaceShowsModeControls ? mode : "edit");
2302
+ current.set("mode", mode);
2389
2303
  // Handle fullscreen parameter
2390
2304
  if (fullscreen) {
2391
2305
  current.set("fullscreen", "true");
@@ -3090,35 +3004,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3090
3004
  };
3091
3005
  }, [promptSessionReconnect]);
3092
3006
  const sendSocketMessage = useCallback((message) => {
3093
- if (message.type === "caret-position" &&
3094
- message.payload?.source === "form-field") {
3095
- const payload = message.payload;
3096
- setRemoteCarets((current) => {
3097
- if (payload.offset == null) {
3098
- if (!current[sessionId])
3099
- return current;
3100
- const next = { ...current };
3101
- delete next[sessionId];
3102
- return next;
3103
- }
3104
- if (!payload.fieldId || !payload.item) {
3105
- return current;
3106
- }
3107
- return {
3108
- ...current,
3109
- [sessionId]: {
3110
- sessionId,
3111
- fieldId: payload.fieldId,
3112
- item: payload.item,
3113
- offset: payload.offset,
3114
- value: payload.value,
3115
- },
3116
- };
3117
- });
3118
- }
3119
3007
  // Routes over whichever transport is active (WebSocket preferred, SSE fallback).
3120
3008
  getEditorRealtime().send(message);
3121
- }, [sessionId]);
3009
+ }, []);
3122
3010
  // URL update helper - defined early so it can be used by workspace/sidebar functions
3123
3011
  const updateUrl = useCallback((params) => {
3124
3012
  // Use the actual browser pathname (including any basePath like /parhelia)
@@ -3596,51 +3484,34 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3596
3484
  operationsContext.context.markOperationComplete;
3597
3485
  }, [operationsContext.context.markOperationComplete]);
3598
3486
  // Replace selected text with new content (for inline AI editing)
3599
- const replaceSelectedText = useCallback(async (newText, selectionOverride) => {
3600
- const rangeToReplace = selectionOverride ?? selectedRange ?? lastTextSelectionRangeRef.current;
3487
+ const replaceSelectedText = useCallback(async (newText) => {
3488
+ if (!focusedField)
3489
+ return;
3601
3490
  try {
3602
3491
  // If we have selected text and a replaceText callback, use it
3603
- if (rangeToReplace?.text && rangeToReplace.replaceText) {
3604
- rangeToReplace.replaceText(newText);
3492
+ if (selectedRange?.text && selectedRange.replaceText) {
3493
+ selectedRange.replaceText(newText);
3605
3494
  setSelectedRange(undefined);
3606
- lastTextSelectionRangeRef.current = undefined;
3607
3495
  return;
3608
3496
  }
3609
3497
  // If no selection but we have a replaceText callback, try to use it for insertion
3610
3498
  // (some editors might support insertion via the same callback)
3611
- if (!rangeToReplace?.text && rangeToReplace?.replaceText) {
3612
- rangeToReplace.replaceText(newText);
3499
+ if (!selectedRange?.text && selectedRange?.replaceText) {
3500
+ selectedRange.replaceText(newText);
3613
3501
  setSelectedRange(undefined);
3614
- lastTextSelectionRangeRef.current = undefined;
3615
3502
  return;
3616
3503
  }
3617
- const fieldToReplace = focusedField ??
3618
- (rangeToReplace?.fieldId &&
3619
- rangeToReplace.itemId &&
3620
- rangeToReplace.language &&
3621
- typeof rangeToReplace.version === "number"
3622
- ? {
3623
- fieldId: rangeToReplace.fieldId,
3624
- item: {
3625
- id: rangeToReplace.itemId,
3626
- language: rangeToReplace.language,
3627
- version: rangeToReplace.version,
3628
- },
3629
- }
3630
- : undefined);
3631
- if (!fieldToReplace)
3632
- return;
3633
3504
  // Fallback: indexOf-based replacement/insertion for plain text fields
3634
- const { fieldId, item } = fieldToReplace;
3505
+ const { fieldId, item } = focusedField;
3635
3506
  const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
3636
3507
  const currentValue = modifiedField
3637
3508
  ? modifiedField.value || ""
3638
- : (await itemsRepository.getField(fieldToReplace))
3639
- ?.value || "";
3509
+ : (await itemsRepository.getField(focusedField))?.value ||
3510
+ "";
3640
3511
  let newValue;
3641
- if (rangeToReplace?.text) {
3512
+ if (selectedRange?.text) {
3642
3513
  // Replace selected text
3643
- const { text: originalSelectedText } = rangeToReplace;
3514
+ const { text: originalSelectedText } = selectedRange;
3644
3515
  const actualPosition = currentValue.indexOf(originalSelectedText);
3645
3516
  if (actualPosition === -1) {
3646
3517
  console.error("Failed to find selected text in field value");
@@ -3653,7 +3524,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3653
3524
  }
3654
3525
  else {
3655
3526
  // Insert at cursor position (use startOffset if available, otherwise append)
3656
- const insertPosition = rangeToReplace?.startOffset ?? currentValue.length;
3527
+ const insertPosition = selectedRange?.startOffset ?? currentValue.length;
3657
3528
  newValue =
3658
3529
  currentValue.slice(0, insertPosition) +
3659
3530
  newText +
@@ -3661,13 +3532,12 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3661
3532
  }
3662
3533
  // Update the field
3663
3534
  await operations.editField({
3664
- field: fieldToReplace,
3535
+ field: focusedField,
3665
3536
  value: newValue,
3666
3537
  refresh: "immediate",
3667
3538
  });
3668
3539
  // Clear the selection after replacement/insertion
3669
3540
  setSelectedRange(undefined);
3670
- lastTextSelectionRangeRef.current = undefined;
3671
3541
  }
3672
3542
  catch (error) {
3673
3543
  console.error("Failed to replace/insert text:", error);
@@ -4144,6 +4014,18 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4144
4014
  };
4145
4015
  }
4146
4016
  }, [operations.onFieldBlur]);
4017
+ useEffect(() => {
4018
+ if (mode === "suggestions") {
4019
+ setShowSuggestedEdits(true);
4020
+ // Refresh from the server to recover from any missed
4021
+ // `suggested-edit-updated` WebSocket events (e.g. created by an
4022
+ // agent tool while another tab was focused).
4023
+ loadSuggestedEdits();
4024
+ }
4025
+ else {
4026
+ setShowSuggestedEdits(false);
4027
+ }
4028
+ }, [mode, loadSuggestedEdits]);
4147
4029
  const isReadOnly = !item ||
4148
4030
  !item.canWriteItem ||
4149
4031
  !item.canWriteLanguage ||
@@ -4162,6 +4044,15 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4162
4044
  // Otherwise, only show workspaces that are in the settings
4163
4045
  return workspaceIdsFromSettings.includes(w.id) && !w.visible;
4164
4046
  });
4047
+ // Handle initial mode setup from URL (only on initial load)
4048
+ useEffect(() => {
4049
+ if (!isInitialLoad)
4050
+ return;
4051
+ const queryMode = searchParams.get("mode");
4052
+ if (queryMode) {
4053
+ setMode(queryMode);
4054
+ }
4055
+ }, [searchParams, isInitialLoad]);
4165
4056
  // Add this new effect for initial fullscreen setup
4166
4057
  useEffect(() => {
4167
4058
  if (!isInitialLoad)
@@ -4289,11 +4180,16 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4289
4180
  dragEnd: () => {
4290
4181
  setDragObject(undefined);
4291
4182
  },
4292
- droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption, spotPosition) => {
4293
- const droppedDragObject = dragObject;
4294
- if ((!droppedDragObject && !insertOption) || !page)
4183
+ droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption) => {
4184
+ if ((!dragObject && !insertOption) || !page)
4295
4185
  return;
4296
4186
  setDragObject(undefined);
4187
+ if (spotPositionElement && spotPositionAnchor) {
4188
+ setInserting({
4189
+ positionElement: spotPositionElement,
4190
+ positionAnchor: spotPositionAnchor,
4191
+ });
4192
+ }
4297
4193
  const placeholderKeyComponents = placeholderKey.split("_");
4298
4194
  const parentId = placeholderKeyComponents.length === 1
4299
4195
  ? undefined
@@ -4303,31 +4199,39 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4303
4199
  let op;
4304
4200
  if (!currentItemDescriptorRef.current)
4305
4201
  return;
4306
- let insertionSequence;
4307
- if ((spotPosition || spotPositionElement) && spotPositionAnchor) {
4308
- insertionSequence = ++insertingSequenceRef.current;
4309
- setInserting({
4310
- position: spotPosition,
4311
- positionElement: spotPositionElement,
4312
- positionAnchor: spotPositionAnchor,
4313
- });
4314
- }
4315
- let operationPromise;
4316
4202
  if (insertOption) {
4317
4203
  // Clear any selected component type for insertion once the component
4318
4204
  // has been dropped into a placeholder. This ensures that insert mode
4319
4205
  // can exit cleanly and the editor header updates from "Add Component"
4320
4206
  // to the actual component name after the operation completes.
4321
4207
  setSelectedForInsertion("");
4322
- operationPromise = operations.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current);
4208
+ operations
4209
+ .addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current)
4210
+ .then((result) => {
4211
+ setInserting(undefined);
4212
+ })
4213
+ .catch((err) => {
4214
+ setInserting(undefined);
4215
+ });
4216
+ return;
4323
4217
  }
4324
- else if (droppedDragObject?.type == "template") {
4325
- operationPromise = operations.addComponent(droppedDragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current);
4218
+ if (!dragObject)
4219
+ return;
4220
+ if (dragObject && dragObject.type == "template") {
4221
+ operations
4222
+ .addComponent(dragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current)
4223
+ .then((result) => {
4224
+ setInserting(undefined);
4225
+ })
4226
+ .catch((err) => {
4227
+ setInserting(undefined);
4228
+ });
4229
+ return;
4326
4230
  }
4327
- else if (droppedDragObject?.type == "component" ||
4328
- (droppedDragObject?.type == "items" && droppedDragObject.items)) {
4231
+ if (dragObject.type == "component" ||
4232
+ (dragObject.type == "items" && dragObject.items)) {
4329
4233
  const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
4330
- if (droppedDragObject.type == "items" && droppedDragObject.items) {
4234
+ if (dragObject.type == "items" && dragObject.items) {
4331
4235
  op = {
4332
4236
  type: "link-component",
4333
4237
  mainItem: page.item.descriptor,
@@ -4341,52 +4245,33 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4341
4245
  placeholderIndex: index,
4342
4246
  date: new Date().toISOString(),
4343
4247
  id: uuid(),
4344
- linkedComponentItem: droppedDragObject.items[0],
4248
+ linkedComponentItem: dragObject.items[0],
4345
4249
  title: "Link component",
4346
4250
  };
4347
4251
  }
4348
4252
  else {
4349
- const componentIds = droppedDragObject.components?.map((c) => c.id) ?? [];
4350
- if (componentIds.length > 0) {
4351
- op = {
4352
- type: "move-component",
4353
- mainItem: page.item.descriptor,
4354
- parent: parentId && {
4355
- id: parentId,
4356
- language: page.item.descriptor.language,
4357
- version: page.item.descriptor.version,
4358
- },
4359
- placeholderKey,
4360
- placeholderIndex: index,
4361
- componentIds,
4362
- date: new Date().toISOString(),
4363
- id: uuid(),
4364
- title: "Move component",
4365
- };
4366
- }
4253
+ const componentIds = dragObject.components?.map((c) => c.id) ?? [];
4254
+ if (componentIds.length === 0)
4255
+ return;
4256
+ op = {
4257
+ type: "move-component",
4258
+ mainItem: page.item.descriptor,
4259
+ parent: parentId && {
4260
+ id: parentId,
4261
+ language: page.item.descriptor.language,
4262
+ version: page.item.descriptor.version,
4263
+ },
4264
+ placeholderKey,
4265
+ placeholderIndex: index,
4266
+ componentIds,
4267
+ date: new Date().toISOString(),
4268
+ id: uuid(),
4269
+ title: "Move component",
4270
+ };
4367
4271
  }
4368
4272
  }
4369
4273
  if (op)
4370
- operationPromise = operations.executeEditOperation(op);
4371
- if (!operationPromise) {
4372
- if (insertionSequence !== undefined &&
4373
- insertingSequenceRef.current === insertionSequence) {
4374
- setInserting(undefined);
4375
- }
4376
- return;
4377
- }
4378
- try {
4379
- await operationPromise;
4380
- }
4381
- catch (err) {
4382
- console.error("Failed to drop component in placeholder", err);
4383
- }
4384
- finally {
4385
- if (insertionSequence !== undefined &&
4386
- insertingSequenceRef.current === insertionSequence) {
4387
- setInserting(undefined);
4388
- }
4389
- }
4274
+ operations.executeEditOperation(op);
4390
4275
  },
4391
4276
  page,
4392
4277
  triggerFieldAction: async (fieldDescriptor, actionButton, parameters, event) => {
@@ -4536,8 +4421,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4536
4421
  inserting,
4537
4422
  validating,
4538
4423
  validationResult,
4539
- bridgeDiagnostics,
4540
- setBridgeDiagnostics,
4541
4424
  loadItem,
4542
4425
  editHistory: editHistory,
4543
4426
  historyMode,
@@ -4667,50 +4550,27 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4667
4550
  setShowComments,
4668
4551
  showResolvedComments,
4669
4552
  setShowResolvedComments,
4670
- addComment: async (options) => {
4553
+ addComment: async () => {
4671
4554
  const descriptor = item?.descriptor;
4672
4555
  if (!descriptor)
4673
4556
  return;
4674
4557
  // Snapshot selection context up-front so switching views doesn't change what we comment on.
4675
- const hintedFieldSnapshot = options?.field;
4676
4558
  const focusedFieldSnapshot = focusedFieldRef.current;
4677
- const selectedRangeCandidate = isUsableTextSelectionRange(selectedRange)
4678
- ? selectedRange
4679
- : lastTextSelectionRangeRef.current;
4680
- const selectedRangeSnapshot = !hintedFieldSnapshot ||
4681
- selectionRangeMatchesField(selectedRangeCandidate, hintedFieldSnapshot)
4682
- ? selectedRangeCandidate
4683
- : undefined;
4684
- const selectedRangeFieldSnapshot = isUsableTextSelectionRange(selectedRangeSnapshot)
4685
- ? {
4686
- fieldId: selectedRangeSnapshot.fieldId,
4687
- item: {
4688
- id: selectedRangeSnapshot.itemId,
4689
- language: selectedRangeSnapshot.language || descriptor.language,
4690
- version: typeof selectedRangeSnapshot.version === "number"
4691
- ? selectedRangeSnapshot.version
4692
- : descriptor.version,
4693
- },
4694
- }
4695
- : undefined;
4696
- const commentFieldSnapshot = selectedRangeFieldSnapshot ??
4697
- hintedFieldSnapshot ??
4698
- focusedFieldSnapshot;
4699
- const itemId = commentFieldSnapshot?.item.id ||
4700
- (selection.length > 0 ? selection[0] : undefined) ||
4559
+ const selectionSnapshot = [...selection];
4560
+ const selectedRangeSnapshot = selectedRange;
4561
+ const itemId = focusedFieldSnapshot?.item.id ||
4562
+ (selectionSnapshot.length > 0 ? selectionSnapshot[0] : undefined) ||
4701
4563
  descriptor.id;
4702
4564
  if (!itemId)
4703
4565
  return;
4704
4566
  // Ensure the feedback sidebar is open when adding a comment (e.g. command palette / toolbar button).
4705
4567
  openSidebar("feedback");
4706
- const language = commentFieldSnapshot?.item.language || descriptor.language;
4707
- const version = typeof commentFieldSnapshot?.item.version === "number"
4708
- ? commentFieldSnapshot.item.version
4709
- : descriptor.version;
4568
+ const language = descriptor.language;
4569
+ const version = descriptor.version;
4710
4570
  const getFieldName = async () => {
4711
- if (!commentFieldSnapshot)
4571
+ if (!focusedFieldSnapshot)
4712
4572
  return "";
4713
- const field = await itemsRepository.getField(commentFieldSnapshot);
4573
+ const field = await itemsRepository.getField(focusedFieldSnapshot);
4714
4574
  return field?.name;
4715
4575
  };
4716
4576
  const getItemName = async () => {
@@ -4726,40 +4586,24 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4726
4586
  isNew: true,
4727
4587
  itemId,
4728
4588
  itemName: await getItemName(),
4729
- fieldId: commentFieldSnapshot?.fieldId,
4589
+ fieldId: focusedFieldSnapshot?.fieldId,
4730
4590
  fieldName: await getFieldName(),
4731
4591
  mainItemId: descriptor.id,
4732
4592
  language,
4733
4593
  version,
4734
4594
  position: 0,
4735
- rangeStart: isUsableTextSelectionRange(selectedRangeSnapshot)
4736
- ? selectedRangeSnapshot.startOffset
4737
- : 0,
4738
- rangeEnd: isUsableTextSelectionRange(selectedRangeSnapshot)
4739
- ? selectedRangeSnapshot.endOffset
4740
- : 0,
4595
+ rangeStart: selectedRangeSnapshot?.startOffset || 0,
4596
+ rangeEnd: selectedRangeSnapshot?.endOffset || 0,
4741
4597
  author: user?.name,
4742
4598
  authorDisplayName: user?.fullName,
4743
- created: new Date().toISOString(),
4599
+ date: new Date().toISOString(),
4744
4600
  };
4745
- if (selectedRangeSnapshot?.clientRect) {
4746
- newComment[COMMENT_TRANSIENT_SELECTION_RECT] =
4747
- selectedRangeSnapshot.clientRect;
4748
- }
4749
- if (selectedRangeSnapshot?.elementKey) {
4750
- newComment[COMMENT_TRANSIENT_ELEMENT_KEY] =
4751
- selectedRangeSnapshot.elementKey;
4752
- }
4753
4601
  setComments([newComment, ...comments]);
4754
4602
  setSelectedComment(newComment);
4755
4603
  setShowComments(true);
4756
- lastTextSelectionRangeRef.current = undefined;
4757
4604
  },
4758
4605
  mode,
4759
- changeMode,
4760
4606
  setMode,
4761
- registerModeChangeParticipant,
4762
- modeTransitionRevision,
4763
4607
  previewDate,
4764
4608
  setPreviewDate,
4765
4609
  layoutMode,
@@ -4827,7 +4671,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4827
4671
  setCurrentWizardId,
4828
4672
  favorites,
4829
4673
  loadFavorites,
4830
- refreshFavorites,
4831
4674
  isQuickSwitcherVisible: quickSwitcherVisible,
4832
4675
  // Context factory registry methods
4833
4676
  registerContextFactory: (name, factory) => {
@@ -4936,7 +4779,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4936
4779
  isRefreshing,
4937
4780
  favorites,
4938
4781
  loadFavorites,
4939
- refreshFavorites,
4940
4782
  currentWizardId,
4941
4783
  quickSwitcherVisible,
4942
4784
  quickSwitcherSelectedIndex,
@@ -4947,10 +4789,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4947
4789
  factoriesRef,
4948
4790
  user,
4949
4791
  statusMessage,
4950
- changeMode,
4951
- setMode,
4952
- registerModeChangeParticipant,
4953
- modeTransitionRevision,
4954
4792
  previewDate,
4955
4793
  layoutMode,
4956
4794
  enableCompletions,
@@ -4994,7 +4832,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4994
4832
  openDialog,
4995
4833
  validating,
4996
4834
  validationResult,
4997
- bridgeDiagnostics,
4998
4835
  isRefreshing,
4999
4836
  executeCommand,
5000
4837
  showInfoToast,
@@ -5017,6 +4854,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
5017
4854
  setLockedField(undefined); // Clear client-side lock state
5018
4855
  await releaseFieldLocks(sessionId);
5019
4856
  },
4857
+ inlineEditingFieldElement,
4858
+ setInlineEditingFieldElement,
5020
4859
  };
5021
4860
  // Debug: Track editContext changes
5022
4861
  // const prevDependencies = useRef<any[]>([]);
@@ -5055,6 +4894,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
5055
4894
  // componentDesignerRendering,
5056
4895
  // insertMode,
5057
4896
  // currentOverlay,
4897
+ // inlineEditingFieldElement,
5058
4898
  // lockedField,
5059
4899
  // selectedRange,
5060
4900
  // pageViewContext,
@@ -5142,6 +4982,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
5142
4982
  // 'componentDesignerRendering',
5143
4983
  // 'insertMode',
5144
4984
  // 'currentOverlay',
4985
+ // 'inlineEditingFieldElement',
5145
4986
  // 'lockedField',
5146
4987
  // 'selectedRange',
5147
4988
  // 'pageViewContext',
@@ -5269,8 +5110,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
5269
5110
  : window.location.pathname;
5270
5111
  window.history.replaceState(getCurrentHistoryState(), "", newUrl);
5271
5112
  }, configuration: configuration, restoredFromUrl: tourRestoredRef.current })), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(GuidanceOverlay, {}) }), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(AgentDialogHandler, {}) })] }));
5272
- const showRefreshSpinner = editContext.isRefreshing && !activePageViewContext.iframeSupportsRefresh;
5273
- return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), showRefreshSpinner && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
5113
+ return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), editContext.isRefreshing && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
5274
5114
  currentWorkspace.id === "taskboard" ||
5275
5115
  currentWorkspace.id === "translation-management") &&
5276
5116
  showAgentsWorkspaceEditor && (_jsx(AgentsSlotContextBridgeHost, { slots: editorSlots })), startupChecks.state !== "loading" && (children || editorUi), startupChecks.state !== "loading" && dialog, _jsx(Toaster, { position: "top-center" }), " ", _jsx(ConfirmationDialog, { ref: confirmationDialogRef }), _jsx(ConcurrentUserLimitDialog, { open: concurrentUserLimitError !== null, onOpenChange: (open) => {