@red-hat-developer-hub/backstage-plugin-lightspeed 2.6.0 → 2.6.2
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 +14 -0
- package/dist/alpha/LightspeedFAB.esm.js.map +1 -1
- package/dist/alpha/LightspeedProvider.esm.js.map +1 -1
- package/dist/alpha.esm.js +1 -1
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api/LightspeedApiClient.esm.js +1 -1
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/NotebooksApiClient.esm.js.map +1 -1
- package/dist/api/api.esm.js.map +1 -1
- package/dist/api/notebooksApi.esm.js.map +1 -1
- package/dist/components/Attachment.esm.js +2 -2
- package/dist/components/Attachment.esm.js.map +1 -1
- package/dist/components/AttachmentContext.esm.js +1 -1
- package/dist/components/AttachmentContext.esm.js.map +1 -1
- package/dist/components/DeleteModal.esm.js.map +1 -1
- package/dist/components/FilePreview.esm.js.map +1 -1
- package/dist/components/LightSpeedChat.esm.js +16 -16
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBox.esm.js +5 -5
- package/dist/components/LightspeedChatBox.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
- package/dist/components/LightspeedChatModelsState.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -1
- package/dist/components/LightspeedFAB.esm.js.map +1 -1
- package/dist/components/LightspeedIcon.esm.js.map +1 -1
- package/dist/components/LightspeedPage.esm.js.map +1 -1
- package/dist/components/McpServersSettings.esm.js +3 -3
- package/dist/components/McpServersSettings.esm.js.map +1 -1
- package/dist/components/McpSettingsIcon.esm.js.map +1 -1
- package/dist/components/PermissionRequiredIcon.esm.js.map +1 -1
- package/dist/components/PermissionRequiredState.esm.js.map +1 -1
- package/dist/components/RenameConversationModal.esm.js.map +1 -1
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/components/ToolCallContent.esm.js +3 -3
- package/dist/components/ToolCallContent.esm.js.map +1 -1
- package/dist/components/Trans.esm.js.map +1 -1
- package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
- package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -1
- package/dist/components/notebooks/DocumentSidebar.esm.js +2 -2
- package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
- package/dist/components/notebooks/FileListItem.esm.js.map +1 -1
- package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -1
- package/dist/components/notebooks/NotebookCard.esm.js +1 -1
- package/dist/components/notebooks/NotebookCard.esm.js.map +1 -1
- package/dist/components/notebooks/NotebookView.esm.js +3 -3
- package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
- package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
- package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -1
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
- package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -1
- package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
- package/dist/const.esm.js.map +1 -1
- package/dist/dev.esm.js.map +1 -1
- package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -1
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js.map +1 -1
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -1
- package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -1
- package/dist/hooks/toolCallsCacheStore.esm.js +1 -1
- package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -1
- package/dist/hooks/useAllModels.esm.js.map +1 -1
- package/dist/hooks/useAutoScroll.esm.js +1 -1
- package/dist/hooks/useAutoScroll.esm.js.map +1 -1
- package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -1
- package/dist/hooks/useBufferedMessages.esm.js.map +1 -1
- package/dist/hooks/useCaptureFeedback.esm.js.map +1 -1
- package/dist/hooks/useConversationMessages.esm.js +1 -1
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useConversations.esm.js.map +1 -1
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
- package/dist/hooks/useDeleteConversation.esm.js.map +1 -1
- package/dist/hooks/useDisplayModeSettings.esm.js +1 -1
- package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -1
- package/dist/hooks/useFeedbackActions.esm.js +3 -3
- package/dist/hooks/useFeedbackActions.esm.js.map +1 -1
- package/dist/hooks/useFeedbackState.esm.js.map +1 -1
- package/dist/hooks/useFeedbackStatus.esm.js.map +1 -1
- package/dist/hooks/useIsMobile.esm.js.map +1 -1
- package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -1
- package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -1
- package/dist/hooks/useLightspeedDrawerContext.esm.js +1 -1
- package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -1
- package/dist/hooks/useLightspeedProviderState.esm.js +2 -2
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
- package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -1
- package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -1
- package/dist/hooks/usePinnedChatsSettings.esm.js +2 -2
- package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -1
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -1
- package/dist/hooks/useRenameConversation.esm.js.map +1 -1
- package/dist/hooks/useSortSettings.esm.js +2 -2
- package/dist/hooks/useSortSettings.esm.js.map +1 -1
- package/dist/hooks/useStopConversation.esm.js.map +1 -1
- package/dist/hooks/useTranslation.esm.js.map +1 -1
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -2
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/index.esm.js.map +1 -1
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js.map +1 -1
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/attachment-utils.esm.js.map +1 -1
- package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -1
- package/dist/utils/lightspeed-chatbox-utils.esm.js +4 -4
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
- package/dist/utils/notebook-upload-utils.esm.js +1 -1
- package/dist/utils/notebook-upload-utils.esm.js.map +1 -1
- package/dist/utils/notebooks-utils.esm.js +1 -1
- package/dist/utils/notebooks-utils.esm.js.map +1 -1
- package/dist/utils/prompt-utils.esm.js.map +1 -1
- package/dist/utils/queryClient.esm.js.map +1 -1
- package/dist/utils/reasoningParser.esm.js.map +1 -1
- package/dist/utils/toolCallMapper.esm.js +2 -2
- package/dist/utils/toolCallMapper.esm.js.map +1 -1
- package/dist/utils/user-utils.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +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 ModeEditOutlineOutlinedIcon from '@mui/icons-material/ModeEditOutlineOutlined';\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 KeyIcon,\n LockIcon,\n OffIcon,\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-lightspeed-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};\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.secondary,\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 statusToken: {\n color: '#147878',\n },\n statusWarn: {\n color: '#B1380B',\n },\n statusDisabled: {\n color: theme.palette.text.secondary,\n },\n actionButton: {\n color: theme.palette.text.secondary,\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: '#1F1F1F',\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.text.secondary,\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 '& 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};\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 <OffIcon 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});\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/lightspeed`;\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 color: '#6A6E73',\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 === 'tokenRequired') {\n statusClass = classes.statusToken;\n } else if (displayStatus === 'disabled') {\n statusClass = classes.statusDisabled;\n }\n\n return (\n <Tr key={server.id}>\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={<ModeEditOutlineOutlinedIcon fontSize=\"small\" />}\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 <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 </div>\n </Modal>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
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 ModeEditOutlineOutlinedIcon from '@mui/icons-material/ModeEditOutlineOutlined';\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 KeyIcon,\n LockIcon,\n OffIcon,\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-lightspeed-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};\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.secondary,\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 statusToken: {\n color: '#147878',\n },\n statusWarn: {\n color: '#B1380B',\n },\n statusDisabled: {\n color: theme.palette.text.secondary,\n },\n actionButton: {\n color: theme.palette.text.secondary,\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: '#1F1F1F',\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.text.secondary,\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 '& 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};\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 <OffIcon 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});\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/lightspeed`;\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 color: '#6A6E73',\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 === 'tokenRequired') {\n statusClass = classes.statusToken;\n } else if (displayStatus === 'disabled') {\n statusClass = classes.statusDisabled;\n }\n\n return (\n <Tr key={server.id}>\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={<ModeEditOutlineOutlinedIcon fontSize=\"small\" />}\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 <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 </div>\n </Modal>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +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\nimport SvgIcon from '@mui/material/SvgIcon';\n\nexport const McpSettingsIcon = () => (\n <SvgIcon sx={{ marginTop: '8px' }} viewBox=\"0 0 12 12\" fontSize=\"small\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.84399 1.17149C7.6024 0.936371 7.2786 0.804813 6.94149 0.804813C6.60437 0.804813 6.28057 0.936371 6.03899 1.17149L1.22599 5.89149C1.14544 5.96977 1.03755 6.01357 0.925236 6.01357C0.812918 6.01357 0.705027 5.96977 0.624485 5.89149C0.585054 5.85314 0.55371 5.80728 0.532308 5.75661C0.510905 5.70594 0.499878 5.65149 0.499878 5.59649C0.499878 5.54149 0.510905 5.48704 0.532308 5.43637C0.55371 5.3857 0.585054 5.33984 0.624485 5.30149L5.43749 0.581489C5.84009 0.189686 6.3797 -0.029541 6.94149 -0.029541C7.50327 -0.029541 8.04288 0.189686 8.44549 0.581489C8.67844 0.808041 8.85444 1.08654 8.95908 1.39418C9.06371 1.70183 9.09401 2.02988 9.04749 2.35149C9.37336 2.30514 9.70553 2.33423 10.0184 2.43653C10.3312 2.53882 10.6164 2.71158 10.852 2.94149L10.877 2.96649C11.0741 3.15823 11.2309 3.38755 11.3379 3.6409C11.4449 3.89424 11.5 4.16647 11.5 4.44149C11.5 4.71651 11.4449 4.98874 11.3379 5.24208C11.2309 5.49543 11.0741 5.72475 10.877 5.91649L6.52399 10.185C6.51085 10.1978 6.5004 10.213 6.49327 10.2299C6.48614 10.2468 6.48246 10.2649 6.48246 10.2832C6.48246 10.3016 6.48614 10.3197 6.49327 10.3366C6.5004 10.3534 6.51085 10.3687 6.52399 10.3815L7.41799 11.2585C7.45742 11.2968 7.48876 11.3427 7.51016 11.3934C7.53157 11.444 7.54259 11.4985 7.54259 11.5535C7.54259 11.6085 7.53157 11.6629 7.51016 11.7136C7.48876 11.7643 7.45742 11.8101 7.41799 11.8485C7.33744 11.9268 7.22955 11.9706 7.11724 11.9706C7.00492 11.9706 6.89703 11.9268 6.81649 11.8485L5.92249 10.972C5.83041 10.8825 5.75721 10.7755 5.70723 10.6572C5.65724 10.539 5.63149 10.4119 5.63149 10.2835C5.63149 10.1551 5.65724 10.028 5.70723 9.90975C5.75721 9.79149 5.83041 9.68446 5.92249 9.59499L10.2755 5.32599C10.3937 5.21091 10.4877 5.07331 10.5519 4.9213C10.616 4.7693 10.6491 4.60598 10.6491 4.44099C10.6491 4.276 10.616 4.11268 10.5519 3.96068C10.4877 3.80867 10.3937 3.67107 10.2755 3.55599L10.2505 3.53149C10.0092 3.29662 9.68579 3.16507 9.34904 3.16479C9.01229 3.16451 8.6887 3.29552 8.44699 3.52999L4.86099 7.04699L4.85999 7.04799L4.81099 7.09649C4.73042 7.17492 4.62242 7.21881 4.50999 7.21881C4.39755 7.21881 4.28955 7.17492 4.20899 7.09649C4.16955 7.05814 4.13821 7.01228 4.11681 6.96161C4.09541 6.91094 4.08438 6.85649 4.08438 6.80149C4.08438 6.74649 4.09541 6.69204 4.11681 6.64137C4.13821 6.5907 4.16955 6.54484 4.20899 6.50649L7.84549 2.93999C7.96339 2.82483 8.05706 2.68724 8.12096 2.53532C8.18486 2.38341 8.21771 2.22023 8.21757 2.05542C8.21743 1.89061 8.18431 1.7275 8.12014 1.57569C8.05598 1.42388 7.96209 1.28645 7.84399 1.17149Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.24248 2.35148C7.28192 2.31313 7.31326 2.26727 7.33466 2.2166C7.35606 2.16593 7.36709 2.11149 7.36709 2.05648C7.36709 2.00148 7.35606 1.94703 7.33466 1.89636C7.31326 1.84569 7.28192 1.79983 7.24248 1.76148C7.16192 1.68305 7.05392 1.63916 6.94148 1.63916C6.82905 1.63916 6.72105 1.68305 6.64048 1.76148L3.08098 5.25248C2.88383 5.44422 2.72711 5.67354 2.6201 5.92689C2.51308 6.18023 2.45795 6.45246 2.45795 6.72748C2.45795 7.0025 2.51308 7.27473 2.6201 7.52808C2.72711 7.78142 2.88383 8.01074 3.08098 8.20248C3.48365 8.59417 4.02324 8.81331 4.58498 8.81331C5.14673 8.81331 5.68632 8.59417 6.08898 8.20248L9.64898 4.71148C9.68842 4.67313 9.71976 4.62727 9.74116 4.5766C9.76256 4.52593 9.77359 4.47149 9.77359 4.41648C9.77359 4.36148 9.76256 4.30703 9.74116 4.25636C9.71976 4.20569 9.68842 4.15983 9.64898 4.12148C9.56842 4.04305 9.46042 3.99916 9.34798 3.99916C9.23555 3.99916 9.12755 4.04305 9.04698 4.12148L5.48748 7.61248C5.2459 7.8476 4.9221 7.97916 4.58498 7.97916C4.24787 7.97916 3.92407 7.8476 3.68248 7.61248C3.56425 7.4974 3.47028 7.3598 3.40611 7.2078C3.34194 7.05579 3.30888 6.89247 3.30888 6.72748C3.30888 6.56249 3.34194 6.39917 3.40611 6.24717C3.47028 6.09517 3.56425 5.95756 3.68248 5.84248L7.24248 2.35148Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n);\n"],"names":[],"mappings":";;;AAkBO,MAAM,
|
|
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\nimport SvgIcon from '@mui/material/SvgIcon';\n\nexport const McpSettingsIcon = () => (\n <SvgIcon sx={{ marginTop: '8px' }} viewBox=\"0 0 12 12\" fontSize=\"small\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.84399 1.17149C7.6024 0.936371 7.2786 0.804813 6.94149 0.804813C6.60437 0.804813 6.28057 0.936371 6.03899 1.17149L1.22599 5.89149C1.14544 5.96977 1.03755 6.01357 0.925236 6.01357C0.812918 6.01357 0.705027 5.96977 0.624485 5.89149C0.585054 5.85314 0.55371 5.80728 0.532308 5.75661C0.510905 5.70594 0.499878 5.65149 0.499878 5.59649C0.499878 5.54149 0.510905 5.48704 0.532308 5.43637C0.55371 5.3857 0.585054 5.33984 0.624485 5.30149L5.43749 0.581489C5.84009 0.189686 6.3797 -0.029541 6.94149 -0.029541C7.50327 -0.029541 8.04288 0.189686 8.44549 0.581489C8.67844 0.808041 8.85444 1.08654 8.95908 1.39418C9.06371 1.70183 9.09401 2.02988 9.04749 2.35149C9.37336 2.30514 9.70553 2.33423 10.0184 2.43653C10.3312 2.53882 10.6164 2.71158 10.852 2.94149L10.877 2.96649C11.0741 3.15823 11.2309 3.38755 11.3379 3.6409C11.4449 3.89424 11.5 4.16647 11.5 4.44149C11.5 4.71651 11.4449 4.98874 11.3379 5.24208C11.2309 5.49543 11.0741 5.72475 10.877 5.91649L6.52399 10.185C6.51085 10.1978 6.5004 10.213 6.49327 10.2299C6.48614 10.2468 6.48246 10.2649 6.48246 10.2832C6.48246 10.3016 6.48614 10.3197 6.49327 10.3366C6.5004 10.3534 6.51085 10.3687 6.52399 10.3815L7.41799 11.2585C7.45742 11.2968 7.48876 11.3427 7.51016 11.3934C7.53157 11.444 7.54259 11.4985 7.54259 11.5535C7.54259 11.6085 7.53157 11.6629 7.51016 11.7136C7.48876 11.7643 7.45742 11.8101 7.41799 11.8485C7.33744 11.9268 7.22955 11.9706 7.11724 11.9706C7.00492 11.9706 6.89703 11.9268 6.81649 11.8485L5.92249 10.972C5.83041 10.8825 5.75721 10.7755 5.70723 10.6572C5.65724 10.539 5.63149 10.4119 5.63149 10.2835C5.63149 10.1551 5.65724 10.028 5.70723 9.90975C5.75721 9.79149 5.83041 9.68446 5.92249 9.59499L10.2755 5.32599C10.3937 5.21091 10.4877 5.07331 10.5519 4.9213C10.616 4.7693 10.6491 4.60598 10.6491 4.44099C10.6491 4.276 10.616 4.11268 10.5519 3.96068C10.4877 3.80867 10.3937 3.67107 10.2755 3.55599L10.2505 3.53149C10.0092 3.29662 9.68579 3.16507 9.34904 3.16479C9.01229 3.16451 8.6887 3.29552 8.44699 3.52999L4.86099 7.04699L4.85999 7.04799L4.81099 7.09649C4.73042 7.17492 4.62242 7.21881 4.50999 7.21881C4.39755 7.21881 4.28955 7.17492 4.20899 7.09649C4.16955 7.05814 4.13821 7.01228 4.11681 6.96161C4.09541 6.91094 4.08438 6.85649 4.08438 6.80149C4.08438 6.74649 4.09541 6.69204 4.11681 6.64137C4.13821 6.5907 4.16955 6.54484 4.20899 6.50649L7.84549 2.93999C7.96339 2.82483 8.05706 2.68724 8.12096 2.53532C8.18486 2.38341 8.21771 2.22023 8.21757 2.05542C8.21743 1.89061 8.18431 1.7275 8.12014 1.57569C8.05598 1.42388 7.96209 1.28645 7.84399 1.17149Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.24248 2.35148C7.28192 2.31313 7.31326 2.26727 7.33466 2.2166C7.35606 2.16593 7.36709 2.11149 7.36709 2.05648C7.36709 2.00148 7.35606 1.94703 7.33466 1.89636C7.31326 1.84569 7.28192 1.79983 7.24248 1.76148C7.16192 1.68305 7.05392 1.63916 6.94148 1.63916C6.82905 1.63916 6.72105 1.68305 6.64048 1.76148L3.08098 5.25248C2.88383 5.44422 2.72711 5.67354 2.6201 5.92689C2.51308 6.18023 2.45795 6.45246 2.45795 6.72748C2.45795 7.0025 2.51308 7.27473 2.6201 7.52808C2.72711 7.78142 2.88383 8.01074 3.08098 8.20248C3.48365 8.59417 4.02324 8.81331 4.58498 8.81331C5.14673 8.81331 5.68632 8.59417 6.08898 8.20248L9.64898 4.71148C9.68842 4.67313 9.71976 4.62727 9.74116 4.5766C9.76256 4.52593 9.77359 4.47149 9.77359 4.41648C9.77359 4.36148 9.76256 4.30703 9.74116 4.25636C9.71976 4.20569 9.68842 4.15983 9.64898 4.12148C9.56842 4.04305 9.46042 3.99916 9.34798 3.99916C9.23555 3.99916 9.12755 4.04305 9.04698 4.12148L5.48748 7.61248C5.2459 7.8476 4.9221 7.97916 4.58498 7.97916C4.24787 7.97916 3.92407 7.8476 3.68248 7.61248C3.56425 7.4974 3.47028 7.3598 3.40611 7.2078C3.34194 7.05579 3.30888 6.89247 3.30888 6.72748C3.30888 6.56249 3.34194 6.39917 3.40611 6.24717C3.47028 6.09517 3.56425 5.95756 3.68248 5.84248L7.24248 2.35148Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n);\n"],"names":[],"mappings":";;;AAkBO,MAAM,eAAA,GAAkB,sBAC7B,IAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAI,EAAE,SAAA,EAAW,KAAA,EAAM,EAAG,OAAA,EAAQ,WAAA,EAAY,QAAA,EAAS,OAAA,EAC9D,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAS,SAAA;AAAA,MACT,CAAA,EAAE,+8EAAA;AAAA,MACF,IAAA,EAAK;AAAA;AAAA,GACP;AAAA,kBACA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAS,SAAA;AAAA,MACT,CAAA,EAAE,usCAAA;AAAA,MACF,IAAA,EAAK;AAAA;AAAA;AACP,CAAA,EACF;;;;"}
|
|
@@ -1 +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 />\n );\n};\n"],"names":[],"mappings":";;;;AAmBO,MAAM,yBAAyB,MAAM;AAC1C,
|
|
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 />\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;AAAA;AAAA,GACtC;AAEJ;;;;"}
|
|
@@ -1 +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 { Typography } from '@material-ui/core';\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 permissionError: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n padding: '100px',\n backgroundColor: theme.palette.background.default,\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.permissionError}>\n <EmptyState\n title={t('permission.required.title')}\n description={\n <Typography variant=\"subtitle1\">\n <Trans\n message=\"permission.required.description\"\n components={{\n '<subject/>': <>{subject}</>,\n '<permissions/>': permissionsList,\n }}\n />\n </Typography>\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={action}\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":["Fragment"],"mappings":";;;;;;;;;AA2BA,MAAM,
|
|
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 { Typography } from '@material-ui/core';\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 permissionError: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n padding: '100px',\n backgroundColor: theme.palette.background.default,\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.permissionError}>\n <EmptyState\n title={t('permission.required.title')}\n description={\n <Typography variant=\"subtitle1\">\n <Trans\n message=\"permission.required.description\"\n components={{\n '<subject/>': <>{subject}</>,\n '<permissions/>': permissionsList,\n }}\n />\n </Typography>\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={action}\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":["Fragment"],"mappings":";;;;;;;;;AA2BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAAW,WAC3B,YAAA,CAAa;AAAA,IACX,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,UAAA,EAAY,QAAA;AAAA,MACZ,OAAA,EAAS,OAAA;AAAA,MACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA;AAC5C,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,eAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WAAA,kBACE,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAClB,QAAA,kBAAA,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,EACF,CAAA;AAAA,MAEF,OAAA,EAAS,EAAE,WAAA,kBAAa,GAAA,CAAC,0BAAuB,CAAA,EAAG;AAAA,MACnD;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +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: 'grey.700',\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":";;;;;;;;;;;;;;;;;;AAmCO,MAAM,0BAA0B,CAAC;AAAA,EACtC,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,
|
|
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: 'grey.700',\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Route, Routes } from 'react-router-dom';\n\nimport { LightspeedPage } from './LightspeedPage';\n\n/**\n * @public\n */\nexport const Router = () => {\n return (\n <Routes>\n <Route path=\"/\" element={<LightspeedPage />} />\n <Route\n path=\"/conversation/:conversationId\"\n element={<LightspeedPage />}\n />\n <Route path=\"/notebooks\" element={<LightspeedPage />} />\n <Route path=\"/notebooks/:notebookId\" element={<LightspeedPage />} />\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;AAuBO,MAAM,SAAS,MAAM;AAC1B,EAAA,4BACG,
|
|
1
|
+
{"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Route, Routes } from 'react-router-dom';\n\nimport { LightspeedPage } from './LightspeedPage';\n\n/**\n * @public\n */\nexport const Router = () => {\n return (\n <Routes>\n <Route path=\"/\" element={<LightspeedPage />} />\n <Route\n path=\"/conversation/:conversationId\"\n element={<LightspeedPage />}\n />\n <Route path=\"/notebooks\" element={<LightspeedPage />} />\n <Route path=\"/notebooks/:notebookId\" element={<LightspeedPage />} />\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;AAuBO,MAAM,SAAS,MAAM;AAC1B,EAAA,4BACG,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAM,IAAA,EAAK,GAAA,EAAI,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,oBAC7C,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,+BAAA;AAAA,QACL,OAAA,sBAAU,cAAA,EAAA,EAAe;AAAA;AAAA,KAC3B;AAAA,wBACC,KAAA,EAAA,EAAM,IAAA,EAAK,cAAa,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,wBACrD,KAAA,EAAA,EAAM,IAAA,EAAK,0BAAyB,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI;AAAA,GAAA,EACpE,CAAA;AAEJ;;;;"}
|
|
@@ -11,7 +11,7 @@ const ToolCallContent = ({
|
|
|
11
11
|
}) => {
|
|
12
12
|
const { t } = useTranslation();
|
|
13
13
|
const formatExecutionTime = (seconds) => {
|
|
14
|
-
if (seconds ===
|
|
14
|
+
if (seconds === void 0) return "";
|
|
15
15
|
if (seconds < 1) return `${Math.round(seconds * 1e3)}ms`;
|
|
16
16
|
return `${seconds.toFixed(2)}s`;
|
|
17
17
|
};
|
|
@@ -87,7 +87,7 @@ const ToolCallContent = ({
|
|
|
87
87
|
]
|
|
88
88
|
}
|
|
89
89
|
),
|
|
90
|
-
toolCall.executionTime !==
|
|
90
|
+
toolCall.executionTime !== void 0 && /* @__PURE__ */ jsxs(Content, { component: ContentVariants.small, children: [
|
|
91
91
|
t("toolCall.executionTime"),
|
|
92
92
|
formatExecutionTime(toolCall.executionTime)
|
|
93
93
|
] })
|
|
@@ -194,5 +194,5 @@ const ToolCallContent = ({
|
|
|
194
194
|
);
|
|
195
195
|
};
|
|
196
196
|
|
|
197
|
-
export { ToolCallContent
|
|
197
|
+
export { ToolCallContent };
|
|
198
198
|
//# sourceMappingURL=ToolCallContent.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallContent.esm.js","sources":["../../src/components/ToolCallContent.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 { Message } from '@patternfly/chatbot';\nimport {\n Content,\n ContentVariants,\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n Flex,\n FlexItem,\n Label,\n} from '@patternfly/react-core';\nimport { WrenchIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { ToolCall } from '../types';\nimport { formatToolResponseForMarkdown } from '../utils/formatToolResponseForMarkdown';\n\ninterface ToolCallContentProps {\n toolCall: ToolCall;\n role?: 'user' | 'bot';\n}\n\n/**\n * Lightweight component for rendering tool call expandable content.\n * Used inside PatternFly's ToolCall component's expandableContent prop.\n */\nexport const ToolCallContent = ({\n toolCall,\n role = 'bot',\n}: ToolCallContentProps) => {\n const { t } = useTranslation();\n\n const formatExecutionTime = (seconds?: number): string => {\n if (seconds === undefined) return '';\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n return `${seconds.toFixed(2)}s`;\n };\n\n const getParameterKeys = (): string[] => {\n if (!toolCall.arguments) return [];\n return Object.keys(toolCall.arguments).filter(\n key =>\n key !== 'server_label' &&\n toolCall.arguments[key] !== '' &&\n toolCall.arguments[key] !== null,\n );\n };\n\n const getThinkingTime = (): number => {\n if (toolCall.startTime && toolCall.endTime) {\n return Math.round((toolCall.endTime - toolCall.startTime) / 1000);\n }\n return 0;\n };\n\n const thinkingTime = getThinkingTime();\n const parameterKeys = getParameterKeys();\n\n const mcpServerTitle = (() => {\n const label = toolCall.arguments?.server_label;\n if (typeof label === 'string' && label.trim() !== '') {\n return label.trim();\n }\n return t('toolCall.mcpServer');\n })();\n\n return (\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n {/* Thinking Time */}\n {thinkingTime > 0 && (\n <FlexItem>\n <Content component={ContentVariants.small}>\n {t('toolCall.thinking' as any, {\n seconds: String(thinkingTime),\n })}\n </Content>\n </FlexItem>\n )}\n\n {/* Summary */}\n <FlexItem>\n <Content component={ContentVariants.p}>{t('toolCall.summary')}</Content>\n </FlexItem>\n\n {/* Tool Header with MCP Server */}\n <FlexItem>\n <div\n style={{\n border: '1px solid var(--pf-t--global--border--color--default)',\n borderRadius: 'var(--pf-t--global--border--radius--small)',\n padding: 'var(--pf-t--global--spacer--md)',\n }}\n >\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n <FlexItem\n style={{\n borderBottom:\n '1px solid var(--pf-t--global--border--color--default)',\n paddingBottom: 'var(--pf-t--global--spacer--sm)',\n }}\n >\n <Content\n component={ContentVariants.p}\n style={{ marginBlockEnd: 0 }}\n >\n <WrenchIcon\n style={{\n color: 'var(--pf-t--global--icon--color--brand--default)',\n marginRight: '0.5em',\n }}\n />\n <strong>{mcpServerTitle}</strong>\n </Content>\n {toolCall.executionTime !== undefined && (\n <Content component={ContentVariants.small}>\n {t('toolCall.executionTime')}\n {formatExecutionTime(toolCall.executionTime)}\n </Content>\n )}\n </FlexItem>\n\n {/* Description List for Parameters and Response */}\n <FlexItem>\n <DescriptionList\n style={\n {\n '--pf-v6-c-description-list--RowGap':\n 'var(--pf-t--global--spacer--md)',\n } as any\n }\n aria-label=\"Tool response\"\n >\n {/* Parameters Section */}\n {parameterKeys.length > 0 && (\n <DescriptionListGroup\n style={\n {\n '--pf-v6-c-description-list__group--RowGap':\n 'var(--pf-t--global--spacer--xs)',\n } as any\n }\n >\n <DescriptionListTerm>\n {t('toolCall.parameters' as any, {\n defaultValue: 'Parameters',\n }) || 'Parameters'}\n </DescriptionListTerm>\n <DescriptionListDescription\n style={{ marginInlineStart: 0 }}\n >\n <Flex direction={{ default: 'column' }}>\n {toolCall.description && (\n <FlexItem>\n <Content component={ContentVariants.small}>\n {toolCall.description}\n </Content>\n </FlexItem>\n )}\n <FlexItem>\n <Flex\n gap={{ default: 'gapSm' }}\n flexWrap={{ default: 'wrap' }}\n >\n {parameterKeys.map(key => (\n <FlexItem key={key}>\n <Label variant=\"outline\" color=\"blue\">\n {key}\n </Label>\n </FlexItem>\n ))}\n </Flex>\n </FlexItem>\n </Flex>\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n\n {/* Response Section */}\n {toolCall.response && (\n <DescriptionListGroup\n style={\n {\n '--pf-v6-c-description-list__group--RowGap':\n 'var(--pf-t--global--spacer--xs)',\n } as any\n }\n >\n {/* <DescriptionListTerm> */}\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n >\n <FlexItem flex={{ default: 'flex_1' }}>\n <strong> {t('toolCall.response')}</strong>\n </FlexItem>\n </Flex>\n {/* </DescriptionListTerm> */}\n <DescriptionListDescription\n style={{ marginInlineStart: 0 }}\n >\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsXs' }}\n >\n <FlexItem>\n <Message\n content={formatToolResponseForMarkdown(\n toolCall.response,\n )}\n role={role}\n codeBlockProps={{\n isExpandable: true,\n expandableSectionProps: {\n truncateMaxLines: 12,\n },\n }}\n />\n </FlexItem>\n </Flex>\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n </DescriptionList>\n </FlexItem>\n </Flex>\n </div>\n </FlexItem>\n </Flex>\n );\n};\n\nexport default ToolCallContent;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolCallContent.esm.js","sources":["../../src/components/ToolCallContent.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 { Message } from '@patternfly/chatbot';\nimport {\n Content,\n ContentVariants,\n DescriptionList,\n DescriptionListDescription,\n DescriptionListGroup,\n DescriptionListTerm,\n Flex,\n FlexItem,\n Label,\n} from '@patternfly/react-core';\nimport { WrenchIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { ToolCall } from '../types';\nimport { formatToolResponseForMarkdown } from '../utils/formatToolResponseForMarkdown';\n\ninterface ToolCallContentProps {\n toolCall: ToolCall;\n role?: 'user' | 'bot';\n}\n\n/**\n * Lightweight component for rendering tool call expandable content.\n * Used inside PatternFly's ToolCall component's expandableContent prop.\n */\nexport const ToolCallContent = ({\n toolCall,\n role = 'bot',\n}: ToolCallContentProps) => {\n const { t } = useTranslation();\n\n const formatExecutionTime = (seconds?: number): string => {\n if (seconds === undefined) return '';\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n return `${seconds.toFixed(2)}s`;\n };\n\n const getParameterKeys = (): string[] => {\n if (!toolCall.arguments) return [];\n return Object.keys(toolCall.arguments).filter(\n key =>\n key !== 'server_label' &&\n toolCall.arguments[key] !== '' &&\n toolCall.arguments[key] !== null,\n );\n };\n\n const getThinkingTime = (): number => {\n if (toolCall.startTime && toolCall.endTime) {\n return Math.round((toolCall.endTime - toolCall.startTime) / 1000);\n }\n return 0;\n };\n\n const thinkingTime = getThinkingTime();\n const parameterKeys = getParameterKeys();\n\n const mcpServerTitle = (() => {\n const label = toolCall.arguments?.server_label;\n if (typeof label === 'string' && label.trim() !== '') {\n return label.trim();\n }\n return t('toolCall.mcpServer');\n })();\n\n return (\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n {/* Thinking Time */}\n {thinkingTime > 0 && (\n <FlexItem>\n <Content component={ContentVariants.small}>\n {t('toolCall.thinking' as any, {\n seconds: String(thinkingTime),\n })}\n </Content>\n </FlexItem>\n )}\n\n {/* Summary */}\n <FlexItem>\n <Content component={ContentVariants.p}>{t('toolCall.summary')}</Content>\n </FlexItem>\n\n {/* Tool Header with MCP Server */}\n <FlexItem>\n <div\n style={{\n border: '1px solid var(--pf-t--global--border--color--default)',\n borderRadius: 'var(--pf-t--global--border--radius--small)',\n padding: 'var(--pf-t--global--spacer--md)',\n }}\n >\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n <FlexItem\n style={{\n borderBottom:\n '1px solid var(--pf-t--global--border--color--default)',\n paddingBottom: 'var(--pf-t--global--spacer--sm)',\n }}\n >\n <Content\n component={ContentVariants.p}\n style={{ marginBlockEnd: 0 }}\n >\n <WrenchIcon\n style={{\n color: 'var(--pf-t--global--icon--color--brand--default)',\n marginRight: '0.5em',\n }}\n />\n <strong>{mcpServerTitle}</strong>\n </Content>\n {toolCall.executionTime !== undefined && (\n <Content component={ContentVariants.small}>\n {t('toolCall.executionTime')}\n {formatExecutionTime(toolCall.executionTime)}\n </Content>\n )}\n </FlexItem>\n\n {/* Description List for Parameters and Response */}\n <FlexItem>\n <DescriptionList\n style={\n {\n '--pf-v6-c-description-list--RowGap':\n 'var(--pf-t--global--spacer--md)',\n } as any\n }\n aria-label=\"Tool response\"\n >\n {/* Parameters Section */}\n {parameterKeys.length > 0 && (\n <DescriptionListGroup\n style={\n {\n '--pf-v6-c-description-list__group--RowGap':\n 'var(--pf-t--global--spacer--xs)',\n } as any\n }\n >\n <DescriptionListTerm>\n {t('toolCall.parameters' as any, {\n defaultValue: 'Parameters',\n }) || 'Parameters'}\n </DescriptionListTerm>\n <DescriptionListDescription\n style={{ marginInlineStart: 0 }}\n >\n <Flex direction={{ default: 'column' }}>\n {toolCall.description && (\n <FlexItem>\n <Content component={ContentVariants.small}>\n {toolCall.description}\n </Content>\n </FlexItem>\n )}\n <FlexItem>\n <Flex\n gap={{ default: 'gapSm' }}\n flexWrap={{ default: 'wrap' }}\n >\n {parameterKeys.map(key => (\n <FlexItem key={key}>\n <Label variant=\"outline\" color=\"blue\">\n {key}\n </Label>\n </FlexItem>\n ))}\n </Flex>\n </FlexItem>\n </Flex>\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n\n {/* Response Section */}\n {toolCall.response && (\n <DescriptionListGroup\n style={\n {\n '--pf-v6-c-description-list__group--RowGap':\n 'var(--pf-t--global--spacer--xs)',\n } as any\n }\n >\n {/* <DescriptionListTerm> */}\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n >\n <FlexItem flex={{ default: 'flex_1' }}>\n <strong> {t('toolCall.response')}</strong>\n </FlexItem>\n </Flex>\n {/* </DescriptionListTerm> */}\n <DescriptionListDescription\n style={{ marginInlineStart: 0 }}\n >\n <Flex\n direction={{ default: 'column' }}\n spaceItems={{ default: 'spaceItemsXs' }}\n >\n <FlexItem>\n <Message\n content={formatToolResponseForMarkdown(\n toolCall.response,\n )}\n role={role}\n codeBlockProps={{\n isExpandable: true,\n expandableSectionProps: {\n truncateMaxLines: 12,\n },\n }}\n />\n </FlexItem>\n </Flex>\n </DescriptionListDescription>\n </DescriptionListGroup>\n )}\n </DescriptionList>\n </FlexItem>\n </Flex>\n </div>\n </FlexItem>\n </Flex>\n );\n};\n\nexport default ToolCallContent;\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Trans.esm.js","sources":["../../src/components/Trans.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 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 { cloneElement } from 'react';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TransProps {\n message: string;\n params?: Record<string, any>;\n components?: Record<string, React.ReactElement>;\n}\n\nexport const Trans = ({ message, params, components }: TransProps) => {\n const { t } = useTranslation();\n const translatedText = t(message as any, params || {});\n\n // If no components are provided, just return the text\n if (!components) {\n return <>{translatedText}</>;\n }\n\n // Simple string replacement approach - no regex, no security risks\n let result = translatedText;\n\n // Replace each placeholder with a unique marker\n const markers: Record<string, React.ReactElement> = {};\n let markerIndex = 0;\n\n for (const [placeholder, component] of Object.entries(components)) {\n const marker = `__MARKER_${markerIndex}__`;\n markers[marker] = component;\n result = result.replace(new RegExp(escapeRegExp(placeholder), 'g'), marker);\n markerIndex++;\n }\n\n // Split by markers and render components\n const parts = result.split(/(__MARKER_\\d+__)/);\n\n return (\n <>\n {parts.map((part: string, index: number) => {\n if (markers[part]) {\n return cloneElement(markers[part], { key: index });\n }\n return part;\n })}\n </>\n );\n};\n\n// Helper function to escape special regex characters\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"names":[],"mappings":";;;;AA2BO,MAAM,QAAQ,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"Trans.esm.js","sources":["../../src/components/Trans.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 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 { cloneElement } from 'react';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TransProps {\n message: string;\n params?: Record<string, any>;\n components?: Record<string, React.ReactElement>;\n}\n\nexport const Trans = ({ message, params, components }: TransProps) => {\n const { t } = useTranslation();\n const translatedText = t(message as any, params || {});\n\n // If no components are provided, just return the text\n if (!components) {\n return <>{translatedText}</>;\n }\n\n // Simple string replacement approach - no regex, no security risks\n let result = translatedText;\n\n // Replace each placeholder with a unique marker\n const markers: Record<string, React.ReactElement> = {};\n let markerIndex = 0;\n\n for (const [placeholder, component] of Object.entries(components)) {\n const marker = `__MARKER_${markerIndex}__`;\n markers[marker] = component;\n result = result.replace(new RegExp(escapeRegExp(placeholder), 'g'), marker);\n markerIndex++;\n }\n\n // Split by markers and render components\n const parts = result.split(/(__MARKER_\\d+__)/);\n\n return (\n <>\n {parts.map((part: string, index: number) => {\n if (markers[part]) {\n return cloneElement(markers[part], { key: index });\n }\n return part;\n })}\n </>\n );\n};\n\n// Helper function to escape special regex characters\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"names":[],"mappings":";;;;AA2BO,MAAM,QAAQ,CAAC,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAW,KAAkB;AACpE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,OAAA,EAAgB,MAAA,IAAU,EAAE,CAAA;AAGrD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,uCAAU,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,MAAA,GAAS,cAAA;AAGb,EAAA,MAAM,UAA8C,EAAC;AACrD,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACjE,IAAA,MAAM,MAAA,GAAS,YAAY,WAAW,CAAA,EAAA,CAAA;AACtC,IAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAA;AAClB,IAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,IAAI,MAAA,CAAO,aAAa,WAAW,CAAA,EAAG,GAAG,CAAA,EAAG,MAAM,CAAA;AAC1E,IAAA,WAAA,EAAA;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,kBAAkB,CAAA;AAE7C,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAc,KAAA,KAAkB;AAC1C,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjB,MAAA,OAAO,aAAa,OAAA,CAAQ,IAAI,GAAG,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,EACH,CAAA;AAEJ;AAGA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AACrD;;;;"}
|