@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.
- package/dist/agents-view/AgentCard.d.ts +4 -6
- package/dist/agents-view/AgentCard.js +24 -143
- package/dist/agents-view/AgentCard.js.map +1 -1
- package/dist/agents-view/AgentsInbox.d.ts +1 -1
- package/dist/agents-view/AgentsInbox.js +92 -7
- package/dist/agents-view/AgentsInbox.js.map +1 -1
- package/dist/agents-view/AgentsTitlebar.js +2 -3
- package/dist/agents-view/AgentsTitlebar.js.map +1 -1
- package/dist/agents-view/AgentsView.d.ts +7 -6
- package/dist/agents-view/AgentsView.js +99 -191
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.d.ts +6 -2
- package/dist/agents-view/AgentsWorkspaceView.js +113 -266
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/agents-view/ProfileAgentsGroup.d.ts +1 -2
- package/dist/agents-view/ProfileAgentsGroup.js +3 -4
- 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 +4 -2
- 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 +10 -6
- 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 +1 -4
- 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 +4 -12
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/copy-button.d.ts +1 -2
- 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 +126 -21
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/input.d.ts +1 -1
- package/dist/components/ui/input.js +3 -5
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/paste-button.d.ts +1 -2
- 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 +9 -1
- 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 +11 -4
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/config/config.d.ts +2 -4
- package/dist/config/config.js +70 -250
- package/dist/config/config.js.map +1 -1
- package/dist/config/types/workspace.d.ts +0 -6
- package/dist/config/types.d.ts +12 -63
- package/dist/config/types.js.map +1 -1
- package/dist/editor/ComponentInfo.d.ts +4 -0
- package/dist/editor/ComponentInfo.js +41 -0
- package/dist/editor/ComponentInfo.js.map +1 -0
- package/dist/editor/ConfirmationDialog.js +4 -20
- package/dist/editor/ConfirmationDialog.js.map +1 -1
- package/dist/editor/ContentTree.d.ts +1 -2
- package/dist/editor/ContentTree.js +32 -93
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/Editor.js +22 -87
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FieldHistory.js +36 -84
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/FieldListField.js +9 -21
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/FieldListFieldWithFallbacks.js +2 -23
- package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
- package/dist/editor/GlobalMenuBar.js +2 -29
- package/dist/editor/GlobalMenuBar.js.map +1 -1
- package/dist/editor/ImageEditor.js +2 -5
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/ItemInfo.js +1 -36
- package/dist/editor/ItemInfo.js.map +1 -1
- package/dist/editor/LinkEditorDialog.js +0 -3
- package/dist/editor/LinkEditorDialog.js.map +1 -1
- package/dist/editor/MainLayout.d.ts +2 -0
- package/dist/editor/MainLayout.js +8 -65
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/MigrationsView.js +5 -29
- package/dist/editor/MigrationsView.js.map +1 -1
- package/dist/editor/MobileLayout.js +12 -37
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/PictureCropper.js +45 -54
- package/dist/editor/PictureCropper.js.map +1 -1
- package/dist/editor/PictureEditor.js +15 -17
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/QuickItemSwitcher.js +63 -37
- package/dist/editor/QuickItemSwitcher.js.map +1 -1
- package/dist/editor/SetupWizard.js +12 -52
- package/dist/editor/SetupWizard.js.map +1 -1
- package/dist/editor/Titlebar.js +2 -7
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/ai/AgentCostDisplay.d.ts +0 -1
- package/dist/editor/ai/AgentCostDisplay.js +1 -1
- package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
- package/dist/editor/ai/AgentDocumentList.js +14 -32
- package/dist/editor/ai/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/AgentGreeting.js +5 -6
- package/dist/editor/ai/AgentGreeting.js.map +1 -1
- package/dist/editor/ai/AgentProfileSelector.js +1 -2
- package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
- package/dist/editor/ai/AgentStatusBadge.d.ts +5 -0
- package/dist/editor/ai/AgentStatusBadge.js +65 -67
- package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.d.ts +2 -14
- package/dist/editor/ai/AgentTerminal.js +572 -2508
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.d.ts +4 -9
- package/dist/editor/ai/AgentTerminalStatusBar.js +56 -481
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/Agents.js +113 -161
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/AiResponseMessage.d.ts +1 -10
- package/dist/editor/ai/AiResponseMessage.js +26 -267
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.d.ts +3 -2
- package/dist/editor/ai/ContextInfoBar.js +7 -64
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/EditOperationsPanel.d.ts +2 -3
- package/dist/editor/ai/EditOperationsPanel.js +78 -21
- package/dist/editor/ai/EditOperationsPanel.js.map +1 -1
- package/dist/editor/ai/GuidanceOverlay.js +11 -17
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/HelpTerminal.d.ts +5 -0
- package/dist/editor/ai/HelpTerminal.js +166 -0
- package/dist/editor/ai/HelpTerminal.js.map +1 -0
- package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
- package/dist/editor/ai/InlineAiDialog.js +192 -514
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +12 -115
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/MediaImage.js +8 -40
- package/dist/editor/ai/MediaImage.js.map +1 -1
- package/dist/editor/ai/SpawnedAgentsPanel.js +12 -10
- package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
- package/dist/editor/ai/ToolCallDisplay.d.ts +2 -22
- package/dist/editor/ai/ToolCallDisplay.js +202 -614
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +8 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.js +42 -379
- package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
- package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +1 -5
- package/dist/editor/ai/dialogs/QuestionnaireInline.js +60 -628
- package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
- package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +0 -117
- package/dist/editor/ai/dialogs/agentDialogTypes.js +0 -2
- package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
- package/dist/editor/ai/types.d.ts +1 -3
- package/dist/editor/ai/useAgentStatus.d.ts +1 -2
- package/dist/editor/ai/useAgentStatus.js +100 -90
- package/dist/editor/ai/useAgentStatus.js.map +1 -1
- package/dist/editor/ai/useInlineAiPosition.js +5 -45
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/client/AboutDialog.js +2 -4
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.d.ts +1 -4
- package/dist/editor/client/EditorShell.js +258 -853
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +19 -33
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/helpers.js +0 -6
- package/dist/editor/client/helpers.js.map +1 -1
- package/dist/editor/client/hooks/useEditorUrlSync.js +2 -1
- package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.d.ts +0 -10
- package/dist/editor/client/hooks/useEditorWebSocket.js +14 -209
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/client/hooks/useQuota.d.ts +0 -8
- package/dist/editor/client/hooks/useQuota.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +15 -73
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.js +6 -10
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +3 -6
- package/dist/editor/client/operations.js +30 -208
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +31 -4
- 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 +6 -0
- package/dist/editor/client/ui/EditorChrome.js +72 -55
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/client/ui/FullscreenControls.js +3 -5
- package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
- package/dist/editor/commands/commands.d.ts +1 -11
- package/dist/editor/commands/commands.js +1 -12
- package/dist/editor/commands/commands.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +55 -109
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/commands/customCommandConverter.d.ts +1 -8
- package/dist/editor/commands/customCommandConverter.js +5 -35
- package/dist/editor/commands/customCommandConverter.js.map +1 -1
- package/dist/editor/commands/handlers/agentHandler.js +1 -2
- package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
- package/dist/editor/commands/itemCommands.d.ts +0 -3
- package/dist/editor/commands/itemCommands.js +10 -93
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/commands/undo.d.ts +15 -9
- package/dist/editor/commands/undo.js +0 -24
- package/dist/editor/commands/undo.js.map +1 -1
- package/dist/editor/context-menu/InsertMenu.js +39 -83
- 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/ReactQuill.d.ts +125 -0
- package/dist/editor/field-types/ReactQuill.js +385 -0
- package/dist/editor/field-types/ReactQuill.js.map +1 -0
- package/dist/editor/field-types/RichTextEditor.js +5 -13
- package/dist/editor/field-types/RichTextEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +3 -37
- 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 +2 -3
- package/dist/editor/field-types/TreeListEditor.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.css +5 -23
- package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +0 -2
- package/dist/editor/field-types/richtext/components/ReactSlate.js +4 -28
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ToolbarButton.js +2 -4
- package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +0 -13
- package/dist/editor/field-types/richtext/contextMenuFactory.js +24 -181
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +0 -2
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/field-types/richtext/utils/plugins.js +0 -4
- package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
- package/dist/editor/field-types/textContextMenuFactory.js +2 -3
- package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
- package/dist/editor/media-selector/AiImageSearchPrompt.js +2 -4
- 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 +1 -7
- package/dist/editor/media-selector/MediaSelector.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +35 -40
- 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 +2 -4
- 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 +147 -26
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/Separator.js +1 -1
- package/dist/editor/menubar/VersionSelector.js +4 -2
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/menubar/WorkflowButton.js +12 -39
- package/dist/editor/menubar/WorkflowButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +38 -16
- 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 +0 -1
- package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -6
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +220 -597
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js +2 -13
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/CommentHighlighting.js +1 -42
- 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 +48 -97
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +17 -38
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +11 -17
- 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 +11 -69
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.d.ts +4 -2
- package/dist/editor/page-viewer/MiniMap.js +28 -91
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.d.ts +1 -3
- package/dist/editor/page-viewer/PageViewer.js +19 -92
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +1 -2
- package/dist/editor/page-viewer/PageViewerFrame.js +115 -348
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +49 -114
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
- package/dist/editor/page-viewer/pageViewContext.d.ts +0 -1
- package/dist/editor/page-viewer/pageViewContext.js +14 -51
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/pageModel.d.ts +1 -14
- package/dist/editor/reviews/Comment.d.ts +1 -2
- package/dist/editor/reviews/Comment.js +15 -92
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentDisplayPopover.js +5 -70
- package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.d.ts +1 -3
- package/dist/editor/reviews/CommentView.js +6 -26
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.js +75 -140
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js +177 -281
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/DecisionsMatrix.js +25 -96
- package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
- package/dist/editor/reviews/DiffView.js +14 -7
- package/dist/editor/reviews/DiffView.js.map +1 -1
- package/dist/editor/reviews/EditReviewSettingsDialog.js +4 -6
- package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
- package/dist/editor/reviews/MultiReviewManager.js +3 -25
- package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
- package/dist/editor/reviews/PagesPanel.js +15 -31
- package/dist/editor/reviews/PagesPanel.js.map +1 -1
- package/dist/editor/reviews/PreviewInfo.js +4 -1
- package/dist/editor/reviews/PreviewInfo.js.map +1 -1
- package/dist/editor/reviews/ReviewCard.js +7 -13
- package/dist/editor/reviews/ReviewCard.js.map +1 -1
- package/dist/editor/reviews/ReviewDetail.js +2 -3
- package/dist/editor/reviews/ReviewDetail.js.map +1 -1
- package/dist/editor/reviews/ReviewsList.js +3 -7
- package/dist/editor/reviews/ReviewsList.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +3 -34
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -31
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/commentAi.js +6 -25
- package/dist/editor/reviews/commentAi.js.map +1 -1
- package/dist/editor/reviews/reviewCommands.js +1 -4
- 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 +3 -4
- package/dist/editor/reviews/useReviews.js +32 -21
- package/dist/editor/reviews/useReviews.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +5 -240
- package/dist/editor/services/agentService.js +39 -299
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +1 -57
- package/dist/editor/services/aiService.js +6 -79
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +3 -6
- package/dist/editor/services/contentService.js +12 -13
- package/dist/editor/services/contentService.js.map +1 -1
- package/dist/editor/services/editService.d.ts +1 -52
- package/dist/editor/services/editService.js +2 -94
- 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 +6 -3
- package/dist/editor/services/reviewsService.js +11 -2
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/services/serviceHelper.d.ts +1 -2
- package/dist/editor/services/serviceHelper.js +20 -112
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/services/systemService.d.ts +1 -2
- package/dist/editor/services/systemService.js +0 -3
- package/dist/editor/services/systemService.js.map +1 -1
- package/dist/editor/services-server/api.d.ts +2 -1
- package/dist/editor/services-server/api.js +6 -11
- package/dist/editor/services-server/api.js.map +1 -1
- package/dist/editor/services-server/graphQL.d.ts +29 -0
- package/dist/editor/services-server/graphQL.js +53 -0
- package/dist/editor/services-server/graphQL.js.map +1 -0
- package/dist/editor/settings/About.js +3 -317
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/AllAgentsPanel.d.ts +5 -0
- package/dist/editor/settings/AllAgentsPanel.js +139 -0
- package/dist/editor/settings/AllAgentsPanel.js.map +1 -0
- package/dist/editor/settings/IndexOverview.js +1 -3
- package/dist/editor/settings/IndexOverview.js.map +1 -1
- package/dist/editor/settings/LatestFeedback.d.ts +1 -0
- package/dist/editor/settings/LatestFeedback.js +136 -0
- package/dist/editor/settings/LatestFeedback.js.map +1 -0
- package/dist/editor/settings/QuotaInfo.js +4 -210
- package/dist/editor/settings/QuotaInfo.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +23 -25
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/Setup.d.ts +1 -0
- package/dist/editor/settings/Setup.js +211 -0
- package/dist/editor/settings/Setup.js.map +1 -0
- package/dist/editor/settings/Status.js +6 -7
- package/dist/editor/settings/Status.js.map +1 -1
- package/dist/editor/settings/index/useIndexStatus.js +22 -23
- package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
- package/dist/editor/settings/panels/AgentsPanel.d.ts +4 -0
- package/dist/editor/settings/panels/AgentsPanel.js +121 -95
- package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
- package/dist/editor/settings/panels/DatabasePanel.d.ts +6 -0
- package/dist/editor/settings/panels/DatabasePanel.js +50 -0
- package/dist/editor/settings/panels/DatabasePanel.js.map +1 -0
- package/dist/editor/settings/panels/ModelsPanel.js +108 -324
- 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 +59 -86
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
- package/dist/editor/settings/panels/SearchConfigPanel.js +6 -67
- package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
- package/dist/editor/settings/panels/StatusPanel.js +2 -7
- package/dist/editor/settings/panels/StatusPanel.js.map +1 -1
- package/dist/editor/settings/panels/index.d.ts +2 -3
- package/dist/editor/settings/panels/index.js +2 -3
- package/dist/editor/settings/panels/index.js.map +1 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js +21 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +5 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +44 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +1 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js +36 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js +111 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SetupOverview.d.ts +14 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js +38 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js.map +1 -0
- package/dist/editor/settings/status/coreStatusChecks.js +19 -124
- package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
- package/dist/editor/settings/status/useStartupChecks.d.ts +1 -3
- package/dist/editor/settings/status/useStartupChecks.js +5 -9
- package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
- package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +1 -2
- package/dist/editor/setup-wizard/steps/CompleteStep.js +1 -2
- package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
- package/dist/editor/sidebar/ComponentPalette.js +1 -2
- package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.d.ts +1 -8
- package/dist/editor/sidebar/ComponentTree.js +69 -216
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/Debug.d.ts +1 -0
- package/dist/editor/sidebar/Debug.js +70 -0
- package/dist/editor/sidebar/Debug.js.map +1 -0
- package/dist/editor/sidebar/EditHistory.js +46 -22
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/Favorites.js +8 -4
- package/dist/editor/sidebar/Favorites.js.map +1 -1
- package/dist/editor/sidebar/GraphQL.d.ts +2 -0
- package/dist/editor/sidebar/GraphQL.js +234 -0
- package/dist/editor/sidebar/GraphQL.js.map +1 -0
- package/dist/editor/sidebar/LeftToolbar.d.ts +1 -0
- package/dist/editor/sidebar/LeftToolbar.js +12 -0
- package/dist/editor/sidebar/LeftToolbar.js.map +1 -0
- package/dist/editor/sidebar/MainContentTree.js +3 -4
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/sidebar/NavigationSidebar.d.ts +4 -0
- package/dist/editor/sidebar/NavigationSidebar.js +254 -0
- package/dist/editor/sidebar/NavigationSidebar.js.map +1 -0
- package/dist/editor/sidebar/OperationItem.js +7 -21
- package/dist/editor/sidebar/OperationItem.js.map +1 -1
- package/dist/editor/sidebar/SidebarPanel.d.ts +1 -3
- package/dist/editor/sidebar/SidebarPanel.js +12 -44
- package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
- package/dist/editor/sidebar/SidebarStack.d.ts +1 -2
- package/dist/editor/sidebar/SidebarStack.js +3 -4
- package/dist/editor/sidebar/SidebarStack.js.map +1 -1
- package/dist/editor/sidebar/Validation.js +12 -24
- package/dist/editor/sidebar/Validation.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +3 -53
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceRail.d.ts +1 -0
- package/dist/editor/sidebar/WorkspaceRail.js +167 -56
- package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
- package/dist/editor/tree-indicators/GutterColumns.d.ts +1 -3
- package/dist/editor/tree-indicators/GutterColumns.js +5 -26
- package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
- package/dist/editor/tree-indicators/GutterContext.d.ts +0 -4
- package/dist/editor/tree-indicators/GutterContext.js +0 -23
- package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
- package/dist/editor/tree-indicators/GutterSelector.d.ts +5 -0
- package/dist/editor/tree-indicators/GutterSelector.js +91 -0
- package/dist/editor/tree-indicators/GutterSelector.js.map +1 -0
- package/dist/editor/tree-indicators/index.d.ts +1 -0
- package/dist/editor/tree-indicators/index.js +1 -0
- package/dist/editor/tree-indicators/index.js.map +1 -1
- package/dist/editor/tree-indicators/types.d.ts +1 -12
- 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 +0 -2
- package/dist/editor/ui/ItemNameDialogNew.js +17 -33
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/editor/ui/ItemSearch.js +11 -7
- 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 +0 -1
- package/dist/editor/ui/SimpleTabs.js +25 -45
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +0 -1
- package/dist/editor/ui/Splitter.js +86 -102
- 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 +1 -6
- package/dist/editor/ui/TreeListSelector.js +2 -2
- package/dist/editor/ui/TreeListSelector.js.map +1 -1
- package/dist/editor/utils/keyboardNavigation.d.ts +20 -6
- package/dist/editor/utils/keyboardNavigation.js +140 -48
- package/dist/editor/utils/keyboardNavigation.js.map +1 -1
- package/dist/editor/utils.js +9 -19
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/views/CompareView.d.ts +1 -3
- package/dist/editor/views/CompareView.js +5 -7
- 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 +34 -27
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/editor/views/ItemEditor.js +3 -7
- 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 +6 -5
- package/dist/editor/views/ParheliaView.js.map +1 -1
- package/dist/editor/views/SingleEditView.d.ts +1 -2
- package/dist/editor/views/SingleEditView.js +8 -10
- package/dist/editor/views/SingleEditView.js.map +1 -1
- package/dist/editor/views/editorSlotContext.js +6 -35
- package/dist/editor/views/editorSlotContext.js.map +1 -1
- package/dist/index.d.ts +2 -16
- package/dist/index.js +0 -11
- 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 +14 -48
- package/dist/setup/services/setupWizardService.js +17 -52
- package/dist/setup/services/setupWizardService.js.map +1 -1
- package/dist/setup/wizard/steps/AddModelDialog.js +3 -12
- package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
- package/dist/setup/wizard/steps/ImportModelDialog.js +22 -46
- package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
- package/dist/splash-screen/ModernSplashScreen.js +32 -112
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +50 -33
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +6 -2
- package/dist/splash-screen/OpenPage.js.map +1 -1
- package/dist/splash-screen/ParheliaAssistantChat.js +29 -12
- package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
- package/dist/splash-screen/ParheliaLogo.js +37 -87
- 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 +1 -2
- package/dist/tour/Tour.js +75 -256
- package/dist/tour/Tour.js.map +1 -1
- package/dist/tour/default-tour.js +96 -222
- package/dist/tour/default-tour.js.map +1 -1
- package/dist/types.d.ts +29 -70
- package/package.json +15 -19
- package/styles.css +10 -39
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
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 {
|
|
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,
|
|
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-
|
|
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.
|
|
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
|
|
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
|
|
322
|
-
const
|
|
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
|
-
|
|
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,
|
|
413
|
-
const [
|
|
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
|
-
|
|
504
|
-
|
|
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
|
|
507
|
-
if (
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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
|
-
|
|
541
|
-
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error(`Failed to approve tool call ${pending.toolCallId}:`, error);
|
|
542
225
|
}
|
|
543
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
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
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
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
|
-
|
|
808
|
-
|
|
809
|
-
scopeType: "itemSubtree",
|
|
368
|
+
messageId: actualMessageId,
|
|
369
|
+
toolCallId: toolCall.id,
|
|
810
370
|
});
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
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
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
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
|