@altimateai/ui-components 0.0.79 → 0.0.80
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/0~315.js +46635 -0
- package/dist/0~315.js.LICENSE.txt +73 -0
- package/dist/0~315.js.map +1 -0
- package/dist/131.js +14352 -0
- package/dist/131.js.map +1 -0
- package/dist/3~315.js +46635 -0
- package/dist/3~315.js.LICENSE.txt +73 -0
- package/dist/3~315.js.map +1 -0
- package/dist/582.js +1299 -0
- package/dist/582.js.map +1 -0
- package/dist/assets/icons/index.d.ts +45 -110
- package/dist/assets/icons/index.d.ts.map +1 -0
- package/dist/chatbotV2.js +5233 -0
- package/dist/chatbotV2.js.map +1 -0
- package/dist/components/api/index.d.ts +7 -0
- package/dist/components/api/index.d.ts.map +1 -0
- package/dist/components/api/useMutation.d.ts +12 -0
- package/dist/components/api/useMutation.d.ts.map +1 -0
- package/dist/components/api/useQuery.d.ts +12 -0
- package/dist/components/api/useQuery.d.ts.map +1 -0
- package/dist/components/chatbotV2/ChatProvider.d.ts +17 -0
- package/dist/components/chatbotV2/ChatProvider.d.ts.map +1 -0
- package/dist/components/chatbotV2/Chatbot.d.ts +4 -0
- package/dist/components/chatbotV2/Chatbot.d.ts.map +1 -0
- package/dist/components/chatbotV2/HelloMessageSample.d.ts +3 -0
- package/dist/components/chatbotV2/HelloMessageSample.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/action-buttons/DownloadMessage.d.ts +9 -0
- package/dist/components/chatbotV2/components/action-buttons/DownloadMessage.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/action-buttons/ShareMessage.d.ts +9 -0
- package/dist/components/chatbotV2/components/action-buttons/ShareMessage.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/artifacts/Artifacts.d.ts +8 -0
- package/dist/components/chatbotV2/components/artifacts/Artifacts.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/artifacts/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/artifacts/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/attachmentList/AttachmentList.d.ts +8 -0
- package/dist/components/chatbotV2/components/attachmentList/AttachmentList.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/attachmentList/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/attachmentList/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/cancelGenerationButton/CancelGenerationButton.d.ts +3 -0
- package/dist/components/chatbotV2/components/cancelGenerationButton/CancelGenerationButton.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/cancelGenerationButton/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/cancelGenerationButton/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatFeedbackActions.d.ts +8 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatFeedbackActions.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatLastMessageActions.d.ts +8 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatLastMessageActions.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatMessageActions.d.ts +10 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatMessageActions.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatMessageEndActions.d.ts +9 -0
- package/dist/components/chatbotV2/components/chatMessageActions/ChatMessageEndActions.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatMessageActions/index.d.ts +4 -0
- package/dist/components/chatbotV2/components/chatMessageActions/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/chatTriggerLink/ChatTriggerLink.d.ts +7 -0
- package/dist/components/chatbotV2/components/chatTriggerLink/ChatTriggerLink.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/citations/Citations.d.ts +28 -0
- package/dist/components/chatbotV2/components/citations/Citations.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/coachAI/CoachAI.d.ts +2 -0
- package/dist/components/chatbotV2/components/coachAI/CoachAI.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/coachAI/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/coachAI/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/contextPanel/ContextPanel.d.ts +13 -0
- package/dist/components/chatbotV2/components/contextPanel/ContextPanel.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/contextPanel/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/contextPanel/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/emailDialog/EmailDialog.d.ts +10 -0
- package/dist/components/chatbotV2/components/emailDialog/EmailDialog.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/entityItem/EntityItem.d.ts +7 -0
- package/dist/components/chatbotV2/components/entityItem/EntityItem.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/entityItem/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/entityItem/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/followup/Followup.d.ts +3 -0
- package/dist/components/chatbotV2/components/followup/Followup.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/index.d.ts +18 -0
- package/dist/components/chatbotV2/components/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/interactionPrompt/InteractionPrompt.d.ts +8 -0
- package/dist/components/chatbotV2/components/interactionPrompt/InteractionPrompt.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/interactionPrompt/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/interactionPrompt/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/loadingIndicator/LoadingIndicator.d.ts +3 -0
- package/dist/components/chatbotV2/components/loadingIndicator/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/loadingIndicator/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/loadingIndicator/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/messageItem/MessageItem.d.ts +12 -0
- package/dist/components/chatbotV2/components/messageItem/MessageItem.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/messageItem/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/messageItem/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/messageList/MessageList.d.ts +11 -0
- package/dist/components/chatbotV2/components/messageList/MessageList.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/messageList/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/messageList/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/questionForm/QuestionForm.d.ts +15 -0
- package/dist/components/chatbotV2/components/questionForm/QuestionForm.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/questionForm/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/questionForm/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/refetchSession/RefetchSession.d.ts +8 -0
- package/dist/components/chatbotV2/components/refetchSession/RefetchSession.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/regenerateButton/RegenerateButton.d.ts +7 -0
- package/dist/components/chatbotV2/components/regenerateButton/RegenerateButton.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/regenerateButton/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/regenerateButton/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/selectedContexts/SelectedContexts.d.ts +8 -0
- package/dist/components/chatbotV2/components/selectedContexts/SelectedContexts.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/statusUpdates/StatusUpdates.d.ts +10 -0
- package/dist/components/chatbotV2/components/statusUpdates/StatusUpdates.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/statusUpdates/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/statusUpdates/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/todoProgress/TodoProgress.d.ts +8 -0
- package/dist/components/chatbotV2/components/todoProgress/TodoProgress.d.ts.map +1 -0
- package/dist/components/chatbotV2/components/todoProgress/index.d.ts +2 -0
- package/dist/components/chatbotV2/components/todoProgress/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/hooks/transports.d.ts +126 -0
- package/dist/components/chatbotV2/hooks/transports.d.ts.map +1 -0
- package/dist/components/chatbotV2/hooks/useAgentChat.d.ts +41 -0
- package/dist/components/chatbotV2/hooks/useAgentChat.d.ts.map +1 -0
- package/dist/components/chatbotV2/hooks/useEntityDetection.d.ts +4 -0
- package/dist/components/chatbotV2/hooks/useEntityDetection.d.ts.map +1 -0
- package/dist/components/chatbotV2/hooks/useFeedback.d.ts +5 -0
- package/dist/components/chatbotV2/hooks/useFeedback.d.ts.map +1 -0
- package/dist/components/chatbotV2/index.d.ts +22 -0
- package/dist/components/chatbotV2/index.d.ts.map +1 -0
- package/dist/components/chatbotV2/store/chatSlice.d.ts +65 -0
- package/dist/components/chatbotV2/store/chatSlice.d.ts.map +1 -0
- package/dist/components/chatbotV2/store/index.d.ts +10 -0
- package/dist/components/chatbotV2/store/index.d.ts.map +1 -0
- package/dist/{types-ByRPUpXR.d.ts → components/chatbotV2/types.d.ts} +77 -195
- package/dist/components/chatbotV2/types.d.ts.map +1 -0
- package/dist/components/chatbotV2/utils/entityDetection.d.ts +12 -0
- package/dist/components/chatbotV2/utils/entityDetection.d.ts.map +1 -0
- package/dist/components/chatbotV2/utils/streamProcessor.d.ts +98 -0
- package/dist/components/chatbotV2/utils/streamProcessor.d.ts.map +1 -0
- package/dist/components/chatbotV2/utils.d.ts +3 -0
- package/dist/components/chatbotV2/utils.d.ts.map +1 -0
- package/dist/components/dbtDocs/api/index.d.ts +16 -0
- package/dist/components/dbtDocs/api/index.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/ConversationHighlighter.d.ts +6 -0
- package/dist/components/dbtDocs/collaboration/ConversationHighlighter.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/ConversationInputForm.d.ts +13 -0
- package/dist/components/dbtDocs/collaboration/ConversationInputForm.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/ConversationsHighlighter.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/ConversationsHighlighter.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsCollaborationComponents.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsCollaborationComponents.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsCollaborationProvider.d.ts +22 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsCollaborationProvider.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsConversationsRightPanel.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsConversationsRightPanel.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsReducer.d.ts +1931 -0
- package/dist/components/dbtDocs/collaboration/DbtDocsReducer.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/HighlightAnchor.d.ts +12 -0
- package/dist/components/dbtDocs/collaboration/HighlightAnchor.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/HighlightBlocker.d.ts +7 -0
- package/dist/components/dbtDocs/collaboration/HighlightBlocker.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/HotspotButton.d.ts +7 -0
- package/dist/components/dbtDocs/collaboration/HotspotButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/NewConversationForm.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/NewConversationForm.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/ShowConversationsButton.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/ShowConversationsButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/constants.d.ts +20 -0
- package/dist/components/dbtDocs/collaboration/constants.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/Conversation.d.ts +9 -0
- package/dist/components/dbtDocs/collaboration/conversations/Conversation.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationGroup.d.ts +10 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationGroup.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationGroups.d.ts +3 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationGroups.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationHeader.d.ts +13 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationHeader.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationHighlightText.d.ts +6 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationHighlightText.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationReplyForm.d.ts +9 -0
- package/dist/components/dbtDocs/collaboration/conversations/ConversationReplyForm.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/ResolveButton.d.ts +8 -0
- package/dist/components/dbtDocs/collaboration/conversations/ResolveButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/context/ConversationsProvider.d.ts +18 -0
- package/dist/components/dbtDocs/collaboration/conversations/context/ConversationsProvider.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/context/types.d.ts +44 -0
- package/dist/components/dbtDocs/collaboration/conversations/context/types.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/conversations/useConversations.d.ts +5 -0
- package/dist/components/dbtDocs/collaboration/conversations/useConversations.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/highlightUtils.d.ts +28 -0
- package/dist/components/dbtDocs/collaboration/highlightUtils.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/mentions/MentionsInput.d.ts +11 -0
- package/dist/components/dbtDocs/collaboration/mentions/MentionsInput.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/mentions/index.d.ts +32 -0
- package/dist/components/dbtDocs/collaboration/mentions/index.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/newConversationUtils.d.ts +15 -0
- package/dist/components/dbtDocs/collaboration/newConversationUtils.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/selectionEndEvent.d.ts +17 -0
- package/dist/components/dbtDocs/collaboration/selectionEndEvent.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/types.d.ts +15 -0
- package/dist/components/dbtDocs/collaboration/types.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/useConversationUsers.d.ts +5 -0
- package/dist/components/dbtDocs/collaboration/useConversationUsers.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/useDbtDocsCollaboration.d.ts +7 -0
- package/dist/components/dbtDocs/collaboration/useDbtDocsCollaboration.d.ts.map +1 -0
- package/dist/components/dbtDocs/collaboration/useHighlight.d.ts +12 -0
- package/dist/components/dbtDocs/collaboration/useHighlight.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/AddCommentButton.d.ts +3 -0
- package/dist/components/dbtDocs/details/AddCommentButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/AddCommentOnCodeButton.d.ts +3 -0
- package/dist/components/dbtDocs/details/AddCommentOnCodeButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/AddCommentOnModelDescriptionButton.d.ts +3 -0
- package/dist/components/dbtDocs/details/AddCommentOnModelDescriptionButton.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/DbtDocs.d.ts +10 -0
- package/dist/components/dbtDocs/details/DbtDocs.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/DbtDocsDetails.d.ts +3 -0
- package/dist/components/dbtDocs/details/DbtDocsDetails.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/DbtDocsRenderer.d.ts +8 -0
- package/dist/components/dbtDocs/details/DbtDocsRenderer.d.ts.map +1 -0
- package/dist/components/dbtDocs/details/dbtDocsUtils.d.ts +5 -0
- package/dist/components/dbtDocs/details/dbtDocsUtils.d.ts.map +1 -0
- package/dist/components/dbtDocs/index.d.ts +8 -0
- package/dist/components/dbtDocs/index.d.ts.map +1 -0
- package/dist/components/dbtDocs/resources/dbtDocsAngularApp.d.ts +3 -0
- package/dist/components/dbtDocs/resources/dbtDocsAngularApp.d.ts.map +1 -0
- package/dist/components/lineage/api/index.d.ts +65 -0
- package/dist/components/lineage/api/index.d.ts.map +1 -0
- package/dist/components/lineage/assets/icons/index.d.ts +61 -0
- package/dist/components/lineage/assets/icons/index.d.ts.map +1 -0
- package/dist/components/lineage/cllUtils.d.ts +17 -0
- package/dist/components/lineage/cllUtils.d.ts.map +1 -0
- package/dist/components/lineage/components/AutoExpansionPopover.d.ts +3 -0
- package/dist/components/lineage/components/AutoExpansionPopover.d.ts.map +1 -0
- package/dist/components/lineage/components/BetterPopover.d.ts +14 -0
- package/dist/components/lineage/components/BetterPopover.d.ts.map +1 -0
- package/dist/components/lineage/components/Chip.d.ts +6 -0
- package/dist/components/lineage/components/Chip.d.ts.map +1 -0
- package/dist/components/lineage/components/Column.d.ts +52 -0
- package/dist/components/lineage/components/Column.d.ts.map +1 -0
- package/dist/components/lineage/components/ColumnRow.d.ts +8 -0
- package/dist/components/lineage/components/ColumnRow.d.ts.map +1 -0
- package/dist/components/lineage/components/CustomNodes.d.ts +16 -0
- package/dist/components/lineage/components/CustomNodes.d.ts.map +1 -0
- package/dist/components/lineage/components/DashboardDetails.d.ts +12 -0
- package/dist/components/lineage/components/DashboardDetails.d.ts.map +1 -0
- package/dist/components/lineage/components/DynamicLineage.d.ts +9 -0
- package/dist/components/lineage/components/DynamicLineage.d.ts.map +1 -0
- package/dist/components/lineage/components/ExpandWithConfidenceCard.d.ts +3 -0
- package/dist/components/lineage/components/ExpandWithConfidenceCard.d.ts.map +1 -0
- package/dist/components/lineage/components/ExportButton.d.ts +6 -0
- package/dist/components/lineage/components/ExportButton.d.ts.map +1 -0
- package/dist/components/lineage/components/ExportFinalLineageModal.d.ts +5 -0
- package/dist/components/lineage/components/ExportFinalLineageModal.d.ts.map +1 -0
- package/dist/components/lineage/components/ExposureDetails.d.ts +6 -0
- package/dist/components/lineage/components/ExposureDetails.d.ts.map +1 -0
- package/dist/components/lineage/components/Feedback.d.ts +5 -0
- package/dist/components/lineage/components/Feedback.d.ts.map +1 -0
- package/dist/components/lineage/components/Form.d.ts +5 -0
- package/dist/components/lineage/components/Form.d.ts.map +1 -0
- package/dist/components/lineage/components/FunctionDetails.d.ts +3 -0
- package/dist/components/lineage/components/FunctionDetails.d.ts.map +1 -0
- package/dist/components/lineage/components/LineageLegend.d.ts +3 -0
- package/dist/components/lineage/components/LineageLegend.d.ts.map +1 -0
- package/dist/components/lineage/components/LineageModals.d.ts +3 -0
- package/dist/components/lineage/components/LineageModals.d.ts.map +1 -0
- package/dist/components/lineage/components/Loader/index.d.ts +7 -0
- package/dist/components/lineage/components/Loader/index.d.ts.map +1 -0
- package/dist/components/lineage/components/MoreTables.d.ts +11 -0
- package/dist/components/lineage/components/MoreTables.d.ts.map +1 -0
- package/dist/components/lineage/components/Purpose.d.ts +6 -0
- package/dist/components/lineage/components/Purpose.d.ts.map +1 -0
- package/dist/components/lineage/components/ResetButton.d.ts +6 -0
- package/dist/components/lineage/components/ResetButton.d.ts.map +1 -0
- package/dist/components/lineage/components/Settings.d.ts +6 -0
- package/dist/components/lineage/components/Settings.d.ts.map +1 -0
- package/dist/components/lineage/components/SettingsButton.d.ts +3 -0
- package/dist/components/lineage/components/SettingsButton.d.ts.map +1 -0
- package/dist/components/lineage/components/SidebarErrorBoundary.d.ts +13 -0
- package/dist/components/lineage/components/SidebarErrorBoundary.d.ts.map +1 -0
- package/dist/components/lineage/components/SnowflakeStageDetails.d.ts +3 -0
- package/dist/components/lineage/components/SnowflakeStageDetails.d.ts.map +1 -0
- package/dist/components/lineage/components/SqlLineage.d.ts +12 -0
- package/dist/components/lineage/components/SqlLineage.d.ts.map +1 -0
- package/dist/components/lineage/components/StaticLineage.d.ts +17 -0
- package/dist/components/lineage/components/StaticLineage.d.ts.map +1 -0
- package/dist/components/lineage/components/TableDetails.d.ts +53 -0
- package/dist/components/lineage/components/TableDetails.d.ts.map +1 -0
- package/dist/components/lineage/components/Tags/index.d.ts +5 -0
- package/dist/components/lineage/components/Tags/index.d.ts.map +1 -0
- package/dist/components/lineage/components/ViewsTypeBadge.d.ts +5 -0
- package/dist/components/lineage/components/ViewsTypeBadge.d.ts.map +1 -0
- package/dist/components/lineage/components/sidebarModal/SidebarModal.d.ts +9 -0
- package/dist/components/lineage/components/sidebarModal/SidebarModal.d.ts.map +1 -0
- package/dist/components/lineage/constants.d.ts +12 -0
- package/dist/components/lineage/constants.d.ts.map +1 -0
- package/dist/components/lineage/context/LineageProvider.d.ts +35 -0
- package/dist/components/lineage/context/LineageProvider.d.ts.map +1 -0
- package/dist/components/lineage/context/LineageSlice.d.ts +4673 -0
- package/dist/components/lineage/context/LineageSlice.d.ts.map +1 -0
- package/dist/components/lineage/context/types.d.ts +57 -0
- package/dist/components/lineage/context/types.d.ts.map +1 -0
- package/dist/components/lineage/graph.d.ts +43 -0
- package/dist/components/lineage/graph.d.ts.map +1 -0
- package/dist/components/lineage/index.d.ts +8 -0
- package/dist/components/lineage/index.d.ts.map +1 -0
- package/dist/{lineage/index.d.ts → components/lineage/types.d.ts} +59 -92
- package/dist/components/lineage/types.d.ts.map +1 -0
- package/dist/components/lineage/utils.d.ts +100 -0
- package/dist/components/lineage/utils.d.ts.map +1 -0
- package/dist/components/shared/index.d.ts +2 -0
- package/dist/components/shared/index.d.ts.map +1 -0
- package/dist/components/shared/types.d.ts +18 -0
- package/dist/components/shared/types.d.ts.map +1 -0
- package/dist/components/teammate/AddLearningForm.d.ts +13 -0
- package/dist/components/teammate/AddLearningForm.d.ts.map +1 -0
- package/dist/components/teammate/CoachForm.d.ts +10 -0
- package/dist/components/teammate/CoachForm.d.ts.map +1 -0
- package/dist/components/teammate/CoachFormButton.d.ts +3 -0
- package/dist/components/teammate/CoachFormButton.d.ts.map +1 -0
- package/dist/components/teammate/CoachFormInput.d.ts +8 -0
- package/dist/components/teammate/CoachFormInput.d.ts.map +1 -0
- package/dist/components/teammate/LearningRow.d.ts +10 -0
- package/dist/components/teammate/LearningRow.d.ts.map +1 -0
- package/dist/components/teammate/LearningsList.d.ts +11 -0
- package/dist/components/teammate/LearningsList.d.ts.map +1 -0
- package/dist/components/teammate/TeamMateProvider.d.ts +8 -0
- package/dist/components/teammate/TeamMateProvider.d.ts.map +1 -0
- package/dist/components/teammate/TeamMates.d.ts +10 -0
- package/dist/components/teammate/TeamMates.d.ts.map +1 -0
- package/dist/components/teammate/TeamMatesCard.d.ts +10 -0
- package/dist/components/teammate/TeamMatesCard.d.ts.map +1 -0
- package/dist/components/teammate/alertManager/AlertManagerDisplay.d.ts +4 -0
- package/dist/components/teammate/alertManager/AlertManagerDisplay.d.ts.map +1 -0
- package/dist/components/teammate/assets/index.d.ts +8 -0
- package/dist/components/teammate/assets/index.d.ts.map +1 -0
- package/dist/components/teammate/index.d.ts +11 -0
- package/dist/components/teammate/index.d.ts.map +1 -0
- package/dist/components/teammate/projectGovernor/ChecksInput.d.ts +7 -0
- package/dist/components/teammate/projectGovernor/ChecksInput.d.ts.map +1 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernanceCheck.d.ts +8 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernanceCheck.d.ts.map +1 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernorDisplay.d.ts +3 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernorDisplay.d.ts.map +1 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernorForm.d.ts +7 -0
- package/dist/components/teammate/projectGovernor/ProjectGovernorForm.d.ts.map +1 -0
- package/dist/components/teammate/projectGovernor/types.d.ts +48 -0
- package/dist/components/teammate/projectGovernor/types.d.ts.map +1 -0
- package/dist/components/teammate/teamMateSlice.d.ts +15 -0
- package/dist/components/teammate/teamMateSlice.d.ts.map +1 -0
- package/dist/components/teammate/teamMatesConfig.d.ts +3 -0
- package/dist/components/teammate/teamMatesConfig.d.ts.map +1 -0
- package/dist/components/teammate/teradata/HelloMessage.d.ts +3 -0
- package/dist/components/teammate/teradata/HelloMessage.d.ts.map +1 -0
- package/dist/components/teammate/teradata/MigratorDisplay.d.ts +4 -0
- package/dist/components/teammate/teradata/MigratorDisplay.d.ts.map +1 -0
- package/dist/components/teammate/types.d.ts +113 -0
- package/dist/components/teammate/types.d.ts.map +1 -0
- package/dist/components/teammate/useTeamMateContext.d.ts +3 -0
- package/dist/components/teammate/useTeamMateContext.d.ts.map +1 -0
- package/dist/components/user/ProfileImageByUser.d.ts +7 -0
- package/dist/components/user/ProfileImageByUser.d.ts.map +1 -0
- package/dist/components/user/index.d.ts +3 -0
- package/dist/components/user/index.d.ts.map +1 -0
- package/dist/components/user/types.d.ts +7 -0
- package/dist/components/user/types.d.ts.map +1 -0
- package/dist/dbtDocs.css +297 -0
- package/dist/dbtDocs.css.map +1 -0
- package/dist/dbtDocs.js +1 -0
- package/dist/index.d.ts +14 -285
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -40
- package/dist/lineage.css +1221 -0
- package/dist/lineage.css.map +1 -0
- package/dist/lineage.js +7267 -0
- package/dist/lineage.js.map +1 -0
- package/dist/rslib-runtime.js +20 -0
- package/dist/rslib-runtime.js.map +1 -0
- package/dist/shared/AutosizeTextarea.d.ts +19 -0
- package/dist/shared/AutosizeTextarea.d.ts.map +1 -0
- package/dist/shared/Collapse.d.ts +7 -0
- package/dist/shared/Collapse.d.ts.map +1 -0
- package/dist/shared/Table.d.ts +4 -0
- package/dist/shared/Table.d.ts.map +1 -0
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/utils.d.ts +3 -0
- package/dist/shared/utils.d.ts.map +1 -0
- package/dist/static/image/postgres.png +0 -0
- package/dist/static/image/s3.png +0 -0
- package/dist/static/image/snowflake.png +0 -0
- package/dist/static/svg/botIcon.svg +15 -0
- package/dist/static/svg/brackets.svg +5 -0
- package/dist/static/svg/case-sensitive.svg +5 -0
- package/dist/static/svg/docgen.svg +23 -0
- package/dist/static/svg/half-circle.svg +5 -0
- package/dist/static/svg/opportunities.svg +25 -0
- package/dist/static/svg/split-horizontal.svg +5 -0
- package/dist/static/svg/sqlExpert.svg +24 -0
- package/dist/static/svg/summary.svg +25 -0
- package/dist/styles.css +1638 -0
- package/dist/styles.css.map +1 -0
- package/dist/teammate.css +124 -0
- package/dist/teammate.css.map +1 -0
- package/dist/teammate.js +5655 -0
- package/dist/teammate.js.map +1 -0
- package/dist/user.css +14 -0
- package/dist/user.css.map +1 -0
- package/dist/user.js +13 -0
- package/dist/user.js.map +1 -0
- package/package.json +116 -34
- package/dist/Button-42Dj_nRE.d.ts +0 -28
- package/dist/CoachForm.css +0 -1
- package/dist/CoachForm.js +0 -44445
- package/dist/DbtDocsRenderer.js +0 -45647
- package/dist/IconEye.js +0 -11
- package/dist/Stack.js +0 -7170
- package/dist/Switch.js +0 -128
- package/dist/ToggleGroup.js +0 -8543
- package/dist/_basePickBy.js +0 -151
- package/dist/_baseUniq.js +0 -615
- package/dist/arc.js +0 -83
- package/dist/architecture-U656AL7Q.js +0 -5
- package/dist/architectureDiagram-VXUJARFQ.js +0 -4666
- package/dist/assets/icons/index.js +0 -56
- package/dist/blockDiagram-VD42YOAC.js +0 -2266
- package/dist/c4Diagram-YG6GDRKO.js +0 -1582
- package/dist/channel.js +0 -5
- package/dist/chatbotV2/index.d.ts +0 -359
- package/dist/chatbotV2/index.js +0 -58
- package/dist/chunk-4BX2VUAB.js +0 -9
- package/dist/chunk-55IACEB6.js +0 -9
- package/dist/chunk-B4BG7PRW.js +0 -1377
- package/dist/chunk-DI55MBZ5.js +0 -1382
- package/dist/chunk-FMBD7UC4.js +0 -19
- package/dist/chunk-QN33PNHL.js +0 -20
- package/dist/chunk-QZHKN3VN.js +0 -15
- package/dist/chunk-TZMSLE5B.js +0 -64
- package/dist/classDiagram-2ON5EDUG.js +0 -17
- package/dist/classDiagram-v2-WZHVMYZB.js +0 -17
- package/dist/clone.js +0 -8
- package/dist/cose-bilkent-S5V4N54A.js +0 -2606
- package/dist/cytoscape.esm.js +0 -18731
- package/dist/dagre-6UL2VRFP.js +0 -447
- package/dist/dayjs.min.js +0 -302
- package/dist/defaultLocale.js +0 -171
- package/dist/diagram-PSM6KHXK.js +0 -535
- package/dist/diagram-QEK2KX5R.js +0 -221
- package/dist/diagram-S2PKOQOG.js +0 -143
- package/dist/erDiagram-Q2GNP2WA.js +0 -843
- package/dist/flowDiagram-NV44I4VS.js +0 -1628
- package/dist/ganttDiagram-LVOFAZNH.js +0 -2500
- package/dist/gitGraph-F6HP7TQM.js +0 -5
- package/dist/gitGraphDiagram-NY62KEGX.js +0 -713
- package/dist/graph.js +0 -247
- package/dist/index.css +0 -1
- package/dist/index2.js +0 -689
- package/dist/info-NVLQJR56.js +0 -5
- package/dist/infoDiagram-F6ZHWCRC.js +0 -24
- package/dist/init.js +0 -16
- package/dist/journeyDiagram-XKPGCS4Q.js +0 -837
- package/dist/kanban-definition-3W4ZIXB7.js +0 -720
- package/dist/katex.js +0 -11691
- package/dist/layout.js +0 -1324
- package/dist/lineage/index.js +0 -7328
- package/dist/linear.js +0 -259
- package/dist/main.css +0 -1
- package/dist/main.js +0 -4566
- package/dist/mermaid-parser.core.js +0 -12921
- package/dist/mindmap-definition-VGOIOE7T.js +0 -786
- package/dist/ordinal.js +0 -61
- package/dist/packet-BFZMPI3H.js +0 -5
- package/dist/pie-7BOR55EZ.js +0 -5
- package/dist/pieDiagram-ADFJNKIX.js +0 -163
- package/dist/quadrantDiagram-AYHSOK5B.js +0 -1025
- package/dist/radar-NHE76QYJ.js +0 -5
- package/dist/redux-toolkit.css +0 -1
- package/dist/redux-toolkit.modern.js +0 -12525
- package/dist/requirementDiagram-UZGBJVZJ.js +0 -852
- package/dist/sankeyDiagram-TZEHDZUN.js +0 -811
- package/dist/sequenceDiagram-WL72ISMW.js +0 -2523
- package/dist/shadcn/index.d.ts +0 -761
- package/dist/shadcn/index.js +0 -8680
- package/dist/stateDiagram-FKZM4ZOC.js +0 -264
- package/dist/stateDiagram-v2-4FDKWEC3.js +0 -17
- package/dist/storybook/Accordion.stories.tsx +0 -52
- package/dist/storybook/Alert.stories.tsx +0 -101
- package/dist/storybook/AlertDialog.stories.tsx +0 -161
- package/dist/storybook/AutosizeTextarea.stories.tsx +0 -52
- package/dist/storybook/Avatar.stories.tsx +0 -58
- package/dist/storybook/Badge.stories.tsx +0 -43
- package/dist/storybook/Button.stories.tsx +0 -67
- package/dist/storybook/Calendar.stories.tsx +0 -103
- package/dist/storybook/Card.stories.tsx +0 -69
- package/dist/storybook/Carousel.stories.tsx +0 -274
- package/dist/storybook/Checkbox.stories.tsx +0 -65
- package/dist/storybook/Combobox.stories.tsx +0 -1629
- package/dist/storybook/Command.stories.tsx +0 -35
- package/dist/storybook/DateRange.stories.tsx +0 -540
- package/dist/storybook/DebouncedInput.stories.tsx +0 -179
- package/dist/storybook/DropdownMenu.stories.tsx +0 -36
- package/dist/storybook/Form.stories.tsx +0 -114
- package/dist/storybook/HoverCard.stories.tsx +0 -99
- package/dist/storybook/Input.stories.tsx +0 -156
- package/dist/storybook/InputGroup.stories.tsx +0 -352
- package/dist/storybook/Label.stories.tsx +0 -42
- package/dist/storybook/Menubar.stories.tsx +0 -159
- package/dist/storybook/Pagination.stories.tsx +0 -152
- package/dist/storybook/Popover.stories.tsx +0 -23
- package/dist/storybook/Progress.stories.tsx +0 -89
- package/dist/storybook/RadioGroup.stories.tsx +0 -58
- package/dist/storybook/Resizable.stories.tsx +0 -119
- package/dist/storybook/ScrollArea.stories.tsx +0 -101
- package/dist/storybook/Select.stories.tsx +0 -145
- package/dist/storybook/Sheet.stories.tsx +0 -69
- package/dist/storybook/Sidebar.stories.tsx +0 -97
- package/dist/storybook/Slider.stories.tsx +0 -79
- package/dist/storybook/Switch.stories.tsx +0 -90
- package/dist/storybook/Tabs.stories.tsx +0 -147
- package/dist/storybook/TagsInput.stories.tsx +0 -261
- package/dist/storybook/Textarea.stories.tsx +0 -50
- package/dist/storybook/Toast.stories.tsx +0 -107
- package/dist/storybook/Toggle.stories.tsx +0 -106
- package/dist/storybook/ToggleGroup.stories.tsx +0 -178
- package/dist/storybook/Tooltip.stories.tsx +0 -25
- package/dist/storybook/Typography.stories.tsx +0 -231
- package/dist/storybook/drag-and-drop-file-upload.stories.tsx +0 -99
- package/dist/timeline-definition-IT6M3QCI.js +0 -802
- package/dist/treemap-KMMF4GRG.js +0 -5
- package/dist/xychartDiagram-PRI3JC2R.js +0 -1341
- package/readme.md +0 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatbotV2.js","sources":["../src/components/chatbotV2/types.ts","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/regex.js","../../../node_modules/uuid/dist/esm-browser/validate.js","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/components/chatbotV2/utils.ts","../src/components/chatbotV2/store/chatSlice.ts","../src/assets/icons/thinking.svg","../src/assets/icons/download.svg","../src/assets/icons/arrow-right.svg","../src/assets/icons/database.svg","../src/assets/icons/git-merge.svg","../src/assets/icons/arrow-left.svg","../src/assets/icons/index.tsx","../src/components/chatbotV2/components/artifacts/Artifacts.tsx","../src/components/api/useQuery.ts","../src/components/api/useMutation.ts","../src/components/api/index.ts","../src/components/chatbotV2/components/cancelGenerationButton/CancelGenerationButton.tsx","../src/components/teammate/CoachFormInput.tsx","../src/components/teammate/AddLearningForm.tsx","../src/components/teammate/projectGovernor/types.ts","../src/components/teammate/projectGovernor/ChecksInput.tsx","../src/components/teammate/projectGovernor/ProjectGovernorForm.tsx","../src/components/teammate/projectGovernor/ProjectGovernanceCheck.tsx","../src/components/teammate/projectGovernor/ProjectGovernorDisplay.tsx","../src/components/teammate/types.ts","../src/components/chatbotV2/utils/streamProcessor.ts","../src/components/chatbotV2/hooks/transports.ts","../src/components/chatbotV2/hooks/useAgentChat.ts","../src/components/teammate/teradata/HelloMessage.tsx","../src/components/teammate/teradata/MigratorDisplay.tsx","../src/components/teammate/alertManager/AlertManagerDisplay.tsx","../src/components/teammate/teamMatesConfig.ts","../src/components/teammate/CoachForm.tsx","../src/components/chatbotV2/components/coachAI/CoachAI.tsx","../src/components/chatbotV2/components/contextPanel/ContextPanel.tsx","../src/components/chatbotV2/components/regenerateButton/RegenerateButton.tsx","../src/components/chatbotV2/components/chatMessageActions/ChatLastMessageActions.tsx","../src/components/chatbotV2/hooks/useFeedback.ts","../src/components/chatbotV2/components/chatMessageActions/ChatFeedbackActions.tsx","../src/components/chatbotV2/components/emailDialog/EmailDialog.tsx","../src/components/chatbotV2/components/action-buttons/ShareMessage.tsx","../src/components/chatbotV2/components/action-buttons/DownloadMessage.tsx","../src/components/chatbotV2/components/chatMessageActions/ChatMessageActions.tsx","../src/components/chatbotV2/components/interactionPrompt/InteractionPrompt.tsx","../src/components/chatbotV2/components/loadingIndicator/LoadingIndicator.tsx","../src/shared/utils.ts","../src/components/chatbotV2/components/statusUpdates/StatusUpdates.tsx","../src/components/chatbotV2/components/citations/Citations.tsx","../src/components/chatbotV2/components/followup/Followup.tsx","../src/components/chatbotV2/components/todoProgress/TodoProgress.tsx","../src/components/chatbotV2/components/attachmentList/AttachmentList.tsx","../src/components/chatbotV2/components/messageItem/MessageItem.tsx","../src/components/chatbotV2/components/messageList/MessageList.tsx","../src/components/chatbotV2/utils/entityDetection.ts","../src/components/chatbotV2/hooks/useEntityDetection.ts","../src/components/chatbotV2/components/entityItem/EntityItem.tsx","../src/components/chatbotV2/components/selectedContexts/SelectedContexts.tsx","../src/components/chatbotV2/components/questionForm/QuestionForm.tsx","../src/components/chatbotV2/ChatProvider.tsx","../src/components/chatbotV2/components/refetchSession/RefetchSession.tsx","../src/components/chatbotV2/Chatbot.tsx","../src/components/chatbotV2/components/chatTriggerLink/ChatTriggerLink.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\nimport { Citation, TaskLabels } from \"../shared/types\";\nimport { z } from \"zod\";\n\nexport type ChatEventStatus = \"idle\" | \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n\nexport type ChatEvent =\n | { type: \"session_created\"; sessionId: string }\n | { type: \"status_change\"; status: ChatEventStatus; sessionId: string };\n\nexport interface AgentAction {\n id?: string;\n type: \"info\" | \"analysis\";\n content: string;\n timestamp: number;\n artifacts?: Artifact[];\n}\n\nexport enum LoadingState {\n LOADING = \"LOADING\",\n LOADED = \"LOADED\",\n ERROR = \"ERROR\",\n UNINITIALIZED = \"UNINITIALIZED\",\n CANCELLED = \"cancelled\",\n}\n\nexport interface AssistantMeta {\n avatar: string;\n name: string;\n}\n\nexport interface Feedback {\n rating?: \"up\" | \"down\";\n comment?: string;\n}\n\nexport type ContextOption =\n | {\n label: string;\n key: string;\n type: \"submenu\";\n options: { id: string; label: string }[];\n icon?: ReactNode;\n }\n | {\n label: string;\n key: string;\n type: \"trigger\";\n handler?: () => void;\n icon?: ReactNode;\n };\n\nexport interface ChatSession {\n id: string;\n messages: ChatMessage[];\n context?: {\n files?: File[];\n [x: string]: unknown;\n };\n selectedModel?: string | null;\n datamates?: string[];\n status?: SessionStatusEnum;\n}\n\nexport interface FileUploadProps {\n allowedFiles: string; // e.g. \".txt,.json,.md\"\n contextFieldKey: string;\n}\n\nexport interface ChatbotUrls {\n origin?: string;\n askPath?: string;\n proceedPath?: string;\n frontendUrl?: string;\n followupPath?: string;\n entityDetectionUrl?: string;\n feedbackPath?: string;\n}\n\nexport interface Datamate {\n id: string;\n label: string;\n}\n\nexport enum EntityType {\n SNOWFLAKE_ACCOUNT = \"snowflake_account\",\n SNOWFLAKE_WAREHOUSE = \"snowflake_warehouse\",\n SNOWFLAKE_DATABASE = \"snowflake_database\",\n SNOWFLAKE_TABLE = \"snowflake_table\",\n SNOWFLAKE_USER = \"snowflake_user\",\n SNOWFLAKE_ROLE = \"snowflake_role\",\n UNKNOWN = \"unknown\",\n}\n\nexport interface DetectedEntity {\n name: string;\n types_found: EntityType[];\n selected_type: EntityType;\n}\n\nexport interface EntityDetectionRequest {\n text: string;\n detected_entities?: string[];\n}\n\nexport interface EntityDetectionResponse {\n entities: Pick<DetectedEntity, \"name\" | \"types_found\">[];\n original_text: string;\n}\n\nexport interface ChatbotProps {\n helloMessage?: ReactNode;\n assistantMeta?: AssistantMeta;\n context?: Record<string, unknown>;\n fileUploadProps?: FileUploadProps;\n contextOptions?: ContextOption[];\n placeholder?: string;\n autoFocus?: boolean;\n classNames?: {\n chatbot?: string;\n chatMessages?: string;\n messageItem?: string;\n };\n initialMessage?: string;\n submitInitialMessageOnMount?: boolean;\n questionFormLeftActions?: ReactNode[];\n refetchSession?: () => Promise<unknown>;\n chatboxStartPosition?: \"middle\" | \"bottom\";\n helloMessageFooter?: ReactNode;\n handleSavePrompt?: (message: ChatMessage) => void;\n showSavePromptButton?: boolean;\n}\n\nexport interface ChatbotProviderProps extends ChatbotProps {\n taskLabel?: keyof typeof TaskLabels;\n initialValidation?: ChatState[\"initialValidation\"];\n onError?: (error: unknown) => void;\n onEvent?: (event: ChatEvent) => void;\n urls?: ChatbotUrls;\n disableContext?: boolean;\n requestParams?: RequestInit;\n components?: {\n feedback?: ReactNode;\n questionFormButtons?: (\n userPrompt: string,\n onAccept: (improvedPrompt: string) => void\n ) => ReactNode;\n };\n contextOptions?: ContextOption[];\n isMarkdownResponse?: boolean;\n models?: { label: string; value: string }[];\n placeholder?: string;\n sessions?: Record<string, ChatSession>;\n currentSessionId?: string;\n selectedDatamateId?: string;\n handleSavePrompt?: (message: ChatMessage) => void;\n}\n\nexport type InteractionType = \"text\" | \"select\" | \"multiSelect\" | \"confirm\";\n\nexport interface InteractionChoice {\n id: string;\n label: string;\n value: string;\n}\n\nexport interface InteractionRequest {\n type: InteractionType;\n id: string;\n prompt: string;\n required?: boolean;\n choices?: InteractionChoice[];\n validation?: {\n pattern?: string;\n message?: string;\n };\n}\n\nexport interface UploadedFile {\n filename: string;\n content: string; // base64 encoded content\n content_type: string;\n size: number;\n}\n\nexport interface MessageAttachment {\n id: string;\n attachment_name: string;\n file_type: string | null;\n s3_url: string | null;\n extracted_content: string | null;\n order: number;\n attachment_type: string; // 'file', 'datamate', 'knowledge_base'\n attachment_reference_id: string | null;\n file_size: number | null;\n created_on: string; // ISO date string\n}\n\nexport interface ChatMessage {\n id: string;\n content: string;\n role: \"user\" | \"assistant\";\n timestamp: number;\n actions?: AgentAction[];\n interaction?: InteractionRequest;\n artifacts?: Artifact[];\n heading: string;\n citations?: Citation[];\n todos?: TodoItem[];\n attachments?: MessageAttachment[];\n confidence_str?: string;\n}\n\nexport interface Artifact {\n content: string;\n entity: string;\n name: string;\n type: string;\n}\n\nexport interface ChatResponse {\n content: string;\n actions?: AgentAction[];\n interaction?: InteractionRequest;\n role: \"assistant\" | \"user\";\n timestamp: number;\n artifacts?: Artifact[];\n heading: string;\n todos?: TodoItem[];\n}\n\n// Session Status Enum\nexport const sessionStatusSchema = z.enum([\"failed\", \"completed\", \"pending\", \"cancelled\"]);\nexport type SessionStatusEnum = z.infer<typeof sessionStatusSchema>;\n\nexport interface ChatState {\n sessions: Record<string, ChatSession>;\n currentSessionId: string | null;\n loadingState: LoadingState;\n error: string | null;\n abortController: AbortController | null;\n currentActions: AgentAction[];\n currentTodos: TodoItem[];\n taskLabel?: keyof typeof TaskLabels;\n initialValidation?: (data: { context: ChatSession[\"context\"] }) => Promise<void>;\n urls?: ChatbotUrls;\n disableContext?: boolean;\n requestParams?: RequestInit;\n isMarkdownResponse?: boolean;\n models?: { label: string; value: string }[];\n classNames?: {\n chatbot?: string;\n chatMessages?: string;\n messageItem?: string;\n questionForm?: string;\n chatbotScrollingContent?: string;\n };\n components?: {\n feedback?: ReactNode;\n questionFormButtons?: (\n userPrompt: string,\n onAccept: (improvedPrompt: string) => void\n ) => ReactNode;\n };\n}\n\nexport const todoItemSchema = z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum([\"pending\", \"in_progress\", \"completed\"]),\n priority: z.enum([\"high\", \"medium\", \"low\"]),\n});\n\nexport type TodoItem = z.infer<typeof todoItemSchema>;\n\nexport interface ToolUsageData {\n tool: string;\n id: string;\n}\n\nexport interface ProgressUpdate {\n timestamp: string;\n todos: TodoItem[];\n}\n\nexport interface FinalResponseData {\n tool_usage?: ToolUsageData[];\n turns?: number;\n tools_used?: number;\n progress_updates?: ProgressUpdate[];\n total_progress_updates?: number;\n}\n\nexport const agentStreamResponseSchema = z.object({\n id: z.coerce.string().optional(),\n type: z.enum([\n \"info\",\n \"agent_outcome\",\n \"require_user_action\",\n \"analysis\",\n \"error\",\n \"citations\",\n \"text\",\n \"tool_use\",\n \"final_response\",\n \"complete\",\n \"stream_complete\", // Backend uses this as end marker\n \"custom\",\n ]),\n heading: z.string().optional(),\n content: z.string().optional(),\n tool: z.string().optional(),\n todos: z.array(todoItemSchema).optional(),\n response: z.string().optional(),\n data: z\n .object({\n tool_usage: z\n .array(\n z.object({\n tool: z.string(),\n id: z.string(),\n })\n )\n .optional(),\n })\n .optional(),\n interaction: z\n .object({\n type: z.enum([\"text\", \"multiSelect\", \"confirm\", \"select\"]),\n id: z.string(),\n prompt: z.string(),\n required: z.boolean().optional(),\n choices: z\n .array(\n z.object({\n id: z.string(),\n label: z.string(),\n value: z.string(),\n })\n )\n .optional(),\n })\n .optional(),\n artifacts: z\n .array(\n z.object({\n content: z.string(),\n entity: z.string(),\n name: z.string(),\n type: z.string(),\n })\n )\n .optional(),\n citations: z\n .array(\n z.object({\n content: z.string(),\n entity: z.string(),\n name: z.string(),\n type: z.string(),\n })\n )\n .optional(),\n confidence_str: z.string().optional(),\n});\n\nexport interface AgentStreamResponse {\n id?: string;\n type:\n | \"info\"\n | \"agent_outcome\"\n | \"require_user_action\"\n | \"analysis\"\n | \"error\"\n | \"citations\"\n | \"text\"\n | \"tool_use\"\n | \"final_response\"\n | \"complete\"\n | \"stream_complete\"; // Backend uses this as end marker\n heading?: string;\n content?: string;\n tool?: string;\n todos?: TodoItem[];\n response?: string;\n data?: FinalResponseData;\n interaction?: {\n type: \"text\" | \"multiSelect\" | \"confirm\" | \"select\";\n id: string;\n prompt: string;\n required?: boolean;\n choices?: Array<{\n id: string;\n label: string;\n value: string;\n }>;\n };\n artifacts?: Artifact[];\n citations?: Citation[];\n confidence_str?: string;\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { AgentAction } from \"./types\";\n\nexport const addOrUpdateAction = (actions: AgentAction[], action: AgentAction) => {\n const existingAction = actions.find(a => action.id && a.id === action.id);\n if (existingAction) {\n if (action.type === \"analysis\") {\n // analysis is streamed, so we need to append to the existing action\n return [\n ...actions.filter(a => a.id !== action.id),\n { ...existingAction, content: existingAction.content + action.content },\n ];\n }\n return [...actions.filter(a => a.id !== action.id), action];\n }\n return [...actions, action];\n};\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport {\n AgentAction,\n Artifact,\n ChatSession,\n ChatState,\n Feedback,\n InteractionRequest,\n LoadingState,\n MessageAttachment,\n TodoItem,\n DetectedEntity,\n EntityType,\n} from \"../types\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { addOrUpdateAction } from \"../utils\";\nimport { Citation } from \"../../shared/types\";\n\ninterface AddMessagePayload {\n sessionId: string;\n id: string;\n content: string;\n role: \"user\" | \"assistant\";\n timestamp: number;\n actions?: AgentAction[];\n interaction?: InteractionRequest;\n artifacts?: Artifact[];\n heading: string;\n citations?: Citation[];\n todos?: TodoItem[];\n attachments?: MessageAttachment[];\n confidence_str?: string;\n}\n\ninterface DeleteMessagePayload {\n sessionId: string;\n messageId: string;\n}\n\ninterface UpdateContextPayload {\n sessionId: string;\n context: Record<string, unknown>;\n}\n\ninterface UpdateDatamateInSessionPayload {\n sessionId: string;\n datamates: string[];\n}\n\ninterface UpdateEntitiesPayload {\n sessionId: string;\n entities: DetectedEntity[];\n}\n\ninterface UpdateEntityTypePayload {\n sessionId: string;\n entityName: string;\n newType: EntityType;\n}\n\nexport const initialState: ChatState = {\n sessions: {},\n currentSessionId: null,\n loadingState: LoadingState.UNINITIALIZED,\n error: null,\n abortController: null,\n currentActions: [],\n currentTodos: [],\n};\n\nconst chatSlice = createSlice({\n name: \"chat\",\n initialState,\n reducers: {\n createSession: (\n state,\n action: PayloadAction<{\n context?: Record<string, unknown>;\n models?: { label: string; value: string }[];\n }>,\n ) => {\n const sessionId = uuidv4();\n state.sessions[sessionId] = {\n id: sessionId,\n messages: [],\n context: action.payload.context || {},\n selectedModel: action.payload?.models?.[0]?.value || null,\n };\n state.currentSessionId = sessionId;\n },\n setSelectedModel: (\n state,\n action: PayloadAction<{ sessionId: string; model: string }>,\n ) => {\n if (state.sessions[action.payload.sessionId]) {\n state.sessions[action.payload.sessionId].selectedModel =\n action.payload.model;\n }\n },\n setCurrentSession: (state, action: PayloadAction<string | null>) => {\n state.currentSessionId = action.payload;\n },\n addMessage: (state, action: PayloadAction<AddMessagePayload>) => {\n const { sessionId, ...message } = action.payload;\n const session = state.sessions[sessionId];\n if (session) {\n const currentMessageIndex = session.messages.findIndex(\n (m) => m.id === message.id,\n );\n if (currentMessageIndex !== -1) {\n session.messages[currentMessageIndex] = {\n ...message,\n attachments: message.attachments || [],\n };\n } else {\n session.messages.push({\n ...message,\n attachments: message.attachments || [],\n });\n }\n }\n },\n updateMessageFeedback: (\n state,\n action: PayloadAction<{\n messageId: string;\n feedback: Feedback;\n }>,\n ) => {\n if (state.currentSessionId) {\n const message = state.sessions[state.currentSessionId].messages.find(\n (m) => m.id === action.payload.messageId,\n );\n if (message) {\n // TODO: Implement feedback submission\n // message.feedback = action.payload.feedback;\n }\n }\n },\n clearHistory: (state) => {\n if (state.currentSessionId) {\n state.sessions[state.currentSessionId].messages = [];\n }\n },\n deleteMessage: (state, action: PayloadAction<DeleteMessagePayload>) => {\n const { sessionId, messageId } = action.payload;\n const session = state.sessions[sessionId];\n if (session) {\n session.messages = session.messages.filter(\n (message) => message.id !== messageId,\n );\n }\n },\n setLoadingState: (\n state,\n action: PayloadAction<{\n state: LoadingState;\n sessionId: ChatState[\"currentSessionId\"];\n }>,\n ) => {\n if (state.currentSessionId === action.payload.sessionId) {\n state.loadingState = action.payload.state;\n }\n },\n setError: (state, action: PayloadAction<string | null>) => {\n state.error = action.payload;\n },\n setAbortController: (\n state,\n action: PayloadAction<AbortController | null>,\n ) => {\n state.abortController = action.payload;\n },\n addAction: (state, action: PayloadAction<AgentAction>) => {\n state.currentActions = addOrUpdateAction(\n state.currentActions,\n action.payload,\n );\n },\n clearActions: (state) => {\n state.currentActions = [];\n },\n setTodos: (state, action: PayloadAction<TodoItem[]>) => {\n state.currentTodos = action.payload;\n },\n clearTodos: (state) => {\n state.currentTodos = [];\n },\n updateContext: (state, action: PayloadAction<UpdateContextPayload>) => {\n const { sessionId, context } = action.payload;\n if (state.sessions[sessionId]) {\n state.sessions[sessionId].context = {\n ...state.sessions[sessionId].context,\n ...context,\n };\n }\n },\n clearContext: (state, action: PayloadAction<{ sessionId: string }>) => {\n const { sessionId } = action.payload;\n if (state.sessions[sessionId]) {\n state.sessions[sessionId].context = {};\n }\n },\n updateDatamateInSession: (\n state,\n action: PayloadAction<UpdateDatamateInSessionPayload>,\n ) => {\n const { sessionId, datamates } = action.payload;\n if (state.sessions[sessionId]) {\n state.sessions[sessionId].datamates = datamates;\n }\n },\n updateEntities: (state, action: PayloadAction<UpdateEntitiesPayload>) => {\n const { sessionId, entities } = action.payload;\n if (state.sessions[sessionId]) {\n state.sessions[sessionId].context = {\n ...state.sessions[sessionId].context,\n entities,\n };\n }\n },\n updateEntityType: (\n state,\n action: PayloadAction<UpdateEntityTypePayload>,\n ) => {\n const { sessionId, entityName, newType } = action.payload;\n if (state.sessions[sessionId]) {\n const entities =\n (state.sessions[sessionId].context?.entities as DetectedEntity[]) ||\n [];\n const updatedEntities = entities.map((entity) =>\n entity.name === entityName\n ? { ...entity, selected_type: newType }\n : entity,\n );\n state.sessions[sessionId].context = {\n ...state.sessions[sessionId].context,\n entities: updatedEntities,\n };\n }\n },\n setSessions: (\n state,\n action: PayloadAction<Record<string, ChatSession>>,\n ) => {\n // merge the new sessions with the existing sessions\n state.sessions = { ...state.sessions, ...action.payload };\n // If current session has messages, set the state to loaded instead of uninitialzed to show action buttons\n if (\n state.currentSessionId &&\n state.loadingState === LoadingState.UNINITIALIZED\n ) {\n const currentSession = state.sessions[state.currentSessionId];\n if (currentSession?.messages.length) {\n state.loadingState = LoadingState.LOADED;\n }\n }\n },\n resetSession: (state) => {\n state.currentSessionId = null;\n state.loadingState = LoadingState.UNINITIALIZED;\n state.error = null;\n },\n },\n});\n\nexport const {\n createSession,\n setSelectedModel,\n setCurrentSession,\n addMessage,\n updateMessageFeedback,\n clearHistory,\n deleteMessage,\n setLoadingState,\n setError,\n setAbortController,\n addAction,\n clearActions,\n setTodos,\n clearTodos,\n updateContext,\n clearContext,\n updateDatamateInSession,\n updateEntities,\n updateEntityType,\n setSessions,\n resetSession,\n} = chatSlice.actions;\n\nexport const chatReducer = chatSlice.reducer;\n","import * as React from \"react\";\nconst SvgThinking = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" viewBox=\"0 0 24 24\" {...props}><path fill=\"#082247\" d=\"M16.117 8.288c.168.487.253.998.253 1.518 0 .207-.164.37-.37.37a.37.37 0 0 1-.37-.37 3.903 3.903 0 0 0-2.602-3.69.37.37 0 0 1 .248-.697 4.64 4.64 0 0 1 2.84 2.869m1.683 1.865a6.03 6.03 0 0 1-2.086 4.256 4.72 4.72 0 0 0-1.604 3.352c1.21-.07 1.862 1.453.985 2.269.853.787.262 2.282-.914 2.268h-.394a1.59 1.59 0 0 1-1.58 1.655H9.41c-.9.005-1.617-.76-1.58-1.655h-.393c-1.177.015-1.768-1.48-.915-2.268-.75-.67-.389-2.007.586-2.222a2.2 2.2 0 0 1-.45-.722c-1.767.131-3.107-1.688-2.526-3.333-2.227-1.008-2.227-4.275 0-5.283-.581-1.64.76-3.46 2.526-3.333.844-2.235 4.149-1.664 4.177.741v10.467c0 .544-.202 1.036-.534 1.416h1.04V4.566c-.01-.474.431-.886.905-.835 3.21.23 5.789 3.207 5.555 6.422m-9.84 5.025a.37.37 0 0 1-.215.478.65.65 0 0 0-.249.16c-.28.28-.206.745-.196.801.351 1.669 2.77 1.44 2.803-.267V5.883c-.01-1.514-2.077-1.95-2.696-.581.497.098 1.97 1.354.914 1.589-.356-.01-.426-.479-.712-.638-1.388-1.101-3.366.408-2.761 2.011a2.08 2.08 0 0 1 1.875.722.367.367 0 0 1-.047.52.367.367 0 0 1-.52-.047 1.352 1.352 0 0 0-1.42-.422c-1.913.563-2.068 3.282-.249 4.065.249-.399 1.711-1.514 1.969-.736a.37.37 0 0 1-.267.45c-2.105.52-1.814 3.478.356 3.534.01-.31.094-.727.426-1.06.24-.248.793-.571.99-.112m5.091 7.12H8.575a.85.85 0 0 0 .839.915h2.798c.492.004.872-.427.84-.915m1.711-1.317a.58.58 0 0 0-.581-.581H7.445a.581.581 0 1 0 0 1.163h6.74a.586.586 0 0 0 .577-.582m-7.317-2.48c-.764.02-.764 1.14 0 1.158h6.74a.581.581 0 1 0 0-1.162h-6.74zm4.734-14.034c-.065.005-.094.028-.103.099V17.76h1.284a5.48 5.48 0 0 1 1.866-3.91c3.567-3.051 1.608-9.004-3.047-9.384m4.763.685 1.71-1.711c.338-.347-.173-.863-.524-.525l-1.711 1.71c-.338.352.178.863.525.526m4.218 4.34h-2.418c-.488.01-.488.731 0 .74h2.418c.488-.009.488-.73 0-.74m-4.218 5.077c-.347-.338-.863.173-.525.525l1.71 1.71c.352.338.863-.173.526-.524zM12.08 2.83V.413c-.01-.488-.731-.488-.74 0V2.83c.009.488.73.488.74 0\" /></svg>;\nexport default SvgThinking;","import * as React from \"react\";\nconst SvgDownload = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} className=\"download_svg__lucide download_svg__lucide-download\" viewBox=\"0 0 24 24\" {...props}><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\" /></svg>;\nexport default SvgDownload;","import * as React from \"react\";\nconst SvgArrowRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} className=\"arrow-right_svg__lucide arrow-right_svg__lucide-arrow-right\" viewBox=\"0 0 24 24\" {...props}><path d=\"M5 12h14M12 5l7 7-7 7\" /></svg>;\nexport default SvgArrowRight;","import * as React from \"react\";\nconst SvgDatabase = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} className=\"database_svg__lucide database_svg__lucide-database\" viewBox=\"0 0 24 24\" {...props}><ellipse cx={12} cy={5} rx={9} ry={3} /><path d=\"M3 5v14a9 3 0 0 0 18 0V5\" /><path d=\"M3 12a9 3 0 0 0 18 0\" /></svg>;\nexport default SvgDatabase;","import * as React from \"react\";\nconst SvgGitMerge = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} className=\"git-merge_svg__lucide git-merge_svg__lucide-git-merge\" viewBox=\"0 0 24 24\" {...props}><circle cx={18} cy={18} r={3} /><circle cx={6} cy={6} r={3} /><path d=\"M6 21V9a9 9 0 0 0 9 9\" /></svg>;\nexport default SvgGitMerge;","import * as React from \"react\";\nconst SvgArrowLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={24} height={24} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} className=\"arrow-left_svg__lucide arrow-left_svg__lucide-git-merge\" viewBox=\"0 0 24 24\" {...props}><circle cx={18} cy={18} r={3} /><circle cx={6} cy={6} r={3} /><path d=\"M6 21V9a9 9 0 0 0 9 9\" /></svg>;\nexport default SvgArrowLeft;","import BoltIcon from \"./bolt.svg?react\";\nimport BracketsIcon from \"./brackets.svg?url\";\nimport HalfCircleIcon from \"./half-circle.svg?url\";\nimport CaseSensitiveIcon from \"./case-sensitive.svg?url\";\nimport SplitHorizontalIcon from \"./split-horizontal.svg?url\";\n\nimport { HTMLAttributes } from \"react\";\n\nexport { default as ThinkingIcon } from \"./thinking.svg?react\";\nexport { default as CircleIcon } from \"./circle.svg?react\";\nexport { default as DownloadIcon } from \"./download.svg?react\";\nexport { default as ArrowRightIcon } from \"./arrow-right.svg?react\";\nexport { default as DatabaseIcon } from \"./database.svg?react\";\nexport { default as GitMergeIcon } from \"./git-merge.svg?react\";\nexport { default as ArrowLeftIcon } from \"./arrow-left.svg?react\";\nexport { default as DbtIcon } from \"./dbt.svg?react\";\n\ninterface Props {\n icon: string;\n}\nconst Icon = ({\n icon,\n className = \"\",\n ...rest\n}: Props & HTMLAttributes<HTMLElement>) => (\n <i className={`${className} codicon codicon-${icon}`} {...rest} />\n);\n\nexport const RemoveIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"remove\" {...props} />\n);\n\nexport const CodeIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"code\" {...props} />\n);\n\nexport const AddIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"add\" {...props} />\n);\n\nexport const DeleteIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"trash\" {...props} />\n);\n\nexport const GlobeIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"globe\" {...props} />\n);\n\nexport const GithubIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"github-inverted\" {...props} />\n);\n\nexport const FilesIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"files\" {...props} />\n);\n\nexport const CommentAddIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"comment-add\" {...props} />;\n\nexport const CommentDiscussionIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"comment-discussion\" {...props} />;\n\nexport const CommentUnresolvedIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"comment-unresolved\" {...props} />;\n\nexport const CheckNoOutlineIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"check\" {...props} />;\n\nexport const CheckedIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"pass-filled\" {...props} />;\n\nexport const PassIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"pass\" {...props} />\n);\n\nexport const RefreshIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"debug-restart\" {...props} />;\n\nexport const SettingsIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"gear\" {...props} />;\n\nexport const ChevronUpIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-up\" {...props} />;\n\nexport const ChevronDownIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-down\" {...props} />;\n\nexport const ChevronRightIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-right\" {...props} />;\n\nexport const ChevronLeftIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-left\" {...props} />;\n\nexport const MoreIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"more\" {...props} />\n);\n\nexport const InfoCircleIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"info\" {...props} />;\n\nexport const AskIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"send\" {...props} />\n);\n\nexport const CloseIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"close\" {...props} />\n);\n\nexport const EditIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"pencil\" {...props} />\n);\n\nexport const ShareIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"share\" {...props} />\n);\n\nexport const SearchIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"search\" {...props} />\n);\n\nexport const FileIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"file\" {...props} />\n);\n\nexport const WarningIcon = (\n props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"warning\" {...props} />;\n\nexport const SendIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n <Icon icon=\"send\" {...props} />\n);\n\nexport {\n BoltIcon,\n BracketsIcon,\n HalfCircleIcon,\n SplitHorizontalIcon,\n CaseSensitiveIcon,\n};\n","import { FC, useState } from \"react\";\nimport {\n Badge,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n} from \"@altimateai/lego\";\nimport { Artifact } from \"../../types\";\nimport { CodeBlock, Stack } from \"@altimateai/lego\";\nimport {\n DownloadIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n} from \"../../../../assets/icons\";\nimport JSZip from \"jszip\";\n\ninterface ArtifactsProps {\n artifacts: Artifact[];\n}\n\nexport const Artifacts: FC<ArtifactsProps> = ({ artifacts }) => {\n const [selectedArtifact, setSelectedArtifact] = useState<Artifact | null>(\n null,\n );\n const [showAll, setShowAll] = useState(false);\n\n if (!artifacts?.length) return null;\n\n const visibleArtifacts = showAll ? artifacts : artifacts.slice(0, 3);\n const hasMore = artifacts.length > 3;\n\n const handleDownloadAll = async () => {\n const zip = new JSZip();\n\n // Add each artifact as a file to the zip\n artifacts.forEach((artifact) => {\n const fileName = `${artifact.name}.${artifact.type}`;\n zip.file(fileName, artifact.content);\n });\n\n try {\n // Generate the zip file\n const content = await zip.generateAsync({ type: \"blob\" });\n\n // Create a download link and trigger download\n const url = window.URL.createObjectURL(content);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = \"artifacts.zip\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error(\"Error creating zip file:\", error);\n }\n };\n\n return (\n <div className=\"al-mt-4\" role=\"region\" aria-label=\"Artifacts\">\n <Stack direction=\"row\" justify=\"start\" align=\"center\" className=\"al-mb-2\">\n <div className=\"al-text-sm al-font-medium\">Artifacts:</div>\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={handleDownloadAll}\n className=\"al-gap-2\"\n >\n <DownloadIcon className=\"al-h-4 al-w-4\" />\n Download All\n </Button>\n </Stack>\n <Stack direction=\"row\" wrap align=\"center\">\n {visibleArtifacts.map((artifact) => (\n <button\n key={artifact.name}\n onClick={() => setSelectedArtifact(artifact)}\n className=\"al-p-0 al-m-0 al-border-0 al-bg-transparent\"\n aria-label={`View ${artifact.name} content`}\n >\n <Badge\n variant=\"outline\"\n className=\"hover:al-bg-gray-100 al-cursor-pointer\"\n >\n {artifact.name}\n </Badge>\n </button>\n ))}\n {hasMore && (\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={() => setShowAll(!showAll)}\n className=\"al-gap-1 al-text-gray-500\"\n aria-expanded={showAll}\n aria-label={showAll ? \"Show less artifacts\" : \"Show more artifacts\"}\n >\n {showAll ? (\n <>\n Show Less <ChevronUpIcon className=\"al-h-4 al-w-4\" />\n </>\n ) : (\n <>\n Show More ({artifacts.length - 3}){\" \"}\n <ChevronDownIcon className=\"al-h-4 al-w-4\" />\n </>\n )}\n </Button>\n )}\n </Stack>\n\n <Dialog\n open={!!selectedArtifact}\n onOpenChange={() => setSelectedArtifact(null)}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{selectedArtifact?.name}</DialogTitle>\n </DialogHeader>\n <div className=\"al-mt-4\">\n <CodeBlock\n code={selectedArtifact?.content || \"\"}\n // @ts-expect-error valid type\n language={selectedArtifact?.type || \"sql\"}\n editorTheme=\"tomorrow\"\n theme=\"light\"\n />\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\ninterface Props<R> {\n queryFn: () => Promise<R>;\n enabled?: boolean;\n}\n\nconst useQuery = <R>({ queryFn, enabled = true }: Props<R>) => {\n const [error, setError] = useState<Error | undefined>();\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<R | undefined>();\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n try {\n const response = (await queryFn()) as R;\n setData(response);\n } catch (error) {\n setError(error as Error);\n } finally {\n setLoading(false);\n }\n }, [queryFn]);\n\n useEffect(() => {\n if (enabled) {\n fetchData();\n }\n }, [fetchData, enabled]);\n\n const refetch = () => {\n fetchData();\n };\n\n return {\n error,\n data,\n loading,\n refetch,\n };\n};\n\nexport default useQuery;\n","import { useState } from \"react\";\n\ninterface Props<TArgs, TResponse> {\n queryFn: (args: TArgs) => Promise<TResponse>;\n onSuccess?: (data: TResponse) => void;\n}\n\nconst useMutation = <TArgs = void, TResponse = void>({\n queryFn,\n onSuccess,\n}: Props<TArgs, TResponse>) => {\n const [error, setError] = useState<Error | undefined>();\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<TResponse | undefined>();\n\n const mutate = async (args: TArgs) => {\n setLoading(true);\n try {\n const response = await queryFn(args);\n setData(response);\n onSuccess?.(response);\n } catch (error) {\n setError(error as Error);\n } finally {\n setLoading(false);\n }\n };\n\n return {\n error,\n data,\n loading,\n mutate,\n };\n};\n\nexport default useMutation;\n","export const ApiHelper = {\n get: async <T>(_url: string, _data?: Record<string, unknown>, _request?: RequestInit) =>\n ({}) as T,\n post: async <T>(_url: string, _data: Record<string, unknown>, _request?: RequestInit) =>\n ({}) as T,\n};\n\nexport { default as useQuery } from \"./useQuery\";\nexport { default as useMutation } from \"./useMutation\";\n","import React from \"react\";\nimport { Button } from \"@altimateai/lego\";\nimport { IconPlayerStopFilled } from \"@tabler/icons-react\";\nimport { ApiHelper } from \"../../../api/index\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { setLoadingState, updateContext } from \"../../store/chatSlice\";\nimport { LoadingState } from \"../../types\";\n\nexport const CancelGenerationButton: React.FC = () => {\n const { dispatch, abortController, currentSessionId, sessions } = useChatContext();\n\n const handleCancel = async () => {\n if (abortController) {\n abortController.abort();\n dispatch(\n setLoadingState({\n state: LoadingState.CANCELLED,\n sessionId: currentSessionId,\n })\n );\n\n // Clear uploaded_files when cancelling to ensure subsequent requests start fresh\n if (currentSessionId) {\n const currentContext = sessions[currentSessionId]?.context || {};\n dispatch(\n updateContext({\n sessionId: currentSessionId,\n context: { ...currentContext, uploaded_files: [] },\n })\n );\n }\n }\n\n // Call the cancel API with session ID\n if (currentSessionId) {\n try {\n await ApiHelper.post(\"studio/cancel\", {\n session_id: currentSessionId,\n });\n dispatch(\n setLoadingState({\n state: LoadingState.CANCELLED,\n sessionId: currentSessionId,\n })\n );\n } catch (error) {\n console.error(\"Failed to call cancel API:\", error);\n // Continue with the cancellation even if the API call fails\n }\n }\n };\n\n return (\n <Button\n variant=\"destructive\"\n size=\"icon\"\n className=\"!al-h-9 al-bg-red-100 hover:al-bg-red-200\"\n onClick={handleCancel}\n aria-label=\"Cancel generation\"\n title=\"Cancel generation\"\n >\n <IconPlayerStopFilled className=\"!al-h-6 !al-w-6 al-text-[#ef4444]\" />\n </Button>\n );\n};\n","import { Stack, LoadingButton } from \"@altimateai/lego\";\nimport { useEffect } from \"react\";\nimport { ApiHelper, useMutation } from \"../api/index\";\nimport { CoachAiResponse, TaskLabels } from \"./types\";\nimport { CoachFormValues, coachFormSchema } from \"./AddLearningForm\";\nimport { Button, Textarea } from \"@altimateai/lego\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\n\nconst CoachFormInput = ({\n taskLabel,\n onSuccess,\n onCancel,\n}: {\n taskLabel: keyof typeof TaskLabels;\n onSuccess: (data: CoachAiResponse) => void;\n onCancel: () => void;\n}) => {\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting },\n setError,\n } = useForm<CoachFormValues>({\n resolver: zodResolver(coachFormSchema),\n defaultValues: {\n content: \"\",\n },\n });\n\n const { mutate, error, loading } = useMutation<CoachFormValues, CoachAiResponse>({\n queryFn: async (values: CoachFormValues) => {\n return await ApiHelper.post<CoachAiResponse>(`coach/training`, {\n ...values,\n taskLabel,\n });\n },\n onSuccess: (data: CoachAiResponse) => {\n onSuccess(data);\n },\n });\n\n useEffect(() => {\n if (error?.message) {\n setError(\"content\", { message: error.message });\n }\n }, [error, setError]);\n\n const onSubmit = (values: CoachFormValues) => {\n mutate(values);\n };\n\n return (\n <form onSubmit={handleSubmit(onSubmit)}>\n <div className=\"al-space-y-2\">\n <Textarea {...register(\"content\")} className={errors.content ? \"al-border-red-500\" : \"\"} />\n {errors.content && (\n <p className=\"al-text-sm al-font-medium al-text-destructive\">{errors.content.message}</p>\n )}\n </div>\n <Stack justify=\"end\" className=\"mt-2\">\n <Button variant=\"outline\" onClick={onCancel} type=\"button\">\n Cancel\n </Button>\n <LoadingButton loading={loading || isSubmitting} type=\"submit\">\n Coach AI\n </LoadingButton>\n </Stack>\n </form>\n );\n};\n\nexport default CoachFormInput;\n","import { LoadingButton, Stack } from \"@altimateai/lego\";\nimport { Card, CardContent, CardFooter, Alert, Textarea } from \"@altimateai/lego\";\nimport { z } from \"zod\";\nimport { ApiHelper, useMutation } from \"../api/index\";\nimport { CoachAiConfirmationResponse, CoachAiResponse } from \"./types\";\nimport { useState } from \"react\";\nimport CoachFormInput from \"./CoachFormInput\";\nimport { CoachFormProps } from \"./CoachForm\";\nimport { Button } from \"@altimateai/lego\";\n\nexport const coachFormSchema = z.object({\n content: z\n .string()\n .min(10, { message: \"Feedback must be at least 10 characters\" })\n .max(500, { message: \"Feedback must not exceed 500 characters\" })\n .min(1, { message: \"Feedback is required\" }),\n});\n\nexport type CoachFormValues = z.infer<typeof coachFormSchema>;\n\nconst AddLearningForm = ({ taskLabel, context, onClose, extra = {} }: CoachFormProps) => {\n const [coachAiResponse, setCoachAiResponse] = useState<CoachAiResponse>();\n const [aiLearningEditable, setAiLearningEditable] = useState(false);\n\n const onSuccess = (data: CoachAiResponse) => {\n setCoachAiResponse(data);\n };\n\n const makeAiLearningEditable = () => {\n setAiLearningEditable(true);\n };\n\n const makeAiLearningNonEditable = () => {\n setAiLearningEditable(false);\n };\n\n const saveAiLearning = async (): Promise<CoachAiConfirmationResponse> => {\n if (!coachAiResponse) throw new Error(\"No AI response to save\");\n makeAiLearningNonEditable();\n return await ApiHelper.post<CoachAiConfirmationResponse>(`coach/training/confirm`, {\n content: coachAiResponse.ai_response,\n category: coachAiResponse.category,\n taskLabel: taskLabel,\n personalizationScope: coachAiResponse.personalizationScope,\n metadata: context,\n ...extra,\n });\n };\n\n const {\n mutate,\n error,\n loading: isSaving,\n data,\n } = useMutation<void, CoachAiConfirmationResponse>({\n queryFn: saveAiLearning,\n onSuccess: () => {\n setAiLearningEditable(false);\n },\n });\n\n const handleSave = () => {\n mutate();\n };\n\n if (data?.frontend_url) {\n return (\n <Alert>\n Thank you for coaching Datapilot. Click the link to{\" \"}\n <a\n className=\"al-underline al-font-medium\"\n href={`${data.frontend_url}/teammates/${taskLabel}?learning=${data.train_doc_uid}`}\n >\n View learnings\n </a>\n </Alert>\n );\n }\n\n return (\n <Stack direction=\"column\">\n <p className=\"m-0\">\n Here, you can provide instructions in natural language including your terminology, rules or\n conventions to improve the quality of responses\n </p>\n <CoachFormInput taskLabel={taskLabel} onSuccess={onSuccess} onCancel={onClose} />\n {coachAiResponse && (\n <Card className=\"mt-4\">\n <CardContent className=\"al-pt-4\">\n <p>Below are the learnings by AI based on the entered instructions:</p>\n <div>\n {aiLearningEditable ? (\n <Textarea\n value={coachAiResponse.ai_response}\n onChange={e => {\n setCoachAiResponse({\n ...coachAiResponse,\n ai_response: e.target.value,\n });\n }}\n className=\"al-min-h-[100px]\"\n />\n ) : (\n coachAiResponse.ai_response\n )}\n </div>\n {error && <div className=\"al-mt-4 al-text-destructive\">{error.message}</div>}\n </CardContent>\n <CardFooter className=\"border-0\">\n <Stack direction=\"row\" justify=\"end\" gap=\"md\">\n {!aiLearningEditable ? (\n <Button variant=\"secondary\" onClick={makeAiLearningEditable}>\n Edit\n </Button>\n ) : (\n <Button variant=\"outline\" onClick={makeAiLearningNonEditable}>\n Cancel\n </Button>\n )}\n <LoadingButton loading={isSaving} onClick={handleSave} color=\"primary\">\n Save\n </LoadingButton>\n </Stack>\n </CardFooter>\n </Card>\n )}\n </Stack>\n );\n};\n\nexport default AddLearningForm;\n","import { z } from \"zod\";\n\nexport enum ProjectGovernorCheckTypes {\n DOCUMENTATION = \"documentation\",\n TESTS = \"tests\",\n MODEL = \"model\",\n FILE_STRUCTURE = \"file_structure\",\n}\n\nexport enum ProjectGovernorAllowedFiles {\n Manifest = \"Manifest\",\n Catalog = \"Catalog\",\n}\n\nexport interface ProjectGovernorCheckFormValues {\n description: string;\n type: ProjectGovernorCheckTypes;\n}\n\nexport interface ProjectGovernorCheckValidateResponse {\n name: string;\n description: string;\n}\n\nexport interface ProjectGovernorCheckConfirmationResponse {\n ok: boolean;\n}\n\nexport const ProjectGovernorCheckSchema = z.object({\n name: z.string(),\n alias: z.string(),\n type: z.enum(Object.values(ProjectGovernorCheckTypes) as [string, ...string[]]),\n description: z.string(),\n files_required: z.array(\n z.enum(Object.values(ProjectGovernorAllowedFiles) as [string, ...string[]])\n ),\n config: z.record(z.unknown()),\n});\n\nexport interface ProjectGovernorCheck extends z.infer<typeof ProjectGovernorCheckSchema> {\n id: string;\n}\n","import { Stack, LoadingButton } from \"@altimateai/lego\";\nimport { KeyboardEvent, useEffect } from \"react\";\nimport { ApiHelper, useMutation } from \"../../api/index\";\nimport {\n ProjectGovernorCheckFormValues,\n ProjectGovernorCheckTypes,\n ProjectGovernorCheckValidateResponse,\n} from \"./types\";\nimport {\n Button,\n NativeSelect,\n Label,\n FormItem,\n FormMessage as FormFeedback,\n Textarea,\n} from \"@altimateai/lego\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\n\n// Define validation schema\nconst checkFormSchema = z.object({\n description: z.string().min(1, { message: \"Description is required\" }),\n type: z.nativeEnum(ProjectGovernorCheckTypes),\n});\n\nconst ChecksInput = ({\n onSuccess,\n onCancel,\n}: {\n onSuccess: (data: ProjectGovernorCheckValidateResponse, type: ProjectGovernorCheckTypes) => void;\n onCancel: () => void;\n}) => {\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting, isValid },\n setError,\n watch,\n setValue,\n } = useForm<ProjectGovernorCheckFormValues>({\n resolver: zodResolver(checkFormSchema),\n defaultValues: {\n description: \"\",\n type: ProjectGovernorCheckTypes.MODEL,\n },\n });\n\n const values = watch();\n\n const onSubmit = async (data: ProjectGovernorCheckFormValues) => {\n return await ApiHelper.post<ProjectGovernorCheckValidateResponse>(\n `project_governance/check/validate`,\n { ...data }\n );\n };\n\n const { error, loading } = useMutation({\n queryFn: () => onSubmit(values),\n onSuccess: (data: ProjectGovernorCheckValidateResponse) => {\n onSuccess(data, values.type);\n },\n });\n\n useEffect(() => {\n if (error?.message) {\n setError(\"description\", { message: error.message });\n }\n }, [error, setError]);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n const input = e.target as HTMLTextAreaElement;\n input.style.height = \"inherit\";\n input.style.height = `${Math.min(input.scrollHeight + 5, 200)}px`;\n };\n\n return (\n <form onSubmit={handleSubmit(data => onSubmit(data).then(res => onSuccess(res, data.type)))}>\n <FormItem className=\"al-mb-4\">\n <Textarea\n {...register(\"description\")}\n onKeyDown={handleKeyDown}\n placeholder=\"Describe the check in natural language\"\n className={\n errors.description ? \"al-border-destructive al-min-h-[100px]\" : \"al-min-h-[100px]\"\n }\n />\n {errors.description ? <FormFeedback>{errors.description.message}</FormFeedback> : null}\n </FormItem>\n <FormItem>\n <Label>Type: </Label>\n <NativeSelect\n style={{ width: 200 }}\n placeholder=\"Select type\"\n value={values.type}\n onChange={(value: string) => setValue(\"type\", value as ProjectGovernorCheckTypes)}\n options={Object.entries(ProjectGovernorCheckTypes).map(([, value]) => ({\n value: value,\n label: value,\n }))}\n />\n </FormItem>\n <Stack className=\"al-justify-end\">\n <Button variant=\"ghost\" onClick={onCancel} type=\"button\">\n Cancel\n </Button>\n <LoadingButton\n color=\"primary\"\n loading={loading || isSubmitting}\n type=\"submit\"\n disabled={!isValid || values?.description?.length === 0}\n >\n Submit\n </LoadingButton>\n </Stack>\n </form>\n );\n};\n\nexport default ChecksInput;\n","import { LoadingButton, Stack } from \"@altimateai/lego\";\nimport { Alert, Card, CardContent, CardFooter } from \"@altimateai/lego\";\nimport ChecksInput from \"./ChecksInput\";\nimport {\n ProjectGovernorCheckTypes,\n ProjectGovernorCheckValidateResponse,\n ProjectGovernorCheckConfirmationResponse,\n} from \"./types\";\nimport { useState } from \"react\";\nimport { ApiHelper, useMutation } from \"../../api/index\";\nimport { TeamMateComponentProps } from \"../types\";\nimport { Button } from \"@altimateai/lego\";\n\ninterface Props extends TeamMateComponentProps<ProjectGovernorCheckConfirmationResponse> {}\n\nconst ProjectGovernorForm = ({ onClose = () => {} }: Props) => {\n const [projectGovernorValidateResponse, setProjectGovernorValidateResponse] = useState<\n ProjectGovernorCheckValidateResponse & {\n type: ProjectGovernorCheckTypes;\n }\n >();\n\n const onSuccess = (\n data: ProjectGovernorCheckValidateResponse,\n type: ProjectGovernorCheckTypes\n ) => {\n setProjectGovernorValidateResponse({ ...data, type });\n };\n\n const {\n mutate,\n error,\n loading: isSaving,\n data,\n } = useMutation<void, ProjectGovernorCheckConfirmationResponse>({\n queryFn: () => {\n return ApiHelper.post<ProjectGovernorCheckConfirmationResponse>(`project_governance/check`, {\n ...projectGovernorValidateResponse,\n });\n },\n });\n\n if (data) {\n return (\n <Alert>\n Project governance check saved successfully{\" \"}\n <Button variant=\"secondary\" onClick={() => onClose(data)}>\n View\n </Button>\n </Alert>\n );\n }\n\n return (\n <Stack direction=\"column\">\n <p className=\"al-m-0\">\n Here, you can provide instructions in natural language to create project governance checks\n </p>\n\n <ChecksInput onSuccess={onSuccess} onCancel={onClose} />\n\n {projectGovernorValidateResponse ? (\n <Card className=\"al-mt-4\">\n <CardContent className=\"al-pt-4\">\n <p>Please validate the following check: </p>\n <p>{projectGovernorValidateResponse.name}</p>\n <p>{projectGovernorValidateResponse.description}</p>\n <p>Type: {projectGovernorValidateResponse.type}</p>\n {error && <div className=\"text-danger\">{error.message}</div>}\n </CardContent>\n <CardFooter className=\"al-mt-2 border-0\">\n <Stack justify=\"end\" className=\"al-gap-2\">\n <LoadingButton loading={isSaving} onClick={() => mutate()} color=\"primary\">\n Save\n </LoadingButton>\n </Stack>\n </CardFooter>\n </Card>\n ) : null}\n </Stack>\n );\n};\n\nexport default ProjectGovernorForm;\n","import { IconButton, LoadingButton, Popconfirm, Stack } from \"@altimateai/lego\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n FormItem,\n Input,\n Textarea,\n} from \"@altimateai/lego\";\nimport { ProjectGovernorCheck, ProjectGovernorCheckSchema } from \"./types\";\nimport { EditIcon, DeleteIcon } from \"../../../assets/icons\";\nimport { useMutation, ApiHelper } from \"../../api/index\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Button, toast } from \"@altimateai/lego\";\nimport { FormMessage as FormFeedback } from \"@altimateai/lego\";\n\ninterface Props {\n check: ProjectGovernorCheck;\n refetch: () => void;\n}\nconst ProjectGovernanceCheck = ({ check, refetch }: Props) => {\n const [isInEditMode, setIsInEditMode] = useState(false);\n const isSelected = new URLSearchParams(window.location.search).get(\"id\") === `${check.id}`;\n\n // Create a type that omits the id field for form validation\n type ProjectGovernorCheckFormData = Omit<ProjectGovernorCheck, \"id\">;\n\n const {\n register,\n handleSubmit,\n formState: { errors, isValid, isSubmitting },\n reset,\n } = useForm<ProjectGovernorCheckFormData>({\n defaultValues: check,\n resolver: zodResolver(ProjectGovernorCheckSchema),\n });\n\n const onSubmit = async (values: ProjectGovernorCheckFormData) => {\n try {\n await ApiHelper.post(`project_governance/check/${check.id}`, values, {\n method: \"PUT\",\n });\n setIsInEditMode(false);\n refetch();\n } catch (error) {\n toast({\n title: \"Failed to update project governance check\",\n description: (error as Error).message || (error as string),\n variant: \"destructive\",\n });\n }\n };\n\n const { mutate, loading: isDeleting } = useMutation({\n queryFn: (checkName: string) =>\n ApiHelper.post(\n `project_governance/check/${check.id}`,\n { data: { check_name: checkName } },\n { method: \"DELETE\" }\n ),\n onSuccess: () => {\n refetch();\n },\n });\n\n const onEditClick = () => {\n setIsInEditMode(true);\n };\n\n const onEditCancel = () => {\n setIsInEditMode(false);\n reset(check);\n };\n\n return (\n <Card className={isSelected ? \"al-border-primary\" : \"\"} style={{ borderWidth: 1 }}>\n <form onSubmit={handleSubmit(onSubmit)}>\n <CardHeader>\n <CardTitle>\n <Stack justify=\"between\">\n {isInEditMode ? (\n <FormItem>\n <Input\n {...register(\"name\")}\n placeholder=\"Project governance check name...\"\n className={errors.name ? \"al-border-destructive\" : \"\"}\n />\n {errors.name ? <FormFeedback>{errors.name.message}</FormFeedback> : null}\n </FormItem>\n ) : (\n check.name\n )}\n\n <Stack align=\"center\" gap=\"none\">\n {isInEditMode ? (\n <Stack>\n <Button onClick={onEditCancel} variant=\"outline\" size=\"sm\">\n Cancel\n </Button>\n <LoadingButton\n size=\"sm\"\n loading={isSubmitting}\n disabled={isSubmitting || !isValid}\n type=\"submit\"\n >\n Save\n </LoadingButton>\n </Stack>\n ) : (\n <>\n <IconButton variant=\"ghost\" title=\"Edit this learning\" onClick={onEditClick}>\n <EditIcon />\n </IconButton>\n\n <Popconfirm\n title=\"Delete the check\"\n description=\"Are you sure to delete this check?\"\n onConfirm={() => mutate(check.name)}\n okText=\"Yes\"\n cancelText=\"No\"\n >\n <LoadingButton\n variant=\"ghost\"\n title=\"Delete check\"\n color=\"link\"\n loading={isDeleting}\n >\n <DeleteIcon />\n </LoadingButton>\n </Popconfirm>\n </>\n )}\n </Stack>\n </Stack>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p>\n {isInEditMode ? (\n <FormItem>\n <Textarea\n {...register(\"description\")}\n placeholder=\"Describe the project governance check...\"\n className={\n errors.description\n ? \"al-border-destructive al-min-h-[100px]\"\n : \"al-min-h-[100px]\"\n }\n />\n {errors.description ? (\n <FormFeedback>{errors.description.message}</FormFeedback>\n ) : null}\n </FormItem>\n ) : (\n check.description\n )}\n </p>\n <p>Type: {check.type}</p>\n <p>Files required: {check.files_required.join(\", \")}</p>\n </CardContent>\n </form>\n </Card>\n );\n};\n\nexport default ProjectGovernanceCheck;\n","import { ApiHelper, useQuery } from \"../../api/index\";\nimport { ProjectGovernorCheck } from \"./types\";\nimport { Spinner } from \"@altimateai/lego\";\nimport { useEffect } from \"react\";\nimport ProjectGovernorForm from \"./ProjectGovernorForm\";\nimport { Stack } from \"@altimateai/lego\";\nimport ProjectGovernanceCheck from \"./ProjectGovernanceCheck\";\nimport {\n Button,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@altimateai/lego\";\nimport { Alert } from \"@altimateai/lego\";\n\nconst ProjectGovernorDisplay = () => {\n const {\n data: checks,\n error,\n loading,\n refetch,\n } = useQuery<ProjectGovernorCheck[]>({\n queryFn: () => ApiHelper.get<ProjectGovernorCheck[]>(`project_governance/checks`),\n enabled: false,\n });\n\n useEffect(() => {\n refetch();\n // avoid refetching on every render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (loading) {\n return <Spinner />;\n }\n if (error) {\n return <Alert color=\"danger\">Error loading checks: {error.message}</Alert>;\n }\n\n return (\n <>\n <div>\n <Stack className=\"al-justify-end\">\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"secondary\">+ Add new check</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Add new check</SheetTitle>\n </SheetHeader>\n <ProjectGovernorForm\n onClose={() => {\n refetch();\n }}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n <Stack direction=\"column\" className=\"al-mt-2\">\n {checks?.length ? (\n checks.map(check => {\n return <ProjectGovernanceCheck key={check.id} check={check} refetch={refetch} />;\n })\n ) : (\n <div>No checks added yet!</div>\n )}\n </Stack>\n </div>\n </>\n );\n};\n\nexport default ProjectGovernorDisplay;\n","import { ComponentType, Dispatch } from \"react\";\nimport { UnknownAction } from \"@reduxjs/toolkit\";\nimport { z } from \"zod\";\nimport { ChatbotUrls, ChatSession, ContextOption } from \"../chatbotV2\";\n\nexport interface TeamMateState {\n showCoachingForm: boolean;\n}\n\nexport interface TeamMateContextProps {\n state: TeamMateState;\n dispatch: Dispatch<UnknownAction>;\n}\n\nexport interface CoachAiResponse {\n ai_response: string;\n category: string;\n personalizationScope: string;\n}\n\nexport interface CoachAiConfirmationResponse {\n ok: boolean;\n train_doc_uid: string;\n frontend_url: string;\n}\n\nexport enum ContentCategory {\n TERM_CLARIFICATION = \"TermClarification\",\n GENERAL_GUIDELINES = \"GeneralGuidelines\",\n BUSINESS_EXPLANATION = \"BusinessExplanation\",\n}\n\nexport enum TaskLabels {\n DocGen = \"DocGen\",\n ChartBot = \"ChartBot\",\n SqlBot = \"SqlExpert\",\n OpportunitiesBot = \"OpportunitiesBot\",\n ProjectGovernor = \"ProjectGovernor\",\n TeradataToSnowflakeMigrator = \"TeradataToSnowflakeMigrator\",\n AlertManager = \"AlertManager\",\n}\n\nexport enum PersonalizationScope {\n USER_SPECIFIC = \"UserSpecific\",\n ALL_USERS = \"AllUsers\",\n}\n\nexport const learningSchema = z.object({\n train_doc_uid: z.string(),\n userId: z.string(),\n display_name: z.string(),\n taskLabel: z.string(),\n category: z.enum(Object.values(ContentCategory) as [string, ...string[]]),\n personalizationScope: z\n .enum(Object.values(PersonalizationScope) as [string, ...string[]])\n .default(PersonalizationScope.USER_SPECIFIC),\n createdDate: z.string(),\n updatedDate: z.string(),\n content: z\n .string()\n .min(10, { message: \"Learning must be at least 10 characters\" })\n .max(500, { message: \"Learning must not exceed 500 characters\" })\n .min(1, { message: \"Learning is required\" }),\n metadata: z.record(z.unknown()).optional(),\n isActive: z.boolean().default(true),\n});\n\nexport interface Learning extends z.infer<typeof learningSchema> {}\n\nexport enum TeamMateAvailability {\n EXTENSION = \"VSCode Extension\",\n SAAS = \"SaaS\",\n}\n\nexport interface TeamMateComponentProps<T = void> {\n onClose?: (data?: T) => void;\n frontendUrl?: string;\n urls?: ChatbotUrls;\n requestParams?: RequestInit;\n context?: ChatSession[\"context\"];\n contextOptions?: ContextOption[];\n}\n\nexport interface TeamMateConfig<T = unknown> {\n name: string;\n avatar: string;\n description: string;\n availability: TeamMateAvailability[];\n key: TaskLabels;\n seeInAction?: boolean;\n comingSoon?: boolean | (() => boolean);\n displayComponent?: ComponentType<TeamMateComponentProps<T>>;\n formComponent?: ComponentType<TeamMateComponentProps<T>>;\n}\n\nexport enum TeamMateActionType {\n SEE_IN_ACTION = \"SEE_IN_ACTION\",\n REQUEST_ACCESS = \"REQUEST_ACCESS\",\n VIEW_DETAILS = \"VIEW_DETAILS\",\n}\n\nexport const TeamMatesConfig: TeamMateConfig[] = [\n // ... existing code ...\n];\n\nexport interface Citation {\n id: string;\n content: string;\n taskLabel: TaskLabels;\n}\n","import {\n AgentStreamResponse,\n AgentAction,\n TodoItem,\n Artifact,\n MessageAttachment,\n SessionStatusEnum,\n} from \"../types\";\nimport { Citation } from \"../../teammate/types\";\n\nexport interface ProcessedStreamMessage {\n type: \"action\" | \"citation\" | \"final_response\" | \"error\" | \"complete\";\n data: unknown;\n citations?: Citation[];\n todos?: TodoItem[];\n artifacts?: Artifact[];\n}\n\nexport interface StreamProcessorCallbacks {\n onAction?: (action: AgentAction) => void;\n onCitation?: (citations: Citation[]) => void;\n onTodos?: (todos: TodoItem[]) => void;\n onMarkdownChunk?: (content: string) => void;\n onFinalResponse?: (response: {\n content: string;\n artifacts?: Artifact[];\n heading?: string;\n interaction?: AgentStreamResponse[\"interaction\"];\n }) => void;\n onError?: (error: string) => void;\n onComplete?: () => void;\n}\n\nexport interface StreamProcessorOptions {\n isMarkdownResponse?: boolean;\n callbacks?: StreamProcessorCallbacks;\n}\n\nexport interface ProcessedStreamResult {\n content: string;\n actions: AgentAction[];\n citations?: Citation[];\n todos?: TodoItem[];\n artifacts?: Artifact[];\n heading?: string;\n interaction?: AgentStreamResponse[\"interaction\"];\n confidence_str?: string;\n}\n\n/**\n * Processes a stream of AgentStreamResponse messages\n * @param reader - ReadableStreamDefaultReader for the response stream\n * @param options - Configuration options and callbacks\n * @returns Promise with final processed response\n */\nexport async function processAgentStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n options: StreamProcessorOptions = {}\n): Promise<ProcessedStreamResult> {\n const { isMarkdownResponse = false, callbacks } = options;\n const decoder = new TextDecoder();\n\n let actions: AgentAction[] = [];\n let citations: Citation[] | undefined = undefined;\n let todos: TodoItem[] | undefined = undefined;\n let stepHeading = \"\";\n let isReading = true;\n let markdownBuffer = \"\";\n let finalContent = \"\";\n let finalArtifacts: Artifact[] = [];\n let finalInteraction: AgentStreamResponse[\"interaction\"] | undefined;\n let finalConfidenceStr: string | undefined;\n let incompleteLineBuffer = \"\"; // Buffer for incomplete lines across chunks\n\n const addOrUpdateAction = (actionsList: AgentAction[], newAction: AgentAction): AgentAction[] => {\n const existingIndex = actionsList.findIndex(action => action.id && action.id === newAction.id);\n if (existingIndex !== -1) {\n // Update existing action\n const updated = [...actionsList];\n updated[existingIndex] = { ...updated[existingIndex], ...newAction };\n return updated;\n } else {\n // Add new action\n return [...actionsList, newAction];\n }\n };\n\n const handleJSONStr = (jsonStr: string) => {\n try {\n const msg = JSON.parse(jsonStr) as AgentStreamResponse;\n\n stepHeading = msg.heading || stepHeading;\n\n if (msg.type === \"info\" || msg.type === \"analysis\") {\n const action: AgentAction = {\n type: msg.type,\n id: msg.id,\n content: msg.content || \"\",\n timestamp: Date.now(),\n artifacts: msg.artifacts,\n };\n actions = addOrUpdateAction(actions, action);\n callbacks?.onAction?.(action);\n } else if (msg.type === \"text\") {\n // Handle text messages - add as info action\n if (msg.content) {\n const action: AgentAction = {\n type: \"info\",\n content: msg.content,\n timestamp: Date.now(),\n };\n actions = addOrUpdateAction(actions, action);\n callbacks?.onAction?.(action);\n }\n } else if (msg.type === \"tool_use\") {\n // Handle tool usage\n if (msg.tool !== \"TodoWrite\") {\n // For non-TodoWrite tools, add as info action\n const toolContent = msg.tool ? `Using tool: ${msg.tool}` : \"Tool usage\";\n const action: AgentAction = {\n type: \"info\",\n id: msg.id,\n content: toolContent,\n timestamp: Date.now(),\n };\n actions = addOrUpdateAction(actions, action);\n callbacks?.onAction?.(action);\n }\n\n // If todos are present, update the todos list\n if (msg.todos && msg.todos.length > 0) {\n todos = msg.todos;\n callbacks?.onTodos?.(msg.todos);\n }\n } else if (msg.type === \"citations\") {\n citations = msg.citations;\n callbacks?.onCitation?.(msg.citations || []);\n } else if (msg.type === \"require_user_action\") {\n finalContent = msg.content || \"\";\n finalArtifacts = msg.artifacts || [];\n finalInteraction = msg.interaction;\n } else if (msg.type === \"agent_outcome\" || msg.type === \"error\") {\n citations = msg.citations;\n finalContent = msg.content || \"\";\n finalArtifacts = msg.artifacts || [];\n\n // Only capture confidence_str from agent_outcome messages\n if (msg.type === \"agent_outcome\") {\n finalConfidenceStr = msg.confidence_str;\n }\n\n if (msg.type === \"error\") {\n callbacks?.onError?.(msg.content || \"Unknown error\");\n }\n } else if (msg.type === \"final_response\") {\n finalContent = msg.response || \"\";\n finalArtifacts = msg.artifacts || [];\n\n // Add tool usage summary if present\n if (msg.data?.tool_usage) {\n const toolSummary = `Tools used: ${msg.data.tool_usage.map(t => t.tool).join(\", \")}`;\n const summaryAction: AgentAction = {\n type: \"info\",\n content: toolSummary,\n timestamp: Date.now(),\n };\n actions = addOrUpdateAction(actions, summaryAction);\n callbacks?.onAction?.(summaryAction);\n }\n } else if (msg.type === \"complete\") {\n // Stream complete\n if (!finalContent) {\n finalContent = \"Process completed\";\n }\n callbacks?.onComplete?.();\n }\n } catch (e) {\n // Only log actual JSON parsing errors\n if (jsonStr.trim() && jsonStr.startsWith(\"{\")) {\n console.error(\"Failed to parse message:\", jsonStr, e);\n callbacks?.onError?.(`Failed to parse message: ${e}`);\n } else if (jsonStr.trim() && !jsonStr.startsWith(\"{\")) {\n // For non-JSON content (markdown/plain text), accumulate it\n markdownBuffer += jsonStr + \"\\n\";\n finalContent = markdownBuffer;\n callbacks?.onMarkdownChunk?.(markdownBuffer);\n }\n // Ignore empty lines and whitespace-only lines\n }\n };\n\n while (isReading) {\n const { done, value } = await reader.read();\n if (done) {\n isReading = false;\n // Process any remaining incomplete line buffer before breaking\n if (incompleteLineBuffer.trim() && !isMarkdownResponse) {\n const sseMatch = incompleteLineBuffer.match(/^data:\\s*(.+)$/);\n const jsonStr = sseMatch ? sseMatch[1] : incompleteLineBuffer;\n\n try {\n handleJSONStr(jsonStr);\n } catch (e) {\n if (jsonStr.trim() && !jsonStr.startsWith(\"{\")) {\n markdownBuffer += \"\\n\" + jsonStr;\n finalContent = markdownBuffer;\n callbacks?.onMarkdownChunk?.(markdownBuffer);\n }\n }\n }\n break;\n }\n\n const chunk = decoder.decode(value);\n\n if (isMarkdownResponse) {\n // For markdown responses, accumulate the text\n markdownBuffer += chunk;\n finalContent = markdownBuffer;\n\n // Call the markdown chunk callback for streaming updates\n callbacks?.onMarkdownChunk?.(markdownBuffer);\n } else {\n // Prepend any incomplete line from previous chunk\n const fullChunk = incompleteLineBuffer + chunk;\n\n // Split by newlines, but keep track of whether the chunk ended with a newline\n const lines = fullChunk.split(\"\\n\");\n\n // If the chunk didn't end with a newline, the last element is incomplete\n // Store it for the next iteration\n if (!chunk.endsWith(\"\\n\")) {\n incompleteLineBuffer = lines.pop() || \"\";\n } else {\n incompleteLineBuffer = \"\";\n }\n\n // Process only complete lines\n const completeLines = lines.filter(Boolean);\n\n for (const line of completeLines) {\n // Handle SSE format: data: {...}\n const sseMatch = line.match(/^data:\\s*(.+)$/);\n const jsonStr = sseMatch ? sseMatch[1] : line;\n\n handleJSONStr(jsonStr);\n }\n }\n }\n\n const finalResponse: ProcessedStreamResult = {\n content: finalContent || (isMarkdownResponse ? markdownBuffer : \"\"),\n actions,\n citations,\n todos,\n artifacts: finalArtifacts,\n heading: stepHeading,\n interaction: finalInteraction,\n confidence_str: finalConfidenceStr,\n };\n\n callbacks?.onFinalResponse?.({\n content: finalResponse.content,\n artifacts: finalResponse.artifacts,\n heading: finalResponse.heading,\n interaction: finalResponse.interaction,\n });\n\n return finalResponse;\n}\n\n/**\n * Converts processed stream response to AgentStreamResponse format\n */\nexport function streamResponseToAgentMessages(\n streamResponse: ProcessedStreamResult\n): AgentStreamResponse[] {\n const messages: AgentStreamResponse[] = [];\n\n // Add info actions as separate messages\n streamResponse.actions.forEach(action => {\n messages.push({\n type: action.type,\n content: action.content,\n id: action.id,\n artifacts: action.artifacts,\n });\n });\n\n // Add final agent outcome\n if (streamResponse.content) {\n messages.push({\n type: \"agent_outcome\",\n content: streamResponse.content,\n citations: streamResponse.citations,\n artifacts: streamResponse.artifacts,\n heading: streamResponse.heading,\n interaction: streamResponse.interaction,\n confidence_str: streamResponse.confidence_str,\n });\n }\n\n return messages;\n}\n\n/**\n * Processes existing conversation data (not from stream) using the same logic as processAgentStream\n * Useful for loading historical conversations or existing chat data\n */\nexport function processExistingConversation(\n conversationTurns: Array<{\n role: \"user\" | \"assistant\";\n content: AgentStreamResponse[];\n }>\n): ProcessedStreamResult[] {\n return conversationTurns.map(turn => {\n if (turn.role === \"user\") {\n // For user messages, just return the content as is\n return {\n content: turn.content.map(msg => msg.content || \"\").join(\" \"),\n actions: [],\n citations: undefined,\n todos: undefined,\n artifacts: undefined,\n heading: undefined,\n interaction: undefined,\n };\n } else {\n // For assistant messages, process like stream processor\n return processAgentMessageContent(turn.content);\n }\n });\n}\n\n/**\n * Processes a single assistant message's content using the same logic as the stream processor\n * This function is used by both processExistingConversation and can be used standalone\n */\nexport function processAgentMessageContent(content: AgentStreamResponse[]): ProcessedStreamResult {\n let actions: AgentAction[] = [];\n let citations: Citation[] | undefined = undefined;\n let todos: TodoItem[] | undefined = undefined;\n let finalContent = \"\";\n let finalArtifacts: Artifact[] = [];\n let finalHeading = \"\";\n let finalInteraction: AgentStreamResponse[\"interaction\"] | undefined;\n let finalConfidenceStr: string | undefined;\n\n content.forEach(msg => {\n if (msg.type === \"info\" || msg.type === \"analysis\") {\n actions.push({\n type: msg.type,\n id: msg.id,\n content: msg.content || \"\",\n timestamp: Date.now(),\n artifacts: msg.artifacts,\n });\n } else if (msg.type === \"text\") {\n // Handle text messages as info actions\n if (msg.content) {\n actions.push({\n type: \"info\",\n content: msg.content,\n timestamp: Date.now(),\n });\n }\n } else if (msg.type === \"tool_use\") {\n if (msg.tool !== \"TodoWrite\") {\n const toolContent = msg.tool ? `Using tool: ${msg.tool}` : \"Tool usage\";\n actions.push({\n type: \"info\",\n id: msg.id,\n content: toolContent,\n timestamp: Date.now(),\n });\n }\n if (msg.todos && msg.todos.length > 0) {\n todos = msg.todos;\n }\n } else if (msg.type === \"citations\") {\n citations = msg.citations;\n } else if (msg.type === \"require_user_action\") {\n finalContent = msg.content || \"\";\n finalArtifacts = msg.artifacts || [];\n finalInteraction = msg.interaction;\n finalHeading = msg.heading || \"\";\n } else if (msg.type === \"agent_outcome\" || msg.type === \"error\") {\n citations = msg.citations;\n finalContent = msg.content || \"\";\n finalArtifacts = msg.artifacts || [];\n finalHeading = msg.heading || \"\";\n\n // Only capture confidence_str from agent_outcome messages\n if (msg.type === \"agent_outcome\") {\n finalConfidenceStr = msg.confidence_str;\n }\n } else if (msg.type === \"final_response\") {\n finalContent = msg.response || \"\";\n finalArtifacts = msg.artifacts || [];\n finalHeading = msg.heading || \"\";\n\n // Add tool usage summary if present\n if (msg.data?.tool_usage) {\n const toolSummary = `Tools used: ${msg.data.tool_usage.map(t => t.tool).join(\", \")}`;\n actions.push({\n type: \"info\",\n content: toolSummary,\n timestamp: Date.now(),\n });\n }\n } else if (msg.type === \"complete\") {\n if (!finalContent) {\n finalContent = \"Process completed\";\n }\n }\n });\n\n return {\n content: finalContent,\n actions,\n citations,\n todos,\n artifacts: finalArtifacts,\n heading: finalHeading,\n interaction: finalInteraction,\n confidence_str: finalConfidenceStr,\n };\n}\n\n/**\n * Processes playground session turns into chat sessions format\n * This is specifically for playground usage where we need to convert session turns\n * into a format that can be consumed by the ChatProvider\n */\nexport function processPlaygroundSessionTurns(\n turns: Array<{\n role: \"user\" | \"assistant\";\n content: AgentStreamResponse[];\n id?: string;\n timestamp?: number;\n attachments?: MessageAttachment[];\n }>,\n sessionId: string,\n datamates: string[],\n context: Record<string, unknown> = {},\n status: SessionStatusEnum\n): Record<\n string,\n {\n id: string;\n messages: Array<{\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n timestamp: number;\n heading: string;\n actions?: AgentAction[];\n artifacts?: Artifact[];\n citations?: Citation[];\n todos?: TodoItem[];\n interaction?: AgentStreamResponse[\"interaction\"];\n attachments?: MessageAttachment[];\n }>;\n }\n> {\n const session: Record<\n string,\n {\n id: string;\n datamates: string[];\n context: Record<string, unknown>;\n status: SessionStatusEnum;\n messages: Array<{\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n timestamp: number;\n heading: string;\n actions?: AgentAction[];\n artifacts?: Artifact[];\n citations?: Citation[];\n todos?: TodoItem[];\n interaction?: AgentStreamResponse[\"interaction\"];\n attachments?: MessageAttachment[];\n }>;\n }\n > = {\n [sessionId.toString()]: {\n id: sessionId,\n messages: [],\n datamates,\n context,\n status,\n },\n };\n\n turns.forEach((turn, index) => {\n const messageId = turn.id || `${turn.role}-${index}`;\n const timestamp = turn.timestamp || Date.now() - (turns.length - index) * 1000;\n\n if (turn.role === \"user\") {\n // For user messages, extract text content\n const content = turn.content\n .filter(msg => msg.type === \"text\" || msg.content)\n .map(msg => msg.content || \"\")\n .join(\" \");\n\n session[sessionId].messages.push({\n id: messageId,\n role: \"user\",\n content,\n timestamp,\n heading: \"User\",\n attachments: turn.attachments || [],\n });\n } else {\n // For assistant messages, process using our common function\n const processed = processAgentMessageContent(turn.content);\n\n session[sessionId].messages.push({\n id: messageId,\n role: \"assistant\",\n content: processed.content,\n timestamp,\n heading: processed.heading || \"\",\n actions: processed.actions,\n artifacts: processed.artifacts,\n citations: processed.citations,\n todos: processed.todos,\n interaction: processed.interaction,\n attachments: turn.attachments || [],\n });\n }\n });\n\n return session;\n}\n\n/**\n * Helper function to create a fetch request and process the stream\n */\nexport async function sendMessageAndProcessStream(\n url: string,\n data: Record<string, unknown>,\n options: {\n headers?: Record<string, string>;\n signal?: AbortSignal;\n isMarkdownResponse?: boolean;\n callbacks?: StreamProcessorCallbacks;\n } = {}\n): Promise<ProcessedStreamResult> {\n const { headers = {}, signal, isMarkdownResponse, callbacks } = options;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(data),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response stream available\");\n }\n\n return processAgentStream(reader, { isMarkdownResponse, callbacks });\n}\n","/**\n * Chat Transports - Custom transport implementations for AI SDK 6\n *\n * These transports transform our backend's raw JSON format to AI SDK's UIMessageChunk format.\n *\n * - LegacyBackendTransport: For standard agent chat (JSON streaming)\n * - MarkdownStreamTransport: For Query Analysis mode (markdown streaming)\n */\n\nimport { DefaultChatTransport, type UIMessageChunk } from \"ai\";\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport type { AgentAction, Artifact, InteractionRequest, TodoItem } from \"../types\";\nimport type { Citation } from \"../../teammate\";\nimport { PromptInputMessage } from \"@altimateai/lego\";\n\n// ==========================================================================\n// ACCUMULATED STREAM DATA\n// During streaming, we extract and store rich metadata that AI SDK doesn't\n// natively support. This data is exposed through the hook for V1 compatibility.\n// ==========================================================================\n\n/**\n * Data accumulated during stream processing.\n * This captures all the rich metadata from agent_outcome and other messages.\n */\nexport interface AccumulatedStreamData {\n /** Full text content accumulated from all text deltas */\n content: string;\n /** Actions (info/analysis messages) */\n actions: AgentAction[];\n /** Artifacts from agent_outcome */\n artifacts: Artifact[];\n /** Citations from citations messages */\n citations: Citation[];\n /** Todos from tool_use (TodoWrite) messages */\n todos: TodoItem[];\n /** Interaction prompt from require_user_action */\n interaction: InteractionRequest | undefined;\n /** Heading from agent_outcome */\n heading: string;\n /** Confidence string from agent_outcome */\n confidence_str: string | undefined;\n}\n\n/**\n * Creates an empty accumulated data object\n */\nexport const createEmptyAccumulatedData = (): AccumulatedStreamData => ({\n content: \"\",\n actions: [],\n artifacts: [],\n citations: [],\n todos: [],\n interaction: undefined,\n heading: \"\",\n confidence_str: undefined,\n});\n\n/**\n * Callback type for receiving accumulated stream data.\n */\nexport type TransportDataCallback = (_data: Partial<AccumulatedStreamData>) => void;\n\n/**\n * Transport for handling markdown streams (e.g., Query Analysis mode).\n *\n * This class extends DefaultChatTransport to handle markdown streams with\n * data accumulation for V1 compatibility.\n */\nexport class MarkdownStreamTransport extends DefaultChatTransport<UIMessage> {\n private getBody: () => Record<string, unknown>;\n private apiUrl: string;\n private customHeaders: Record<string, string> | undefined;\n private onData?: TransportDataCallback;\n private currentAbortSignal?: AbortSignal;\n\n constructor(\n options: ConstructorParameters<typeof DefaultChatTransport>[0] & {\n /**\n * Callback to get fresh body data at request time.\n * This ensures session data (mode, datamates, etc.) is always current.\n */\n getBody?: () => Record<string, unknown>;\n /**\n * Callback to receive accumulated stream data directly.\n */\n onData?: TransportDataCallback;\n }\n ) {\n super(options);\n this.getBody = options?.getBody ?? (() => (options?.body as Record<string, unknown>) || {});\n this.apiUrl = options?.api || \"\";\n this.customHeaders = options?.headers as Record<string, string> | undefined;\n this.onData = options?.onData;\n }\n\n /**\n * Emit accumulated data to the registered callback.\n * Checks abort signal to prevent stale callbacks after request cancellation.\n */\n private emitData(data: Partial<AccumulatedStreamData>): void {\n // Don't emit data if request was aborted - prevents stale callbacks\n // from overwriting data after a new request has started\n if (this.currentAbortSignal?.aborted) {\n return;\n }\n\n if (this.onData) {\n this.onData(data);\n }\n }\n\n /**\n * Override sendMessages to make the fetch request and process the markdown stream.\n */\n async sendMessages({\n messages,\n abortSignal,\n }: {\n messages: UIMessage[];\n abortSignal?: AbortSignal;\n }): Promise<ReadableStream<UIMessageChunk>> {\n // Store abort signal for checking in emitData\n this.currentAbortSignal = abortSignal;\n\n const latestUserMessage = [...messages].reverse().find(m => m.role === \"user\");\n const messageText =\n latestUserMessage?.parts\n ?.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map(p => p.text)\n .join(\"\\n\") || \"\";\n\n const freshBody = this.getBody();\n const requestBody = {\n ...freshBody,\n message: messageText,\n mode: \"ask\",\n };\n\n const response = await fetch(this.apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.customHeaders,\n },\n body: JSON.stringify(requestBody),\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n\n if (!response.body) {\n throw new Error(\"No response body for markdown stream\");\n }\n\n return this.processResponseStream(response.body);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array>\n ): ReadableStream<UIMessageChunk> {\n const decoder = new TextDecoder();\n // Capture the abort signal for THIS request at the start of processing.\n // This prevents stale callbacks from emitting data after a new request has started.\n const capturedAbortSignal = this.currentAbortSignal;\n const emitDataForThisRequest = (data: Partial<AccumulatedStreamData>) => {\n // Check the CAPTURED signal, not the current one (which may have been replaced)\n if (capturedAbortSignal?.aborted) {\n return;\n }\n // Call the original emitData (which also has a check, but for belt-and-suspenders)\n this.emitData(data);\n };\n let accumulatedContent = \"\";\n const messageId = `msg-${Date.now()}`;\n let hasStarted = false;\n let hasEnded = false;\n\n return new ReadableStream<UIMessageChunk>({\n async start(controller) {\n const reader = stream.getReader();\n\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n\n if (!hasStarted && chunk.trim()) {\n controller.enqueue({\n type: \"text-start\",\n id: messageId,\n });\n hasStarted = true;\n }\n\n if (chunk) {\n accumulatedContent += chunk;\n controller.enqueue({\n type: \"text-delta\",\n delta: chunk,\n id: messageId,\n });\n emitDataForThisRequest({ content: accumulatedContent });\n }\n }\n\n if (hasStarted && !hasEnded) {\n hasEnded = true;\n\n emitDataForThisRequest({\n content: accumulatedContent,\n actions: [],\n artifacts: [],\n citations: [],\n todos: [],\n interaction: undefined,\n heading: \"\",\n confidence_str: undefined,\n });\n\n controller.enqueue({\n type: \"text-end\",\n id: messageId,\n });\n controller.enqueue({\n type: \"finish\",\n finishReason: \"stop\",\n });\n }\n\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n }\n}\n\n/**\n * Custom transport that transforms our backend's raw JSON format\n * to AI SDK's UIMessageChunk format.\n *\n * Our backend sends:\n * - `{\"type\":\"text\",\"content\":\"...\"}` → UIMessageChunk text-delta\n * - `{\"type\":\"tool_use\",\"tool\":\"...\"}` → UIMessageChunk tool-call\n * - `{\"type\":\"agent_outcome\",\"content\":\"...\"}` → UIMessageChunk text-delta + message-end\n * - `{\"type\":\"stream_complete\"}` → UIMessageChunk message-end\n *\n * IMPORTANT: Our backend expects legacy format with `message` string field,\n * not AI SDK's `messages` array format.\n */\nexport class LegacyBackendTransport extends DefaultChatTransport<UIMessage> {\n private getBody: () => Record<string, unknown>;\n private apiUrl: string;\n private customHeaders: Record<string, string> | undefined;\n private onData?: TransportDataCallback;\n private currentAbortSignal?: AbortSignal;\n\n constructor(\n options: ConstructorParameters<typeof DefaultChatTransport>[0] & {\n /**\n * Callback to get fresh body data at request time.\n * This ensures session data (mode, datamates, etc.) is always current.\n */\n getBody?: () => Record<string, unknown>;\n /**\n * Callback to receive accumulated stream data directly.\n */\n onData?: TransportDataCallback;\n }\n ) {\n super(options);\n this.getBody = options?.getBody ?? (() => (options?.body as Record<string, unknown>) || {});\n this.apiUrl = options?.api || \"\";\n this.customHeaders = options?.headers as Record<string, string> | undefined;\n this.onData = options?.onData;\n }\n\n /**\n * Emit accumulated data to the registered callback.\n * Checks abort signal to prevent stale callbacks after request cancellation.\n */\n private emitData(data: Partial<AccumulatedStreamData>): void {\n // Don't emit data if request was aborted - prevents stale callbacks\n // from overwriting data after a new request has started\n if (this.currentAbortSignal?.aborted) {\n return;\n }\n\n if (this.onData) {\n this.onData(data);\n }\n }\n\n /**\n * Override sendMessages to use legacy request body format.\n * Our backend expects: { message: string, context: {...}, session_id: string, ... }\n * Not: { messages: [{role, parts}], ... }\n */\n async sendMessages({\n messages,\n abortSignal,\n }: {\n messages: UIMessage[];\n abortSignal?: AbortSignal;\n }): Promise<ReadableStream<UIMessageChunk>> {\n // Store abort signal for checking in emitData\n this.currentAbortSignal = abortSignal;\n\n const latestUserMessage = [...messages].reverse().find(m => m.role === \"user\");\n const messageText =\n latestUserMessage?.parts\n ?.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map(p => p.text)\n .join(\"\\n\") || \"\";\n const files = latestUserMessage?.parts\n ?.filter((p): p is PromptInputMessage[\"files\"][number] => p.type === \"file\")\n .map((file: PromptInputMessage[\"files\"][number]) => {\n const base64Content = file.url?.split(\",\")[1] || \"\"; // Remove data:type;base64, prefix,\n return {\n filename: file.filename || \"\",\n content: base64Content,\n content_type: file.mediaType || \"application/octet-stream\",\n size: file.size || base64Content.length,\n };\n });\n\n const freshBody = this.getBody();\n\n const legacyRequestBody = {\n ...freshBody,\n context: {\n ...(freshBody.context as Record<string, unknown>),\n uploaded_files: files,\n },\n message: messageText,\n mode: \"ask\",\n };\n\n const response = await fetch(this.apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.customHeaders,\n },\n body: JSON.stringify(legacyRequestBody),\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n return this.processResponseStream(response.body);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array>\n ): ReadableStream<UIMessageChunk> {\n const decoder = new TextDecoder();\n // Capture the abort signal for THIS request at the start of processing.\n // This prevents stale callbacks from emitting data after a new request has started.\n const capturedAbortSignal = this.currentAbortSignal;\n const emitDataForThisRequest = (data: Partial<AccumulatedStreamData>) => {\n // Check the CAPTURED signal, not the current one (which may have been replaced)\n if (capturedAbortSignal?.aborted) {\n return;\n }\n // Call the original emitData (which also has a check, but for belt-and-suspenders)\n this.emitData(data);\n };\n let buffer = \"\";\n const messageId = `msg-${Date.now()}`;\n let hasStarted = false;\n let hasEnded = false;\n\n // Accumulated data for V1 compatibility\n let accumulatedContent = \"\";\n const accumulatedActions: AgentAction[] = [];\n const accumulatedArtifacts: Artifact[] = [];\n const accumulatedCitations: Citation[] = [];\n const accumulatedTodos: TodoItem[] = [];\n let accumulatedInteraction: InteractionRequest | undefined = undefined;\n let accumulatedHeading = \"\";\n let accumulatedConfidence: string | undefined = undefined;\n\n return new ReadableStream<UIMessageChunk>({\n async start(controller) {\n const reader = stream.getReader();\n\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const msg = JSON.parse(trimmed);\n\n if (!hasStarted) {\n controller.enqueue({\n type: \"text-start\",\n id: messageId,\n });\n hasStarted = true;\n }\n\n switch (msg.type) {\n case \"text\":\n if (msg.content) {\n const textAction: AgentAction = {\n id: msg.id || `action-${Date.now()}-${accumulatedActions.length}`,\n type: \"info\",\n content: msg.content,\n timestamp: Date.now(),\n };\n accumulatedActions.push(textAction);\n emitDataForThisRequest({\n actions: [...accumulatedActions],\n });\n }\n break;\n\n case \"info\":\n case \"analysis\":\n if (msg.content) {\n const action: AgentAction = {\n id: msg.id || `action-${Date.now()}`,\n type: msg.type as \"info\" | \"analysis\",\n content: msg.content,\n timestamp: Date.now(),\n artifacts: msg.artifacts,\n };\n accumulatedActions.push(action);\n emitDataForThisRequest({\n actions: [...accumulatedActions],\n });\n }\n break;\n\n case \"agent_outcome\":\n case \"final_response\":\n if (msg.content) {\n accumulatedContent = msg.content;\n controller.enqueue({\n type: \"text-delta\",\n delta: msg.content,\n id: messageId,\n });\n }\n\n if (msg.artifacts && Array.isArray(msg.artifacts)) {\n accumulatedArtifacts.push(...msg.artifacts);\n }\n\n if (msg.heading) {\n accumulatedHeading = msg.heading;\n }\n\n if (msg.confidence_str) {\n accumulatedConfidence = msg.confidence_str;\n }\n\n emitDataForThisRequest({\n content: accumulatedContent,\n artifacts: [...accumulatedArtifacts],\n heading: accumulatedHeading,\n confidence_str: accumulatedConfidence,\n });\n break;\n\n case \"tool_use\": {\n const toolName = msg.tool || \"unknown\";\n const toolCallId = `tool-${messageId}-${Date.now()}`;\n const toolInput = msg.todos || msg.input || {};\n\n if (toolName === \"TodoWrite\" && msg.todos && Array.isArray(msg.todos)) {\n accumulatedTodos.length = 0;\n accumulatedTodos.push(...msg.todos);\n emitDataForThisRequest({ todos: [...accumulatedTodos] });\n }\n\n controller.enqueue({\n type: \"tool-input-start\",\n toolCallId,\n toolName,\n });\n\n controller.enqueue({\n type: \"tool-input-delta\",\n toolCallId,\n inputTextDelta: JSON.stringify(toolInput),\n });\n\n controller.enqueue({\n type: \"tool-input-available\",\n toolCallId,\n toolName,\n input: toolInput,\n });\n break;\n }\n\n case \"citations\":\n if (msg.citations && Array.isArray(msg.citations)) {\n accumulatedCitations.push(...msg.citations);\n emitDataForThisRequest({\n citations: [...accumulatedCitations],\n });\n }\n break;\n\n case \"require_user_action\":\n if (msg.interaction) {\n accumulatedInteraction = msg.interaction as InteractionRequest;\n emitDataForThisRequest({\n interaction: accumulatedInteraction,\n });\n controller.enqueue({\n type: \"text-delta\",\n delta: `\\n[Interaction Required: ${msg.interaction.type}]\\n${msg.interaction.prompt}\\n`,\n id: messageId,\n });\n }\n break;\n\n case \"error\":\n controller.enqueue({\n type: \"error\",\n errorText: msg.content || msg.error || \"Unknown error\",\n });\n break;\n\n case \"complete\":\n case \"stream_complete\":\n if (!hasEnded) {\n hasEnded = true;\n\n emitDataForThisRequest({\n content: accumulatedContent,\n actions: [...accumulatedActions],\n artifacts: [...accumulatedArtifacts],\n citations: [...accumulatedCitations],\n todos: [...accumulatedTodos],\n interaction: accumulatedInteraction,\n heading: accumulatedHeading,\n confidence_str: accumulatedConfidence,\n });\n\n controller.enqueue({\n type: \"text-end\",\n id: messageId,\n });\n controller.enqueue({\n type: \"finish\",\n finishReason: \"stop\",\n });\n }\n break;\n\n default:\n // Unknown message type - ignore\n break;\n }\n } catch {\n // Not JSON - might be markdown stream, pass as text\n if (trimmed && !trimmed.startsWith(\"{\")) {\n if (!hasStarted) {\n controller.enqueue({\n type: \"text-start\",\n id: messageId,\n });\n hasStarted = true;\n }\n accumulatedContent += trimmed + \"\\n\";\n controller.enqueue({\n type: \"text-delta\",\n delta: trimmed + \"\\n\",\n id: messageId,\n });\n emitDataForThisRequest({ content: accumulatedContent });\n }\n }\n }\n }\n\n // End message if we started but didn't get explicit end\n if (hasStarted && !hasEnded) {\n hasEnded = true;\n\n emitDataForThisRequest({\n content: accumulatedContent,\n actions: [...accumulatedActions],\n artifacts: [...accumulatedArtifacts],\n citations: [...accumulatedCitations],\n todos: [...accumulatedTodos],\n interaction: accumulatedInteraction,\n heading: accumulatedHeading,\n confidence_str: accumulatedConfidence,\n });\n\n controller.enqueue({\n type: \"text-end\",\n id: messageId,\n });\n controller.enqueue({\n type: \"finish\",\n finishReason: \"stop\",\n });\n }\n\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n }\n}\n","/**\n * useAgentChat - Primary chat hook with AI SDK 6 integration\n *\n * This hook provides the main chat interface, using AI SDK 6's useChat\n * with custom transports for our backend format.\n *\n * Architecture:\n * - Uses LegacyBackendTransport for standard JSON streaming\n * - Uses MarkdownStreamTransport for Query Analysis mode\n * - Dispatches to Redux for component consumption\n * - V1 fallback for proceed endpoint (isResponseToPrompt)\n */\n\nimport { useChat, type UIMessage } from \"@ai-sdk/react\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport {\n ChatResponse,\n LoadingState,\n MessageAttachment,\n ChatMessage,\n} from \"../types\";\nimport { useChatContext } from \"../ChatProvider\";\nimport {\n setAbortController,\n clearActions,\n addAction,\n setLoadingState,\n addMessage,\n setError,\n updateContext,\n setTodos,\n clearTodos,\n} from \"../store/chatSlice\";\nimport { processAgentStream } from \"../utils/streamProcessor\";\nimport {\n AccumulatedStreamData,\n createEmptyAccumulatedData,\n LegacyBackendTransport,\n MarkdownStreamTransport,\n TransportDataCallback,\n} from \"./transports\";\nimport { ChatRequestOptions } from \"ai\";\nimport { PromptInputMessage } from \"@altimateai/lego\";\n\n// Re-export types for consumers\nexport type { UIMessage, AccumulatedStreamData };\n\n// ==========================================================================\n// HOOK RETURN TYPE\n// ==========================================================================\n\n/**\n * Return type for useAgentChat hook\n */\nexport interface UseAgentChatReturn {\n sendMessage: (params: {\n message: string;\n isResponseToPrompt?: boolean;\n context?: Record<string, unknown>;\n dontAddUserMessage?: boolean;\n files?: PromptInputMessage[\"files\"][number][];\n }) => Promise<ChatResponse>;\n updateContextAndSendMessage: (\n message: string,\n context: Record<string, unknown>,\n ) => Promise<void>;\n regenerate: (\n params?: {\n messageId?: string;\n } & ChatRequestOptions,\n ) => Promise<void>;\n loadV1Session: (v1Messages: ChatMessage[]) => void;\n getV1Messages: () => ChatMessage[];\n messages: UIMessage[];\n status: string;\n accumulatedDataRef: React.MutableRefObject<AccumulatedStreamData>;\n}\n\n// ==========================================================================\n// V1 COMPATIBILITY UTILITIES\n// Convert between AI SDK UIMessage format and V1 ChatMessage/ChatResponse\n// ==========================================================================\n\n/**\n * Extract text content from UIMessage parts array\n */\nconst extractTextFromParts = (parts: UIMessage[\"parts\"]): string => {\n return (\n parts\n ?.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\") || \"\"\n );\n};\n\n/**\n * Convert AccumulatedStreamData to V1 ChatResponse.\n */\nconst toV1ChatResponse = (accData: AccumulatedStreamData): ChatResponse => ({\n content: accData.content,\n role: \"assistant\",\n timestamp: Date.now(),\n heading: accData.heading || \"\",\n actions: accData.actions,\n artifacts: accData.artifacts,\n todos: accData.todos.length > 0 ? accData.todos : undefined,\n interaction: accData.interaction,\n});\n\n/**\n * Convert V1 ChatMessage to V2 UIMessage format.\n */\nconst fromV1ChatMessage = (message: ChatMessage): UIMessage => ({\n id: message.id,\n role: message.role,\n parts: [{ type: \"text\" as const, text: message.content }],\n});\n\n/**\n * Convert array of V1 ChatMessages to V2 UIMessages.\n */\nconst fromV1ChatMessages = (messages: ChatMessage[]): UIMessage[] => {\n return messages.map(fromV1ChatMessage);\n};\n\n/**\n * Extract AccumulatedStreamData from a V1 ChatMessage.\n */\nconst extractAccumulatedDataFromV1 = (\n message: ChatMessage,\n): AccumulatedStreamData => ({\n content: message.content,\n actions: message.actions || [],\n artifacts: message.artifacts || [],\n citations: message.citations || [],\n todos: message.todos || [],\n interaction: message.interaction,\n heading: message.heading || \"\",\n confidence_str: message.confidence_str,\n});\n\n// ==========================================================================\n// MAIN HOOK\n// ==========================================================================\n\nexport const useAgentChat = (): UseAgentChatReturn => {\n const {\n dispatch,\n currentSessionId,\n sessions,\n initialValidation,\n urls,\n requestParams,\n isMarkdownResponse,\n } = useChatContext();\n\n // ==========================================================================\n // ACCUMULATED DATA MANAGEMENT\n // ==========================================================================\n\n // Accumulated data from the current/last stream\n const accumulatedDataRef = useRef<AccumulatedStreamData>(\n createEmptyAccumulatedData(),\n );\n\n // Pending request resolution - used to await stream completion\n const pendingRequestRef = useRef<{\n resolve: (_response: ChatResponse) => void;\n reject: (_error: Error) => void;\n } | null>(null);\n\n // Track dispatched actions/todos/content to avoid duplicates during progressive updates\n const dispatchedActionsCountRef = useRef<number>(0);\n const lastDispatchedContentLengthRef = useRef<number>(0);\n // Stable message ID for the current streaming message (upsert pattern)\n const streamingMessageIdRef = useRef<string | null>(null);\n\n // Request ID tracking to prevent race conditions after cancel\n // When a request is cancelled and a new one starts, old callbacks might still arrive\n // We use this to detect and ignore stale callbacks\n const currentRequestIdRef = useRef<number>(0);\n const callbackRequestIdRef = useRef<number>(0);\n\n // Refs to avoid stale closures in the transport callback\n const dispatchRef = useRef(dispatch);\n const currentSessionIdRef = useRef(currentSessionId);\n\n // Keep refs in sync with current values\n useEffect(() => {\n dispatchRef.current = dispatch;\n currentSessionIdRef.current = currentSessionId;\n }, [dispatch, currentSessionId]);\n\n // Stable callback for transport to call directly (avoids global Map issues)\n const handleTransportData = useCallback<TransportDataCallback>(\n (data: Partial<AccumulatedStreamData>) => {\n // Guard against stale callbacks from cancelled requests\n // When a request is cancelled and a new one starts immediately, old callbacks might still arrive\n // We detect this by comparing the callback's request ID with the current active request\n if (callbackRequestIdRef.current !== currentRequestIdRef.current) {\n // This callback is from an old cancelled request, ignore it\n return;\n }\n\n // Merge new data into accumulated data\n const current = accumulatedDataRef.current;\n accumulatedDataRef.current = {\n content: data.content ?? current.content,\n actions: data.actions ?? current.actions,\n artifacts: data.artifacts ?? current.artifacts,\n citations: data.citations ?? current.citations,\n todos: data.todos ?? current.todos,\n interaction: data.interaction ?? current.interaction,\n heading: data.heading ?? current.heading,\n confidence_str: data.confidence_str ?? current.confidence_str,\n };\n\n // Progressive streaming dispatch\n const accData = accumulatedDataRef.current;\n const currentDispatch = dispatchRef.current;\n const sessionId = currentSessionIdRef.current;\n\n // Dispatch new actions that haven't been dispatched yet\n if (accData.actions.length > dispatchedActionsCountRef.current) {\n const newActions = accData.actions.slice(\n dispatchedActionsCountRef.current,\n );\n newActions.forEach((action) => {\n currentDispatch(addAction(action));\n });\n dispatchedActionsCountRef.current = accData.actions.length;\n }\n\n // Dispatch new todos that haven't been dispatched yet\n currentDispatch(setTodos(accData.todos));\n\n // Progressive content streaming\n if (\n accData.content.length > lastDispatchedContentLengthRef.current &&\n sessionId &&\n streamingMessageIdRef.current\n ) {\n const contentLenDiff =\n accData.content.length - lastDispatchedContentLengthRef.current;\n // Throttle updates: only dispatch if content grew by at least 50 chars\n if (contentLenDiff >= 50 || accData.content.length < 50) {\n currentDispatch(\n addMessage({\n sessionId,\n id: streamingMessageIdRef.current,\n content: accData.content,\n role: \"assistant\",\n timestamp: Date.now(),\n heading: accData.heading || \"\",\n actions: accData.actions || [],\n artifacts: accData.artifacts || [],\n citations: accData.citations || [],\n todos: accData.todos || [],\n interaction: accData.interaction,\n confidence_str: accData.confidence_str,\n }),\n );\n lastDispatchedContentLengthRef.current = accData.content.length;\n }\n }\n },\n [],\n ); // Empty deps - uses refs for all changing values\n\n // ==========================================================================\n // TRANSPORT SETUP\n // ==========================================================================\n\n const currentSession = sessions[currentSessionId || \"\"];\n const currentContext = currentSession?.context || {};\n const apiUrl = `${urls?.origin || \"\"}${urls?.askPath || \"/agent/ask\"}`;\n\n const headersRecord = useMemo((): Record<string, string> | undefined => {\n if (!requestParams?.headers) return undefined;\n if (requestParams.headers instanceof Headers) {\n return Object.fromEntries(requestParams.headers.entries());\n }\n if (Array.isArray(requestParams.headers)) {\n return Object.fromEntries(requestParams.headers);\n }\n return requestParams.headers as Record<string, string>;\n }, [requestParams?.headers]);\n\n // Fresh session data pattern - store in ref so transport can access current values\n // Updated synchronously during render (before any effects) to ensure getBody always has latest data\n const sessionDataRef = useRef({\n context: currentContext,\n session_id: currentSessionId,\n model_type: currentSession?.selectedModel,\n mode: \"ask\",\n datamates: currentSession?.datamates,\n });\n\n // Update ref synchronously during render - this ensures getBody() always reads the latest data\n // even if called immediately after a re-render (before effects run)\n sessionDataRef.current = {\n context: currentSession?.context || {},\n session_id: currentSessionId,\n model_type: currentSession?.selectedModel,\n mode: \"ask\",\n datamates: currentSession?.datamates,\n };\n\n const getBody = useCallback((): Record<string, unknown> => {\n const body = { ...sessionDataRef.current };\n // Filter out null/undefined model_type to maintain backwards compatibility\n if (body.model_type === null || body.model_type === undefined) {\n delete body.model_type;\n }\n return body;\n }, []);\n\n const transport = useMemo(() => {\n return isMarkdownResponse\n ? new MarkdownStreamTransport({\n api: apiUrl,\n headers: headersRecord,\n getBody,\n onData: handleTransportData,\n })\n : new LegacyBackendTransport({\n api: apiUrl,\n headers: headersRecord,\n getBody,\n onData: handleTransportData,\n });\n }, [apiUrl, isMarkdownResponse, headersRecord, getBody, handleTransportData]);\n\n // ==========================================================================\n // AI SDK useChat INTEGRATION\n // ==========================================================================\n\n const {\n messages,\n setMessages,\n sendMessage: sdkSendMessage,\n status,\n stop: sdkStop,\n regenerate: sdkRegenerate,\n } = useChat({\n messages: fromV1ChatMessages(currentSession?.messages || []),\n id: currentSessionId || undefined,\n transport,\n onFinish: () => {\n // Resolve pending request with V1-compatible ChatResponse\n if (pendingRequestRef.current) {\n const response = toV1ChatResponse(accumulatedDataRef.current);\n pendingRequestRef.current.resolve(response);\n pendingRequestRef.current = null;\n }\n },\n onError: (err) => {\n // Don't reject for AbortError - the error will propagate through sdkSendMessage throw\n // This prevents race conditions where a newer request has started and\n // overwritten pendingRequestRef before this (old) request's onError is called\n const isAbortError = err instanceof Error && err.name === \"AbortError\";\n if (isAbortError) {\n return;\n }\n if (pendingRequestRef.current) {\n pendingRequestRef.current.reject(\n err instanceof Error ? err : new Error(String(err)),\n );\n pendingRequestRef.current = null;\n }\n },\n });\n\n // Track LATEST messages for synchronous access (fixes stale closure issue)\n const latestMessagesRef = useRef<UIMessage[]>([]);\n\n useEffect(() => {\n latestMessagesRef.current = [...messages];\n }, [messages]);\n\n // ==========================================================================\n // HELPER FUNCTIONS\n // ==========================================================================\n\n const createAttachmentsFromContext = (\n files: PromptInputMessage[\"files\"][number][],\n ): MessageAttachment[] => {\n const attachmentsData: MessageAttachment[] = [];\n\n if (files.length > 0) {\n files.forEach(\n (file: PromptInputMessage[\"files\"][number], index: number) => {\n attachmentsData.push({\n id: `temp-${Date.now()}-${index}`,\n attachment_name: file.filename || \"unnamed\",\n file_type: file.mediaType || null,\n s3_url: null,\n extracted_content: null,\n order: index,\n attachment_type: \"file\",\n attachment_reference_id: null,\n file_size: file.size || null,\n created_on: new Date().toISOString(),\n });\n },\n );\n }\n\n return attachmentsData;\n };\n\n // ==========================================================================\n // V1 COMPATIBILITY API\n // ==========================================================================\n\n /**\n * Load an existing V1 session.\n */\n const loadV1Session = useCallback(\n (v1Messages: ChatMessage[]) => {\n const uiMessages = fromV1ChatMessages(v1Messages);\n setMessages(uiMessages);\n\n const lastAssistant = [...v1Messages]\n .reverse()\n .find((m) => m.role === \"assistant\");\n if (lastAssistant) {\n accumulatedDataRef.current =\n extractAccumulatedDataFromV1(lastAssistant);\n } else {\n accumulatedDataRef.current = createEmptyAccumulatedData();\n }\n },\n [setMessages],\n );\n\n /**\n * Get all messages in V1 ChatMessage format.\n */\n const getV1Messages = useCallback((): ChatMessage[] => {\n return messages.map((msg, index) => {\n const isLastAssistant =\n msg.role === \"assistant\" && index === messages.length - 1;\n const accData = isLastAssistant\n ? accumulatedDataRef.current\n : createEmptyAccumulatedData();\n\n return {\n id: msg.id,\n content: accData.content || extractTextFromParts(msg.parts),\n role: msg.role as \"user\" | \"assistant\",\n timestamp: Date.now(),\n heading: accData.heading || \"\",\n actions: accData.actions,\n artifacts: accData.artifacts,\n citations: accData.citations.length > 0 ? accData.citations : undefined,\n todos: accData.todos.length > 0 ? accData.todos : undefined,\n interaction: accData.interaction,\n confidence_str: accData.confidence_str,\n };\n });\n }, [messages]);\n\n // ==========================================================================\n // MAIN SEND MESSAGE FUNCTION\n // ==========================================================================\n\n const updateContextAndSendMessage = async (\n message: string,\n context: Record<string, unknown>,\n ) => {\n dispatch(\n updateContext({\n sessionId: currentSessionId!,\n context,\n }),\n );\n await sendMessage({\n message,\n context,\n });\n };\n\n const sendMessage = async ({\n message,\n isResponseToPrompt = false,\n context: newContext,\n dontAddUserMessage = false,\n files = [],\n }: {\n message: string;\n isResponseToPrompt?: boolean;\n context?: Record<string, unknown>;\n dontAddUserMessage?: boolean;\n files?: PromptInputMessage[\"files\"][number][];\n }): Promise<ChatResponse> => {\n if (!currentSessionId) {\n throw new Error(\"No active session\");\n }\n\n const context = {\n ...(sessions[currentSessionId]?.context || {}),\n ...newContext,\n };\n\n // Add user message with attachments\n if (!dontAddUserMessage) {\n const attachments = createAttachmentsFromContext(files);\n dispatch(\n addMessage({\n sessionId: currentSessionId,\n id: Date.now().toString(),\n content: message,\n role: \"user\",\n timestamp: Date.now(),\n heading: \"\",\n attachments: attachments.length > 0 ? attachments : undefined,\n }),\n );\n }\n\n // Create new AbortController and clear previous actions and todos\n const abortController = new AbortController();\n\n // Connect our abort controller to the AI SDK's stop function\n // When CancelGenerationButton aborts our controller, this will also stop the SDK request\n const handleAbort = () => {\n sdkStop();\n };\n abortController.signal.addEventListener(\"abort\", handleAbort);\n\n dispatch(\n setLoadingState({\n state: LoadingState.LOADING,\n sessionId: currentSessionId,\n }),\n );\n dispatch(setAbortController(abortController));\n dispatch(clearActions());\n dispatch(clearTodos());\n\n // Reset progressive dispatch counters for new message\n dispatchedActionsCountRef.current = 0;\n lastDispatchedContentLengthRef.current = 0;\n streamingMessageIdRef.current = (Date.now() + 1).toString();\n\n // Increment request ID to invalidate any pending callbacks from previous requests\n // This must happen BEFORE resetting accumulated data so stale callbacks are ignored\n currentRequestIdRef.current++;\n callbackRequestIdRef.current = currentRequestIdRef.current;\n\n // Reset accumulated data for new request\n accumulatedDataRef.current = createEmptyAccumulatedData();\n\n let hasError = false;\n try {\n await initialValidation?.({ context });\n\n // PRIMARY PATH: AI SDK 6 (for normal requests)\n if (!isResponseToPrompt) {\n // Create a promise that resolves when onFinish is called\n const responsePromise = new Promise<ChatResponse>((resolve, reject) => {\n pendingRequestRef.current = { resolve, reject };\n });\n\n // Send via AI SDK\n if (files.length) {\n await sdkSendMessage({\n text: message,\n files,\n });\n } else {\n await sdkSendMessage({\n role: \"user\",\n parts: [{ type: \"text\", text: message }],\n });\n }\n\n // Wait for stream completion\n const v2Response = await responsePromise;\n\n // Dispatch final message to Redux\n const accData = accumulatedDataRef.current;\n const finalId =\n streamingMessageIdRef.current || (Date.now() + 1).toString();\n dispatch(\n addMessage({\n sessionId: currentSessionId,\n id: finalId,\n content: v2Response.content,\n role: \"assistant\",\n timestamp: Date.now(),\n interaction: v2Response.interaction,\n heading: v2Response.heading,\n actions: v2Response.actions,\n artifacts: v2Response.artifacts,\n citations: accData?.citations,\n todos: v2Response.todos,\n confidence_str: accData?.confidence_str,\n }),\n );\n streamingMessageIdRef.current = null;\n\n return v2Response;\n }\n\n // ==========================================================================\n // FALLBACK: V1 for proceed endpoint (isResponseToPrompt)\n // ==========================================================================\n\n const data = {\n values: message,\n session_id: currentSessionId,\n };\n\n const url = urls?.origin || \"https://api.getaltimate.com\";\n const response = await fetch(\n `${url}${urls?.proceedPath || \"/agent/proceed\"}`,\n {\n ...requestParams,\n method: \"POST\",\n headers: {\n ...requestParams?.headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n signal: abortController.signal,\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response stream available\");\n }\n\n const id = (Date.now() + 1).toString();\n let isAlreadyStreamed = false;\n\n const streamResult = await processAgentStream(reader, {\n isMarkdownResponse,\n callbacks: {\n onAction: (action) => {\n dispatch(addAction(action));\n },\n onCitation: () => {\n // Citations handled in onFinalResponse\n },\n onTodos: (todos) => {\n dispatch(setTodos(todos));\n },\n onMarkdownChunk: (content: string) => {\n isAlreadyStreamed = true;\n dispatch(\n addMessage({\n sessionId: currentSessionId,\n id,\n content,\n role: \"assistant\",\n timestamp: Date.now(),\n heading: \"Markdown Response\",\n actions: [],\n artifacts: [],\n citations: undefined,\n todos: undefined,\n }),\n );\n },\n onError: (error) => {\n console.error(\"Stream processing error:\", error);\n },\n onComplete: () => {\n // Stream processing complete\n },\n },\n });\n\n const finalResponse: ChatResponse = {\n content: streamResult.content,\n role: \"assistant\",\n timestamp: Date.now(),\n actions: streamResult.actions,\n artifacts: streamResult.artifacts || [],\n heading:\n streamResult.heading ||\n (isMarkdownResponse ? \"Markdown Response\" : \"\"),\n interaction: streamResult.interaction,\n todos: streamResult.todos,\n };\n\n if (!isAlreadyStreamed) {\n const finalId = (Date.now() + 1).toString();\n dispatch(\n addMessage({\n sessionId: currentSessionId,\n id: finalId,\n content: finalResponse.content,\n role: \"assistant\",\n timestamp: Date.now(),\n interaction: finalResponse.interaction,\n heading: finalResponse.heading,\n actions: finalResponse.actions,\n artifacts: finalResponse.artifacts,\n citations: streamResult.citations,\n todos: finalResponse.todos,\n confidence_str: streamResult.confidence_str,\n }),\n );\n }\n\n return finalResponse;\n } catch (error) {\n const isAbortError =\n error instanceof Error && error.name === \"AbortError\";\n hasError = true;\n\n if (!isAbortError) {\n // Handle non-abort errors gracefully - show error in UI via setError\n // RefetchSession component will display the error message\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n dispatch(setError(errorMessage));\n // Don't rethrow - error is handled and shown in UI\n // Return undefined to signal no response (but not an unhandled error)\n return undefined as unknown as ChatResponse;\n }\n throw error;\n } finally {\n // Clean up abort event listener\n abortController.signal.removeEventListener(\"abort\", handleAbort);\n\n if (!abortController.signal.aborted) {\n dispatch(setAbortController(null));\n dispatch(\n setLoadingState({\n state: hasError ? LoadingState.ERROR : LoadingState.LOADED,\n sessionId: currentSessionId,\n }),\n );\n }\n\n // Clear uploaded_files from context after request completes (success, error, or cancel)\n // This must happen AFTER the request so the transport doesn't read the cleared value\n if (!dontAddUserMessage) {\n dispatch(\n updateContext({\n sessionId: currentSessionId,\n context: { ...context, uploaded_files: [] },\n }),\n );\n }\n }\n };\n\n return {\n sendMessage,\n updateContextAndSendMessage,\n regenerate: sdkRegenerate,\n // V1 compatibility\n loadV1Session,\n getV1Messages,\n // AI SDK state (for advanced use cases)\n messages,\n status,\n accumulatedDataRef,\n };\n};\n","import { Button, Card, Textarea } from \"@altimateai/lego\";\nimport { useChatContext } from \"../../chatbotV2/ChatProvider\";\nimport { useAgentChat } from \"../../chatbotV2/hooks/useAgentChat\";\nimport { useState } from \"react\";\nimport { addMessage } from \"../../chatbotV2/store/chatSlice\";\n\nconst HelloMessage = () => {\n const { sessions, currentSessionId, dispatch } = useChatContext();\n const { updateContextAndSendMessage } = useAgentChat();\n const [textValue, setTextValue] = useState(\"\");\n const handleSubmit = async () => {\n dispatch(\n addMessage({\n sessionId: currentSessionId!,\n id: Date.now().toString(),\n content: `##### Migrating your query:\\n\\`\\`\\`\\n${textValue}\\n\\`\\`\\``,\n role: \"user\",\n timestamp: Date.now(),\n heading: \"\",\n })\n );\n await updateContextAndSendMessage(\"Migrate the query\", {\n query: textValue,\n });\n };\n\n const context = currentSessionId ? sessions[currentSessionId]?.context : {};\n\n return (\n <div>\n Hello, I am your Teradata to Snowflake migration assistant.\n {!context?.query ? (\n <Card className=\"al-bg-muted al-p-4 al-rounded-md al-shadow-md al-space-y-2 al-mt-2\">\n <p>\n Please enter a query below or select a file using Add Context button to start the\n migration.\n </p>\n <Textarea\n value={textValue}\n onChange={e => setTextValue(e.target.value)}\n placeholder=\"Please enter a query\"\n required={true}\n />\n <Button onClick={handleSubmit}>Submit</Button>\n </Card>\n ) : null}\n </div>\n );\n};\n\nexport default HelloMessage;\n","import { Card, Button, Typography } from \"@altimateai/lego\";\nimport {\n ArrowRightIcon,\n DatabaseIcon,\n GitMergeIcon,\n CodeIcon,\n ArrowLeftIcon,\n} from \"../../../assets/icons\";\nimport { useState } from \"react\";\nimport { ChatProvider, ChatSession } from \"../../chatbotV2/components\";\nimport { TaskLabels, TeamMateComponentProps } from \"../types\";\nimport HelloMessage from \"./HelloMessage\";\nimport { Stack } from \"@altimateai/lego\";\n\nconst TeradataToSnowflakeMigratorDisplay = ({\n urls,\n}: TeamMateComponentProps) => {\n const [isStarted, setIsStarted] = useState(false);\n\n const handleStart = () => {\n setIsStarted(true);\n };\n\n const handleBack = () => {\n setIsStarted(false);\n };\n\n const validateRequest = async (data: { context: ChatSession[\"context\"] }) => {\n if (!data.context?.query) {\n throw new Error(\"Missing query\");\n }\n };\n\n return (\n <div className=\"al-relative al-overflow-hidden\">\n {/* Wrapper for sliding animation */}\n <Stack\n className={`al-transition-transform al-duration-500 al-ease-in-out ${\n isStarted ? \"al--translate-x-full\" : \"al-translate-x-0\"\n }`}\n >\n {/* Landing Content */}\n <div className=\"al-w-full al-flex-shrink-0\">\n <div className=\"al-px-2 al-py-2 al-max-w-4xl\">\n {/* Hero Section */}\n <Card className=\"al-mb-12 al-overflow-hidden al-relative al-bg-gradient-to-r al-from-primary/10 al-to-primary/5\">\n <Stack\n direction=\"column\"\n className=\"md:al-flex-row al-items-center al-gap-8 al-p-8\"\n >\n {/* AI Agent Visual */}\n <div className=\"al-w-48 al-h-48 al-relative\">\n <div className=\"al-absolute al-inset-0 al-bg-primary/20 al-rounded-full al-animate-pulse\"></div>\n <div className=\"al-absolute al-inset-4 al-bg-primary/30 al-rounded-full al-animate-pulse [animation-delay:0.2s]\"></div>\n <div className=\"al-absolute al-inset-8 al-bg-primary/40 al-rounded-full al-animate-pulse [animation-delay:0.4s]\"></div>\n <Stack className=\"al-absolute al-inset-12 al-bg-primary al-rounded-full al-items-center al-justify-center\">\n <span className=\"al-text-white al-text-4xl\">🤖</span>\n </Stack>\n </div>\n\n {/* Content */}\n <div className=\"al-flex-1 al-text-left\">\n <Typography variant=\"h4\" className=\"al-mb-4\">\n Your AI Migration Companion\n </Typography>\n <p className=\"al-text-lg al-text-muted-foreground al-mb-6\">\n Let me guide you through a seamless Teradata to Snowflake\n transformation. Intelligent, efficient, and error-free\n migrations await.\n </p>\n <Button\n size=\"lg\"\n className=\"al-gap-2 al-bg-primary/90 hover:al-bg-primary\"\n onClick={handleStart}\n >\n Start Migration <ArrowRightIcon className=\"al-h-4 al-w-4\" />\n </Button>\n </div>\n </Stack>\n </Card>\n\n {/* Features Timeline */}\n <div className=\"al-relative al-mb-12\">\n {/* Connection Line */}\n <div className=\"al-absolute al-left-1/2 al-top-0 al-bottom-0 al-w-0.5 al-bg-primary/20 al-transform al-translate-x-[-50%]\"></div>\n\n {/* Feature Steps */}\n <div className=\"al-space-y-12\">\n {/* Schema Migration Step */}\n <Stack align=\"center\" className=\"al-gap-8\">\n <div className=\"al-flex-1 al-text-right\">\n <Card className=\"al-inline-block al-p-4\">\n <h3 className=\"al-text-xl al-font-semibold al-mb-2\">\n <Stack align=\"center\" className=\"al-gap-2\">\n <span>\n <DatabaseIcon className=\"al-h-6 al-w-6 al-text-primary\" />\n Schema Migration\n </span>\n </Stack>\n </h3>\n <p className=\"al-text-muted-foreground al-m-0\">\n Automatically convert Teradata schemas to\n Snowflake-compatible formats while preserving data\n structures\n </p>\n </Card>\n </div>\n <Stack className=\"al-w-12 al-h-12 al-rounded-full al-bg-primary al-items-center al-justify-center al-relative al-z-10\">\n <span className=\"al-text-white\">1</span>\n </Stack>\n <div className=\"al-flex-1\"></div>\n </Stack>\n\n {/* Data Transfer Step */}\n <Stack align=\"center\" className=\"al-gap-8\">\n <div className=\"al-flex-1\"></div>\n <Stack className=\"al-w-12 al-h-12 al-rounded-full al-bg-primary al-items-center al-justify-center al-relative al-z-10\">\n <span className=\"al-text-white\">2</span>\n </Stack>\n <div className=\"al-flex-1\">\n <Card className=\"al-inline-block al-p-4\">\n <h3 className=\"al-text-xl al-font-semibold al-mb-2\">\n <Stack align=\"center\" className=\"al-gap-2\">\n <span>\n <GitMergeIcon className=\"al-h-6 al-w-6 al-text-primary\" />\n Data Transfer\n </span>\n </Stack>\n </h3>\n <p className=\"al-text-muted-foreground al-m-0\">\n Secure and efficient data migration with progress\n tracking and validation\n </p>\n </Card>\n </div>\n </Stack>\n\n {/* Query Conversion Step */}\n <Stack align=\"center\" className=\"al-gap-8\">\n <div className=\"al-flex-1 al-text-right\">\n <Card className=\"al-inline-block al-p-4\">\n <h3 className=\"al-text-xl al-font-semibold al-mb-2\">\n <Stack align=\"center\" className=\"al-gap-2\">\n <span>\n <CodeIcon className=\"al-h-6 al-w-6 al-text-primary\" />\n Query Conversion\n </span>\n </Stack>\n </h3>\n <p className=\"al-text-muted-foreground al-m-0\">\n Transform Teradata SQL queries to Snowflake syntax with\n intelligent optimization\n </p>\n </Card>\n </div>\n <Stack className=\"al-w-12 al-h-12 al-rounded-full al-bg-primary al-items-center al-justify-center al-relative al-z-10\">\n <span className=\"al-text-white\">3</span>\n </Stack>\n <div className=\"al-flex-1\"></div>\n </Stack>\n </div>\n </div>\n\n {/* Benefits Section */}\n <Card className=\"al-p-6 al-mb-12 al-bg-gradient-to-b al-from-primary/5\">\n <Typography variant=\"h4\" className=\"al-mb-6 al-text-center\">\n AI-Powered Advantages\n </Typography>\n <div className=\"al-grid al-grid-cols-2 al-gap-6\">\n <Stack align=\"start\" className=\"al-gap-3\">\n <Stack className=\"al-h-8 al-w-8 al-items-center al-justify-center al-bg-primary/10 al-rounded-lg\">\n ✨\n </Stack>\n <div>\n <h4 className=\"al-font-semibold al-mb-1\">\n Smart Conversion\n </h4>\n <p className=\"al-text-sm al-text-muted-foreground\">\n AI-powered conversion ensures accurate and optimized\n migrations\n </p>\n </div>\n </Stack>\n <Stack align=\"start\" className=\"al-gap-3\">\n <Stack className=\"al-h-8 al-w-8 al-items-center al-justify-center al-bg-primary/10 al-rounded-lg\">\n 🚀\n </Stack>\n <div>\n <h4 className=\"al-font-semibold al-mb-1\">Lightning Fast</h4>\n <p className=\"al-text-sm al-text-muted-foreground\">\n Significantly reduce migration time and effort\n </p>\n </div>\n </Stack>\n <Stack align=\"start\" className=\"al-gap-3\">\n <Stack className=\"al-h-8 al-w-8 al-items-center al-justify-center al-bg-primary/10 al-rounded-lg\">\n 🛡️\n </Stack>\n <div>\n <h4 className=\"al-font-semibold al-mb-1\">\n Reliable & Secure\n </h4>\n <p className=\"al-text-sm al-text-muted-foreground\">\n Built-in validation and error handling for reliable\n migrations\n </p>\n </div>\n </Stack>\n <Stack align=\"start\" className=\"al-gap-3\">\n <Stack className=\"al-h-8 al-w-8 al-items-center al-justify-center al-bg-primary/10 al-rounded-lg\">\n 📊\n </Stack>\n <div>\n <h4 className=\"al-font-semibold al-mb-1\">\n Full Visibility\n </h4>\n <p className=\"al-text-sm al-text-muted-foreground\">\n Detailed reporting and progress tracking throughout the\n process\n </p>\n </div>\n </Stack>\n </div>\n </Card>\n\n {/* CTA Section */}\n <Card className=\"al-text-center al-p-8 al-bg-primary/5\">\n <Typography variant=\"h4\" className=\"al-mb-4\">\n Ready to Transform Your Database?\n </Typography>\n <p className=\"al-text-muted-foreground al-mb-6\">\n Start your intelligent migration journey today\n </p>\n <Button size=\"lg\" className=\"al-gap-2\" onClick={handleStart}>\n Begin Migration <ArrowRightIcon className=\"al-h-4 al-w-4\" />\n </Button>\n </Card>\n </div>\n </div>\n\n {/* Migration Interface */}\n <div className=\"al-w-full al-flex-shrink-0\">\n <div className=\"al-h-full al-w-full\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={handleBack}\n className=\"al-h-8 al-w-8 al-ml-4\"\n >\n <ArrowLeftIcon className=\"al-h-4 al-w-4\" />\n Back\n </Button>\n <ChatProvider\n initialValidation={validateRequest}\n taskLabel={TaskLabels.TeradataToSnowflakeMigrator}\n helloMessage={<HelloMessage />}\n fileUploadProps={{\n allowedFiles: \".sql\",\n contextFieldKey: \"query\",\n }}\n urls={urls}\n />\n </div>\n </div>\n </Stack>\n </div>\n );\n};\n\nexport default TeradataToSnowflakeMigratorDisplay;\n","import { ChatProvider, ChatSession } from \"../../chatbotV2\";\nimport { TaskLabels, TeamMateComponentProps } from \"../types\";\n\nconst AlertManagerDisplay = ({\n urls,\n requestParams,\n context,\n contextOptions,\n}: TeamMateComponentProps) => {\n const validateRequest = async (data: { context: ChatSession[\"context\"] }) => {\n console.log(data);\n };\n return (\n <div className=\"al-w-full al-flex-shrink-0\">\n <div className=\"al-h-full al-w-full\">\n <ChatProvider\n initialValidation={validateRequest}\n taskLabel={TaskLabels.AlertManager}\n urls={urls}\n helloMessage={\n <div>\n {\n \"I'm your AI teammate, here to create alerts for you. Tell me what do you want to set alert for?\"\n }\n </div>\n }\n fileUploadProps={{\n allowedFiles: \".sql\",\n contextFieldKey: \"query\",\n }}\n requestParams={requestParams}\n context={context}\n contextOptions={contextOptions}\n placeholder=\"Alert me when warehouse COMPUTE_WH incurs more than $1000 in the last 7 days\"\n />\n </div>\n </div>\n );\n};\n\nexport default AlertManagerDisplay;\n","import { BotIcon } from \"./assets\";\nimport ProjectGovernorDisplay from \"./projectGovernor/ProjectGovernorDisplay\";\nimport ProjectGovernorForm from \"./projectGovernor/ProjectGovernorForm\";\nimport TeradataToSnowflakeMigratorDisplay from \"./teradata/MigratorDisplay\";\nimport { TaskLabels, TeamMateAvailability, TeamMateConfig } from \"./types\";\nimport AlertManagerDisplay from \"./alertManager/AlertManagerDisplay\";\n\nexport const TeamMatesConfig: TeamMateConfig[] = [\n {\n name: \"Write Documents\",\n avatar: BotIcon,\n description:\n \"Coach AI to write your dbt model, table and column descriptions for you, like you!\",\n availability: [TeamMateAvailability.EXTENSION],\n key: TaskLabels.DocGen,\n },\n {\n name: \"Chart Analyzer\",\n avatar: BotIcon,\n description: \"Coach AI to analyze charts, find insights and answer your specific questions\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.ChartBot,\n seeInAction: false,\n },\n {\n name: \"Translate SQL dialects\",\n avatar: BotIcon,\n description: \"Coach AI to translate or explain SQL queries in other dialects\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.SqlBot,\n },\n {\n name: \"Govern dbt Projects\",\n avatar: BotIcon,\n description: \"Coach AI to help you create checks or rules for project governance config\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.ProjectGovernor,\n displayComponent: ProjectGovernorDisplay,\n formComponent: ProjectGovernorForm,\n },\n {\n name: \"Save Snowflake Costs\",\n avatar: BotIcon,\n description: \"Coach AI to analyze your spends, costs and find opportunities to save money\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.OpportunitiesBot,\n comingSoon: true,\n },\n {\n name: \"Migrate Teradata to Snowflake\",\n avatar: BotIcon,\n description: \"Coach AI to streamline your database migration journey\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.TeradataToSnowflakeMigrator,\n displayComponent: TeradataToSnowflakeMigratorDisplay,\n comingSoon: () => new URLSearchParams(window.location.search).get(\"tsm\") !== \"1\",\n },\n {\n name: \"Setup Alerts\",\n avatar: BotIcon,\n description: \"Coach AI to manage your alerts and notifications\",\n availability: [TeamMateAvailability.SAAS],\n key: TaskLabels.AlertManager,\n displayComponent: AlertManagerDisplay,\n comingSoon: false,\n },\n];\n","import React from \"react\";\nimport AddLearningForm from \"./AddLearningForm\";\nimport { TeamMatesConfig } from \"./teamMatesConfig\";\nimport { TaskLabels } from \"./types\";\n\nexport interface CoachFormProps {\n taskLabel: keyof typeof TaskLabels;\n context?: Record<string, unknown>;\n extra?: Record<string, unknown>;\n onClose: (data?: unknown) => void;\n}\n\nconst CoachForm = (props: CoachFormProps) => {\n const teammate = TeamMatesConfig.find(t => t.key === props.taskLabel);\n if (teammate?.formComponent) {\n // Handle ESM/CJS interop - component might be wrapped in { default: Component }\n const FormComponent =\n typeof teammate.formComponent === \"function\"\n ? teammate.formComponent\n : (teammate.formComponent as { default: React.ComponentType<CoachFormProps> }).default;\n\n if (FormComponent) {\n return <FormComponent {...props} />;\n }\n }\n\n return <AddLearningForm {...props} />;\n};\n\nexport default CoachForm;\n","import { Button } from \"@altimateai/lego\";\nimport { useState } from \"react\";\nimport CoachForm from \"../../../teammate/CoachForm\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { ThinkingIcon } from \"../../../../assets/icons\";\n\nexport const CoachAI = () => {\n const { taskLabel } = useChatContext();\n const [showCoachForm, setShowCoachForm] = useState(false);\n\n if (!taskLabel) return null;\n return (\n <>\n {showCoachForm ? (\n <CoachForm\n taskLabel={taskLabel}\n onClose={() => setShowCoachForm(false)}\n />\n ) : (\n <Button\n size=\"sm\"\n onClick={() => setShowCoachForm(true)}\n variant=\"outline\"\n >\n <ThinkingIcon />\n Coach Agent\n </Button>\n )}\n </>\n );\n};\n","import { FC, ReactNode, useId } from \"react\";\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n PromptInputActionAddAttachments,\n} from \"@altimateai/lego\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { Stack } from \"@altimateai/lego\";\nimport { updateContext } from \"../../store/chatSlice\";\nimport { ContextOption, LoadingState } from \"../../types\";\nimport {\n IconPlus,\n IconSquare,\n IconSquareCheckFilled,\n} from \"@tabler/icons-react\";\n\ninterface ContextPanelProps {\n fileUploadProps?: {\n allowedFiles: string;\n contextFieldKey: string;\n };\n contextOptions?: ContextOption[];\n children?: ReactNode[];\n}\n\nexport const ContextPanel: FC<ContextPanelProps> = ({\n children,\n fileUploadProps,\n contextOptions,\n}) => {\n const panelId = useId();\n const listboxId = useId();\n // const [selectedOptions, setSelectedOptions] = useState<{ [x: string]: string[] }>({});\n\n const { dispatch, currentSessionId, disableContext, loadingState, sessions } =\n useChatContext();\n const currentContext = currentSessionId\n ? sessions[currentSessionId]?.context || {}\n : {};\n\n const handleOptionSelect = (\n option: { id: string; label: string },\n key: string,\n ) => {\n const getSelectedOptions = () => {\n const values = currentContext[key] as string[] | undefined;\n if (values?.includes(option.id)) {\n return {\n ...currentContext,\n [key]: values?.filter((id) => id !== option.id),\n };\n }\n return { ...currentContext, [key]: [...(values || []), option.id] };\n };\n\n if (currentSessionId) {\n dispatch(\n updateContext({\n sessionId: currentSessionId,\n context: getSelectedOptions(),\n }),\n );\n }\n };\n\n if (disableContext) {\n return <div />;\n }\n\n return (\n <Stack\n id={panelId}\n role=\"region\"\n aria-label=\"Context selection\"\n direction=\"row\"\n align=\"center\"\n className=\"al-gap-2\"\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div className=\"al-relative\">\n <Button\n type=\"button\"\n variant=\"outline\"\n title=\"Add context or files\"\n aria-controls={listboxId}\n aria-haspopup=\"listbox\"\n aria-label=\"Add Context\"\n disabled={loadingState === LoadingState.LOADING}\n >\n <IconPlus className=\"al-h-5 al-w-5\" aria-hidden=\"true\" />\n </Button>\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"al-p-0\" align=\"start\">\n {fileUploadProps && <PromptInputActionAddAttachments />}\n {contextOptions?.map((contextOption) => {\n if (contextOption.type === \"submenu\") {\n return (\n <DropdownMenuSub key={contextOption.key}>\n <DropdownMenuSubTrigger>\n {contextOption.icon}\n {contextOption.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"!al-p-0\">\n {/*\n We can't use a standard <Combobox> here because nesting it inside a <DropdownMenu>\n causes issues with event handling and focus management, leading to unexpected\n behavior and crashes.\n\n Instead, we use a <Command> component inside a <DropdownMenuItem>. The item's\n `onSelect` event is prevented from closing the dropdown, allowing the user to\n interact with the searchable, multi-select list provided by the <Command> component.\n */}\n <DropdownMenuItem\n onSelect={(e) => e.preventDefault()}\n className=\"!al-p-0 al-cursor-default focus:al-bg-transparent\"\n >\n <Command className={\"!al-p-0\"}>\n <CommandInput placeholder=\"Search...\" />\n <CommandList className={\"!al-p-0\"}>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {contextOption.options?.map((option) => (\n <CommandItem\n key={option.id}\n value={option.label}\n onSelect={() =>\n handleOptionSelect(option, contextOption.key)\n }\n className=\"al-flex al-items-center\"\n >\n {(\n currentContext[contextOption.key] as string[]\n )?.includes(option.id) ? (\n <IconSquareCheckFilled\n className=\"al-h-4 al-w-4 al-text-primary\"\n role=\"checkbox\"\n aria-checked=\"true\"\n />\n ) : (\n <IconSquare\n role=\"checkbox\"\n aria-checked=\"false\"\n className=\"al-h-4 al-w-4 al-text-muted-foreground\"\n />\n )}\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n );\n }\n if (contextOption.type === \"trigger\") {\n return (\n <DropdownMenuItem\n key={contextOption.key}\n onSelect={contextOption.handler}\n >\n {contextOption.icon}\n {contextOption.label}\n </DropdownMenuItem>\n );\n }\n return null;\n })}\n {children}\n </DropdownMenuContent>\n </DropdownMenu>\n </Stack>\n );\n};\n","import { FC } from \"react\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport {\n setLoadingState,\n setError,\n deleteMessage,\n} from \"../../store/chatSlice\";\nimport { LoadingState } from \"../../types\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { IconRefresh } from \"@tabler/icons-react\";\nimport { Button, Tooltip } from \"@altimateai/lego\";\n\ninterface RegenerateButtonProps {\n messageId: string;\n}\n\nexport const RegenerateButton: FC<RegenerateButtonProps> = ({ messageId }) => {\n const { sendMessage } = useAgentChat();\n const { dispatch, currentSessionId, sessions } = useChatContext();\n\n const handleRegenerate = async () => {\n if (!currentSessionId) return;\n\n const currentSession = sessions[currentSessionId];\n if (!currentSession) return;\n\n try {\n dispatch(\n setLoadingState({\n state: LoadingState.LOADING,\n sessionId: currentSessionId,\n }),\n );\n\n // Get the last user message before this assistant message\n const messages = currentSession.messages;\n const currentIndex = messages.findIndex((msg) => msg.id === messageId);\n if (currentIndex === -1) return;\n\n const lastUserMessage = messages\n .slice(0, currentIndex)\n .filter((msg) => msg.role === \"user\")\n .pop();\n\n if (!lastUserMessage) {\n throw new Error(\"No user message found to regenerate\");\n }\n\n // Delete the current assistant message\n dispatch(\n deleteMessage({\n sessionId: currentSessionId,\n messageId,\n }),\n );\n\n // Call API with the last user message\n await sendMessage({\n message: lastUserMessage.content,\n dontAddUserMessage: true,\n });\n } catch (err) {\n dispatch(\n setError(\n err instanceof Error ? err.message : \"Failed to regenerate response\",\n ),\n );\n } finally {\n dispatch(\n setLoadingState({\n state: LoadingState.UNINITIALIZED,\n sessionId: currentSessionId,\n }),\n );\n }\n };\n\n return (\n <Tooltip title={\"Regenerate response\"}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={\"al-text-gray-500\"}\n onClick={handleRegenerate}\n aria-label=\"Regenerate response\"\n >\n <IconRefresh aria-hidden=\"true\" />\n </Button>\n </Tooltip>\n );\n};\n","import { FC } from \"react\";\nimport { Button, Tooltip } from \"@altimateai/lego\";\nimport { RegenerateButton } from \"../regenerateButton\";\nimport { Stack } from \"@altimateai/lego\";\nimport { IconCopy } from \"@tabler/icons-react\";\n\ninterface MessageMenuProps {\n messageId: string;\n content: string;\n}\n\nexport const ChatLastMessageActions: FC<MessageMenuProps> = ({\n messageId,\n content,\n}) => {\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n } catch (err) {\n console.error(\"Failed to copy message:\", err);\n }\n };\n\n return (\n <Stack direction=\"row\">\n <RegenerateButton messageId={messageId} />\n <Tooltip title={\"Copy message\"}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={\"al-text-gray-500\"}\n onClick={handleCopy}\n aria-label=\"Copy response\"\n >\n <IconCopy aria-hidden=\"true\" />\n </Button>\n </Tooltip>\n </Stack>\n );\n};\n","import { useChatContext } from \"../ChatProvider\";\nimport { Feedback } from \"../types\";\nimport { updateMessageFeedback } from \"../store/chatSlice\";\n\nexport const useFeedback = () => {\n const { dispatch, currentSessionId, urls, requestParams } = useChatContext();\n\n const submitFeedback = async (messageId: string, feedback: Feedback) => {\n try {\n // Make API call to submit feedback\n const feedbackPath = urls?.feedbackPath || \"/agent/feedback\";\n const feedbackUrl = urls?.origin ? `${urls.origin}${feedbackPath}` : feedbackPath;\n const response = await fetch(feedbackUrl, {\n method: \"POST\",\n headers: {\n ...(requestParams?.headers || {}),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messageId: messageId.toString(),\n sessionId: currentSessionId,\n feedback,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to submit feedback\");\n }\n\n // Update local state\n dispatch(\n updateMessageFeedback({\n messageId,\n feedback,\n })\n );\n } catch (error) {\n console.error(\"Failed to submit feedback:\", error);\n throw error;\n }\n };\n\n return { submitFeedback };\n};\n","import { LoadingButton, Stack } from \"@altimateai/lego\";\nimport { Button, Textarea } from \"@altimateai/lego\";\nimport { FC, ReactNode, useState } from \"react\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { useFeedback } from \"../../hooks/useFeedback\";\nimport { IconThumbDown, IconThumbUp } from \"@tabler/icons-react\";\n\ninterface ChatFeedbackActionsProps {\n messageId: string;\n children?: ReactNode;\n}\n\nexport const ChatFeedbackActions: FC<ChatFeedbackActionsProps> = ({\n messageId,\n children,\n}) => {\n const { components } = useChatContext();\n const [showComment, setShowComment] = useState(false);\n const [comment, setComment] = useState(\"\");\n const [selectedRating, setSelectedRating] = useState<\n \"up\" | \"down\" | undefined\n >();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { submitFeedback } = useFeedback();\n\n const handleRatingClick = async (rating: \"up\" | \"down\") => {\n if (rating === selectedRating) {\n setSelectedRating(undefined);\n setShowComment(false);\n await submitFeedback(messageId, { rating: undefined });\n } else {\n setSelectedRating(rating);\n setShowComment(true);\n }\n };\n\n const handleSubmitFeedback = async () => {\n if (!selectedRating) return;\n\n setIsSubmitting(true);\n try {\n await submitFeedback(messageId, {\n rating: selectedRating,\n comment: comment.trim() || undefined,\n });\n setShowComment(false);\n } catch (error) {\n console.error(\"Failed to submit feedback:\", error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (components?.feedback) {\n return components.feedback;\n }\n\n return (\n <>\n <Stack\n direction=\"row\"\n justify={\"end\"}\n role=\"group\"\n aria-label=\"Message feedback\"\n >\n {children}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={\n selectedRating === \"up\"\n ? \"al-bg-green-100 al-text-green-600\"\n : \"al-text-gray-500\"\n }\n onClick={() => handleRatingClick(\"up\")}\n disabled={isSubmitting}\n title=\"Like response\"\n aria-pressed={selectedRating === \"up\"}\n >\n <IconThumbUp aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={\n selectedRating === \"down\"\n ? \"al-bg-red-100 al-text-red-600\"\n : \"al-text-gray-500\"\n }\n onClick={() => handleRatingClick(\"down\")}\n disabled={isSubmitting}\n title=\"Dislike response\"\n aria-pressed={selectedRating === \"down\"}\n >\n <IconThumbDown aria-hidden=\"true\" />\n </Button>\n </Stack>\n {showComment && (\n <div className=\"al-mt-2 al-space-y-2 al-w-full al-basis-full al-px-2\">\n <Textarea\n placeholder=\"Tell us more about your feedback...\"\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n className=\"al-min-h-20\"\n disabled={isSubmitting}\n aria-label=\"Feedback comment\"\n autoFocus\n />\n <Stack direction=\"row\">\n <LoadingButton\n size=\"sm\"\n onClick={handleSubmitFeedback}\n disabled={isSubmitting}\n aria-busy={isSubmitting}\n loading={isSubmitting}\n loadingText={\"Submitting...\"}\n >\n Submit Feedback\n </LoadingButton>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowComment(false)}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n </Stack>\n </div>\n )}\n </>\n );\n};\n","import { useState, FC, useCallback } from \"react\";\nimport { Button, toast } from \"@altimateai/lego\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"@altimateai/lego\";\nimport { Stack } from \"@altimateai/lego\";\nimport {\n TagsInput,\n TagsInputLabel,\n TagsInputList,\n TagsInputInput,\n TagsInputItem,\n TagsInputClear,\n} from \"@altimateai/lego\";\nimport { RefreshIcon } from \"../../../../assets/icons\";\n\ninterface EmailDialogProps {\n open: boolean;\n onClose: () => void;\n onSendEmail: (emails: string[]) => Promise<void>;\n isLoading?: boolean;\n}\n\nconst validateEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email.trim());\n};\n\nexport const EmailDialog: FC<EmailDialogProps> = ({\n open,\n onClose,\n onSendEmail,\n isLoading = false,\n}) => {\n const [emails, setEmails] = useState<string[]>([]);\n\n const handleValidateEmail = useCallback((email: string): boolean => {\n return validateEmail(email);\n }, []);\n\n const handleSendEmail = async () => {\n const validEmails = emails.filter((email) => validateEmail(email));\n\n if (validEmails.length === 0) {\n return;\n }\n\n try {\n await onSendEmail(validEmails);\n toast({\n title: \"Success\",\n description: `Email sent to ${validEmails.length} recipient${\n validEmails.length > 1 ? \"s\" : \"\"\n }.`,\n });\n // Clear form on success\n setEmails([]);\n onClose();\n } catch (error) {\n toast({\n title: \"Error\",\n description: \"Failed to send email. Please try again.\",\n variant: \"destructive\",\n });\n console.error(\"Failed to send email:\", error);\n }\n };\n\n const handleClose = () => {\n setEmails([]);\n onClose();\n };\n\n const validEmailCount = emails.filter((email) => validateEmail(email)).length;\n const hasInvalidEmails = emails.some((email) => !validateEmail(email));\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent className=\"al-max-w-md\">\n <DialogHeader>\n <DialogTitle>Email Response</DialogTitle>\n </DialogHeader>\n\n <div className=\"al-space-y-4\">\n <TagsInput\n value={emails}\n onValueChange={(next) =>\n setEmails((prev) => {\n if (\n prev.length > 0 &&\n next.length === 1 &&\n !prev.includes(next[0])\n ) {\n return [...prev, next[0]];\n }\n return next;\n })\n }\n onValidate={handleValidateEmail}\n addOnPaste\n addOnTab\n delimiter=\",\"\n className=\"al-w-full\"\n disabled={isLoading}\n >\n <TagsInputLabel>Email Recipients</TagsInputLabel>\n <TagsInputList>\n {emails.map((email) => (\n <TagsInputItem\n key={email}\n value={email}\n className={\n validateEmail(email)\n ? \"al-bg-blue-100 al-text-blue-800 al-border-blue-200\"\n : \"al-bg-red-100 al-text-red-800 al-border-red-200\"\n }\n >\n {email}\n </TagsInputItem>\n ))}\n <TagsInputInput\n placeholder={\n emails.length === 0 ? \"Enter email addresses...\" : \"\"\n }\n disabled={isLoading}\n aria-label=\"add emails\"\n />\n </TagsInputList>\n <TagsInputClear asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"al-flex al-items-center al-gap-2 al-mt-2\"\n disabled={isLoading || emails.length === 0}\n >\n <RefreshIcon className=\"al-h-4 al-w-4\" />\n Clear All\n </Button>\n </TagsInputClear>\n </TagsInput>\n\n <div className=\"al-space-y-2\">\n <p className=\"al-text-xs al-text-gray-400\">\n Press Enter, Tab, or comma to add an email. Use Backspace to\n remove emails.\n </p>\n {hasInvalidEmails && (\n <p className=\"al-text-xs al-text-red-600\">\n Some email addresses are invalid and will be ignored.\n </p>\n )}\n {validEmailCount > 0 && (\n <div className=\"al-text-xs al-text-blue-400\">\n Ready to send to {validEmailCount} recipient\n {validEmailCount !== 1 ? \"s\" : \"\"}\n </div>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <Stack direction=\"row\" justify=\"end\" gap=\"sm\">\n <Button variant=\"ghost\" onClick={handleClose} disabled={isLoading}>\n Cancel\n </Button>\n <Button\n onClick={handleSendEmail}\n disabled={validEmailCount === 0 || isLoading}\n aria-busy={isLoading}\n >\n {isLoading\n ? \"Sending...\"\n : `Send Email${validEmailCount > 1 ? \"s\" : \"\"}`}\n </Button>\n </Stack>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n","import { IconShare3 } from \"@tabler/icons-react\";\nimport { Button } from \"@altimateai/lego\";\nimport { FC, useCallback, useState } from \"react\";\nimport { EmailDialog } from \"../emailDialog/EmailDialog\";\nimport { ApiHelper } from \"../../../api/index\";\n\ninterface ShareMessageProps {\n messageId: string;\n messageContent?: string;\n sessionId?: string;\n}\n\nexport const ShareMessage: FC<ShareMessageProps> = ({ messageId, messageContent, sessionId }) => {\n const [showEmailDialog, setShowEmailDialog] = useState(false);\n const [isEmailing, setIsEmailing] = useState(false);\n\n const handleSendEmail = useCallback(\n async (emails: string[]) => {\n if (!messageContent) {\n throw new Error(\"No message content available for email\");\n }\n\n setIsEmailing(true);\n try {\n const payload = {\n markdown: messageContent,\n emails: emails,\n message_id: messageId.toString(),\n session_id: sessionId,\n };\n\n await ApiHelper.post<{ success: boolean }>(\n \"studio/markdown_to_email_mailing_list\",\n payload\n );\n\n // Success - dialog will close automatically\n } catch (error) {\n console.error(\"Failed to send email:\", error);\n throw error; // Re-throw to let dialog handle error display\n } finally {\n setIsEmailing(false);\n }\n },\n [messageId, messageContent, sessionId]\n );\n\n return (\n <>\n <Button\n variant=\"outline\"\n className={\"al-bg-transparent al-text-gray-500\"}\n size=\"sm\"\n onClick={() => setShowEmailDialog(true)}\n disabled={!messageContent}\n aria-label=\"Email response\"\n >\n <IconShare3 aria-hidden=\"true\" />\n Share\n </Button>\n <EmailDialog\n open={showEmailDialog}\n onClose={() => setShowEmailDialog(false)}\n onSendEmail={handleSendEmail}\n isLoading={isEmailing}\n />\n </>\n );\n};\n","import { LoadingButton } from \"@altimateai/lego\";\nimport { IconDownload } from \"@tabler/icons-react\";\nimport { FC, useCallback, useState } from \"react\";\nimport { toast } from \"@altimateai/lego\";\nimport { useChatContext } from \"../../ChatProvider\";\n\ninterface DownloadMessageProps {\n messageId: string;\n messageContent?: string;\n sessionId?: string;\n}\n\nexport const DownloadMessage: FC<DownloadMessageProps> = ({\n messageId,\n messageContent,\n sessionId,\n}) => {\n const { urls, requestParams } = useChatContext();\n const [isDownloading, setIsDownloading] = useState(false);\n\n const handleDownloadPdf = useCallback(async () => {\n if (!messageContent) {\n console.warn(\"No message content available for PDF export\");\n return;\n }\n\n try {\n setIsDownloading(true);\n\n const endpoint = `${urls?.origin || \"\"}/studio/markdown_to_pdf`;\n const payload = { markdown: messageContent };\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n ...(requestParams?.headers || {}),\n \"Content-Type\": \"application/json\",\n Accept: \"application/pdf\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to generate PDF\");\n }\n\n const blob = await response.blob();\n\n // Create filename with session and message ID\n const filename = sessionId\n ? `session-${sessionId}-assistant-response-${messageId}.pdf`\n : `assistant-response-${messageId}.pdf`;\n\n // Trigger download\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n window.URL.revokeObjectURL(url);\n toast({\n title: \"Success\",\n description: \"PDF downloaded successfully.\",\n });\n } catch (e) {\n console.error(\"Failed to download PDF:\", e);\n toast({\n title: \"Error\",\n description: \"Failed to download PDF.\",\n variant: \"destructive\",\n });\n } finally {\n setIsDownloading(false);\n }\n }, [messageId, messageContent, sessionId, requestParams?.headers, urls?.origin]);\n\n return (\n <LoadingButton\n variant=\"outline\"\n className={\"al-bg-transparent al-text-gray-500\"}\n size=\"sm\"\n onClick={handleDownloadPdf}\n disabled={isDownloading || !messageContent}\n loading={isDownloading}\n loadingText={\"Downloading...\"}\n aria-label=\"Download as PDF\"\n >\n <IconDownload aria-hidden=\"true\" />\n Download\n </LoadingButton>\n );\n};\n","import { FC } from \"react\";\nimport { ShareMessage } from \"../action-buttons/ShareMessage\";\nimport { DownloadMessage } from \"../action-buttons/DownloadMessage\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { ChatFeedbackActions } from \"./ChatFeedbackActions\";\nimport { ChatLastMessageActions } from \"./ChatLastMessageActions\";\nimport { CoachAI } from \"../coachAI\";\n\ninterface ChatMessageActionsProps {\n messageId: string;\n messageContent: string;\n sessionId?: string;\n isLastMessage: boolean;\n}\n\nexport const ChatMessageActions: FC<ChatMessageActionsProps> = ({\n messageId,\n messageContent,\n sessionId,\n isLastMessage,\n}) => {\n const { components } = useChatContext();\n\n // Allow custom feedback component override\n if (components?.feedback) {\n return components.feedback;\n }\n\n return (\n <div\n role=\"group\"\n aria-label=\"Message actions\"\n className=\"al-mt-4 al-pt-4 al-border-t al-border-gray-200\"\n >\n {/* Flex container with wrap to allow feedback form on next line */}\n <div className=\"al-flex al-flex-row al-flex-wrap al-items-center al-justify-between al-gap-2\">\n {/* Left group: Share and Download */}\n <div\n className=\"al-flex al-flex-row al-items-center al-gap-1\"\n role=\"group\"\n aria-label=\"Message share and download\"\n >\n <ShareMessage\n messageId={messageId}\n messageContent={messageContent}\n sessionId={sessionId}\n />\n <DownloadMessage\n messageId={messageId}\n messageContent={messageContent}\n sessionId={sessionId}\n />\n {isLastMessage && <CoachAI />}\n </div>\n\n {/* Right group: Regenerate, Copy, Feedback buttons */}\n <ChatFeedbackActions messageId={messageId}>\n {isLastMessage && (\n <ChatLastMessageActions messageId={messageId} content={messageContent} />\n )}\n </ChatFeedbackActions>\n </div>\n </div>\n );\n};\n","import React, { FormEvent } from \"react\";\nimport { Checkbox, Button, Textarea } from \"@altimateai/lego\";\nimport { InteractionRequest } from \"../../types\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { Markdown, Stack } from \"@altimateai/lego\";\n\ninterface InteractionPromptProps {\n interaction: InteractionRequest;\n}\n\nenum FormState {\n INITIAL,\n SUBMITTING,\n COMPLETED,\n}\n\nexport const InteractionPrompt: React.FC<InteractionPromptProps> = ({\n interaction,\n}) => {\n const { sendMessage } = useAgentChat();\n const [textValue, setTextValue] = React.useState(\"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>([]);\n const [formState, setFormState] = React.useState<FormState>(\n FormState.INITIAL,\n );\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setFormState(FormState.SUBMITTING);\n\n let value: string;\n switch (interaction.type) {\n case \"text\":\n value = textValue;\n break;\n case \"select\":\n value = selectedValues[0] || \"\";\n break;\n case \"multiSelect\":\n value = selectedValues.join(\",\");\n break;\n case \"confirm\":\n value = ((e.nativeEvent as SubmitEvent)?.submitter as HTMLButtonElement)\n ?.value;\n break;\n default:\n value = \"\";\n }\n\n try {\n await sendMessage({\n message: value,\n isResponseToPrompt: true,\n });\n } catch (error) {\n console.error(\"Failed to submit interaction:\", error);\n } finally {\n setFormState(FormState.COMPLETED);\n }\n };\n\n const handleCancel = async () => {\n try {\n await sendMessage({\n message: JSON.stringify({\n interactionId: interaction.id,\n value: \"cancelled\",\n }),\n });\n } catch (error) {\n console.error(\"Failed to cancel interaction:\", error);\n }\n };\n\n const renderInput = () => {\n switch (interaction.type) {\n case \"text\":\n return (\n <Textarea\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n required={interaction.required}\n aria-label=\"Prompt input\"\n />\n );\n case \"select\":\n case \"multiSelect\":\n return (\n <div className=\"al-space-y-2\">\n {interaction.choices?.map((choice) => (\n <label\n key={choice.id}\n className=\"al-flex al-items-center al-gap-2\"\n >\n {\" \"}\n <Checkbox\n checked={selectedValues.includes(choice.value)}\n onCheckedChange={(checked) => {\n if (interaction.type === \"select\") {\n setSelectedValues(checked ? [choice.value] : []);\n } else {\n setSelectedValues((prev) =>\n checked\n ? [...prev, choice.value]\n : prev.filter((v) => v !== choice.value),\n );\n }\n }}\n />\n <span>{choice.label}</span>\n </label>\n ))}\n </div>\n );\n case \"confirm\":\n return (\n <Stack direction=\"row\">\n <Button\n disabled={\n formState === FormState.SUBMITTING ||\n formState === FormState.COMPLETED\n }\n value=\"yes\"\n >\n Yes\n </Button>\n <Button\n variant=\"outline\"\n value=\"no\"\n disabled={\n formState === FormState.SUBMITTING ||\n formState === FormState.COMPLETED\n }\n >\n No\n </Button>\n </Stack>\n );\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit}\n className=\"al-space-y-4\"\n role=\"region\"\n aria-label=\"Interaction\"\n >\n <div className=\"al-font-medium\">\n <Markdown content={interaction.prompt} />\n </div>\n {renderInput()}\n {interaction.type !== \"confirm\" && (\n <Stack direction=\"row\">\n <Button\n type=\"submit\"\n disabled={\n formState === FormState.SUBMITTING ||\n formState === FormState.COMPLETED\n }\n >\n Submit\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCancel}\n disabled={\n formState === FormState.SUBMITTING ||\n formState === FormState.COMPLETED\n }\n >\n Cancel\n </Button>\n </Stack>\n )}\n </form>\n );\n};\n","import { FC } from \"react\";\nimport { Card } from \"@altimateai/lego\";\nimport { Stack } from \"@altimateai/lego\";\n\nexport const LoadingIndicator: FC = () => {\n return (\n <Card className=\"al-p-4 al-mb-4 al-border-0 al-shadow-none\">\n <Stack direction=\"row\" align=\"center\" role=\"status\" aria-live=\"polite\">\n <div\n className=\"al-animate-spin al-h-4 al-w-4 al-border-2 al-border-primary al-border-t-transparent al-rounded-full\"\n role=\"progressbar\"\n aria-label=\"Loading\"\n aria-hidden=\"false\"\n />\n <span className=\"al-sr-only\">Loading response</span>\n </Stack>\n </Card>\n );\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { FC, useState } from \"react\";\nimport { AgentAction } from \"../../types\";\nimport { Markdown, Stack } from \"@altimateai/lego\";\nimport { Artifacts } from \"../artifacts\";\nimport {\n ChainOfThought,\n ChainOfThoughtHeader,\n ChainOfThoughtContent,\n ChainOfThoughtStep,\n} from \"@altimateai/lego\";\nimport {\n IconSearch,\n IconMail,\n IconCode,\n IconDatabase,\n IconBrain,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../../../shared/utils\";\n\ninterface StatusUpdatesProps {\n actions: AgentAction[];\n isComplete?: boolean;\n heading: string;\n}\n\n// Helper function to detect icon component from content\nconst getIconComponentForAction = (content: string) => {\n const lowerContent = content.toLowerCase();\n\n if (lowerContent.includes(\"search\") || lowerContent.includes(\"finding\")) {\n return IconSearch;\n }\n if (lowerContent.includes(\"mail\") || lowerContent.includes(\"email\")) {\n return IconMail;\n }\n if (\n lowerContent.includes(\"code\") ||\n lowerContent.includes(\"query\") ||\n lowerContent.includes(\"sql\")\n ) {\n return IconCode;\n }\n if (lowerContent.includes(\"database\") || lowerContent.includes(\"table\")) {\n return IconDatabase;\n }\n // Default icon for generic steps\n return IconBrain;\n};\n\n// Helper function to render content with URL pills\nconst renderContentWithURLPills = (content: string) => {\n // Match URLs in the content\n const urlRegex = /(https?:\\/\\/[^\\s]+)/g;\n const parts = content.split(urlRegex);\n\n return (\n <span>\n {parts.map((part, index) => {\n if (part.match(urlRegex)) {\n try {\n const hostname = new URL(part).hostname;\n return (\n <span\n key={index}\n className=\"al-inline-block al-bg-blue-100 al-text-blue-700 al-px-2 al-py-0.5 al-rounded-full al-text-xs al-mx-1 al-font-normal\"\n >\n {hostname}\n </span>\n );\n } catch {\n // If URL parsing fails, render as text\n return <span key={index}>{part}</span>;\n }\n }\n return (\n <span key={index} className=\"al-italic\">\n <Markdown\n content={part}\n className=\"al-text-[1em]\"\n components={{\n p: ({ className, ...props }) => (\n <p className={cn(\"al-text-small\", className)} {...props} />\n ),\n }}\n />\n </span>\n );\n })}\n </span>\n );\n};\n\nexport const StatusUpdates: FC<StatusUpdatesProps> = ({\n actions,\n isComplete = false,\n heading,\n}) => {\n const infoActions = actions.filter((a) => a.type === \"info\");\n const analysisActions = actions.filter((a) => a.type === \"analysis\");\n const [isOpen, setIsOpen] = useState(!isComplete);\n\n if (!actions.length) return null;\n\n return (\n <Stack\n direction=\"column\"\n className=\"al-mb-4 \"\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Action status updates\"\n >\n <ChainOfThought\n open={isOpen}\n onOpenChange={setIsOpen}\n style={{ maxWidth: \"100%\" }}\n >\n <ChainOfThoughtHeader>\n <Stack\n direction=\"row\"\n align=\"center\"\n justify=\"between\"\n className=\"al-w-full\"\n >\n <span>{heading || \"Assistant\"}</span>\n <span className=\"al-text-brand al-text-xs\">\n {!isComplete ? \"Thinking\" : \"View detailed steps\"}\n </span>\n </Stack>\n </ChainOfThoughtHeader>\n\n <ChainOfThoughtContent>\n {infoActions.map((action, index) => {\n const isActive = !isComplete && index === infoActions.length - 1;\n const hasRichContent =\n !!action.artifacts && action.artifacts.length > 0;\n const IconComponent = getIconComponentForAction(\n action.content || \"\",\n );\n\n return (\n <ChainOfThoughtStep\n key={action.id || `action-${index}`}\n icon={isActive ? IconLoader2 : IconComponent}\n status={isActive ? \"active\" : \"complete\"}\n label={\n <div\n role=\"status\"\n className={cn(\n \"al-text-muted-foreground al-text-sm\",\n hasRichContent && \"al-bg-gray-50 al-p-3 al-rounded-md\",\n )}\n >\n {/* Render content with URL pills */}\n <div className=\"al-leading-relaxed\">\n {renderContentWithURLPills(action.content || \"\")}\n </div>\n\n {/* Artifacts with spacing */}\n {action.artifacts && (\n <div className=\"al-mt-3\">\n <Artifacts artifacts={action.artifacts} />\n </div>\n )}\n </div>\n }\n />\n );\n })}\n </ChainOfThoughtContent>\n </ChainOfThought>\n\n {/* Analysis actions displayed separately (outside collapsible) */}\n {analysisActions.length > 0 && (\n <Stack direction=\"column\" className=\"al-text-sm al-text-dark al-mt-2\">\n {analysisActions.map((action) => (\n <Markdown\n key={action.id}\n content={action.content || \"\"}\n id={action.id}\n />\n ))}\n </Stack>\n )}\n\n {/* Processing indicator */}\n {!isComplete && (\n <Stack direction=\"row\" align=\"center\" gap=\"xs\" className=\"al-mt-2\">\n <div\n className=\"al-animate-spin al-h-4 al-w-4 al-border-2 al-border-primary al-border-t-transparent al-rounded-full\"\n aria-hidden=\"true\"\n />\n <span className=\"al-text-sm al-text-muted-foreground\">\n Processing\n </span>\n </Stack>\n )}\n </Stack>\n );\n};\n","import {\n InlineCitation,\n InlineCitationText,\n InlineCitationCard,\n InlineCitationCardTrigger,\n InlineCitationCardBody,\n InlineCitationCarousel,\n InlineCitationCarouselHeader,\n InlineCitationCarouselIndex,\n InlineCitationCarouselPrev,\n InlineCitationCarouselNext,\n InlineCitationCarouselContent,\n InlineCitationCarouselItem,\n InlineCitationSource,\n} from \"@altimateai/lego\";\nimport { Citation } from \"../../../../components/teammate/types\";\n\ninterface CitationsProps {\n citations?: Citation[];\n frontEndUrl: string;\n text?: string;\n}\n\n/**\n * Citations - AI SDK Elements version of Citations\n *\n * Renders inline citation pills with hover popover showing citation details.\n * Maintains API compatibility with the legacy Citations component while using\n * AI SDK Elements InlineCitation components.\n *\n * @example\n * ```tsx\n * <Citations\n * citations={[\n * { id: \"1\", content: \"Learn about React hooks\", taskLabel: TaskLabels.DocGen },\n * { id: \"2\", content: \"State management patterns\", taskLabel: TaskLabels.DocGen }\n * ]}\n * frontEndUrl=\"https://example.com\"\n * text=\"React uses hooks for state management\"\n * />\n * ```\n */\nconst Citations = ({\n citations,\n frontEndUrl,\n text = \"Learnings applied\",\n}: CitationsProps): JSX.Element | null => {\n if (!citations?.length || !frontEndUrl) {\n return null;\n }\n\n // Convert citations to source URLs for the InlineCitationCardTrigger\n const sources = citations.map(\n (citation) =>\n `${frontEndUrl}/teammates/${citation.taskLabel}?learning=${citation.id}`,\n );\n\n return (\n <InlineCitation>\n <InlineCitationText>{text}</InlineCitationText>\n <InlineCitationCard>\n <InlineCitationCardTrigger sources={sources} />\n <InlineCitationCardBody>\n <InlineCitationCarousel>\n <InlineCitationCarouselHeader>\n <InlineCitationCarouselPrev />\n <InlineCitationCarouselIndex />\n <InlineCitationCarouselNext />\n </InlineCitationCarouselHeader>\n <InlineCitationCarouselContent>\n {citations.map((citation, index) => {\n const url = `${frontEndUrl}/teammates/${citation.taskLabel}?learning=${citation.id}`;\n return (\n <InlineCitationCarouselItem key={citation.id}>\n <InlineCitationSource\n title={`Learning ${index + 1}`}\n url={url}\n description={citation.content}\n />\n </InlineCitationCarouselItem>\n );\n })}\n </InlineCitationCarouselContent>\n </InlineCitationCarousel>\n </InlineCitationCardBody>\n </InlineCitationCard>\n </InlineCitation>\n );\n};\n\nexport default Citations;\n","import { Stack, Suggestion, Suggestions } from \"@altimateai/lego\";\nimport { ApiHelper, useQuery } from \"../../../api/index\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { useEffect } from \"react\";\n\nconst Followup = () => {\n const { currentSessionId, urls } = useChatContext();\n const { sendMessage } = useAgentChat();\n const { data, refetch } = useQuery<{ questions: string[] }>({\n queryFn: () =>\n ApiHelper.get(urls?.followupPath!, { session_id: currentSessionId }),\n enabled: false,\n });\n\n useEffect(() => {\n if (currentSessionId && urls?.followupPath) {\n refetch();\n }\n // adding refetch as deps will trigger api call repeatedly\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentSessionId, urls?.followupPath]);\n\n if (!data?.questions?.length || !urls?.followupPath || !currentSessionId) {\n return null;\n }\n\n const handleSuggestionClick = (suggestion: string) => {\n sendMessage({ message: suggestion });\n };\n\n return (\n <Stack direction=\"column\" gap=\"sm\" className=\"al-mt-4\">\n {/* Label matching Figma design: font-size/s (12px), font-weight 500, color #7A899E */}\n <p className=\" al-text-xs al-font-medium al-text-[#7A899E] al-leading-4\">\n Ask a follow up:\n </p>\n\n {/* Horizontal scrollable suggestions using AI SDK Elements */}\n {/* Figma specs: gap 4px, white bg, #D5DBE4 border, #374C6A text, py-2 px-4 */}\n <Suggestions>\n {data.questions.map((question) => (\n <Suggestion\n key={question}\n suggestion={question}\n onClick={handleSuggestionClick}\n />\n ))}\n </Suggestions>\n </Stack>\n );\n};\n\nexport default Followup;\n","import { FC } from \"react\";\nimport { TodoItem } from \"../../types\";\nimport {\n Queue,\n QueueSection,\n QueueSectionTrigger,\n QueueSectionLabel,\n QueueSectionContent,\n QueueList,\n QueueItem,\n QueueItemIndicator,\n QueueItemContent,\n} from \"@altimateai/lego\";\nimport { Stack } from \"@altimateai/lego\";\nimport { IconChecklist } from \"@tabler/icons-react\";\n\ninterface TodoProgressProps {\n todos: TodoItem[];\n}\n\nexport const TodoProgress: FC<TodoProgressProps> = ({ todos }) => {\n const completedCount = todos.filter(\n (todo) => todo.status === \"completed\",\n ).length;\n const totalCount = todos.length;\n\n return (\n <Queue className=\"al-w-fit\">\n <QueueSection defaultOpen>\n <QueueSectionTrigger>\n <QueueSectionLabel\n count={completedCount}\n label={`of ${totalCount} tasks complete`}\n icon={<IconChecklist className=\"al-size-4\" />}\n />\n </QueueSectionTrigger>\n <QueueSectionContent>\n <QueueList>\n {todos.map((todo) => (\n <QueueItem key={todo.id}>\n <Stack align=\"center\">\n <QueueItemIndicator status={todo.status} />\n <QueueItemContent status={todo.status}>\n {todo.content}\n </QueueItemContent>\n </Stack>\n </QueueItem>\n ))}\n </QueueList>\n </QueueSectionContent>\n </QueueSection>\n </Queue>\n );\n};\n","import { FC } from \"react\";\nimport { IconBook2, IconFile, IconFileTypePdf } from \"@tabler/icons-react\";\nimport { Stack } from \"@altimateai/lego\";\nimport { MessageAttachment } from \"../../types\";\n\ninterface AttachmentListProps {\n attachments: MessageAttachment[];\n}\n\nconst getAttachmentIcon = (attachment: MessageAttachment) => {\n if (attachment.attachment_type === \"knowledge_base\") {\n return <IconBook2 className=\"al-h-6 al-w-6 al-text-brand\" />;\n }\n\n if (attachment.attachment_type === \"file\") {\n const fileType = attachment.file_type?.toLowerCase() || \"\";\n const fileName = attachment.attachment_name?.toLowerCase() || \"\";\n\n // Check both MIME type and file extension for PDF\n if (fileType === \"application/pdf\" || fileName.endsWith(\".pdf\")) {\n return <IconFileTypePdf className=\"al-h-6 al-w-6 al-text-brand\" />;\n }\n\n return <IconFile className=\"al-h-6 al-w-6 al-text-brand\" />;\n }\n\n // Default for other types\n return <IconFile className=\"al-h-6 al-w-6 al-text-brand\" />;\n};\n\nconst formatFileSize = (bytes: number | null): string => {\n if (!bytes) return \"\";\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n};\n\nexport const AttachmentList: FC<AttachmentListProps> = ({ attachments }) => {\n if (!attachments || attachments.length === 0) {\n return null;\n }\n\n // Sort attachments by order\n const sortedAttachments = [...attachments].sort((a, b) => a.order - b.order);\n\n return (\n <Stack\n direction=\"column\"\n className=\"al-gap-2 al-mb-3 al-overflow-x-auto al-flex-nowrap al-pb-2 al-max-w-[20rem] al-min-w-[20rem]\"\n role=\"list\"\n aria-label=\"Message attachments\"\n >\n {sortedAttachments.map((attachment) => (\n <Stack\n key={attachment.id}\n direction=\"row\"\n align=\"center\"\n className=\"al-bg-blue-50 al-border al-border-blue-500 al-px-3 al-py-2 al-rounded-md al-gap-2 al-flex-shrink-0 al-min-w-0\"\n role=\"listitem\"\n >\n <div className=\"al-min-w-6 al-min-h-6\">\n {getAttachmentIcon(attachment)}\n </div>\n <Stack direction=\"column\" className=\"al-min-w-0\">\n <span\n className=\"al-text-sm al-font-medium al-truncate\"\n title={attachment.attachment_name}\n >\n {attachment.attachment_name}\n </span>\n {attachment.file_size && (\n <span className=\"al-text-xs al-text-gray-500\">\n {formatFileSize(attachment.file_size)}\n </span>\n )}\n </Stack>\n </Stack>\n ))}\n </Stack>\n );\n};\n","import { FC } from \"react\";\nimport { ChatMessage, LoadingState } from \"../../types\";\nimport { StatusUpdates } from \"../statusUpdates\";\nimport { InteractionPrompt } from \"../interactionPrompt\";\nimport { ChatMessageActions } from \"../chatMessageActions\";\nimport { Markdown, Stack } from \"@altimateai/lego\";\nimport { Artifacts } from \"../artifacts\";\nimport Citations from \"../citations/Citations\";\nimport Followup from \"../followup/Followup\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { TodoProgress } from \"../todoProgress\";\nimport { AttachmentList } from \"../attachmentList\";\nimport { Button } from \"@altimateai/lego\";\nimport { IconDeviceFloppy } from \"@tabler/icons-react\";\nimport { Message, MessageContent } from \"@altimateai/lego\";\nimport { cn } from \"../../../../shared/utils\";\n\ninterface MessageItemProps {\n message: ChatMessage;\n isLastMessage?: boolean;\n isFirstMessage?: boolean;\n handleSavePrompt?: (message: ChatMessage) => void;\n showSavePromptButton?: boolean;\n}\n\nexport const MessageItem: FC<MessageItemProps> = ({\n message,\n isLastMessage,\n isFirstMessage,\n handleSavePrompt,\n showSavePromptButton,\n}) => {\n const isAssistant = message.role === \"assistant\";\n const {\n currentSessionId,\n loadingState,\n urls,\n classNames = {},\n } = useChatContext();\n\n return (\n <Message from={message.role} key={message.id}>\n <Stack direction=\"column\" gap=\"none\">\n {message.attachments && message.attachments.length > 0 && (\n <Stack gap=\"sm\" justify={isAssistant ? \"start\" : \"end\"}>\n <div id={`message-${message.id}-attachments`}>\n <AttachmentList attachments={message.attachments} />\n </div>\n </Stack>\n )}\n <Stack justify=\"end\">\n {isFirstMessage && showSavePromptButton && handleSavePrompt && (\n <Button\n variant={\"ghost\"}\n size={\"icon\"}\n onClick={() => handleSavePrompt(message)}\n className=\"al-text-muted-foreground !al-p-0 al-h-auto al-w-auto al-mt-2\"\n aria-label=\"Save prompt\"\n title=\"Add to Prompt Library\"\n type=\"button\"\n >\n <IconDeviceFloppy className={\"!al-size-5\"} />\n </Button>\n )}\n <MessageContent>\n <Stack\n gap=\"sm\"\n direction=\"column\"\n className=\"group-[.is-assistant]:al-w-full\"\n >\n <div\n id={`message-${message.id}`}\n className={cn(\n `al-flex al-items-start al-gap-2`,\n !isAssistant ? \"al-justify-end\" : \"\",\n classNames.messageItem ?? \"\",\n )}\n role=\"article\"\n aria-label={`${isAssistant ? \"Assistant\" : \"User\"} message`}\n >\n <Stack\n direction=\"row\"\n className=\"group-[.is-assistant]:al-w-full\"\n >\n <div className=\"al-max-w-full al-flex-1\">\n {message.role === \"assistant\" &&\n message.actions &&\n message.actions.length > 0 && (\n <div id={`message-${message.id}-status`}>\n <StatusUpdates\n actions={message.actions}\n isComplete={true}\n heading={message.heading}\n />\n </div>\n )}\n\n {message.role === \"assistant\" &&\n message.todos &&\n message.todos.length > 0 && (\n <div id={`message-${message.id}-todos`}>\n <TodoProgress todos={message.todos} />\n </div>\n )}\n {/* {message.role === \"assistant\" && message.confidence_str && (\n <Alert className=\"al-my-3\" variant=\"warning\">\n <Stack gap=\"xl\" align=\"center\">\n <IconAlertSquareRounded className=\"al-min-h-6 al-min-w-6\" />\n <Typography variant=\"body\" className=\"al-flex-1\">\n {message.confidence_str}\n </Typography>\n </Stack>\n </Alert>\n )} */}\n <div id={`message-${message.id}-content`}>\n <Markdown\n content={message.content || \"\"}\n id={message.id}\n />\n </div>\n\n {message.artifacts && (\n <div id={`message-${message.id}-artifacts`}>\n <Artifacts artifacts={message.artifacts} />\n </div>\n )}\n\n {message.interaction && (\n <div\n className=\"al-mt-4\"\n id={`message-${message.id}-interaction`}\n >\n <InteractionPrompt interaction={message.interaction} />\n </div>\n )}\n\n {message.citations && message.citations.length > 0 && (\n <div\n className=\"al-mt-4\"\n id={`message-${message.id}-citations`}\n >\n <Citations\n citations={message.citations}\n frontEndUrl={urls?.frontendUrl || \"\"}\n />\n </div>\n )}\n\n {isAssistant && loadingState === LoadingState.LOADED && (\n <div id={`message-${message.id}-actions`}>\n <ChatMessageActions\n messageId={message.id}\n messageContent={message.content}\n sessionId={currentSessionId || undefined}\n isLastMessage={isLastMessage || false}\n />\n </div>\n )}\n </div>\n </Stack>\n </div>\n {isLastMessage &&\n currentSessionId &&\n loadingState === LoadingState.LOADED && <Followup />}\n </Stack>\n </MessageContent>\n </Stack>\n </Stack>\n </Message>\n );\n};\n","import { FC } from \"react\";\nimport { ChatMessage } from \"../../types\";\nimport { MessageItem } from \"../messageItem\";\nimport { Conversation, ConversationEmptyState } from \"@altimateai/lego\";\n\ninterface MessageListProps {\n messages: ChatMessage[];\n handleSavePrompt?: (message: ChatMessage) => void;\n showSavePromptButton?: boolean;\n emptyStateContent?: React.ReactNode;\n}\n\nexport const MessageList: FC<MessageListProps> = ({\n messages,\n handleSavePrompt,\n showSavePromptButton = false,\n emptyStateContent,\n}) => {\n if (messages.length === 0 && emptyStateContent) {\n return (\n <Conversation className=\"al-w-full\">\n <ConversationEmptyState>{emptyStateContent}</ConversationEmptyState>\n </Conversation>\n );\n }\n\n return (\n <>\n {messages.map((message, index) => (\n <MessageItem\n key={message.id}\n message={message}\n isLastMessage={index === messages.length - 1}\n isFirstMessage={index === 0}\n handleSavePrompt={index === 0 ? handleSavePrompt : undefined}\n showSavePromptButton={index === 0 ? showSavePromptButton : false}\n />\n ))}\n </>\n );\n};\n","import { EntityDetectionRequest, EntityDetectionResponse } from \"../types\";\n\nexport class EntityDetectionService {\n private debounceTimer: NodeJS.Timeout | null = null;\n private pendingRequest: Promise<EntityDetectionResponse | null> | null = null;\n private latestRequest: EntityDetectionRequest | null = null;\n private readonly debounceDelay: number;\n\n constructor(debounceDelay: number = 500) {\n this.debounceDelay = debounceDelay;\n }\n\n async detectEntities(\n url: string,\n request: EntityDetectionRequest,\n requestParams?: RequestInit\n ): Promise<EntityDetectionResponse | null> {\n return new Promise(resolve => {\n // Store the latest request\n this.latestRequest = request;\n\n // Cancel previous timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(async () => {\n // If there's a pending request, wait for it to complete first\n if (this.pendingRequest) {\n await this.pendingRequest;\n }\n\n // Check if this is still the latest request\n if (this.latestRequest === request) {\n try {\n // Create and store the new request promise\n this.pendingRequest = this.makeRequest(url, request, requestParams);\n const result = await this.pendingRequest;\n\n // Clear pending request after completion\n this.pendingRequest = null;\n resolve(result);\n } catch (error) {\n console.error(\"Entity detection error:\", error);\n this.pendingRequest = null;\n resolve(null);\n }\n } else {\n // This request is stale, resolve with null\n resolve(null);\n }\n }, this.debounceDelay);\n });\n }\n\n private async makeRequest(\n url: string,\n request: EntityDetectionRequest,\n requestParams?: RequestInit\n ): Promise<EntityDetectionResponse | null> {\n const response = await fetch(url, {\n ...requestParams,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...requestParams?.headers,\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Entity detection failed: ${response.statusText}`);\n }\n\n return await response.json();\n }\n\n cleanup() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n // Reset pending request reference (we can't abort a promise)\n this.pendingRequest = null;\n this.latestRequest = null;\n }\n}\n","import { useEffect, useRef, useCallback } from \"react\";\nimport { EntityDetectionService } from \"../utils/entityDetection\";\nimport { useChatContext } from \"../ChatProvider\";\nimport { updateEntities } from \"../store/chatSlice\";\nimport { EntityDetectionRequest, EntityType } from \"../types\";\n\nexport const useEntityDetection = () => {\n const { dispatch, currentSessionId, sessions, urls, requestParams } = useChatContext();\n\n const entityServiceRef = useRef<EntityDetectionService | null>(null);\n const currentSessionIdRef = useRef(currentSessionId);\n const sessionsRef = useRef(sessions);\n\n // Update refs on every render\n currentSessionIdRef.current = currentSessionId;\n sessionsRef.current = sessions;\n\n // Initialize entity detection service\n useEffect(() => {\n entityServiceRef.current = new EntityDetectionService(500); // 500ms debounce\n\n return () => {\n entityServiceRef.current?.cleanup();\n };\n }, []);\n\n const detectEntities = useCallback(\n async (text: string) => {\n if (!entityServiceRef.current || !urls?.entityDetectionUrl) {\n return;\n }\n\n // Get current session data from refs at call time\n const sessionId = currentSessionIdRef.current;\n if (!sessionId) return;\n\n const currentContext = sessionsRef.current[sessionId]?.context;\n const existingEntities = (currentContext?.entities || []) as { name: string }[];\n const previouslyDetectedEntities = existingEntities.map(entity => entity.name);\n\n const request: EntityDetectionRequest = {\n text,\n detected_entities:\n previouslyDetectedEntities.length > 0 ? previouslyDetectedEntities : undefined,\n };\n\n try {\n const response = await entityServiceRef.current.detectEntities(\n `${urls.origin}${urls.entityDetectionUrl}`,\n request,\n requestParams\n );\n\n if (response && sessionId) {\n // Get existing entities to preserve selected_type for entities that already exist\n const currentContext = sessionsRef.current[sessionId]?.context;\n const existingEntities = (currentContext?.entities || []) as {\n name: string;\n selected_type?: EntityType;\n }[];\n const existingEntityMap = new Map(existingEntities.map(e => [e.name, e.selected_type]));\n\n // Set selected_type to existing value or first type in types_found for new entities\n const entitiesWithSelectedType = response.entities.map(entity => ({\n ...entity,\n selected_type:\n existingEntityMap.get(entity.name) || entity.types_found[0] || EntityType.UNKNOWN,\n }));\n\n // Update entities in the store\n dispatch(\n updateEntities({\n sessionId,\n entities: entitiesWithSelectedType,\n })\n );\n }\n } catch (error) {\n console.error(\"Entity detection failed:\", error);\n }\n },\n [urls?.entityDetectionUrl, urls?.origin, requestParams, dispatch]\n );\n\n return { detectEntities };\n};\n","import { Combobox, ComboboxOption } from \"@altimateai/lego\";\nimport { Stack } from \"@altimateai/lego\";\nimport { DetectedEntity, EntityType } from \"../../types\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { updateEntityType } from \"../../store/chatSlice\";\n\ninterface EntityItemProps {\n entity: DetectedEntity;\n}\n\nconst entityTypeOptions: ComboboxOption[] = Object.values(EntityType).map(\n (type) => ({\n value: type,\n label: type.replace(/_/g, \" \").replace(/\\b\\w/g, (l) => l.toUpperCase()),\n }),\n);\n\nexport const EntityItem: React.FC<EntityItemProps> = ({ entity }) => {\n const { dispatch, currentSessionId } = useChatContext();\n const isUnknown = entity.selected_type === EntityType.UNKNOWN;\n\n const handleTypeChange = (newType: string) => {\n if (currentSessionId) {\n dispatch(\n updateEntityType({\n sessionId: currentSessionId,\n entityName: entity.name,\n newType: newType as EntityType,\n }),\n );\n }\n };\n\n return (\n <Stack\n direction=\"row\"\n align=\"center\"\n className={`al-px-3 al-py-1 al-rounded-md al-gap-2 al-whitespace-nowrap ${\n isUnknown\n ? \"al-bg-red-50 al-border al-border-red-200\"\n : \"al-bg-purple-50\"\n }`}\n role=\"listitem\"\n >\n <span className=\"al-text-sm al-font-medium\">{entity.name}</span>\n <span className=\"al-text-xs al-text-gray-600\">is</span>\n\n <div className=\"al-flex-shrink-0 al-relative\">\n <Combobox\n options={entityTypeOptions}\n value={entity.selected_type}\n onChange={handleTypeChange}\n placeholder=\"Select type...\"\n buttonProps={{\n variant: \"outline\",\n size: \"sm\",\n className: `al-h-7 al-text-xs al-px-2 ${\n isUnknown ? \"al-border-red-300 al-text-red-700 al-bg-red-50\" : \"\"\n }`,\n }}\n />\n {isUnknown && (\n <span className=\"al-absolute al--top-1 al--right-1 al-text-red-500 al-text-xs\">\n *\n </span>\n )}\n </div>\n </Stack>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Carousel,\n CarouselContent,\n CarouselPrevious,\n CarouselNext,\n CarouselItem,\n} from \"@altimateai/lego\";\nimport { IconBook2, IconX } from \"@tabler/icons-react\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { CodeBlock, Stack } from \"@altimateai/lego\";\nimport { ContextOption, DetectedEntity, LoadingState } from \"../../types\";\nimport { EntityItem } from \"../entityItem\";\nimport {\n usePromptInputAttachments,\n Attachment,\n AttachmentPreview,\n AttachmentRemove,\n AttachmentsContext,\n} from \"@altimateai/lego\";\nimport { updateContext } from \"../../store/chatSlice\";\n\ninterface SelectedContextsProps {\n contextOptions?: ContextOption[];\n onRemoveContext: (id: string, key?: string) => void;\n}\n\nexport const SelectedContexts: React.FC<SelectedContextsProps> = ({\n contextOptions,\n onRemoveContext,\n}) => {\n const { currentSessionId, sessions, loadingState, dispatch } =\n useChatContext();\n const currentContext = useMemo(\n () => (currentSessionId ? sessions[currentSessionId]?.context : {}),\n [currentSessionId, sessions],\n );\n const [selectedContextKey] = useState<string | null>(null);\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n\n // Build selectedOptions from context for SelectedContexts component\n const getSelectedOptionsFromContext = () => {\n const options: { [x: string]: string[] } = {};\n if (contextOptions && currentContext) {\n contextOptions.forEach((contextOption) => {\n if (\n contextOption.type === \"submenu\" &&\n currentContext[contextOption.key]\n ) {\n options[contextOption.key] = currentContext[\n contextOption.key\n ] as string[];\n }\n });\n }\n return options;\n };\n\n const selectedOptions = getSelectedOptionsFromContext();\n // Get attachments from prompt input\n const attachments = usePromptInputAttachments();\n\n // Get entities from context\n const entities = (currentContext?.entities as DetectedEntity[]) || [];\n\n // Check if we have any items to display in carousel\n const hasItems =\n attachments.files.length > 0 ||\n Object.values(selectedOptions).some((options) => options.length > 0) ||\n entities.length > 0;\n\n // Also clear when loading state changes to LOADING (when message is being sent)\n useEffect(() => {\n if (loadingState === LoadingState.LOADING && currentSessionId) {\n attachments.clear();\n const options: { [x: string]: string[] } = {};\n if (contextOptions && currentContext) {\n contextOptions.forEach((contextOption) => {\n if (contextOption.type === \"submenu\") {\n options[contextOption.key] = [];\n }\n });\n }\n dispatch(\n updateContext({\n sessionId: currentSessionId,\n context: options,\n }),\n );\n }\n // dont add attachments, dipatch and currentContext to dependencies to avoid infinite loop\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadingState, contextOptions, currentSessionId]);\n\n if (!hasItems) {\n return null;\n }\n\n return (\n <>\n {/* Display all contexts: attachments, knowledge base items, and entities */}\n <div\n className=\"al-w-full al-px-10 al-pb-2\"\n role=\"region\"\n aria-label=\"Selected contexts\"\n >\n <Carousel\n orientation={\"horizontal\"}\n className=\"al-w-full\"\n opts={{\n align: \"start\",\n slidesToScroll: \"auto\",\n }}\n >\n <CarouselContent>\n {/* Display attachments first */}\n <AttachmentsContext.Provider value={{ variant: \"inline\" }}>\n {attachments.files.map((attachment) => (\n <CarouselItem key={attachment.id}>\n <Attachment\n data={attachment}\n onRemove={() => attachments.remove(attachment.id)}\n className=\"al-bg-blue-50 al-px-3 al-py-1 al-rounded-md al-gap-2 al-w-64\"\n >\n <AttachmentPreview />\n <AttachmentRemove\n label={`Remove ${attachment.filename} file`}\n />\n </Attachment>\n </CarouselItem>\n ))}\n </AttachmentsContext.Provider>\n\n {/* Display selected options (Knowledge base items) */}\n {Object.entries(selectedOptions).map(([key, options]) =>\n options.map((optionId) => {\n // Find the option label in the current context\n const contextOption = contextOptions?.find(\n (opt) => opt.key === key,\n );\n const option =\n contextOption?.type === \"submenu\"\n ? contextOption.options?.find(\n (opt: { id: string; label: string }) =>\n opt.id === optionId,\n )\n : null;\n if (!option) return null;\n return (\n <CarouselItem key={optionId}>\n <Stack\n direction=\"row\"\n align=\"center\"\n className=\"al-bg-blue-50 al-px-3 al-py-1 al-rounded-md al-gap-2 al-w-64\"\n role=\"listitem\"\n >\n <IconBook2 className=\"al-h-6 al-w-6 al-flex-shrink-0 al-text-brand\" />\n <span className=\"al-text-sm al-truncate al-flex-1\">\n {option.label}\n </span>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className=\"al-p-0 al-h-4 al-w-4 al-ml-1 al-flex-shrink-0 al-text-gray-500\"\n onClick={() => onRemoveContext(optionId, key)}\n aria-label={`Remove ${option.label} context`}\n >\n <IconX aria-hidden={\"true\"} />\n </Button>\n </Stack>\n </CarouselItem>\n );\n }),\n )}\n\n {/* Display detected entities */}\n {entities.map((entity) => (\n <CarouselItem key={entity.name}>\n <EntityItem key={entity.name} entity={entity} />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious\n className={\"al-bg-white\"}\n size={\"xs\"}\n type=\"button\"\n title=\"Show previous\"\n />\n <CarouselNext\n className={\"al-bg-white\"}\n size={\"xs\"}\n type=\"button\"\n title=\"Show next\"\n />\n </Carousel>\n </div>\n\n {/* Context Value Dialog */}\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogContent\n className=\"al-max-w-2xl al-max-h-[50vh] al-overflow-y-hidden\"\n aria-describedby=\"context-content-description\"\n >\n <DialogHeader>\n <DialogTitle>\n {selectedContextKey && `Context: ${selectedContextKey}`}\n </DialogTitle>\n <DialogDescription id=\"context-content-description\">\n Content of the selected context file\n </DialogDescription>\n </DialogHeader>\n <div\n className=\"al-overflow-x-auto\"\n style={{ maxHeight: \"40%\", minHeight: \"85px\" }}\n >\n {selectedContextKey && (\n <CodeBlock\n language=\"json\"\n code={currentContext?.[selectedContextKey] as string}\n theme=\"dark\"\n editorTheme=\"tomorrow\"\n />\n )}\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n","import { useEffect } from \"react\";\nimport { IconBrandTelegram } from \"@tabler/icons-react\";\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputTextarea,\n PromptInputFooter,\n PromptInputTools,\n PromptInputButton,\n PromptInputHeader,\n PromptInputMessage,\n useOptionalPromptInputController,\n} from \"@altimateai/lego\";\nimport { useChatContext } from \"../../ChatProvider\";\nimport { CancelGenerationButton } from \"../cancelGenerationButton\";\nimport { useEntityDetection } from \"../../hooks/useEntityDetection\";\nimport { DetectedEntity, EntityType, ContextOption } from \"../../types\";\nimport { SelectedContexts } from \"../selectedContexts/SelectedContexts\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { updateContext } from \"../../store/chatSlice\";\n\ninterface QuestionFormProps {\n isLoading: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n components?: {\n questionFormLeftActions?: React.ReactNode;\n questionFormButtons?: (userInput: string, onAccept: (text: string) => void) => React.ReactNode;\n };\n initialMessage?: string;\n contextOptions?: ContextOption[];\n}\n\nexport const QuestionForm: React.FC<QuestionFormProps> = ({\n isLoading,\n placeholder = \"Ask anything, take any action...\",\n autoFocus = false,\n initialMessage: _initialMessage = \"\",\n components: componentsFromProps,\n contextOptions,\n}) => {\n const { currentSessionId, sessions, dispatch } = useChatContext();\n const { sendMessage } = useAgentChat();\n const { detectEntities } = useEntityDetection();\n const controller = useOptionalPromptInputController();\n\n const userInput = controller?.textInput.value || \"\";\n const currentContext = currentSessionId ? sessions[currentSessionId]?.context : {};\n\n // Check for unknown entities\n const entities =\n (currentSessionId && (sessions[currentSessionId]?.context?.entities as DetectedEntity[])) || [];\n const unknownEntities = entities.filter(entity => entity.selected_type === EntityType.UNKNOWN);\n const hasUnknownEntities = unknownEntities.length > 0;\n const canSubmitForm = !hasUnknownEntities;\n\n const handleSubmit = async (message: PromptInputMessage, e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!message.text.trim() || isLoading || !canSubmitForm) return;\n\n if (!currentSessionId) return;\n\n try {\n controller?.textInput.setInput(\"\");\n await sendMessage({\n message: message.text,\n files: message.files,\n });\n } catch (e) {\n console.log(e);\n }\n };\n\n // Trigger entity detection when user types\n useEffect(() => {\n if (userInput.trim().length > 2) {\n detectEntities(userInput.trim());\n }\n }, [userInput, detectEntities]);\n\n // Handler to remove context\n const handleRemoveContext = (id: string, key?: string) => {\n if (!currentSessionId || !key) return;\n\n const currentOptions = (currentContext?.[key] as string[]) || [];\n const updatedOptions = currentOptions.filter(optionId => optionId !== id);\n\n dispatch(\n updateContext({\n sessionId: currentSessionId,\n context: { [key]: updatedOptions },\n })\n );\n };\n\n return (\n <div className=\"al-w-full \">\n <PromptInput\n globalDrop\n multiple\n onSubmit={handleSubmit}\n className=\"al-shadow-lg al-rounded-2xl al-border al-border-gray-300 al-bg-white [&_[data-slot='input-group']]:!al-rounded-2xl [&_[data-slot='input-group']]:!al-ring-0 [&_[data-slot='input-group']]:!al-ring-offset-0 [&_*]:focus:!al-outline-none [&_*]:focus:!al-ring-0 [&_*]:focus:!al-ring-offset-0\"\n >\n <PromptInputHeader align={\"block-start\"}>\n <SelectedContexts contextOptions={contextOptions} onRemoveContext={handleRemoveContext} />\n </PromptInputHeader>\n <PromptInputBody className=\"al-w-full\">\n {/* Main textarea */}\n <PromptInputTextarea\n placeholder={placeholder}\n autoFocus={autoFocus}\n disabled={isLoading}\n className=\"al-px-4 al-pt-0 al-overflow-y-auto al-resize-none placeholder:al-italic placeholder:al-font-normal placeholder:al-text-sm placeholder:al-leading-5 placeholder:al-text-[#7A899E] focus:al-outline-none\"\n aria-label=\"Question input\"\n aria-required=\"true\"\n aria-invalid={false}\n />\n </PromptInputBody>\n\n {/* Bottom footer with all actions */}\n <PromptInputFooter className=\"al-w-full al-px-3 al-pb-2 al-pt-2\">\n <div className=\"al-flex al-items-center al-justify-between al-w-full al-gap-2\">\n {/* Left side: Left actions */}\n <div className=\"al-flex al-items-center al-gap-2 al-flex-1 al-min-w-0\">\n {/* Left actions slot (e.g., \"+ Add Datamate\") */}\n {componentsFromProps?.questionFormLeftActions && (\n <div className=\"al-flex al-items-center al-gap-2 al-flex-shrink-0\">\n {componentsFromProps.questionFormLeftActions}\n </div>\n )}\n </div>\n\n {/* Right side: Question form buttons + settings + submit/cancel (FIXED, never wraps) */}\n <PromptInputTools className=\"al-flex-shrink-0\">\n {/* Question form custom buttons (e.g., ImprovePromptButton with sparkles icon) */}\n {componentsFromProps?.questionFormButtons?.(userInput, (improvedPrompt: string) => {\n controller?.textInput.setInput(improvedPrompt);\n })}\n\n {/* Cancel or Send button */}\n {isLoading ? (\n <CancelGenerationButton />\n ) : (\n <PromptInputButton\n type=\"submit\"\n disabled={isLoading || !userInput.trim() || !canSubmitForm}\n className=\"!al-w-10 !al-h-10 al-min-h-6 al-rounded-md al-bg-[#247EFE] hover:al-bg-[#1e6ad9] disabled:al-opacity-50 disabled:al-cursor-not-allowed al-flex al-items-center al-justify-center al-flex-shrink-0\"\n aria-busy={isLoading}\n aria-label={\n isLoading\n ? \"Sending message...\"\n : hasUnknownEntities\n ? \"Cannot send - unknown entities need types selected\"\n : \"Send message\"\n }\n title={\n isLoading\n ? \"Cancel generation\"\n : hasUnknownEntities\n ? `Please select right type for ${unknownEntities.map(e => e.name).join(\", \")}`\n : \"Send message\"\n }\n >\n <IconBrandTelegram className=\"al-h-3 al-w-3 al-text-white\" />\n <span className=\"al-sr-only\">\n {isLoading ? \" message in progress\" : \" message\"}\n </span>\n </PromptInputButton>\n )}\n </PromptInputTools>\n </div>\n </PromptInputFooter>\n </PromptInput>\n\n {/* Screen reader hint */}\n <div className=\"al-sr-only\">Press Enter to send, Shift + Enter for new line</div>\n </div>\n );\n};\n","import React, {\n createContext,\n useContext,\n useEffect,\n useReducer,\n forwardRef,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport {\n chatReducer,\n initialState as chatInitialState,\n createSession,\n setCurrentSession,\n setSessions,\n resetSession,\n setLoadingState,\n} from \"./store/chatSlice\";\nimport {\n ChatbotProviderProps,\n ChatEventStatus,\n ChatSession,\n ChatState,\n LoadingState,\n} from \"./types\";\nimport { UnknownAction } from \"@reduxjs/toolkit\";\nimport { ChatbotV2 } from \"./components\";\nimport { PromptInputProvider } from \"@altimateai/lego\";\n\nexport interface ChatContextType extends ChatState {\n dispatch: React.Dispatch<UnknownAction>;\n}\n\nexport interface ChatProviderRef {\n resetSession: () => void;\n setUserInput: (text: string) => void;\n resetStatus: () => void;\n getSessionById: (_sessionId: string) => ChatSession | null;\n getSessionId: () => string | null;\n}\n\nexport const ChatContext = createContext<ChatContextType | undefined>(\n undefined,\n);\n\nexport const useChatContext = () => {\n const context = useContext(ChatContext);\n if (!context) {\n throw new Error(\"useChatContext must be used within a ChatProvider\");\n }\n return context;\n};\n\nexport const ChatProvider = forwardRef<ChatProviderRef, ChatbotProviderProps>(\n (\n {\n taskLabel,\n initialValidation,\n urls,\n disableContext,\n requestParams,\n components,\n helloMessage,\n assistantMeta,\n context,\n contextOptions,\n fileUploadProps,\n isMarkdownResponse,\n models,\n placeholder,\n autoFocus,\n classNames,\n sessions,\n currentSessionId,\n initialMessage,\n submitInitialMessageOnMount,\n questionFormLeftActions,\n refetchSession,\n chatboxStartPosition,\n helloMessageFooter,\n handleSavePrompt,\n showSavePromptButton,\n onEvent,\n },\n ref,\n ) => {\n const [state, dispatch] = useReducer(chatReducer, {\n ...chatInitialState,\n sessions: sessions || {},\n currentSessionId: currentSessionId || null,\n });\n\n // Ref to access PromptInputProvider's setInput function\n const setInputRef = useRef<((_text: string) => void) | undefined>();\n\n useImperativeHandle(ref, () => ({\n getSessionById: (sessionId: string) => {\n return state.sessions[sessionId];\n },\n getSessionId: () => {\n return state.currentSessionId;\n },\n // delete current session id and create a new session\n resetSession: () => {\n dispatch(resetSession());\n setTimeout(() => {\n dispatch(createSession({ context, models }));\n }, 0);\n },\n setUserInput: (text: string) => {\n if (state.currentSessionId && setInputRef.current) {\n setInputRef.current(text);\n }\n },\n resetStatus: () => {\n dispatch(\n setLoadingState({\n state: LoadingState.UNINITIALIZED,\n sessionId: state.currentSessionId,\n }),\n );\n },\n }));\n\n useEffect(() => {\n if (sessions && Object.keys(sessions || {}).length > 0) {\n dispatch(setSessions(sessions));\n }\n }, [sessions]);\n\n useEffect(() => {\n if (!currentSessionId) {\n dispatch(createSession({ context, models }));\n } else {\n dispatch(setCurrentSession(currentSessionId));\n }\n }, [currentSessionId, dispatch, context, models]);\n\n // Notify parent when session is created\n useEffect(() => {\n if (state.currentSessionId && onEvent) {\n onEvent({ type: \"session_created\", sessionId: state.currentSessionId });\n }\n }, [state.currentSessionId, onEvent]);\n\n // Notify parent when loading state changes\n useEffect(() => {\n if (onEvent && state.currentSessionId) {\n const statusMap: Record<LoadingState, ChatEventStatus> = {\n [LoadingState.UNINITIALIZED]: \"idle\",\n [LoadingState.LOADING]: \"pending\",\n [LoadingState.LOADED]: \"complete\",\n [LoadingState.ERROR]: \"error\",\n [LoadingState.CANCELLED]: \"cancelled\",\n };\n onEvent({\n type: \"status_change\",\n status: statusMap[state.loadingState],\n sessionId: state.currentSessionId,\n });\n }\n }, [state.loadingState, state.currentSessionId, onEvent]);\n\n return (\n <ChatContext.Provider\n value={{\n ...state,\n taskLabel,\n initialValidation,\n urls,\n dispatch,\n disableContext,\n requestParams,\n components,\n isMarkdownResponse,\n models,\n classNames,\n }}\n >\n <PromptInputProvider\n initialInput={initialMessage}\n setInputRef={setInputRef}\n >\n <ChatbotV2\n assistantMeta={assistantMeta}\n helloMessage={helloMessage}\n fileUploadProps={fileUploadProps}\n context={context}\n contextOptions={contextOptions}\n placeholder={placeholder}\n autoFocus={autoFocus}\n initialMessage={initialMessage}\n submitInitialMessageOnMount={submitInitialMessageOnMount}\n questionFormLeftActions={questionFormLeftActions}\n refetchSession={refetchSession}\n chatboxStartPosition={chatboxStartPosition}\n helloMessageFooter={helloMessageFooter}\n handleSavePrompt={handleSavePrompt}\n showSavePromptButton={showSavePromptButton}\n />\n </PromptInputProvider>\n </ChatContext.Provider>\n );\n },\n);\n\nChatProvider.displayName = \"ChatProvider\";\n","import { Spinner, Stack } from \"@altimateai/lego\";\nimport { ChatbotProps, ChatSession, sessionStatusSchema } from \"../../types\";\nimport { useEffect } from \"react\";\n\nconst RefetchSession = ({\n error,\n currentSession,\n refetchSession,\n}: {\n error: string | null;\n currentSession: ChatSession | null;\n refetchSession?: ChatbotProps[\"refetchSession\"];\n}) => {\n useEffect(() => {\n if (\n (!error && currentSession?.status !== sessionStatusSchema.enum.pending) ||\n !refetchSession\n ) {\n return;\n }\n let intervalId: NodeJS.Timeout;\n const startRefetching = () => {\n intervalId = setInterval(() => {\n refetchSession();\n }, 30000); // refetch every 30 seconds\n };\n\n if (currentSession?.status === sessionStatusSchema.enum.pending) {\n startRefetching();\n }\n\n return () => {\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [error, refetchSession, currentSession?.status]);\n\n if (currentSession?.status === sessionStatusSchema.enum.pending) {\n return (\n <Stack align=\"center\" role=\"alert\">\n <Spinner />\n Please wait until we process your request...\n </Stack>\n );\n }\n\n if (error) {\n return (\n <div\n className=\"al-text-red-500 al-p-4 al-rounded al-bg-red-50 al-mt-4\"\n role=\"alert\"\n >\n {error}\n </div>\n );\n }\n\n return null;\n};\n\nexport default RefetchSession;\n","import { FC, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { Card, NativeSelect, ScrollArea } from \"@altimateai/lego\";\nimport { Stack } from \"@altimateai/lego\";\nimport { ChatbotProps, LoadingState } from \"./types\";\nimport { useChatContext } from \"./ChatProvider\";\nimport {\n clearActions,\n setSelectedModel,\n updateContext,\n} from \"./store/chatSlice\";\nimport {\n ContextPanel,\n LoadingIndicator,\n MessageList,\n QuestionForm,\n StatusUpdates,\n} from \"./components\";\nimport { useAgentChat } from \"./hooks/useAgentChat\";\nimport { ApiHelper } from \"../api/index\";\nimport { TodoProgress } from \"./components/todoProgress\";\nimport { cn } from \"../../shared/utils\";\nimport RefetchSession from \"./components/refetchSession/RefetchSession\";\n\nexport const Chatbot: FC<ChatbotProps> = ({\n helloMessage,\n context,\n fileUploadProps,\n contextOptions,\n placeholder,\n autoFocus,\n initialMessage,\n submitInitialMessageOnMount,\n questionFormLeftActions,\n refetchSession,\n chatboxStartPosition = \"bottom\",\n helloMessageFooter,\n handleSavePrompt,\n showSavePromptButton = false,\n}) => {\n const {\n dispatch,\n currentSessionId,\n sessions,\n loadingState,\n error,\n currentActions,\n currentTodos = [],\n requestParams,\n urls,\n models,\n classNames,\n components,\n } = useChatContext();\n const { sendMessage } = useAgentChat();\n\n // Add refs for scroll management\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const lastMessageRef = useRef<HTMLDivElement>(null);\n const currentSession = currentSessionId ? sessions[currentSessionId] : null;\n // Guard to prevent multiple initial message submissions (fixes infinite loop with V2 verification)\n const initialMessageSubmittedRef = useRef(false);\n\n // Reset the guard when session changes to a fresh session (no messages),\n // so that subsequent \"Analyse the query\" clicks can auto-submit again\n useEffect(() => {\n if (currentSessionId && !currentSession?.messages?.length) {\n initialMessageSubmittedRef.current = false;\n }\n }, [currentSessionId, currentSession?.messages?.length]);\n\n // Add ref to track if we were at bottom before update\n const wasAtBottomRef = useRef(true);\n\n useEffect(() => {\n // @ts-ignore\n ApiHelper.get = async (\n url: string,\n data: Record<string, unknown>,\n request: RequestInit = {},\n ) => {\n console.log(\"api helper get\", url, data, request);\n const queryParams = new URLSearchParams();\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n const queryString = queryParams.toString();\n const fullUrl = `${urls?.origin || \"https://api.getaltimate.com\"}${url}${\n queryString ? `?${queryString}` : \"\"\n }`;\n const response = await fetch(fullUrl, {\n ...requestParams,\n method: \"GET\",\n headers: {\n ...requestParams?.headers,\n \"Content-Type\": \"application/json\",\n },\n });\n if (!response.ok) {\n const json = (await response.json()) || {};\n throw new Error(json.detail?.detail || \"Failed to fetch\");\n }\n return response.json();\n };\n // @ts-ignore\n ApiHelper.post = async (\n url: string,\n data: Record<string, unknown>,\n request: RequestInit = {},\n ) => {\n console.log(\"api helper post\", url, data, request);\n const response = await fetch(\n `${urls?.origin || \"https://api.getaltimate.com\"}/${url}`,\n {\n ...requestParams,\n method: \"POST\",\n body: JSON.stringify(data),\n headers: {\n ...requestParams?.headers,\n \"Content-Type\": \"application/json\",\n },\n },\n );\n if (!response.ok) {\n const json = (await response.json()) || {};\n throw new Error(json.detail?.detail || \"Failed to fetch\");\n }\n return response.json();\n };\n }, [requestParams, urls?.origin]);\n\n useEffect(() => {\n if (currentSessionId) {\n dispatch(\n updateContext({ sessionId: currentSessionId, context: context || {} }),\n );\n }\n }, [currentSessionId, dispatch, context]);\n\n // Reset actions when loading state changes to loaded\n useEffect(() => {\n if (loadingState === LoadingState.LOADED) {\n dispatch(clearActions());\n }\n }, [loadingState, dispatch]);\n\n const hasMessages = !!currentSession?.messages?.length;\n const shouldShowMessagesContent =\n hasMessages || loadingState === LoadingState.LOADING || !!error;\n\n // Guard against showing duplicate StatusUpdates - if the last message already has actions\n // embedded, don't also show them via currentActions (prevents double rendering during streaming)\n const lastMessage =\n currentSession?.messages?.[currentSession.messages.length - 1];\n const lastMessageHasActions =\n lastMessage?.role === \"assistant\" &&\n (lastMessage?.actions?.length ?? 0) > 0;\n\n // Update isScrolledToBottom to be more reliable\n const isScrolledToBottom = () => {\n const container = messagesContainerRef.current;\n if (!container) return false;\n\n const threshold = 50;\n return (\n container.scrollHeight - container.scrollTop - container.clientHeight <\n threshold\n );\n };\n\n // Add scroll event listener to track scroll position\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n wasAtBottomRef.current = isScrolledToBottom();\n };\n\n container.addEventListener(\"scroll\", handleScroll);\n return () => container.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n // Modify scroll effect to use wasAtBottom state\n useEffect(() => {\n // Only scroll if we were at bottom before new content\n if (wasAtBottomRef.current) {\n const container = messagesContainerRef.current;\n if (container) {\n // Use requestAnimationFrame to ensure DOM has updated\n requestAnimationFrame(() => {\n container.scrollTop = container.scrollHeight;\n });\n }\n }\n }, [currentSession?.messages, currentActions]);\n\n // Add separate effect for loading and error states\n useEffect(() => {\n if (loadingState === LoadingState.LOADING || error) {\n const container = messagesContainerRef.current;\n if (container && wasAtBottomRef.current) {\n requestAnimationFrame(() => {\n container.scrollTop = container.scrollHeight;\n });\n }\n }\n }, [loadingState, error]);\n\n // Handle model selection\n const handleModelChange = useCallback(\n (model: string) => {\n if (currentSessionId) {\n dispatch(setSelectedModel({ sessionId: currentSessionId, model }));\n }\n },\n [currentSessionId, dispatch],\n );\n\n const handleSubmitQuestion = useCallback(\n async (message: string) => {\n if (!currentSessionId) return;\n\n try {\n await sendMessage({ message });\n } catch (e) {\n console.log(e);\n }\n },\n [currentSessionId, sendMessage],\n );\n\n // Auto-submit initial message on mount if enabled\n useEffect(() => {\n if (\n submitInitialMessageOnMount &&\n initialMessage &&\n currentSessionId &&\n !hasMessages &&\n !initialMessageSubmittedRef.current\n ) {\n initialMessageSubmittedRef.current = true;\n handleSubmitQuestion(initialMessage);\n }\n }, [\n submitInitialMessageOnMount,\n currentSessionId,\n initialMessage,\n hasMessages,\n handleSubmitQuestion,\n ]);\n\n // Create memoized array combining custom and default actions\n const allActions = useMemo(() => {\n const actions = [];\n\n // Add custom actions from props\n if (questionFormLeftActions) {\n actions.push(...questionFormLeftActions);\n }\n\n // Add ContextPanel\n actions.push(\n <ContextPanel\n fileUploadProps={fileUploadProps}\n contextOptions={contextOptions}\n />,\n );\n\n // Add Model selector if available\n if (models && models.length > 0) {\n actions.push(\n <NativeSelect\n aria-label=\"Model selection\"\n options={models}\n value={currentSession?.selectedModel || undefined}\n onChange={handleModelChange}\n placeholder=\"Select model\"\n variant=\"outline\"\n size=\"sm\"\n className=\"al-w-48\"\n />,\n );\n }\n\n return actions;\n }, [\n questionFormLeftActions,\n fileUploadProps,\n contextOptions,\n models,\n currentSession?.selectedModel,\n handleModelChange,\n ]);\n\n const justificationClass =\n !hasMessages && chatboxStartPosition === \"middle\"\n ? \"al-justify-center\"\n : !hasMessages && chatboxStartPosition === \"bottom\"\n ? \"al-justify-end\"\n : \"\";\n\n return (\n <Card\n className={cn(\n \"al-w-full al-h-full al-max-w-5xl al-flex al-flex-col\",\n classNames?.chatbot,\n )}\n role=\"region\"\n aria-label=\"Chat interface\"\n data-session-id={currentSessionId}\n >\n <ScrollArea\n ref={messagesContainerRef}\n className={cn(\n \"al-w-full\",\n \"al-transition-[flex-grow] al-duration-300 ease-in-out\",\n // added for fixing horizontal scroll issue due to display:table inside scrollarea\n \"[&_[aria-label='scrollable-content']>div]:!al-block\",\n {\n \"al-p-4\": shouldShowMessagesContent,\n \"al-flex-grow\": hasMessages,\n \"al-flex-grow-0\": !hasMessages,\n },\n classNames?.chatMessages,\n )}\n role=\"region\"\n aria-label=\"Chat messages\"\n >\n <div\n className={cn(\n \"al-w-full al-pb-2\",\n classNames?.chatbotScrollingContent,\n )}\n // ref={contentRef}\n >\n <Stack direction=\"column\" gap=\"5xl\">\n {hasMessages && (\n <MessageList\n messages={currentSession?.messages || []}\n handleSavePrompt={handleSavePrompt}\n showSavePromptButton={showSavePromptButton}\n />\n )}\n {loadingState === LoadingState.LOADING && (\n <>\n {currentActions.length > 0 && !lastMessageHasActions && (\n <div className=\"al-mt-2\">\n <StatusUpdates\n actions={currentActions}\n isComplete={false}\n aria-live=\"polite\"\n heading=\"\"\n />\n </div>\n )}\n {currentTodos.length > 0 && (\n <div className=\"al-mt-2\">\n <TodoProgress todos={currentTodos} />\n </div>\n )}\n {!currentActions.length && !currentTodos.length ? (\n <LoadingIndicator aria-label=\"Loading response\" />\n ) : null}\n </>\n )}\n <RefetchSession\n error={error}\n currentSession={currentSession}\n refetchSession={refetchSession}\n />\n </Stack>\n {/* Add an empty div as last element for scroll detection */}\n <div ref={lastMessageRef} />\n </div>\n </ScrollArea>\n <div\n className={cn(\n \"al-p-4 al-pb-0 al-transition-[flex-grow] al-duration-300 ease-in-out\",\n \"al-flex al-flex-col\",\n {\n \"al-flex-grow\": !hasMessages,\n \"al-flex-grow-0\": hasMessages,\n },\n justificationClass,\n classNames?.questionForm,\n )}\n role=\"region\"\n aria-label=\"Message input\"\n >\n <Stack direction=\"column\" gap=\"none\">\n {helloMessage && !hasMessages && (\n <div className=\"al-mb-4\" role=\"status\">\n {helloMessage}\n </div>\n )}\n <QuestionForm\n isLoading={loadingState === LoadingState.LOADING}\n placeholder={placeholder}\n autoFocus={autoFocus}\n // if submitted on mount, dont set in question form input\n initialMessage={\n submitInitialMessageOnMount ? undefined : initialMessage\n }\n contextOptions={contextOptions}\n components={{\n questionFormLeftActions: (\n <Stack align=\"center\">\n {allActions.map((action, index) => (\n <div key={index}>{action}</div>\n ))}\n </Stack>\n ),\n questionFormButtons: components?.questionFormButtons,\n }}\n />\n {helloMessageFooter && !hasMessages && (\n <div className=\"al-mt-4\" role=\"status\">\n {helloMessageFooter}\n </div>\n )}\n </Stack>\n </div>\n </Card>\n );\n};\n","import { Button, ButtonProps } from \"@altimateai/lego\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { cn } from \"../../../../shared/utils\";\n\nconst ChatTriggerLink = ({\n text,\n buttonProps,\n}: {\n text: string;\n buttonProps?: ButtonProps;\n}) => {\n const { sendMessage } = useAgentChat();\n\n return (\n <Button\n variant=\"secondary\"\n onClick={() => sendMessage({ message: text })}\n color=\"link\"\n key={text}\n {...buttonProps}\n className={cn(\n \"al-border al-border-primary-500 al-rounded-full al-p-2 !al-justify-start al-text-left al-h-auto\",\n buttonProps?.className,\n )}\n style={{ whiteSpace: \"normal\", ...buttonProps?.style }}\n >\n {text}\n </Button>\n );\n};\n\nexport default ChatTriggerLink;\n"],"names":["LoadingState","EntityType","sessionStatusSchema","z","todoItemSchema","agentStreamResponseSchema","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","Error","validate","uuid","byteToHex","stringify","arr","offset","arguments","TypeError","v4","options","buf","rnds","i","addOrUpdateAction","actions","action","existingAction","a","initialState","chatSlice","createSlice","state","sessionId","uuidv4","message","session","currentMessageIndex","m","messageId","context","datamates","entities","entityName","newType","updatedEntities","entity","currentSession","createSession","setSelectedModel","setCurrentSession","addMessage","updateMessageFeedback","clearHistory","deleteMessage","setLoadingState","setError","setAbortController","addAction","clearActions","setTodos","clearTodos","updateContext","clearContext","updateDatamateInSession","updateEntities","updateEntityType","setSessions","resetSession","chatReducer","SvgThinking","props","SvgDownload","SvgArrowRight","SvgDatabase","SvgGitMerge","SvgArrowLeft","Icon","icon","className","rest","CodeIcon","DeleteIcon","RefreshIcon","ChevronUpIcon","ChevronDownIcon","EditIcon","Artifacts","artifacts","selectedArtifact","setSelectedArtifact","useState","showAll","setShowAll","visibleArtifacts","hasMore","handleDownloadAll","zip","JSZip","artifact","fileName","content","url","window","link","document","error","console","Stack","Button","DownloadIcon","Badge","Dialog","DialogContent","DialogHeader","DialogTitle","CodeBlock","useQuery","queryFn","enabled","loading","setLoading","data","setData","fetchData","useCallback","response","useEffect","refetch","useMutation","onSuccess","mutate","args","ApiHelper","_url","_data","_request","CancelGenerationButton","dispatch","abortController","currentSessionId","sessions","useChatContext","handleCancel","currentContext","IconPlayerStopFilled","CoachFormInput","taskLabel","onCancel","register","handleSubmit","errors","isSubmitting","useForm","zodResolver","coachFormSchema","values","onSubmit","Textarea","LoadingButton","AddLearningForm","onClose","extra","coachAiResponse","setCoachAiResponse","aiLearningEditable","setAiLearningEditable","makeAiLearningEditable","makeAiLearningNonEditable","saveAiLearning","isSaving","handleSave","Alert","Card","CardContent","e","CardFooter","ProjectGovernorCheckTypes","ProjectGovernorAllowedFiles","ProjectGovernorCheckSchema","Object","checkFormSchema","ChecksInput","isValid","watch","setValue","handleKeyDown","input","Math","res","FormItem","FormFeedback","Label","NativeSelect","value","ProjectGovernorForm","projectGovernorValidateResponse","setProjectGovernorValidateResponse","type","ProjectGovernanceCheck","check","isInEditMode","setIsInEditMode","isSelected","URLSearchParams","reset","toast","isDeleting","checkName","onEditClick","onEditCancel","CardHeader","CardTitle","Input","IconButton","Popconfirm","ProjectGovernorDisplay","checks","Spinner","Sheet","SheetTrigger","SheetContent","SheetHeader","SheetTitle","ContentCategory","PersonalizationScope","processAgentStream","reader","isMarkdownResponse","callbacks","decoder","TextDecoder","citations","todos","stepHeading","isReading","markdownBuffer","finalContent","finalArtifacts","finalInteraction","finalConfidenceStr","incompleteLineBuffer","actionsList","newAction","existingIndex","updated","handleJSONStr","jsonStr","msg","JSON","Date","toolContent","toolSummary","t","summaryAction","done","sseMatch","chunk","fullChunk","lines","completeLines","Boolean","line","finalResponse","streamResponseToAgentMessages","streamResponse","messages","processExistingConversation","conversationTurns","turn","undefined","processAgentMessageContent","finalHeading","processPlaygroundSessionTurns","turns","status","index","timestamp","processed","sendMessageAndProcessStream","headers","signal","fetch","createEmptyAccumulatedData","MarkdownStreamTransport","DefaultChatTransport","abortSignal","latestUserMessage","messageText","p","freshBody","requestBody","stream","capturedAbortSignal","emitDataForThisRequest","accumulatedContent","hasStarted","hasEnded","ReadableStream","controller","LegacyBackendTransport","files","file","base64Content","legacyRequestBody","buffer","accumulatedActions","accumulatedArtifacts","accumulatedCitations","accumulatedTodos","accumulatedInteraction","accumulatedHeading","accumulatedConfidence","trimmed","textAction","Array","toolName","toolCallId","toolInput","extractTextFromParts","parts","toV1ChatResponse","accData","fromV1ChatMessage","fromV1ChatMessages","extractAccumulatedDataFromV1","useAgentChat","initialValidation","urls","requestParams","accumulatedDataRef","useRef","pendingRequestRef","dispatchedActionsCountRef","lastDispatchedContentLengthRef","streamingMessageIdRef","currentRequestIdRef","callbackRequestIdRef","dispatchRef","currentSessionIdRef","handleTransportData","current","currentDispatch","newActions","contentLenDiff","apiUrl","headersRecord","useMemo","Headers","sessionDataRef","getBody","body","transport","setMessages","sdkSendMessage","sdkStop","sdkRegenerate","useChat","err","isAbortError","String","latestMessagesRef","createAttachmentsFromContext","attachmentsData","loadV1Session","v1Messages","uiMessages","lastAssistant","getV1Messages","isLastAssistant","updateContextAndSendMessage","sendMessage","isResponseToPrompt","newContext","dontAddUserMessage","attachments","AbortController","handleAbort","hasError","responsePromise","Promise","resolve","reject","v2Response","finalId","id","isAlreadyStreamed","streamResult","errorMessage","HelloMessage","textValue","setTextValue","TeradataToSnowflakeMigratorDisplay","isStarted","setIsStarted","handleStart","handleBack","validateRequest","Typography","ArrowRightIcon","DatabaseIcon","GitMergeIcon","ArrowLeftIcon","ChatProvider","TaskLabels","AlertManagerDisplay","contextOptions","TeamMatesConfig","BotIcon","TeamMateAvailability","CoachForm","teammate","FormComponent","CoachAI","showCoachForm","setShowCoachForm","ThinkingIcon","ContextPanel","children","fileUploadProps","panelId","useId","listboxId","disableContext","loadingState","handleOptionSelect","option","key","getSelectedOptions","DropdownMenu","DropdownMenuTrigger","IconPlus","DropdownMenuContent","PromptInputActionAddAttachments","contextOption","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","DropdownMenuItem","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","IconSquareCheckFilled","IconSquare","RegenerateButton","handleRegenerate","currentIndex","lastUserMessage","Tooltip","IconRefresh","ChatLastMessageActions","handleCopy","navigator","IconCopy","useFeedback","submitFeedback","feedback","feedbackPath","feedbackUrl","ChatFeedbackActions","components","showComment","setShowComment","comment","setComment","selectedRating","setSelectedRating","setIsSubmitting","handleRatingClick","rating","handleSubmitFeedback","IconThumbUp","IconThumbDown","validateEmail","email","emailRegex","EmailDialog","open","onSendEmail","isLoading","emails","setEmails","handleValidateEmail","handleSendEmail","validEmails","handleClose","validEmailCount","hasInvalidEmails","TagsInput","next","prev","TagsInputLabel","TagsInputList","TagsInputItem","TagsInputInput","TagsInputClear","DialogFooter","ShareMessage","messageContent","showEmailDialog","setShowEmailDialog","isEmailing","setIsEmailing","payload","IconShare3","DownloadMessage","isDownloading","setIsDownloading","handleDownloadPdf","endpoint","blob","filename","IconDownload","ChatMessageActions","isLastMessage","InteractionPrompt","interaction","React","selectedValues","setSelectedValues","formState","setFormState","renderInput","choice","Checkbox","checked","v","Markdown","LoadingIndicator","cn","inputs","twMerge","clsx","getIconComponentForAction","lowerContent","IconSearch","IconMail","IconCode","IconDatabase","IconBrain","renderContentWithURLPills","urlRegex","part","hostname","URL","StatusUpdates","isComplete","heading","infoActions","analysisActions","isOpen","setIsOpen","ChainOfThought","ChainOfThoughtHeader","ChainOfThoughtContent","isActive","hasRichContent","IconComponent","ChainOfThoughtStep","IconLoader2","Citations","frontEndUrl","text","sources","citation","InlineCitation","InlineCitationText","InlineCitationCard","InlineCitationCardTrigger","InlineCitationCardBody","InlineCitationCarousel","InlineCitationCarouselHeader","InlineCitationCarouselPrev","InlineCitationCarouselIndex","InlineCitationCarouselNext","InlineCitationCarouselContent","InlineCitationCarouselItem","InlineCitationSource","Followup","handleSuggestionClick","suggestion","Suggestions","question","Suggestion","TodoProgress","completedCount","todo","totalCount","Queue","QueueSection","QueueSectionTrigger","QueueSectionLabel","IconChecklist","QueueSectionContent","QueueList","QueueItem","QueueItemIndicator","QueueItemContent","getAttachmentIcon","attachment","IconBook2","fileType","IconFileTypePdf","IconFile","formatFileSize","bytes","AttachmentList","sortedAttachments","b","MessageItem","isFirstMessage","handleSavePrompt","showSavePromptButton","isAssistant","classNames","Message","IconDeviceFloppy","MessageContent","MessageList","emptyStateContent","Conversation","ConversationEmptyState","EntityDetectionService","request","clearTimeout","setTimeout","result","debounceDelay","useEntityDetection","entityServiceRef","sessionsRef","detectEntities","existingEntities","previouslyDetectedEntities","existingEntityMap","Map","entitiesWithSelectedType","entityTypeOptions","l","EntityItem","isUnknown","handleTypeChange","Combobox","SelectedContexts","onRemoveContext","selectedContextKey","isDialogOpen","setIsDialogOpen","getSelectedOptionsFromContext","selectedOptions","usePromptInputAttachments","hasItems","Carousel","CarouselContent","AttachmentsContext","CarouselItem","Attachment","AttachmentPreview","AttachmentRemove","optionId","opt","IconX","CarouselPrevious","CarouselNext","DialogDescription","QuestionForm","placeholder","autoFocus","_initialMessage","componentsFromProps","useOptionalPromptInputController","userInput","unknownEntities","hasUnknownEntities","canSubmitForm","handleRemoveContext","currentOptions","updatedOptions","PromptInput","PromptInputHeader","PromptInputBody","PromptInputTextarea","PromptInputFooter","PromptInputTools","improvedPrompt","PromptInputButton","IconBrandTelegram","ChatContext","createContext","useContext","forwardRef","helloMessage","assistantMeta","models","initialMessage","submitInitialMessageOnMount","questionFormLeftActions","refetchSession","chatboxStartPosition","helloMessageFooter","onEvent","ref","useReducer","chatInitialState","setInputRef","useImperativeHandle","statusMap","PromptInputProvider","ChatbotV2","RefetchSession","intervalId","startRefetching","setInterval","clearInterval","Chatbot","currentActions","currentTodos","messagesContainerRef","lastMessageRef","initialMessageSubmittedRef","wasAtBottomRef","queryParams","queryString","fullUrl","json","hasMessages","shouldShowMessagesContent","lastMessage","lastMessageHasActions","isScrolledToBottom","container","threshold","handleScroll","requestAnimationFrame","handleModelChange","model","handleSubmitQuestion","allActions","justificationClass","ScrollArea","ChatTriggerLink","buttonProps"],"mappings":"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"}
|