@stack-spot/ai-chat-widget 0.11.0 → 1.0.0-dev.1768324407795
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/CHANGELOG.md +972 -0
- package/README.md +1 -0
- package/dist/StackspotAIWidget.d.ts +48 -7
- package/dist/StackspotAIWidget.d.ts.map +1 -1
- package/dist/StackspotAIWidget.js +22 -23
- package/dist/StackspotAIWidget.js.map +1 -1
- package/dist/app-metadata.json +175 -0
- package/dist/assets/placeholder.png +0 -0
- package/dist/chat-interceptors/CustomInputs.d.ts +4 -1
- package/dist/chat-interceptors/CustomInputs.d.ts.map +1 -1
- package/dist/chat-interceptors/CustomInputs.js +10 -1
- package/dist/chat-interceptors/CustomInputs.js.map +1 -1
- package/dist/chat-interceptors/quick-command-questions.d.ts +10 -0
- package/dist/chat-interceptors/quick-command-questions.d.ts.map +1 -1
- package/dist/chat-interceptors/quick-command-questions.js +12 -2
- package/dist/chat-interceptors/quick-command-questions.js.map +1 -1
- package/dist/chat-interceptors/quick-commands.d.ts +11 -0
- package/dist/chat-interceptors/quick-commands.d.ts.map +1 -1
- package/dist/chat-interceptors/quick-commands.js +241 -48
- package/dist/chat-interceptors/quick-commands.js.map +1 -1
- package/dist/chat-interceptors/send-message.d.ts +26 -1
- package/dist/chat-interceptors/send-message.d.ts.map +1 -1
- package/dist/chat-interceptors/send-message.js +227 -26
- package/dist/chat-interceptors/send-message.js.map +1 -1
- package/dist/components/AdaptiveTextArea.d.ts +15 -3
- package/dist/components/AdaptiveTextArea.d.ts.map +1 -1
- package/dist/components/AdaptiveTextArea.js +22 -10
- package/dist/components/AdaptiveTextArea.js.map +1 -1
- package/dist/components/AgentCard/AgentCardCreate.d.ts +4 -0
- package/dist/components/AgentCard/AgentCardCreate.d.ts.map +1 -0
- package/dist/components/AgentCard/AgentCardCreate.js +33 -0
- package/dist/components/AgentCard/AgentCardCreate.js.map +1 -0
- package/dist/components/AgentCard/dictionary.d.ts +23 -0
- package/dist/components/AgentCard/dictionary.d.ts.map +1 -0
- package/dist/components/AgentCard/dictionary.js +23 -0
- package/dist/components/AgentCard/dictionary.js.map +1 -0
- package/dist/components/AgentCard/index.d.ts +5 -0
- package/dist/components/AgentCard/index.d.ts.map +1 -0
- package/dist/components/AgentCard/index.js +55 -0
- package/dist/components/AgentCard/index.js.map +1 -0
- package/dist/components/AnimatedOpacity.d.ts +8 -0
- package/dist/components/AnimatedOpacity.d.ts.map +1 -0
- package/dist/components/AnimatedOpacity.js +46 -0
- package/dist/components/AnimatedOpacity.js.map +1 -0
- package/dist/components/AutoFocus.d.ts +23 -0
- package/dist/components/AutoFocus.d.ts.map +1 -0
- package/dist/components/AutoFocus.js +23 -0
- package/dist/components/AutoFocus.js.map +1 -0
- package/dist/components/ButtonFavorite.d.ts +40 -0
- package/dist/components/ButtonFavorite.d.ts.map +1 -0
- package/dist/components/ButtonFavorite.js +25 -0
- package/dist/components/ButtonFavorite.js.map +1 -0
- package/dist/components/Code.d.ts +2 -1
- package/dist/components/Code.d.ts.map +1 -1
- package/dist/components/Code.js +52 -24
- package/dist/components/Code.js.map +1 -1
- package/dist/components/ComponentNavigator.d.ts +38 -0
- package/dist/components/ComponentNavigator.d.ts.map +1 -0
- package/dist/components/ComponentNavigator.js +31 -0
- package/dist/components/ComponentNavigator.js.map +1 -0
- package/dist/components/Fading.d.ts +32 -0
- package/dist/components/Fading.d.ts.map +1 -0
- package/dist/components/Fading.js +33 -0
- package/dist/components/Fading.js.map +1 -0
- package/dist/components/FadingOverflow.d.ts +25 -0
- package/dist/components/FadingOverflow.d.ts.map +1 -1
- package/dist/components/FadingOverflow.js +16 -8
- package/dist/components/FadingOverflow.js.map +1 -1
- package/dist/components/FileDescription.d.ts +10 -0
- package/dist/components/FileDescription.d.ts.map +1 -0
- package/dist/components/FileDescription.js +84 -0
- package/dist/components/FileDescription.js.map +1 -0
- package/dist/components/HistoryList.d.ts +15 -0
- package/dist/components/HistoryList.d.ts.map +1 -1
- package/dist/components/HistoryList.js +6 -2
- package/dist/components/HistoryList.js.map +1 -1
- package/dist/components/ListResource.d.ts +29 -0
- package/dist/components/ListResource.d.ts.map +1 -0
- package/dist/components/ListResource.js +17 -0
- package/dist/components/ListResource.js.map +1 -0
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown.js +2 -2
- package/dist/components/Markdown.js.map +1 -1
- package/dist/components/Modal.d.ts +9 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +56 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/QuickStartButton.d.ts +2 -4
- package/dist/components/QuickStartButton.d.ts.map +1 -1
- package/dist/components/QuickStartButton.js +7 -39
- package/dist/components/QuickStartButton.js.map +1 -1
- package/dist/components/RightPanelContentList.d.ts +10 -0
- package/dist/components/RightPanelContentList.d.ts.map +1 -0
- package/dist/components/RightPanelContentList.js +7 -0
- package/dist/components/RightPanelContentList.js.map +1 -0
- package/dist/components/RightPanelForm.d.ts +3 -0
- package/dist/components/RightPanelForm.d.ts.map +1 -1
- package/dist/components/RightPanelForm.js +57 -17
- package/dist/components/RightPanelForm.js.map +1 -1
- package/dist/components/RightPanelTabs.d.ts +4 -4
- package/dist/components/RightPanelTabs.d.ts.map +1 -1
- package/dist/components/RightPanelTabs.js +7 -16
- package/dist/components/RightPanelTabs.js.map +1 -1
- package/dist/components/Selector/index.d.ts +54 -0
- package/dist/components/Selector/index.d.ts.map +1 -0
- package/dist/components/Selector/index.js +143 -0
- package/dist/components/Selector/index.js.map +1 -0
- package/dist/components/Selector/styled.d.ts +4 -0
- package/dist/components/Selector/styled.d.ts.map +1 -0
- package/dist/components/Selector/styled.js +157 -0
- package/dist/components/Selector/styled.js.map +1 -0
- package/dist/components/StackedBadge.d.ts +14 -0
- package/dist/components/StackedBadge.d.ts.map +1 -0
- package/dist/components/StackedBadge.js +56 -0
- package/dist/components/StackedBadge.js.map +1 -0
- package/dist/components/TabManager.d.ts +6 -0
- package/dist/components/TabManager.d.ts.map +1 -1
- package/dist/components/TabManager.js +16 -28
- package/dist/components/TabManager.js.map +1 -1
- package/dist/components/ToolBadge.d.ts +9 -0
- package/dist/components/ToolBadge.d.ts.map +1 -0
- package/dist/components/ToolBadge.js +34 -0
- package/dist/components/ToolBadge.js.map +1 -0
- package/dist/components/WorkspaceTabNavigator.d.ts +17 -0
- package/dist/components/WorkspaceTabNavigator.d.ts.map +1 -0
- package/dist/components/WorkspaceTabNavigator.js +93 -0
- package/dist/components/WorkspaceTabNavigator.js.map +1 -0
- package/dist/components/form/DescribedCheckboxGroup.d.ts +30 -2
- package/dist/components/form/DescribedCheckboxGroup.d.ts.map +1 -1
- package/dist/components/form/DescribedCheckboxGroup.js +75 -21
- package/dist/components/form/DescribedCheckboxGroup.js.map +1 -1
- package/dist/components/form/DescribedRadioGroup.d.ts +31 -2
- package/dist/components/form/DescribedRadioGroup.d.ts.map +1 -1
- package/dist/components/form/DescribedRadioGroup.js +65 -16
- package/dist/components/form/DescribedRadioGroup.js.map +1 -1
- package/dist/components/form/dictionary.d.ts +19 -0
- package/dist/components/form/dictionary.d.ts.map +1 -0
- package/dist/components/form/dictionary.js +19 -0
- package/dist/components/form/dictionary.js.map +1 -0
- package/dist/components/form/styled.d.ts.map +1 -1
- package/dist/components/form/styled.js +1 -2
- package/dist/components/form/styled.js.map +1 -1
- package/dist/components/form/types.d.ts +42 -0
- package/dist/components/form/types.d.ts.map +1 -1
- package/dist/context/AIWidgetProvider.d.ts +19 -0
- package/dist/context/AIWidgetProvider.d.ts.map +1 -1
- package/dist/context/AIWidgetProvider.js +19 -0
- package/dist/context/AIWidgetProvider.js.map +1 -1
- package/dist/context/hooks.d.ts +61 -4
- package/dist/context/hooks.d.ts.map +1 -1
- package/dist/context/hooks.js +83 -13
- package/dist/context/hooks.js.map +1 -1
- package/dist/features.d.ts +72 -10
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +23 -8
- package/dist/features.js.map +1 -1
- package/dist/hooks/midnight-update-view.d.ts +5 -0
- package/dist/hooks/midnight-update-view.d.ts.map +1 -0
- package/dist/hooks/midnight-update-view.js +30 -0
- package/dist/hooks/midnight-update-view.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/layout.css +95 -28
- package/dist/regex.d.ts +3 -0
- package/dist/regex.d.ts.map +1 -0
- package/dist/regex.js +3 -0
- package/dist/regex.js.map +1 -0
- package/dist/right-panel/DefaultPanel.d.ts +3 -0
- package/dist/right-panel/DefaultPanel.d.ts.map +1 -1
- package/dist/right-panel/DefaultPanel.js +5 -4
- package/dist/right-panel/DefaultPanel.js.map +1 -1
- package/dist/right-panel/RightPanel.d.ts +3 -0
- package/dist/right-panel/RightPanel.d.ts.map +1 -1
- package/dist/right-panel/RightPanel.js +3 -0
- package/dist/right-panel/RightPanel.js.map +1 -1
- package/dist/right-panel/RightPanelProvider.d.ts +15 -0
- package/dist/right-panel/RightPanelProvider.d.ts.map +1 -1
- package/dist/right-panel/RightPanelProvider.js.map +1 -1
- package/dist/right-panel/constants.d.ts +2 -0
- package/dist/right-panel/constants.d.ts.map +1 -0
- package/dist/right-panel/constants.js +2 -0
- package/dist/right-panel/constants.js.map +1 -0
- package/dist/right-panel/hooks.d.ts +6 -0
- package/dist/right-panel/hooks.d.ts.map +1 -1
- package/dist/right-panel/hooks.js +8 -1
- package/dist/right-panel/hooks.js.map +1 -1
- package/dist/state/ChatEntry.d.ts +182 -8
- package/dist/state/ChatEntry.d.ts.map +1 -1
- package/dist/state/ChatEntry.js +26 -3
- package/dist/state/ChatEntry.js.map +1 -1
- package/dist/state/ChatState.d.ts +116 -14
- package/dist/state/ChatState.d.ts.map +1 -1
- package/dist/state/ChatState.js +49 -8
- package/dist/state/ChatState.js.map +1 -1
- package/dist/state/ChatTabsController.d.ts +50 -1
- package/dist/state/ChatTabsController.d.ts.map +1 -1
- package/dist/state/ChatTabsController.js +77 -8
- package/dist/state/ChatTabsController.js.map +1 -1
- package/dist/state/ObservableState.d.ts +14 -0
- package/dist/state/ObservableState.d.ts.map +1 -1
- package/dist/state/ObservableState.js +14 -0
- package/dist/state/ObservableState.js.map +1 -1
- package/dist/state/WidgetState.d.ts +62 -2
- package/dist/state/WidgetState.d.ts.map +1 -1
- package/dist/state/WidgetState.js +49 -2
- package/dist/state/WidgetState.js.map +1 -1
- package/dist/state/constants.d.ts +5 -0
- package/dist/state/constants.d.ts.map +1 -0
- package/dist/state/constants.js +10 -0
- package/dist/state/constants.js.map +1 -0
- package/dist/state/types.d.ts +10 -1
- package/dist/state/types.d.ts.map +1 -1
- package/dist/types.d.ts +20 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/chat.d.ts +11 -4
- package/dist/utils/chat.d.ts.map +1 -1
- package/dist/utils/chat.js +13 -11
- package/dist/utils/chat.js.map +1 -1
- package/dist/utils/check-is-trial.d.ts +2 -0
- package/dist/utils/check-is-trial.d.ts.map +1 -0
- package/dist/utils/check-is-trial.js +6 -0
- package/dist/utils/check-is-trial.js.map +1 -0
- package/dist/utils/copy-to-clipboard.d.ts +6 -0
- package/dist/utils/copy-to-clipboard.d.ts.map +1 -0
- package/dist/utils/copy-to-clipboard.js +30 -0
- package/dist/utils/copy-to-clipboard.js.map +1 -0
- package/dist/utils/date.d.ts +26 -2
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +28 -3
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/download.d.ts +5 -0
- package/dist/utils/download.d.ts.map +1 -1
- package/dist/utils/download.js +5 -0
- package/dist/utils/download.js.map +1 -1
- package/dist/utils/error.d.ts +2 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +54 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/knowledge-source.d.ts +12 -2
- package/dist/utils/knowledge-source.d.ts.map +1 -1
- package/dist/utils/knowledge-source.js +16 -0
- package/dist/utils/knowledge-source.js.map +1 -1
- package/dist/utils/planning-tool.d.ts +17 -0
- package/dist/utils/planning-tool.d.ts.map +1 -0
- package/dist/utils/planning-tool.js +32 -0
- package/dist/utils/planning-tool.js.map +1 -0
- package/dist/utils/programming-languages.d.ts.map +1 -1
- package/dist/utils/programming-languages.js +10 -0
- package/dist/utils/programming-languages.js.map +1 -1
- package/dist/utils/string.d.ts +5 -0
- package/dist/utils/string.d.ts.map +1 -1
- package/dist/utils/string.js +5 -1
- package/dist/utils/string.js.map +1 -1
- package/dist/utils/tools.d.ts +23 -0
- package/dist/utils/tools.d.ts.map +1 -0
- package/dist/utils/tools.js +23 -0
- package/dist/utils/tools.js.map +1 -0
- package/dist/utils/update-tool-step.d.ts +3 -0
- package/dist/utils/update-tool-step.d.ts.map +1 -0
- package/dist/utils/update-tool-step.js +23 -0
- package/dist/utils/update-tool-step.js.map +1 -0
- package/dist/utils/upload/FileUpload.d.ts +21 -0
- package/dist/utils/upload/FileUpload.d.ts.map +1 -0
- package/dist/utils/upload/FileUpload.js +54 -0
- package/dist/utils/upload/FileUpload.js.map +1 -0
- package/dist/utils/upload/UploadManager.d.ts +42 -0
- package/dist/utils/upload/UploadManager.d.ts.map +1 -0
- package/dist/utils/upload/UploadManager.js +138 -0
- package/dist/utils/upload/UploadManager.js.map +1 -0
- package/dist/utils/upload/context.d.ts +15 -0
- package/dist/utils/upload/context.d.ts.map +1 -0
- package/dist/utils/upload/context.js +37 -0
- package/dist/utils/upload/context.js.map +1 -0
- package/dist/utils/upload/errors.d.ts +17 -0
- package/dist/utils/upload/errors.d.ts.map +1 -0
- package/dist/utils/upload/errors.js +27 -0
- package/dist/utils/upload/errors.js.map +1 -0
- package/dist/utils/upload/types.d.ts +7 -0
- package/dist/utils/upload/types.d.ts.map +1 -0
- package/dist/{components/Tooltip → utils/upload}/types.js.map +1 -1
- package/dist/utils/upload/use-paste-upload.d.ts +8 -0
- package/dist/utils/upload/use-paste-upload.d.ts.map +1 -0
- package/dist/utils/upload/use-paste-upload.js +19 -0
- package/dist/utils/upload/use-paste-upload.js.map +1 -0
- package/dist/utils/upload/utils.d.ts +4 -0
- package/dist/utils/upload/utils.d.ts.map +1 -0
- package/dist/utils/upload/utils.js +10 -0
- package/dist/utils/upload/utils.js.map +1 -0
- package/dist/utils/url.d.ts +2 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +8 -0
- package/dist/utils/url.js.map +1 -0
- package/dist/views/Agents/AgentDescription.d.ts +4 -0
- package/dist/views/Agents/AgentDescription.d.ts.map +1 -0
- package/dist/views/Agents/AgentDescription.js +38 -0
- package/dist/views/Agents/AgentDescription.js.map +1 -0
- package/dist/views/Agents/AgentsPanel.d.ts +5 -0
- package/dist/views/Agents/AgentsPanel.d.ts.map +1 -0
- package/dist/views/Agents/AgentsPanel.js +45 -0
- package/dist/views/Agents/AgentsPanel.js.map +1 -0
- package/dist/views/Agents/AgentsTab.d.ts +11 -0
- package/dist/views/Agents/AgentsTab.d.ts.map +1 -0
- package/dist/views/Agents/AgentsTab.js +82 -0
- package/dist/views/Agents/AgentsTab.js.map +1 -0
- package/dist/views/Agents/dictionary.d.ts +2 -0
- package/dist/views/Agents/dictionary.d.ts.map +1 -0
- package/dist/views/Agents/dictionary.js +43 -0
- package/dist/views/Agents/dictionary.js.map +1 -0
- package/dist/views/Agents/index.d.ts +5 -0
- package/dist/views/Agents/index.d.ts.map +1 -0
- package/dist/views/Agents/index.js +21 -0
- package/dist/views/Agents/index.js.map +1 -0
- package/dist/views/Agents/styled.d.ts +3 -0
- package/dist/views/Agents/styled.d.ts.map +1 -0
- package/dist/views/Agents/styled.js +68 -0
- package/dist/views/Agents/styled.js.map +1 -0
- package/dist/views/Agents/useAgentFavorites.d.ts +8 -0
- package/dist/views/Agents/useAgentFavorites.d.ts.map +1 -0
- package/dist/views/Agents/useAgentFavorites.js +59 -0
- package/dist/views/Agents/useAgentFavorites.js.map +1 -0
- package/dist/views/Chat/AgentInfo.d.ts +5 -1
- package/dist/views/Chat/AgentInfo.d.ts.map +1 -1
- package/dist/views/Chat/AgentInfo.js +6 -5
- package/dist/views/Chat/AgentInfo.js.map +1 -1
- package/dist/views/Chat/ButtonExecutionDetail.d.ts +5 -0
- package/dist/views/Chat/ButtonExecutionDetail.d.ts.map +1 -0
- package/dist/views/Chat/ButtonExecutionDetail.js +34 -0
- package/dist/views/Chat/ButtonExecutionDetail.js.map +1 -0
- package/dist/views/Chat/ChatMessage.d.ts +56 -4
- package/dist/views/Chat/ChatMessage.d.ts.map +1 -1
- package/dist/views/Chat/ChatMessage.js +160 -24
- package/dist/views/Chat/ChatMessage.js.map +1 -1
- package/dist/views/Chat/ChatMessages.d.ts +6 -2
- package/dist/views/Chat/ChatMessages.d.ts.map +1 -1
- package/dist/views/Chat/ChatMessages.js +5 -2
- package/dist/views/Chat/ChatMessages.js.map +1 -1
- package/dist/views/Chat/StepsList.d.ts +14 -0
- package/dist/views/Chat/StepsList.d.ts.map +1 -0
- package/dist/views/Chat/StepsList.js +192 -0
- package/dist/views/Chat/StepsList.js.map +1 -0
- package/dist/views/Chat/chat-scroll.d.ts +1 -1
- package/dist/views/Chat/chat-scroll.js +1 -1
- package/dist/views/Chat/events.d.ts +22 -0
- package/dist/views/Chat/events.d.ts.map +1 -0
- package/dist/views/Chat/events.js +67 -0
- package/dist/views/Chat/events.js.map +1 -0
- package/dist/views/Chat/index.d.ts +9 -2
- package/dist/views/Chat/index.d.ts.map +1 -1
- package/dist/views/Chat/index.js +5 -2
- package/dist/views/Chat/index.js.map +1 -1
- package/dist/views/Chat/styled.d.ts +3 -1
- package/dist/views/Chat/styled.d.ts.map +1 -1
- package/dist/views/Chat/styled.js +152 -31
- package/dist/views/Chat/styled.js.map +1 -1
- package/dist/views/ChatHistory/ChatHistoryPanel.d.ts +4 -4
- package/dist/views/ChatHistory/ChatHistoryPanel.d.ts.map +1 -1
- package/dist/views/ChatHistory/ChatHistoryPanel.js +6 -2
- package/dist/views/ChatHistory/ChatHistoryPanel.js.map +1 -1
- package/dist/views/ChatHistory/HistoryItem.d.ts +4 -3
- package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -1
- package/dist/views/ChatHistory/HistoryItem.js +16 -37
- package/dist/views/ChatHistory/HistoryItem.js.map +1 -1
- package/dist/views/ChatHistory/dictionary.d.ts +1 -1
- package/dist/views/ChatHistory/index.d.ts +4 -4
- package/dist/views/ChatHistory/index.d.ts.map +1 -1
- package/dist/views/ChatHistory/index.js +6 -3
- package/dist/views/ChatHistory/index.js.map +1 -1
- package/dist/views/ChatHistory/styled.d.ts.map +1 -1
- package/dist/views/ChatHistory/styled.js +3 -5
- package/dist/views/ChatHistory/styled.js.map +1 -1
- package/dist/views/ChatHistory/utils.d.ts +17 -2
- package/dist/views/ChatHistory/utils.d.ts.map +1 -1
- package/dist/views/ChatHistory/utils.js +140 -9
- package/dist/views/ChatHistory/utils.js.map +1 -1
- package/dist/views/ChatTabSelection.d.ts +6 -4
- package/dist/views/ChatTabSelection.d.ts.map +1 -1
- package/dist/views/ChatTabSelection.js +40 -15
- package/dist/views/ChatTabSelection.js.map +1 -1
- package/dist/views/Editor.d.ts +3 -0
- package/dist/views/Editor.d.ts.map +1 -1
- package/dist/views/Editor.js +23 -16
- package/dist/views/Editor.js.map +1 -1
- package/dist/views/Home/BuiltInAgent.d.ts +6 -0
- package/dist/views/Home/BuiltInAgent.d.ts.map +1 -0
- package/dist/views/Home/BuiltInAgent.js +37 -0
- package/dist/views/Home/BuiltInAgent.js.map +1 -0
- package/dist/views/Home/CustomAgent.d.ts +5 -0
- package/dist/views/Home/CustomAgent.d.ts.map +1 -0
- package/dist/views/Home/CustomAgent.js +23 -0
- package/dist/views/Home/CustomAgent.js.map +1 -0
- package/dist/views/Home/index.d.ts +8 -0
- package/dist/views/Home/index.d.ts.map +1 -0
- package/dist/views/Home/index.js +34 -0
- package/dist/views/Home/index.js.map +1 -0
- package/dist/views/Home/styled.d.ts +2 -0
- package/dist/views/Home/styled.d.ts.map +1 -0
- package/dist/views/Home/styled.js +74 -0
- package/dist/views/Home/styled.js.map +1 -0
- package/dist/views/Home/types.d.ts +16 -0
- package/dist/views/Home/types.d.ts.map +1 -0
- package/dist/views/Home/types.js +2 -0
- package/dist/views/Home/types.js.map +1 -0
- package/dist/views/KSDocument.d.ts +3 -0
- package/dist/views/KSDocument.d.ts.map +1 -1
- package/dist/views/KSDocument.js +7 -4
- package/dist/views/KSDocument.js.map +1 -1
- package/dist/views/KnowledgeSources.d.ts +12 -0
- package/dist/views/KnowledgeSources.d.ts.map +1 -1
- package/dist/views/KnowledgeSources.js +123 -33
- package/dist/views/KnowledgeSources.js.map +1 -1
- package/dist/views/MessageInput/AgentSelector.d.ts +5 -0
- package/dist/views/MessageInput/AgentSelector.d.ts.map +1 -0
- package/dist/views/MessageInput/AgentSelector.js +66 -0
- package/dist/views/MessageInput/AgentSelector.js.map +1 -0
- package/dist/views/MessageInput/ButtonAgent.d.ts +2 -0
- package/dist/views/MessageInput/ButtonAgent.d.ts.map +1 -0
- package/dist/views/MessageInput/ButtonAgent.js +35 -0
- package/dist/views/MessageInput/ButtonAgent.js.map +1 -0
- package/dist/views/MessageInput/ButtonBar.d.ts +13 -0
- package/dist/views/MessageInput/ButtonBar.d.ts.map +1 -0
- package/dist/views/MessageInput/ButtonBar.js +15 -0
- package/dist/views/MessageInput/ButtonBar.js.map +1 -0
- package/dist/views/MessageInput/ContextBar.d.ts +9 -0
- package/dist/views/MessageInput/ContextBar.d.ts.map +1 -0
- package/dist/views/MessageInput/ContextBar.js +51 -0
- package/dist/views/MessageInput/ContextBar.js.map +1 -0
- package/dist/views/MessageInput/ModelSwitcher/index.d.ts +2 -0
- package/dist/views/MessageInput/ModelSwitcher/index.d.ts.map +1 -0
- package/dist/views/MessageInput/ModelSwitcher/index.js +25 -0
- package/dist/views/MessageInput/ModelSwitcher/index.js.map +1 -0
- package/dist/views/MessageInput/ModelSwitcher/utils.d.ts +30 -0
- package/dist/views/MessageInput/ModelSwitcher/utils.d.ts.map +1 -0
- package/dist/views/MessageInput/ModelSwitcher/utils.js +91 -0
- package/dist/views/MessageInput/ModelSwitcher/utils.js.map +1 -0
- package/dist/views/MessageInput/QuickCommandSelector.d.ts +5 -0
- package/dist/views/MessageInput/QuickCommandSelector.d.ts.map +1 -0
- package/dist/views/MessageInput/QuickCommandSelector.js +104 -0
- package/dist/views/MessageInput/QuickCommandSelector.js.map +1 -0
- package/dist/views/MessageInput/SelectContent.d.ts +2 -0
- package/dist/views/MessageInput/SelectContent.d.ts.map +1 -0
- package/dist/views/MessageInput/SelectContent.js +84 -0
- package/dist/views/MessageInput/SelectContent.js.map +1 -0
- package/dist/views/MessageInput/UploadBar.d.ts +2 -0
- package/dist/views/MessageInput/UploadBar.d.ts.map +1 -0
- package/dist/views/MessageInput/UploadBar.js +74 -0
- package/dist/views/MessageInput/UploadBar.js.map +1 -0
- package/dist/views/MessageInput/UploadDragNDrop.d.ts +14 -0
- package/dist/views/MessageInput/UploadDragNDrop.d.ts.map +1 -0
- package/dist/views/MessageInput/UploadDragNDrop.js +51 -0
- package/dist/views/MessageInput/UploadDragNDrop.js.map +1 -0
- package/dist/views/MessageInput/chat-entry-history.d.ts +11 -0
- package/dist/views/MessageInput/chat-entry-history.d.ts.map +1 -0
- package/dist/views/MessageInput/chat-entry-history.js +78 -0
- package/dist/views/MessageInput/chat-entry-history.js.map +1 -0
- package/dist/views/MessageInput/dictionary.d.ts +1 -1
- package/dist/views/MessageInput/dictionary.d.ts.map +1 -1
- package/dist/views/MessageInput/dictionary.js +52 -10
- package/dist/views/MessageInput/dictionary.js.map +1 -1
- package/dist/views/MessageInput/index.d.ts +9 -6
- package/dist/views/MessageInput/index.d.ts.map +1 -1
- package/dist/views/MessageInput/index.js +112 -20
- package/dist/views/MessageInput/index.js.map +1 -1
- package/dist/views/MessageInput/styled.d.ts +13 -1
- package/dist/views/MessageInput/styled.d.ts.map +1 -1
- package/dist/views/MessageInput/styled.js +223 -85
- package/dist/views/MessageInput/styled.js.map +1 -1
- package/dist/views/MinimizedHeader.d.ts +4 -0
- package/dist/views/MinimizedHeader.d.ts.map +1 -1
- package/dist/views/MinimizedHeader.js +9 -7
- package/dist/views/MinimizedHeader.js.map +1 -1
- package/dist/views/Resources.d.ts +2 -0
- package/dist/views/Resources.d.ts.map +1 -0
- package/dist/views/Resources.js +69 -0
- package/dist/views/Resources.js.map +1 -0
- package/dist/views/Stacks.d.ts +12 -0
- package/dist/views/Stacks.d.ts.map +1 -1
- package/dist/views/Stacks.js +117 -21
- package/dist/views/Stacks.js.map +1 -1
- package/dist/views/Steps/FlowChart/HandleGroup.d.ts +10 -0
- package/dist/views/Steps/FlowChart/HandleGroup.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/HandleGroup.js +4 -0
- package/dist/views/Steps/FlowChart/HandleGroup.js.map +1 -0
- package/dist/views/Steps/FlowChart/NodeDynamic.d.ts +15 -0
- package/dist/views/Steps/FlowChart/NodeDynamic.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/NodeDynamic.js +41 -0
- package/dist/views/Steps/FlowChart/NodeDynamic.js.map +1 -0
- package/dist/views/Steps/FlowChart/NodeStep.d.ts +10 -0
- package/dist/views/Steps/FlowChart/NodeStep.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/NodeStep.js +13 -0
- package/dist/views/Steps/FlowChart/NodeStep.js.map +1 -0
- package/dist/views/Steps/FlowChart/hooks.d.ts +7 -0
- package/dist/views/Steps/FlowChart/hooks.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/hooks.js +31 -0
- package/dist/views/Steps/FlowChart/hooks.js.map +1 -0
- package/dist/views/Steps/FlowChart/index.d.ts +12 -0
- package/dist/views/Steps/FlowChart/index.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/index.js +78 -0
- package/dist/views/Steps/FlowChart/index.js.map +1 -0
- package/dist/views/Steps/FlowChart/layout.d.ts +8 -0
- package/dist/views/Steps/FlowChart/layout.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/layout.js +59 -0
- package/dist/views/Steps/FlowChart/layout.js.map +1 -0
- package/dist/views/Steps/FlowChart/styled.d.ts +14 -0
- package/dist/views/Steps/FlowChart/styled.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/styled.js +156 -0
- package/dist/views/Steps/FlowChart/styled.js.map +1 -0
- package/dist/views/Steps/FlowChart/types.d.ts +25 -0
- package/dist/views/Steps/FlowChart/types.d.ts.map +1 -0
- package/dist/views/Steps/FlowChart/types.js +2 -0
- package/dist/views/Steps/FlowChart/types.js.map +1 -0
- package/dist/views/Steps/StepModal.d.ts +10 -0
- package/dist/views/Steps/StepModal.d.ts.map +1 -0
- package/dist/views/Steps/StepModal.js +139 -0
- package/dist/views/Steps/StepModal.js.map +1 -0
- package/dist/views/Steps/StepsPanel.d.ts +6 -0
- package/dist/views/Steps/StepsPanel.d.ts.map +1 -0
- package/dist/views/Steps/StepsPanel.js +18 -0
- package/dist/views/Steps/StepsPanel.js.map +1 -0
- package/dist/views/Steps/dictionary.d.ts +43 -0
- package/dist/views/Steps/dictionary.d.ts.map +1 -0
- package/dist/views/Steps/dictionary.js +45 -0
- package/dist/views/Steps/dictionary.js.map +1 -0
- package/dist/views/Steps/index.d.ts +5 -0
- package/dist/views/Steps/index.d.ts.map +1 -0
- package/dist/views/Steps/index.js +30 -0
- package/dist/views/Steps/index.js.map +1 -0
- package/dist/views/Steps/utils.d.ts +7 -0
- package/dist/views/Steps/utils.d.ts.map +1 -0
- package/dist/views/Steps/utils.js +32 -0
- package/dist/views/Steps/utils.js.map +1 -0
- package/dist/views/Tools.d.ts +2 -0
- package/dist/views/Tools.d.ts.map +1 -0
- package/dist/views/Tools.js +53 -0
- package/dist/views/Tools.js.map +1 -0
- package/dist/views/Workspaces/WorkspacesTab.d.ts +20 -0
- package/dist/views/Workspaces/WorkspacesTab.d.ts.map +1 -0
- package/dist/views/Workspaces/WorkspacesTab.js +61 -0
- package/dist/views/Workspaces/WorkspacesTab.js.map +1 -0
- package/dist/views/Workspaces/index.d.ts +5 -0
- package/dist/views/Workspaces/index.d.ts.map +1 -0
- package/dist/views/Workspaces/index.js +69 -0
- package/dist/views/Workspaces/index.js.map +1 -0
- package/package.dev.json +3 -0
- package/package.json +21 -13
- package/package.stg.json +4 -0
- package/src/StackspotAIWidget.tsx +96 -37
- package/src/app-metadata.json +175 -0
- package/src/assets/placeholder.png +0 -0
- package/src/chat-interceptors/CustomInputs.ts +14 -1
- package/src/chat-interceptors/quick-command-questions.ts +12 -2
- package/src/chat-interceptors/quick-commands.ts +286 -52
- package/src/chat-interceptors/send-message.ts +253 -25
- package/src/components/AdaptiveTextArea.tsx +36 -11
- package/src/components/AgentCard/AgentCardCreate.tsx +42 -0
- package/src/components/AgentCard/dictionary.ts +25 -0
- package/src/components/AgentCard/index.tsx +82 -0
- package/src/components/AnimatedOpacity.tsx +55 -0
- package/src/components/AutoFocus.tsx +42 -0
- package/src/components/ButtonFavorite.tsx +78 -0
- package/src/components/Code.tsx +94 -59
- package/src/components/ComponentNavigator.tsx +99 -0
- package/src/components/Fading.tsx +66 -0
- package/src/components/FadingOverflow.tsx +39 -12
- package/src/components/FileDescription.tsx +118 -0
- package/src/components/HistoryList.tsx +19 -2
- package/src/components/ListResource.tsx +60 -0
- package/src/components/Markdown.tsx +2 -1
- package/src/components/Modal.tsx +85 -0
- package/src/components/QuickStartButton.tsx +15 -47
- package/src/components/RightPanelContentList.tsx +15 -0
- package/src/components/RightPanelForm.tsx +64 -22
- package/src/components/RightPanelTabs.tsx +7 -32
- package/src/components/Selector/index.tsx +312 -0
- package/src/components/Selector/styled.ts +158 -0
- package/src/components/StackedBadge.tsx +77 -0
- package/src/components/TabManager.tsx +36 -36
- package/src/components/ToolBadge.tsx +67 -0
- package/src/components/WorkspaceTabNavigator.tsx +172 -0
- package/src/components/form/DescribedCheckboxGroup.tsx +135 -33
- package/src/components/form/DescribedRadioGroup.tsx +136 -32
- package/src/components/form/dictionary.ts +18 -0
- package/src/components/form/styled.ts +1 -2
- package/src/components/form/types.ts +45 -1
- package/src/context/AIWidgetProvider.tsx +19 -0
- package/src/context/hooks.ts +86 -16
- package/src/features.ts +90 -16
- package/src/hooks/midnight-update-view.ts +36 -0
- package/src/images.d.ts +5 -0
- package/src/index.ts +16 -0
- package/src/layout.css +95 -28
- package/src/regex.ts +2 -0
- package/src/right-panel/DefaultPanel.tsx +7 -7
- package/src/right-panel/RightPanel.tsx +3 -0
- package/src/right-panel/RightPanelProvider.tsx +15 -0
- package/src/right-panel/constants.ts +1 -0
- package/src/right-panel/hooks.tsx +8 -1
- package/src/state/ChatEntry.ts +189 -9
- package/src/state/ChatState.ts +131 -14
- package/src/state/ChatTabsController.ts +78 -8
- package/src/state/ObservableState.ts +14 -0
- package/src/state/WidgetState.ts +86 -3
- package/src/state/constants.ts +13 -0
- package/src/state/types.ts +12 -1
- package/src/types.ts +21 -4
- package/src/utils/chat.ts +15 -14
- package/src/utils/check-is-trial.ts +6 -0
- package/src/utils/copy-to-clipboard.ts +29 -0
- package/src/utils/date.ts +28 -4
- package/src/utils/download.ts +5 -0
- package/src/utils/error.ts +56 -0
- package/src/utils/knowledge-source.ts +18 -2
- package/src/utils/planning-tool.ts +41 -0
- package/src/utils/programming-languages.ts +10 -0
- package/src/utils/string.ts +5 -1
- package/src/utils/tools.ts +32 -0
- package/src/utils/update-tool-step.tsx +27 -0
- package/src/utils/upload/FileUpload.ts +63 -0
- package/src/utils/upload/UploadManager.ts +156 -0
- package/src/utils/upload/context.tsx +44 -0
- package/src/utils/upload/errors.ts +34 -0
- package/src/utils/upload/types.ts +7 -0
- package/src/utils/upload/use-paste-upload.tsx +30 -0
- package/src/utils/upload/utils.ts +12 -0
- package/src/utils/url.ts +8 -0
- package/src/views/Agents/AgentDescription.tsx +107 -0
- package/src/views/Agents/AgentsPanel.tsx +57 -0
- package/src/views/Agents/AgentsTab.tsx +126 -0
- package/src/views/Agents/dictionary.ts +45 -0
- package/src/views/Agents/index.tsx +26 -0
- package/src/views/Agents/styled.ts +69 -0
- package/src/views/Agents/useAgentFavorites.ts +63 -0
- package/src/views/Chat/AgentInfo.tsx +13 -8
- package/src/views/Chat/ButtonExecutionDetail.tsx +46 -0
- package/src/views/Chat/ChatMessage.tsx +465 -79
- package/src/views/Chat/ChatMessages.tsx +15 -4
- package/src/views/Chat/StepsList.tsx +394 -0
- package/src/views/Chat/chat-scroll.ts +1 -1
- package/src/views/Chat/events.ts +71 -0
- package/src/views/Chat/index.tsx +17 -3
- package/src/views/Chat/styled.ts +158 -32
- package/src/views/ChatHistory/ChatHistoryPanel.tsx +8 -5
- package/src/views/ChatHistory/HistoryItem.tsx +23 -44
- package/src/views/ChatHistory/index.tsx +6 -4
- package/src/views/ChatHistory/styled.ts +3 -5
- package/src/views/ChatHistory/utils.ts +144 -11
- package/src/views/ChatTabSelection.tsx +47 -20
- package/src/views/Editor.tsx +28 -18
- package/src/views/Home/BuiltInAgent.tsx +67 -0
- package/src/views/Home/CustomAgent.tsx +36 -0
- package/src/views/Home/index.tsx +48 -0
- package/src/views/Home/styled.ts +74 -0
- package/src/views/Home/types.ts +16 -0
- package/src/views/KSDocument.tsx +11 -8
- package/src/views/KnowledgeSources.tsx +169 -62
- package/src/views/MessageInput/AgentSelector.tsx +92 -0
- package/src/views/MessageInput/ButtonAgent.tsx +73 -0
- package/src/views/MessageInput/ButtonBar.tsx +57 -0
- package/src/views/MessageInput/ContextBar.tsx +117 -0
- package/src/views/MessageInput/ModelSwitcher/index.tsx +69 -0
- package/src/views/MessageInput/ModelSwitcher/utils.tsx +143 -0
- package/src/views/MessageInput/QuickCommandSelector.tsx +137 -0
- package/src/views/MessageInput/SelectContent.tsx +99 -0
- package/src/views/MessageInput/UploadBar.tsx +107 -0
- package/src/views/MessageInput/UploadDragNDrop.tsx +79 -0
- package/src/views/MessageInput/chat-entry-history.ts +97 -0
- package/src/views/MessageInput/dictionary.ts +52 -10
- package/src/views/MessageInput/index.tsx +154 -51
- package/src/views/MessageInput/styled.ts +226 -85
- package/src/views/MinimizedHeader.tsx +11 -10
- package/src/views/Resources.tsx +108 -0
- package/src/views/Stacks.tsx +152 -39
- package/src/views/Steps/FlowChart/HandleGroup.tsx +14 -0
- package/src/views/Steps/FlowChart/NodeDynamic.tsx +97 -0
- package/src/views/Steps/FlowChart/NodeStep.tsx +49 -0
- package/src/views/Steps/FlowChart/hooks.ts +41 -0
- package/src/views/Steps/FlowChart/index.tsx +111 -0
- package/src/views/Steps/FlowChart/layout.ts +73 -0
- package/src/views/Steps/FlowChart/styled.ts +157 -0
- package/src/views/Steps/FlowChart/types.ts +28 -0
- package/src/views/Steps/StepModal.tsx +233 -0
- package/src/views/Steps/StepsPanel.tsx +31 -0
- package/src/views/Steps/dictionary.ts +48 -0
- package/src/views/Steps/index.tsx +36 -0
- package/src/views/Steps/utils.tsx +34 -0
- package/src/views/Tools.tsx +77 -0
- package/src/views/Workspaces/WorkspacesTab.tsx +116 -0
- package/src/views/Workspaces/index.tsx +78 -0
- package/tsconfig.json +8 -3
- package/dist/components/Accordion.d.ts +0 -10
- package/dist/components/Accordion.d.ts.map +0 -1
- package/dist/components/Accordion.js +0 -46
- package/dist/components/Accordion.js.map +0 -1
- package/dist/components/FallbackBoundary/ErrorBoundary.d.ts +0 -30
- package/dist/components/FallbackBoundary/ErrorBoundary.d.ts.map +0 -1
- package/dist/components/FallbackBoundary/ErrorBoundary.js +0 -38
- package/dist/components/FallbackBoundary/ErrorBoundary.js.map +0 -1
- package/dist/components/FallbackBoundary/Loading.d.ts +0 -2
- package/dist/components/FallbackBoundary/Loading.d.ts.map +0 -1
- package/dist/components/FallbackBoundary/Loading.js +0 -12
- package/dist/components/FallbackBoundary/Loading.js.map +0 -1
- package/dist/components/FallbackBoundary/index.d.ts +0 -6
- package/dist/components/FallbackBoundary/index.d.ts.map +0 -1
- package/dist/components/FallbackBoundary/index.js +0 -9
- package/dist/components/FallbackBoundary/index.js.map +0 -1
- package/dist/components/IconInput.d.ts +0 -7
- package/dist/components/IconInput.d.ts.map +0 -1
- package/dist/components/IconInput.js +0 -58
- package/dist/components/IconInput.js.map +0 -1
- package/dist/components/OverlayMenu.d.ts +0 -10
- package/dist/components/OverlayMenu.d.ts.map +0 -1
- package/dist/components/OverlayMenu.js +0 -58
- package/dist/components/OverlayMenu.js.map +0 -1
- package/dist/components/ProgressBar.d.ts +0 -11
- package/dist/components/ProgressBar.d.ts.map +0 -1
- package/dist/components/ProgressBar.js +0 -126
- package/dist/components/ProgressBar.js.map +0 -1
- package/dist/components/Tooltip/Tooltip.d.ts +0 -12
- package/dist/components/Tooltip/Tooltip.d.ts.map +0 -1
- package/dist/components/Tooltip/Tooltip.js +0 -17
- package/dist/components/Tooltip/Tooltip.js.map +0 -1
- package/dist/components/Tooltip/TooltipAPI.d.ts +0 -13
- package/dist/components/Tooltip/TooltipAPI.d.ts.map +0 -1
- package/dist/components/Tooltip/TooltipAPI.js +0 -90
- package/dist/components/Tooltip/TooltipAPI.js.map +0 -1
- package/dist/components/Tooltip/context.d.ts +0 -5
- package/dist/components/Tooltip/context.d.ts.map +0 -1
- package/dist/components/Tooltip/context.js +0 -18
- package/dist/components/Tooltip/context.js.map +0 -1
- package/dist/components/Tooltip/index.d.ts +0 -3
- package/dist/components/Tooltip/index.d.ts.map +0 -1
- package/dist/components/Tooltip/index.js +0 -3
- package/dist/components/Tooltip/index.js.map +0 -1
- package/dist/components/Tooltip/style.d.ts +0 -4
- package/dist/components/Tooltip/style.d.ts.map +0 -1
- package/dist/components/Tooltip/style.js +0 -22
- package/dist/components/Tooltip/style.js.map +0 -1
- package/dist/components/Tooltip/types.d.ts +0 -14
- package/dist/components/Tooltip/types.d.ts.map +0 -1
- package/dist/views/Agents.d.ts +0 -2
- package/dist/views/Agents.d.ts.map +0 -1
- package/dist/views/Agents.js +0 -143
- package/dist/views/Agents.js.map +0 -1
- package/dist/views/Home.d.ts +0 -6
- package/dist/views/Home.d.ts.map +0 -1
- package/dist/views/Home.js +0 -68
- package/dist/views/Home.js.map +0 -1
- package/dist/views/MessageInput/ButtonGroup.d.ts +0 -12
- package/dist/views/MessageInput/ButtonGroup.d.ts.map +0 -1
- package/dist/views/MessageInput/ButtonGroup.js +0 -24
- package/dist/views/MessageInput/ButtonGroup.js.map +0 -1
- package/dist/views/MessageInput/InfoBar.d.ts +0 -2
- package/dist/views/MessageInput/InfoBar.d.ts.map +0 -1
- package/dist/views/MessageInput/InfoBar.js +0 -35
- package/dist/views/MessageInput/InfoBar.js.map +0 -1
- package/dist/views/Workspaces.d.ts +0 -2
- package/dist/views/Workspaces.d.ts.map +0 -1
- package/dist/views/Workspaces.js +0 -62
- package/dist/views/Workspaces.js.map +0 -1
- package/src/components/Accordion.tsx +0 -64
- package/src/components/FallbackBoundary/ErrorBoundary.tsx +0 -48
- package/src/components/FallbackBoundary/Loading.tsx +0 -14
- package/src/components/FallbackBoundary/index.tsx +0 -15
- package/src/components/IconInput.tsx +0 -70
- package/src/components/OverlayMenu.tsx +0 -77
- package/src/components/ProgressBar.tsx +0 -153
- package/src/components/Tooltip/Tooltip.tsx +0 -36
- package/src/components/Tooltip/TooltipAPI.ts +0 -84
- package/src/components/Tooltip/context.tsx +0 -24
- package/src/components/Tooltip/index.ts +0 -2
- package/src/components/Tooltip/style.tsx +0 -24
- package/src/components/Tooltip/types.ts +0 -15
- package/src/views/Agents.tsx +0 -200
- package/src/views/Home.tsx +0 -109
- package/src/views/MessageInput/ButtonGroup.tsx +0 -91
- package/src/views/MessageInput/InfoBar.tsx +0 -82
- package/src/views/Workspaces.tsx +0 -92
- /package/dist/{components/Tooltip → utils/upload}/types.js +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useContext, useMemo } from 'react'
|
|
2
2
|
import { DefaultPanel } from './DefaultPanel'
|
|
3
3
|
import { RightPanelContext } from './RightPanelProvider'
|
|
4
|
+
import { panelAnimationTime } from './constants'
|
|
4
5
|
|
|
5
6
|
interface RightPanelOptions {
|
|
6
7
|
title: React.ReactNode,
|
|
@@ -8,11 +9,17 @@ interface RightPanelOptions {
|
|
|
8
9
|
onClose?: () => void,
|
|
9
10
|
}
|
|
10
11
|
|
|
12
|
+
/**
|
|
13
|
+
* @returns teh current content of the right panel
|
|
14
|
+
*/
|
|
11
15
|
export function useRightPanelContent() {
|
|
12
16
|
const { content } = useContext(RightPanelContext)
|
|
13
17
|
return content
|
|
14
18
|
}
|
|
15
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Opens, closes or checks the visibility of the right panel.
|
|
22
|
+
*/
|
|
16
23
|
export function useRightPanel() {
|
|
17
24
|
const ctx = useContext(RightPanelContext)
|
|
18
25
|
const { panel, chatWindow, setContent } = ctx
|
|
@@ -35,7 +42,7 @@ export function useRightPanel() {
|
|
|
35
42
|
ctx.onCloseNext.current?.()
|
|
36
43
|
setTimeout(() => {
|
|
37
44
|
setContent(null)
|
|
38
|
-
},
|
|
45
|
+
}, panelAnimationTime)
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
function isOpen() {
|
package/src/state/ChatEntry.ts
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChatStep, HypothesisPMAgent, OpportunitiesPMAgent, PrfaqPMAgent } from '@stack-spot/portal-network'
|
|
2
|
+
import { ColorPaletteName, ColorSchemeName } from '@stack-spot/portal-theme'
|
|
2
3
|
import { pull } from 'lodash'
|
|
3
|
-
import {
|
|
4
|
+
import { LabeledAgent } from './types'
|
|
5
|
+
|
|
6
|
+
export interface ActionDataClick {
|
|
7
|
+
name?: string,
|
|
8
|
+
value?: string[],
|
|
9
|
+
}
|
|
4
10
|
|
|
5
11
|
export interface SerializableAction {
|
|
12
|
+
/**
|
|
13
|
+
* The text for the button or anchor.
|
|
14
|
+
*/
|
|
6
15
|
title: string,
|
|
16
|
+
/**
|
|
17
|
+
* Links open new tabs with urls, while commands send text commands in the chat as if they were written by the user.
|
|
18
|
+
*/
|
|
7
19
|
type: 'link' | 'command',
|
|
8
20
|
/**
|
|
9
|
-
* The URL if the action is a link
|
|
21
|
+
* The URL if the action is a link. The content of the user message otherwise.
|
|
10
22
|
*/
|
|
11
|
-
exec
|
|
23
|
+
exec?: string,
|
|
12
24
|
}
|
|
13
25
|
|
|
14
26
|
export interface ChatAction extends SerializableAction {
|
|
@@ -16,6 +28,26 @@ export interface ChatAction extends SerializableAction {
|
|
|
16
28
|
* @default primary
|
|
17
29
|
*/
|
|
18
30
|
appearance?: 'primary' | 'secondary',
|
|
31
|
+
/**
|
|
32
|
+
* @default inverse
|
|
33
|
+
*/
|
|
34
|
+
colorScheme?: ColorSchemeName,
|
|
35
|
+
/**
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
hideWhenNotLast?: boolean,
|
|
39
|
+
/**
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
disabled?: boolean,
|
|
43
|
+
/**
|
|
44
|
+
* @default button
|
|
45
|
+
*/
|
|
46
|
+
buttonType?: 'submit' | 'button',
|
|
47
|
+
/**
|
|
48
|
+
* @default lg
|
|
49
|
+
*/
|
|
50
|
+
size?: 'lg' | 'md' | 'sm',
|
|
19
51
|
}
|
|
20
52
|
|
|
21
53
|
export interface KnowledgeSource {
|
|
@@ -25,24 +57,154 @@ export interface KnowledgeSource {
|
|
|
25
57
|
documentId: string,
|
|
26
58
|
}
|
|
27
59
|
|
|
60
|
+
export interface ChatTool {
|
|
61
|
+
id: string,
|
|
62
|
+
image?: string,
|
|
63
|
+
name: string,
|
|
64
|
+
description: string,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface UploadedFile {
|
|
68
|
+
id: string,
|
|
69
|
+
name: string,
|
|
70
|
+
image?: string,
|
|
71
|
+
}
|
|
72
|
+
|
|
28
73
|
export interface TextChatEntry {
|
|
29
|
-
|
|
74
|
+
/**
|
|
75
|
+
* "text" for simple unformatted paragraphs. "md" for markdown.
|
|
76
|
+
* "input-text" for text inputs, 'input-radio' and "input-checkbox" for radio and checkbox inputs,
|
|
77
|
+
* "input-phone" for phone formatted inputs and "button-list" for a list of buttons in which only one is selected
|
|
78
|
+
*/
|
|
79
|
+
type: 'text' | 'md' | 'input-text' | 'input-radio' | 'button-list' | 'input-checkbox' | 'input-phone',
|
|
80
|
+
/**
|
|
81
|
+
* If the message was typed by the AI agent (bot), the user or the system (not currently in use).
|
|
82
|
+
*/
|
|
30
83
|
agentType: 'bot' | 'user' | 'system',
|
|
84
|
+
/**
|
|
85
|
+
* A set of buttons to go after the message.
|
|
86
|
+
*/
|
|
31
87
|
actions?: ChatAction[],
|
|
88
|
+
/**
|
|
89
|
+
* The content of the message.
|
|
90
|
+
*/
|
|
32
91
|
content: string,
|
|
92
|
+
/**
|
|
93
|
+
* The actual data to send as a message. This is the "content" if not provided.
|
|
94
|
+
*
|
|
95
|
+
* Useful for displaying a text in the chat, via "content", but sending something different to the backend.
|
|
96
|
+
*
|
|
97
|
+
* Serialization: if none of your interceptors return false, this will be converted to a JSON in the last interceptor (sendMessage).
|
|
98
|
+
*
|
|
99
|
+
* Attention: this is ignored by quick commands, which will always use "content".
|
|
100
|
+
*/
|
|
101
|
+
data?: any,
|
|
102
|
+
/**
|
|
103
|
+
* A content that is not shown to the user, it is used only to share data.
|
|
104
|
+
*
|
|
105
|
+
* This is used solely by the onboarding feature (checkboxes and radio button), implemented in the AI Portal. Maybe it shouldn't be
|
|
106
|
+
* implemented here. This needs a review (fixme).
|
|
107
|
+
*
|
|
108
|
+
* This has been implemented because the message rendered is different than the message we wanted to send to the backend.
|
|
109
|
+
*
|
|
110
|
+
* @deprecated prefer "data" instead.
|
|
111
|
+
*/
|
|
112
|
+
hiddenContent?: string[],
|
|
113
|
+
/**
|
|
114
|
+
* The knowledge sources used to create the message.
|
|
115
|
+
*/
|
|
33
116
|
knowledgeSources?: KnowledgeSource[],
|
|
117
|
+
/**
|
|
118
|
+
* The date and time of the message. ISO string.
|
|
119
|
+
*/
|
|
34
120
|
updated?: string,
|
|
35
|
-
|
|
121
|
+
/**
|
|
122
|
+
* The agent who wrote the message. Undefined for the agentType is "user".
|
|
123
|
+
*/
|
|
124
|
+
agent?: LabeledAgent,
|
|
125
|
+
/**
|
|
126
|
+
* The unique identifier of the message.
|
|
127
|
+
*/
|
|
36
128
|
messageId?: string,
|
|
129
|
+
/**
|
|
130
|
+
* If this is set, only an error message is rendered.
|
|
131
|
+
*/
|
|
37
132
|
error?: string,
|
|
133
|
+
/**
|
|
134
|
+
* A series of badges to display before the content.
|
|
135
|
+
*/
|
|
38
136
|
badges?: { color?: ColorPaletteName, label: string }[],
|
|
137
|
+
/**
|
|
138
|
+
* Whether or not to show this chat entry as a card.
|
|
139
|
+
*/
|
|
39
140
|
card?: boolean,
|
|
141
|
+
/**
|
|
142
|
+
* This entry may contain steps. If so, specify them in this array.
|
|
143
|
+
*/
|
|
144
|
+
steps?: ChatStep[],
|
|
145
|
+
/**
|
|
146
|
+
* If any tool was used to generate the response, its id is returned in this list.
|
|
147
|
+
*/
|
|
148
|
+
tools?: string[],
|
|
149
|
+
/**
|
|
150
|
+
* If opportunities exists in pm agent, its send in this list.
|
|
151
|
+
*/
|
|
152
|
+
opportunities?: OpportunitiesPMAgent[],
|
|
153
|
+
/**
|
|
154
|
+
* If hypothesis exists in pm agent, its send in this list.
|
|
155
|
+
*/
|
|
156
|
+
hypothesis?: HypothesisPMAgent[],
|
|
157
|
+
/**
|
|
158
|
+
* If prfaq exists in pm agent, its send in this object.
|
|
159
|
+
*/
|
|
160
|
+
prfaq?: PrfaqPMAgent,
|
|
161
|
+
/*
|
|
162
|
+
* Options for radio, checkbox or button type.
|
|
163
|
+
*/
|
|
164
|
+
options?: { color?: ColorSchemeName, label: string, value?: string, hasInput?: boolean }[],
|
|
165
|
+
/**
|
|
166
|
+
* Name to be used in input type fields.
|
|
167
|
+
*/
|
|
168
|
+
name?: string,
|
|
169
|
+
/**
|
|
170
|
+
* Whether or not a input field is required.
|
|
171
|
+
*/
|
|
172
|
+
required?: boolean,
|
|
173
|
+
/**
|
|
174
|
+
* The validations of input fields.
|
|
175
|
+
*/
|
|
176
|
+
validations?: {
|
|
177
|
+
minLength?: number,
|
|
178
|
+
maxLength?: number,
|
|
179
|
+
pattern?: string,
|
|
180
|
+
},
|
|
181
|
+
/**
|
|
182
|
+
* Valid for input types.
|
|
183
|
+
*/
|
|
184
|
+
initialValue?: string[],
|
|
185
|
+
/**
|
|
186
|
+
* If this chat entry contains any uploaded file, these are the files being uploaded along the message.
|
|
187
|
+
*/
|
|
188
|
+
upload?: UploadedFile[],
|
|
189
|
+
/**
|
|
190
|
+
* True if the entry is done streaming, false otherwise. Undefined may be used when streaming info is not available.
|
|
191
|
+
*/
|
|
192
|
+
done?: boolean,
|
|
193
|
+
/**
|
|
194
|
+
* True if, at some point, this entry had a planning stage (related to tools).
|
|
195
|
+
*/
|
|
196
|
+
hasPlanning?: boolean,
|
|
40
197
|
}
|
|
41
198
|
|
|
42
199
|
type ChatEntryListener = (value: TextChatEntry) => void
|
|
43
200
|
|
|
201
|
+
// this id is unique for each message and used for rendering. The `messageId`, which comes from the backend, is not always available and,
|
|
202
|
+
// therefore, can't be used for this purpose.
|
|
44
203
|
let nextId = 0
|
|
45
204
|
|
|
205
|
+
/**
|
|
206
|
+
* A message (entry) in the chat.
|
|
207
|
+
*/
|
|
46
208
|
export class ChatEntry {
|
|
47
209
|
readonly id: number
|
|
48
210
|
private value: TextChatEntry
|
|
@@ -50,24 +212,37 @@ export class ChatEntry {
|
|
|
50
212
|
|
|
51
213
|
/**
|
|
52
214
|
* @param value the value of the entry.
|
|
53
|
-
* @param isStreamed whether or not this entry is streamed. Defaults to false.
|
|
54
215
|
*/
|
|
55
216
|
constructor(value: TextChatEntry) {
|
|
56
217
|
this.id = nextId++
|
|
57
218
|
this.value = value
|
|
58
219
|
}
|
|
59
220
|
|
|
60
|
-
|
|
221
|
+
/**
|
|
222
|
+
* Utility function to create a user entry.
|
|
223
|
+
* @param content the message's content.
|
|
224
|
+
* @param isMd whether or not this should be rendered as markdown.
|
|
225
|
+
* @param hiddenContent the message's content.
|
|
226
|
+
* @returns a new ChatEntry.
|
|
227
|
+
*/
|
|
228
|
+
static createUserEntry(content: string, isMd = false, fieldName?: string, hiddenContent?: string[], data?: any) {
|
|
61
229
|
return new ChatEntry({
|
|
62
230
|
agentType: 'user',
|
|
63
231
|
type: isMd ? 'md' : 'text',
|
|
64
232
|
content,
|
|
233
|
+
name: fieldName,
|
|
234
|
+
hiddenContent,
|
|
235
|
+
data,
|
|
65
236
|
updated: new Date().toISOString(),
|
|
66
237
|
})
|
|
67
238
|
}
|
|
68
239
|
|
|
240
|
+
/**
|
|
241
|
+
* Utility function to create a streamed entry from the AI agent.
|
|
242
|
+
* @returns a new ChatEntry.
|
|
243
|
+
*/
|
|
69
244
|
static createStreamedBotEntry() {
|
|
70
|
-
return new ChatEntry({ agentType: 'bot', type: 'md', content: '' })
|
|
245
|
+
return new ChatEntry({ agentType: 'bot', type: 'md', content: '', done: false })
|
|
71
246
|
}
|
|
72
247
|
|
|
73
248
|
setValue(value: TextChatEntry) {
|
|
@@ -79,6 +254,11 @@ export class ChatEntry {
|
|
|
79
254
|
return this.value
|
|
80
255
|
}
|
|
81
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Watches the value of this ChatEntry.
|
|
259
|
+
* @param listener a function to call whenever the value changes.
|
|
260
|
+
* @returns a function that removes the listener.
|
|
261
|
+
*/
|
|
82
262
|
onChange(listener: ChatEntryListener) {
|
|
83
263
|
this.listeners.push(listener)
|
|
84
264
|
return () => {
|
package/src/state/ChatState.ts
CHANGED
|
@@ -1,17 +1,45 @@
|
|
|
1
1
|
import { dropRight, last, pull } from 'lodash'
|
|
2
2
|
import { ulid } from 'ulid'
|
|
3
3
|
import { AbortedError } from '../AbortedError'
|
|
4
|
+
import { ChatFeatures, getFeaturesWithDefaults } from '../features'
|
|
5
|
+
import { UploadManager } from '../utils/upload/UploadManager'
|
|
4
6
|
import { ChatEntry } from './ChatEntry'
|
|
7
|
+
import { acceptedFileTypes, maxFileSize, maxUploadItems } from './constants'
|
|
5
8
|
import { ObservableState } from './ObservableState'
|
|
6
|
-
import { Labeled,
|
|
9
|
+
import { Labeled, LabeledAgent } from './types'
|
|
7
10
|
|
|
8
|
-
export interface
|
|
11
|
+
export interface ChatPropertiesWithOptionalFeatures {
|
|
12
|
+
/**
|
|
13
|
+
* The name of the chat.
|
|
14
|
+
*/
|
|
9
15
|
label: string,
|
|
10
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The current AI agent.
|
|
18
|
+
*/
|
|
19
|
+
agent?: LabeledAgent,
|
|
20
|
+
/**
|
|
21
|
+
* The current workspace.
|
|
22
|
+
*/
|
|
11
23
|
workspace?: Labeled,
|
|
24
|
+
/**
|
|
25
|
+
* The current stack.
|
|
26
|
+
*/
|
|
12
27
|
stack?: Labeled,
|
|
28
|
+
/**
|
|
29
|
+
* The current knowledge sources.
|
|
30
|
+
*/
|
|
13
31
|
knowledgeSources?: Labeled[],
|
|
32
|
+
/**
|
|
33
|
+
* Whether or not the chat is in a loading state.
|
|
34
|
+
*/
|
|
14
35
|
isLoading?: boolean,
|
|
36
|
+
/**
|
|
37
|
+
* Whether or not the chat is planning.
|
|
38
|
+
*/
|
|
39
|
+
isPlaning?: boolean,
|
|
40
|
+
/**
|
|
41
|
+
* The value of the next message. This is the value of the text typed in the textarea below the chat.
|
|
42
|
+
*/
|
|
15
43
|
nextMessage?: string,
|
|
16
44
|
/**
|
|
17
45
|
* The current code in the editor.
|
|
@@ -22,9 +50,26 @@ export interface ChatProperties {
|
|
|
22
50
|
*/
|
|
23
51
|
codeLanguage?: string,
|
|
24
52
|
/**
|
|
25
|
-
* The current selection in the editor
|
|
53
|
+
* The current selection in the editor.
|
|
26
54
|
*/
|
|
27
55
|
codeSelection?: string,
|
|
56
|
+
/**
|
|
57
|
+
* The features enabled for this chat.
|
|
58
|
+
*
|
|
59
|
+
* If a feature is marked as false, it's disabled, otherwise it's enabled.
|
|
60
|
+
*/
|
|
61
|
+
features?: Partial<ChatFeatures>,
|
|
62
|
+
/**
|
|
63
|
+
* The current LLM (Large Language Model) being used for this chat.
|
|
64
|
+
*/
|
|
65
|
+
selected_model_id?: string,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface ChatProperties extends ChatPropertiesWithOptionalFeatures {
|
|
69
|
+
/**
|
|
70
|
+
* The features enabled for this chat.
|
|
71
|
+
*/
|
|
72
|
+
features: ChatFeatures,
|
|
28
73
|
}
|
|
29
74
|
|
|
30
75
|
type ChatMessagesListener = (chat: ChatEntry[]) => void
|
|
@@ -34,33 +79,73 @@ export type MessageInterceptor = (
|
|
|
34
79
|
) => boolean | undefined | void | Promise<boolean | undefined | void>
|
|
35
80
|
|
|
36
81
|
interface Options {
|
|
82
|
+
/**
|
|
83
|
+
* The unique identifier for this chat (conversationId).
|
|
84
|
+
*/
|
|
37
85
|
id: string,
|
|
38
|
-
|
|
86
|
+
/**
|
|
87
|
+
* The initial value for the state of this chat.
|
|
88
|
+
*/
|
|
89
|
+
initial: ChatPropertiesWithOptionalFeatures,
|
|
90
|
+
/**
|
|
91
|
+
* The interceptors to use for the messages pushed to this chat.
|
|
92
|
+
*
|
|
93
|
+
* The interceptors are run whenever a new message (chat entry) is added to the chat. They're always run in the order of the array and if
|
|
94
|
+
* any returns a promise, the promise is awaited before running the next.
|
|
95
|
+
*
|
|
96
|
+
* If an interceptor returns false or resolves to false (if a promise), the execution is interrupted, i.e. the next interceptors are not
|
|
97
|
+
* run.
|
|
98
|
+
*
|
|
99
|
+
* An interceptor receives three parameters:
|
|
100
|
+
* 1. the chat entry added;
|
|
101
|
+
* 2. the chat state;
|
|
102
|
+
* 3. an AbortSignal that can be aborted by calling `abort()` on the ChatState. Once the signal is aborted, the interceptor must abort all
|
|
103
|
+
* of its operations.
|
|
104
|
+
*
|
|
105
|
+
* Attention: when multiple messages are added at once, only the last goes through the interceptors. Furthermore, messages created by the
|
|
106
|
+
* constructor don't go through the interceptors, only messages added via `pushMessage` do.
|
|
107
|
+
*/
|
|
39
108
|
interceptors?: MessageInterceptor[],
|
|
109
|
+
/**
|
|
110
|
+
* The content of this chat, i.e. its messages.
|
|
111
|
+
*/
|
|
40
112
|
entries?: ChatEntry[],
|
|
113
|
+
/**
|
|
114
|
+
* Whether or not the label for this chat is real (persisted in the backend) or just a mock.
|
|
115
|
+
*
|
|
116
|
+
* This should be true if the label is just a mock.
|
|
117
|
+
*/
|
|
118
|
+
untitled?: boolean,
|
|
41
119
|
}
|
|
42
120
|
|
|
121
|
+
/**
|
|
122
|
+
* A chat. Each chat tab is a different ChatState.
|
|
123
|
+
*/
|
|
43
124
|
export class ChatState extends ObservableState<ChatProperties> {
|
|
44
125
|
readonly id: string
|
|
45
126
|
private entries: ChatEntry[]
|
|
46
127
|
private messagesListeners: ChatMessagesListener[] = []
|
|
47
128
|
private readonly interceptors: MessageInterceptor[]
|
|
129
|
+
/**
|
|
130
|
+
* A memory space (map) to be used by interceptors.
|
|
131
|
+
*/
|
|
48
132
|
interceptorMemory = new Map<string, any>()
|
|
133
|
+
/**
|
|
134
|
+
* Abort signals currently active.
|
|
135
|
+
*/
|
|
49
136
|
private abortions: AbortController[] = []
|
|
50
|
-
|
|
51
137
|
/**
|
|
52
|
-
*
|
|
53
|
-
* @param initial the initial state.
|
|
54
|
-
* @param interceptors a list of interceptors to run whenever a new message (entry) is added to the chat. If an interception function
|
|
55
|
-
* returns false, the next interceptors are not run. Attention: when multiple messages are added at once, only the last goes through the
|
|
56
|
-
* interceptors. Furthermore, messages created by the constructor don't go through the interceptors, only messages added via `pushMessage`
|
|
57
|
-
* do.
|
|
138
|
+
* Used to manage uploads for this Chat.
|
|
58
139
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
140
|
+
readonly uploadManager = new UploadManager({ maxSize: maxFileSize, accept: acceptedFileTypes, maxItems: maxUploadItems })
|
|
141
|
+
untitled: boolean
|
|
142
|
+
|
|
143
|
+
constructor({ id, initial, entries = [], interceptors = [], untitled = false }: Options) {
|
|
144
|
+
super({ ...initial, features: getFeaturesWithDefaults(initial.features) })
|
|
61
145
|
this.id = id
|
|
62
146
|
this.interceptors = interceptors
|
|
63
147
|
this.entries = entries
|
|
148
|
+
this.untitled = untitled
|
|
64
149
|
}
|
|
65
150
|
|
|
66
151
|
private runMessagesListeners() {
|
|
@@ -82,6 +167,10 @@ export class ChatState extends ObservableState<ChatProperties> {
|
|
|
82
167
|
pull(this.abortions, abort)
|
|
83
168
|
}
|
|
84
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Adds one or more messages to the chat. Messages are appended to the end of the chat.
|
|
172
|
+
* @param entries the messages to add.
|
|
173
|
+
*/
|
|
85
174
|
pushMessage(...entries: ChatEntry[]) {
|
|
86
175
|
if (!entries.length) return
|
|
87
176
|
this.entries = [...this.entries, ...entries]
|
|
@@ -89,15 +178,27 @@ export class ChatState extends ObservableState<ChatProperties> {
|
|
|
89
178
|
this.runInterceptors(last(entries)!)
|
|
90
179
|
}
|
|
91
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Removes one or more messages from the end of the chat.
|
|
183
|
+
* @param quantity the number of messages to remove. Defaults to 1.
|
|
184
|
+
*/
|
|
92
185
|
popMessage(quantity = 1) {
|
|
93
186
|
this.entries = dropRight(this.entries, quantity)
|
|
94
187
|
this.runMessagesListeners()
|
|
95
188
|
}
|
|
96
189
|
|
|
190
|
+
/**
|
|
191
|
+
* @returns the current list of messages.
|
|
192
|
+
*/
|
|
97
193
|
getMessages() {
|
|
98
194
|
return this.entries
|
|
99
195
|
}
|
|
100
196
|
|
|
197
|
+
/**
|
|
198
|
+
* Watches this chat for changes in the list of messages.
|
|
199
|
+
* @param listener the function to call whenever the list of messages changes.
|
|
200
|
+
* @returns a function that removes the listener.
|
|
201
|
+
*/
|
|
101
202
|
onChangeMessages(listener: ChatMessagesListener) {
|
|
102
203
|
this.messagesListeners.push(listener)
|
|
103
204
|
return () => {
|
|
@@ -128,4 +229,20 @@ export class ChatState extends ObservableState<ChatProperties> {
|
|
|
128
229
|
this.abortions = []
|
|
129
230
|
return newChat
|
|
130
231
|
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Returns a promise that resolves when the chat is no longer loading (isLoading state).
|
|
235
|
+
*
|
|
236
|
+
* If this is called when the chat is not loading, a resolved promise is returned.
|
|
237
|
+
*/
|
|
238
|
+
whenLoadingEnds(): Promise<void> {
|
|
239
|
+
return this.get('isLoading') ? new Promise((resolve) => {
|
|
240
|
+
const removeListener = this.onChange('isLoading', (value) => {
|
|
241
|
+
if (!value) {
|
|
242
|
+
resolve()
|
|
243
|
+
removeListener()
|
|
244
|
+
}
|
|
245
|
+
})
|
|
246
|
+
}) : Promise.resolve()
|
|
247
|
+
}
|
|
131
248
|
}
|
|
@@ -1,46 +1,112 @@
|
|
|
1
|
-
import { last, pull } from 'lodash'
|
|
1
|
+
import { groupBy, last, pull } from 'lodash'
|
|
2
2
|
import { ChatState } from './ChatState'
|
|
3
3
|
|
|
4
|
-
type TabChangeListener = (chats: ChatState[],
|
|
4
|
+
type TabChangeListener = (chats: ChatState[], active: ChatState) => void
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Controls the chat tabs.
|
|
8
|
+
*/
|
|
6
9
|
export class ChatTabsController {
|
|
7
10
|
private chats: ChatState[] = []
|
|
8
11
|
private activeChatId = ''
|
|
9
12
|
private listeners: TabChangeListener[] = []
|
|
10
13
|
|
|
11
14
|
private runListeners() {
|
|
12
|
-
this.listeners.forEach(l => l(this.chats, this.
|
|
15
|
+
this.listeners.forEach(l => l(this.chats, this.getActiveChat()))
|
|
13
16
|
}
|
|
14
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Adds new chats to the tab view.
|
|
20
|
+
* @param chats the chats to add.
|
|
21
|
+
*/
|
|
15
22
|
add(...chats: ChatState[]) {
|
|
16
23
|
if (!chats.length) return
|
|
17
24
|
this.chats = [...this.chats, ...chats]
|
|
18
25
|
this.runListeners()
|
|
19
26
|
}
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
/**
|
|
29
|
+
* If the active chat is deleted, this selects a new chat based on the position of the chat that has been removed.
|
|
30
|
+
*
|
|
31
|
+
* @param previous the previous tabs.
|
|
32
|
+
* @param deleted the ids of the chats that have been deleted.
|
|
33
|
+
*/
|
|
34
|
+
private reselect(previous: ChatState[], deleted: string[]) {
|
|
35
|
+
if (deleted.includes(this.activeChatId)) {
|
|
36
|
+
const currentActiveIndex = previous.findIndex(c => c.id === this.activeChatId)
|
|
26
37
|
if (currentActiveIndex === -1) this.activeChatId = this.chats[0]?.id
|
|
27
38
|
this.activeChatId = currentActiveIndex < this.chats.length ? this.chats[currentActiveIndex].id : last(this.chats)?.id ?? ''
|
|
28
39
|
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Removes chats from the tab view. This will never remove a chat if this chat is the last one.
|
|
44
|
+
*
|
|
45
|
+
* @param ids the ids of the chats to remove.
|
|
46
|
+
*/
|
|
47
|
+
remove(...ids: string[]) {
|
|
48
|
+
ids.splice(this.chats.length - 1, ids.length - this.chats.length)
|
|
49
|
+
if (!ids.length) return
|
|
50
|
+
const previous = this.chats
|
|
51
|
+
this.chats = this.chats.filter(c => !ids.includes(c.id))
|
|
52
|
+
this.reselect(previous, ids)
|
|
29
53
|
this.runListeners()
|
|
30
54
|
}
|
|
31
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Removes all empty chats. The last chat will be kept if it's empty, but the only chat remaining.
|
|
58
|
+
*
|
|
59
|
+
* @param exceptions ids of chats that shouldn't be removed even if empty.
|
|
60
|
+
*/
|
|
61
|
+
removeEmptyChats(...exceptions: string[]) {
|
|
62
|
+
const lastChat = last(this.chats)
|
|
63
|
+
const previous = this.chats
|
|
64
|
+
const { true: removed, false: kept = [] } = groupBy(this.chats, c => c.getMessages().length === 0 && !exceptions.includes(c.id))
|
|
65
|
+
if (removed) {
|
|
66
|
+
this.chats = kept
|
|
67
|
+
if (lastChat && this.chats.length === 0) this.chats.push(lastChat)
|
|
68
|
+
this.reselect(previous, removed.map(c => c.id))
|
|
69
|
+
this.runListeners()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @param id the id of the chat to retrieve.
|
|
75
|
+
* @returns a ChatState corresponding to the id.
|
|
76
|
+
*/
|
|
32
77
|
get(id: string) {
|
|
33
78
|
return this.chats.find(c => c.id === id)
|
|
34
79
|
}
|
|
35
80
|
|
|
81
|
+
/**
|
|
82
|
+
* @returns the id of the chat corresponding to the tab that is currently active.
|
|
83
|
+
*/
|
|
36
84
|
getActiveChatId() {
|
|
37
85
|
return this.activeChatId
|
|
38
86
|
}
|
|
39
87
|
|
|
88
|
+
/**
|
|
89
|
+
* @returns the chat corresponding to the tab that is currently active.
|
|
90
|
+
*/
|
|
91
|
+
getActiveChat() {
|
|
92
|
+
const chat = this.chats.find(c => c.id === this.activeChatId)
|
|
93
|
+
if (!chat) throw new Error('Chat state error, the active chat id corresponds to none chat in the tabs.')
|
|
94
|
+
return chat
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @returns all chats in tab view.
|
|
99
|
+
*/
|
|
40
100
|
getAll() {
|
|
41
101
|
return this.chats
|
|
42
102
|
}
|
|
43
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Watches for changes in the tab view.
|
|
106
|
+
* @param listener a function called whenever a tab is added, removed or selected. This function receives the list of chats as the first
|
|
107
|
+
* parameter and the id of the active chat as the second parameter.
|
|
108
|
+
* @returns a function to remove the listener.
|
|
109
|
+
*/
|
|
44
110
|
onChange(listener: TabChangeListener) {
|
|
45
111
|
this.listeners.push(listener)
|
|
46
112
|
return () => {
|
|
@@ -48,6 +114,10 @@ export class ChatTabsController {
|
|
|
48
114
|
}
|
|
49
115
|
}
|
|
50
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Changes the chat (tab) that is currently active.
|
|
119
|
+
* @param id the id of the chat to select.
|
|
120
|
+
*/
|
|
51
121
|
select(id: string) {
|
|
52
122
|
this.activeChatId = id
|
|
53
123
|
this.runListeners()
|
|
@@ -6,6 +6,14 @@ type Listeners<T> = {
|
|
|
6
6
|
[K in keyof T]?: ((value: T[K]) => void)[]
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* A generic representation of a state that can be observed for changes.
|
|
11
|
+
*
|
|
12
|
+
* Building our own state instead of using React is important because:
|
|
13
|
+
* 1. We need to be able to control it even outside the react context.
|
|
14
|
+
* 2. We need performance, we can't have everything re-rendering because something changes. We need to be careful to watch only the
|
|
15
|
+
* properties we need in a component.
|
|
16
|
+
*/
|
|
9
17
|
export class ObservableState<T> {
|
|
10
18
|
protected state: T
|
|
11
19
|
private listeners: Listeners<T> = {}
|
|
@@ -25,6 +33,12 @@ export class ObservableState<T> {
|
|
|
25
33
|
return this.state[key]
|
|
26
34
|
}
|
|
27
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Watches for changes in the state referred by the provided key.
|
|
38
|
+
* @param key the key of the state to watch.
|
|
39
|
+
* @param listener a function called whenever the value of the state referred by `key` changes.
|
|
40
|
+
* @returns a function to remove the listener.
|
|
41
|
+
*/
|
|
28
42
|
onChange<K extends keyof T>(key: K, listener: (value: T[K]) => void) {
|
|
29
43
|
this.listeners[key] ??= []
|
|
30
44
|
this.listeners[key]!.push(listener)
|