@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.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 +681 -0
- package/README.md +378 -0
- package/config.d.ts +70 -0
- package/dist/alpha.d.ts +285 -0
- package/dist/alpha.esm.js +3 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/api/LightspeedApiClient.esm.js +234 -0
- package/dist/api/LightspeedApiClient.esm.js.map +1 -0
- package/dist/api/NotebooksApiClient.esm.js +179 -0
- package/dist/api/NotebooksApiClient.esm.js.map +1 -0
- package/dist/api/api.esm.js +8 -0
- package/dist/api/api.esm.js.map +1 -0
- package/dist/api/notebooksApi.esm.js +10 -0
- package/dist/api/notebooksApi.esm.js.map +1 -0
- package/dist/components/Attachment.esm.js +108 -0
- package/dist/components/Attachment.esm.js.map +1 -0
- package/dist/components/AttachmentContext.esm.js +125 -0
- package/dist/components/AttachmentContext.esm.js.map +1 -0
- package/dist/components/CollapsedHistoryStrip.esm.js +87 -0
- package/dist/components/CollapsedHistoryStrip.esm.js.map +1 -0
- package/dist/components/DeleteModal.esm.js +92 -0
- package/dist/components/DeleteModal.esm.js.map +1 -0
- package/dist/components/FilePreview.esm.js +49 -0
- package/dist/components/FilePreview.esm.js.map +1 -0
- package/dist/components/LightSpeedChat.esm.js +1898 -0
- package/dist/components/LightSpeedChat.esm.js.map +1 -0
- package/dist/components/LightspeedChatBox.esm.js +252 -0
- package/dist/components/LightspeedChatBox.esm.js.map +1 -0
- package/dist/components/LightspeedChatBoxHeader.esm.js +210 -0
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -0
- package/dist/components/LightspeedChatContainer.esm.js +162 -0
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -0
- package/dist/components/LightspeedChatModelsState.esm.js +198 -0
- package/dist/components/LightspeedChatModelsState.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerContext.esm.js +15 -0
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerProvider.esm.js +44 -0
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js +34 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -0
- package/dist/components/LightspeedFAB.esm.js +6 -0
- package/dist/components/LightspeedFAB.esm.js.map +1 -0
- package/dist/components/LightspeedFABContent.esm.js +65 -0
- package/dist/components/LightspeedFABContent.esm.js.map +1 -0
- package/dist/components/LightspeedIcon.esm.js +46 -0
- package/dist/components/LightspeedIcon.esm.js.map +1 -0
- package/dist/components/LightspeedPage.esm.js +31 -0
- package/dist/components/LightspeedPage.esm.js.map +1 -0
- package/dist/components/McpServersSettings.esm.js +953 -0
- package/dist/components/McpServersSettings.esm.js.map +1 -0
- package/dist/components/McpSettingsIcon.esm.js +18 -0
- package/dist/components/McpSettingsIcon.esm.js.map +1 -0
- package/dist/components/MessageBarModelSelector.esm.js +92 -0
- package/dist/components/MessageBarModelSelector.esm.js.map +1 -0
- package/dist/components/PermissionRequiredIcon.esm.js +18 -0
- package/dist/components/PermissionRequiredIcon.esm.js.map +1 -0
- package/dist/components/PermissionRequiredState.esm.js +88 -0
- package/dist/components/PermissionRequiredState.esm.js.map +1 -0
- package/dist/components/RenameConversationModal.esm.js +157 -0
- package/dist/components/RenameConversationModal.esm.js.map +1 -0
- package/dist/components/Router.esm.js +35 -0
- package/dist/components/Router.esm.js.map +1 -0
- package/dist/components/SourcesChipModal.esm.js +124 -0
- package/dist/components/SourcesChipModal.esm.js.map +1 -0
- package/dist/components/ToolCallContent.esm.js +208 -0
- package/dist/components/ToolCallContent.esm.js.map +1 -0
- package/dist/components/Trans.esm.js +33 -0
- package/dist/components/Trans.esm.js.map +1 -0
- package/dist/components/notebooks/AddDocumentModal.esm.js +271 -0
- package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -0
- package/dist/components/notebooks/DeleteDocumentModal.esm.js +131 -0
- package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -0
- package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
- package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
- package/dist/components/notebooks/DocumentSidebar.esm.js +235 -0
- package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -0
- package/dist/components/notebooks/FileListItem.esm.js +94 -0
- package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
- package/dist/components/notebooks/FileTypeIcon.esm.js +59 -0
- package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookCard.esm.js +118 -0
- package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookView.esm.js +681 -0
- package/dist/components/notebooks/NotebookView.esm.js.map +1 -0
- package/dist/components/notebooks/NotebooksTab.esm.js +71 -0
- package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js +142 -0
- package/dist/components/notebooks/OverwriteConfirmModal.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/components/notebooks/SidebarCollapseIcon.esm.js +50 -0
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -0
- package/dist/components/notebooks/UploadResourceScreen.esm.js +79 -0
- package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -0
- package/dist/const.esm.js +74 -0
- package/dist/const.esm.js.map +1 -0
- package/dist/dev.d.ts +2 -0
- package/dist/dev.esm.js +48 -0
- package/dist/dev.esm.js.map +1 -0
- package/dist/hooks/notebooks/useCreateNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +24 -0
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -0
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
- package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js +40 -0
- package/dist/hooks/notebooks/useDocumentStatusPolling.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/useNotebookDocuments.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -0
- package/dist/hooks/notebooks/useNotebookSession.esm.js +18 -0
- package/dist/hooks/notebooks/useNotebookSession.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/notebooks/useUploadDocument.esm.js +28 -0
- package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -0
- package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
- package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
- package/dist/hooks/useAllModels.esm.js +20 -0
- package/dist/hooks/useAllModels.esm.js.map +1 -0
- package/dist/hooks/useAutoScroll.esm.js +78 -0
- package/dist/hooks/useAutoScroll.esm.js.map +1 -0
- package/dist/hooks/useBackstageUserIdentity.esm.js +14 -0
- package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -0
- package/dist/hooks/useBufferedMessages.esm.js +27 -0
- package/dist/hooks/useBufferedMessages.esm.js.map +1 -0
- package/dist/hooks/useCaptureFeedback.esm.js +21 -0
- package/dist/hooks/useCaptureFeedback.esm.js.map +1 -0
- package/dist/hooks/useConversationMessages.esm.js +544 -0
- package/dist/hooks/useConversationMessages.esm.js.map +1 -0
- package/dist/hooks/useConversations.esm.js +25 -0
- package/dist/hooks/useConversations.esm.js.map +1 -0
- package/dist/hooks/useCreateCoversationMessage.esm.js +33 -0
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -0
- package/dist/hooks/useDeleteConversation.esm.js +39 -0
- package/dist/hooks/useDeleteConversation.esm.js.map +1 -0
- package/dist/hooks/useDisplayModeSettings.esm.js +57 -0
- package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -0
- package/dist/hooks/useFeedbackActions.esm.js +275 -0
- package/dist/hooks/useFeedbackActions.esm.js.map +1 -0
- package/dist/hooks/useFeedbackState.esm.js +93 -0
- package/dist/hooks/useFeedbackState.esm.js.map +1 -0
- package/dist/hooks/useFeedbackStatus.esm.js +14 -0
- package/dist/hooks/useFeedbackStatus.esm.js.map +1 -0
- package/dist/hooks/useIsMobile.esm.js +14 -0
- package/dist/hooks/useIsMobile.esm.js.map +1 -0
- package/dist/hooks/useLastOpenedConversation.esm.js +51 -0
- package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -0
- package/dist/hooks/useLightspeedDeletePermission.esm.js +12 -0
- package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -0
- package/dist/hooks/useLightspeedDrawerContext.esm.js +15 -0
- package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -0
- package/dist/hooks/useLightspeedProviderState.esm.js +277 -0
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
- package/dist/hooks/useLightspeedUpdatePermission.esm.js +12 -0
- package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -0
- package/dist/hooks/useLightspeedViewPermission.esm.js +18 -0
- package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -0
- package/dist/hooks/useNotebookConversationIds.esm.js +19 -0
- package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -0
- package/dist/hooks/useNotebookWelcomePrompts.esm.js +14 -0
- package/dist/hooks/useNotebookWelcomePrompts.esm.js.map +1 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js +118 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -0
- package/dist/hooks/useQuestionValidation.esm.js +16 -0
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -0
- package/dist/hooks/useRenameConversation.esm.js +44 -0
- package/dist/hooks/useRenameConversation.esm.js.map +1 -0
- package/dist/hooks/useSortSettings.esm.js +60 -0
- package/dist/hooks/useSortSettings.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/useTranslation.esm.js +7 -0
- package/dist/hooks/useTranslation.esm.js.map +1 -0
- package/dist/hooks/useWelcomePrompts.esm.js +36 -0
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -0
- package/dist/images/bot-avatar-dark.svg +4 -0
- package/dist/images/bot-avatar.svg +4 -0
- package/dist/images/permission-required.svg +319 -0
- package/dist/images/user-avatar.svg +4 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.esm.js +137 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/intelligent-assistant-fab-module.d.ts +4 -0
- package/dist/intelligent-assistant-fab-module.esm.js +2 -0
- package/dist/intelligent-assistant-fab-module.esm.js.map +1 -0
- package/dist/intelligent-assistant-translations-module.d.ts +4 -0
- package/dist/intelligent-assistant-translations-module.esm.js +2 -0
- package/dist/intelligent-assistant-translations-module.esm.js.map +1 -0
- package/dist/legacy.d.ts +75 -0
- package/dist/legacy.esm.js +13 -0
- package/dist/legacy.esm.js.map +1 -0
- package/dist/plugin.esm.js +84 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +23 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/translations/de.esm.js +278 -0
- package/dist/translations/de.esm.js.map +1 -0
- package/dist/translations/es.esm.js +278 -0
- package/dist/translations/es.esm.js.map +1 -0
- package/dist/translations/fr.esm.js +278 -0
- package/dist/translations/fr.esm.js.map +1 -0
- package/dist/translations/index.esm.js +16 -0
- package/dist/translations/index.esm.js.map +1 -0
- package/dist/translations/it.esm.js +278 -0
- package/dist/translations/it.esm.js.map +1 -0
- package/dist/translations/ja.esm.js +278 -0
- package/dist/translations/ja.esm.js.map +1 -0
- package/dist/translations/ref.esm.js +315 -0
- package/dist/translations/ref.esm.js.map +1 -0
- package/dist/types.esm.js +9 -0
- package/dist/types.esm.js.map +1 -0
- package/dist/utils/attachment-utils.esm.js +30 -0
- package/dist/utils/attachment-utils.esm.js.map +1 -0
- package/dist/utils/formatToolResponseForMarkdown.esm.js +98 -0
- package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
- package/dist/utils/generateClassName.esm.js +12 -0
- package/dist/utils/generateClassName.esm.js.map +1 -0
- package/dist/utils/lightspeed-chatbox-utils.esm.js +232 -0
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -0
- package/dist/utils/notebook-upload-utils.esm.js +48 -0
- package/dist/utils/notebook-upload-utils.esm.js.map +1 -0
- package/dist/utils/notebooks-utils.esm.js +25 -0
- package/dist/utils/notebooks-utils.esm.js.map +1 -0
- package/dist/utils/prompt-utils.esm.js +17 -0
- package/dist/utils/prompt-utils.esm.js.map +1 -0
- package/dist/utils/queryClient.esm.js +6 -0
- package/dist/utils/queryClient.esm.js.map +1 -0
- package/dist/utils/reasoningParser.esm.js +33 -0
- package/dist/utils/reasoningParser.esm.js.map +1 -0
- package/dist/utils/toolCallMapper.esm.js +15 -0
- package/dist/utils/toolCallMapper.esm.js.map +1 -0
- package/dist/utils/user-utils.esm.js +7 -0
- package/dist/utils/user-utils.esm.js.map +1 -0
- package/package.json +182 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpServersSettings.esm.js","sources":["../../src/components/McpServersSettings.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 { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { configApiRef, fetchApiRef, useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { makeStyles } from '@material-ui/core';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\nimport {\n Alert,\n Button,\n Modal,\n Switch,\n Title,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n KeyIcon,\n LockIcon,\n PencilAltIcon,\n SortAmountDownIcon,\n SortAmountUpIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\nimport { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';\n\nimport { lightspeedMcpManagePermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype ServerStatus = 'tokenRequired' | 'disabled' | 'ok' | 'failed' | 'unknown';\n\ntype McpServer = {\n id: string;\n name: string;\n url?: string;\n enabled: boolean;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n hasToken: boolean;\n hasUserToken: boolean;\n validationError?: string;\n /** 'dcr' = tokens are minted automatically (no manual token needed). */\n auth?: string;\n};\n\ntype McpServersSettingsProps = {\n onClose: () => void;\n backgroundColor?: string;\n};\n\ntype TokenValidationState = 'idle' | 'validating' | 'success' | 'error';\n\nconst SAVED_TOKEN_MASK = '********************';\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n '.pf-v6-c-backdrop': {\n zIndex: '1400 !important',\n },\n '.pf-v5-c-backdrop': {\n zIndex: '1400 !important',\n },\n },\n root: {\n padding: 0,\n height: '100%',\n minHeight: '100%',\n width: '100%',\n overflow: 'auto',\n },\n headerRow: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(2),\n },\n selectedCount: {\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n fontSize: '0.75rem',\n },\n title: {\n fontSize: '1.125rem',\n },\n closeButton: {\n marginTop: -theme.spacing(1),\n marginRight: -theme.spacing(1),\n color: theme.palette.text.primary,\n },\n nameHeaderButton: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\n marginLeft: '-0.85rem',\n fontWeight: 600,\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n minHeight: 'auto',\n color: theme.palette.text.primary,\n textDecoration: 'none !important',\n display: 'inline-flex',\n alignItems: 'center',\n },\n nameHeaderText: {\n paddingLeft: '7px',\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n fontWeight: 600,\n },\n nameCell: {\n paddingLeft: '8px !important',\n },\n statusHeader: {\n paddingLeft: '0 !important',\n },\n statusColumnCell: {\n paddingLeft: '0 !important',\n },\n rowName: {\n fontSize: '1rem',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n },\n nameValue: {\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n statusCell: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n whiteSpace: 'nowrap',\n },\n statusValue: {\n fontSize: '0.875rem',\n },\n statusOk: {\n color: '#147878',\n },\n statusWarn: {\n color: '#B1380B',\n },\n statusDisabled: {\n color:\n theme.palette.type === 'dark'\n ? 'var(--pf-t--global--text--color--subtle, #c7c7c7)'\n : 'var(--pf-t--global--text--color--subtle, #4d4d4d)',\n },\n actionButton: {\n color: theme.palette.text.secondary,\n opacity: 0,\n transition: 'opacity 0.15s ease-in-out',\n },\n tableRow: {\n '&:hover $actionButton, &:focus-within $actionButton': {\n opacity: 1,\n },\n },\n modalDescription: {\n color: theme.palette.text.secondary,\n fontSize: '0.875rem',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n modalContent: {\n position: 'relative',\n padding: theme.spacing(3, 0, 3, 3),\n marginRight: theme.spacing(3),\n },\n modalCustomCloseButton: {\n position: 'absolute',\n top: theme.spacing(2),\n right: theme.spacing(-0.5),\n color: theme.palette.text.primary,\n },\n modalHeading: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.75),\n marginBottom: theme.spacing(1),\n fontSize: '1.25rem',\n lineHeight: 1.4,\n fontWeight: 500,\n '& .v5-MuiTypography-root': {\n fontSize: '1.25rem',\n lineHeight: 1.4,\n fontWeight: 500,\n },\n },\n tokenRow: {\n position: 'relative',\n },\n tokenClearButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n color: theme.palette.action.active,\n },\n tokenHelper: {\n color: theme.palette.text.secondary,\n fontSize: '0.75rem',\n marginTop: theme.spacing(0.5),\n },\n tokenInput: {\n marginTop: '1rem !important',\n '& .MuiOutlinedInput-root': {\n height: '3.5rem',\n },\n '& .MuiOutlinedInput-input': {\n padding: '0 0.875rem',\n },\n '& .MuiInputLabel-root': {\n fontSize: '0.875rem',\n },\n },\n tokenInputSuccess: {\n '& .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline': {\n borderColor: '#3E8635',\n borderWidth: 1,\n },\n '& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': {\n borderColor: '#3E8635',\n },\n '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': {\n borderColor: '#3E8635',\n },\n '& .MuiInputLabel-root.Mui-focused': {\n color: '#3E8635',\n },\n },\n tokenInputError: {\n '& .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline': {\n borderColor: '#C9190B',\n borderWidth: 1,\n },\n '& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': {\n borderColor: '#C9190B',\n },\n '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': {\n borderColor: '#C9190B',\n },\n '& .MuiInputLabel-root.Mui-focused': {\n color: '#C9190B',\n },\n },\n modalActions: {\n marginTop: theme.spacing(3),\n display: 'flex',\n gap: theme.spacing(1),\n },\n modalActionButton: {\n fontSize: '1rem',\n },\n modalCancelButton: {\n fontSize: '1rem',\n },\n forgetTokenButton: {\n fontSize: '1rem',\n border: '1px solid #B1380B',\n borderRadius: '1.25rem',\n padding: '0.375rem 1rem',\n color: '#B1380B',\n backgroundColor: 'transparent',\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(1),\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: 'rgba(201, 25, 11, 0.08)',\n },\n },\n configureModal: {\n '& .pf-v6-c-modal-box': {\n width: '608px',\n maxWidth: '608px',\n height: '326px',\n minHeight: '326px',\n },\n '& .pf-v6-c-modal-box__title, & .pf-v6-c-modal-box__title-text, & .pf-v5-c-modal-box__title, & .pf-v5-c-modal-box__title-text':\n {\n fontSize: '1.25rem !important',\n lineHeight: '1.4 !important',\n },\n '& .pf-v6-c-modal-box__close': {\n display: 'none',\n },\n '& .pf-v5-c-modal-box__close': {\n display: 'none',\n },\n '& .pf-v6-c-button__icon': {\n paddingTop: '5px !important',\n fontSize: '1.25rem !important',\n },\n },\n toggleCell: {\n paddingRight: '0 !important',\n },\n table: {\n width: '100%',\n backgroundColor: 'transparent',\n '--pf-v6-c-table--BackgroundColor': 'transparent',\n '--pf-v5-c-table--BackgroundColor': 'transparent',\n '& table, & thead, & tbody, & tr, & th, & td': {\n backgroundColor: 'transparent !important',\n },\n '& th': {\n borderBottom: 0,\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n textAlign: 'left',\n },\n '& td': {\n borderBottom: 0,\n paddingTop: theme.spacing(1.5),\n paddingBottom: theme.spacing(1.5),\n verticalAlign: 'middle',\n },\n },\n alert: {\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(3),\n marginBottom: theme.spacing(2),\n },\n}));\n\ntype McpServerResponse = {\n name: string;\n url?: string;\n enabled: boolean;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n hasToken: boolean;\n hasUserToken: boolean;\n auth?: string;\n};\n\ntype McpServersListResponse = {\n servers?: McpServerResponse[];\n};\n\ntype McpServersPatchResponse = {\n server?: McpServerResponse;\n validation?: {\n error?: string;\n };\n};\n\ntype McpServersValidateResponse = {\n name: string;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n validation?: {\n error?: string;\n };\n};\n\ntype McpCredentialsValidateResponse = {\n valid: boolean;\n error?: string;\n toolCount: number;\n};\n\nconst getStatusIcon = (status: ServerStatus, className: string) => {\n if (status === 'tokenRequired') return <KeyIcon className={className} />;\n if (status === 'disabled') return <InfoCircleIcon className={className} />;\n if (status === 'failed')\n return <ExclamationCircleIcon className={className} />;\n return <CheckCircleIcon className={className} />;\n};\n\nconst getDisplayStatus = (server: McpServer): ServerStatus => {\n if (!server.hasToken) return 'tokenRequired';\n if (!server.enabled) return 'disabled';\n if (server.status === 'error') return 'failed';\n if (server.status === 'connected') return 'ok';\n return 'unknown';\n};\n\nconst toUiServer = (\n server: McpServerResponse,\n validationError?: string,\n): McpServer => ({\n id: server.name,\n name: server.name,\n url: server.url,\n enabled: server.enabled,\n status: server.status,\n toolCount: server.toolCount,\n hasToken: server.hasToken,\n hasUserToken: server.hasUserToken,\n validationError: server.status === 'error' ? validationError : undefined,\n auth: server.auth,\n});\nexport const McpServersSettings = ({\n onClose,\n backgroundColor,\n}: McpServersSettingsProps) => {\n const classes = useStyles();\n const { t } = useTranslation();\n const configApi = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const mcpManagePermission = usePermission({\n permission: lightspeedMcpManagePermission,\n });\n const canManageMcp = mcpManagePermission.allowed;\n const [servers, setServers] = useState<McpServer[]>([]);\n const [sortAsc, setSortAsc] = useState(true);\n const [isLoading, setIsLoading] = useState(true);\n const [isSaving, setIsSaving] = useState<Record<string, boolean>>({});\n const [error, setError] = useState<string | null>(null);\n const [editingServerId, setEditingServerId] = useState<string | null>(null);\n const [tokenInputValue, setTokenInputValue] = useState('');\n const [hasSavedTokenInModal, setHasSavedTokenInModal] = useState(false);\n const [canRemovePersonalToken, setCanRemovePersonalToken] = useState(false);\n const [tokenValidationState, setTokenValidationState] =\n useState<TokenValidationState>('idle');\n const [tokenValidationMessage, setTokenValidationMessage] = useState('');\n\n const getBaseUrl = useCallback(() => {\n return `${configApi.getString('backend.baseUrl')}/api/intelligent-assistant`;\n }, [configApi]);\n\n const fetchJson = useCallback(\n async <T,>(url: string, init?: RequestInit): Promise<T> => {\n const response = await fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n if (!response.ok) {\n let message = `${response.status} ${response.statusText}`;\n try {\n const bodyText = await response.text();\n if (bodyText) {\n const parsed = JSON.parse(bodyText);\n if (parsed?.error) {\n message = parsed.error;\n }\n }\n } catch {\n // Keep default message when parsing fails.\n }\n throw new Error(message);\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n },\n [fetchApi],\n );\n\n const validateServer = useCallback(\n async (serverName: string) => {\n const baseUrl = getBaseUrl();\n const data = await fetchJson<McpServersValidateResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}/validate`,\n {\n method: 'POST',\n },\n );\n\n setServers(prev =>\n prev.map(server =>\n server.name === serverName\n ? {\n ...server,\n status: data.status,\n toolCount: data.toolCount,\n validationError:\n data.status === 'error'\n ? (data.validation?.error ?? 'Validation failed')\n : undefined,\n }\n : server,\n ),\n );\n return data;\n },\n [fetchJson, getBaseUrl],\n );\n\n const validateCredentials = useCallback(\n async (url: string, token: string) => {\n const baseUrl = getBaseUrl();\n return await fetchJson<McpCredentialsValidateResponse>(\n `${baseUrl}/mcp-servers/validate`,\n {\n method: 'POST',\n body: JSON.stringify({ url, token }),\n },\n );\n },\n [fetchJson, getBaseUrl],\n );\n const loadServers = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const baseUrl = getBaseUrl();\n const data = await fetchJson<McpServersListResponse>(\n `${baseUrl}/mcp-servers`,\n );\n const uiServers = (data.servers ?? []).map(server => toUiServer(server));\n setServers(uiServers);\n\n if (canManageMcp) {\n const serversToValidate = uiServers.filter(server => server.hasToken);\n void Promise.allSettled(\n serversToValidate.map(async server => {\n try {\n await validateServer(server.name);\n } catch (validationError) {\n setError(\n prev =>\n prev ??\n (validationError instanceof Error\n ? validationError.message\n : `Failed to validate ${server.name}`),\n );\n }\n }),\n );\n }\n } catch (e) {\n setError(\n e instanceof Error ? e.message : 'Failed to load MCP server settings',\n );\n } finally {\n setIsLoading(false);\n }\n }, [canManageMcp, fetchJson, getBaseUrl, validateServer]);\n\n useEffect(() => {\n loadServers();\n }, [loadServers]);\n\n const patchServer = useCallback(\n async (\n serverName: string,\n body: { enabled?: boolean; token?: string | null },\n ) => {\n if (!canManageMcp) {\n return;\n }\n setError(null);\n setIsSaving(prev => ({ ...prev, [serverName]: true }));\n try {\n const baseUrl = getBaseUrl();\n const data = await fetchJson<McpServersPatchResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n if (data.server) {\n setServers(prev =>\n prev.map(server =>\n server.name === serverName\n ? toUiServer(data.server!, data.validation?.error)\n : server,\n ),\n );\n } else {\n await loadServers();\n }\n } catch (e) {\n setError(\n e instanceof Error\n ? e.message\n : `Failed to update ${serverName} settings`,\n );\n throw e;\n } finally {\n setIsSaving(prev => ({ ...prev, [serverName]: false }));\n }\n },\n [canManageMcp, fetchJson, getBaseUrl, loadServers],\n );\n\n const editingServer = useMemo(\n () => servers.find(server => server.id === editingServerId),\n [servers, editingServerId],\n );\n\n const selectedCount = useMemo(\n () =>\n servers.filter(server => {\n const displayStatus = getDisplayStatus(server);\n const isUnavailable =\n displayStatus === 'failed' || displayStatus === 'tokenRequired';\n return server.enabled && !isUnavailable;\n }).length,\n [servers],\n );\n\n const sortedServers = useMemo(() => {\n const next = [...servers];\n next.sort((a, b) =>\n sortAsc ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n );\n return next;\n }, [servers, sortAsc]);\n\n const getDisplayDetail = useCallback(\n (server: McpServer, displayStatus: ServerStatus): string => {\n if (displayStatus === 'disabled')\n return t('mcp.settings.status.disabled');\n if (displayStatus === 'tokenRequired')\n return t('mcp.settings.status.tokenRequired');\n if (displayStatus === 'failed') return t('mcp.settings.status.failed');\n if (displayStatus === 'ok') {\n if (server.toolCount === 1) {\n return t('mcp.settings.status.oneTool' as any, {\n count: String(server.toolCount),\n });\n }\n return t('mcp.settings.status.manyTools' as any, {\n count: String(server.toolCount),\n });\n }\n return t('mcp.settings.status.unknown');\n },\n [t],\n );\n\n const closeConfigureModal = useCallback(() => {\n setEditingServerId(null);\n setTokenInputValue('');\n setHasSavedTokenInModal(false);\n setCanRemovePersonalToken(false);\n setTokenValidationState('idle');\n setTokenValidationMessage('');\n }, []);\n\n const openConfigureModal = (server: McpServer) => {\n setEditingServerId(server.id);\n const hasSavedToken = server.hasToken;\n setHasSavedTokenInModal(hasSavedToken);\n setCanRemovePersonalToken(server.hasUserToken);\n setTokenInputValue(hasSavedToken ? SAVED_TOKEN_MASK : '');\n if (server.status === 'error' && server.validationError) {\n setTokenValidationState('error');\n setTokenValidationMessage(server.validationError);\n } else {\n setTokenValidationState('idle');\n setTokenValidationMessage('');\n }\n };\n\n const onTokenInputChange = (value: string) => {\n if (hasSavedTokenInModal && value !== SAVED_TOKEN_MASK) {\n setHasSavedTokenInModal(false);\n }\n setTokenInputValue(value);\n setTokenValidationState('idle');\n setTokenValidationMessage('');\n };\n\n const clearTokenInput = () => {\n if (hasSavedTokenInModal) {\n setHasSavedTokenInModal(false);\n }\n setTokenInputValue('');\n setTokenValidationState('idle');\n setTokenValidationMessage('');\n };\n\n let tokenInputStateClass = '';\n let tokenHelperColor: string | undefined;\n if (tokenValidationState === 'success') {\n tokenInputStateClass = classes.tokenInputSuccess;\n tokenHelperColor = '#3E8635';\n } else if (tokenValidationState === 'error') {\n tokenInputStateClass = classes.tokenInputError;\n tokenHelperColor = '#C9190B';\n }\n\n let tokenInputAdornment = (\n <IconButton\n aria-label={t('mcp.settings.token.clearAriaLabel')}\n size=\"small\"\n className={classes.tokenClearButton}\n onClick={clearTokenInput}\n >\n <CancelOutlinedIcon\n style={{\n fontSize: 24,\n width: 24,\n height: 24,\n }}\n />\n </IconButton>\n );\n\n if (tokenValidationState === 'success') {\n tokenInputAdornment = (\n <CheckCircleIcon\n style={{\n color: '#3E8635',\n fontSize: 20,\n width: 20,\n height: 20,\n marginRight: 3,\n }}\n />\n );\n } else if (tokenValidationState === 'error') {\n tokenInputAdornment = (\n <ExclamationCircleIcon\n style={{\n color: '#C9190B',\n fontSize: 20,\n width: 20,\n height: 20,\n marginRight: 3,\n }}\n />\n );\n }\n\n const isUsingOrganizationCredentialInModal =\n hasSavedTokenInModal && !canRemovePersonalToken;\n\n const saveServerToken = useCallback(async () => {\n if (!editingServer || !canManageMcp) return;\n\n if (hasSavedTokenInModal && tokenInputValue === SAVED_TOKEN_MASK) {\n closeConfigureModal();\n return;\n }\n\n const token = tokenInputValue.trim();\n const hasToken = token.length > 0;\n\n setTokenValidationState('validating');\n setTokenValidationMessage(t('mcp.settings.token.validating'));\n\n try {\n if (hasToken) {\n if (!editingServer.url) {\n setTokenValidationState('error');\n setTokenValidationMessage(\n t('mcp.settings.token.urlUnavailableForValidation'),\n );\n return;\n }\n\n const credentialValidation = await validateCredentials(\n editingServer.url,\n token,\n );\n if (!credentialValidation.valid) {\n setTokenValidationState('error');\n setTokenValidationMessage(\n credentialValidation.error ??\n t('mcp.settings.token.invalidCredentials'),\n );\n return;\n }\n }\n\n setTokenValidationMessage(t('mcp.settings.token.savingAndValidating'));\n await patchServer(editingServer.name, {\n enabled: editingServer.enabled,\n token: hasToken ? token : null,\n });\n const validationResult = await validateServer(editingServer.name);\n if (validationResult.status === 'error') {\n setTokenValidationState('error');\n setTokenValidationMessage(\n validationResult.validation?.error ??\n t('mcp.settings.token.validationFailed'),\n );\n return;\n }\n setTokenValidationState('success');\n setTokenValidationMessage(t('mcp.settings.token.connectionSuccessful'));\n closeConfigureModal();\n } catch (e) {\n setTokenValidationState('error');\n setTokenValidationMessage(\n e instanceof Error\n ? e.message\n : `Failed to update ${editingServer.name} token`,\n );\n }\n }, [\n canManageMcp,\n closeConfigureModal,\n editingServer,\n hasSavedTokenInModal,\n patchServer,\n t,\n tokenInputValue,\n validateCredentials,\n validateServer,\n ]);\n\n const removePersonalToken = () => {\n setHasSavedTokenInModal(false);\n setCanRemovePersonalToken(false);\n setTokenInputValue('');\n setTokenValidationState('idle');\n setTokenValidationMessage('');\n };\n\n return (\n <div\n className={classes.root}\n style={backgroundColor ? { backgroundColor } : undefined}\n >\n <div className={classes.headerRow}>\n <div>\n <Title headingLevel=\"h2\" size=\"xl\" className={classes.title}>\n {t('mcp.settings.title')}\n </Title>\n <div className={classes.selectedCount}>\n {t('mcp.settings.selectedCount' as any, {\n selectedCount: String(selectedCount),\n totalCount: String(servers.length),\n })}\n </div>\n </div>\n <Button\n aria-label={t('mcp.settings.closeAriaLabel')}\n icon={<TimesIcon />}\n variant=\"plain\"\n className={classes.closeButton}\n onClick={onClose}\n />\n </div>\n {error && (\n <Alert\n variant=\"danger\"\n isInline\n title={error}\n className={classes.alert}\n />\n )}\n {!mcpManagePermission.loading && !canManageMcp && (\n <Alert\n variant=\"info\"\n isInline\n title={t('mcp.settings.readOnlyAccess')}\n className={classes.alert}\n />\n )}\n\n <Table\n variant=\"compact\"\n aria-label={t('mcp.settings.tableAriaLabel')}\n className={classes.table}\n >\n <Thead>\n <Tr>\n <Th width={10} screenReaderText={t('mcp.settings.enabled')} />\n <Th>\n <Button\n variant=\"link\"\n className={classes.nameHeaderButton}\n icon={sortAsc ? <SortAmountDownIcon /> : <SortAmountUpIcon />}\n iconPosition=\"right\"\n onClick={() => setSortAsc(prev => !prev)}\n >\n <Typography component=\"span\" className={classes.nameHeaderText}>\n {t('mcp.settings.name')}\n </Typography>\n </Button>\n </Th>\n <Th className={classes.statusHeader}>{t('mcp.settings.status')}</Th>\n <Th screenReaderText={t('mcp.settings.edit')} />\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (\n <Tr>\n <Td colSpan={4}>{t('mcp.settings.loading')}</Td>\n </Tr>\n )}\n {!isLoading && sortedServers.length === 0 && (\n <Tr>\n <Td colSpan={4}>{t('mcp.settings.noneAvailable')}</Td>\n </Tr>\n )}\n {sortedServers.map(server => {\n const displayStatus = getDisplayStatus(server);\n const displayDetail = getDisplayDetail(server, displayStatus);\n let statusClass = classes.statusWarn;\n if (displayStatus === 'ok') {\n statusClass = classes.statusOk;\n } else if (displayStatus === 'disabled') {\n statusClass = classes.statusDisabled;\n }\n\n return (\n <Tr key={server.id} className={classes.tableRow}>\n <Td width={10} className={classes.toggleCell}>\n {(() => {\n const isUnavailable =\n displayStatus === 'failed' ||\n displayStatus === 'tokenRequired';\n const isChecked = isUnavailable ? false : server.enabled;\n const isRowSaving = Boolean(isSaving[server.name]);\n const isToggleDisabled =\n isUnavailable || isRowSaving || !canManageMcp;\n const switchControl = (\n <Switch\n id={`mcp-switch-${server.id}`}\n aria-label={t(\n 'mcp.settings.toggleServerAriaLabel' as any,\n {\n serverName: server.name,\n },\n )}\n isChecked={isChecked}\n isDisabled={isToggleDisabled}\n onChange={(_event, checked) => {\n void patchServer(server.name, {\n enabled: checked,\n }).catch(() => {\n // patchServer already updates component error state.\n // Swallow here to avoid unhandled promise rejections\n // from event-handler fire-and-forget usage.\n });\n }}\n />\n );\n\n if (!isToggleDisabled) {\n return switchControl;\n }\n\n return (\n <Tooltip content={displayDetail}>\n <Typography component=\"span\">\n {switchControl}\n </Typography>\n </Tooltip>\n );\n })()}\n </Td>\n <Td\n width={35}\n className={`${classes.rowName} ${classes.nameCell}`}\n >\n <Typography component=\"span\" className={classes.nameValue}>\n {server.name}\n </Typography>\n </Td>\n <Td width={40} className={classes.statusColumnCell}>\n <div className={classes.statusCell}>\n {getStatusIcon(displayStatus, statusClass)}\n {displayStatus === 'failed' ? (\n <Tooltip\n content={\n server.validationError ??\n t('mcp.settings.token.validationFailed')\n }\n >\n <Typography\n component=\"span\"\n className={classes.statusValue}\n >\n {displayDetail}\n </Typography>\n </Tooltip>\n ) : (\n <Typography\n component=\"span\"\n className={classes.statusValue}\n >\n {displayDetail}\n </Typography>\n )}\n </div>\n </Td>\n <Td width={15} isActionCell style={{ textAlign: 'right' }}>\n <Button\n aria-label={t('mcp.settings.editServerAriaLabel' as any, {\n serverName: server.name,\n })}\n icon={<PencilAltIcon />}\n variant=\"plain\"\n className={classes.actionButton}\n isDisabled={!canManageMcp}\n onClick={() => openConfigureModal(server)}\n />\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n <Modal\n variant=\"small\"\n title={t('mcp.settings.configureServerTitle' as any, {\n serverName: editingServer?.name ?? '',\n })}\n isOpen={Boolean(editingServer)}\n onClose={closeConfigureModal}\n className={classes.configureModal}\n >\n <div className={classes.modalContent}>\n <IconButton\n aria-label={t('mcp.settings.closeConfigureModalAriaLabel')}\n size=\"small\"\n className={classes.modalCustomCloseButton}\n onClick={closeConfigureModal}\n >\n <CloseOutlinedIcon />\n </IconButton>\n <div className={classes.modalHeading}>\n <LockIcon />\n <Typography component=\"div\">\n {t('mcp.settings.configureServerTitle' as any, {\n serverName: editingServer?.name ?? '',\n })}\n </Typography>\n </div>\n {editingServer?.auth === 'dcr' ? (\n <>\n <div className={classes.modalDescription}>\n {t('mcp.settings.modalDescriptionDcr')}\n </div>\n <div className={classes.modalActions}>\n <Button\n key=\"close\"\n variant=\"primary\"\n onClick={closeConfigureModal}\n className={classes.modalActionButton}\n >\n {t('common.cancel')}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className={classes.modalDescription}>\n {t('mcp.settings.modalDescription')}\n </div>\n <div className={classes.tokenRow}>\n <TextField\n id=\"mcp-pat-input\"\n type=\"password\"\n variant=\"outlined\"\n fullWidth\n value={tokenInputValue}\n onChange={event => onTokenInputChange(event.target.value)}\n className={`${classes.tokenInput} ${tokenInputStateClass}`}\n label={\n hasSavedTokenInModal\n ? t('mcp.settings.savedToken')\n : t('mcp.settings.personalAccessToken')\n }\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n {tokenInputAdornment}\n </InputAdornment>\n ),\n }}\n />\n {(isUsingOrganizationCredentialInModal ||\n !hasSavedTokenInModal ||\n tokenValidationState !== 'idle') && (\n <div\n className={classes.tokenHelper}\n style={{ color: tokenHelperColor }}\n >\n {tokenValidationMessage ||\n (isUsingOrganizationCredentialInModal\n ? t('mcp.settings.usingAdminCredential')\n : t('mcp.settings.enterToken'))}\n </div>\n )}\n </div>\n <div className={classes.modalActions}>\n <Button\n key=\"save\"\n variant=\"primary\"\n onClick={() => void saveServerToken()}\n isDisabled={\n !canManageMcp ||\n Boolean(isSaving[editingServer?.name ?? '']) ||\n tokenValidationState === 'validating'\n }\n className={classes.modalActionButton}\n >\n {t('modal.save')}\n </Button>\n {canRemovePersonalToken && hasSavedTokenInModal && (\n <Button\n key=\"forget-token\"\n variant=\"plain\"\n onClick={removePersonalToken}\n isDisabled={\n !canManageMcp ||\n Boolean(isSaving[editingServer?.name ?? '']) ||\n tokenValidationState === 'validating'\n }\n className={classes.forgetTokenButton}\n >\n {t('mcp.settings.removePersonalToken')}\n </Button>\n )}\n <Button\n key=\"cancel\"\n variant=\"link\"\n onClick={closeConfigureModal}\n className={classes.modalCancelButton}\n >\n {t('common.cancel')}\n </Button>\n </div>\n </>\n )}\n </div>\n </Modal>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
const McpSettingsIcon = () => /* @__PURE__ */ jsx(
|
|
4
|
+
"svg",
|
|
5
|
+
{
|
|
6
|
+
viewBox: "0 0 512 512",
|
|
7
|
+
fill: "currentColor",
|
|
8
|
+
"aria-hidden": "true",
|
|
9
|
+
role: "img",
|
|
10
|
+
width: "1em",
|
|
11
|
+
height: "1em",
|
|
12
|
+
style: { display: "block" },
|
|
13
|
+
children: /* @__PURE__ */ jsx("path", { d: "M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z" })
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export { McpSettingsIcon };
|
|
18
|
+
//# sourceMappingURL=McpSettingsIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpSettingsIcon.esm.js","sources":["../../src/components/McpSettingsIcon.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\nexport const McpSettingsIcon = () => (\n <svg\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n role=\"img\"\n width=\"1em\"\n height=\"1em\"\n style={{ display: 'block' }}\n >\n <path d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n);\n"],"names":[],"mappings":";;AAgBO,MAAM,kBAAkB,sBAC7B,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,OAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAK,cAAA;AAAA,IACL,aAAA,EAAY,MAAA;AAAA,IACZ,IAAA,EAAK,KAAA;AAAA,IACL,KAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAQ;AAAA,IAE1B,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4yBAAA,EAA6yB;AAAA;AACvzB;;;;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { makeStyles } from '@material-ui/core';
|
|
4
|
+
import { Dropdown, DropdownList, DropdownItem, MenuToggle } from '@patternfly/react-core';
|
|
5
|
+
import { AngleDownIcon } from '@patternfly/react-icons';
|
|
6
|
+
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
7
|
+
|
|
8
|
+
const useStyles = makeStyles((theme) => ({
|
|
9
|
+
selectorToggle: {
|
|
10
|
+
display: "flex",
|
|
11
|
+
alignItems: "center",
|
|
12
|
+
gap: 4,
|
|
13
|
+
color: theme.palette.text.secondary,
|
|
14
|
+
fontSize: 14,
|
|
15
|
+
fontWeight: 500,
|
|
16
|
+
cursor: "pointer",
|
|
17
|
+
padding: "4px 8px",
|
|
18
|
+
borderRadius: 8,
|
|
19
|
+
border: "none",
|
|
20
|
+
background: "transparent",
|
|
21
|
+
"&:hover": {
|
|
22
|
+
backgroundColor: theme.palette.action.hover
|
|
23
|
+
},
|
|
24
|
+
"&:disabled": {
|
|
25
|
+
cursor: "not-allowed",
|
|
26
|
+
opacity: 0.5
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
dropdown: {
|
|
30
|
+
"& ul, & li": {
|
|
31
|
+
padding: 0,
|
|
32
|
+
margin: 0
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
const MessageBarModelSelector = ({
|
|
37
|
+
selectedModel,
|
|
38
|
+
models,
|
|
39
|
+
onSelect,
|
|
40
|
+
disabled = false
|
|
41
|
+
}) => {
|
|
42
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
43
|
+
const classes = useStyles();
|
|
44
|
+
const { t } = useTranslation();
|
|
45
|
+
const selectedModelLabel = models.find((m) => m.value === selectedModel)?.label ?? selectedModel;
|
|
46
|
+
const toggle = (toggleRef) => /* @__PURE__ */ jsxs(
|
|
47
|
+
MenuToggle,
|
|
48
|
+
{
|
|
49
|
+
ref: toggleRef,
|
|
50
|
+
onClick: () => setIsOpen(!isOpen),
|
|
51
|
+
isExpanded: isOpen,
|
|
52
|
+
isDisabled: disabled,
|
|
53
|
+
variant: "plain",
|
|
54
|
+
className: classes.selectorToggle,
|
|
55
|
+
"aria-label": t("aria.chatbotSelector"),
|
|
56
|
+
children: [
|
|
57
|
+
selectedModelLabel,
|
|
58
|
+
/* @__PURE__ */ jsx(AngleDownIcon, {})
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
Dropdown,
|
|
64
|
+
{
|
|
65
|
+
className: classes.dropdown,
|
|
66
|
+
isOpen,
|
|
67
|
+
onSelect: (_e, value) => {
|
|
68
|
+
onSelect(value);
|
|
69
|
+
setIsOpen(false);
|
|
70
|
+
},
|
|
71
|
+
onOpenChange: (open) => setIsOpen(open),
|
|
72
|
+
popperProps: { position: "left" },
|
|
73
|
+
shouldFocusToggleOnSelect: true,
|
|
74
|
+
shouldFocusFirstItemOnOpen: false,
|
|
75
|
+
toggle,
|
|
76
|
+
isScrollable: models.length > 10,
|
|
77
|
+
maxMenuHeight: models.length > 10 ? "240px" : void 0,
|
|
78
|
+
children: /* @__PURE__ */ jsx(DropdownList, { children: models.map((model) => /* @__PURE__ */ jsx(
|
|
79
|
+
DropdownItem,
|
|
80
|
+
{
|
|
81
|
+
value: model.value,
|
|
82
|
+
isSelected: selectedModel === model.value,
|
|
83
|
+
children: model.label
|
|
84
|
+
},
|
|
85
|
+
model.value
|
|
86
|
+
)) })
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export { MessageBarModelSelector };
|
|
92
|
+
//# sourceMappingURL=MessageBarModelSelector.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageBarModelSelector.esm.js","sources":["../../src/components/MessageBarModelSelector.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 { Ref, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core';\nimport {\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport { AngleDownIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype MessageBarModelSelectorProps = {\n selectedModel: string;\n models: { label: string; value: string; provider: string }[];\n onSelect: (model: string) => void;\n disabled?: boolean;\n};\n\nconst useStyles = makeStyles(theme => ({\n selectorToggle: {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n color: theme.palette.text.secondary,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: 8,\n border: 'none',\n background: 'transparent',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.5,\n },\n },\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n}));\n\nexport const MessageBarModelSelector = ({\n selectedModel,\n models,\n onSelect,\n disabled = false,\n}: MessageBarModelSelectorProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const classes = useStyles();\n const { t } = useTranslation();\n\n const selectedModelLabel =\n models.find(m => m.value === selectedModel)?.label ?? selectedModel;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setIsOpen(!isOpen)}\n isExpanded={isOpen}\n isDisabled={disabled}\n variant=\"plain\"\n className={classes.selectorToggle}\n aria-label={t('aria.chatbotSelector')}\n >\n {selectedModelLabel}\n <AngleDownIcon />\n </MenuToggle>\n );\n\n return (\n <Dropdown\n className={classes.dropdown}\n isOpen={isOpen}\n onSelect={(_e, value) => {\n onSelect(value as string);\n setIsOpen(false);\n }}\n onOpenChange={open => setIsOpen(open)}\n popperProps={{ position: 'left' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={models.length > 10}\n maxMenuHeight={models.length > 10 ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n ))}\n </DropdownList>\n </Dropdown>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
3
|
+
import permissionRequired from '../images/permission-required.svg';
|
|
4
|
+
|
|
5
|
+
const PermissionRequiredIcon = () => {
|
|
6
|
+
const { t } = useTranslation();
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
"img",
|
|
9
|
+
{
|
|
10
|
+
src: permissionRequired,
|
|
11
|
+
alt: t("icon.permissionRequired.alt"),
|
|
12
|
+
style: { width: "clamp(200px, 50cqi, 600px)" }
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { PermissionRequiredIcon };
|
|
18
|
+
//# sourceMappingURL=PermissionRequiredIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionRequiredIcon.esm.js","sources":["../../src/components/PermissionRequiredIcon.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 { useTranslation } from '../hooks/useTranslation';\nimport permissionRequired from '../images/permission-required.svg';\n\nexport const PermissionRequiredIcon = () => {\n const { t } = useTranslation();\n\n return (\n <img\n src={permissionRequired as any}\n alt={t('icon.permissionRequired.alt')}\n style={{ width: 'clamp(200px, 50cqi, 600px)' }}\n />\n );\n};\n"],"names":[],"mappings":";;;;AAmBO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,kBAAA;AAAA,MACL,GAAA,EAAK,EAAE,6BAA6B,CAAA;AAAA,MACpC,KAAA,EAAO,EAAE,KAAA,EAAO,4BAAA;AAA6B;AAAA,GAC/C;AAEJ;;;;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Fragment as Fragment$1 } from 'react';
|
|
3
|
+
import { EmptyState } from '@backstage/core-components';
|
|
4
|
+
import { makeStyles, createStyles } from '@material-ui/core/styles';
|
|
5
|
+
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
6
|
+
import { PermissionRequiredIcon } from './PermissionRequiredIcon.esm.js';
|
|
7
|
+
import { Trans } from './Trans.esm.js';
|
|
8
|
+
|
|
9
|
+
const useStyles = makeStyles(
|
|
10
|
+
(theme) => createStyles({
|
|
11
|
+
root: {
|
|
12
|
+
display: "flex",
|
|
13
|
+
flexDirection: "column",
|
|
14
|
+
width: "100%",
|
|
15
|
+
height: "100%",
|
|
16
|
+
minHeight: "100%",
|
|
17
|
+
flex: 1,
|
|
18
|
+
alignItems: "center",
|
|
19
|
+
justifyContent: "center",
|
|
20
|
+
backgroundColor: theme.palette.background.default,
|
|
21
|
+
containerType: "inline-size",
|
|
22
|
+
'& [class*="BackstageEmptyState-root"]': {
|
|
23
|
+
alignItems: "center",
|
|
24
|
+
padding: theme.spacing(4)
|
|
25
|
+
},
|
|
26
|
+
'& [class*="MuiTypography-h5"]': {
|
|
27
|
+
fontSize: "clamp(1.875rem, 3.75cqi, 3.125rem)",
|
|
28
|
+
fontWeight: 400
|
|
29
|
+
},
|
|
30
|
+
'& [class*="MuiTypography-body1"]': {
|
|
31
|
+
fontSize: "1em",
|
|
32
|
+
color: theme.palette.text.secondary,
|
|
33
|
+
"& b": {
|
|
34
|
+
fontWeight: 500,
|
|
35
|
+
color: theme.palette.text.primary
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"@container (max-width: 899px)": {
|
|
39
|
+
'& [class*="BackstageEmptyState-root"]': {
|
|
40
|
+
textAlign: "center"
|
|
41
|
+
},
|
|
42
|
+
'& [class*="MuiGrid-grid-md-6"]': {
|
|
43
|
+
maxWidth: "100%",
|
|
44
|
+
flexBasis: "100%"
|
|
45
|
+
},
|
|
46
|
+
'& [class*="BackstageEmptyState-imageContainer"]': {
|
|
47
|
+
order: -1,
|
|
48
|
+
display: "flex",
|
|
49
|
+
justifyContent: "center",
|
|
50
|
+
marginBottom: theme.spacing(-4)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
);
|
|
56
|
+
const PermissionRequiredState = ({
|
|
57
|
+
subject,
|
|
58
|
+
permissions,
|
|
59
|
+
action
|
|
60
|
+
}) => {
|
|
61
|
+
const classes = useStyles();
|
|
62
|
+
const { t } = useTranslation();
|
|
63
|
+
const permissionsList = /* @__PURE__ */ jsx(Fragment, { children: permissions.map((perm, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
64
|
+
/* @__PURE__ */ jsx("b", { children: perm }),
|
|
65
|
+
i < permissions.length - 1 && " and "
|
|
66
|
+
] }, perm)) });
|
|
67
|
+
return /* @__PURE__ */ jsx("div", { className: classes.root, children: /* @__PURE__ */ jsx(
|
|
68
|
+
EmptyState,
|
|
69
|
+
{
|
|
70
|
+
title: t("permission.required.title"),
|
|
71
|
+
description: /* @__PURE__ */ jsx(
|
|
72
|
+
Trans,
|
|
73
|
+
{
|
|
74
|
+
message: "permission.required.description",
|
|
75
|
+
components: {
|
|
76
|
+
"<subject/>": /* @__PURE__ */ jsx(Fragment, { children: subject }),
|
|
77
|
+
"<permissions/>": permissionsList
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
missing: { customImage: /* @__PURE__ */ jsx(PermissionRequiredIcon, {}) },
|
|
82
|
+
action
|
|
83
|
+
}
|
|
84
|
+
) });
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { PermissionRequiredState as default };
|
|
88
|
+
//# sourceMappingURL=PermissionRequiredState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionRequiredState.esm.js","sources":["../../src/components/PermissionRequiredState.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 { Fragment } from 'react';\n\nimport { EmptyState } from '@backstage/core-components';\n\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { PermissionRequiredIcon } from './PermissionRequiredIcon';\nimport { Trans } from './Trans';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n root: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: '100%',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.palette.background.default,\n containerType: 'inline-size',\n '& [class*=\"BackstageEmptyState-root\"]': {\n alignItems: 'center',\n padding: theme.spacing(4),\n },\n '& [class*=\"MuiTypography-h5\"]': {\n fontSize: 'clamp(1.875rem, 3.75cqi, 3.125rem)',\n fontWeight: 400,\n },\n '& [class*=\"MuiTypography-body1\"]': {\n fontSize: '1em',\n color: theme.palette.text.secondary,\n '& b': {\n fontWeight: 500,\n color: theme.palette.text.primary,\n },\n },\n '@container (max-width: 899px)': {\n '& [class*=\"BackstageEmptyState-root\"]': {\n textAlign: 'center',\n },\n '& [class*=\"MuiGrid-grid-md-6\"]': {\n maxWidth: '100%',\n flexBasis: '100%',\n },\n '& [class*=\"BackstageEmptyState-imageContainer\"]': {\n order: -1,\n display: 'flex',\n justifyContent: 'center',\n marginBottom: theme.spacing(-4),\n },\n },\n },\n }),\n);\n\ninterface PermissionRequiredStateProps {\n subject: string;\n permissions: string[];\n action: JSX.Element;\n}\n\nconst PermissionRequiredState = ({\n subject,\n permissions,\n action,\n}: PermissionRequiredStateProps) => {\n const classes = useStyles();\n const { t } = useTranslation();\n\n const permissionsList = (\n <>\n {permissions.map((perm, i) => (\n <Fragment key={perm}>\n <b>{perm}</b>\n {i < permissions.length - 1 && ' and '}\n </Fragment>\n ))}\n </>\n );\n\n return (\n <div className={classes.root}>\n <EmptyState\n title={t('permission.required.title')}\n description={\n <Trans\n message=\"permission.required.description\"\n components={{\n '<subject/>': <>{subject}</>,\n '<permissions/>': permissionsList,\n }}\n />\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={action}\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":["Fragment"],"mappings":";;;;;;;;AA0BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAAW,WAC3B,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAM,CAAA;AAAA,MACN,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,MAC1C,aAAA,EAAe,aAAA;AAAA,MACf,uCAAA,EAAyC;AAAA,QACvC,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,OAC1B;AAAA,MACA,+BAAA,EAAiC;AAAA,QAC/B,QAAA,EAAU,oCAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACd;AAAA,MACA,kCAAA,EAAoC;AAAA,QAClC,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,GAAA;AAAA,UACZ,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA;AAC5B,OACF;AAAA,MACA,+BAAA,EAAiC;AAAA,QAC/B,uCAAA,EAAyC;AAAA,UACvC,SAAA,EAAW;AAAA,SACb;AAAA,QACA,gCAAA,EAAkC;AAAA,UAChC,QAAA,EAAU,MAAA;AAAA,UACV,SAAA,EAAW;AAAA,SACb;AAAA,QACA,iDAAA,EAAmD;AAAA,UACjD,KAAA,EAAO,EAAA;AAAA,UACP,OAAA,EAAS,MAAA;AAAA,UACT,cAAA,EAAgB,QAAA;AAAA,UAChB,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,EAAE;AAAA;AAChC;AACF;AACF,GACD;AACH,CAAA;AAQA,MAAM,0BAA0B,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,eAAA,mCAED,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBACtB,IAAA,CAACA,UAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAG,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IACR,CAAA,GAAI,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK;AAAA,GAAA,EAAA,EAFlB,IAGf,CACD,CAAA,EACH,CAAA;AAGF,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WAAA,kBACE,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,iCAAA;AAAA,UACR,UAAA,EAAY;AAAA,YACV,YAAA,kCAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,YACzB,gBAAA,EAAkB;AAAA;AACpB;AAAA,OACF;AAAA,MAEF,OAAA,EAAS,EAAE,WAAA,kBAAa,GAAA,CAAC,0BAAuB,CAAA,EAAG;AAAA,MACnD;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { TextField } from '@material-ui/core';
|
|
4
|
+
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
|
|
5
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
6
|
+
import Alert from '@mui/material/Alert';
|
|
7
|
+
import Box from '@mui/material/Box';
|
|
8
|
+
import Button from '@mui/material/Button';
|
|
9
|
+
import Dialog from '@mui/material/Dialog';
|
|
10
|
+
import DialogActions from '@mui/material/DialogActions';
|
|
11
|
+
import DialogContent from '@mui/material/DialogContent';
|
|
12
|
+
import DialogTitle from '@mui/material/DialogTitle';
|
|
13
|
+
import IconButton from '@mui/material/IconButton';
|
|
14
|
+
import Typography from '@mui/material/Typography';
|
|
15
|
+
import { useConversations } from '../hooks/useConversations.esm.js';
|
|
16
|
+
import { useRenameConversation } from '../hooks/useRenameConversation.esm.js';
|
|
17
|
+
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
18
|
+
|
|
19
|
+
const RenameConversationModal = ({
|
|
20
|
+
isOpen,
|
|
21
|
+
onClose,
|
|
22
|
+
conversationId
|
|
23
|
+
}) => {
|
|
24
|
+
const { t } = useTranslation();
|
|
25
|
+
const {
|
|
26
|
+
mutateAsync: renameConversation,
|
|
27
|
+
isError,
|
|
28
|
+
error
|
|
29
|
+
} = useRenameConversation();
|
|
30
|
+
const { data: conversations } = useConversations();
|
|
31
|
+
const [chatName, setChatName] = useState("");
|
|
32
|
+
const [originalChatName, setOriginalChatName] = useState("");
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (isOpen && conversations) {
|
|
35
|
+
const conversation = conversations.find(
|
|
36
|
+
(c) => c.conversation_id === conversationId
|
|
37
|
+
);
|
|
38
|
+
if (conversation) {
|
|
39
|
+
setChatName(conversation.topic_summary ?? "");
|
|
40
|
+
setOriginalChatName(conversation.topic_summary ?? "");
|
|
41
|
+
} else {
|
|
42
|
+
setChatName("");
|
|
43
|
+
setOriginalChatName("");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}, [isOpen, conversationId, conversations]);
|
|
47
|
+
const handleChatNameChange = (event) => {
|
|
48
|
+
setChatName(event.target.value);
|
|
49
|
+
};
|
|
50
|
+
const handleRename = async () => {
|
|
51
|
+
try {
|
|
52
|
+
await renameConversation({
|
|
53
|
+
conversation_id: conversationId,
|
|
54
|
+
newName: chatName,
|
|
55
|
+
invalidateCache: false
|
|
56
|
+
});
|
|
57
|
+
onClose();
|
|
58
|
+
} catch (e) {
|
|
59
|
+
console.warn(e);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ jsxs(
|
|
63
|
+
Dialog,
|
|
64
|
+
{
|
|
65
|
+
open: isOpen,
|
|
66
|
+
onClose,
|
|
67
|
+
"aria-labelledby": "rename-modal",
|
|
68
|
+
"aria-describedby": "rename-modal-confirmation",
|
|
69
|
+
fullWidth: true,
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ jsx(DialogTitle, { sx: { p: "16px 20px", fontStyle: "inherit" }, children: /* @__PURE__ */ jsxs(
|
|
72
|
+
Box,
|
|
73
|
+
{
|
|
74
|
+
sx: {
|
|
75
|
+
display: "flex",
|
|
76
|
+
alignItems: "center",
|
|
77
|
+
gap: 1
|
|
78
|
+
},
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: t("conversation.rename.confirm.title") }),
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
IconButton,
|
|
83
|
+
{
|
|
84
|
+
"aria-label": "close",
|
|
85
|
+
onClick: onClose,
|
|
86
|
+
title: t("common.close"),
|
|
87
|
+
size: "large",
|
|
88
|
+
sx: {
|
|
89
|
+
position: "absolute",
|
|
90
|
+
right: 1,
|
|
91
|
+
top: 1,
|
|
92
|
+
color: "text.primary"
|
|
93
|
+
},
|
|
94
|
+
children: /* @__PURE__ */ jsx(CloseIcon, {})
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
) }),
|
|
100
|
+
/* @__PURE__ */ jsx(DialogContent, { id: "rename-modal-body-input", children: /* @__PURE__ */ jsx(
|
|
101
|
+
TextField,
|
|
102
|
+
{
|
|
103
|
+
id: "outlined-chat-name-input",
|
|
104
|
+
label: t("conversation.rename.placeholder"),
|
|
105
|
+
onChange: handleChatNameChange,
|
|
106
|
+
fullWidth: true,
|
|
107
|
+
value: chatName,
|
|
108
|
+
style: { marginTop: "10px" },
|
|
109
|
+
variant: "outlined",
|
|
110
|
+
InputProps: {
|
|
111
|
+
autoFocus: true,
|
|
112
|
+
endAdornment: /* @__PURE__ */ jsx(
|
|
113
|
+
IconButton,
|
|
114
|
+
{
|
|
115
|
+
"aria-label": "clear-input",
|
|
116
|
+
onClick: () => setChatName(""),
|
|
117
|
+
edge: "end",
|
|
118
|
+
children: /* @__PURE__ */ jsx(CancelOutlinedIcon, {})
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
) }),
|
|
124
|
+
isError && /* @__PURE__ */ jsx(Box, { maxWidth: "650px", marginLeft: "20px", marginRight: "20px", children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error) }) }),
|
|
125
|
+
/* @__PURE__ */ jsxs(DialogActions, { style: { justifyContent: "left", padding: "20px" }, children: [
|
|
126
|
+
/* @__PURE__ */ jsx(
|
|
127
|
+
Button,
|
|
128
|
+
{
|
|
129
|
+
variant: "contained",
|
|
130
|
+
sx: {
|
|
131
|
+
textTransform: "none"
|
|
132
|
+
},
|
|
133
|
+
disabled: chatName.trim() === "" || chatName.trim() === originalChatName.trim(),
|
|
134
|
+
onClick: handleRename,
|
|
135
|
+
children: t("conversation.rename.confirm.action")
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
/* @__PURE__ */ jsx(
|
|
139
|
+
Button,
|
|
140
|
+
{
|
|
141
|
+
variant: "outlined",
|
|
142
|
+
sx: {
|
|
143
|
+
textTransform: "none"
|
|
144
|
+
},
|
|
145
|
+
onClick: onClose,
|
|
146
|
+
children: t("common.cancel")
|
|
147
|
+
},
|
|
148
|
+
"cancel"
|
|
149
|
+
)
|
|
150
|
+
] })
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export { RenameConversationModal };
|
|
157
|
+
//# sourceMappingURL=RenameConversationModal.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenameConversationModal.esm.js","sources":["../../src/components/RenameConversationModal.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 { useEffect, useState } from 'react';\n\nimport { TextField } from '@material-ui/core';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\n\nimport { useConversations } from '../hooks/useConversations';\nimport { useRenameConversation } from '../hooks/useRenameConversation';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport const RenameConversationModal = ({\n isOpen,\n onClose,\n conversationId,\n}: {\n isOpen: boolean;\n onClose: () => void;\n conversationId: string;\n}) => {\n const { t } = useTranslation();\n const {\n mutateAsync: renameConversation,\n isError,\n error,\n } = useRenameConversation();\n const { data: conversations } = useConversations();\n const [chatName, setChatName] = useState<string>('');\n const [originalChatName, setOriginalChatName] = useState<string>('');\n\n useEffect(() => {\n if (isOpen && conversations) {\n const conversation = conversations.find(\n c => c.conversation_id === conversationId,\n );\n if (conversation) {\n setChatName(conversation.topic_summary ?? '');\n setOriginalChatName(conversation.topic_summary ?? '');\n } else {\n setChatName('');\n setOriginalChatName('');\n }\n }\n }, [isOpen, conversationId, conversations]);\n\n const handleChatNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setChatName(event.target.value);\n };\n\n const handleRename = async () => {\n try {\n await renameConversation({\n conversation_id: conversationId,\n newName: chatName,\n invalidateCache: false,\n });\n onClose();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n };\n\n return (\n <Dialog\n open={isOpen}\n onClose={onClose}\n aria-labelledby=\"rename-modal\"\n aria-describedby=\"rename-modal-confirmation\"\n fullWidth\n >\n <DialogTitle sx={{ p: '16px 20px', fontStyle: 'inherit' }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n {t('conversation.rename.confirm.title')}\n </Typography>\n\n <IconButton\n aria-label=\"close\"\n onClick={onClose}\n title={t('common.close')}\n size=\"large\"\n sx={{\n position: 'absolute',\n right: 1,\n top: 1,\n color: 'text.primary',\n }}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent id=\"rename-modal-body-input\">\n <TextField\n id=\"outlined-chat-name-input\"\n label={t('conversation.rename.placeholder')}\n onChange={handleChatNameChange}\n fullWidth\n value={chatName}\n style={{ marginTop: '10px' }}\n variant=\"outlined\"\n InputProps={{\n autoFocus: true,\n endAdornment: (\n <IconButton\n aria-label=\"clear-input\"\n onClick={() => setChatName('')}\n edge=\"end\"\n >\n <CancelOutlinedIcon />\n </IconButton>\n ),\n }}\n />\n </DialogContent>\n {isError && (\n <Box maxWidth=\"650px\" marginLeft=\"20px\" marginRight=\"20px\">\n <Alert severity=\"error\">{String(error)}</Alert>\n </Box>\n )}\n <DialogActions style={{ justifyContent: 'left', padding: '20px' }}>\n <Button\n variant=\"contained\"\n sx={{\n textTransform: 'none',\n }}\n disabled={\n chatName.trim() === '' ||\n chatName.trim() === originalChatName.trim()\n }\n onClick={handleRename}\n >\n {t('conversation.rename.confirm.action')}\n </Button>\n <Button\n key=\"cancel\"\n variant=\"outlined\"\n sx={{\n textTransform: 'none',\n }}\n onClick={onClose}\n >\n {t('common.cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Routes, Route } from 'react-router-dom';
|
|
3
|
+
import { useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
4
|
+
import { StylesProvider as StylesProvider$1 } from '@material-ui/core/styles';
|
|
5
|
+
import { StylesProvider } from '@mui/styles';
|
|
6
|
+
import { generateClassName, generateClassNameV4 } from '../utils/generateClassName.esm.js';
|
|
7
|
+
import { LightspeedPage } from './LightspeedPage.esm.js';
|
|
8
|
+
|
|
9
|
+
const Router = () => {
|
|
10
|
+
const configApi = useApi(configApiRef);
|
|
11
|
+
const notebooksEnabled = configApi.getOptionalBoolean("intelligent-assistant.notebooks.enabled") ?? false;
|
|
12
|
+
return /* @__PURE__ */ jsx(StylesProvider, { generateClassName, children: /* @__PURE__ */ jsx(StylesProvider$1, { generateClassName: generateClassNameV4, children: /* @__PURE__ */ jsxs(Routes, { children: [
|
|
13
|
+
/* @__PURE__ */ jsx(Route, { path: "/", element: /* @__PURE__ */ jsx(LightspeedPage, {}) }),
|
|
14
|
+
/* @__PURE__ */ jsx(
|
|
15
|
+
Route,
|
|
16
|
+
{
|
|
17
|
+
path: "/conversation/:conversationId",
|
|
18
|
+
element: /* @__PURE__ */ jsx(LightspeedPage, {})
|
|
19
|
+
}
|
|
20
|
+
),
|
|
21
|
+
notebooksEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
22
|
+
/* @__PURE__ */ jsx(Route, { path: "/notebooks", element: /* @__PURE__ */ jsx(LightspeedPage, {}) }),
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
Route,
|
|
25
|
+
{
|
|
26
|
+
path: "/notebooks/:notebookId",
|
|
27
|
+
element: /* @__PURE__ */ jsx(LightspeedPage, {})
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
] })
|
|
31
|
+
] }) }) });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { Router };
|
|
35
|
+
//# sourceMappingURL=Router.esm.js.map
|