@parhelia/core 0.1.12601 → 0.1.12602

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 (584) hide show
  1. package/dist/agents-view/AgentCard.d.ts +4 -6
  2. package/dist/agents-view/AgentCard.js +24 -143
  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 +92 -7
  6. package/dist/agents-view/AgentsInbox.js.map +1 -1
  7. package/dist/agents-view/AgentsTitlebar.js +2 -3
  8. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  9. package/dist/agents-view/AgentsView.d.ts +7 -6
  10. package/dist/agents-view/AgentsView.js +99 -191
  11. package/dist/agents-view/AgentsView.js.map +1 -1
  12. package/dist/agents-view/AgentsWorkspaceView.d.ts +6 -2
  13. package/dist/agents-view/AgentsWorkspaceView.js +113 -266
  14. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.d.ts +1 -2
  16. package/dist/agents-view/ProfileAgentsGroup.js +3 -4
  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 +4 -2
  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 +10 -6
  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 +1 -4
  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 +4 -12
  37. package/dist/components/ui/context-menu.js.map +1 -1
  38. package/dist/components/ui/copy-button.d.ts +1 -2
  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 +126 -21
  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 +3 -5
  46. package/dist/components/ui/input.js.map +1 -1
  47. package/dist/components/ui/paste-button.d.ts +1 -2
  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 +9 -1
  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 +11 -4
  58. package/dist/components/ui/tabs.js.map +1 -1
  59. package/dist/config/config.d.ts +2 -4
  60. package/dist/config/config.js +70 -250
  61. package/dist/config/config.js.map +1 -1
  62. package/dist/config/types/workspace.d.ts +0 -6
  63. package/dist/config/types.d.ts +12 -63
  64. package/dist/config/types.js.map +1 -1
  65. package/dist/editor/ComponentInfo.d.ts +4 -0
  66. package/dist/editor/ComponentInfo.js +41 -0
  67. package/dist/editor/ComponentInfo.js.map +1 -0
  68. package/dist/editor/ConfirmationDialog.js +4 -20
  69. package/dist/editor/ConfirmationDialog.js.map +1 -1
  70. package/dist/editor/ContentTree.d.ts +1 -2
  71. package/dist/editor/ContentTree.js +32 -93
  72. package/dist/editor/ContentTree.js.map +1 -1
  73. package/dist/editor/Editor.js +22 -87
  74. package/dist/editor/Editor.js.map +1 -1
  75. package/dist/editor/FieldHistory.js +36 -84
  76. package/dist/editor/FieldHistory.js.map +1 -1
  77. package/dist/editor/FieldListField.js +9 -21
  78. package/dist/editor/FieldListField.js.map +1 -1
  79. package/dist/editor/FieldListFieldWithFallbacks.js +2 -23
  80. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
  81. package/dist/editor/GlobalMenuBar.js +2 -29
  82. package/dist/editor/GlobalMenuBar.js.map +1 -1
  83. package/dist/editor/ImageEditor.js +2 -5
  84. package/dist/editor/ImageEditor.js.map +1 -1
  85. package/dist/editor/ItemInfo.js +1 -36
  86. package/dist/editor/ItemInfo.js.map +1 -1
  87. package/dist/editor/LinkEditorDialog.js +0 -3
  88. package/dist/editor/LinkEditorDialog.js.map +1 -1
  89. package/dist/editor/MainLayout.d.ts +2 -0
  90. package/dist/editor/MainLayout.js +8 -65
  91. package/dist/editor/MainLayout.js.map +1 -1
  92. package/dist/editor/MigrationsView.js +5 -29
  93. package/dist/editor/MigrationsView.js.map +1 -1
  94. package/dist/editor/MobileLayout.js +12 -37
  95. package/dist/editor/MobileLayout.js.map +1 -1
  96. package/dist/editor/PictureCropper.js +45 -54
  97. package/dist/editor/PictureCropper.js.map +1 -1
  98. package/dist/editor/PictureEditor.js +15 -17
  99. package/dist/editor/PictureEditor.js.map +1 -1
  100. package/dist/editor/QuickItemSwitcher.js +63 -37
  101. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  102. package/dist/editor/SetupWizard.js +12 -52
  103. package/dist/editor/SetupWizard.js.map +1 -1
  104. package/dist/editor/Titlebar.js +2 -7
  105. package/dist/editor/Titlebar.js.map +1 -1
  106. package/dist/editor/ai/AgentCostDisplay.d.ts +0 -1
  107. package/dist/editor/ai/AgentCostDisplay.js +1 -1
  108. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  109. package/dist/editor/ai/AgentDocumentList.js +14 -32
  110. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  111. package/dist/editor/ai/AgentGreeting.js +5 -6
  112. package/dist/editor/ai/AgentGreeting.js.map +1 -1
  113. package/dist/editor/ai/AgentProfileSelector.js +1 -2
  114. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  115. package/dist/editor/ai/AgentStatusBadge.d.ts +5 -0
  116. package/dist/editor/ai/AgentStatusBadge.js +65 -67
  117. package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
  118. package/dist/editor/ai/AgentTerminal.d.ts +2 -14
  119. package/dist/editor/ai/AgentTerminal.js +572 -2508
  120. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  121. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +4 -9
  122. package/dist/editor/ai/AgentTerminalStatusBar.js +56 -481
  123. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  124. package/dist/editor/ai/Agents.js +113 -161
  125. package/dist/editor/ai/Agents.js.map +1 -1
  126. package/dist/editor/ai/AiResponseMessage.d.ts +1 -10
  127. package/dist/editor/ai/AiResponseMessage.js +26 -267
  128. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  129. package/dist/editor/ai/ContextInfoBar.d.ts +3 -2
  130. package/dist/editor/ai/ContextInfoBar.js +7 -64
  131. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  132. package/dist/editor/ai/EditOperationsPanel.d.ts +2 -3
  133. package/dist/editor/ai/EditOperationsPanel.js +78 -21
  134. package/dist/editor/ai/EditOperationsPanel.js.map +1 -1
  135. package/dist/editor/ai/GuidanceOverlay.js +11 -17
  136. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  137. package/dist/editor/ai/HelpTerminal.d.ts +5 -0
  138. package/dist/editor/ai/HelpTerminal.js +166 -0
  139. package/dist/editor/ai/HelpTerminal.js.map +1 -0
  140. package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
  141. package/dist/editor/ai/InlineAiDialog.js +192 -514
  142. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  143. package/dist/editor/ai/InlineAiTrigger.js +12 -115
  144. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  145. package/dist/editor/ai/MediaImage.js +8 -40
  146. package/dist/editor/ai/MediaImage.js.map +1 -1
  147. package/dist/editor/ai/SpawnedAgentsPanel.js +12 -10
  148. package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
  149. package/dist/editor/ai/ToolCallDisplay.d.ts +2 -22
  150. package/dist/editor/ai/ToolCallDisplay.js +202 -614
  151. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  152. package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +8 -1
  153. package/dist/editor/ai/dialogs/AgentDialogHandler.js +42 -379
  154. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  155. package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +1 -5
  156. package/dist/editor/ai/dialogs/QuestionnaireInline.js +60 -628
  157. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  158. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +0 -117
  159. package/dist/editor/ai/dialogs/agentDialogTypes.js +0 -2
  160. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  161. package/dist/editor/ai/types.d.ts +1 -3
  162. package/dist/editor/ai/useAgentStatus.d.ts +1 -2
  163. package/dist/editor/ai/useAgentStatus.js +100 -90
  164. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  165. package/dist/editor/ai/useInlineAiPosition.js +5 -45
  166. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  167. package/dist/editor/client/AboutDialog.js +2 -4
  168. package/dist/editor/client/AboutDialog.js.map +1 -1
  169. package/dist/editor/client/EditorShell.d.ts +1 -4
  170. package/dist/editor/client/EditorShell.js +258 -853
  171. package/dist/editor/client/EditorShell.js.map +1 -1
  172. package/dist/editor/client/editContext.d.ts +19 -33
  173. package/dist/editor/client/editContext.js.map +1 -1
  174. package/dist/editor/client/helpers.js +0 -6
  175. package/dist/editor/client/helpers.js.map +1 -1
  176. package/dist/editor/client/hooks/useEditorUrlSync.js +2 -1
  177. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
  178. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +0 -10
  179. package/dist/editor/client/hooks/useEditorWebSocket.js +14 -209
  180. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  181. package/dist/editor/client/hooks/useQuota.d.ts +0 -8
  182. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  183. package/dist/editor/client/hooks/useSocketMessageHandler.js +15 -73
  184. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  185. package/dist/editor/client/itemsRepository.js +6 -10
  186. package/dist/editor/client/itemsRepository.js.map +1 -1
  187. package/dist/editor/client/operations.d.ts +3 -6
  188. package/dist/editor/client/operations.js +30 -208
  189. package/dist/editor/client/operations.js.map +1 -1
  190. package/dist/editor/client/pageModelBuilder.js +31 -4
  191. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  192. package/dist/editor/client/ui/DevModeIndicator.js +2 -2
  193. package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
  194. package/dist/editor/client/ui/EditorChrome.d.ts +6 -0
  195. package/dist/editor/client/ui/EditorChrome.js +72 -55
  196. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  197. package/dist/editor/client/ui/FullscreenControls.js +3 -5
  198. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  199. package/dist/editor/commands/commands.d.ts +1 -11
  200. package/dist/editor/commands/commands.js +1 -12
  201. package/dist/editor/commands/commands.js.map +1 -1
  202. package/dist/editor/commands/componentCommands.js +55 -109
  203. package/dist/editor/commands/componentCommands.js.map +1 -1
  204. package/dist/editor/commands/customCommandConverter.d.ts +1 -8
  205. package/dist/editor/commands/customCommandConverter.js +5 -35
  206. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  207. package/dist/editor/commands/handlers/agentHandler.js +1 -2
  208. package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
  209. package/dist/editor/commands/itemCommands.d.ts +0 -3
  210. package/dist/editor/commands/itemCommands.js +10 -93
  211. package/dist/editor/commands/itemCommands.js.map +1 -1
  212. package/dist/editor/commands/undo.d.ts +15 -9
  213. package/dist/editor/commands/undo.js +0 -24
  214. package/dist/editor/commands/undo.js.map +1 -1
  215. package/dist/editor/context-menu/InsertMenu.js +39 -83
  216. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  217. package/dist/editor/field-types/MultiLineText.js +1 -1
  218. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  219. package/dist/editor/field-types/RawEditor.js +1 -1
  220. package/dist/editor/field-types/ReactQuill.d.ts +125 -0
  221. package/dist/editor/field-types/ReactQuill.js +385 -0
  222. package/dist/editor/field-types/ReactQuill.js.map +1 -0
  223. package/dist/editor/field-types/RichTextEditor.js +5 -13
  224. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  225. package/dist/editor/field-types/RichTextEditorComponent.js +3 -37
  226. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  227. package/dist/editor/field-types/SingleLineText.js +1 -1
  228. package/dist/editor/field-types/TreeListEditor.js +2 -3
  229. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  230. package/dist/editor/field-types/richtext/components/ReactSlate.css +5 -23
  231. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +0 -2
  232. package/dist/editor/field-types/richtext/components/ReactSlate.js +4 -28
  233. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  234. package/dist/editor/field-types/richtext/components/ToolbarButton.js +2 -4
  235. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  236. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +0 -13
  237. package/dist/editor/field-types/richtext/contextMenuFactory.js +24 -181
  238. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  239. package/dist/editor/field-types/richtext/types.d.ts +0 -2
  240. package/dist/editor/field-types/richtext/types.js.map +1 -1
  241. package/dist/editor/field-types/richtext/utils/plugins.js +0 -4
  242. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  243. package/dist/editor/field-types/textContextMenuFactory.js +2 -3
  244. package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
  245. package/dist/editor/media-selector/AiImageSearchPrompt.js +2 -4
  246. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
  247. package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
  248. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  249. package/dist/editor/media-selector/MediaSelector.js +1 -7
  250. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  251. package/dist/editor/media-selector/TreeSelector.js +35 -40
  252. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  253. package/dist/editor/menubar/ActiveUsers.js +1 -1
  254. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  255. package/dist/editor/menubar/GenericToolbar.js +2 -4
  256. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  257. package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
  258. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  259. package/dist/editor/menubar/PageSelector.js +147 -26
  260. package/dist/editor/menubar/PageSelector.js.map +1 -1
  261. package/dist/editor/menubar/Separator.js +1 -1
  262. package/dist/editor/menubar/VersionSelector.js +4 -2
  263. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  264. package/dist/editor/menubar/WorkflowButton.js +12 -39
  265. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  266. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +38 -16
  267. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
  268. package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
  269. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  270. package/dist/editor/menubar/toolbar-sections/HelpButton.js +0 -1
  271. package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
  272. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -6
  273. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +220 -597
  274. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  275. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +2 -13
  276. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  277. package/dist/editor/page-editor-chrome/CommentHighlighting.js +1 -42
  278. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
  279. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  280. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  281. package/dist/editor/page-editor-chrome/InlineEditor.js +48 -97
  282. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  283. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +17 -38
  284. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  285. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +11 -17
  286. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  287. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
  288. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  289. package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
  290. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  291. package/dist/editor/page-viewer/EditorForm.js +11 -69
  292. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  293. package/dist/editor/page-viewer/MiniMap.d.ts +4 -2
  294. package/dist/editor/page-viewer/MiniMap.js +28 -91
  295. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  296. package/dist/editor/page-viewer/PageViewer.d.ts +1 -3
  297. package/dist/editor/page-viewer/PageViewer.js +19 -92
  298. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  299. package/dist/editor/page-viewer/PageViewerFrame.d.ts +1 -2
  300. package/dist/editor/page-viewer/PageViewerFrame.js +115 -348
  301. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  302. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +49 -114
  303. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  304. package/dist/editor/page-viewer/pageViewContext.d.ts +0 -1
  305. package/dist/editor/page-viewer/pageViewContext.js +14 -51
  306. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  307. package/dist/editor/pageModel.d.ts +1 -14
  308. package/dist/editor/reviews/Comment.d.ts +1 -2
  309. package/dist/editor/reviews/Comment.js +15 -92
  310. package/dist/editor/reviews/Comment.js.map +1 -1
  311. package/dist/editor/reviews/CommentDisplayPopover.js +5 -70
  312. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  313. package/dist/editor/reviews/CommentView.d.ts +1 -3
  314. package/dist/editor/reviews/CommentView.js +6 -26
  315. package/dist/editor/reviews/CommentView.js.map +1 -1
  316. package/dist/editor/reviews/Comments.js +75 -140
  317. package/dist/editor/reviews/Comments.js.map +1 -1
  318. package/dist/editor/reviews/CreateReviewDialog.js +177 -281
  319. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  320. package/dist/editor/reviews/DecisionsMatrix.js +25 -96
  321. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  322. package/dist/editor/reviews/DiffView.js +14 -7
  323. package/dist/editor/reviews/DiffView.js.map +1 -1
  324. package/dist/editor/reviews/EditReviewSettingsDialog.js +4 -6
  325. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  326. package/dist/editor/reviews/MultiReviewManager.js +3 -25
  327. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  328. package/dist/editor/reviews/PagesPanel.js +15 -31
  329. package/dist/editor/reviews/PagesPanel.js.map +1 -1
  330. package/dist/editor/reviews/PreviewInfo.js +4 -1
  331. package/dist/editor/reviews/PreviewInfo.js.map +1 -1
  332. package/dist/editor/reviews/ReviewCard.js +7 -13
  333. package/dist/editor/reviews/ReviewCard.js.map +1 -1
  334. package/dist/editor/reviews/ReviewDetail.js +2 -3
  335. package/dist/editor/reviews/ReviewDetail.js.map +1 -1
  336. package/dist/editor/reviews/ReviewsList.js +3 -7
  337. package/dist/editor/reviews/ReviewsList.js.map +1 -1
  338. package/dist/editor/reviews/SuggestedEdit.js +3 -34
  339. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  340. package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -31
  341. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  342. package/dist/editor/reviews/commentAi.js +6 -25
  343. package/dist/editor/reviews/commentAi.js.map +1 -1
  344. package/dist/editor/reviews/reviewCommands.js +1 -4
  345. package/dist/editor/reviews/reviewCommands.js.map +1 -1
  346. package/dist/editor/reviews/useMultiReview.js +2 -2
  347. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  348. package/dist/editor/reviews/useReviews.d.ts +3 -4
  349. package/dist/editor/reviews/useReviews.js +32 -21
  350. package/dist/editor/reviews/useReviews.js.map +1 -1
  351. package/dist/editor/services/agentService.d.ts +5 -240
  352. package/dist/editor/services/agentService.js +39 -299
  353. package/dist/editor/services/agentService.js.map +1 -1
  354. package/dist/editor/services/aiService.d.ts +1 -57
  355. package/dist/editor/services/aiService.js +6 -79
  356. package/dist/editor/services/aiService.js.map +1 -1
  357. package/dist/editor/services/contentService.d.ts +3 -6
  358. package/dist/editor/services/contentService.js +12 -13
  359. package/dist/editor/services/contentService.js.map +1 -1
  360. package/dist/editor/services/editService.d.ts +1 -52
  361. package/dist/editor/services/editService.js +2 -94
  362. package/dist/editor/services/editService.js.map +1 -1
  363. package/dist/editor/services/indexService.js +1 -1
  364. package/dist/editor/services/indexService.js.map +1 -1
  365. package/dist/editor/services/reviewsService.d.ts +6 -3
  366. package/dist/editor/services/reviewsService.js +11 -2
  367. package/dist/editor/services/reviewsService.js.map +1 -1
  368. package/dist/editor/services/serviceHelper.d.ts +1 -2
  369. package/dist/editor/services/serviceHelper.js +20 -112
  370. package/dist/editor/services/serviceHelper.js.map +1 -1
  371. package/dist/editor/services/systemService.d.ts +1 -2
  372. package/dist/editor/services/systemService.js +0 -3
  373. package/dist/editor/services/systemService.js.map +1 -1
  374. package/dist/editor/services-server/api.d.ts +2 -1
  375. package/dist/editor/services-server/api.js +6 -11
  376. package/dist/editor/services-server/api.js.map +1 -1
  377. package/dist/editor/services-server/graphQL.d.ts +29 -0
  378. package/dist/editor/services-server/graphQL.js +53 -0
  379. package/dist/editor/services-server/graphQL.js.map +1 -0
  380. package/dist/editor/settings/About.js +3 -317
  381. package/dist/editor/settings/About.js.map +1 -1
  382. package/dist/editor/settings/AllAgentsPanel.d.ts +5 -0
  383. package/dist/editor/settings/AllAgentsPanel.js +139 -0
  384. package/dist/editor/settings/AllAgentsPanel.js.map +1 -0
  385. package/dist/editor/settings/IndexOverview.js +1 -3
  386. package/dist/editor/settings/IndexOverview.js.map +1 -1
  387. package/dist/editor/settings/LatestFeedback.d.ts +1 -0
  388. package/dist/editor/settings/LatestFeedback.js +136 -0
  389. package/dist/editor/settings/LatestFeedback.js.map +1 -0
  390. package/dist/editor/settings/QuotaInfo.js +4 -210
  391. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  392. package/dist/editor/settings/SettingsView.js +23 -25
  393. package/dist/editor/settings/SettingsView.js.map +1 -1
  394. package/dist/editor/settings/Setup.d.ts +1 -0
  395. package/dist/editor/settings/Setup.js +211 -0
  396. package/dist/editor/settings/Setup.js.map +1 -0
  397. package/dist/editor/settings/Status.js +6 -7
  398. package/dist/editor/settings/Status.js.map +1 -1
  399. package/dist/editor/settings/index/useIndexStatus.js +22 -23
  400. package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
  401. package/dist/editor/settings/panels/AgentsPanel.d.ts +4 -0
  402. package/dist/editor/settings/panels/AgentsPanel.js +121 -95
  403. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  404. package/dist/editor/settings/panels/DatabasePanel.d.ts +6 -0
  405. package/dist/editor/settings/panels/DatabasePanel.js +50 -0
  406. package/dist/editor/settings/panels/DatabasePanel.js.map +1 -0
  407. package/dist/editor/settings/panels/ModelsPanel.js +108 -324
  408. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  409. package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
  410. package/dist/editor/settings/panels/ProvidersPanel.js +59 -86
  411. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  412. package/dist/editor/settings/panels/SearchConfigPanel.js +6 -67
  413. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  414. package/dist/editor/settings/panels/StatusPanel.js +2 -7
  415. package/dist/editor/settings/panels/StatusPanel.js.map +1 -1
  416. package/dist/editor/settings/panels/index.d.ts +2 -3
  417. package/dist/editor/settings/panels/index.js +2 -3
  418. package/dist/editor/settings/panels/index.js.map +1 -1
  419. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
  420. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
  421. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
  422. package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +2 -0
  423. package/dist/editor/settings/setup-steps/AiSetupStep/index.js +21 -0
  424. package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +1 -0
  425. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
  426. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
  427. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
  428. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
  429. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
  430. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
  431. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
  432. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
  433. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
  434. package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +1 -0
  435. package/dist/editor/settings/setup-steps/AiSetupStep/types.js +2 -0
  436. package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +1 -0
  437. package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +5 -0
  438. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +44 -0
  439. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +1 -0
  440. package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +2 -0
  441. package/dist/editor/settings/setup-steps/IndexSetupStep.js +36 -0
  442. package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +1 -0
  443. package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +2 -0
  444. package/dist/editor/settings/setup-steps/SettingsSetupStep.js +111 -0
  445. package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +1 -0
  446. package/dist/editor/settings/setup-steps/SetupOverview.d.ts +14 -0
  447. package/dist/editor/settings/setup-steps/SetupOverview.js +38 -0
  448. package/dist/editor/settings/setup-steps/SetupOverview.js.map +1 -0
  449. package/dist/editor/settings/status/coreStatusChecks.js +19 -124
  450. package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
  451. package/dist/editor/settings/status/useStartupChecks.d.ts +1 -3
  452. package/dist/editor/settings/status/useStartupChecks.js +5 -9
  453. package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
  454. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +1 -2
  455. package/dist/editor/setup-wizard/steps/CompleteStep.js +1 -2
  456. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  457. package/dist/editor/sidebar/ComponentPalette.js +1 -2
  458. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  459. package/dist/editor/sidebar/ComponentTree.d.ts +1 -8
  460. package/dist/editor/sidebar/ComponentTree.js +69 -216
  461. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  462. package/dist/editor/sidebar/Debug.d.ts +1 -0
  463. package/dist/editor/sidebar/Debug.js +70 -0
  464. package/dist/editor/sidebar/Debug.js.map +1 -0
  465. package/dist/editor/sidebar/EditHistory.js +46 -22
  466. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  467. package/dist/editor/sidebar/Favorites.js +8 -4
  468. package/dist/editor/sidebar/Favorites.js.map +1 -1
  469. package/dist/editor/sidebar/GraphQL.d.ts +2 -0
  470. package/dist/editor/sidebar/GraphQL.js +234 -0
  471. package/dist/editor/sidebar/GraphQL.js.map +1 -0
  472. package/dist/editor/sidebar/LeftToolbar.d.ts +1 -0
  473. package/dist/editor/sidebar/LeftToolbar.js +12 -0
  474. package/dist/editor/sidebar/LeftToolbar.js.map +1 -0
  475. package/dist/editor/sidebar/MainContentTree.js +3 -4
  476. package/dist/editor/sidebar/MainContentTree.js.map +1 -1
  477. package/dist/editor/sidebar/NavigationSidebar.d.ts +4 -0
  478. package/dist/editor/sidebar/NavigationSidebar.js +254 -0
  479. package/dist/editor/sidebar/NavigationSidebar.js.map +1 -0
  480. package/dist/editor/sidebar/OperationItem.js +7 -21
  481. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  482. package/dist/editor/sidebar/SidebarPanel.d.ts +1 -3
  483. package/dist/editor/sidebar/SidebarPanel.js +12 -44
  484. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  485. package/dist/editor/sidebar/SidebarStack.d.ts +1 -2
  486. package/dist/editor/sidebar/SidebarStack.js +3 -4
  487. package/dist/editor/sidebar/SidebarStack.js.map +1 -1
  488. package/dist/editor/sidebar/Validation.js +12 -24
  489. package/dist/editor/sidebar/Validation.js.map +1 -1
  490. package/dist/editor/sidebar/Workbox.js +3 -53
  491. package/dist/editor/sidebar/Workbox.js.map +1 -1
  492. package/dist/editor/sidebar/WorkspaceRail.d.ts +1 -0
  493. package/dist/editor/sidebar/WorkspaceRail.js +167 -56
  494. package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
  495. package/dist/editor/tree-indicators/GutterColumns.d.ts +1 -3
  496. package/dist/editor/tree-indicators/GutterColumns.js +5 -26
  497. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  498. package/dist/editor/tree-indicators/GutterContext.d.ts +0 -4
  499. package/dist/editor/tree-indicators/GutterContext.js +0 -23
  500. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  501. package/dist/editor/tree-indicators/GutterSelector.d.ts +5 -0
  502. package/dist/editor/tree-indicators/GutterSelector.js +91 -0
  503. package/dist/editor/tree-indicators/GutterSelector.js.map +1 -0
  504. package/dist/editor/tree-indicators/index.d.ts +1 -0
  505. package/dist/editor/tree-indicators/index.js +1 -0
  506. package/dist/editor/tree-indicators/index.js.map +1 -1
  507. package/dist/editor/tree-indicators/types.d.ts +1 -12
  508. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
  509. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
  510. package/dist/editor/ui/Icons.js +1 -1
  511. package/dist/editor/ui/Icons.js.map +1 -1
  512. package/dist/editor/ui/ItemNameDialogNew.d.ts +0 -2
  513. package/dist/editor/ui/ItemNameDialogNew.js +17 -33
  514. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  515. package/dist/editor/ui/ItemSearch.js +11 -7
  516. package/dist/editor/ui/ItemSearch.js.map +1 -1
  517. package/dist/editor/ui/SimpleIconButton.js +1 -1
  518. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  519. package/dist/editor/ui/SimpleTabs.d.ts +0 -1
  520. package/dist/editor/ui/SimpleTabs.js +25 -45
  521. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  522. package/dist/editor/ui/Splitter.d.ts +0 -1
  523. package/dist/editor/ui/Splitter.js +86 -102
  524. package/dist/editor/ui/Splitter.js.map +1 -1
  525. package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
  526. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
  527. package/dist/editor/ui/TreeListSelector.d.ts +1 -6
  528. package/dist/editor/ui/TreeListSelector.js +2 -2
  529. package/dist/editor/ui/TreeListSelector.js.map +1 -1
  530. package/dist/editor/utils/keyboardNavigation.d.ts +20 -6
  531. package/dist/editor/utils/keyboardNavigation.js +140 -48
  532. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  533. package/dist/editor/utils.js +9 -19
  534. package/dist/editor/utils.js.map +1 -1
  535. package/dist/editor/views/CompareView.d.ts +1 -3
  536. package/dist/editor/views/CompareView.js +5 -7
  537. package/dist/editor/views/CompareView.js.map +1 -1
  538. package/dist/editor/views/EditView.js +1 -1
  539. package/dist/editor/views/EditView.js.map +1 -1
  540. package/dist/editor/views/EditorSlot.js +34 -27
  541. package/dist/editor/views/EditorSlot.js.map +1 -1
  542. package/dist/editor/views/ItemEditor.js +3 -7
  543. package/dist/editor/views/ItemEditor.js.map +1 -1
  544. package/dist/editor/views/MediaFolderEditView.js +1 -1
  545. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  546. package/dist/editor/views/ParheliaView.js +6 -5
  547. package/dist/editor/views/ParheliaView.js.map +1 -1
  548. package/dist/editor/views/SingleEditView.d.ts +1 -2
  549. package/dist/editor/views/SingleEditView.js +8 -10
  550. package/dist/editor/views/SingleEditView.js.map +1 -1
  551. package/dist/editor/views/editorSlotContext.js +6 -35
  552. package/dist/editor/views/editorSlotContext.js.map +1 -1
  553. package/dist/index.d.ts +2 -16
  554. package/dist/index.js +0 -11
  555. package/dist/index.js.map +1 -1
  556. package/dist/revision.d.ts +2 -2
  557. package/dist/revision.js +2 -2
  558. package/dist/setup/services/setupWizardService.d.ts +14 -48
  559. package/dist/setup/services/setupWizardService.js +17 -52
  560. package/dist/setup/services/setupWizardService.js.map +1 -1
  561. package/dist/setup/wizard/steps/AddModelDialog.js +3 -12
  562. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  563. package/dist/setup/wizard/steps/ImportModelDialog.js +22 -46
  564. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  565. package/dist/splash-screen/ModernSplashScreen.js +32 -112
  566. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  567. package/dist/splash-screen/NewPage.js +50 -33
  568. package/dist/splash-screen/NewPage.js.map +1 -1
  569. package/dist/splash-screen/OpenPage.js +6 -2
  570. package/dist/splash-screen/OpenPage.js.map +1 -1
  571. package/dist/splash-screen/ParheliaAssistantChat.js +29 -12
  572. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  573. package/dist/splash-screen/ParheliaLogo.js +37 -87
  574. package/dist/splash-screen/ParheliaLogo.js.map +1 -1
  575. package/dist/splash-screen/RecentPages.js +3 -3
  576. package/dist/splash-screen/RecentPages.js.map +1 -1
  577. package/dist/tour/Tour.d.ts +1 -2
  578. package/dist/tour/Tour.js +75 -256
  579. package/dist/tour/Tour.js.map +1 -1
  580. package/dist/tour/default-tour.js +96 -222
  581. package/dist/tour/default-tour.js.map +1 -1
  582. package/dist/types.d.ts +29 -70
  583. package/package.json +15 -19
  584. package/styles.css +10 -39
@@ -1,13 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState, useMemo, memo, useEffect, useRef } from "react";
3
3
  import { JsonView, defaultStyles } from "react-json-view-lite";
4
4
  import "react-json-view-lite/dist/index.css";
5
5
  import { Spinner } from "../ui/Spinner";
6
6
  import { Button } from "../../components/ui/button";
7
7
  import { CopyButton } from "../../components/ui/copy-button";
8
- import { Tooltip, TooltipTrigger, TooltipContent, } from "../../components/ui/tooltip";
9
- import { approveToolCall, approveToolCalls, createOperationAllowance, rejectToolCall, updateAgentSettings, } from "../services/agentService";
10
- import { formatTime } from "../utils";
8
+ import { approveToolCall, rejectToolCall, updateAgentSettings } from "../services/agentService";
11
9
  // Custom dark theme styles for JSON view
12
10
  const darkJsonStyles = {
13
11
  ...defaultStyles,
@@ -31,7 +29,7 @@ const JsonLightThemeStyles = () => (_jsx("style", { children: `
31
29
  .dark-json-null { color: #dc2626; }
32
30
  .dark-json-undefined { color: #dc2626; }
33
31
  ` }));
34
- import { FileText, Search, Code, FolderOpen, FileSearch, Trash2, Globe, Brain, CheckSquare, Edit, FileEdit, Wrench, ChevronDown, ChevronRight, Check, X, ShieldCheck, } from "lucide-react";
32
+ import { FileText, Search, Code, FolderOpen, FileSearch, Trash2, Globe, Brain, CheckSquare, Edit, FileEdit, Wrench, ChevronDown, ChevronRight, } from "lucide-react";
35
33
  // Function to get the appropriate icon for each tool
36
34
  const getToolIcon = (toolName) => {
37
35
  const iconMap = {
@@ -51,7 +49,7 @@ const getToolIcon = (toolName) => {
51
49
  "remove-component": _jsx(Trash2, { strokeWidth: 1, size: 14 }),
52
50
  "move-components": _jsx(Edit, { strokeWidth: 1, size: 14 }),
53
51
  "get-placeholders": _jsx(Code, { strokeWidth: 1, size: 14 }),
54
- "get-component-schema-with-placeholders": _jsx(Code, { strokeWidth: 1, size: 14 }),
52
+ "get-component-props-and-placeholders": _jsx(Code, { strokeWidth: 1, size: 14 }),
55
53
  // Search operations
56
54
  "search-content": _jsx(Search, { strokeWidth: 1, size: 14 }),
57
55
  "search-images": _jsx(FileSearch, { strokeWidth: 1, size: 14 }),
@@ -70,45 +68,6 @@ const getToolIcon = (toolName) => {
70
68
  };
71
69
  return iconMap[toolName] || iconMap.default;
72
70
  };
73
- const formatToolDuration = (durationMs) => {
74
- if (typeof durationMs !== "number" ||
75
- !Number.isFinite(durationMs) ||
76
- durationMs < 0) {
77
- return null;
78
- }
79
- if (durationMs < 1000) {
80
- return `${Math.round(durationMs)}ms`;
81
- }
82
- if (durationMs < 10_000) {
83
- return `${(durationMs / 1000).toFixed(1)}s`;
84
- }
85
- if (durationMs < 60_000) {
86
- return `${Math.round(durationMs / 1000)}s`;
87
- }
88
- const totalSeconds = Math.round(durationMs / 1000);
89
- const minutes = Math.floor(totalSeconds / 60);
90
- const seconds = totalSeconds % 60;
91
- if (minutes < 60) {
92
- return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
93
- }
94
- const hours = Math.floor(minutes / 60);
95
- const remainingMinutes = minutes % 60;
96
- return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;
97
- };
98
- const formatToolCallMeta = (createdDate, durationMs) => {
99
- const parts = [];
100
- if (createdDate) {
101
- const parsed = new Date(createdDate);
102
- if (!Number.isNaN(parsed.getTime())) {
103
- parts.push(formatTime(parsed));
104
- }
105
- }
106
- const duration = formatToolDuration(durationMs);
107
- if (duration) {
108
- parts.push(duration);
109
- }
110
- return parts.length > 0 ? parts.join(" • ") : null;
111
- };
112
71
  // Helper function to normalize tool calls to a common format
113
72
  const normalizeToolCall = (toolCall) => {
114
73
  if ("functionName" in toolCall) {
@@ -119,14 +78,10 @@ const normalizeToolCall = (toolCall) => {
119
78
  function: {
120
79
  name: toolCall.functionName,
121
80
  arguments: toolCall.functionArguments,
122
- result: toolCall.functionResultRichContent || toolCall.functionResult,
81
+ result: toolCall.functionResult,
123
82
  error: toolCall.functionError,
124
83
  },
125
84
  requiresApproval: toolCall.requiresApproval,
126
- isPruned: toolCall.isPruned,
127
- prunedAt: toolCall.prunedAt,
128
- responseTimeMs: toolCall.responseTimeMs,
129
- createdDate: toolCall.createdDate,
130
85
  };
131
86
  }
132
87
  // Already in base format
@@ -178,129 +133,6 @@ const parseJsonString = (json) => {
178
133
  }
179
134
  }
180
135
  };
181
- const isImageDataUrl = (value) => {
182
- return typeof value === "string" && /^data:image\//i.test(value.trim());
183
- };
184
- const getInlineImageSource = (value) => {
185
- if (isImageDataUrl(value)) {
186
- return value.trim();
187
- }
188
- if (!value || typeof value !== "object") {
189
- return null;
190
- }
191
- const candidate = value;
192
- if (isImageDataUrl(candidate.dataUrl)) {
193
- return candidate.dataUrl.trim();
194
- }
195
- if (isImageDataUrl(candidate.url)) {
196
- return candidate.url.trim();
197
- }
198
- if (isImageDataUrl(candidate.src)) {
199
- return candidate.src.trim();
200
- }
201
- const imageUrlCandidate = candidate.imageUrl ?? candidate.image_url;
202
- if (imageUrlCandidate && typeof imageUrlCandidate === "object") {
203
- const imageUrlRecord = imageUrlCandidate;
204
- if (isImageDataUrl(imageUrlRecord.url)) {
205
- return imageUrlRecord.url.trim();
206
- }
207
- }
208
- return null;
209
- };
210
- const extractInlineToolResultImage = (value) => {
211
- const directSource = getInlineImageSource(value);
212
- if (directSource) {
213
- return {
214
- src: directSource,
215
- alt: "Tool result image",
216
- };
217
- }
218
- if (Array.isArray(value)) {
219
- for (const entry of value) {
220
- const preview = extractInlineToolResultImage(entry);
221
- if (preview) {
222
- return preview;
223
- }
224
- }
225
- return null;
226
- }
227
- if (!value || typeof value !== "object") {
228
- return null;
229
- }
230
- const candidate = value;
231
- const nestedImage = candidate.image && typeof candidate.image === "object"
232
- ? candidate.image
233
- : undefined;
234
- const richImageSource = getInlineImageSource(candidate.imageUrl ??
235
- candidate.image_url);
236
- const src = isImageDataUrl(nestedImage?.dataUrl)
237
- ? nestedImage?.dataUrl.trim()
238
- : isImageDataUrl(candidate.dataUrl)
239
- ? candidate.dataUrl.trim()
240
- : richImageSource
241
- ? richImageSource
242
- : null;
243
- if (!src) {
244
- return null;
245
- }
246
- const width = typeof candidate.imageWidth === "number" &&
247
- Number.isFinite(candidate.imageWidth)
248
- ? candidate.imageWidth
249
- : typeof nestedImage?.width === "number" &&
250
- Number.isFinite(nestedImage.width)
251
- ? nestedImage.width
252
- : undefined;
253
- const height = typeof candidate.imageHeight === "number" &&
254
- Number.isFinite(candidate.imageHeight)
255
- ? candidate.imageHeight
256
- : typeof nestedImage?.height === "number" &&
257
- Number.isFinite(nestedImage.height)
258
- ? nestedImage.height
259
- : undefined;
260
- return {
261
- src,
262
- alt: candidate.scope
263
- ? `Screenshot result (${candidate.scope})`
264
- : "Tool result image",
265
- fileName: nestedImage?.fileName || candidate.fileName,
266
- dimensions: width && height
267
- ? `${Math.round(width)} x ${Math.round(height)}`
268
- : undefined,
269
- };
270
- };
271
- const sanitizeInlineImageDataForDisplay = (value) => {
272
- if (isImageDataUrl(value)) {
273
- return "[image data URL omitted from preview]";
274
- }
275
- if (Array.isArray(value)) {
276
- let hasChanges = false;
277
- const sanitizedItems = value.map((entry) => {
278
- const sanitizedEntry = sanitizeInlineImageDataForDisplay(entry);
279
- if (sanitizedEntry !== entry) {
280
- hasChanges = true;
281
- }
282
- return sanitizedEntry;
283
- });
284
- return hasChanges ? sanitizedItems : value;
285
- }
286
- if (!value || typeof value !== "object") {
287
- return value;
288
- }
289
- const candidate = value;
290
- let hasChanges = false;
291
- const clone = {};
292
- Object.entries(candidate).forEach(([key, entryValue]) => {
293
- const sanitizedValue = sanitizeInlineImageDataForDisplay(entryValue);
294
- clone[key] = sanitizedValue;
295
- if (sanitizedValue !== entryValue) {
296
- hasChanges = true;
297
- }
298
- });
299
- return hasChanges ? clone : value;
300
- };
301
- const InlineToolResultPreview = ({ preview, }) => {
302
- return (_jsxs("a", { href: preview.src, target: "_blank", rel: "noopener noreferrer", className: "mb-2 block overflow-hidden rounded border border-gray-200 bg-white transition-colors hover:border-gray-300", children: [_jsx("img", { src: preview.src, alt: preview.alt, loading: "lazy", className: "max-h-40 w-auto max-w-full bg-gray-100 object-contain" }), (preview.fileName || preview.dimensions) && (_jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-gray-100 px-2 py-1 text-[10px] text-gray-500", children: [_jsx("span", { className: "truncate", children: preview.fileName || "Screenshot" }), preview.dimensions && (_jsx("span", { className: "shrink-0", children: preview.dimensions }))] }))] }));
303
- };
304
136
  // Helper function to render JSON or text
305
137
  const renderJsonOrText = (json) => {
306
138
  const parsed = parseJsonString(json);
@@ -309,7 +141,7 @@ const renderJsonOrText = (json) => {
309
141
  }
310
142
  // If parsing failed, display as plain text
311
143
  const jsonString = typeof json === "string" ? json : String(json);
312
- return (_jsx("div", { className: "font-mono text-xs wrap-break-word whitespace-pre-wrap text-gray-700", children: jsonString }));
144
+ return (_jsx("div", { className: "font-mono text-xs break-words whitespace-pre-wrap text-gray-700", children: jsonString }));
313
145
  };
314
146
  // Expandable panel component
315
147
  const ExpandablePanel = ({ title, children, defaultExpanded = false, actionButton, }) => {
@@ -317,15 +149,9 @@ const ExpandablePanel = ({ title, children, defaultExpanded = false, actionButto
317
149
  return (_jsxs("div", { className: "border-b border-gray-100 last:border-b-0", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex flex-1 cursor-pointer items-center gap-1.5 px-3 py-1.5 transition-colors hover:bg-gray-50/50", onClick: () => setIsExpanded(!isExpanded), children: [isExpanded ? (_jsx(ChevronDown, { size: 12, strokeWidth: 1.5, className: "text-gray-400 transition-transform" })) : (_jsx(ChevronRight, { size: 12, strokeWidth: 1.5, className: "text-gray-400 transition-transform" })), _jsx("span", { className: "text-[10px] font-medium text-gray-500", children: title })] }), actionButton && (_jsx("div", { className: "pr-2", onClick: (e) => e.stopPropagation(), children: actionButton }))] }), isExpanded && (_jsx("div", { className: "w-full overflow-auto px-3 pb-2", children: children }))] }));
318
150
  };
319
151
  // Helper function to create expandable tool call details
320
- const ToolCallDetails = memo(({ toolCall, result, }) => {
321
- const isPruned = !!toolCall.isPruned;
322
- const hasError = !!toolCall.function?.error && !isPruned;
323
- const hasOutput = !!result || hasError || isPruned;
324
- const prunedOutput = useMemo(() => {
325
- if (!isPruned)
326
- return "";
327
- return result || toolCall.function?.error || "";
328
- }, [isPruned, result, toolCall.function?.error]);
152
+ const ToolCallDetails = memo(({ toolCall, result }) => {
153
+ const hasError = toolCall.function?.error;
154
+ const hasOutput = result || hasError;
329
155
  // Memoize parsed input data to prevent re-parsing on every render
330
156
  const parsedInput = useMemo(() => {
331
157
  return parseJsonString(toolCall.function?.arguments || "");
@@ -334,31 +160,6 @@ const ToolCallDetails = memo(({ toolCall, result, }) => {
334
160
  const parsedOutput = useMemo(() => {
335
161
  return parseJsonString(result || "");
336
162
  }, [result]);
337
- const parsedPrunedOutput = useMemo(() => {
338
- return parseJsonString(prunedOutput);
339
- }, [prunedOutput]);
340
- const outputPreview = useMemo(() => {
341
- if (isPruned) {
342
- return extractInlineToolResultImage(parsedPrunedOutput ?? prunedOutput);
343
- }
344
- if (hasError) {
345
- return null;
346
- }
347
- return extractInlineToolResultImage(parsedOutput ?? (result || ""));
348
- }, [
349
- hasError,
350
- isPruned,
351
- parsedOutput,
352
- parsedPrunedOutput,
353
- prunedOutput,
354
- result,
355
- ]);
356
- const displayPrunedOutput = useMemo(() => {
357
- return sanitizeInlineImageDataForDisplay(parsedPrunedOutput ?? prunedOutput);
358
- }, [parsedPrunedOutput, prunedOutput]);
359
- const displayOutput = useMemo(() => {
360
- return sanitizeInlineImageDataForDisplay(parsedOutput ?? (result || ""));
361
- }, [parsedOutput, result]);
362
163
  // Get text to copy for input
363
164
  const inputTextToCopy = useMemo(() => {
364
165
  const args = toolCall.function?.arguments || "";
@@ -369,215 +170,63 @@ const ToolCallDetails = memo(({ toolCall, result, }) => {
369
170
  }, [toolCall.function?.arguments, parsedInput]);
370
171
  // Get text to copy for output
371
172
  const outputTextToCopy = useMemo(() => {
372
- if (isPruned) {
373
- if (parsedPrunedOutput !== null) {
374
- return JSON.stringify(parsedPrunedOutput, null, 2);
375
- }
376
- return typeof prunedOutput === "object"
377
- ? JSON.stringify(prunedOutput, null, 2)
378
- : prunedOutput;
379
- }
380
173
  if (hasError) {
381
174
  return toolCall.function?.error || "";
382
175
  }
383
176
  if (parsedOutput !== null) {
384
177
  return JSON.stringify(parsedOutput, null, 2);
385
178
  }
386
- if (typeof result === "object") {
387
- return JSON.stringify(result, null, 2);
388
- }
389
179
  return result || "";
390
- }, [
391
- hasError,
392
- isPruned,
393
- toolCall.function?.error,
394
- parsedOutput,
395
- parsedPrunedOutput,
396
- prunedOutput,
397
- result,
398
- ]);
399
- return (_jsxs("div", { className: "mt-1 ml-5 overflow-hidden rounded border border-gray-200/60 bg-gray-50/40", children: [_jsx(ExpandablePanel, { title: "Input", defaultExpanded: !hasOutput, actionButton: _jsx(CopyButton, { textToCopy: inputTextToCopy, iconOnly: true, className: "cursor-pointer text-gray-400 hover:text-gray-600" }), children: _jsx("div", { className: "rounded bg-white p-2 text-xs", children: parsedInput !== null ? (_jsx(MemoizedJsonView, { data: parsedInput })) : (_jsx("div", { className: "font-mono text-xs wrap-break-word whitespace-pre-wrap text-gray-700", children: toolCall.function?.arguments || "" })) }) }), hasOutput && (_jsx(ExpandablePanel, { title: isPruned ? "Pruned" : hasError ? "Error" : "Output", defaultExpanded: true, actionButton: _jsx(CopyButton, { textToCopy: outputTextToCopy, iconOnly: true, className: "cursor-pointer text-gray-400 hover:text-gray-600" }), children: isPruned ? (_jsxs("div", { className: "rounded border-l-2 border-slate-400 bg-slate-50/70 p-2 text-xs text-slate-700", children: [_jsx("div", { className: "mb-1 text-[10px] font-medium text-slate-600", children: "Pruned from AI context" }), _jsx("div", { className: "mb-2 text-slate-600", children: "This tool call completed, but its output was pruned from future agent context to save tokens." }), prunedOutput ? (_jsxs("div", { className: "rounded bg-white p-2 text-xs", children: [outputPreview && (_jsx(InlineToolResultPreview, { preview: outputPreview })), displayPrunedOutput !== null &&
400
- typeof displayPrunedOutput === "object" ? (_jsx(MemoizedJsonView, { data: displayPrunedOutput })) : (_jsx("div", { className: "font-mono text-xs wrap-break-word whitespace-pre-wrap text-gray-700", children: String(displayPrunedOutput ?? prunedOutput) }))] })) : null] })) : hasError ? (_jsxs("div", { className: "rounded border-l-2 border-red-400 bg-red-50/60 p-2 text-xs text-red-700", children: [_jsx("div", { className: "mb-1 text-[10px] font-medium text-red-600", children: "Error" }), _jsx("div", { className: "text-red-600", children: toolCall.function?.error })] })) : (_jsxs("div", { className: "rounded bg-white p-2 text-xs", children: [outputPreview && (_jsx(InlineToolResultPreview, { preview: outputPreview })), displayOutput !== null && typeof displayOutput === "object" ? (_jsx(MemoizedJsonView, { data: displayOutput })) : (_jsx("div", { className: "font-mono text-xs wrap-break-word whitespace-pre-wrap text-gray-700", children: String(displayOutput ?? (result || "")) }))] })) }))] }));
180
+ }, [hasError, toolCall.function?.error, parsedOutput, result]);
181
+ return (_jsxs("div", { className: "mt-1 ml-5 overflow-hidden rounded border border-gray-200/60 bg-gray-50/40", children: [_jsx(ExpandablePanel, { title: "Input", defaultExpanded: !hasOutput, actionButton: _jsx(CopyButton, { textToCopy: inputTextToCopy, iconOnly: true, className: "cursor-pointer text-gray-400 hover:text-gray-600" }), children: _jsx("div", { className: "rounded bg-white p-2 text-xs", children: parsedInput !== null ? (_jsx(MemoizedJsonView, { data: parsedInput })) : (_jsx("div", { className: "font-mono text-xs break-words whitespace-pre-wrap text-gray-700", children: toolCall.function?.arguments || "" })) }) }), hasOutput && (_jsx(ExpandablePanel, { title: hasError ? "Error" : "Output", defaultExpanded: true, actionButton: _jsx(CopyButton, { textToCopy: outputTextToCopy, iconOnly: true, className: "cursor-pointer text-gray-400 hover:text-gray-600" }), children: hasError ? (_jsxs("div", { className: "rounded border-l-2 border-red-400 bg-red-50/60 p-2 text-xs text-red-700", children: [_jsx("div", { className: "mb-1 text-[10px] font-medium text-red-600", children: "Error" }), _jsx("div", { className: "text-red-600", children: toolCall.function?.error })] })) : (_jsx("div", { className: "rounded bg-white p-2 text-xs", children: parsedOutput !== null ? (_jsx(MemoizedJsonView, { data: parsedOutput })) : (_jsx("div", { className: "font-mono text-xs break-words whitespace-pre-wrap text-gray-700", children: result || "" })) })) }))] }));
401
182
  }, (prevProps, nextProps) => {
402
183
  // Only re-render if the data actually changed
403
184
  return (prevProps.toolCall.id === nextProps.toolCall.id &&
404
185
  prevProps.toolCall.function?.arguments ===
405
186
  nextProps.toolCall.function?.arguments &&
406
187
  prevProps.result === nextProps.result &&
407
- prevProps.toolCall.function?.error ===
408
- nextProps.toolCall.function?.error &&
409
- prevProps.toolCall.isPruned === nextProps.toolCall.isPruned);
188
+ prevProps.toolCall.function?.error === nextProps.toolCall.function?.error);
410
189
  });
411
190
  ToolCallDetails.displayName = "ToolCallDetails";
412
- export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals = [], onSwitchToAutonomous, seenApprovalDialogs, onApprovalDialogShown, browserCaptureInlinePrompt, }) {
413
- const [batchRiskAction, setBatchRiskAction] = useState(null);
191
+ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals = [], onSwitchToAutonomous, seenApprovalDialogs, onApprovalDialogShown, }) {
192
+ const [isApprovingAll, setIsApprovingAll] = useState(false);
414
193
  const [isSwitchingMode, setIsSwitchingMode] = useState(false);
415
- const [isGroupExpanded, setIsGroupExpanded] = useState(() => {
416
- return (toolCalls?.some((tc) => {
417
- if (!tc.requiresApproval)
418
- return false;
419
- const funcName = ("functionName" in tc
420
- ? tc.functionName
421
- : normalizeToolCall(tc).function?.name) || "";
422
- return (!funcName.includes("(approved)") && !funcName.includes("(rejected)"));
423
- }) ?? false);
424
- });
425
- const [userToggled, setUserToggled] = useState(false);
426
- const hasPendingApprovalsInGroup = useMemo(() => {
427
- if (!toolCalls)
428
- return false;
429
- return toolCalls.some((tc) => {
430
- if (!tc.requiresApproval)
431
- return false;
432
- const funcName = ("functionName" in tc
433
- ? tc.functionName
434
- : normalizeToolCall(tc).function?.name) || "";
435
- return (!funcName.includes("(approved)") && !funcName.includes("(rejected)"));
436
- });
437
- }, [toolCalls]);
438
- useEffect(() => {
439
- if (!userToggled) {
440
- setIsGroupExpanded(hasPendingApprovalsInGroup);
441
- }
442
- }, [userToggled, hasPendingApprovalsInGroup]);
443
- const groupSummary = useMemo(() => {
444
- if (!toolCalls || toolCalls.length === 0)
445
- return null;
446
- const uniqueNames = [
447
- ...new Set(toolCalls
448
- .map((tc) => {
449
- const normalized = normalizeToolCall(tc);
450
- return (("functionName" in tc
451
- ? tc.functionName
452
- : normalized.function?.name) || "")
453
- .replace(/ \(approved\)/g, "")
454
- .replace(/ \(rejected\)/g, "")
455
- .replace(/ \(pending approval\)/g, "")
456
- .trim();
457
- })
458
- .filter(Boolean)),
459
- ];
460
- const errorCount = toolCalls.filter((tc) => {
461
- const normalized = normalizeToolCall(tc);
462
- return !!normalized.function?.error && !normalized.isPruned;
463
- }).length;
464
- return { uniqueNames, errorCount };
465
- }, [toolCalls]);
466
- const shouldShowGroupBrowserCaptureInlinePrompt = useMemo(() => {
467
- if (!browserCaptureInlinePrompt || !toolCalls?.length)
468
- return false;
469
- return toolCalls.some((tc) => {
470
- const normalized = normalizeToolCall(tc);
471
- const originalFunctionName = ("functionName" in tc ? tc.functionName : normalized.function?.name) || "";
472
- const baseFunctionName = originalFunctionName
473
- .replace(" (approved)", "")
474
- .replace(" (rejected)", "")
475
- .replace(" (pending approval)", "")
476
- .trim()
477
- .toLowerCase();
478
- const approvalInfo = tc.requiresApproval || normalized.requiresApproval;
479
- const isCompleted = "isCompleted" in tc
480
- ? tc.isCompleted
481
- : !!(normalized.function?.result || normalized.function?.error) &&
482
- !approvalInfo;
483
- return (browserCaptureInlinePrompt.toolNames.includes(baseFunctionName) &&
484
- !isCompleted &&
485
- !normalized.function?.error);
486
- });
487
- }, [browserCaptureInlinePrompt, toolCalls]);
488
- const allToolCallsCompleted = useMemo(() => {
489
- if (!toolCalls || toolCalls.length === 0)
490
- return false;
491
- return toolCalls.every((tc) => {
492
- const isAgentToolCall = "isCompleted" in tc;
493
- if (isAgentToolCall)
494
- return tc.isCompleted;
495
- const normalized = normalizeToolCall(tc);
496
- const approvalInfo = tc.requiresApproval || normalized.requiresApproval;
497
- return !!(normalized.function?.result || normalized.function?.error) && !approvalInfo;
498
- });
499
- }, [toolCalls]);
500
194
  if (!toolCalls || toolCalls.length === 0) {
501
195
  return null;
502
196
  }
503
- const resolvePendingToolCalls = async (pendingToolCalls, approved) => {
504
- if (!agentId || pendingToolCalls.length === 0)
197
+ // Helper to approve all pending tool calls with a specific risk level
198
+ const handleApproveAllByRisk = async (riskLevel) => {
199
+ if (!agentId || isApprovingAll)
505
200
  return;
506
- const actionLabel = approved ? "approve" : "reject";
507
- if (approved && pendingToolCalls.length > 1) {
508
- const result = await approveToolCalls({
509
- agentId,
510
- toolCalls: pendingToolCalls.map((pending) => ({
511
- messageId: pending.dbMessageId || pending.messageId,
512
- toolCallId: pending.toolCallId,
513
- })),
514
- });
515
- const approvedToolCallIds = new Set(result.approvedToolCallIds || []);
516
- pendingToolCalls.forEach((pending) => {
517
- if (!approvedToolCallIds.has(pending.toolCallId)) {
518
- return;
519
- }
520
- window.dispatchEvent(new CustomEvent("agent:toolApprovalResolved", {
521
- detail: {
201
+ const matchingPending = allPendingApprovals.filter((p) => (p.riskLevel || undefined) === riskLevel);
202
+ if (matchingPending.length === 0)
203
+ return;
204
+ setIsApprovingAll(true);
205
+ try {
206
+ // Approve all matching tool calls in parallel
207
+ await Promise.all(matchingPending.map(async (pending) => {
208
+ try {
209
+ await approveToolCall({
210
+ agentId,
522
211
  messageId: pending.dbMessageId || pending.messageId,
523
212
  toolCallId: pending.toolCallId,
524
- approved: true,
525
- },
526
- }));
527
- });
528
- return;
529
- }
530
- await Promise.all(pendingToolCalls.map(async (pending) => {
531
- try {
532
- const params = {
533
- agentId,
534
- messageId: pending.dbMessageId || pending.messageId,
535
- toolCallId: pending.toolCallId,
536
- };
537
- if (approved) {
538
- await approveToolCall(params);
213
+ });
214
+ // Dispatch event to update UI
215
+ window.dispatchEvent(new CustomEvent("agent:toolApprovalResolved", {
216
+ detail: {
217
+ messageId: pending.dbMessageId || pending.messageId,
218
+ toolCallId: pending.toolCallId,
219
+ approved: true,
220
+ },
221
+ }));
539
222
  }
540
- else {
541
- await rejectToolCall(params);
223
+ catch (error) {
224
+ console.error(`Failed to approve tool call ${pending.toolCallId}:`, error);
542
225
  }
543
- window.dispatchEvent(new CustomEvent("agent:toolApprovalResolved", {
544
- detail: {
545
- messageId: pending.dbMessageId || pending.messageId,
546
- toolCallId: pending.toolCallId,
547
- approved,
548
- },
549
- }));
550
- }
551
- catch (error) {
552
- console.error(`Failed to ${actionLabel} tool call ${pending.toolCallId}:`, error);
553
- }
554
- }));
555
- };
556
- // Helper to approve/reject all pending tool calls at once
557
- const handleApproveAllPending = async () => {
558
- if (!agentId || batchRiskAction)
559
- return;
560
- if (allPendingApprovals.length === 0)
561
- return;
562
- setBatchRiskAction("approve");
563
- try {
564
- await resolvePendingToolCalls(allPendingApprovals, true);
226
+ }));
565
227
  }
566
228
  finally {
567
- setBatchRiskAction(null);
568
- }
569
- };
570
- const handleRejectAllPending = async () => {
571
- if (!agentId || batchRiskAction)
572
- return;
573
- if (allPendingApprovals.length === 0)
574
- return;
575
- setBatchRiskAction("reject");
576
- try {
577
- await resolvePendingToolCalls(allPendingApprovals, false);
578
- }
579
- finally {
580
- setBatchRiskAction(null);
229
+ setIsApprovingAll(false);
581
230
  }
582
231
  };
583
232
  // Helper to switch to autonomous mode
@@ -586,14 +235,29 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
586
235
  return;
587
236
  setIsSwitchingMode(true);
588
237
  try {
589
- const result = await updateAgentSettings(agentId, { mode: "autonomous" });
590
- if (result.success === false || result.updates?.mode === false) {
591
- throw new Error("Mode change was not applied");
592
- }
238
+ await updateAgentSettings(agentId, { mode: "autonomous" });
593
239
  onSwitchToAutonomous?.();
594
240
  // After switching to autonomous, approve all remaining pending tool calls
595
241
  if (allPendingApprovals.length > 0) {
596
- await resolvePendingToolCalls(allPendingApprovals, true);
242
+ await Promise.all(allPendingApprovals.map(async (pending) => {
243
+ try {
244
+ await approveToolCall({
245
+ agentId,
246
+ messageId: pending.dbMessageId || pending.messageId,
247
+ toolCallId: pending.toolCallId,
248
+ });
249
+ window.dispatchEvent(new CustomEvent("agent:toolApprovalResolved", {
250
+ detail: {
251
+ messageId: pending.dbMessageId || pending.messageId,
252
+ toolCallId: pending.toolCallId,
253
+ approved: true,
254
+ },
255
+ }));
256
+ }
257
+ catch (error) {
258
+ console.error(`Failed to approve tool call ${pending.toolCallId}:`, error);
259
+ }
260
+ }));
597
261
  }
598
262
  }
599
263
  catch (error) {
@@ -604,130 +268,56 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
604
268
  setIsSwitchingMode(false);
605
269
  }
606
270
  };
607
- const showGroupHeader = toolCalls.length > 0;
608
- return (_jsxs("div", { className: "flex flex-col", children: [showGroupHeader && (_jsxs("div", { className: "group flex cursor-pointer items-center gap-1.5 rounded-md px-1 py-1 text-xs text-gray-500 transition-all hover:bg-gray-100/60 hover:text-gray-700", onClick: () => {
609
- setIsGroupExpanded((prev) => !prev);
610
- setUserToggled(true);
611
- }, children: [_jsx("div", { className: "flex items-center transition-transform group-hover:scale-110", children: isGroupExpanded ? (_jsx(ChevronDown, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) : (_jsx(ChevronRight, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) }), _jsx("div", { className: "flex items-center text-gray-500", children: _jsx(Wrench, { strokeWidth: 1, size: 14 }) }), _jsxs("span", { className: `font-medium ${!allToolCallsCompleted ? "animate-text-shimmer" : ""}`, children: [toolCalls.length, " tool call", toolCalls.length !== 1 ? "s" : ""] }), !isGroupExpanded && groupSummary && (_jsx("span", { className: "ml-1 min-w-0 flex-1 truncate text-[10px] text-gray-400", children: groupSummary.uniqueNames.length <= 3
612
- ? groupSummary.uniqueNames.join(", ")
613
- : `${groupSummary.uniqueNames.slice(0, 2).join(", ")} +${groupSummary.uniqueNames.length - 2} more` })), groupSummary && groupSummary.errorCount > 0 && (_jsxs("span", { className: "ml-1 shrink-0 text-[10px] text-red-500", children: ["(", groupSummary.errorCount, " error", groupSummary.errorCount !== 1 ? "s" : "", ")"] }))] })), shouldShowGroupBrowserCaptureInlinePrompt && browserCaptureInlinePrompt && (_jsx("div", { className: "mt-2 ml-5 rounded-lg border border-blue-200 bg-blue-50 p-3 text-[11px] text-blue-900", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-semibold", children: browserCaptureInlinePrompt.label }), _jsx("div", { className: "mt-1 text-blue-800", children: browserCaptureInlinePrompt.description })] }), _jsx("div", { className: "flex shrink-0 items-center gap-2", children: _jsx("button", { type: "button", className: "rounded border border-blue-300 bg-white px-2 py-1 text-[11px] font-medium text-blue-900 disabled:cursor-not-allowed disabled:opacity-60", disabled: browserCaptureInlinePrompt.isPending, onClick: (event) => {
614
- event.stopPropagation();
615
- browserCaptureInlinePrompt.onAction();
616
- }, children: browserCaptureInlinePrompt.actionLabel }) })] }) })), isGroupExpanded && (_jsx("div", { className: "ml-4", children: toolCalls.map((originalToolCall, toolIndex) => {
617
- const toolCall = normalizeToolCall(originalToolCall);
618
- const toolResult = toolCall.function?.result;
619
- const isAgentToolCall = "isCompleted" in originalToolCall;
620
- const toolCallKey = ("toolCallId" in originalToolCall
621
- ? originalToolCall.toolCallId
622
- : toolCall.id) || `${messageId}-${toolIndex}`;
623
- const popoverKey = `${messageId}-${toolCallKey}`;
624
- const isPruned = !!toolCall.isPruned;
625
- const toolCallMeta = formatToolCallMeta(toolCall.createdDate, toolCall.responseTimeMs);
626
- // Get approval information to check if tool call is pending approval
627
- const approvalInfo = originalToolCall.requiresApproval || toolCall.requiresApproval;
628
- const isCompleted = isAgentToolCall
629
- ? originalToolCall.isCompleted
630
- : !!(toolResult || toolCall.function?.error) && !approvalInfo;
631
- // Check if tool call is currently streaming (arguments still being generated)
632
- const isStreaming = isAgentToolCall &&
633
- "isStreaming" in originalToolCall &&
634
- originalToolCall.isStreaming === true;
635
- // Use the approval info from the backend
636
- const finalApprovalInfo = approvalInfo;
637
- // Check if this tool call's approval dialog has already been shown (for deduplication)
638
- const toolCallIdForApproval = "toolCallId" in originalToolCall
639
- ? originalToolCall.toolCallId
640
- : toolCall.id;
641
- const approvalAlreadyShown = seenApprovalDialogs?.has(toolCallIdForApproval) ?? false;
642
- // Check if this tool call has been approved/rejected (look for status indicators in function name)
643
- // The AgentTerminal adds " (approved)" or " (rejected)" or " (pending approval)" to the functionName field
644
- const originalFunctionName = ("functionName" in originalToolCall
645
- ? originalToolCall.functionName
646
- : toolCall?.function?.name) || "";
647
- const baseFunctionName = originalFunctionName
648
- .replace(" (approved)", "")
649
- .replace(" (rejected)", "")
650
- .replace(" (pending approval)", "")
651
- .trim()
652
- .toLowerCase();
653
- const isApproved = originalFunctionName.includes("(approved)");
654
- const isRejected = originalFunctionName.includes("(rejected)");
655
- const isPending = originalFunctionName.includes("(pending approval)");
656
- // Treat only approved/rejected as final; pending should still show buttons
657
- const hasApprovalStatus = isApproved || isRejected;
658
- // Debug logging removed for performance
659
- const isExpanded = openPopovers[popoverKey] || false;
660
- const shouldShowBrowserCaptureInlinePrompt = !!browserCaptureInlinePrompt &&
661
- browserCaptureInlinePrompt.toolNames.includes(baseFunctionName) &&
662
- !isCompleted &&
663
- !toolCall.function?.error;
664
- const toolCallMessageId = originalToolCall.messageId || toolCall.messageId || messageId;
665
- return (_jsxs("div", { children: [_jsxs("div", { className: "group flex cursor-pointer items-center gap-1.5 rounded-md px-1 py-1 text-xs text-gray-600 transition-all hover:bg-gray-100/60 hover:text-gray-800", onClick: () => {
666
- setOpenPopovers((prev) => ({
667
- ...prev,
668
- [popoverKey]: !prev[popoverKey],
669
- }));
670
- }, children: [_jsx("div", { className: "flex items-center transition-transform group-hover:scale-110", children: isExpanded ? (_jsx(ChevronDown, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) : (_jsx(ChevronRight, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) }), isCompleted ? (_jsx("div", { className: `flex items-center transition-all ${toolCall.function?.error && !isPruned
671
- ? "text-red-500"
672
- : isPruned
673
- ? "text-slate-500"
674
- : "text-green-600"}`, children: getToolIcon(toolCall?.function?.name || "") })) : finalApprovalInfo && !hasApprovalStatus ? (_jsx("div", { className: "flex items-center text-amber-600 transition-all", children: getToolIcon(toolCall?.function?.name || "") })) : isStreaming || !finished ? (
675
- // Show spinner when tool call arguments are still being streamed or tool is executing
676
- _jsx(Spinner, { size: "xs" })) : (
677
- // Turn finished but tool call not completed - show static icon
678
- _jsx("div", { className: "flex items-center text-gray-400 transition-all", children: getToolIcon(toolCall?.function?.name || "") })), _jsxs("div", { className: "inline-flex min-w-0 flex-1 items-center gap-2", children: [_jsxs("span", { className: `shrink-0 font-medium transition-colors ${toolCall.function?.error && !isPruned
679
- ? "text-red-600"
680
- : isPruned
681
- ? "text-slate-600"
682
- : ""}`, children: [(originalFunctionName ||
683
- toolCall?.function?.name ||
684
- toolCall?.displayName ||
685
- "(function name missing)")
686
- .replace(" (approved)", "")
687
- .replace(" (rejected)", "")
688
- .replace(" (pending approval)", ""), toolCall.function?.error && !isRejected && !isPruned && (_jsx("span", { className: "ml-1 text-red-500", children: "(error)" })), isPruned && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700", children: [_jsx("span", { children: "\u2702" }), " Pruned"] })), finalApprovalInfo && isRejected && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-[10px] font-semibold text-red-700", children: [_jsx("span", { children: "\u2717" }), " Rejected"] }))] }), finalApprovalInfo?.summary && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "min-w-0 flex-1 cursor-help truncate text-xs text-gray-500 italic", children: finalApprovalInfo.summary }) }), _jsx(TooltipContent, { side: "top", className: "max-w-md", children: finalApprovalInfo.summary })] })), _jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [!isCompleted &&
689
- finalApprovalInfo &&
690
- !hasApprovalStatus && (_jsx(ApprovalDialog, { toolCallId: toolCallIdForApproval, onApprovalDialogShown: onApprovalDialogShown, finalApprovalInfo: finalApprovalInfo, isAgentToolCall: isAgentToolCall, originalToolCall: originalToolCall, toolCall: toolCall, messageId: toolCallMessageId, agentId: agentId })), toolCallMeta && (_jsx("span", { className: "text-[10px] text-gray-400", children: toolCallMeta }))] })] })] }), isExpanded && (_jsx(ToolCallDetails, { toolCall: toolCall, result: toolResult })), !shouldShowGroupBrowserCaptureInlinePrompt &&
691
- shouldShowBrowserCaptureInlinePrompt &&
692
- browserCaptureInlinePrompt && (_jsx("div", { className: "mt-2 ml-5 rounded-lg border border-blue-200 bg-blue-50 p-3 text-[11px] text-blue-900", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-semibold", children: browserCaptureInlinePrompt.label }), _jsx("div", { className: "mt-1 text-blue-800", children: browserCaptureInlinePrompt.description })] }), _jsx("div", { className: "flex shrink-0 items-center gap-2", children: _jsx("button", { type: "button", className: "rounded border border-blue-300 bg-white px-2 py-1 text-[11px] font-medium text-blue-900 disabled:cursor-not-allowed disabled:opacity-60", disabled: browserCaptureInlinePrompt.isPending, onClick: (event) => {
693
- event.stopPropagation();
694
- browserCaptureInlinePrompt.onAction();
695
- }, children: browserCaptureInlinePrompt.actionLabel }) })] }) }))] }, toolCallKey));
696
- }) })), (() => {
697
- if (!hasPendingApprovalsInGroup)
698
- return null;
699
- const totalPending = allPendingApprovals.length;
700
- const uniqueRisks = Array.from(new Set(allPendingApprovals.map((p) => p.riskLevel || undefined)));
701
- const singleRisk = uniqueRisks.length === 1 ? uniqueRisks[0] : undefined;
702
- const riskLabel = singleRisk
703
- ? `${singleRisk.charAt(0).toUpperCase()}${singleRisk.slice(1)} `
704
- : "";
705
- // Hide autonomous switch if any pending tool call in the group is a delete
706
- const hideAutonomousSwitch = toolCalls.some((tc) => {
707
- if (!tc.requiresApproval)
708
- return false;
709
- const name = ("functionName" in tc
710
- ? tc.functionName
711
- : normalizeToolCall(tc).function?.name) || "";
712
- const base = name
713
- .replace(" (approved)", "")
714
- .replace(" (rejected)", "")
715
- .replace(" (pending approval)", "")
716
- .trim()
717
- .toLowerCase();
718
- return base === "delete-item" || base === "delete-items";
719
- });
720
- return (_jsxs("div", { className: "mt-2 flex flex-wrap items-center justify-end gap-2 p-2", children: [!hideAutonomousSwitch && (_jsx(Button, { size: "sm", variant: "outline", disabled: isSwitchingMode, onClick: handleSwitchToAutonomous, className: "text-xs", children: isSwitchingMode ? "Switching..." : "Switch to Autonomous" })), _jsx(Button, { size: "sm", variant: "outline", "data-testid": "agent-reject-all-button", disabled: batchRiskAction !== null, onClick: handleRejectAllPending, className: "text-xs", children: batchRiskAction === "reject"
721
- ? "Rejecting..."
722
- : `Reject All ${riskLabel}(${totalPending})` }), _jsx(Button, { size: "sm", "data-testid": "agent-approve-all-button", disabled: batchRiskAction !== null, onClick: handleApproveAllPending, className: "text-xs", children: batchRiskAction === "approve"
723
- ? "Approving..."
724
- : `Approve All ${riskLabel}(${totalPending})` })] }));
725
- })()] }));
271
+ return (_jsx("div", { className: "flex flex-col", children: toolCalls.map((originalToolCall, toolIndex) => {
272
+ const toolCall = normalizeToolCall(originalToolCall);
273
+ const toolResult = toolCall.function?.result;
274
+ const popoverKey = `${messageId}-${toolIndex}`;
275
+ const isAgentToolCall = "isCompleted" in originalToolCall;
276
+ // Get approval information to check if tool call is pending approval
277
+ const approvalInfo = originalToolCall.requiresApproval || toolCall.requiresApproval;
278
+ const isCompleted = isAgentToolCall
279
+ ? originalToolCall.isCompleted
280
+ : !!(toolResult || toolCall.function?.error) && !approvalInfo;
281
+ // Check if tool call is currently streaming (arguments still being generated)
282
+ const isStreaming = isAgentToolCall && "isStreaming" in originalToolCall && originalToolCall.isStreaming === true;
283
+ // Use the approval info from the backend
284
+ const finalApprovalInfo = approvalInfo;
285
+ // Check if this tool call's approval dialog has already been shown (for deduplication)
286
+ const toolCallIdForApproval = "toolCallId" in originalToolCall ? originalToolCall.toolCallId : toolCall.id;
287
+ const approvalAlreadyShown = seenApprovalDialogs?.has(toolCallIdForApproval) ?? false;
288
+ // Check if this tool call has been approved/rejected (look for status indicators in function name)
289
+ // The AgentTerminal adds " (approved)" or " (rejected)" or " (pending approval)" to the functionName field
290
+ const originalFunctionName = ("functionName" in originalToolCall
291
+ ? originalToolCall.functionName
292
+ : toolCall?.function?.name) || "";
293
+ const isApproved = originalFunctionName.includes("(approved)");
294
+ const isRejected = originalFunctionName.includes("(rejected)");
295
+ const isPending = originalFunctionName.includes("(pending approval)");
296
+ // Treat only approved/rejected as final; pending should still show buttons
297
+ const hasApprovalStatus = isApproved || isRejected;
298
+ // Debug logging removed for performance
299
+ const isExpanded = openPopovers[popoverKey] || false;
300
+ return (_jsxs("div", { children: [_jsxs("div", { className: "group flex cursor-pointer items-center gap-1.5 rounded-md px-1 py-1 text-xs text-gray-600 transition-all hover:bg-gray-100/60 hover:text-gray-800", onClick: () => {
301
+ setOpenPopovers((prev) => ({
302
+ ...prev,
303
+ [popoverKey]: !prev[popoverKey],
304
+ }));
305
+ }, children: [_jsx("div", { className: "flex items-center transition-transform group-hover:scale-110", children: isExpanded ? (_jsx(ChevronDown, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) : (_jsx(ChevronRight, { size: 14, strokeWidth: 1.5, className: "text-gray-500" })) }), isCompleted ? (_jsx("div", { className: `flex items-center transition-all ${toolCall.function?.error ? "text-red-500" : "text-green-600"}`, children: getToolIcon(toolCall?.function?.name || "") })) : finalApprovalInfo && !hasApprovalStatus ? (_jsx("div", { className: "flex items-center text-amber-600 transition-all", children: getToolIcon(toolCall?.function?.name || "") })) : isStreaming || !finished ? (
306
+ // Show spinner when tool call arguments are still being streamed or tool is executing
307
+ _jsx(Spinner, { size: "xs" })) : (
308
+ // Turn finished but tool call not completed - show static icon
309
+ _jsx("div", { className: "flex items-center text-gray-400 transition-all", children: getToolIcon(toolCall?.function?.name || "") })), _jsx("div", { className: "inline-flex flex-1 items-center gap-2", children: _jsxs("span", { className: `font-medium transition-colors ${toolCall.function?.error ? "text-red-600" : ""}`, children: [(originalFunctionName ||
310
+ toolCall?.function?.name ||
311
+ toolCall?.displayName ||
312
+ "(function name missing)")
313
+ .replace(" (approved)", "")
314
+ .replace(" (rejected)", "")
315
+ .replace(" (pending approval)", ""), toolCall.function?.error && !isRejected && (_jsx("span", { className: "ml-1 text-red-500", children: "(error)" })), finalApprovalInfo && isApproved && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-green-100 px-2 py-0.5 text-[10px] font-semibold text-green-700", children: [_jsx("span", { children: "\u2713" }), " Approved"] })), finalApprovalInfo && isRejected && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-[10px] font-semibold text-red-700", children: [_jsx("span", { children: "\u2717" }), " Rejected"] })), finalApprovalInfo && isPending && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-semibold text-amber-700", children: [_jsx("span", { children: "\u23F8" }), " Pending approval"] }))] }) })] }), isExpanded && (_jsx(ToolCallDetails, { toolCall: toolCall, result: toolResult })), !isCompleted && finalApprovalInfo && !hasApprovalStatus && (_jsx(ApprovalDialog, { toolCallId: toolCallIdForApproval, onApprovalDialogShown: onApprovalDialogShown, finalApprovalInfo: finalApprovalInfo, isAgentToolCall: isAgentToolCall, originalToolCall: originalToolCall, toolCall: toolCall, messageId: messageId, agentId: agentId, allPendingApprovals: allPendingApprovals, onSwitchToAutonomous: onSwitchToAutonomous, isSwitchingMode: isSwitchingMode, setIsSwitchingMode: setIsSwitchingMode, isApprovingAll: isApprovingAll, setIsApprovingAll: setIsApprovingAll, handleApproveAllByRisk: handleApproveAllByRisk, handleSwitchToAutonomous: handleSwitchToAutonomous }))] }, toolIndex));
316
+ }) }));
726
317
  }
727
318
  // Separate component for approval dialog to properly handle useEffect
728
- function ApprovalDialog({ toolCallId, onApprovalDialogShown, finalApprovalInfo, isAgentToolCall, originalToolCall, toolCall, messageId, agentId, }) {
319
+ function ApprovalDialog({ toolCallId, onApprovalDialogShown, finalApprovalInfo, isAgentToolCall, originalToolCall, toolCall, messageId, agentId, allPendingApprovals, onSwitchToAutonomous, isSwitchingMode, setIsSwitchingMode, isApprovingAll, setIsApprovingAll, handleApproveAllByRisk, handleSwitchToAutonomous, }) {
729
320
  const hasMarkedAsShown = useRef(false);
730
- const [isCreatingAllowance, setIsCreatingAllowance] = useState(false);
731
321
  // Mark dialog as shown on mount to prevent duplicate dialogs
732
322
  // The dialog stays visible until hasApprovalStatus becomes true (after approve/reject)
733
323
  useEffect(() => {
@@ -750,108 +340,106 @@ function ApprovalDialog({ toolCallId, onApprovalDialogShown, finalApprovalInfo,
750
340
  hasMarkedAsShown.current = true;
751
341
  }
752
342
  };
753
- const getActualMessageId = () => {
754
- return isAgentToolCall
755
- ? originalToolCall.dbMessageId || originalToolCall.messageId
756
- : messageId;
757
- };
758
- const dispatchApprovalResolved = (actualMessageId, approved) => {
759
- const ev = new CustomEvent("agent:toolApprovalResolved", {
760
- detail: {
761
- messageId: actualMessageId,
762
- toolCallId: toolCall.id,
763
- approved,
764
- },
765
- });
766
- window.dispatchEvent(ev);
767
- };
768
- const approveCurrentToolCall = async () => {
769
- const actualMessageId = getActualMessageId();
770
- if (!agentId) {
771
- console.error("Cannot approve tool call: agentId is missing");
772
- return;
773
- }
774
- if (!actualMessageId) {
775
- console.error("Cannot approve tool call: messageId is missing");
776
- return;
777
- }
778
- await approveToolCall({
779
- agentId,
780
- messageId: actualMessageId,
781
- toolCallId: toolCall.id,
782
- });
783
- dispatchApprovalResolved(actualMessageId, true);
784
- };
785
- const allowableScope = finalApprovalInfo.allowableScope;
786
- const showAllowInScopeButton = !!agentId &&
787
- allowableScope?.operationType === "delete" &&
788
- !!allowableScope.parentItemId &&
789
- !!allowableScope.parentItemPath;
790
- const riskLevel = finalApprovalInfo.riskLevel;
791
- const riskTagClass = riskLevel === "high"
792
- ? "bg-red-100 text-red-700"
793
- : riskLevel === "medium"
794
- ? "bg-amber-100 text-amber-700"
795
- : "bg-green-100 text-green-700";
796
- return (_jsxs(_Fragment, { children: [riskLevel && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: `shrink-0 cursor-help rounded px-1.5 py-0.5 text-[10px] font-semibold uppercase ${riskTagClass}`, children: riskLevel }) }), _jsxs(TooltipContent, { side: "top", className: "max-w-xs", children: [_jsxs("div", { className: "font-semibold", children: ["Risk: ", riskLevel.toUpperCase()] }), _jsx("div", { className: "mt-0.5 font-normal opacity-90", children: finalApprovalInfo.summary })] })] })), showAllowInScopeButton && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": isCreatingAllowance
797
- ? "Allowing..."
798
- : `Allow deletes in ${allowableScope?.parentItemPath}`, disabled: isCreatingAllowance, className: "flex size-5 shrink-0 items-center justify-center rounded text-gray-500 hover:bg-gray-100 hover:text-gray-900 disabled:cursor-not-allowed disabled:opacity-60", onClick: async (e) => {
799
- e.stopPropagation();
800
- markAsShown();
801
- if (!agentId || !allowableScope?.parentItemId)
802
- return;
803
- setIsCreatingAllowance(true);
804
- try {
805
- await createOperationAllowance({
343
+ return (_jsxs("div", { className: "mt-2 overflow-hidden rounded-lg border border-amber-200 bg-gradient-to-br from-amber-50 to-amber-50/30 shadow-sm", children: [_jsx("div", { className: "border-b border-amber-200/60 bg-amber-50/80 p-3", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: `mt-1 h-2.5 w-2.5 rounded-full shadow-sm ${finalApprovalInfo.riskLevel === "high"
344
+ ? "bg-red-500 ring-2 ring-red-200"
345
+ : finalApprovalInfo.riskLevel === "medium"
346
+ ? "bg-amber-500 ring-2 ring-amber-200"
347
+ : "bg-green-500 ring-2 ring-green-200"}` }), _jsxs("div", { className: "flex-1", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold text-gray-900", children: "Action requires approval" }), _jsx("div", { className: "text-xs leading-relaxed text-gray-700", children: finalApprovalInfo.summary }), finalApprovalInfo.riskLevel && (_jsxs("div", { className: `mt-2 inline-flex items-center gap-1.5 rounded-full px-2 py-1 text-[10px] font-semibold ${finalApprovalInfo.riskLevel === "high"
348
+ ? "bg-red-100 text-red-700"
349
+ : finalApprovalInfo.riskLevel === "medium"
350
+ ? "bg-amber-100 text-amber-700"
351
+ : "bg-green-100 text-green-700"}`, children: [_jsx("span", { className: "font-normal", children: "Risk:" }), _jsx("span", { className: "uppercase", children: finalApprovalInfo.riskLevel })] }))] })] }) }), _jsxs("div", { className: "flex flex-col gap-2 bg-white/60 p-3", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [_jsx(Button, { size: "sm", variant: "secondary", "data-testid": "agent-reject-button", onClick: async () => {
352
+ markAsShown(); // Mark as shown when user interacts
353
+ // Use the dbMessageId from AgentToolCall if available, otherwise fall back to messageId or prop
354
+ const actualMessageId = isAgentToolCall
355
+ ? originalToolCall.dbMessageId ||
356
+ originalToolCall.messageId
357
+ : messageId;
358
+ if (!agentId) {
359
+ console.error("❌ Cannot reject tool call: agentId is missing");
360
+ return;
361
+ }
362
+ if (!actualMessageId) {
363
+ console.error("❌ Cannot reject tool call: messageId is missing");
364
+ return;
365
+ }
366
+ console.log("🚫 Rejecting tool call:", {
806
367
  agentId,
807
- itemId: allowableScope.parentItemId,
808
- operationType: "delete",
809
- scopeType: "itemSubtree",
368
+ messageId: actualMessageId,
369
+ toolCallId: toolCall.id,
810
370
  });
811
- await approveCurrentToolCall();
812
- }
813
- catch (error) {
814
- console.error("Failed to create operation allowance:", error);
815
- alert(`Failed to allow deletes in scope: ${error?.message || "Unknown error"}`);
816
- }
817
- finally {
818
- setIsCreatingAllowance(false);
819
- }
820
- }, children: _jsx(ShieldCheck, { className: "size-3" }) }) }), _jsx(TooltipContent, { side: "top", children: isCreatingAllowance
821
- ? "Allowing..."
822
- : `Allow deletes in ${allowableScope?.parentItemPath}` })] })), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Reject", "data-testid": "agent-reject-button", className: "flex size-5 shrink-0 items-center justify-center rounded text-red-600 hover:bg-red-50 hover:text-red-700", onClick: async (e) => {
823
- e.stopPropagation();
824
- markAsShown();
825
- const actualMessageId = getActualMessageId();
826
- if (!agentId) {
827
- console.error("❌ Cannot reject tool call: agentId is missing");
828
- return;
829
- }
830
- if (!actualMessageId) {
831
- console.error("❌ Cannot reject tool call: messageId is missing");
832
- return;
833
- }
834
- try {
835
- await rejectToolCall({
371
+ try {
372
+ const result = await rejectToolCall({
373
+ agentId,
374
+ messageId: actualMessageId,
375
+ toolCallId: toolCall.id,
376
+ });
377
+ console.log("✅ Reject successful:", result);
378
+ const ev = new CustomEvent("agent:toolApprovalResolved", {
379
+ detail: {
380
+ messageId: actualMessageId,
381
+ toolCallId: toolCall.id,
382
+ approved: false,
383
+ },
384
+ });
385
+ window.dispatchEvent(ev);
386
+ }
387
+ catch (error) {
388
+ console.error("❌ Reject failed:", error);
389
+ }
390
+ }, children: "Reject" }), _jsx(Button, { size: "sm", "data-testid": "agent-approve-button", onClick: async () => {
391
+ markAsShown(); // Mark as shown when user interacts
392
+ // Use the dbMessageId from AgentToolCall if available, otherwise fall back to messageId or prop
393
+ const actualMessageId = isAgentToolCall
394
+ ? originalToolCall.dbMessageId ||
395
+ originalToolCall.messageId
396
+ : messageId;
397
+ if (!agentId) {
398
+ console.error("❌ Cannot approve tool call: agentId is missing");
399
+ return;
400
+ }
401
+ if (!actualMessageId) {
402
+ console.error("❌ Cannot approve tool call: messageId is missing");
403
+ return;
404
+ }
405
+ console.log("✅ Approving tool call:", {
836
406
  agentId,
837
407
  messageId: actualMessageId,
838
408
  toolCallId: toolCall.id,
839
409
  });
840
- dispatchApprovalResolved(actualMessageId, false);
841
- }
842
- catch (error) {
843
- console.error("❌ Reject failed:", error);
844
- }
845
- }, children: _jsx(X, { className: "size-3" }) }) }), _jsx(TooltipContent, { side: "top", children: "Reject" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Approve", "data-testid": "agent-approve-button", className: "flex size-5 shrink-0 items-center justify-center rounded text-green-600 hover:bg-green-50 hover:text-green-700", onClick: async (e) => {
846
- e.stopPropagation();
847
- markAsShown();
848
- try {
849
- await approveCurrentToolCall();
850
- }
851
- catch (error) {
852
- console.error("❌ Approve failed:", error);
853
- alert(`Failed to approve: ${error?.message || "Unknown error"}`);
854
- }
855
- }, children: _jsx(Check, { className: "size-3" }) }) }), _jsx(TooltipContent, { side: "top", children: "Approve" })] })] }));
410
+ try {
411
+ const result = await approveToolCall({
412
+ agentId,
413
+ messageId: actualMessageId,
414
+ toolCallId: toolCall.id,
415
+ });
416
+ console.log("✅ Approve successful:", result);
417
+ const ev = new CustomEvent("agent:toolApprovalResolved", {
418
+ detail: {
419
+ messageId: actualMessageId,
420
+ toolCallId: toolCall.id,
421
+ approved: true,
422
+ },
423
+ });
424
+ window.dispatchEvent(ev);
425
+ }
426
+ catch (error) {
427
+ console.error("❌ Approve failed:", error);
428
+ alert(`Failed to approve: ${error?.message || "Unknown error"}`);
429
+ }
430
+ }, children: "Approve" })] }), (() => {
431
+ const currentRiskLevel = finalApprovalInfo?.riskLevel;
432
+ const sameRiskCount = allPendingApprovals.filter((p) => (p.riskLevel || undefined) === currentRiskLevel).length;
433
+ const totalPendingCount = allPendingApprovals.length;
434
+ // Only show batch actions if there's more than 1 pending approval
435
+ if (totalPendingCount <= 1)
436
+ return null;
437
+ const riskLabel = currentRiskLevel
438
+ ? currentRiskLevel.charAt(0).toUpperCase() + currentRiskLevel.slice(1)
439
+ : "Same";
440
+ return (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 border-t border-amber-200/60 pt-2", children: [_jsx(Button, { size: "sm", variant: "outline", disabled: isSwitchingMode, onClick: handleSwitchToAutonomous, className: "text-xs", children: isSwitchingMode ? "Switching..." : "Switch to Autonomous" }), sameRiskCount > 1 && (_jsx(Button, { size: "sm", variant: "outline", disabled: isApprovingAll, onClick: () => handleApproveAllByRisk(currentRiskLevel), className: "text-xs", children: isApprovingAll
441
+ ? "Approving..."
442
+ : `Approve All ${riskLabel} (${sameRiskCount})` }))] }));
443
+ })()] })] }));
856
444
  }
857
445
  //# sourceMappingURL=ToolCallDisplay.js.map