@red-hat-developer-hub/backstage-plugin-lightspeed 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +59 -0
- package/dist/alpha/LightspeedFAB.esm.js +69 -0
- package/dist/alpha/LightspeedFAB.esm.js.map +1 -0
- package/dist/alpha/LightspeedProvider.esm.js +6 -0
- package/dist/alpha/LightspeedProvider.esm.js.map +1 -0
- package/dist/alpha.d.ts +170 -1
- package/dist/alpha.esm.js +97 -1
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api/LightspeedApiClient.esm.js +19 -0
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/NotebooksApiClient.esm.js +72 -0
- package/dist/api/NotebooksApiClient.esm.js.map +1 -0
- package/dist/api/api.esm.js.map +1 -1
- package/dist/api/notebooksApi.esm.js +10 -0
- package/dist/api/notebooksApi.esm.js.map +1 -0
- package/dist/components/DeleteModal.esm.js +2 -0
- package/dist/components/DeleteModal.esm.js.map +1 -1
- package/dist/components/LightSpeedChat.esm.js +714 -66
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBox.esm.js +18 -4
- package/dist/components/LightspeedChatBox.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +59 -50
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedChatContainer.esm.js +26 -2
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerProvider.esm.js +12 -157
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
- package/dist/components/LightspeedFAB.esm.js +5 -4
- package/dist/components/LightspeedFAB.esm.js.map +1 -1
- package/dist/components/McpServersSettings.esm.js +932 -0
- package/dist/components/McpServersSettings.esm.js.map +1 -0
- package/dist/components/McpSettingsIcon.esm.js +26 -0
- package/dist/components/McpSettingsIcon.esm.js.map +1 -0
- package/dist/components/PermissionRequiredState.esm.js +18 -22
- package/dist/components/PermissionRequiredState.esm.js.map +1 -1
- package/dist/components/RenameConversationModal.esm.js +2 -2
- package/dist/components/RenameConversationModal.esm.js.map +1 -1
- package/dist/components/ToolCallContent.esm.js +14 -4
- package/dist/components/ToolCallContent.esm.js.map +1 -1
- package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
- package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookCard.esm.js +96 -0
- package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
- package/dist/components/notebooks/NotebooksTab.esm.js +61 -0
- package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
- package/dist/components/notebooks/RenameNotebookModal.esm.js +187 -0
- package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -0
- package/dist/const.esm.js +3 -1
- package/dist/const.esm.js.map +1 -1
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +15 -0
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -0
- package/dist/hooks/notebooks/useNotebookSessions.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -0
- package/dist/hooks/notebooks/useRenameNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -0
- package/dist/hooks/useConversationMessages.esm.js +136 -36
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useConversations.esm.js +6 -0
- package/dist/hooks/useConversations.esm.js.map +1 -1
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
- package/dist/hooks/useLightspeedProviderState.esm.js +205 -0
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
- package/dist/hooks/useStopConversation.esm.js +18 -0
- package/dist/hooks/useStopConversation.esm.js.map +1 -0
- package/dist/hooks/useWelcomePrompts.esm.js +2 -2
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/index.d.ts +31 -31
- package/dist/plugin.esm.js +10 -0
- package/dist/plugin.esm.js.map +1 -1
- package/dist/translations/de.esm.js +78 -0
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +78 -0
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +64 -1
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/it.esm.js +66 -1
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js +66 -1
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js +65 -1
- package/dist/translations/ref.esm.js.map +1 -1
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/formatToolResponseForMarkdown.esm.js +46 -0
- package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
- package/dist/utils/lightspeed-chatbox-utils.esm.js +7 -3
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
- package/dist/utils/notebooks-utils.esm.js +25 -0
- package/dist/utils/notebooks-utils.esm.js.map +1 -0
- package/package.json +20 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightSpeedChat.esm.js","sources":["../../src/components/LightSpeedChat.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ChangeEvent,\n MouseEvent,\n Ref,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n FileRejection,\n type DropEvent as ReactDropzoneDropEvent,\n} from 'react-dropzone';\n\nimport { makeStyles } from '@material-ui/core';\nimport Divider from '@mui/material/Divider';\nimport {\n Chatbot,\n ChatbotAlert,\n ChatbotContent,\n ChatbotDisplayMode,\n ChatbotFooter,\n ChatbotFootnote,\n ChatbotHeader,\n ChatbotHeaderMain,\n ChatbotHeaderMenu,\n ChatbotHeaderTitle,\n FileDropZone,\n MessageBar,\n MessageProps,\n} from '@patternfly/chatbot';\nimport ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';\nimport {\n DropdownItem,\n MenuToggle,\n MenuToggleElement,\n Select,\n SelectList,\n SelectOption,\n Title,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n PlusIcon,\n SearchIcon,\n SortAmountDownAltIcon,\n SortAmountDownIcon,\n} from '@patternfly/react-icons';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { supportedFileTypes, TEMP_CONVERSATION_ID } from '../const';\nimport {\n useBackstageUserIdentity,\n useConversationMessages,\n useConversations,\n useIsMobile,\n useLastOpenedConversation,\n useLightspeedDeletePermission,\n usePinnedChatsSettings,\n useSortSettings,\n} from '../hooks';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useLightspeedUpdatePermission } from '../hooks/useLightspeedUpdatePermission';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useWelcomePrompts } from '../hooks/useWelcomePrompts';\nimport { ConversationSummary } from '../types';\nimport { getAttachments } from '../utils/attachment-utils';\nimport {\n getCategorizeMessages,\n getFootnoteProps,\n SortOption,\n} from '../utils/lightspeed-chatbox-utils';\nimport Attachment from './Attachment';\nimport { useFileAttachmentContext } from './AttachmentContext';\nimport { DeleteModal } from './DeleteModal';\nimport FilePreview from './FilePreview';\nimport { LightspeedChatBox } from './LightspeedChatBox';\nimport { LightspeedChatBoxHeader } from './LightspeedChatBoxHeader';\nimport { RenameConversationModal } from './RenameConversationModal';\n\nconst useStyles = makeStyles(theme => ({\n body: {\n // remove default margin and padding from common elements\n '& h1, & h2, & h3, & h4, & h5, & h6, & p, & ul, & ol, & li': {\n margin: 0,\n padding: 0,\n },\n },\n header: {\n padding: `${theme.spacing(3)}px !important`,\n },\n errorContainer: {\n padding: theme.spacing(3),\n },\n headerMenu: {\n // align hamburger icon with title\n '& .pf-v6-c-button': {\n display: 'flex',\n alignItems: 'center',\n },\n },\n headerTitle: {\n justifyContent: 'left !important',\n },\n footer: {\n '&>.pf-chatbot__footer-container': {\n width: '95% !important',\n maxWidth: 'unset !important',\n },\n },\n sortDropdown: {\n padding: 0,\n margin: 0,\n },\n}));\n\ntype LightspeedChatProps = {\n selectedModel: string;\n topicRestrictionEnabled: boolean;\n selectedProvider: string;\n userName?: string;\n avatar?: string;\n profileLoading: boolean;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n};\n\nexport const LightspeedChat = ({\n selectedModel,\n topicRestrictionEnabled,\n selectedProvider,\n userName,\n avatar,\n profileLoading,\n handleSelectedModel,\n models,\n}: LightspeedChatProps) => {\n const isMobile = useIsMobile();\n const classes = useStyles();\n const { t } = useTranslation();\n const user = useBackstageUserIdentity();\n const [filterValue, setFilterValue] = useState<string>('');\n const [announcement, setAnnouncement] = useState<string>('');\n const [conversationId, setConversationId] = useState<string>('');\n const [newChatCreated, setNewChatCreated] = useState<boolean>(false);\n const [isSendButtonDisabled, setIsSendButtonDisabled] =\n useState<boolean>(false);\n const [targetConversationId, setTargetConversationId] = useState<string>('');\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [isSortSelectOpen, setIsSortSelectOpen] = useState<boolean>(false);\n const { isReady, lastOpenedId, setLastOpenedId, clearLastOpenedId } =\n useLastOpenedConversation(user);\n const {\n displayMode,\n setDisplayMode,\n currentConversationId: routeConversationId,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n } = useLightspeedDrawerContext();\n const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;\n const [isChatHistoryDrawerOpen, setIsChatHistoryDrawerOpen] =\n useState<boolean>(!isMobile && isFullscreenMode);\n\n // Open the chat history drawer when entering fullscreen mode on desktop\n useEffect(() => {\n if (!isMobile && isFullscreenMode) {\n setIsChatHistoryDrawerOpen(true);\n }\n }, [isMobile, isFullscreenMode]);\n\n const {\n isPinningChatsEnabled,\n pinnedChats,\n handlePinningChatsToggle,\n pinChat,\n unpinChat,\n } = usePinnedChatsSettings(user);\n\n const { selectedSort, handleSortChange } = useSortSettings(user);\n\n const {\n uploadError,\n showAlert,\n fileContents,\n setShowAlert,\n setFileContents,\n handleFileUpload,\n setUploadError,\n } = useFileAttachmentContext();\n\n // Sync conversationId with lastOpenedId whenever lastOpenedId changes\n useEffect(() => {\n if (isReady && lastOpenedId !== null) {\n setConversationId(lastOpenedId);\n }\n }, [lastOpenedId, isReady]);\n\n const queryClient = useQueryClient();\n\n const {\n data: conversations = [],\n isLoading,\n isRefetching,\n } = useConversations();\n\n const { allowed: hasDeleteAccess } = useLightspeedDeletePermission();\n const { allowed: hasUpdateAccess } = useLightspeedUpdatePermission();\n const samplePrompts = useWelcomePrompts();\n useEffect(() => {\n if (user && lastOpenedId === null && isReady) {\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n }\n }, [user, isReady, lastOpenedId, setConversationId]);\n\n useEffect(() => {\n // Clear last opened conversationId when there are no conversations.\n if (\n !isLoading &&\n !isRefetching &&\n conversations.length === 0 &&\n lastOpenedId\n ) {\n clearLastOpenedId();\n }\n }, [isLoading, isRefetching, conversations, lastOpenedId, clearLastOpenedId]);\n\n useEffect(() => {\n if (\n !isLoading &&\n !isRefetching &&\n routeConversationId &&\n isFullscreenMode\n ) {\n const conversationExists = conversations.some(\n (c: ConversationSummary) => c.conversation_id === routeConversationId,\n );\n if (!conversationExists) {\n // Conversation from route doesn't exist, start a new chat\n setConversationId(TEMP_CONVERSATION_ID);\n setCurrentConversationId(undefined);\n setNewChatCreated(true);\n } else if (conversationId !== routeConversationId) {\n setConversationId(routeConversationId);\n }\n }\n }, [\n isLoading,\n isRefetching,\n routeConversationId,\n conversations,\n displayMode,\n conversationId,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n useEffect(() => {\n // Update last opened conversation whenever `conversationId` changes\n if (conversationId) {\n setLastOpenedId(conversationId);\n }\n }, [conversationId, setLastOpenedId]);\n\n const onStart = (conv_id: string) => {\n setConversationId(conv_id);\n setCurrentConversationId(conv_id);\n };\n\n const onComplete = (message: string) => {\n setIsSendButtonDisabled(false);\n setAnnouncement(`Message from Bot: ${message}`);\n queryClient.invalidateQueries({\n queryKey: ['conversations'],\n });\n queryClient.invalidateQueries({\n queryKey: ['conversationMessages', conversationId],\n });\n setNewChatCreated(false);\n };\n\n const { conversationMessages, handleInputPrompt, scrollToBottomRef } =\n useConversationMessages(\n conversationId,\n userName,\n selectedModel,\n selectedProvider,\n avatar,\n onComplete,\n onStart,\n );\n\n const [messages, setMessages] =\n useState<MessageProps[]>(conversationMessages);\n\n const sendMessage = (message: string | number) => {\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setNewChatCreated(false);\n }\n setAnnouncement(\n t('conversation.announcement.userMessage' as any, {\n prompt: message.toString(),\n }),\n );\n handleInputPrompt(message.toString(), getAttachments(fileContents));\n setIsSendButtonDisabled(true);\n setFileContents([]);\n setDraftMessage('');\n };\n\n const onNewChat = useCallback(() => {\n (async () => {\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setMessages([]);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n if (!isFullscreenMode) {\n setIsChatHistoryDrawerOpen(false);\n }\n }\n })();\n }, [\n conversationId,\n setFileContents,\n setUploadError,\n setDraftMessage,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n const openDeleteModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsDeleteModalOpen(true);\n };\n\n const openChatRenameModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsRenameModalOpen(true);\n };\n\n const handleDeleteConversation = useCallback(() => {\n if (targetConversationId === lastOpenedId) {\n onNewChat();\n clearLastOpenedId();\n }\n setIsDeleteModalOpen(false);\n }, [clearLastOpenedId, lastOpenedId, onNewChat, targetConversationId]);\n\n const additionalMessageProps = useCallback(\n (conversationSummary: ConversationSummary) => {\n const isChatFavorite = pinnedChats?.find(\n c => c === conversationSummary.conversation_id,\n );\n return {\n menuItems: (\n <>\n <DropdownItem\n isDisabled={!hasUpdateAccess}\n onClick={() =>\n openChatRenameModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.rename')}\n </DropdownItem>\n {isPinningChatsEnabled && (\n <>\n {isChatFavorite ? (\n <DropdownItem\n onClick={() =>\n unpinChat(conversationSummary.conversation_id)\n }\n >\n {t('conversation.removeFromPinnedChats')}\n </DropdownItem>\n ) : (\n <DropdownItem\n onClick={() => pinChat(conversationSummary.conversation_id)}\n >\n {t('conversation.addToPinnedChats')}\n </DropdownItem>\n )}\n </>\n )}\n <DropdownItem\n isDisabled={!hasDeleteAccess}\n onClick={() =>\n openDeleteModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.delete')}\n </DropdownItem>\n </>\n ),\n };\n },\n [\n pinnedChats,\n hasDeleteAccess,\n isPinningChatsEnabled,\n hasUpdateAccess,\n t,\n pinChat,\n unpinChat,\n ],\n );\n\n const categorizedMessages = useMemo(\n () =>\n getCategorizeMessages(\n conversations,\n pinnedChats,\n additionalMessageProps,\n t,\n selectedSort,\n ),\n [additionalMessageProps, conversations, pinnedChats, t, selectedSort],\n );\n\n const filterConversations = useCallback(\n (targetValue: string) => {\n const pinnedChatsKey = t('conversation.category.pinnedChats') || 'Pinned';\n let isNoPinnedChatsSearchResults = false;\n let isNoRecentChatsSearchResults = false;\n const filteredConversations = Object.entries(categorizedMessages).reduce(\n (acc, [key, items]) => {\n const filteredItems = items.filter(item =>\n item.text\n .toLocaleLowerCase('en-US')\n .includes(targetValue.toLocaleLowerCase('en-US')),\n );\n const isPinnedCategory = key === pinnedChatsKey;\n if (isPinnedCategory && isPinningChatsEnabled) {\n if (filteredItems.length > 0) {\n acc[pinnedChatsKey] = filteredItems;\n } else {\n isNoPinnedChatsSearchResults =\n categorizedMessages[pinnedChatsKey].length > 0;\n acc[pinnedChatsKey] = [\n {\n id: isNoPinnedChatsSearchResults\n ? 'no-pinned-chats-search-results'\n : 'no-pinned-chats',\n text: isNoPinnedChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noPinnedChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n } else if (!isPinnedCategory) {\n if (filteredItems.length > 0) {\n acc[key] = filteredItems;\n } else {\n isNoRecentChatsSearchResults =\n categorizedMessages[key].length > 0;\n\n acc[key] = [\n {\n id: isNoRecentChatsSearchResults\n ? 'no-recent-chats-search-results'\n : 'no-recent-chats',\n text: isNoRecentChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noRecentChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n }\n return acc;\n },\n {} as any,\n );\n // If both sections had items but search filtered them all out, return empty object\n // so PatternFly's default empty state shows instead of custom empty state messages\n if (isNoPinnedChatsSearchResults && isNoRecentChatsSearchResults) {\n return {};\n }\n return filteredConversations;\n },\n [categorizedMessages, isPinningChatsEnabled, t],\n );\n\n useEffect(() => {\n setMessages(conversationMessages);\n }, [conversationMessages]);\n\n const onSelectActiveItem = useCallback(\n (_: MouseEvent | undefined, selectedItem: string | number | undefined) => {\n setNewChatCreated(false);\n const newConvId = String(selectedItem);\n setConversationId((c_id: string) => {\n if (c_id !== selectedItem) {\n return newConvId;\n }\n return c_id;\n });\n setCurrentConversationId(newConvId);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n scrollToBottomRef.current?.scrollToBottom();\n },\n [\n setConversationId,\n setUploadError,\n setFileContents,\n setDraftMessage,\n scrollToBottomRef,\n setCurrentConversationId,\n ],\n );\n\n const conversationFound = !!conversations.find(\n (c: ConversationSummary) => c.conversation_id === conversationId,\n );\n\n const getMaxPrompts = () => {\n if (isFullscreenMode) {\n return samplePrompts?.length; // In the Fullscreen mode, show all prompts\n }\n if (displayMode === ChatbotDisplayMode.docked) {\n return 2; // In the docked mode, show 2 prompts\n }\n return 1; // In the overlay mode, show 1 prompt\n };\n const maxPrompts = getMaxPrompts();\n\n const welcomePrompts =\n (newChatCreated && conversationMessages.length === 0) ||\n (!conversationFound && conversationMessages.length === 0)\n ? samplePrompts?.slice(0, maxPrompts).map(prompt => {\n const p = prompt as { title: string; message: string };\n return {\n title: p.title,\n message: p.message,\n onClick: () => {\n sendMessage(p.message);\n },\n };\n })\n : [];\n\n const handleFilter = useCallback((value: string) => {\n setFilterValue(value);\n }, []);\n\n const onChatHistoryDrawerToggle = useCallback(() => {\n setIsChatHistoryDrawerOpen(isOpen => !isOpen);\n }, []);\n\n const onSortToggle = useCallback(() => {\n setIsSortSelectOpen(prev => !prev);\n }, []);\n\n const onSortSelect = useCallback(\n (_event?: MouseEvent<Element>, value?: string | number) => {\n handleSortChange(value as SortOption);\n setIsSortSelectOpen(false);\n },\n [handleSortChange],\n );\n\n const getSortLabel = useCallback(\n (option: SortOption): string => {\n const labels: Record<SortOption, string> = {\n newest: t('sort.newest'),\n oldest: t('sort.oldest'),\n alphabeticalAsc: t('sort.alphabeticalAsc'),\n alphabeticalDesc: t('sort.alphabeticalDesc'),\n };\n return labels[option];\n },\n [t],\n );\n\n const sortToggle = useCallback(\n (toggleRef: Ref<MenuToggleElement>) => (\n <Tooltip content={`${t('sort.label')} - ${getSortLabel(selectedSort)}`}>\n <MenuToggle\n ref={toggleRef}\n aria-label={t('sort.label')}\n variant=\"plain\"\n onClick={onSortToggle}\n isExpanded={isSortSelectOpen}\n >\n {selectedSort === 'oldest' || selectedSort === 'alphabeticalDesc' ? (\n <SortAmountDownAltIcon />\n ) : (\n <SortAmountDownIcon />\n )}\n </MenuToggle>\n </Tooltip>\n ),\n [t, getSortLabel, selectedSort, onSortToggle, isSortSelectOpen],\n );\n\n const sortDropdown = useMemo(\n () => (\n <Select\n id=\"sort-select\"\n isOpen={isSortSelectOpen}\n selected={selectedSort}\n onSelect={onSortSelect}\n onOpenChange={(isOpen: boolean) => setIsSortSelectOpen(isOpen)}\n popperProps={{ position: 'end' }}\n toggle={sortToggle}\n shouldFocusToggleOnSelect\n >\n <SelectList className={classes.sortDropdown}>\n <SelectOption value=\"newest\">{t('sort.newest')}</SelectOption>\n <SelectOption value=\"oldest\">{t('sort.oldest')}</SelectOption>\n <SelectOption value=\"alphabeticalAsc\">\n {t('sort.alphabeticalAsc')}\n </SelectOption>\n <SelectOption value=\"alphabeticalDesc\">\n {t('sort.alphabeticalDesc')}\n </SelectOption>\n </SelectList>\n </Select>\n ),\n [\n isSortSelectOpen,\n selectedSort,\n onSortSelect,\n sortToggle,\n t,\n classes.sortDropdown,\n ],\n );\n\n const handleAttach = (data: File[], event: ReactDropzoneDropEvent) => {\n if (\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n handleFileUpload(data);\n };\n\n const handleDraftMessage = (\n _e: ChangeEvent<HTMLTextAreaElement>,\n value: string | number,\n ) => setDraftMessage(value as any);\n\n const onAttachRejected = (data: FileRejection[]) => {\n data.forEach(attachment => {\n const hasInvalidTypeError = attachment.errors.some(\n (e: { code: string }) => e.code === 'file-invalid-type',\n );\n if (hasInvalidTypeError) {\n setShowAlert(true);\n setUploadError({\n message: t('file.upload.error.unsupportedType'),\n });\n }\n });\n };\n\n return (\n <>\n {isDeleteModalOpen && (\n <DeleteModal\n isOpen={isDeleteModalOpen}\n conversationId={targetConversationId}\n onClose={() => setIsDeleteModalOpen(false)}\n onConfirm={handleDeleteConversation}\n />\n )}\n {isRenameModalOpen && (\n <RenameConversationModal\n isOpen={isRenameModalOpen}\n onClose={() => setIsRenameModalOpen(false)}\n conversationId={targetConversationId}\n />\n )}\n <Chatbot\n displayMode={ChatbotDisplayMode.embedded}\n className={classes.body}\n >\n <ChatbotHeader className={classes.header}>\n <ChatbotHeaderMain>\n <ChatbotHeaderMenu\n aria-expanded={isChatHistoryDrawerOpen}\n onMenuToggle={() =>\n setIsChatHistoryDrawerOpen(!isChatHistoryDrawerOpen)\n }\n className={classes.headerMenu}\n tooltipContent={t('tooltip.chatHistoryMenu')}\n aria-label={t('aria.chatHistoryMenu')}\n />\n {isFullscreenMode && (\n <ChatbotHeaderTitle className={classes.headerTitle}>\n <Title headingLevel=\"h1\" size=\"3xl\">\n {t('chatbox.header.title')}\n </Title>\n </ChatbotHeaderTitle>\n )}\n </ChatbotHeaderMain>\n\n <LightspeedChatBoxHeader\n selectedModel={selectedModel}\n handleSelectedModel={item => {\n onNewChat();\n handleSelectedModel(item);\n }}\n models={models}\n isPinningChatsEnabled={isPinningChatsEnabled}\n isModelSelectorDisabled={isSendButtonDisabled}\n setDisplayMode={setDisplayMode}\n displayMode={displayMode}\n onPinnedChatsToggle={handlePinningChatsToggle}\n />\n </ChatbotHeader>\n <Divider />\n <ChatbotConversationHistoryNav\n drawerPanelContentProps={{\n isResizable: isFullscreenMode,\n hasNoBorder: !isFullscreenMode,\n style: isFullscreenMode ? undefined : { zIndex: 1300 },\n }}\n reverseButtonOrder\n displayMode={ChatbotDisplayMode.embedded}\n onDrawerToggle={onChatHistoryDrawerToggle}\n title=\"\"\n navTitleIcon={null}\n isDrawerOpen={isChatHistoryDrawerOpen}\n drawerCloseButtonProps={{\n 'aria-label': t('aria.closeDrawerPanel'),\n }}\n setIsDrawerOpen={setIsChatHistoryDrawerOpen}\n activeItemId={conversationId}\n onSelectActiveItem={onSelectActiveItem}\n conversations={filterConversations(filterValue)}\n onNewChat={newChatCreated ? undefined : onNewChat}\n newChatButtonText={t('button.newChat')}\n newChatButtonProps={{\n icon: <PlusIcon />,\n }}\n handleTextInputChange={handleFilter}\n searchInputPlaceholder={t('chatbox.search.placeholder')}\n searchInputAriaLabel={t('aria.search.placeholder')}\n searchInputProps={{\n value: filterValue,\n onClear: () => {\n setFilterValue('');\n },\n }}\n searchActionEnd={sortDropdown}\n noResultsState={\n filterValue &&\n Object.keys(filterConversations(filterValue)).length === 0\n ? {\n bodyText: t('chatbox.emptyState.noResults.body'),\n titleText: t('chatbox.emptyState.noResults.title'),\n icon: SearchIcon,\n }\n : undefined\n }\n drawerContent={\n <FileDropZone\n onFileDrop={(e, data) => handleAttach(data, e)}\n displayMode={ChatbotDisplayMode.embedded}\n infoText={t('chatbox.fileUpload.infoText')}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n >\n {showAlert && uploadError.message && (\n <div className={classes.errorContainer}>\n <ChatbotAlert\n component=\"h4\"\n title={t('chatbox.fileUpload.failed')}\n variant={uploadError.type ?? 'danger'}\n isInline\n onClose={() => setUploadError({ message: null })}\n >\n {uploadError.message}\n </ChatbotAlert>\n </div>\n )}\n\n <ChatbotContent>\n <LightspeedChatBox\n userName={userName}\n messages={messages}\n profileLoading={profileLoading}\n announcement={announcement}\n ref={scrollToBottomRef}\n welcomePrompts={welcomePrompts}\n conversationId={conversationId}\n isStreaming={isSendButtonDisabled}\n topicRestrictionEnabled={topicRestrictionEnabled}\n displayMode={displayMode}\n />\n </ChatbotContent>\n <ChatbotFooter className={classes.footer}>\n <FilePreview />\n <MessageBar\n onSendMessage={sendMessage}\n isSendButtonDisabled={isSendButtonDisabled}\n hasAttachButton\n handleAttach={handleAttach}\n hasMicrophoneButton\n value={draftMessage}\n onChange={handleDraftMessage}\n buttonProps={{\n attach: {\n inputTestId: 'attachment-input',\n tooltipContent: t('tooltip.attach'),\n },\n microphone: {\n tooltipContent: {\n active: t('tooltip.microphone.active'),\n inactive: t('tooltip.microphone.inactive'),\n },\n },\n send: {\n tooltipContent: t('tooltip.send'),\n },\n }}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n placeholder={t('chatbox.message.placeholder')}\n />\n <ChatbotFootnote {...getFootnoteProps(t)} />\n </ChatbotFooter>\n </FileDropZone>\n }\n />\n </Chatbot>\n <Attachment />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LightSpeedChat.esm.js","sources":["../../src/components/LightSpeedChat.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ChangeEvent,\n MouseEvent,\n Ref,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FileRejection,\n type DropEvent as ReactDropzoneDropEvent,\n} from 'react-dropzone';\n\nimport { Button, makeStyles } from '@material-ui/core';\nimport {\n Chatbot,\n ChatbotAlert,\n ChatbotContent,\n ChatbotDisplayMode,\n ChatbotFooter,\n ChatbotFootnote,\n ChatbotHeader,\n ChatbotHeaderMain,\n ChatbotHeaderMenu,\n ChatbotHeaderTitle,\n FileDropZone,\n MessageBar,\n MessageProps,\n Settings,\n} from '@patternfly/chatbot';\nimport ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';\nimport {\n Alert,\n AlertActionCloseButton,\n AlertGroup,\n AlertVariant,\n DropdownItem,\n MenuToggle,\n MenuToggleElement,\n Select,\n SelectList,\n SelectOption,\n Tab,\n Tabs,\n Title,\n Tooltip,\n type AlertProps,\n} from '@patternfly/react-core';\nimport {\n PlusIcon,\n SearchIcon,\n SortAmountDownAltIcon,\n SortAmountDownIcon,\n} from '@patternfly/react-icons';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { supportedFileTypes, TEMP_CONVERSATION_ID } from '../const';\nimport {\n useBackstageUserIdentity,\n useConversationMessages,\n useConversations,\n useIsMobile,\n useLastOpenedConversation,\n useLightspeedDeletePermission,\n useLightspeedNotebooksPermission,\n useNotebookSessions,\n usePinnedChatsSettings,\n useSortSettings,\n useStopConversation,\n} from '../hooks';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useLightspeedUpdatePermission } from '../hooks/useLightspeedUpdatePermission';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useWelcomePrompts } from '../hooks/useWelcomePrompts';\nimport { ConversationSummary } from '../types';\nimport { getAttachments } from '../utils/attachment-utils';\nimport {\n getCategorizeMessages,\n getFootnoteProps,\n SortOption,\n} from '../utils/lightspeed-chatbox-utils';\nimport Attachment from './Attachment';\nimport { useFileAttachmentContext } from './AttachmentContext';\nimport { DeleteModal } from './DeleteModal';\nimport FilePreview from './FilePreview';\nimport { LightspeedChatBox } from './LightspeedChatBox';\nimport { LightspeedChatBoxHeader } from './LightspeedChatBoxHeader';\nimport { McpServersSettings } from './McpServersSettings';\nimport { DeleteNotebookModal } from './notebooks/DeleteNotebookModal';\nimport { NotebooksTab } from './notebooks/NotebooksTab';\nimport { RenameNotebookModal } from './notebooks/RenameNotebookModal';\nimport PermissionRequiredState from './PermissionRequiredState';\nimport { RenameConversationModal } from './RenameConversationModal';\n\nconst useStyles = makeStyles(theme => ({\n body: {\n // remove default margin and padding from common elements\n '& h1, & h2, & h3, & h4, & h5, & h6, & p, & ul, & ol, & li': {\n margin: 0,\n padding: 0,\n },\n },\n header: {\n padding: `${theme.spacing(3)}px ${theme.spacing(3)}px 0 ${theme.spacing(\n 3,\n )}px !important`,\n },\n errorContainer: {\n padding: theme.spacing(3),\n },\n headerMenu: {\n // align hamburger icon with title\n '& .pf-v6-c-button': {\n display: 'flex',\n alignItems: 'center',\n },\n },\n headerTitle: {\n justifyContent: 'left !important',\n },\n tabs: {\n padding: `${theme.spacing(2)}px ${theme.spacing(3)}px 0`,\n backgroundColor:\n 'var(--pf-t--global--background--color--floating--default)',\n '& .pf-v6-c-tabs__item, & .pf-v5-c-tabs__item': {\n backgroundColor: 'transparent',\n },\n '& .pf-v6-c-tabs__item:not(:last-child), & .pf-v5-c-tabs__item:not(:last-child)':\n {\n marginRight: theme.spacing(5),\n },\n '& .pf-v6-c-tabs__link, & .pf-v5-c-tabs__link': {\n backgroundColor: 'transparent',\n paddingBottom: theme.spacing(2),\n fontWeight: 700,\n cursor: 'pointer',\n },\n '& .pf-v6-c-tabs__item.pf-m-current .pf-v6-c-tabs__link, & .pf-v5-c-tabs__item.pf-m-current .pf-v5-c-tabs__link':\n {\n color: 'var(--pf-t--global--text--color--brand--default)',\n },\n },\n tabsDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n },\n notebooksContainer: {\n padding: theme.spacing(3),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n },\n notebooksHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(4),\n },\n notebooksHeading: {\n marginBottom: 0,\n },\n notebooksHeadingEmpty: {\n '&&': {\n marginBottom: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n },\n notebooksEmptyState: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n },\n notebooksIcon: {\n fontSize: 48,\n color: 'var(--pf-t--global--icon--color--subtle)',\n marginBottom: theme.spacing(1.5),\n },\n notebooksDescription: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(3),\n maxWidth: 420,\n },\n notebooksAction: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n },\n notebooksActionEmpty: {\n textTransform: 'none',\n borderRadius: 999,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n marginTop: theme.spacing(3),\n },\n notebooksGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',\n gap: theme.spacing(2),\n width: '100%',\n maxWidth: '100%',\n paddingBottom: theme.spacing(3),\n [theme.breakpoints.down('md')]: {\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n },\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: 'repeat(1, minmax(0, 1fr))',\n },\n },\n notebookCard: {\n borderRadius: theme.spacing(1.5),\n display: 'flex',\n flexDirection: 'column',\n },\n notebookCardHeader: {\n padding: theme.spacing(2),\n paddingBottom: 0,\n alignItems: 'center',\n },\n notebookCardDivider: {\n borderTop: '1px solid var(--pf-t--global--border--color--default)',\n marginTop: theme.spacing(1),\n },\n notebookCardBody: {\n padding: theme.spacing(2),\n paddingTop: theme.spacing(1.5),\n },\n notebookDocuments: {\n paddingTop: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n },\n notebookUpdated: {\n paddingBottom: theme.spacing(5),\n paddingLeft: theme.spacing(2),\n paddingTop: theme.spacing(2),\n },\n notebookTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n flex: 1,\n },\n notebookCardHeaderActions: {\n marginLeft: theme.spacing(1),\n },\n notebookTitleText: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n notebookMenuButton: {\n color: theme.palette.text.secondary,\n },\n notebookDropdownList: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingInlineStart: 0,\n },\n notebookDropdownMenu: {\n '--pf-v6-c-menu--PaddingBlockStart': '0',\n '--pf-v6-c-menu--PaddingBlockEnd': '0',\n },\n notebookDropdownItem: {\n justifyContent: 'flex-start',\n textAlign: 'left',\n paddingLeft: theme.spacing(1.5),\n paddingRight: theme.spacing(1.5),\n },\n footer: {\n '&>.pf-chatbot__footer-container': {\n width: '95% !important',\n maxWidth: 'unset !important',\n },\n },\n sortDropdown: {\n padding: 0,\n margin: 0,\n },\n // Outer content wrapper (library may override overflow; we rely on inner scroll wrapper).\n chatbotContent: {\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n '& .pf-chatbot__jump': {\n left: '50% !important',\n right: 'auto !important',\n transform: 'translateX(-50%)',\n visibility: 'hidden',\n pointerEvents: 'none',\n },\n },\n chatbotContentHasOverflow: {\n '& .pf-chatbot__jump': {\n visibility: 'visible',\n pointerEvents: 'auto',\n },\n },\n // Inner scroll container we control: always scrollable so zoomed-in users see full content.\n chatbotContentScroll: {\n minHeight: 0,\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n },\n toastAlertGroup: {\n '--pf-v6-c-alert-group--m-toast--InsetInlineEnd': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--InsetBlockStart': `${theme.spacing(2.5)}px`,\n '--pf-v6-c-alert-group--m-toast--MaxWidth': '350px',\n },\n toastAlert: {\n maxWidth: '350px',\n '& .pf-v6-c-alert__title': {\n margin: 0,\n },\n },\n // When present, pushes welcome content to bottom (zoom out). Scroll up to see important box (zoom in).\n chatbotContentSpacer: {\n flex: 1,\n minHeight: 0,\n },\n settingsFlat: {\n height: '100%',\n width: '100%',\n '&.pf-chatbot__settings-form-container': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n padding: 0,\n margin: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form': {\n margin: 0,\n padding: 0,\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-form-row': {\n background:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n border: 0,\n margin: 0,\n padding: 0,\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n maxWidth: 'none',\n },\n '& .pf-chatbot__settings-label': {\n display: 'none',\n },\n },\n mcpFullscreenLayout: {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',\n minHeight: 0,\n height: '100%',\n flex: 1,\n width: '100%',\n minWidth: 0,\n overflow: 'hidden',\n },\n mcpChatPane: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n width: '100%',\n minWidth: 0,\n },\n mcpSettingsPane: {\n width: '100%',\n minWidth: 0,\n borderLeft: `1px solid ${theme.palette.divider}`,\n backgroundColor:\n 'var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n },\n mcpCollapsedDrawerOrderFix: {\n '& .pf-v6-c-drawer.pf-m-panel-left > .pf-v6-c-drawer__main > .pf-v6-c-drawer__content, & .pf-v5-c-drawer.pf-m-panel-left > .pf-v5-c-drawer__main > .pf-v5-c-drawer__content':\n {\n order: 'unset',\n },\n '& .pf-v6-c-drawer:not(.pf-m-expanded) > .pf-v6-c-drawer__main > .pf-v6-c-drawer__panel, & .pf-v5-c-drawer:not(.pf-m-expanded) > .pf-v5-c-drawer__main > .pf-v5-c-drawer__panel':\n {\n visibility: 'hidden',\n opacity: 0,\n transition: 'none !important',\n },\n },\n}));\n\ntype LightspeedChatProps = {\n selectedModel: string;\n topicRestrictionEnabled: boolean;\n selectedProvider: string;\n userName?: string;\n avatar?: string;\n profileLoading: boolean;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n};\n\nexport const LightspeedChat = ({\n selectedModel,\n topicRestrictionEnabled,\n selectedProvider,\n userName,\n avatar,\n profileLoading,\n handleSelectedModel,\n models,\n}: LightspeedChatProps) => {\n const isMobile = useIsMobile();\n const classes = useStyles();\n const { t } = useTranslation();\n const user = useBackstageUserIdentity();\n const [filterValue, setFilterValue] = useState<string>('');\n const [announcement, setAnnouncement] = useState<string>('');\n const [activeTab, setActiveTab] = useState<number>(0);\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useLightspeedNotebooksPermission();\n const notebooksPermissionResolved =\n !notebooksPermissionLoading && hasNotebooksAccess;\n const { data: notebooks = [], refetch: refetchNotebooks } =\n useNotebookSessions(activeTab === 1 && notebooksPermissionResolved);\n const hasNotebooks = notebooks.length > 0;\n const [openNotebookMenuId, setOpenNotebookMenuId] = useState<string | null>(\n null,\n );\n const [renameNotebookId, setRenameNotebookId] = useState<string | null>(null);\n const [deleteNotebookId, setDeleteNotebookId] = useState<string | null>(null);\n const [notebookAlerts, setNotebookAlerts] = useState<Partial<AlertProps>[]>(\n [],\n );\n const [conversationId, setConversationId] = useState<string>('');\n const [requestId, setRequestId] = useState<string>('');\n const [newChatCreated, setNewChatCreated] = useState<boolean>(false);\n const [isSendButtonDisabled, setIsSendButtonDisabled] =\n useState<boolean>(false);\n const [targetConversationId, setTargetConversationId] = useState<string>('');\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [isSortSelectOpen, setIsSortSelectOpen] = useState<boolean>(false);\n const [isMcpSettingsOpen, setIsMcpSettingsOpen] = useState<boolean>(false);\n const [chatHeaderBgColor, setChatHeaderBgColor] = useState<string>();\n const contentScrollRef = useRef<HTMLDivElement>(null);\n const bottomSentinelRef = useRef<HTMLDivElement>(null);\n const [messageBarKey, setMessageBarKey] = useState(0);\n const [hasChatContentOverflow, setHasChatContentOverflow] = useState(false);\n const wasStoppedByUserRef = useRef(false);\n const { isReady, lastOpenedId, setLastOpenedId, clearLastOpenedId } =\n useLastOpenedConversation(user);\n const {\n displayMode,\n setDisplayMode,\n currentConversationId: routeConversationId,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n } = useLightspeedDrawerContext();\n const isFullscreenMode = displayMode === ChatbotDisplayMode.embedded;\n const showChatPanel = !isFullscreenMode || activeTab === 0;\n const showNotebooksPanel = isFullscreenMode && activeTab !== 0;\n const [isChatHistoryDrawerOpen, setIsChatHistoryDrawerOpen] =\n useState<boolean>(!isMobile && isFullscreenMode);\n\n const handleNotebookTabSelect = (\n _event: React.MouseEvent<any>,\n tabIndex: number | string,\n ) => {\n const nextTab = Number(tabIndex);\n setActiveTab(nextTab);\n if (nextTab === 1 && notebooksPermissionResolved) {\n refetchNotebooks();\n }\n };\n\n const handleNotebookDeleted = () => {\n const key = Date.now();\n setNotebookAlerts(prevAlerts => [\n { title: t('notebooks.delete.toast'), variant: 'success', key },\n ...prevAlerts,\n ]);\n };\n\n const handleRemoveNotebookAlert = (key: React.Key) => {\n setNotebookAlerts(prevAlerts =>\n prevAlerts.filter(alert => alert.key !== key),\n );\n };\n // Open the chat history drawer when entering fullscreen mode on desktop\n useEffect(() => {\n if (!isMobile && isFullscreenMode) {\n setIsChatHistoryDrawerOpen(true);\n }\n }, [isMobile, isFullscreenMode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const headerElement = document.querySelector('.pf-chatbot__header');\n if (!headerElement) return;\n const computedBg = window.getComputedStyle(headerElement).backgroundColor;\n if (computedBg) {\n setChatHeaderBgColor(computedBg);\n }\n }, [displayMode, isMcpSettingsOpen]);\n\n const {\n isPinningChatsEnabled,\n pinnedChats,\n handlePinningChatsToggle,\n pinChat,\n unpinChat,\n } = usePinnedChatsSettings(user);\n\n const { selectedSort, handleSortChange } = useSortSettings(user);\n\n const {\n uploadError,\n showAlert,\n fileContents,\n setShowAlert,\n setFileContents,\n handleFileUpload,\n setUploadError,\n } = useFileAttachmentContext();\n\n // Sync conversationId with lastOpenedId whenever lastOpenedId changes\n useEffect(() => {\n if (isReady && lastOpenedId !== null) {\n setConversationId(lastOpenedId);\n }\n }, [lastOpenedId, isReady]);\n\n const queryClient = useQueryClient();\n\n const {\n data: conversations = [],\n isLoading,\n isRefetching,\n } = useConversations();\n\n const { allowed: hasDeleteAccess } = useLightspeedDeletePermission();\n const { allowed: hasUpdateAccess } = useLightspeedUpdatePermission();\n const samplePrompts = useWelcomePrompts();\n useEffect(() => {\n if (!user || !isReady) return;\n if (lastOpenedId === null) {\n setConversationId(TEMP_CONVERSATION_ID);\n }\n if (lastOpenedId === TEMP_CONVERSATION_ID || lastOpenedId === null) {\n setNewChatCreated(true);\n }\n }, [user, isReady, lastOpenedId, setConversationId]);\n\n useEffect(() => {\n // Clear last opened conversationId when there are no conversations.\n if (\n !isLoading &&\n !isRefetching &&\n conversations.length === 0 &&\n lastOpenedId\n ) {\n clearLastOpenedId();\n }\n }, [isLoading, isRefetching, conversations, lastOpenedId, clearLastOpenedId]);\n\n useEffect(() => {\n if (\n !isLoading &&\n !isRefetching &&\n routeConversationId &&\n isFullscreenMode\n ) {\n const conversationExists = conversations.some(\n (c: ConversationSummary) => c.conversation_id === routeConversationId,\n );\n if (!conversationExists) {\n // Conversation from route doesn't exist, start a new chat\n setConversationId(TEMP_CONVERSATION_ID);\n setCurrentConversationId(undefined);\n setNewChatCreated(true);\n } else if (conversationId !== routeConversationId) {\n setConversationId(routeConversationId);\n }\n }\n }, [\n isLoading,\n isRefetching,\n routeConversationId,\n conversations,\n displayMode,\n conversationId,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n useEffect(() => {\n // Update last opened conversation whenever `conversationId` changes\n if (conversationId) {\n setLastOpenedId(conversationId);\n }\n }, [conversationId, setLastOpenedId]);\n\n const onStart = (conv_id: string) => {\n setConversationId(conv_id);\n setCurrentConversationId(conv_id);\n };\n\n const onRequestIdReady = (request_id: string) => {\n setRequestId(request_id);\n };\n\n const onComplete = (message: string) => {\n setIsSendButtonDisabled(false);\n if (!wasStoppedByUserRef.current) {\n setAnnouncement(`Message from Bot: ${message}`);\n }\n wasStoppedByUserRef.current = false;\n queryClient.invalidateQueries({\n queryKey: ['conversations'],\n });\n queryClient.invalidateQueries({\n queryKey: ['conversationMessages', conversationId],\n });\n setNewChatCreated(false);\n };\n\n const { conversationMessages, handleInputPrompt, scrollToBottomRef } =\n useConversationMessages(\n conversationId,\n userName,\n selectedModel,\n selectedProvider,\n avatar,\n onComplete,\n onStart,\n onRequestIdReady,\n );\n\n const [messages, setMessages] =\n useState<MessageProps[]>(conversationMessages);\n\n const sendMessage = (message: string | number) => {\n if (!message.toString().trim()) return;\n\n wasStoppedByUserRef.current = false;\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setNewChatCreated(false);\n }\n setAnnouncement(\n t('conversation.announcement.userMessage' as any, {\n prompt: message.toString(),\n }),\n );\n handleInputPrompt(message.toString(), getAttachments(fileContents));\n setIsSendButtonDisabled(true);\n setFileContents([]);\n setDraftMessage('');\n };\n\n const onNewChat = useCallback(() => {\n (async () => {\n setIsMcpSettingsOpen(false);\n if (conversationId !== TEMP_CONVERSATION_ID) {\n setMessages([]);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n setConversationId(TEMP_CONVERSATION_ID);\n setNewChatCreated(true);\n setCurrentConversationId(undefined);\n if (!isFullscreenMode) {\n setIsChatHistoryDrawerOpen(false);\n }\n } else {\n // Already on new chat: reset so scroll/layout works (e.g. after opening new chat again from another convo then back).\n setMessages([]);\n setNewChatCreated(true);\n }\n })();\n }, [\n conversationId,\n setFileContents,\n setUploadError,\n setDraftMessage,\n setCurrentConversationId,\n isFullscreenMode,\n ]);\n\n const openDeleteModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsDeleteModalOpen(true);\n };\n\n const openChatRenameModal = (conversation_id: string) => {\n setTargetConversationId(conversation_id);\n setIsRenameModalOpen(true);\n };\n\n const handleDeleteConversation = useCallback(() => {\n if (targetConversationId === lastOpenedId) {\n onNewChat();\n clearLastOpenedId();\n }\n setIsDeleteModalOpen(false);\n }, [clearLastOpenedId, lastOpenedId, onNewChat, targetConversationId]);\n\n const additionalMessageProps = useCallback(\n (conversationSummary: ConversationSummary) => {\n const isChatFavorite = pinnedChats?.find(\n c => c === conversationSummary.conversation_id,\n );\n return {\n menuItems: (\n <>\n <DropdownItem\n isDisabled={!hasUpdateAccess}\n onClick={() =>\n openChatRenameModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.rename')}\n </DropdownItem>\n {isPinningChatsEnabled && (\n <>\n {isChatFavorite ? (\n <DropdownItem\n onClick={() =>\n unpinChat(conversationSummary.conversation_id)\n }\n >\n {t('conversation.removeFromPinnedChats')}\n </DropdownItem>\n ) : (\n <DropdownItem\n onClick={() => pinChat(conversationSummary.conversation_id)}\n >\n {t('conversation.addToPinnedChats')}\n </DropdownItem>\n )}\n </>\n )}\n <DropdownItem\n isDisabled={!hasDeleteAccess}\n onClick={() =>\n openDeleteModal(conversationSummary.conversation_id)\n }\n >\n {t('conversation.delete')}\n </DropdownItem>\n </>\n ),\n };\n },\n [\n pinnedChats,\n hasDeleteAccess,\n isPinningChatsEnabled,\n hasUpdateAccess,\n t,\n pinChat,\n unpinChat,\n ],\n );\n\n const categorizedMessages = useMemo(\n () =>\n getCategorizeMessages(\n conversations,\n pinnedChats,\n additionalMessageProps,\n t,\n selectedSort,\n ),\n [additionalMessageProps, conversations, pinnedChats, t, selectedSort],\n );\n\n const filterConversations = useCallback(\n (targetValue: string) => {\n const pinnedChatsKey = t('conversation.category.pinnedChats') || 'Pinned';\n let isNoPinnedChatsSearchResults = false;\n let isNoRecentChatsSearchResults = false;\n const filteredConversations = Object.entries(categorizedMessages).reduce(\n (acc, [key, items]) => {\n const filteredItems = items.filter(item =>\n (item.text ?? '')\n .toLocaleLowerCase('en-US')\n .includes(targetValue.toLocaleLowerCase('en-US')),\n );\n const isPinnedCategory = key === pinnedChatsKey;\n if (isPinnedCategory && isPinningChatsEnabled) {\n if (filteredItems.length > 0) {\n acc[pinnedChatsKey] = filteredItems;\n } else {\n isNoPinnedChatsSearchResults =\n categorizedMessages[pinnedChatsKey].length > 0;\n acc[pinnedChatsKey] = [\n {\n id: isNoPinnedChatsSearchResults\n ? 'no-pinned-chats-search-results'\n : 'no-pinned-chats',\n text: isNoPinnedChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noPinnedChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n } else if (!isPinnedCategory) {\n if (filteredItems.length > 0) {\n acc[key] = filteredItems;\n } else {\n isNoRecentChatsSearchResults =\n categorizedMessages[key].length > 0;\n\n acc[key] = [\n {\n id: isNoRecentChatsSearchResults\n ? 'no-recent-chats-search-results'\n : 'no-recent-chats',\n text: isNoRecentChatsSearchResults\n ? t('common.noSearchResults')\n : t('chatbox.emptyState.noRecentChats'),\n noIcon: true,\n additionalProps: {\n isDisabled: true,\n },\n },\n ];\n }\n }\n return acc;\n },\n {} as any,\n );\n // If both sections had items but search filtered them all out, return empty object\n // so PatternFly's default empty state shows instead of custom empty state messages\n if (isNoPinnedChatsSearchResults && isNoRecentChatsSearchResults) {\n return {};\n }\n return filteredConversations;\n },\n [categorizedMessages, isPinningChatsEnabled, t],\n );\n\n useEffect(() => {\n setMessages(conversationMessages);\n }, [conversationMessages]);\n\n const onSelectActiveItem = useCallback(\n (_: MouseEvent | undefined, selectedItem: string | number | undefined) => {\n setIsMcpSettingsOpen(false);\n setNewChatCreated(false);\n const newConvId = String(selectedItem);\n setConversationId((c_id: string) => {\n if (c_id !== selectedItem) {\n return newConvId;\n }\n return c_id;\n });\n setCurrentConversationId(newConvId);\n setFileContents([]);\n setUploadError({ message: null });\n setDraftMessage('');\n scrollToBottomRef.current?.scrollToBottom();\n },\n [\n setConversationId,\n setUploadError,\n setFileContents,\n setDraftMessage,\n scrollToBottomRef,\n setCurrentConversationId,\n setIsMcpSettingsOpen,\n ],\n );\n\n const conversationFound = !!conversations.find(\n (c: ConversationSummary) => c.conversation_id === conversationId,\n );\n\n const getMaxPrompts = () => {\n if (isFullscreenMode) {\n return samplePrompts?.length; // In the Fullscreen mode, show all prompts\n }\n if (displayMode === ChatbotDisplayMode.docked) {\n return 2; // In the docked mode, show 2 prompts\n }\n return 1; // In the overlay mode, show 1 prompt\n };\n const maxPrompts = getMaxPrompts();\n\n const welcomePrompts =\n (newChatCreated && conversationMessages.length === 0) ||\n (!conversationFound && conversationMessages.length === 0)\n ? samplePrompts?.slice(0, maxPrompts).map(prompt => {\n const p = prompt as { title: string; message: string };\n return {\n title: p.title,\n message: p.message,\n onClick: () => {\n sendMessage(p.message);\n },\n };\n })\n : [];\n\n // Scroll to bottom when welcome content appears (sentinel + useLayoutEffect/RAF + ResizeObserver).\n useLayoutEffect(() => {\n if (welcomePrompts.length === 0) return undefined;\n const el = contentScrollRef.current;\n const sentinel = bottomSentinelRef.current;\n if (!el) return undefined;\n\n const scrollToBottom = () => {\n if (sentinel && typeof sentinel.scrollIntoView === 'function') {\n sentinel.scrollIntoView({ block: 'end', behavior: 'auto' });\n } else {\n el.scrollTop = el.scrollHeight;\n }\n };\n\n const rafId =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame(() => scrollToBottom())\n : null;\n if (rafId === null) scrollToBottom();\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scrollToBottom())\n : undefined;\n resizeObserver?.observe(el);\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n resizeObserver?.disconnect();\n };\n }, [welcomePrompts.length]);\n\n useEffect(() => {\n const scrollContainer = contentScrollRef.current;\n if (!scrollContainer) {\n setHasChatContentOverflow(false);\n return undefined;\n }\n\n const getMessageBox = () =>\n scrollContainer.querySelector(\n '.pf-chatbot__messagebox',\n ) as HTMLElement | null;\n\n const messageBoxOwnsScroll = (messageBox: HTMLElement | null) => {\n if (!messageBox || typeof window === 'undefined') {\n return false;\n }\n const overflowY = window.getComputedStyle(messageBox).overflowY;\n return (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n );\n };\n\n const getScrollTarget = () => {\n const messageBox = getMessageBox();\n return messageBoxOwnsScroll(messageBox) ? messageBox! : scrollContainer;\n };\n\n let observedScrollTarget: HTMLElement | null = getScrollTarget();\n let rafId: number | null = null;\n let updateScheduled = false;\n\n const updateOverflow = () => {\n const scrollTarget = observedScrollTarget ?? scrollContainer;\n setHasChatContentOverflow(\n scrollTarget.scrollHeight > scrollTarget.clientHeight + 1,\n );\n };\n\n const scheduleOverflowUpdate = () => {\n if (updateScheduled) {\n return;\n }\n updateScheduled = true;\n if (typeof requestAnimationFrame !== 'undefined') {\n rafId = requestAnimationFrame(() => {\n updateScheduled = false;\n updateOverflow();\n });\n } else {\n updateScheduled = false;\n updateOverflow();\n }\n };\n\n scheduleOverflowUpdate();\n\n // Use capture so scroll events from inner messagebox also trigger updates.\n scrollContainer.addEventListener('scroll', scheduleOverflowUpdate, {\n passive: true,\n capture: true,\n });\n\n const resizeObserver =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleOverflowUpdate())\n : undefined;\n resizeObserver?.observe(scrollContainer);\n if (observedScrollTarget !== scrollContainer) {\n resizeObserver?.observe(observedScrollTarget);\n }\n\n const syncObservedScrollTarget = () => {\n const nextScrollTarget = getScrollTarget();\n if (nextScrollTarget === observedScrollTarget) {\n return;\n }\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n if (nextScrollTarget !== scrollContainer) {\n resizeObserver?.observe(nextScrollTarget);\n }\n observedScrollTarget = nextScrollTarget;\n };\n\n const mutationObserver =\n typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n syncObservedScrollTarget();\n scheduleOverflowUpdate();\n })\n : undefined;\n mutationObserver?.observe(scrollContainer, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateOverflow);\n }\n\n return () => {\n if (rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(rafId);\n }\n scrollContainer.removeEventListener(\n 'scroll',\n scheduleOverflowUpdate,\n true,\n );\n if (observedScrollTarget && observedScrollTarget !== scrollContainer) {\n resizeObserver?.unobserve(observedScrollTarget);\n }\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateOverflow);\n }\n };\n }, [\n conversationId,\n displayMode,\n isMcpSettingsOpen,\n messages.length,\n welcomePrompts.length,\n ]);\n\n const handleFilter = useCallback((value: string) => {\n setFilterValue(value);\n }, []);\n\n const onChatHistoryDrawerToggle = useCallback(() => {\n setIsChatHistoryDrawerOpen(isOpen => !isOpen);\n }, []);\n\n const onSortToggle = useCallback(() => {\n setIsSortSelectOpen(prev => !prev);\n }, []);\n\n const onSortSelect = useCallback(\n (_event?: MouseEvent<Element>, value?: string | number) => {\n handleSortChange(value as SortOption);\n setIsSortSelectOpen(false);\n },\n [handleSortChange],\n );\n\n const getSortLabel = useCallback(\n (option: SortOption): string => {\n const labels: Record<SortOption, string> = {\n newest: t('sort.newest'),\n oldest: t('sort.oldest'),\n alphabeticalAsc: t('sort.alphabeticalAsc'),\n alphabeticalDesc: t('sort.alphabeticalDesc'),\n };\n return labels[option];\n },\n [t],\n );\n\n const sortToggle = useCallback(\n (toggleRef: Ref<MenuToggleElement>) => (\n <Tooltip content={`${t('sort.label')} - ${getSortLabel(selectedSort)}`}>\n <MenuToggle\n ref={toggleRef}\n aria-label={t('sort.label')}\n variant=\"plain\"\n onClick={onSortToggle}\n isExpanded={isSortSelectOpen}\n >\n {selectedSort === 'oldest' || selectedSort === 'alphabeticalDesc' ? (\n <SortAmountDownAltIcon />\n ) : (\n <SortAmountDownIcon />\n )}\n </MenuToggle>\n </Tooltip>\n ),\n [t, getSortLabel, selectedSort, onSortToggle, isSortSelectOpen],\n );\n\n const sortDropdown = useMemo(\n () => (\n <Select\n id=\"sort-select\"\n isOpen={isSortSelectOpen}\n selected={selectedSort}\n onSelect={onSortSelect}\n onOpenChange={(isOpen: boolean) => setIsSortSelectOpen(isOpen)}\n popperProps={{ position: 'end' }}\n toggle={sortToggle}\n shouldFocusToggleOnSelect\n >\n <SelectList className={classes.sortDropdown}>\n <SelectOption value=\"newest\">{t('sort.newest')}</SelectOption>\n <SelectOption value=\"oldest\">{t('sort.oldest')}</SelectOption>\n <SelectOption value=\"alphabeticalAsc\">\n {t('sort.alphabeticalAsc')}\n </SelectOption>\n <SelectOption value=\"alphabeticalDesc\">\n {t('sort.alphabeticalDesc')}\n </SelectOption>\n </SelectList>\n </Select>\n ),\n [\n isSortSelectOpen,\n selectedSort,\n onSortSelect,\n sortToggle,\n t,\n classes.sortDropdown,\n ],\n );\n\n const getDocumentsCount = (documentIds?: string[]) => {\n return Array.isArray(documentIds) ? documentIds.length : 0;\n };\n\n const handleAttach = (data: File[], event: ReactDropzoneDropEvent) => {\n if (\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n handleFileUpload(data);\n };\n\n const { mutate: stopConversation } = useStopConversation();\n\n const handleStopButton = () => {\n wasStoppedByUserRef.current = true;\n if (requestId) {\n stopConversation(requestId);\n setRequestId('');\n }\n setIsSendButtonDisabled(false);\n setAnnouncement(t('conversation.announcement.responseStopped'));\n const lastUserMessage = [...conversationMessages]\n .reverse()\n .find((m: { role?: string }) => m.role === 'user');\n const restoredPrompt = (lastUserMessage?.content as string) ?? '';\n setDraftMessage(restoredPrompt.trim());\n if (restoredPrompt) setMessageBarKey(k => k + 1);\n setFileContents([]);\n setUploadError({ message: null });\n };\n\n const handleDraftMessage = (\n _e: ChangeEvent<HTMLTextAreaElement>,\n value: string | number,\n ) => setDraftMessage(value as any);\n\n const onAttachRejected = (data: FileRejection[]) => {\n data.forEach(attachment => {\n const hasInvalidTypeError = attachment.errors.some(\n (e: { code: string }) => e.code === 'file-invalid-type',\n );\n if (hasInvalidTypeError) {\n setShowAlert(true);\n setUploadError({\n message: t('file.upload.error.unsupportedType'),\n });\n }\n });\n };\n\n const chatMainContent = (\n <>\n <ChatbotContent\n className={`${classes.chatbotContent} ${\n hasChatContentOverflow ? classes.chatbotContentHasOverflow : ''\n }`}\n >\n <div ref={contentScrollRef} className={classes.chatbotContentScroll}>\n {welcomePrompts.length > 0 && (\n <div className={classes.chatbotContentSpacer} aria-hidden />\n )}\n <LightspeedChatBox\n userName={userName}\n messages={messages}\n profileLoading={profileLoading}\n announcement={announcement}\n ref={scrollToBottomRef}\n welcomePrompts={welcomePrompts}\n conversationId={conversationId}\n isStreaming={isSendButtonDisabled}\n topicRestrictionEnabled={topicRestrictionEnabled}\n displayMode={displayMode}\n />\n {welcomePrompts.length > 0 && (\n <div\n ref={bottomSentinelRef}\n aria-hidden\n style={{ height: 0, flexShrink: 0 }}\n />\n )}\n </div>\n </ChatbotContent>\n <ChatbotFooter className={classes.footer}>\n <FilePreview />\n <MessageBar\n key={messageBarKey}\n onSendMessage={sendMessage}\n isSendButtonDisabled={isSendButtonDisabled}\n hasAttachButton\n handleAttach={handleAttach}\n hasMicrophoneButton\n value={draftMessage}\n onChange={handleDraftMessage}\n hasStopButton={isSendButtonDisabled}\n handleStopButton={isSendButtonDisabled ? handleStopButton : undefined}\n buttonProps={{\n attach: {\n inputTestId: 'attachment-input',\n tooltipContent: t('tooltip.attach'),\n },\n microphone: {\n tooltipContent: {\n active: t('tooltip.microphone.active'),\n inactive: t('tooltip.microphone.inactive'),\n },\n },\n send: {\n tooltipContent: t('tooltip.send'),\n },\n }}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n placeholder={t('chatbox.message.placeholder')}\n />\n <ChatbotFootnote {...getFootnoteProps(t)} />\n </ChatbotFooter>\n </>\n );\n\n const mcpSettingsPanel = (\n <McpServersSettings\n onClose={() => setIsMcpSettingsOpen(false)}\n backgroundColor={chatHeaderBgColor}\n />\n );\n\n const mainPanelContent = (() => {\n if (!isMcpSettingsOpen) {\n return <>{chatMainContent}</>;\n }\n\n if (isFullscreenMode) {\n return (\n <div className={classes.mcpFullscreenLayout}>\n <div className={classes.mcpChatPane}>{chatMainContent}</div>\n <div className={classes.mcpSettingsPane}>{mcpSettingsPanel}</div>\n </div>\n );\n }\n\n return (\n <Settings\n className={classes.settingsFlat}\n fields={[\n {\n id: 'mcp-servers-settings',\n label: '',\n field: mcpSettingsPanel,\n },\n ]}\n />\n );\n })();\n\n let drawerPanelStyle: { [key: string]: string | number } | undefined;\n if (!isFullscreenMode) {\n drawerPanelStyle = { zIndex: 1300 };\n } else if (isMcpSettingsOpen) {\n drawerPanelStyle = { width: 320, minWidth: 320, maxWidth: 320 };\n }\n\n return (\n <>\n {notebookAlerts.length > 0 && (\n <AlertGroup\n hasAnimations\n isToast\n isLiveRegion\n className={classes.toastAlertGroup}\n >\n {notebookAlerts.map(({ key, title, variant }) => (\n <Alert\n key={key}\n variant={AlertVariant[variant ?? 'success']}\n title={title}\n className={classes.toastAlert}\n actionClose={\n <AlertActionCloseButton\n title={title as string}\n variantLabel={`${variant ?? 'success'} alert`}\n onClose={() => handleRemoveNotebookAlert(key as React.Key)}\n />\n }\n />\n ))}\n </AlertGroup>\n )}\n {isDeleteModalOpen && (\n <DeleteModal\n isOpen={isDeleteModalOpen}\n conversationId={targetConversationId}\n onClose={() => setIsDeleteModalOpen(false)}\n onConfirm={handleDeleteConversation}\n />\n )}\n {isRenameModalOpen && (\n <RenameConversationModal\n isOpen={isRenameModalOpen}\n onClose={() => setIsRenameModalOpen(false)}\n conversationId={targetConversationId}\n />\n )}\n {renameNotebookId && (\n <RenameNotebookModal\n isOpen={Boolean(renameNotebookId)}\n onClose={() => setRenameNotebookId(null)}\n sessionId={renameNotebookId}\n currentName={\n notebooks.find(n => n.session_id === renameNotebookId)?.name ?? ''\n }\n />\n )}\n {deleteNotebookId && (\n <DeleteNotebookModal\n isOpen={Boolean(deleteNotebookId)}\n onClose={() => setDeleteNotebookId(null)}\n onDeleted={handleNotebookDeleted}\n sessionId={deleteNotebookId}\n name={\n notebooks.find(n => n.session_id === deleteNotebookId)?.name ?? ''\n }\n />\n )}\n <Chatbot\n displayMode={ChatbotDisplayMode.embedded}\n className={`${classes.body} ${\n isMcpSettingsOpen && !isChatHistoryDrawerOpen\n ? classes.mcpCollapsedDrawerOrderFix\n : ''\n }`}\n >\n <ChatbotHeader className={classes.header}>\n <ChatbotHeaderMain>\n <ChatbotHeaderMenu\n aria-expanded={isChatHistoryDrawerOpen}\n onMenuToggle={onChatHistoryDrawerToggle}\n className={classes.headerMenu}\n tooltipContent={t('tooltip.chatHistoryMenu')}\n aria-label={t('aria.chatHistoryMenu')}\n />\n {isFullscreenMode && (\n <ChatbotHeaderTitle className={classes.headerTitle}>\n <Title headingLevel=\"h1\" size=\"3xl\">\n {t('chatbox.header.title')}\n </Title>\n </ChatbotHeaderTitle>\n )}\n </ChatbotHeaderMain>\n\n <LightspeedChatBoxHeader\n selectedModel={selectedModel}\n handleSelectedModel={item => {\n setIsMcpSettingsOpen(false);\n onNewChat();\n handleSelectedModel(item);\n }}\n models={models}\n isPinningChatsEnabled={isPinningChatsEnabled}\n isModelSelectorDisabled={isSendButtonDisabled}\n setDisplayMode={setDisplayMode}\n displayMode={displayMode}\n onPinnedChatsToggle={handlePinningChatsToggle}\n onMcpSettingsClick={() => setIsMcpSettingsOpen(true)}\n />\n </ChatbotHeader>\n {isFullscreenMode && (\n <>\n <Tabs\n activeKey={activeTab}\n onSelect={handleNotebookTabSelect}\n aria-label={t('tabs.ariaLabel')}\n className={classes.tabs}\n >\n <Tab eventKey={0} title={t('tabs.chat')} />\n <Tab eventKey={1} title={t('tabs.notebooks')} />\n </Tabs>\n <div className={classes.tabsDivider} />\n </>\n )}\n {showChatPanel && (\n <ChatbotConversationHistoryNav\n drawerPanelContentProps={{\n isResizable: isFullscreenMode,\n hasNoBorder: !isFullscreenMode,\n style: drawerPanelStyle,\n }}\n reverseButtonOrder\n displayMode={ChatbotDisplayMode.embedded}\n onDrawerToggle={onChatHistoryDrawerToggle}\n title=\"\"\n navTitleIcon={null}\n isDrawerOpen={isChatHistoryDrawerOpen}\n drawerCloseButtonProps={{\n 'aria-label': t('aria.closeDrawerPanel'),\n }}\n setIsDrawerOpen={setIsChatHistoryDrawerOpen}\n activeItemId={conversationId}\n onSelectActiveItem={onSelectActiveItem}\n conversations={filterConversations(filterValue)}\n onNewChat={newChatCreated ? undefined : onNewChat}\n newChatButtonText={t('button.newChat')}\n newChatButtonProps={{\n icon: <PlusIcon />,\n }}\n handleTextInputChange={handleFilter}\n searchInputPlaceholder={t('chatbox.search.placeholder')}\n searchInputAriaLabel={t('aria.search.placeholder')}\n searchInputProps={{\n value: filterValue,\n onClear: () => {\n setFilterValue('');\n },\n }}\n searchActionEnd={sortDropdown}\n noResultsState={\n filterValue &&\n Object.keys(filterConversations(filterValue)).length === 0\n ? {\n bodyText: t('chatbox.emptyState.noResults.body'),\n titleText: t('chatbox.emptyState.noResults.title'),\n icon: SearchIcon,\n }\n : undefined\n }\n drawerContent={\n <FileDropZone\n onFileDrop={(e, data) => handleAttach(data, e)}\n displayMode={ChatbotDisplayMode.embedded}\n infoText={t('chatbox.fileUpload.infoText')}\n allowedFileTypes={supportedFileTypes}\n onAttachRejected={onAttachRejected}\n >\n {showAlert && uploadError.message && (\n <div className={classes.errorContainer}>\n <ChatbotAlert\n component=\"h4\"\n title={t('chatbox.fileUpload.failed')}\n variant={uploadError.type ?? 'danger'}\n isInline\n onClose={() => setUploadError({ message: null })}\n >\n {uploadError.message}\n </ChatbotAlert>\n </div>\n )}\n {mainPanelContent}\n </FileDropZone>\n }\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n hasNotebooksAccess && (\n <NotebooksTab\n notebooks={notebooks}\n hasNotebooks={hasNotebooks}\n classes={classes}\n openNotebookMenuId={openNotebookMenuId}\n setOpenNotebookMenuId={setOpenNotebookMenuId}\n onRename={setRenameNotebookId}\n onDelete={setDeleteNotebookId}\n t={t}\n getDocumentsCount={getDocumentsCount}\n />\n )}\n {showNotebooksPanel &&\n !notebooksPermissionLoading &&\n !hasNotebooksAccess && (\n <PermissionRequiredState\n subject={t('permission.subject.notebooks')}\n permissions={['lightspeed.notebooks.use']}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n style={{ borderRadius: '20px' }}\n onClick={() => setActiveTab(0)}\n >\n {t('permission.notebooks.goBack')}\n </Button>\n }\n />\n )}\n </Chatbot>\n <Attachment />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,18 @@ const useStyles = makeStyles((theme) => ({
|
|
|
47
47
|
"100%": {
|
|
48
48
|
opacity: 0.65
|
|
49
49
|
}
|
|
50
|
+
},
|
|
51
|
+
// Message box fills remaining height and scrolls when there are messages.
|
|
52
|
+
messageBoxFlex: {
|
|
53
|
+
flex: 1,
|
|
54
|
+
minHeight: 0
|
|
55
|
+
},
|
|
56
|
+
// New chat: message box sizes to content so ChatbotContent is the scroll container.
|
|
57
|
+
// overflow: visible so full height is included in parent's scrollHeight (no clipping).
|
|
58
|
+
messageBoxAutoHeight: {
|
|
59
|
+
flex: "none",
|
|
60
|
+
height: "auto",
|
|
61
|
+
overflow: "visible"
|
|
50
62
|
}
|
|
51
63
|
}));
|
|
52
64
|
const LightspeedChatBox = forwardRef(
|
|
@@ -103,15 +115,17 @@ const LightspeedChatBox = forwardRef(
|
|
|
103
115
|
}, [autoScroll, cmessages, containerRef]);
|
|
104
116
|
const messageBoxClasses = `${classes.container} ${classes.userMessageText}`;
|
|
105
117
|
const isEmbeddedMode = displayMode === ChatbotDisplayMode.embedded;
|
|
118
|
+
const isNewChat = welcomePrompts.length > 0 && messages.length === 0;
|
|
106
119
|
const getMessageBoxClassName = () => {
|
|
120
|
+
const base = isNewChat ? `${messageBoxClasses} ${classes.messageBoxAutoHeight}` : `${messageBoxClasses} ${classes.messageBoxFlex}`;
|
|
107
121
|
if (!welcomePrompts.length) {
|
|
108
|
-
return
|
|
122
|
+
return base;
|
|
109
123
|
}
|
|
110
|
-
const
|
|
124
|
+
const withPrompt = `${base} ${classes.prompt}`;
|
|
111
125
|
if (isEmbeddedMode) {
|
|
112
|
-
return
|
|
126
|
+
return withPrompt;
|
|
113
127
|
}
|
|
114
|
-
return `${
|
|
128
|
+
return `${withPrompt} ${classes.promptSuggestions}`;
|
|
115
129
|
};
|
|
116
130
|
return /* @__PURE__ */ jsxs(
|
|
117
131
|
MessageBox,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightspeedChatBox.esm.js","sources":["../../src/components/LightspeedChatBox.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\n\nimport { makeStyles } from '@material-ui/core';\nimport {\n ChatbotDisplayMode,\n ChatbotWelcomePrompt,\n DeepThinking,\n DeepThinkingProps,\n Message,\n MessageBox,\n MessageBoxHandle,\n MessageProps,\n ToolCall as PatternFlyToolCall,\n WelcomePrompt,\n} from '@patternfly/chatbot';\nimport { Alert } from '@patternfly/react-core';\n\nimport { useAutoScroll } from '../hooks/useAutoScroll';\nimport { useBufferedMessages } from '../hooks/useBufferedMessages';\nimport { useFeedbackActions } from '../hooks/useFeedbackActions';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { ToolCall } from '../types';\nimport { parseReasoning } from '../utils/reasoningParser';\nimport { mapToPatternFlyToolCall } from '../utils/toolCallMapper';\n\nconst useStyles = makeStyles(theme => ({\n prompt: {\n 'justify-content': 'flex-end',\n },\n container: {\n maxWidth: 'unset !important',\n },\n alert: {\n background: 'unset !important',\n },\n promptSuggestions: {\n '& div.pf-chatbot__prompt-suggestions': {\n 'flex-direction': 'column !important',\n },\n },\n\n userMessageText: {\n '& div.pf-chatbot__message--user': {\n '& div.pf-chatbot__message-text': {\n '& p': {\n color: theme.palette.common.white,\n },\n },\n },\n },\n deepThinking: {\n animation: '$deepThinking 1.6s ease-in-out infinite',\n },\n\n '@keyframes deepThinking': {\n '0%': {\n opacity: 0.65,\n },\n '50%': {\n opacity: 1,\n },\n '100%': {\n opacity: 0.65,\n },\n },\n}));\n\n// Extended message type that includes tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype LightspeedChatBoxProps = {\n userName?: string;\n messages: ExtendedMessageProps[];\n profileLoading: boolean;\n announcement: string | undefined;\n topicRestrictionEnabled: boolean;\n welcomePrompts: WelcomePrompt[];\n conversationId: string;\n isStreaming: boolean;\n displayMode?: ChatbotDisplayMode;\n};\n\nexport interface ScrollContainerHandle {\n scrollToBottom: () => void;\n}\n\nexport const LightspeedChatBox = forwardRef(\n (\n {\n userName,\n messages,\n announcement,\n conversationId,\n profileLoading,\n welcomePrompts,\n isStreaming,\n topicRestrictionEnabled,\n displayMode,\n }: LightspeedChatBoxProps,\n ref: ForwardedRef<ScrollContainerHandle | null>,\n ) => {\n const classes = useStyles();\n const scrollQueued = useRef(false);\n const containerRef = useRef<MessageBoxHandle>(null);\n const { t } = useTranslation();\n\n const cmessages = useBufferedMessages(messages, 30);\n const { autoScroll, scrollToBottom, scrollToTop } =\n useAutoScroll(containerRef);\n const conversationMessages = useFeedbackActions(\n cmessages,\n conversationId,\n isStreaming,\n );\n\n useImperativeHandle(ref, () => ({\n scrollToBottom: () => {\n if (scrollQueued.current) return;\n scrollQueued.current = true;\n\n requestAnimationFrame(() => {\n scrollToBottom();\n scrollQueued.current = false;\n });\n },\n }));\n\n // Auto-scrolls to the latest message\n useEffect(() => {\n if (!autoScroll || scrollQueued.current) return undefined;\n\n scrollQueued.current = true;\n\n const rafId = requestAnimationFrame(() => {\n const container = containerRef.current;\n if (!container) return;\n\n setTimeout(() => {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'auto',\n });\n }, 0);\n\n scrollQueued.current = false;\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n scrollQueued.current = false;\n };\n\n // eslint-disable-next-line\n }, [autoScroll, cmessages, containerRef]);\n\n const messageBoxClasses = `${classes.container} ${classes.userMessageText}`;\n const isEmbeddedMode = displayMode === ChatbotDisplayMode.embedded;\n\n const getMessageBoxClassName = () => {\n if (!welcomePrompts.length) {\n return messageBoxClasses;\n }\n const baseClasses = `${messageBoxClasses} ${classes.prompt}`;\n if (isEmbeddedMode) {\n return baseClasses;\n }\n return `${baseClasses} ${classes.promptSuggestions}`;\n };\n\n return (\n <MessageBox\n className={getMessageBoxClassName()}\n announcement={announcement}\n ref={containerRef}\n onScrollToTopClick={scrollToTop}\n onScrollToBottomClick={scrollToBottom}\n jumpButtonBottomProps={{ 'aria-label': t('aria.scroll.down') }}\n jumpButtonTopProps={{ 'aria-label': t('aria.scroll.up') }}\n jumpButtonBottomTooltipProps={{ content: t('tooltip.backToBottom') }}\n jumpButtonTopTooltipProps={{ content: t('tooltip.backToTop') }}\n >\n <div>\n <Alert\n title={t('aria.important')}\n variant=\"info\"\n isInline\n className={classes.alert}\n >\n {topicRestrictionEnabled\n ? t('disclaimer.withValidation')\n : t('disclaimer.withoutValidation')}\n </Alert>\n <br />\n </div>\n {welcomePrompts.length ? (\n <ChatbotWelcomePrompt\n title={t('chatbox.welcome.greeting' as any, {\n userName: profileLoading\n ? t('user.loading')\n : (userName ?? t('user.guest')),\n })}\n description={t('chatbox.welcome.description')}\n prompts={welcomePrompts}\n style={{ paddingBottom: '0' }}\n />\n ) : (\n <br />\n )}\n {conversationMessages.map((message, index) => {\n const messageContent = message.content as string;\n const parsedReasoning = parseReasoning(messageContent || '');\n\n // Map first tool call to PatternFly's toolCall prop\n const firstToolCall = message.toolCalls?.[0];\n const toolCallProp = firstToolCall\n ? mapToPatternFlyToolCall(firstToolCall, t, message.role)\n : undefined;\n\n // Handle additional tool calls (if any) via extraContent\n const additionalToolCalls = message.toolCalls?.slice(1);\n\n const extraContentParts: {\n beforeMainContent?: React.ReactNode;\n afterMainContent?: React.ReactNode;\n } = {};\n\n let deepThinking: DeepThinkingProps | undefined = undefined;\n\n if (\n parsedReasoning.isReasoningInProgress ||\n parsedReasoning.hasReasoning\n ) {\n const reasoningContent = parsedReasoning.reasoning;\n\n if (reasoningContent) {\n deepThinking = {\n cardBodyProps: {\n id: `deep-thinking-${index}`,\n style: { whiteSpace: 'pre-line' },\n className: parsedReasoning.isReasoningInProgress\n ? classes.deepThinking\n : undefined,\n },\n toggleContent: t('reasoning.thinking'),\n body: reasoningContent,\n isDefaultExpanded: false,\n };\n }\n }\n\n const allToolCalls: React.ReactNode[] = [];\n\n // Add first tool call if it exists\n if (toolCallProp && firstToolCall) {\n allToolCalls.push(\n <div\n key={`tool-${firstToolCall.id}-${firstToolCall.toolName}`}\n style={{ marginTop: '8px' }}\n >\n <PatternFlyToolCall {...toolCallProp} />\n </div>,\n );\n }\n\n // Add additional tool calls\n if (additionalToolCalls && additionalToolCalls.length > 0) {\n additionalToolCalls.forEach(tc => {\n const tcProps = mapToPatternFlyToolCall(tc, t, message.role);\n allToolCalls.push(\n <div\n key={`tool-${tc.id}-${tc.toolName}`}\n style={{ marginTop: '8px' }}\n >\n <PatternFlyToolCall {...tcProps} />\n </div>,\n );\n });\n }\n\n // Show Thinking first, then tool calls\n if (deepThinking || allToolCalls.length > 0) {\n extraContentParts.beforeMainContent = (\n <>\n {deepThinking && <DeepThinking {...deepThinking} />}\n {allToolCalls.length > 0 && (\n <div style={{ marginTop: deepThinking ? '8px' : '0' }}>\n {allToolCalls}\n </div>\n )}\n </>\n );\n }\n\n const extraContent =\n extraContentParts.beforeMainContent ||\n extraContentParts.afterMainContent\n ? extraContentParts\n : undefined;\n\n const finalMessage =\n parsedReasoning.hasReasoning ||\n parsedReasoning.isReasoningInProgress\n ? { ...message, content: parsedReasoning.mainContent }\n : message;\n\n return (\n <Message\n key={`${message.role}-${index}`}\n extraContent={extraContent}\n {...finalMessage}\n />\n );\n })}\n </MessageBox>\n );\n },\n);\n"],"names":["PatternFlyToolCall"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LightspeedChatBox.esm.js","sources":["../../src/components/LightspeedChatBox.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\n\nimport { makeStyles } from '@material-ui/core';\nimport {\n ChatbotDisplayMode,\n ChatbotWelcomePrompt,\n DeepThinking,\n DeepThinkingProps,\n Message,\n MessageBox,\n MessageBoxHandle,\n MessageProps,\n ToolCall as PatternFlyToolCall,\n WelcomePrompt,\n} from '@patternfly/chatbot';\nimport { Alert } from '@patternfly/react-core';\n\nimport { useAutoScroll } from '../hooks/useAutoScroll';\nimport { useBufferedMessages } from '../hooks/useBufferedMessages';\nimport { useFeedbackActions } from '../hooks/useFeedbackActions';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { ToolCall } from '../types';\nimport { parseReasoning } from '../utils/reasoningParser';\nimport { mapToPatternFlyToolCall } from '../utils/toolCallMapper';\n\nconst useStyles = makeStyles(theme => ({\n prompt: {\n 'justify-content': 'flex-end',\n },\n container: {\n maxWidth: 'unset !important',\n },\n alert: {\n background: 'unset !important',\n },\n promptSuggestions: {\n '& div.pf-chatbot__prompt-suggestions': {\n 'flex-direction': 'column !important',\n },\n },\n\n userMessageText: {\n '& div.pf-chatbot__message--user': {\n '& div.pf-chatbot__message-text': {\n '& p': {\n color: theme.palette.common.white,\n },\n },\n },\n },\n deepThinking: {\n animation: '$deepThinking 1.6s ease-in-out infinite',\n },\n\n '@keyframes deepThinking': {\n '0%': {\n opacity: 0.65,\n },\n '50%': {\n opacity: 1,\n },\n '100%': {\n opacity: 0.65,\n },\n },\n // Message box fills remaining height and scrolls when there are messages.\n messageBoxFlex: {\n flex: 1,\n minHeight: 0,\n },\n // New chat: message box sizes to content so ChatbotContent is the scroll container.\n // overflow: visible so full height is included in parent's scrollHeight (no clipping).\n messageBoxAutoHeight: {\n flex: 'none',\n height: 'auto',\n overflow: 'visible',\n },\n}));\n\n// Extended message type that includes tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype LightspeedChatBoxProps = {\n userName?: string;\n messages: ExtendedMessageProps[];\n profileLoading: boolean;\n announcement: string | undefined;\n topicRestrictionEnabled: boolean;\n welcomePrompts: WelcomePrompt[];\n conversationId: string;\n isStreaming: boolean;\n displayMode?: ChatbotDisplayMode;\n};\n\nexport interface ScrollContainerHandle {\n scrollToBottom: () => void;\n}\n\nexport const LightspeedChatBox = forwardRef(\n (\n {\n userName,\n messages,\n announcement,\n conversationId,\n profileLoading,\n welcomePrompts,\n isStreaming,\n topicRestrictionEnabled,\n displayMode,\n }: LightspeedChatBoxProps,\n ref: ForwardedRef<ScrollContainerHandle | null>,\n ) => {\n const classes = useStyles();\n const scrollQueued = useRef(false);\n const containerRef = useRef<MessageBoxHandle>(null);\n const { t } = useTranslation();\n\n const cmessages = useBufferedMessages(messages, 30);\n const { autoScroll, scrollToBottom, scrollToTop } =\n useAutoScroll(containerRef);\n const conversationMessages = useFeedbackActions(\n cmessages,\n conversationId,\n isStreaming,\n );\n\n useImperativeHandle(ref, () => ({\n scrollToBottom: () => {\n if (scrollQueued.current) return;\n scrollQueued.current = true;\n\n requestAnimationFrame(() => {\n scrollToBottom();\n scrollQueued.current = false;\n });\n },\n }));\n\n // Auto-scrolls to the latest message\n useEffect(() => {\n if (!autoScroll || scrollQueued.current) return undefined;\n\n scrollQueued.current = true;\n\n const rafId = requestAnimationFrame(() => {\n const container = containerRef.current;\n if (!container) return;\n\n setTimeout(() => {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'auto',\n });\n }, 0);\n\n scrollQueued.current = false;\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n scrollQueued.current = false;\n };\n\n // eslint-disable-next-line\n }, [autoScroll, cmessages, containerRef]);\n\n const messageBoxClasses = `${classes.container} ${classes.userMessageText}`;\n const isEmbeddedMode = displayMode === ChatbotDisplayMode.embedded;\n\n const isNewChat = welcomePrompts.length > 0 && messages.length === 0;\n const getMessageBoxClassName = () => {\n const base = isNewChat\n ? `${messageBoxClasses} ${classes.messageBoxAutoHeight}`\n : `${messageBoxClasses} ${classes.messageBoxFlex}`;\n if (!welcomePrompts.length) {\n return base;\n }\n const withPrompt = `${base} ${classes.prompt}`;\n if (isEmbeddedMode) {\n return withPrompt;\n }\n return `${withPrompt} ${classes.promptSuggestions}`;\n };\n\n return (\n <MessageBox\n className={getMessageBoxClassName()}\n announcement={announcement}\n ref={containerRef}\n onScrollToTopClick={scrollToTop}\n onScrollToBottomClick={scrollToBottom}\n jumpButtonBottomProps={{ 'aria-label': t('aria.scroll.down') }}\n jumpButtonTopProps={{ 'aria-label': t('aria.scroll.up') }}\n jumpButtonBottomTooltipProps={{ content: t('tooltip.backToBottom') }}\n jumpButtonTopTooltipProps={{ content: t('tooltip.backToTop') }}\n >\n <div>\n <Alert\n title={t('aria.important')}\n variant=\"info\"\n isInline\n className={classes.alert}\n >\n {topicRestrictionEnabled\n ? t('disclaimer.withValidation')\n : t('disclaimer.withoutValidation')}\n </Alert>\n <br />\n </div>\n {welcomePrompts.length ? (\n <ChatbotWelcomePrompt\n title={t('chatbox.welcome.greeting' as any, {\n userName: profileLoading\n ? t('user.loading')\n : (userName ?? t('user.guest')),\n })}\n description={t('chatbox.welcome.description')}\n prompts={welcomePrompts}\n style={{ paddingBottom: '0' }}\n />\n ) : (\n <br />\n )}\n {conversationMessages.map((message, index) => {\n const messageContent = message.content as string;\n const parsedReasoning = parseReasoning(messageContent || '');\n\n // Map first tool call to PatternFly's toolCall prop\n const firstToolCall = message.toolCalls?.[0];\n const toolCallProp = firstToolCall\n ? mapToPatternFlyToolCall(firstToolCall, t, message.role)\n : undefined;\n\n // Handle additional tool calls (if any) via extraContent\n const additionalToolCalls = message.toolCalls?.slice(1);\n\n const extraContentParts: {\n beforeMainContent?: React.ReactNode;\n afterMainContent?: React.ReactNode;\n } = {};\n\n let deepThinking: DeepThinkingProps | undefined = undefined;\n\n if (\n parsedReasoning.isReasoningInProgress ||\n parsedReasoning.hasReasoning\n ) {\n const reasoningContent = parsedReasoning.reasoning;\n\n if (reasoningContent) {\n deepThinking = {\n cardBodyProps: {\n id: `deep-thinking-${index}`,\n style: { whiteSpace: 'pre-line' },\n className: parsedReasoning.isReasoningInProgress\n ? classes.deepThinking\n : undefined,\n },\n toggleContent: t('reasoning.thinking'),\n body: reasoningContent,\n isDefaultExpanded: false,\n };\n }\n }\n\n const allToolCalls: React.ReactNode[] = [];\n\n // Add first tool call if it exists\n if (toolCallProp && firstToolCall) {\n allToolCalls.push(\n <div\n key={`tool-${firstToolCall.id}-${firstToolCall.toolName}`}\n style={{ marginTop: '8px' }}\n >\n <PatternFlyToolCall {...toolCallProp} />\n </div>,\n );\n }\n\n // Add additional tool calls\n if (additionalToolCalls && additionalToolCalls.length > 0) {\n additionalToolCalls.forEach(tc => {\n const tcProps = mapToPatternFlyToolCall(tc, t, message.role);\n allToolCalls.push(\n <div\n key={`tool-${tc.id}-${tc.toolName}`}\n style={{ marginTop: '8px' }}\n >\n <PatternFlyToolCall {...tcProps} />\n </div>,\n );\n });\n }\n\n // Show Thinking first, then tool calls\n if (deepThinking || allToolCalls.length > 0) {\n extraContentParts.beforeMainContent = (\n <>\n {deepThinking && <DeepThinking {...deepThinking} />}\n {allToolCalls.length > 0 && (\n <div style={{ marginTop: deepThinking ? '8px' : '0' }}>\n {allToolCalls}\n </div>\n )}\n </>\n );\n }\n\n const extraContent =\n extraContentParts.beforeMainContent ||\n extraContentParts.afterMainContent\n ? extraContentParts\n : undefined;\n\n const finalMessage =\n parsedReasoning.hasReasoning ||\n parsedReasoning.isReasoningInProgress\n ? { ...message, content: parsedReasoning.mainContent }\n : message;\n\n return (\n <Message\n key={`${message.role}-${index}`}\n extraContent={extraContent}\n {...finalMessage}\n />\n );\n })}\n </MessageBox>\n );\n },\n);\n"],"names":["PatternFlyToolCall"],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { jsxs, jsx
|
|
2
|
-
import { useState
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
3
|
import { makeStyles, createStyles } from '@material-ui/core';
|
|
4
4
|
import ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';
|
|
5
5
|
import ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';
|
|
6
6
|
import Divider from '@mui/material/Divider';
|
|
7
|
-
import { ChatbotHeaderActions, ChatbotHeaderOptionsDropdown
|
|
7
|
+
import { ChatbotDisplayMode, ChatbotHeaderActions, ChatbotHeaderOptionsDropdown } from '@patternfly/chatbot';
|
|
8
8
|
import { Dropdown, DropdownList, DropdownGroup, DropdownItem, MenuToggle } from '@patternfly/react-core';
|
|
9
9
|
import { OutlinedWindowRestoreIcon, OpenDrawerRightIcon, ExpandIcon } from '@patternfly/react-icons';
|
|
10
10
|
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
11
|
+
import { McpSettingsIcon } from './McpSettingsIcon.esm.js';
|
|
11
12
|
|
|
12
13
|
const useStyles = makeStyles(
|
|
13
14
|
(theme) => createStyles({
|
|
@@ -37,23 +38,19 @@ const LightspeedChatBoxHeader = ({
|
|
|
37
38
|
models,
|
|
38
39
|
isPinningChatsEnabled,
|
|
39
40
|
onPinnedChatsToggle,
|
|
41
|
+
onMcpSettingsClick,
|
|
40
42
|
isModelSelectorDisabled = false,
|
|
41
43
|
setDisplayMode
|
|
42
44
|
}) => {
|
|
43
45
|
const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);
|
|
44
46
|
const { t } = useTranslation();
|
|
45
47
|
const styles = useStyles();
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
groups[provider].push(model);
|
|
54
|
-
});
|
|
55
|
-
return groups;
|
|
56
|
-
}, [models, t]);
|
|
48
|
+
const maxLabelLength = Math.max(
|
|
49
|
+
...models.map((m) => m.label.length),
|
|
50
|
+
selectedModel.length,
|
|
51
|
+
1
|
|
52
|
+
);
|
|
53
|
+
const toggleMinWidth = `${maxLabelLength + 4}ch`;
|
|
57
54
|
const toggle = (toggleRef) => /* @__PURE__ */ jsx(
|
|
58
55
|
MenuToggle,
|
|
59
56
|
{
|
|
@@ -64,6 +61,7 @@ const LightspeedChatBoxHeader = ({
|
|
|
64
61
|
isExpanded: isOptionsMenuOpen,
|
|
65
62
|
isDisabled: isModelSelectorDisabled,
|
|
66
63
|
onClick: () => setIsOptionsMenuOpen(!isOptionsMenuOpen),
|
|
64
|
+
style: { minWidth: toggleMinWidth },
|
|
67
65
|
children: selectedModel
|
|
68
66
|
}
|
|
69
67
|
);
|
|
@@ -79,6 +77,9 @@ const LightspeedChatBoxHeader = ({
|
|
|
79
77
|
const handleOverlay = () => {
|
|
80
78
|
setDisplayMode(ChatbotDisplayMode.default);
|
|
81
79
|
};
|
|
80
|
+
const isOverlayMode = displayMode === ChatbotDisplayMode.default;
|
|
81
|
+
const scrollThreshold = isOverlayMode ? 8 : 10;
|
|
82
|
+
const isModelDropdownScrollable = models.length > scrollThreshold;
|
|
82
83
|
return /* @__PURE__ */ jsxs(ChatbotHeaderActions, { children: [
|
|
83
84
|
/* @__PURE__ */ jsx(
|
|
84
85
|
Dropdown,
|
|
@@ -94,21 +95,17 @@ const LightspeedChatBoxHeader = ({
|
|
|
94
95
|
shouldFocusToggleOnSelect: true,
|
|
95
96
|
shouldFocusFirstItemOnOpen: false,
|
|
96
97
|
toggle,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
),
|
|
109
|
-
index < Object.entries(groupedModels).length - 1 && /* @__PURE__ */ jsx(Divider, { component: "li" })
|
|
110
|
-
] })
|
|
111
|
-
) })
|
|
98
|
+
isScrollable: isModelDropdownScrollable,
|
|
99
|
+
maxMenuHeight: isModelDropdownScrollable ? "240px" : undefined,
|
|
100
|
+
children: /* @__PURE__ */ jsx(DropdownList, { children: models.map((model) => /* @__PURE__ */ jsx(DropdownGroup, { className: styles.groupTitle, children: /* @__PURE__ */ jsx(
|
|
101
|
+
DropdownItem,
|
|
102
|
+
{
|
|
103
|
+
value: model.value,
|
|
104
|
+
isSelected: selectedModel === model.value,
|
|
105
|
+
children: model.label
|
|
106
|
+
},
|
|
107
|
+
model.value
|
|
108
|
+
) }, model.label)) })
|
|
112
109
|
}
|
|
113
110
|
),
|
|
114
111
|
/* @__PURE__ */ jsxs(
|
|
@@ -160,27 +157,39 @@ const LightspeedChatBoxHeader = ({
|
|
|
160
157
|
)
|
|
161
158
|
] }) }),
|
|
162
159
|
/* @__PURE__ */ jsx(Divider, {}),
|
|
163
|
-
/* @__PURE__ */ jsx(DropdownGroup, { children: /* @__PURE__ */
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
160
|
+
/* @__PURE__ */ jsx(DropdownGroup, { children: /* @__PURE__ */ jsxs(DropdownList, { children: [
|
|
161
|
+
isPinningChatsEnabled ? /* @__PURE__ */ jsx(
|
|
162
|
+
DropdownItem,
|
|
163
|
+
{
|
|
164
|
+
value: "disablePinningChats",
|
|
165
|
+
icon: /* @__PURE__ */ jsx(ToggleOnOutlinedIcon, { sx: { marginTop: "8px" } }),
|
|
166
|
+
description: t("settings.pinned.enabled.description"),
|
|
167
|
+
onClick: () => handlePinningChatsToggle(false),
|
|
168
|
+
children: t("settings.pinned.disable")
|
|
169
|
+
},
|
|
170
|
+
"disablePinningChat"
|
|
171
|
+
) : /* @__PURE__ */ jsx(
|
|
172
|
+
DropdownItem,
|
|
173
|
+
{
|
|
174
|
+
value: "enablePinningChats",
|
|
175
|
+
icon: /* @__PURE__ */ jsx(ToggleOffOutlinedIcon, { sx: { marginTop: "8px" } }),
|
|
176
|
+
description: t("settings.pinned.disabled.description"),
|
|
177
|
+
onClick: () => handlePinningChatsToggle(true),
|
|
178
|
+
children: t("settings.pinned.enable")
|
|
179
|
+
},
|
|
180
|
+
"enablePinningChats"
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ jsx(
|
|
183
|
+
DropdownItem,
|
|
184
|
+
{
|
|
185
|
+
value: "mcpSettings",
|
|
186
|
+
icon: /* @__PURE__ */ jsx(McpSettingsIcon, {}),
|
|
187
|
+
onClick: onMcpSettingsClick,
|
|
188
|
+
children: t("settings.mcp.label")
|
|
189
|
+
},
|
|
190
|
+
"mcpSettings"
|
|
191
|
+
)
|
|
192
|
+
] }) })
|
|
184
193
|
]
|
|
185
194
|
}
|
|
186
195
|
)
|