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