@parhelia/core 0.1.12556 → 0.1.12560

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 (579) hide show
  1. package/dist/agents-view/AgentCard.d.ts +6 -4
  2. package/dist/agents-view/AgentCard.js +143 -24
  3. package/dist/agents-view/AgentCard.js.map +1 -1
  4. package/dist/agents-view/AgentsInbox.d.ts +1 -1
  5. package/dist/agents-view/AgentsInbox.js +7 -92
  6. package/dist/agents-view/AgentsInbox.js.map +1 -1
  7. package/dist/agents-view/AgentsTitlebar.js +3 -2
  8. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  9. package/dist/agents-view/AgentsView.d.ts +6 -7
  10. package/dist/agents-view/AgentsView.js +187 -98
  11. package/dist/agents-view/AgentsView.js.map +1 -1
  12. package/dist/agents-view/AgentsWorkspaceView.d.ts +2 -6
  13. package/dist/agents-view/AgentsWorkspaceView.js +266 -113
  14. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.d.ts +2 -1
  16. package/dist/agents-view/ProfileAgentsGroup.js +4 -3
  17. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  18. package/dist/components/ActionButton.d.ts +1 -1
  19. package/dist/components/ActionButton.js.map +1 -1
  20. package/dist/components/FilterInput.d.ts +1 -1
  21. package/dist/components/FilterInput.js +1 -1
  22. package/dist/components/FilterInput.js.map +1 -1
  23. package/dist/components/ui/LanguageSelector.js +2 -4
  24. package/dist/components/ui/LanguageSelector.js.map +1 -1
  25. package/dist/components/ui/PlaceholderInput.js +3 -3
  26. package/dist/components/ui/PlaceholderInput.js.map +1 -1
  27. package/dist/components/ui/PlaceholderInputTypes.js +1 -1
  28. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
  29. package/dist/components/ui/alert-dialog.d.ts +1 -1
  30. package/dist/components/ui/alert-dialog.js +6 -10
  31. package/dist/components/ui/alert-dialog.js.map +1 -1
  32. package/dist/components/ui/button.d.ts +4 -4
  33. package/dist/components/ui/button.js +4 -1
  34. package/dist/components/ui/button.js.map +1 -1
  35. package/dist/components/ui/context-menu.d.ts +1 -1
  36. package/dist/components/ui/context-menu.js +12 -4
  37. package/dist/components/ui/context-menu.js.map +1 -1
  38. package/dist/components/ui/copy-button.d.ts +2 -1
  39. package/dist/components/ui/copy-button.js +2 -2
  40. package/dist/components/ui/copy-button.js.map +1 -1
  41. package/dist/components/ui/dialog.d.ts +1 -1
  42. package/dist/components/ui/dialog.js +21 -126
  43. package/dist/components/ui/dialog.js.map +1 -1
  44. package/dist/components/ui/input.d.ts +1 -1
  45. package/dist/components/ui/input.js +5 -3
  46. package/dist/components/ui/input.js.map +1 -1
  47. package/dist/components/ui/paste-button.d.ts +2 -1
  48. package/dist/components/ui/paste-button.js +2 -2
  49. package/dist/components/ui/paste-button.js.map +1 -1
  50. package/dist/components/ui/popover.js +1 -9
  51. package/dist/components/ui/popover.js.map +1 -1
  52. package/dist/components/ui/select.js +1 -1
  53. package/dist/components/ui/select.js.map +1 -1
  54. package/dist/components/ui/styled-dialog-title.js +1 -1
  55. package/dist/components/ui/styled-dialog-title.js.map +1 -1
  56. package/dist/components/ui/tabs.d.ts +1 -1
  57. package/dist/components/ui/tabs.js +4 -11
  58. package/dist/components/ui/tabs.js.map +1 -1
  59. package/dist/config/config.d.ts +4 -2
  60. package/dist/config/config.js +250 -70
  61. package/dist/config/config.js.map +1 -1
  62. package/dist/config/notificationRoutes.js +14 -0
  63. package/dist/config/notificationRoutes.js.map +1 -1
  64. package/dist/config/types/workspace.d.ts +6 -0
  65. package/dist/config/types.d.ts +63 -12
  66. package/dist/config/types.js.map +1 -1
  67. package/dist/editor/ConfirmationDialog.js +20 -4
  68. package/dist/editor/ConfirmationDialog.js.map +1 -1
  69. package/dist/editor/ContentTree.d.ts +2 -1
  70. package/dist/editor/ContentTree.js +93 -32
  71. package/dist/editor/ContentTree.js.map +1 -1
  72. package/dist/editor/Editor.js +87 -22
  73. package/dist/editor/Editor.js.map +1 -1
  74. package/dist/editor/FieldHistory.js +84 -36
  75. package/dist/editor/FieldHistory.js.map +1 -1
  76. package/dist/editor/FieldListField.js +21 -9
  77. package/dist/editor/FieldListField.js.map +1 -1
  78. package/dist/editor/FieldListFieldWithFallbacks.js +23 -2
  79. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
  80. package/dist/editor/GlobalMenuBar.js +29 -2
  81. package/dist/editor/GlobalMenuBar.js.map +1 -1
  82. package/dist/editor/ImageEditor.js +5 -2
  83. package/dist/editor/ImageEditor.js.map +1 -1
  84. package/dist/editor/ItemInfo.js +36 -1
  85. package/dist/editor/ItemInfo.js.map +1 -1
  86. package/dist/editor/LinkEditorDialog.js +3 -0
  87. package/dist/editor/LinkEditorDialog.js.map +1 -1
  88. package/dist/editor/MainLayout.d.ts +0 -2
  89. package/dist/editor/MainLayout.js +65 -8
  90. package/dist/editor/MainLayout.js.map +1 -1
  91. package/dist/editor/MigrationsView.js +29 -5
  92. package/dist/editor/MigrationsView.js.map +1 -1
  93. package/dist/editor/MobileLayout.js +37 -12
  94. package/dist/editor/MobileLayout.js.map +1 -1
  95. package/dist/editor/PictureCropper.js +54 -45
  96. package/dist/editor/PictureCropper.js.map +1 -1
  97. package/dist/editor/PictureEditor.js +17 -15
  98. package/dist/editor/PictureEditor.js.map +1 -1
  99. package/dist/editor/QuickItemSwitcher.js +21 -21
  100. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  101. package/dist/editor/SetupWizard.js +52 -12
  102. package/dist/editor/SetupWizard.js.map +1 -1
  103. package/dist/editor/Titlebar.js +7 -2
  104. package/dist/editor/Titlebar.js.map +1 -1
  105. package/dist/editor/ai/AgentCostDisplay.d.ts +1 -0
  106. package/dist/editor/ai/AgentCostDisplay.js +1 -1
  107. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  108. package/dist/editor/ai/AgentDocumentList.js +32 -14
  109. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  110. package/dist/editor/ai/AgentGreeting.js +3 -2
  111. package/dist/editor/ai/AgentGreeting.js.map +1 -1
  112. package/dist/editor/ai/AgentProfileSelector.js +2 -1
  113. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  114. package/dist/editor/ai/AgentStatusBadge.d.ts +0 -5
  115. package/dist/editor/ai/AgentStatusBadge.js +67 -65
  116. package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
  117. package/dist/editor/ai/AgentTerminal.d.ts +14 -2
  118. package/dist/editor/ai/AgentTerminal.js +2377 -483
  119. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  120. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +8 -3
  121. package/dist/editor/ai/AgentTerminalStatusBar.js +460 -56
  122. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  123. package/dist/editor/ai/Agents.js +150 -113
  124. package/dist/editor/ai/Agents.js.map +1 -1
  125. package/dist/editor/ai/AiResponseMessage.d.ts +10 -1
  126. package/dist/editor/ai/AiResponseMessage.js +238 -23
  127. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  128. package/dist/editor/ai/ContextInfoBar.d.ts +2 -3
  129. package/dist/editor/ai/ContextInfoBar.js +64 -7
  130. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  131. package/dist/editor/ai/GuidanceOverlay.js +17 -11
  132. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  133. package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
  134. package/dist/editor/ai/InlineAiDialog.js +514 -192
  135. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  136. package/dist/editor/ai/InlineAiTrigger.js +115 -12
  137. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  138. package/dist/editor/ai/MediaImage.js +40 -8
  139. package/dist/editor/ai/MediaImage.js.map +1 -1
  140. package/dist/editor/ai/SpawnedAgentsPanel.js +10 -12
  141. package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
  142. package/dist/editor/ai/ToolCallDisplay.d.ts +22 -2
  143. package/dist/editor/ai/ToolCallDisplay.js +518 -147
  144. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  145. package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +1 -8
  146. package/dist/editor/ai/dialogs/AgentDialogHandler.js +379 -42
  147. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  148. package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +5 -1
  149. package/dist/editor/ai/dialogs/QuestionnaireInline.js +628 -60
  150. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  151. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +115 -0
  152. package/dist/editor/ai/dialogs/agentDialogTypes.js +2 -0
  153. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  154. package/dist/editor/ai/types.d.ts +3 -1
  155. package/dist/editor/ai/useAgentStatus.d.ts +2 -1
  156. package/dist/editor/ai/useAgentStatus.js +86 -99
  157. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  158. package/dist/editor/ai/useInlineAiPosition.js +45 -5
  159. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  160. package/dist/editor/client/AboutDialog.js +4 -2
  161. package/dist/editor/client/AboutDialog.js.map +1 -1
  162. package/dist/editor/client/EditorShell.d.ts +4 -1
  163. package/dist/editor/client/EditorShell.js +770 -237
  164. package/dist/editor/client/EditorShell.js.map +1 -1
  165. package/dist/editor/client/editContext.d.ts +33 -19
  166. package/dist/editor/client/editContext.js.map +1 -1
  167. package/dist/editor/client/helpers.js +6 -0
  168. package/dist/editor/client/helpers.js.map +1 -1
  169. package/dist/editor/client/hooks/useEditorUrlSync.js +1 -2
  170. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
  171. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +10 -0
  172. package/dist/editor/client/hooks/useEditorWebSocket.js +209 -14
  173. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  174. package/dist/editor/client/hooks/useQuota.d.ts +8 -0
  175. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  176. package/dist/editor/client/hooks/useSocketMessageHandler.js +68 -7
  177. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  178. package/dist/editor/client/itemsRepository.js +10 -6
  179. package/dist/editor/client/itemsRepository.js.map +1 -1
  180. package/dist/editor/client/navigation.js +35 -3
  181. package/dist/editor/client/navigation.js.map +1 -1
  182. package/dist/editor/client/operations.d.ts +6 -3
  183. package/dist/editor/client/operations.js +208 -30
  184. package/dist/editor/client/operations.js.map +1 -1
  185. package/dist/editor/client/pageModelBuilder.js +4 -31
  186. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  187. package/dist/editor/client/ui/DevModeIndicator.js +2 -2
  188. package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
  189. package/dist/editor/client/ui/EditorChrome.d.ts +0 -6
  190. package/dist/editor/client/ui/EditorChrome.js +55 -72
  191. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  192. package/dist/editor/client/ui/FullscreenControls.js +5 -3
  193. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  194. package/dist/editor/commands/commands.d.ts +11 -1
  195. package/dist/editor/commands/commands.js +12 -1
  196. package/dist/editor/commands/commands.js.map +1 -1
  197. package/dist/editor/commands/componentCommands.js +109 -55
  198. package/dist/editor/commands/componentCommands.js.map +1 -1
  199. package/dist/editor/commands/customCommandConverter.d.ts +8 -1
  200. package/dist/editor/commands/customCommandConverter.js +35 -5
  201. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  202. package/dist/editor/commands/handlers/agentHandler.js +2 -1
  203. package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
  204. package/dist/editor/commands/itemCommands.d.ts +3 -0
  205. package/dist/editor/commands/itemCommands.js +93 -10
  206. package/dist/editor/commands/itemCommands.js.map +1 -1
  207. package/dist/editor/commands/undo.d.ts +9 -15
  208. package/dist/editor/commands/undo.js +24 -0
  209. package/dist/editor/commands/undo.js.map +1 -1
  210. package/dist/editor/context-menu/InsertMenu.js +83 -39
  211. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  212. package/dist/editor/field-types/MultiLineText.js +1 -1
  213. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  214. package/dist/editor/field-types/RawEditor.js +1 -1
  215. package/dist/editor/field-types/RichTextEditor.js +13 -5
  216. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  217. package/dist/editor/field-types/RichTextEditorComponent.js +37 -3
  218. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  219. package/dist/editor/field-types/SingleLineText.js +1 -1
  220. package/dist/editor/field-types/TreeListEditor.js +3 -2
  221. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  222. package/dist/editor/field-types/richtext/components/ReactSlate.css +23 -5
  223. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +2 -0
  224. package/dist/editor/field-types/richtext/components/ReactSlate.js +28 -4
  225. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  226. package/dist/editor/field-types/richtext/components/ToolbarButton.js +4 -2
  227. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  228. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +13 -0
  229. package/dist/editor/field-types/richtext/contextMenuFactory.js +181 -24
  230. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  231. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  232. package/dist/editor/field-types/richtext/types.js.map +1 -1
  233. package/dist/editor/field-types/richtext/utils/plugins.js +4 -0
  234. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  235. package/dist/editor/field-types/textContextMenuFactory.js +3 -2
  236. package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
  237. package/dist/editor/media-selector/AiImageSearchPrompt.js +4 -2
  238. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
  239. package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
  240. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  241. package/dist/editor/media-selector/MediaSelector.js +7 -1
  242. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  243. package/dist/editor/media-selector/TreeSelector.js +40 -35
  244. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  245. package/dist/editor/menubar/ActiveUsers.js +1 -1
  246. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  247. package/dist/editor/menubar/GenericToolbar.js +4 -2
  248. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  249. package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
  250. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  251. package/dist/editor/menubar/PageSelector.js +26 -147
  252. package/dist/editor/menubar/PageSelector.js.map +1 -1
  253. package/dist/editor/menubar/Separator.js +1 -1
  254. package/dist/editor/menubar/VersionSelector.js +2 -4
  255. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  256. package/dist/editor/menubar/WorkflowButton.js +39 -12
  257. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  258. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +16 -38
  259. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
  260. package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
  261. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  262. package/dist/editor/menubar/toolbar-sections/HelpButton.js +1 -0
  263. package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
  264. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +6 -10
  265. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +597 -220
  266. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  267. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +13 -2
  268. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  269. package/dist/editor/page-editor-chrome/CommentHighlighting.js +42 -1
  270. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
  271. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  272. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  273. package/dist/editor/page-editor-chrome/InlineEditor.js +97 -48
  274. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  275. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +38 -17
  276. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  277. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +17 -11
  278. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  279. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
  280. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  281. package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
  282. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  283. package/dist/editor/page-viewer/EditorForm.js +69 -11
  284. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  285. package/dist/editor/page-viewer/MiniMap.d.ts +2 -4
  286. package/dist/editor/page-viewer/MiniMap.js +91 -28
  287. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  288. package/dist/editor/page-viewer/PageViewer.d.ts +3 -1
  289. package/dist/editor/page-viewer/PageViewer.js +92 -19
  290. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  291. package/dist/editor/page-viewer/PageViewerFrame.d.ts +2 -1
  292. package/dist/editor/page-viewer/PageViewerFrame.js +348 -115
  293. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  294. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +114 -49
  295. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  296. package/dist/editor/page-viewer/pageViewContext.d.ts +1 -0
  297. package/dist/editor/page-viewer/pageViewContext.js +51 -14
  298. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  299. package/dist/editor/pageModel.d.ts +14 -1
  300. package/dist/editor/reviews/Comment.js +26 -12
  301. package/dist/editor/reviews/Comment.js.map +1 -1
  302. package/dist/editor/reviews/CommentDisplayPopover.js +7 -5
  303. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  304. package/dist/editor/reviews/CommentView.js +19 -4
  305. package/dist/editor/reviews/CommentView.js.map +1 -1
  306. package/dist/editor/reviews/Comments.js +89 -72
  307. package/dist/editor/reviews/Comments.js.map +1 -1
  308. package/dist/editor/reviews/CreateReviewDialog.js +281 -177
  309. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  310. package/dist/editor/reviews/DecisionsMatrix.js +96 -25
  311. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  312. package/dist/editor/reviews/DiffView.js +7 -14
  313. package/dist/editor/reviews/DiffView.js.map +1 -1
  314. package/dist/editor/reviews/EditReviewSettingsDialog.js +6 -4
  315. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  316. package/dist/editor/reviews/MultiReviewManager.js +25 -3
  317. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  318. package/dist/editor/reviews/PagesPanel.js +31 -15
  319. package/dist/editor/reviews/PagesPanel.js.map +1 -1
  320. package/dist/editor/reviews/PreviewInfo.js +1 -4
  321. package/dist/editor/reviews/PreviewInfo.js.map +1 -1
  322. package/dist/editor/reviews/ReviewCard.js +13 -7
  323. package/dist/editor/reviews/ReviewCard.js.map +1 -1
  324. package/dist/editor/reviews/ReviewDetail.js +3 -2
  325. package/dist/editor/reviews/ReviewDetail.js.map +1 -1
  326. package/dist/editor/reviews/ReviewsList.js +7 -3
  327. package/dist/editor/reviews/ReviewsList.js.map +1 -1
  328. package/dist/editor/reviews/SuggestedEdit.js +34 -3
  329. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  330. package/dist/editor/reviews/SuggestionDisplayPopover.js +31 -5
  331. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  332. package/dist/editor/reviews/commentAi.js +25 -6
  333. package/dist/editor/reviews/commentAi.js.map +1 -1
  334. package/dist/editor/reviews/reviewCommands.js +4 -1
  335. package/dist/editor/reviews/reviewCommands.js.map +1 -1
  336. package/dist/editor/reviews/useMultiReview.js +2 -2
  337. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  338. package/dist/editor/reviews/useReviews.d.ts +2 -2
  339. package/dist/editor/reviews/useReviews.js +12 -30
  340. package/dist/editor/reviews/useReviews.js.map +1 -1
  341. package/dist/editor/services/agentService.d.ts +229 -5
  342. package/dist/editor/services/agentService.js +292 -39
  343. package/dist/editor/services/agentService.js.map +1 -1
  344. package/dist/editor/services/aiService.d.ts +57 -1
  345. package/dist/editor/services/aiService.js +79 -6
  346. package/dist/editor/services/aiService.js.map +1 -1
  347. package/dist/editor/services/contentService.d.ts +6 -3
  348. package/dist/editor/services/contentService.js +13 -12
  349. package/dist/editor/services/contentService.js.map +1 -1
  350. package/dist/editor/services/editService.d.ts +52 -1
  351. package/dist/editor/services/editService.js +94 -2
  352. package/dist/editor/services/editService.js.map +1 -1
  353. package/dist/editor/services/indexService.js +1 -1
  354. package/dist/editor/services/indexService.js.map +1 -1
  355. package/dist/editor/services/reviewsService.d.ts +3 -6
  356. package/dist/editor/services/reviewsService.js +2 -11
  357. package/dist/editor/services/reviewsService.js.map +1 -1
  358. package/dist/editor/services/serviceHelper.d.ts +2 -1
  359. package/dist/editor/services/serviceHelper.js +112 -20
  360. package/dist/editor/services/serviceHelper.js.map +1 -1
  361. package/dist/editor/services/systemService.d.ts +2 -1
  362. package/dist/editor/services/systemService.js +3 -0
  363. package/dist/editor/services/systemService.js.map +1 -1
  364. package/dist/editor/services-server/api.d.ts +1 -2
  365. package/dist/editor/services-server/api.js +11 -6
  366. package/dist/editor/services-server/api.js.map +1 -1
  367. package/dist/editor/settings/About.js +317 -3
  368. package/dist/editor/settings/About.js.map +1 -1
  369. package/dist/editor/settings/QuotaInfo.js +210 -4
  370. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  371. package/dist/editor/settings/SettingsView.js +25 -23
  372. package/dist/editor/settings/SettingsView.js.map +1 -1
  373. package/dist/editor/settings/Status.js +7 -6
  374. package/dist/editor/settings/Status.js.map +1 -1
  375. package/dist/editor/settings/index/useIndexStatus.js +20 -22
  376. package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
  377. package/dist/editor/settings/panels/AgentsPanel.d.ts +0 -4
  378. package/dist/editor/settings/panels/AgentsPanel.js +95 -121
  379. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  380. package/dist/editor/settings/panels/ModelsPanel.js +329 -108
  381. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  382. package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
  383. package/dist/editor/settings/panels/ProvidersPanel.js +86 -59
  384. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  385. package/dist/editor/settings/panels/SearchConfigPanel.js +4 -4
  386. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  387. package/dist/editor/settings/panels/index.d.ts +3 -2
  388. package/dist/editor/settings/panels/index.js +3 -2
  389. package/dist/editor/settings/panels/index.js.map +1 -1
  390. package/dist/editor/settings/status/coreStatusChecks.js +124 -19
  391. package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
  392. package/dist/editor/settings/status/useStartupChecks.d.ts +3 -1
  393. package/dist/editor/settings/status/useStartupChecks.js +9 -5
  394. package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
  395. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +2 -1
  396. package/dist/editor/setup-wizard/steps/CompleteStep.js +2 -1
  397. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  398. package/dist/editor/sidebar/ComponentPalette.js +2 -1
  399. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  400. package/dist/editor/sidebar/ComponentTree.d.ts +8 -1
  401. package/dist/editor/sidebar/ComponentTree.js +216 -69
  402. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  403. package/dist/editor/sidebar/EditHistory.js +22 -46
  404. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  405. package/dist/editor/sidebar/Favorites.js +4 -8
  406. package/dist/editor/sidebar/Favorites.js.map +1 -1
  407. package/dist/editor/sidebar/MainContentTree.js +4 -3
  408. package/dist/editor/sidebar/MainContentTree.js.map +1 -1
  409. package/dist/editor/sidebar/OperationItem.js +21 -7
  410. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  411. package/dist/editor/sidebar/SidebarPanel.d.ts +3 -1
  412. package/dist/editor/sidebar/SidebarPanel.js +44 -12
  413. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  414. package/dist/editor/sidebar/SidebarStack.d.ts +2 -1
  415. package/dist/editor/sidebar/SidebarStack.js +4 -3
  416. package/dist/editor/sidebar/SidebarStack.js.map +1 -1
  417. package/dist/editor/sidebar/Validation.js +22 -12
  418. package/dist/editor/sidebar/Validation.js.map +1 -1
  419. package/dist/editor/sidebar/Workbox.js +53 -3
  420. package/dist/editor/sidebar/Workbox.js.map +1 -1
  421. package/dist/editor/sidebar/WorkspaceRail.d.ts +0 -1
  422. package/dist/editor/sidebar/WorkspaceRail.js +56 -167
  423. package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
  424. package/dist/editor/tree-indicators/GutterColumns.d.ts +3 -1
  425. package/dist/editor/tree-indicators/GutterColumns.js +26 -5
  426. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  427. package/dist/editor/tree-indicators/GutterContext.d.ts +4 -0
  428. package/dist/editor/tree-indicators/GutterContext.js +23 -0
  429. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  430. package/dist/editor/tree-indicators/index.d.ts +0 -1
  431. package/dist/editor/tree-indicators/index.js +0 -1
  432. package/dist/editor/tree-indicators/index.js.map +1 -1
  433. package/dist/editor/tree-indicators/types.d.ts +12 -1
  434. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
  435. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
  436. package/dist/editor/ui/Icons.js +1 -1
  437. package/dist/editor/ui/Icons.js.map +1 -1
  438. package/dist/editor/ui/ItemNameDialogNew.d.ts +2 -0
  439. package/dist/editor/ui/ItemNameDialogNew.js +33 -17
  440. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  441. package/dist/editor/ui/ItemSearch.js +7 -11
  442. package/dist/editor/ui/ItemSearch.js.map +1 -1
  443. package/dist/editor/ui/SimpleIconButton.js +1 -1
  444. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  445. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  446. package/dist/editor/ui/SimpleTabs.js +45 -25
  447. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  448. package/dist/editor/ui/Splitter.d.ts +1 -0
  449. package/dist/editor/ui/Splitter.js +102 -86
  450. package/dist/editor/ui/Splitter.js.map +1 -1
  451. package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
  452. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
  453. package/dist/editor/ui/TreeListSelector.d.ts +6 -1
  454. package/dist/editor/ui/TreeListSelector.js +2 -2
  455. package/dist/editor/ui/TreeListSelector.js.map +1 -1
  456. package/dist/editor/utils/keyboardNavigation.d.ts +6 -20
  457. package/dist/editor/utils/keyboardNavigation.js +48 -140
  458. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  459. package/dist/editor/utils.js +19 -9
  460. package/dist/editor/utils.js.map +1 -1
  461. package/dist/editor/views/CompareView.d.ts +3 -1
  462. package/dist/editor/views/CompareView.js +7 -5
  463. package/dist/editor/views/CompareView.js.map +1 -1
  464. package/dist/editor/views/EditView.js +1 -1
  465. package/dist/editor/views/EditView.js.map +1 -1
  466. package/dist/editor/views/EditorSlot.js +27 -34
  467. package/dist/editor/views/EditorSlot.js.map +1 -1
  468. package/dist/editor/views/ItemEditor.js +7 -3
  469. package/dist/editor/views/ItemEditor.js.map +1 -1
  470. package/dist/editor/views/MediaFolderEditView.js +1 -1
  471. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  472. package/dist/editor/views/ParheliaView.js +5 -6
  473. package/dist/editor/views/ParheliaView.js.map +1 -1
  474. package/dist/editor/views/SingleEditView.d.ts +2 -1
  475. package/dist/editor/views/SingleEditView.js +10 -8
  476. package/dist/editor/views/SingleEditView.js.map +1 -1
  477. package/dist/editor/views/editorSlotContext.js +35 -6
  478. package/dist/editor/views/editorSlotContext.js.map +1 -1
  479. package/dist/index.d.ts +16 -2
  480. package/dist/index.js +11 -0
  481. package/dist/index.js.map +1 -1
  482. package/dist/revision.d.ts +2 -2
  483. package/dist/revision.js +2 -2
  484. package/dist/setup/services/setupWizardService.d.ts +40 -13
  485. package/dist/setup/services/setupWizardService.js +32 -17
  486. package/dist/setup/services/setupWizardService.js.map +1 -1
  487. package/dist/setup/wizard/steps/AddModelDialog.js +12 -3
  488. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  489. package/dist/setup/wizard/steps/ImportModelDialog.js +39 -22
  490. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  491. package/dist/splash-screen/ModernSplashScreen.js +112 -32
  492. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  493. package/dist/splash-screen/NewPage.js +33 -50
  494. package/dist/splash-screen/NewPage.js.map +1 -1
  495. package/dist/splash-screen/OpenPage.js +2 -6
  496. package/dist/splash-screen/OpenPage.js.map +1 -1
  497. package/dist/splash-screen/ParheliaAssistantChat.js +12 -29
  498. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  499. package/dist/splash-screen/ParheliaLogo.js +87 -37
  500. package/dist/splash-screen/ParheliaLogo.js.map +1 -1
  501. package/dist/splash-screen/RecentPages.js +3 -3
  502. package/dist/splash-screen/RecentPages.js.map +1 -1
  503. package/dist/tour/Tour.d.ts +2 -1
  504. package/dist/tour/Tour.js +256 -75
  505. package/dist/tour/Tour.js.map +1 -1
  506. package/dist/tour/default-tour.js +222 -96
  507. package/dist/tour/default-tour.js.map +1 -1
  508. package/dist/types.d.ts +63 -29
  509. package/package.json +19 -15
  510. package/styles.css +14 -10
  511. package/dist/editor/ComponentInfo.d.ts +0 -4
  512. package/dist/editor/ComponentInfo.js +0 -41
  513. package/dist/editor/ComponentInfo.js.map +0 -1
  514. package/dist/editor/ai/HelpTerminal.d.ts +0 -5
  515. package/dist/editor/ai/HelpTerminal.js +0 -166
  516. package/dist/editor/ai/HelpTerminal.js.map +0 -1
  517. package/dist/editor/field-types/ReactQuill.d.ts +0 -125
  518. package/dist/editor/field-types/ReactQuill.js +0 -385
  519. package/dist/editor/field-types/ReactQuill.js.map +0 -1
  520. package/dist/editor/services-server/graphQL.d.ts +0 -29
  521. package/dist/editor/services-server/graphQL.js +0 -53
  522. package/dist/editor/services-server/graphQL.js.map +0 -1
  523. package/dist/editor/settings/AllAgentsPanel.d.ts +0 -5
  524. package/dist/editor/settings/AllAgentsPanel.js +0 -139
  525. package/dist/editor/settings/AllAgentsPanel.js.map +0 -1
  526. package/dist/editor/settings/LatestFeedback.d.ts +0 -1
  527. package/dist/editor/settings/LatestFeedback.js +0 -136
  528. package/dist/editor/settings/LatestFeedback.js.map +0 -1
  529. package/dist/editor/settings/Setup.d.ts +0 -1
  530. package/dist/editor/settings/Setup.js +0 -211
  531. package/dist/editor/settings/Setup.js.map +0 -1
  532. package/dist/editor/settings/panels/DatabasePanel.d.ts +0 -6
  533. package/dist/editor/settings/panels/DatabasePanel.js +0 -50
  534. package/dist/editor/settings/panels/DatabasePanel.js.map +0 -1
  535. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +0 -2
  536. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +0 -195
  537. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +0 -1
  538. package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +0 -2
  539. package/dist/editor/settings/setup-steps/AiSetupStep/index.js +0 -21
  540. package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +0 -1
  541. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +0 -1
  542. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +0 -233
  543. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +0 -1
  544. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +0 -15
  545. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +0 -14
  546. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +0 -1
  547. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +0 -1
  548. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +0 -94
  549. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +0 -1
  550. package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +0 -1
  551. package/dist/editor/settings/setup-steps/AiSetupStep/types.js +0 -2
  552. package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +0 -1
  553. package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +0 -5
  554. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +0 -44
  555. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +0 -1
  556. package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +0 -2
  557. package/dist/editor/settings/setup-steps/IndexSetupStep.js +0 -36
  558. package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +0 -1
  559. package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +0 -2
  560. package/dist/editor/settings/setup-steps/SettingsSetupStep.js +0 -111
  561. package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +0 -1
  562. package/dist/editor/settings/setup-steps/SetupOverview.d.ts +0 -14
  563. package/dist/editor/settings/setup-steps/SetupOverview.js +0 -38
  564. package/dist/editor/settings/setup-steps/SetupOverview.js.map +0 -1
  565. package/dist/editor/sidebar/Debug.d.ts +0 -1
  566. package/dist/editor/sidebar/Debug.js +0 -70
  567. package/dist/editor/sidebar/Debug.js.map +0 -1
  568. package/dist/editor/sidebar/GraphQL.d.ts +0 -2
  569. package/dist/editor/sidebar/GraphQL.js +0 -234
  570. package/dist/editor/sidebar/GraphQL.js.map +0 -1
  571. package/dist/editor/sidebar/LeftToolbar.d.ts +0 -1
  572. package/dist/editor/sidebar/LeftToolbar.js +0 -12
  573. package/dist/editor/sidebar/LeftToolbar.js.map +0 -1
  574. package/dist/editor/sidebar/NavigationSidebar.d.ts +0 -4
  575. package/dist/editor/sidebar/NavigationSidebar.js +0 -254
  576. package/dist/editor/sidebar/NavigationSidebar.js.map +0 -1
  577. package/dist/editor/tree-indicators/GutterSelector.d.ts +0 -5
  578. package/dist/editor/tree-indicators/GutterSelector.js +0 -91
  579. package/dist/editor/tree-indicators/GutterSelector.js.map +0 -1
@@ -8,7 +8,10 @@ import { useDebouncedCallback } from "use-debounce";
8
8
  import { createOrUpdateSuggestedEdit } from "../services/suggestedEditsService";
9
9
  import { decode } from "html-entities";
10
10
  import { GUID_REGEX_EXACT, getItemDescriptor } from "../utils";
11
+ import { copyItemsNeedsTerminalCompletion, waitForEditOperationTerminal, } from "./waitForEditOperationTerminal";
11
12
  import { ExternalChangesWarningContent, TreeOperationConfirmContent, UndoDifferentItemContent, } from "./OperationDialogContent";
13
+ /** When true, the delete dialog shows "permanently delete (bypass recycle bin)". */
14
+ const ENABLE_HARD_DELETE_IN_DELETE_DIALOG = false;
12
15
  // Track pending suggested edit save requests to prevent race conditions
13
16
  const pendingSuggestedEditSaves = new Map();
14
17
  // Track pending suggested edits to prevent creating duplicates before server response
@@ -41,6 +44,10 @@ export function getOperationsContext(state, ui) {
41
44
  const [executingEditOperations, setExecutingEditOperations] = useState([]);
42
45
  const lastOp = useRef(undefined);
43
46
  const undoing = useRef(false);
47
+ // Track operation IDs that were successfully undone/redone but whose React state update
48
+ // hasn't been rendered yet. Cleared on each render (when stateRef.current is up-to-date).
49
+ const recentlyUndoneIds = useRef(new Set());
50
+ const recentlyRedoneIds = useRef(new Set());
44
51
  // Cache for field items (template field definitions) - these are static and don't change during editing
45
52
  // This prevents refetching on every keystroke since itemsRepository always refetches version 0
46
53
  const fieldItemsCache = useRef(new Map());
@@ -48,6 +55,10 @@ export function getOperationsContext(state, ui) {
48
55
  // Update ref synchronously during render (not via useEffect) to avoid stale state issues
49
56
  // This ensures stateRef.current always has the latest state when undo/redo is called
50
57
  stateRef.current = state;
58
+ // The render means React has processed pending state updates, so the editHistory in
59
+ // stateRef is now authoritative. Clear the recently-processed tracking sets.
60
+ recentlyUndoneIds.current.clear();
61
+ recentlyRedoneIds.current.clear();
51
62
  // Extract values to avoid state object reference issues
52
63
  const itemsRepository = stateRef.current.itemsRepository;
53
64
  // Debounced version of createOrUpdateSuggestedEdit to prevent excessive API calls
@@ -114,6 +125,22 @@ export function getOperationsContext(state, ui) {
114
125
  const result = await executeOp(op);
115
126
  return result;
116
127
  }, [executeOp]);
128
+ const updateRenderingParameters = useCallback(async (componentId, parameters) => {
129
+ const pageItem = stateRef.current.page?.item?.descriptor;
130
+ if (!pageItem) {
131
+ return;
132
+ }
133
+ const op = {
134
+ type: "update-rendering-parameters",
135
+ componentId,
136
+ parameters,
137
+ mainItem: pageItem,
138
+ date: new Date().toISOString(),
139
+ id: uuid(),
140
+ title: "Update rendering parameters",
141
+ };
142
+ await executeOp(op, { refresh: "immediate" });
143
+ }, [executeOp]);
117
144
  const handleResult = (result, options) => {
118
145
  if (handleErrorResult(result, ui, stateRef.current)) {
119
146
  return;
@@ -239,12 +266,28 @@ export function getOperationsContext(state, ui) {
239
266
  title: "Rename item",
240
267
  });
241
268
  stateRef.current.requestRefresh("immediate");
242
- // Only properties changed (name), not children
243
- // Await the refresh to ensure cache is updated and events are fired before returning
244
- await itemsRepository.refreshItems([item], {
269
+ // Only properties changed (name/path), not children.
270
+ // Refresh both the operation descriptor and (when applicable) the currently loaded
271
+ // descriptor to handle latest-version descriptor mismatches.
272
+ const currentLoadedItem = stateRef.current.item;
273
+ const descriptorsToRefresh = [item];
274
+ if (currentLoadedItem &&
275
+ currentLoadedItem.id === item.id &&
276
+ currentLoadedItem.language === item.language) {
277
+ descriptorsToRefresh.push(currentLoadedItem.descriptor);
278
+ }
279
+ // Await the refresh to ensure cache is updated and events are fired before returning.
280
+ await itemsRepository.refreshItems(descriptorsToRefresh, {
245
281
  properties: true,
246
282
  children: false,
247
283
  });
284
+ // If the renamed item is currently loaded, force a descriptor reload so
285
+ // UI panels (e.g. Item Info) don't remain one rename behind.
286
+ if (currentLoadedItem &&
287
+ currentLoadedItem.id === item.id &&
288
+ currentLoadedItem.language === item.language) {
289
+ await stateRef.current.loadItem(currentLoadedItem.descriptor);
290
+ }
248
291
  }, [itemsRepository, executeOp]);
249
292
  const lastEditField = useRef(undefined);
250
293
  const editField = useCallback(async ({ field, value, rawValue, refresh = "immediate", }) => {
@@ -451,6 +494,9 @@ export function getOperationsContext(state, ui) {
451
494
  // This ensures the UI only changes when the operation truly completes
452
495
  handleResult(result, { refresh: "immediate" });
453
496
  if (result.type === "success") {
497
+ for (const op of ops) {
498
+ recentlyUndoneIds.current.add(op.id);
499
+ }
454
500
  // Check if any operations are executing in background (long-running undo)
455
501
  const executingOps = result.data.filter((x) => x.executionStatus === "executing");
456
502
  if (executingOps.length > 0) {
@@ -494,12 +540,21 @@ export function getOperationsContext(state, ui) {
494
540
  }
495
541
  else {
496
542
  ui.showErrorToast({ summary: result.summary, details: result.details });
543
+ // Refresh history so toolbar state matches server (fixes inconsistent UI under load)
544
+ stateRef.current.refreshHistory?.(stateRef.current.historyMode, stateRef.current.showOnlyMyChanges);
497
545
  return false;
498
546
  }
499
547
  }, [ui, itemsRepository]);
500
548
  const undoOperations = useCallback(async (operationIds) => {
501
- if (undoing.current || !operationIds.length) {
549
+ if (!operationIds.length)
502
550
  return false;
551
+ if (undoing.current) {
552
+ const deadline = Date.now() + 5000;
553
+ while (undoing.current && Date.now() < deadline) {
554
+ await new Promise((r) => setTimeout(r, 50));
555
+ }
556
+ if (undoing.current)
557
+ return false;
503
558
  }
504
559
  undoing.current = true;
505
560
  try {
@@ -525,7 +580,12 @@ export function getOperationsContext(state, ui) {
525
580
  }, [executeUndoOperation]);
526
581
  const undo = useCallback(async (operationId) => {
527
582
  if (undoing.current) {
528
- return false;
583
+ const deadline = Date.now() + 5000;
584
+ while (undoing.current && Date.now() < deadline) {
585
+ await new Promise((r) => setTimeout(r, 50));
586
+ }
587
+ if (undoing.current)
588
+ return false;
529
589
  }
530
590
  undoing.current = true;
531
591
  try {
@@ -533,11 +593,27 @@ export function getOperationsContext(state, ui) {
533
593
  const filterBySession = stateRef.current.showOnlyMyChanges;
534
594
  const historyMode = stateRef.current.historyMode;
535
595
  let ops;
536
- // If a specific operationId is provided, use that operation directly
537
- // This ensures we undo the exact operation the UI showed, avoiding stale state issues
596
+ // If the caller supplied an operationId that was already undone in this session
597
+ // (React hasn't re-rendered yet, so the UI may hold a stale reference), discard it
598
+ // and fall through to the general selection logic below.
599
+ if (operationId && recentlyUndoneIds.current.has(operationId)) {
600
+ operationId = undefined;
601
+ }
602
+ // If a specific operationId is provided (from the UI), always honor it so the UI and
603
+ // server stay in sync under load. Use the op from history if present (for confirmations),
604
+ // otherwise call the API with just the id (server is source of truth).
538
605
  if (operationId) {
539
606
  const targetOp = stateRef.current.editHistory.find((x) => x.id === operationId && x.canUndo);
540
- ops = targetOp ? [targetOp] : [];
607
+ if (targetOp) {
608
+ ops = [targetOp];
609
+ }
610
+ else {
611
+ // Not in local state (e.g. history refreshed under load). Call API with this id
612
+ // so we don't silently do nothing; server will accept or return an error.
613
+ ops = [
614
+ { id: operationId, type: "unknown" },
615
+ ];
616
+ }
541
617
  }
542
618
  else {
543
619
  // Select undoable operations respecting showOnlyMyChanges and historyMode filters
@@ -545,6 +621,8 @@ export function getOperationsContext(state, ui) {
545
621
  .filter((x) => {
546
622
  if (!x.canUndo)
547
623
  return false;
624
+ if (recentlyUndoneIds.current.has(x.id))
625
+ return false;
548
626
  // Session filter (showOnlyMyChanges)
549
627
  if (filterBySession &&
550
628
  x.sessionId !== stateRef.current.sessionId) {
@@ -580,6 +658,10 @@ export function getOperationsContext(state, ui) {
580
658
  undoing.current = false;
581
659
  return false;
582
660
  }
661
+ // When we only have an id (op not in local history), skip confirmations and call API
662
+ if (firstOp.type === "unknown") {
663
+ return await executeUndoOperation(ops);
664
+ }
583
665
  // Check if this is a cross-session operation and show warning first
584
666
  const isCrossSession = firstOp.sessionId !== stateRef.current.sessionId;
585
667
  if (isCrossSession) {
@@ -740,6 +822,7 @@ export function getOperationsContext(state, ui) {
740
822
  // which merges server responses + websocket updates while enforcing scope filtering.
741
823
  handleResult(result, { refresh: "immediate" });
742
824
  if (result.type === "success") {
825
+ recentlyRedoneIds.current.add(op.id);
743
826
  // Check if the operation is executing in background (long-running redo)
744
827
  const executingOps = result.data.filter((x) => x.executionStatus === "executing");
745
828
  if (executingOps.length > 0) {
@@ -769,12 +852,19 @@ export function getOperationsContext(state, ui) {
769
852
  }
770
853
  else {
771
854
  ui.showErrorToast({ summary: result.summary, details: result.details });
855
+ stateRef.current.refreshHistory?.(stateRef.current.historyMode, stateRef.current.showOnlyMyChanges);
772
856
  return false;
773
857
  }
774
858
  }, [ui, itemsRepository]);
775
859
  const redo = useCallback(async (operationId) => {
776
- if (undoing.current)
777
- return false;
860
+ if (undoing.current) {
861
+ const deadline = Date.now() + 5000;
862
+ while (undoing.current && Date.now() < deadline) {
863
+ await new Promise((r) => setTimeout(r, 50));
864
+ }
865
+ if (undoing.current)
866
+ return false;
867
+ }
778
868
  undoing.current = true;
779
869
  try {
780
870
  const currentItem = stateRef.current.item?.descriptor;
@@ -783,16 +873,28 @@ export function getOperationsContext(state, ui) {
783
873
  const filterBySession = stateRef.current.showOnlyMyChanges;
784
874
  const historyMode = stateRef.current.historyMode;
785
875
  let op;
786
- // If a specific operationId is provided, use that operation directly
787
- // This ensures we redo the exact operation the UI showed, avoiding stale state issues
876
+ if (operationId && recentlyRedoneIds.current.has(operationId)) {
877
+ operationId = undefined;
878
+ }
879
+ // If a specific operationId is provided (from the UI), always honor it so the UI and
880
+ // server stay in sync under load. Use the op from history if present (for confirmations),
881
+ // otherwise call the API with just the id (server is source of truth).
788
882
  if (operationId) {
789
883
  op = stateRef.current.editHistory.find((x) => x.id === operationId && x.canRedo);
884
+ if (!op) {
885
+ op = {
886
+ id: operationId,
887
+ type: "unknown",
888
+ };
889
+ }
790
890
  }
791
891
  else {
792
892
  // Select redoable operations respecting showOnlyMyChanges and historyMode filters
793
893
  op = [...stateRef.current.editHistory].reverse().find((x) => {
794
894
  if (!x.canRedo)
795
895
  return false;
896
+ if (recentlyRedoneIds.current.has(x.id))
897
+ return false;
796
898
  // Session filter (showOnlyMyChanges)
797
899
  if (filterBySession && x.sessionId !== stateRef.current.sessionId) {
798
900
  return false;
@@ -819,6 +921,10 @@ export function getOperationsContext(state, ui) {
819
921
  }
820
922
  if (!op)
821
923
  return false;
924
+ // When we only have an id (op not in local history), skip confirmations and call API
925
+ if (op.type === "unknown") {
926
+ return await executeRedoOperation(op);
927
+ }
822
928
  // Check if this is a cross-session operation and show warning first
823
929
  const isCrossSession = op.sessionId !== stateRef.current.sessionId;
824
930
  if (isCrossSession) {
@@ -954,19 +1060,36 @@ export function getOperationsContext(state, ui) {
954
1060
  // Show confirmation dialog (with reference warning if applicable)
955
1061
  const result = await new Promise((resolve) => {
956
1062
  const undoCheckboxId = `delete-enable-undo-${Date.now()}`;
957
- const undoCheckbox = (_jsx("div", { className: "mt-4", children: _jsxs("label", { className: "flex cursor-pointer items-center gap-2", children: [_jsx("input", { type: "checkbox", id: undoCheckboxId, defaultChecked: true, className: "h-4 w-4 rounded border-gray-300" }), _jsx("span", { className: "text-sm", children: "Enable undo (serializes complete content)" })] }) }));
1063
+ const hardDeleteCheckboxId = `delete-hard-delete-${Date.now()}`;
1064
+ const deleteOptions = (_jsxs("div", { className: "mt-4 space-y-3", children: [ENABLE_HARD_DELETE_IN_DELETE_DIALOG ? (_jsx("div", { className: "rounded-md border border-red-200 bg-red-50/60 p-3", children: _jsxs("label", { className: "flex cursor-pointer items-start gap-2", children: [_jsx("input", { type: "checkbox", id: hardDeleteCheckboxId, "data-testid": "delete-hard-delete-checkbox", defaultChecked: options?.hardDelete ?? false, className: "mt-0.5 h-4 w-4 rounded border-gray-300" }), _jsxs("span", { className: "space-y-1", children: [_jsx("span", { className: "block text-sm font-medium text-red-900", children: "Permanently delete (bypass recycle bin)" }), _jsx("span", { className: "block text-xs text-red-800", children: "This skips the recycle bin. Items can only be restored if undo is enabled for this operation." })] })] }) })) : null, _jsxs("label", { className: "flex cursor-pointer items-center gap-2", children: [_jsx("input", { type: "checkbox", id: undoCheckboxId, "data-testid": "delete-enable-undo-checkbox", defaultChecked: options?.canUndo ?? true, className: "h-4 w-4 rounded border-gray-300" }), _jsx("span", { className: "text-sm", children: "Enable undo (serializes complete content)" })] })] }));
958
1065
  const getEnableUndo = () => {
959
1066
  const checkbox = document.getElementById(undoCheckboxId);
960
- return checkbox?.checked ?? true;
1067
+ return checkbox?.checked ?? options?.canUndo ?? true;
1068
+ };
1069
+ const getHardDelete = () => {
1070
+ if (!ENABLE_HARD_DELETE_IN_DELETE_DIALOG)
1071
+ return false;
1072
+ const checkbox = document.getElementById(hardDeleteCheckboxId);
1073
+ return checkbox?.checked ?? options?.hardDelete ?? false;
961
1074
  };
962
1075
  if (hasReferences) {
963
1076
  ui.confirmationDialogRef.current?.confirm({
964
1077
  header: "Delete Items with References",
965
- message: (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { children: "You are about to delete the following items which are referenced by other content:" }), _jsx(DeleteItemsWarning, { references: references }), _jsx("p", { className: "text-muted-foreground mt-4 text-sm", children: "Deleting these items may break links in your content. Are you sure you want to proceed?" }), undoCheckbox] })),
1078
+ message: (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { children: "You are about to delete the following items which are referenced by other content:" }), _jsx(DeleteItemsWarning, { references: references }), _jsx("p", { className: "text-muted-foreground mt-4 text-sm", children: "Deleting these items may break links in your content. Are you sure you want to proceed?" }), deleteOptions] })),
966
1079
  acceptLabel: "Delete Anyway",
967
1080
  rejectLabel: "Cancel",
968
- accept: () => resolve({ confirmed: true, enableUndo: getEnableUndo() }),
969
- reject: () => resolve({ confirmed: false, enableUndo: true }),
1081
+ accept: () => resolve({
1082
+ confirmed: true,
1083
+ enableUndo: getEnableUndo(),
1084
+ hardDelete: getHardDelete(),
1085
+ }),
1086
+ reject: () => resolve({
1087
+ confirmed: false,
1088
+ enableUndo: options?.canUndo ?? true,
1089
+ hardDelete: ENABLE_HARD_DELETE_IN_DELETE_DIALOG
1090
+ ? (options?.hardDelete ?? false)
1091
+ : false,
1092
+ }),
970
1093
  showCancel: false,
971
1094
  });
972
1095
  }
@@ -974,11 +1097,21 @@ export function getOperationsContext(state, ui) {
974
1097
  // No references - use simple confirmation
975
1098
  ui.confirmationDialogRef.current?.confirm({
976
1099
  header: "Delete Items",
977
- message: (_jsxs("div", { children: [_jsxs("p", { children: ["Are you sure you want to delete ", items.length === 1 ? "this item" : `these ${items.length} items`, "?"] }), undoCheckbox] })),
1100
+ message: (_jsxs("div", { children: [_jsxs("p", { children: ["Are you sure you want to delete", " ", _jsx("span", { className: "font-semibold", children: itemNames }), "?"] }), deleteOptions] })),
978
1101
  acceptLabel: "Delete",
979
1102
  rejectLabel: "Cancel",
980
- accept: () => resolve({ confirmed: true, enableUndo: getEnableUndo() }),
981
- reject: () => resolve({ confirmed: false, enableUndo: true }),
1103
+ accept: () => resolve({
1104
+ confirmed: true,
1105
+ enableUndo: getEnableUndo(),
1106
+ hardDelete: getHardDelete(),
1107
+ }),
1108
+ reject: () => resolve({
1109
+ confirmed: false,
1110
+ enableUndo: options?.canUndo ?? true,
1111
+ hardDelete: ENABLE_HARD_DELETE_IN_DELETE_DIALOG
1112
+ ? (options?.hardDelete ?? false)
1113
+ : false,
1114
+ }),
982
1115
  showCancel: false,
983
1116
  });
984
1117
  }
@@ -986,6 +1119,7 @@ export function getOperationsContext(state, ui) {
986
1119
  if (!result.confirmed)
987
1120
  return;
988
1121
  const canUndoValue = result.enableUndo;
1122
+ const hardDeleteValue = result.hardDelete;
989
1123
  const op = {
990
1124
  type: "delete-items",
991
1125
  items: items.map(getItemDescriptor),
@@ -993,8 +1127,9 @@ export function getOperationsContext(state, ui) {
993
1127
  getItemDescriptor(items[0]),
994
1128
  date: new Date().toISOString(),
995
1129
  id: uuid(),
996
- title: `Delete ${itemNames}`,
1130
+ title: `${hardDeleteValue ? "Hard delete" : "Delete"} ${itemNames}`,
997
1131
  canUndo: canUndoValue,
1132
+ hardDelete: hardDeleteValue,
998
1133
  };
999
1134
  const returnedOp = await executeOp(op);
1000
1135
  itemsRepository.onItemsDeleted(itemsToDelete.map((x) => ({
@@ -1002,6 +1137,7 @@ export function getOperationsContext(state, ui) {
1002
1137
  parentId: x.parentId,
1003
1138
  })));
1004
1139
  stateRef.current.requestRefresh("immediate");
1140
+ return true;
1005
1141
  }, [itemsRepository, executeOp, ui]);
1006
1142
  const moveItems = useCallback(async (items, target, index) => {
1007
1143
  // Use generic edit endpoint for long-running operation support
@@ -1077,9 +1213,17 @@ export function getOperationsContext(state, ui) {
1077
1213
  id: uuid(),
1078
1214
  title: `Copying ${items.length} item(s)...`,
1079
1215
  };
1080
- const result = await executeOp(op);
1216
+ let copyResult = (await executeOp(op));
1217
+ if (copyItemsNeedsTerminalCompletion(copyResult)) {
1218
+ try {
1219
+ const terminal = await waitForEditOperationTerminal(copyResult.id, 120_000);
1220
+ copyResult = { ...copyResult, ...terminal };
1221
+ }
1222
+ catch {
1223
+ return [];
1224
+ }
1225
+ }
1081
1226
  // Return created item descriptors from the operation result
1082
- const copyResult = result;
1083
1227
  if (copyResult?.createdItemIds) {
1084
1228
  return copyResult.createdItemIds.map((id) => ({
1085
1229
  id,
@@ -1103,17 +1247,29 @@ export function getOperationsContext(state, ui) {
1103
1247
  title: `Duplicating item...`,
1104
1248
  name, // Pass the user-provided name to the backend
1105
1249
  };
1106
- const result = await executeOp(op);
1107
- if (result.errorMessage) {
1250
+ let copyResult = (await executeOp(op));
1251
+ if (copyItemsNeedsTerminalCompletion(copyResult)) {
1252
+ try {
1253
+ const terminal = await waitForEditOperationTerminal(copyResult.id, 120_000);
1254
+ copyResult = { ...copyResult, ...terminal };
1255
+ }
1256
+ catch (e) {
1257
+ ui.showErrorToast({
1258
+ summary: "Duplicate failed",
1259
+ details: e?.message || "Operation timed out",
1260
+ });
1261
+ return;
1262
+ }
1263
+ }
1264
+ if (copyResult.errorMessage) {
1108
1265
  ui.showErrorToast({
1109
1266
  summary: "Duplicate failed",
1110
- details: result.errorMessage,
1267
+ details: copyResult.errorMessage,
1111
1268
  });
1112
1269
  return;
1113
1270
  }
1114
1271
  itemsRepository.refreshItems([target]);
1115
1272
  // Return created item descriptor from the operation result
1116
- const copyResult = result;
1117
1273
  if (copyResult?.createdItemIds?.length > 0) {
1118
1274
  return {
1119
1275
  id: copyResult.createdItemIds[0],
@@ -1123,6 +1279,12 @@ export function getOperationsContext(state, ui) {
1123
1279
  }
1124
1280
  return undefined;
1125
1281
  }, [executeOp, itemsRepository, ui]);
1282
+ const publishItem = useCallback(async (operation) => {
1283
+ const result = (await executeOp(operation, {
1284
+ refresh: "immediate",
1285
+ }));
1286
+ return result;
1287
+ }, [executeOp]);
1126
1288
  const onFieldBlur = useCallback(() => {
1127
1289
  // Reset the last operation to force creation of a new operation
1128
1290
  // when the user returns to edit any field after losing focus
@@ -1138,6 +1300,7 @@ export function getOperationsContext(state, ui) {
1138
1300
  unlockItems: unlockItemsAndRefresh,
1139
1301
  executeWorkflowCommand: executeWorkflowCommandAndRefresh,
1140
1302
  editField,
1303
+ updateRenderingParameters,
1141
1304
  undo,
1142
1305
  undoOperations,
1143
1306
  redo,
@@ -1147,6 +1310,7 @@ export function getOperationsContext(state, ui) {
1147
1310
  createItem,
1148
1311
  createVersion,
1149
1312
  removeVersion,
1313
+ publishItem,
1150
1314
  duplicateComponents,
1151
1315
  undoing: undoing.current,
1152
1316
  moveItems,
@@ -1160,6 +1324,7 @@ export function getOperationsContext(state, ui) {
1160
1324
  unlockItemsAndRefresh,
1161
1325
  executeWorkflowCommandAndRefresh,
1162
1326
  editField,
1327
+ updateRenderingParameters,
1163
1328
  undo,
1164
1329
  undoOperations,
1165
1330
  redo,
@@ -1169,6 +1334,7 @@ export function getOperationsContext(state, ui) {
1169
1334
  createItem,
1170
1335
  createVersion,
1171
1336
  removeVersion,
1337
+ publishItem,
1172
1338
  duplicateComponents,
1173
1339
  moveItems,
1174
1340
  mode,
@@ -1230,8 +1396,12 @@ async function getOrMergeSuggestedEditOp(field, rawValue, value, state) {
1230
1396
  pendingEdit.updatedBy = state.user?.name || "unknown";
1231
1397
  return pendingEdit;
1232
1398
  }
1399
+ const matchingSuggestions = state.suggestedEdits.filter((edit) => edit.mainItemId === page.item.descriptor.id &&
1400
+ edit.mainItemLanguage === page.item.descriptor.language &&
1401
+ edit.itemId === item.id &&
1402
+ edit.fieldId === field.fieldId);
1233
1403
  // Attempt to find an existing suggested edit by the same user for this field.
1234
- const existing = state.suggestedEdits.find((edit) => edit.mainItemId === page.item.descriptor.id &&
1404
+ const existing = matchingSuggestions.find((edit) => edit.mainItemId === page.item.descriptor.id &&
1235
1405
  edit.mainItemLanguage === page.item.descriptor.language &&
1236
1406
  edit.mainItemVersion === page.item.descriptor.version &&
1237
1407
  edit.itemId === item.id &&
@@ -1243,8 +1413,10 @@ async function getOrMergeSuggestedEditOp(field, rawValue, value, state) {
1243
1413
  existing.newValue = newVal || "";
1244
1414
  existing.updated = new Date().toISOString();
1245
1415
  existing.updatedBy = state.user?.name || "unknown";
1416
+ const nextSuggestedEdits = [...state.suggestedEdits];
1417
+ state.suggestedEdits = nextSuggestedEdits;
1246
1418
  // Optionally, you might update the comments or other fields.
1247
- state.setSuggestedEdits([...state.suggestedEdits]);
1419
+ state.setSuggestedEdits(nextSuggestedEdits);
1248
1420
  return existing;
1249
1421
  }
1250
1422
  else {
@@ -1262,12 +1434,18 @@ async function getOrMergeSuggestedEditOp(field, rawValue, value, state) {
1262
1434
  fieldId: field.fieldId,
1263
1435
  oldValue: fieldItem.rawValue || "",
1264
1436
  newValue: newVal || "",
1437
+ author: state.user?.name || "unknown",
1265
1438
  status: "pending",
1439
+ updatedBy: state.user?.name || "unknown",
1440
+ created: new Date().toISOString(),
1441
+ updated: new Date().toISOString(),
1266
1442
  type: "FieldValue",
1267
1443
  };
1268
1444
  // Add to pending edits to prevent race conditions
1269
1445
  pendingSuggestedEdits.set(fieldKey, newEdit);
1270
- state.setSuggestedEdits([...state.suggestedEdits, newEdit]);
1446
+ const nextSuggestedEdits = [...state.suggestedEdits, newEdit];
1447
+ state.suggestedEdits = nextSuggestedEdits;
1448
+ state.setSuggestedEdits(nextSuggestedEdits);
1271
1449
  return newEdit;
1272
1450
  }
1273
1451
  }