@red-hat-developer-hub/backstage-plugin-intelligent-assistant 5.0.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/alpha.d.ts +1 -9
  3. package/dist/components/Attachment.esm.js +10 -12
  4. package/dist/components/Attachment.esm.js.map +1 -1
  5. package/dist/components/CollapsedHistoryStrip.esm.js +46 -51
  6. package/dist/components/CollapsedHistoryStrip.esm.js.map +1 -1
  7. package/dist/components/FilePreview.esm.js +3 -2
  8. package/dist/components/FilePreview.esm.js.map +1 -1
  9. package/dist/components/LightSpeedChat.esm.js +655 -787
  10. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  11. package/dist/components/LightspeedChatBox.esm.js +2 -3
  12. package/dist/components/LightspeedChatBox.esm.js.map +1 -1
  13. package/dist/components/LightspeedChatBoxHeader.esm.js +40 -35
  14. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  15. package/dist/components/LightspeedChatContainer.esm.js +43 -67
  16. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  17. package/dist/components/LightspeedChatModelsState.esm.js +67 -73
  18. package/dist/components/LightspeedChatModelsState.esm.js.map +1 -1
  19. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  20. package/dist/components/LightspeedDrawerProvider.esm.js +13 -16
  21. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  22. package/dist/components/LightspeedFABContent.esm.js +49 -9
  23. package/dist/components/LightspeedFABContent.esm.js.map +1 -1
  24. package/dist/components/LightspeedPage.esm.js +12 -12
  25. package/dist/components/LightspeedPage.esm.js.map +1 -1
  26. package/dist/components/McpConfigureServerModal.esm.js +81 -89
  27. package/dist/components/McpConfigureServerModal.esm.js.map +1 -1
  28. package/dist/components/McpServersSettings.esm.js +259 -239
  29. package/dist/components/McpServersSettings.esm.js.map +1 -1
  30. package/dist/components/MessageBarModelSelector.esm.js +29 -33
  31. package/dist/components/MessageBarModelSelector.esm.js.map +1 -1
  32. package/dist/components/RenameConversationModal.esm.js +38 -31
  33. package/dist/components/RenameConversationModal.esm.js.map +1 -1
  34. package/dist/components/Router.esm.js +4 -13
  35. package/dist/components/Router.esm.js.map +1 -1
  36. package/dist/components/ToastAlertGroup.esm.js +24 -40
  37. package/dist/components/ToastAlertGroup.esm.js.map +1 -1
  38. package/dist/components/ToolCallContent.esm.js +8 -11
  39. package/dist/components/ToolCallContent.esm.js.map +1 -1
  40. package/dist/components/notebooks/AddDocumentModal.esm.js +232 -252
  41. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  42. package/dist/components/notebooks/DeleteDocumentModal.esm.js +35 -77
  43. package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -1
  44. package/dist/components/notebooks/DeleteNotebookModal.esm.js +46 -81
  45. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -1
  46. package/dist/components/notebooks/DocumentSidebar.esm.js +172 -196
  47. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
  48. package/dist/components/notebooks/FileListItem.esm.js +69 -57
  49. package/dist/components/notebooks/FileListItem.esm.js.map +1 -1
  50. package/dist/components/notebooks/FileTypeIcon.esm.js +17 -27
  51. package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -1
  52. package/dist/components/notebooks/NotebookCard.esm.js +86 -25
  53. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -1
  54. package/dist/components/notebooks/NotebookView.esm.js +367 -380
  55. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  56. package/dist/components/notebooks/NotebooksTab.esm.js +93 -30
  57. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
  58. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +142 -184
  59. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  60. package/dist/components/notebooks/UploadResourceScreen.esm.js +58 -50
  61. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
  62. package/dist/components/notebooks/notebookDialogStyles.esm.js +33 -37
  63. package/dist/components/notebooks/notebookDialogStyles.esm.js.map +1 -1
  64. package/dist/const.esm.js +15 -2
  65. package/dist/const.esm.js.map +1 -1
  66. package/dist/hooks/useAllModels.esm.js +2 -1
  67. package/dist/hooks/useAllModels.esm.js.map +1 -1
  68. package/dist/hooks/useAutoScroll.esm.js +11 -11
  69. package/dist/hooks/useAutoScroll.esm.js.map +1 -1
  70. package/dist/hooks/useBufferedMessages.esm.js +5 -5
  71. package/dist/hooks/useBufferedMessages.esm.js.map +1 -1
  72. package/dist/hooks/useConversations.esm.js +2 -1
  73. package/dist/hooks/useConversations.esm.js.map +1 -1
  74. package/dist/hooks/useIaChatPermission.esm.js +15 -0
  75. package/dist/hooks/useIaChatPermission.esm.js.map +1 -0
  76. package/dist/hooks/useIaMcpToolsPermission.esm.js +15 -0
  77. package/dist/hooks/useIaMcpToolsPermission.esm.js.map +1 -0
  78. package/dist/hooks/{notebooks/useLightspeedNotebooksPermission.esm.js → useIaNotebooksPermission.esm.js} +4 -5
  79. package/dist/hooks/useIaNotebooksPermission.esm.js.map +1 -0
  80. package/dist/hooks/useIsMobile.esm.js +3 -3
  81. package/dist/hooks/useIsMobile.esm.js.map +1 -1
  82. package/dist/hooks/useMcpConfigureModal.esm.js +5 -9
  83. package/dist/hooks/useMcpConfigureModal.esm.js.map +1 -1
  84. package/dist/hooks/useNotebookConversationIds.esm.js +2 -1
  85. package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -1
  86. package/dist/hooks/useQuestionValidation.esm.js +3 -2
  87. package/dist/hooks/useQuestionValidation.esm.js.map +1 -1
  88. package/dist/hooks/useWelcomePrompts.esm.js +2 -2
  89. package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
  90. package/dist/translations/de.esm.js +1 -9
  91. package/dist/translations/de.esm.js.map +1 -1
  92. package/dist/translations/es.esm.js +1 -9
  93. package/dist/translations/es.esm.js.map +1 -1
  94. package/dist/translations/fr.esm.js +1 -9
  95. package/dist/translations/fr.esm.js.map +1 -1
  96. package/dist/translations/it.esm.js +1 -9
  97. package/dist/translations/it.esm.js.map +1 -1
  98. package/dist/translations/ja.esm.js +1 -9
  99. package/dist/translations/ja.esm.js.map +1 -1
  100. package/dist/translations/ref.esm.js +1 -10
  101. package/dist/translations/ref.esm.js.map +1 -1
  102. package/dist/types.esm.js.map +1 -1
  103. package/dist/utils/fab-anchor-utils.esm.js +41 -0
  104. package/dist/utils/fab-anchor-utils.esm.js.map +1 -0
  105. package/dist/utils/scoped-dialog-utils.esm.js +6 -3
  106. package/dist/utils/scoped-dialog-utils.esm.js.map +1 -1
  107. package/package.json +5 -8
  108. package/dist/components/PermissionRequiredIcon.esm.js +0 -18
  109. package/dist/components/PermissionRequiredIcon.esm.js.map +0 -1
  110. package/dist/components/PermissionRequiredState.esm.js +0 -88
  111. package/dist/components/PermissionRequiredState.esm.js.map +0 -1
  112. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +0 -1
  113. package/dist/hooks/useLightspeedDeletePermission.esm.js +0 -12
  114. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +0 -1
  115. package/dist/hooks/useLightspeedUpdatePermission.esm.js +0 -12
  116. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +0 -1
  117. package/dist/hooks/useLightspeedViewPermission.esm.js +0 -16
  118. package/dist/hooks/useLightspeedViewPermission.esm.js.map +0 -1
  119. package/dist/images/permission-required.svg +0 -319
  120. package/dist/utils/generateClassName.esm.js +0 -12
  121. package/dist/utils/generateClassName.esm.js.map +0 -1
@@ -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, 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 Typography from '@mui/material/Typography';\nimport { Alert, Button, Switch, Title, Tooltip } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n KeyIcon,\n PencilAltIcon,\n SortAmountDownIcon,\n SortAmountUpIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\nimport { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';\n\nimport { iaMcpToolsPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nimport { useMcpConfigureModal } from '../hooks/useMcpConfigureModal';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpConfigureServerModal } from './McpConfigureServerModal';\nimport {\n compareMcpServers,\n formatApiError,\n getDisplayDetail,\n getDisplayStatus,\n getEnabledToggleChecked,\n isEnabledToggleUnavailable,\n type McpConfigureServer,\n type McpServerSortColumn,\n type ServerStatus,\n} from './mcpServersDisplayUtils';\n\ntype McpServer = McpConfigureServer;\n\ntype McpServersSettingsProps = {\n onClose: () => void;\n backgroundColor?: string;\n};\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: 0,\n flex: 1,\n width: '100%',\n overflow: 'auto',\n },\n headerRow: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(2),\n },\n selectedCount: {\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n fontSize: '0.75rem',\n },\n title: {\n fontSize: '1.125rem',\n },\n closeButton: {\n marginTop: -theme.spacing(1),\n marginRight: -theme.spacing(1),\n color: theme.palette.text.primary,\n },\n nameHeaderButton: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\n marginLeft: '-0.85rem',\n fontWeight: 600,\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n minHeight: 'auto',\n color: theme.palette.text.primary,\n textDecoration: 'none !important',\n display: 'inline-flex',\n alignItems: 'center',\n },\n statusHeaderButton: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\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 sortHeaderIconActive: {\n color: 'var(--pf-t--global--icon--color--brand--default)',\n },\n sortHeaderIconInactive: {\n color: 'var(--pf-t--global--icon--color--subtle)',\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: 'var(--pf-t--global--icon--color--status--custom--default)',\n },\n statusWarn: {\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n },\n statusDisabled: {\n color: 'var(--pf-t--global--icon--color--subtle)',\n },\n actionButton: {\n color: theme.palette.text.secondary,\n opacity: 0,\n transition: 'opacity 0.15s ease-in-out',\n },\n tableRow: {\n '&:hover $actionButton, &:focus-within $actionButton': {\n opacity: 1,\n },\n },\n toggleCell: {\n paddingRight: '0 !important',\n },\n table: {\n width: '100%',\n backgroundColor: 'transparent',\n '--pf-v6-c-table--BackgroundColor': 'transparent',\n '--pf-v5-c-table--BackgroundColor': 'transparent',\n '& table, & thead, & tbody, & tr, & th, & td': {\n backgroundColor: 'transparent !important',\n },\n '& th': {\n borderBottom: 0,\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n textAlign: 'left',\n },\n '& td': {\n borderBottom: 0,\n paddingTop: theme.spacing(1.5),\n paddingBottom: theme.spacing(1.5),\n verticalAlign: 'middle',\n },\n },\n alert: {\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(3),\n marginBottom: theme.spacing(2),\n },\n}));\n\ntype McpServerResponse = {\n name: string;\n url?: string;\n enabled: boolean;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n hasToken: boolean;\n hasUserToken: boolean;\n hasOrgToken: boolean;\n auth?: string;\n};\n\ntype McpServersListResponse = {\n servers?: McpServerResponse[];\n};\n\ntype McpServersPatchResponse = {\n server?: McpServerResponse;\n validation?: {\n error?: string;\n };\n};\n\ntype McpToolInfo = {\n name: string;\n description?: string;\n};\n\ntype McpServersValidateResponse = {\n name: string;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n validation?: {\n error?: unknown;\n tools?: McpToolInfo[];\n };\n};\n\ntype McpCredentialsValidateResponse = {\n valid: boolean;\n error?: unknown;\n toolCount: number;\n tools?: McpToolInfo[];\n};\n\nconst getStatusIcon = (status: ServerStatus, className: string) => {\n if (status === 'tokenRequired') return <KeyIcon className={className} />;\n if (status === 'disabled') return <InfoCircleIcon className={className} />;\n if (status === 'failed')\n return <ExclamationCircleIcon className={className} />;\n return <CheckCircleIcon className={className} />;\n};\n\nconst 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 hasOrgToken: server.hasOrgToken,\n validationError: server.status === 'error' ? validationError : undefined,\n auth: server.auth,\n});\nexport const McpServersSettings = ({\n onClose,\n backgroundColor,\n}: McpServersSettingsProps) => {\n const classes = useStyles();\n const { t } = useTranslation();\n const configApi = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const mcpToolsPermission = usePermission({\n permission: iaMcpToolsPermission,\n });\n const canManageMcp = mcpToolsPermission.allowed;\n const [servers, setServers] = useState<McpServer[]>([]);\n const [sortColumn, setSortColumn] = useState<McpServerSortColumn>('name');\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\n const getBaseUrl = useCallback(() => {\n return `${configApi.getString('backend.baseUrl')}/api/intelligent-assistant`;\n }, [configApi]);\n\n const fetchJson = useCallback(\n async <T,>(url: string, init?: RequestInit): Promise<T> => {\n const response = await fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n if (!response.ok) {\n let message = `${response.status} ${response.statusText}`;\n try {\n const bodyText = await response.text();\n if (bodyText) {\n const parsed = JSON.parse(bodyText);\n if (parsed?.error) {\n message = parsed.error;\n }\n }\n } catch {\n // Keep default message when parsing fails.\n }\n throw new Error(message);\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n },\n [fetchApi],\n );\n\n const fetchServerValidation = useCallback(\n async (serverName: string) => {\n const baseUrl = getBaseUrl();\n return fetchJson<McpServersValidateResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}/validate`,\n {\n method: 'POST',\n },\n );\n },\n [fetchJson, getBaseUrl],\n );\n\n const validateServer = useCallback(\n async (serverName: string) => {\n const data = await fetchServerValidation(serverName);\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 ? formatApiError(data.validation?.error) ||\n 'Validation failed'\n : undefined,\n }\n : server,\n ),\n );\n return data;\n },\n [fetchServerValidation],\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 configureModal = useMcpConfigureModal({\n servers,\n canManageMcp,\n isSaving,\n patchServer,\n validateServer,\n validateCredentials,\n fetchServerValidation,\n });\n\n const selectedCount = servers.filter(server => {\n const displayStatus = getDisplayStatus(server);\n const isUnavailable =\n displayStatus === 'failed' || displayStatus === 'tokenRequired';\n return server.enabled && !isUnavailable;\n }).length;\n\n const sortedServers = [...servers].sort((a, b) =>\n compareMcpServers(a, b, sortColumn, sortAsc),\n );\n\n const onSortColumnClick = (column: McpServerSortColumn) => {\n if (sortColumn === column) {\n setSortAsc(prev => !prev);\n return;\n }\n setSortColumn(column);\n setSortAsc(true);\n };\n\n const renderSortIcon = (column: McpServerSortColumn) => {\n const isActive = sortColumn === column;\n let Icon = SortAmountDownIcon;\n if (isActive && !sortAsc) {\n Icon = SortAmountUpIcon;\n }\n\n return (\n <Icon\n className={\n isActive\n ? classes.sortHeaderIconActive\n : classes.sortHeaderIconInactive\n }\n />\n );\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 {!mcpToolsPermission.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={renderSortIcon('name')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('name')}\n >\n <Typography component=\"span\" className={classes.nameHeaderText}>\n {t('mcp.settings.name')}\n </Typography>\n </Button>\n </Th>\n <Th className={classes.statusHeader}>\n <Button\n variant=\"link\"\n className={classes.statusHeaderButton}\n icon={renderSortIcon('status')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('status')}\n >\n <Typography component=\"span\" className={classes.nameHeaderText}>\n {t('mcp.settings.status')}\n </Typography>\n </Button>\n </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, t);\n let statusClass = classes.statusWarn;\n if (displayStatus === 'ok') {\n statusClass = classes.statusOk;\n } else if (displayStatus === 'disabled') {\n statusClass = classes.statusDisabled;\n }\n\n return (\n <Tr key={server.id} className={classes.tableRow}>\n <Td width={10} className={classes.toggleCell}>\n {(() => {\n const isUnavailable =\n isEnabledToggleUnavailable(displayStatus);\n const isChecked = getEnabledToggleChecked(\n server,\n displayStatus,\n );\n const isRowSaving = Boolean(isSaving[server.name]);\n const isToggleDisabled =\n isUnavailable || isRowSaving || !canManageMcp;\n const switchControl = (\n <Switch\n id={`mcp-switch-${server.id}`}\n aria-label={t(\n 'mcp.settings.toggleServerAriaLabel' as any,\n {\n serverName: server.name,\n },\n )}\n isChecked={isChecked}\n isDisabled={isToggleDisabled}\n onChange={(_event, checked) => {\n void patchServer(server.name, {\n enabled: checked,\n }).catch(() => {\n // patchServer already updates component error state.\n // Swallow here to avoid unhandled promise rejections\n // from event-handler fire-and-forget usage.\n });\n }}\n />\n );\n\n if (!isToggleDisabled) {\n return switchControl;\n }\n\n return (\n <Tooltip content={displayDetail}>\n <Typography component=\"span\">\n {switchControl}\n </Typography>\n </Tooltip>\n );\n })()}\n </Td>\n <Td\n width={35}\n className={`${classes.rowName} ${classes.nameCell}`}\n >\n <Typography component=\"span\" className={classes.nameValue}>\n {server.name}\n </Typography>\n </Td>\n <Td width={40} className={classes.statusColumnCell}>\n <div className={classes.statusCell}>\n {getStatusIcon(displayStatus, statusClass)}\n {displayStatus === 'failed' ? (\n <Tooltip\n content={\n server.validationError ??\n t('mcp.settings.token.validationFailed')\n }\n >\n <Typography\n component=\"span\"\n className={classes.statusValue}\n >\n {displayDetail}\n </Typography>\n </Tooltip>\n ) : (\n <Typography\n component=\"span\"\n className={classes.statusValue}\n >\n {displayDetail}\n </Typography>\n )}\n </div>\n </Td>\n <Td width={15} isActionCell style={{ textAlign: 'right' }}>\n <Button\n aria-label={t('mcp.settings.editServerAriaLabel' as any, {\n serverName: server.name,\n })}\n icon={<PencilAltIcon />}\n variant=\"plain\"\n className={classes.actionButton}\n isDisabled={!canManageMcp}\n onClick={() => configureModal.open(server)}\n />\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n <McpConfigureServerModal {...configureModal} />\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, useState } from 'react';\n\nimport { configApiRef, fetchApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport GlobalStyles from '@mui/material/GlobalStyles';\nimport { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport { Alert, Button, Switch, Title, Tooltip } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n KeyIcon,\n PencilAltIcon,\n SortAmountDownIcon,\n SortAmountUpIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\nimport { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';\n\nimport { useIaMcpToolsPermission } from '../hooks/useIaMcpToolsPermission';\nimport { useMcpConfigureModal } from '../hooks/useMcpConfigureModal';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpConfigureServerModal } from './McpConfigureServerModal';\nimport {\n compareMcpServers,\n formatApiError,\n getDisplayDetail,\n getDisplayStatus,\n getEnabledToggleChecked,\n isEnabledToggleUnavailable,\n type McpConfigureServer,\n type McpServerSortColumn,\n type ServerStatus,\n} from './mcpServersDisplayUtils';\n\ntype McpServer = McpConfigureServer;\n\ntype McpServersSettingsProps = {\n onClose: () => void;\n backgroundColor?: string;\n};\n\nconst mcpClasses = {\n headerRow: 'ia-mcp-headerRow',\n selectedCount: 'ia-mcp-selectedCount',\n title: 'ia-mcp-title',\n closeButton: 'ia-mcp-closeButton',\n nameHeaderButton: 'ia-mcp-nameHeaderButton',\n statusHeaderButton: 'ia-mcp-statusHeaderButton',\n sortHeaderIconActive: 'ia-mcp-sortHeaderIconActive',\n sortHeaderIconInactive: 'ia-mcp-sortHeaderIconInactive',\n nameHeaderText: 'ia-mcp-nameHeaderText',\n nameCell: 'ia-mcp-nameCell',\n statusHeader: 'ia-mcp-statusHeader',\n statusColumnCell: 'ia-mcp-statusColumnCell',\n rowName: 'ia-mcp-rowName',\n nameValue: 'ia-mcp-nameValue',\n statusCell: 'ia-mcp-statusCell',\n statusValue: 'ia-mcp-statusValue',\n statusOk: 'ia-mcp-statusOk',\n statusWarn: 'ia-mcp-statusWarn',\n statusDisabled: 'ia-mcp-statusDisabled',\n actionButton: 'ia-mcp-actionButton',\n tableRow: 'ia-mcp-tableRow',\n toggleCell: 'ia-mcp-toggleCell',\n table: 'ia-mcp-table',\n alert: 'ia-mcp-alert',\n} as const;\n\nconst StyledMcpRoot = styled('div')(({ theme }) => ({\n padding: 0,\n height: '100%',\n minHeight: 0,\n flex: 1,\n width: '100%',\n overflow: 'auto',\n [`& .${mcpClasses.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 [`& .${mcpClasses.selectedCount}`]: {\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n fontSize: '0.75rem',\n },\n [`& .${mcpClasses.title}`]: {\n fontSize: '1.125rem',\n },\n [`& .${mcpClasses.closeButton}`]: {\n marginTop: theme.spacing(-1),\n marginRight: theme.spacing(-1),\n color: theme.palette.text.primary,\n },\n [`& .${mcpClasses.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 [`& .${mcpClasses.statusHeaderButton}`]: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\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 [`& .${mcpClasses.sortHeaderIconActive}`]: {\n color: 'var(--pf-t--global--icon--color--brand--default)',\n },\n [`& .${mcpClasses.sortHeaderIconInactive}`]: {\n color: 'var(--pf-t--global--icon--color--subtle)',\n },\n [`& .${mcpClasses.nameHeaderText}`]: {\n paddingLeft: '7px',\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n fontWeight: 600,\n },\n [`& .${mcpClasses.nameCell}`]: {\n paddingLeft: '8px !important',\n },\n [`& .${mcpClasses.statusHeader}`]: {\n paddingLeft: '0 !important',\n },\n [`& .${mcpClasses.statusColumnCell}`]: {\n paddingLeft: '0 !important',\n },\n [`& .${mcpClasses.rowName}`]: {\n fontSize: '1rem',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n },\n [`& .${mcpClasses.nameValue}`]: {\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n [`& .${mcpClasses.statusCell}`]: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n whiteSpace: 'nowrap',\n },\n [`& .${mcpClasses.statusValue}`]: {\n fontSize: '0.875rem',\n },\n [`& .${mcpClasses.statusOk}`]: {\n color: 'var(--pf-t--global--icon--color--status--custom--default)',\n },\n [`& .${mcpClasses.statusWarn}`]: {\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n },\n [`& .${mcpClasses.statusDisabled}`]: {\n color: 'var(--pf-t--global--icon--color--subtle)',\n },\n [`& .${mcpClasses.actionButton}`]: {\n color: theme.palette.text.secondary,\n opacity: 0,\n transition: 'opacity 0.15s ease-in-out',\n },\n [`& .${mcpClasses.tableRow}:hover .${mcpClasses.actionButton}, & .${mcpClasses.tableRow}:focus-within .${mcpClasses.actionButton}`]:\n {\n opacity: 1,\n },\n [`& .${mcpClasses.toggleCell}`]: {\n paddingRight: '0 !important',\n },\n [`& .${mcpClasses.table}`]: {\n width: '100%',\n backgroundColor: 'transparent',\n '--pf-v6-c-table--BackgroundColor': 'transparent',\n '--pf-v5-c-table--BackgroundColor': 'transparent',\n '& table, & thead, & tbody, & tr, & th, & td': {\n backgroundColor: 'transparent !important',\n },\n '& th': {\n borderBottom: 0,\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n textAlign: 'left',\n },\n '& td': {\n borderBottom: 0,\n paddingTop: theme.spacing(1.5),\n paddingBottom: theme.spacing(1.5),\n verticalAlign: 'middle',\n },\n },\n [`& .${mcpClasses.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 hasOrgToken: boolean;\n auth?: string;\n};\n\ntype McpServersListResponse = {\n servers?: McpServerResponse[];\n};\n\ntype McpServersPatchResponse = {\n server?: McpServerResponse;\n validation?: {\n error?: string;\n };\n};\n\ntype McpToolInfo = {\n name: string;\n description?: string;\n};\n\ntype McpServersValidateResponse = {\n name: string;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n validation?: {\n error?: unknown;\n tools?: McpToolInfo[];\n };\n};\n\ntype McpCredentialsValidateResponse = {\n valid: boolean;\n error?: unknown;\n toolCount: number;\n tools?: McpToolInfo[];\n};\n\nconst getStatusIcon = (status: ServerStatus, className: string) => {\n if (status === 'tokenRequired') return <KeyIcon className={className} />;\n if (status === 'disabled') return <InfoCircleIcon className={className} />;\n if (status === 'failed')\n return <ExclamationCircleIcon className={className} />;\n return <CheckCircleIcon className={className} />;\n};\n\nconst 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 hasOrgToken: server.hasOrgToken,\n validationError: server.status === 'error' ? validationError : undefined,\n auth: server.auth,\n});\nexport const McpServersSettings = ({\n onClose,\n backgroundColor,\n}: McpServersSettingsProps) => {\n const { t } = useTranslation();\n const configApi = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const { allowed: hasMcpToolsAccess, loading: mcpToolsPermissionLoading } =\n useIaMcpToolsPermission();\n\n const [servers, setServers] = useState<McpServer[]>([]);\n const [sortColumn, setSortColumn] = useState<McpServerSortColumn>('name');\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\n const getBaseUrl = useCallback(() => {\n return `${configApi.getString('backend.baseUrl')}/api/intelligent-assistant`;\n }, [configApi]);\n\n const fetchJson = useCallback(\n async <T,>(url: string, init?: RequestInit): Promise<T> => {\n const response = await fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n if (!response.ok) {\n let message = `${response.status} ${response.statusText}`;\n try {\n const bodyText = await response.text();\n if (bodyText) {\n const parsed = JSON.parse(bodyText);\n if (parsed?.error) {\n message = parsed.error;\n }\n }\n } catch {\n // Keep default message when parsing fails.\n }\n throw new Error(message);\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n },\n [fetchApi],\n );\n\n const fetchServerValidation = useCallback(\n async (serverName: string) => {\n const baseUrl = getBaseUrl();\n return fetchJson<McpServersValidateResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}/validate`,\n {\n method: 'POST',\n },\n );\n },\n [fetchJson, getBaseUrl],\n );\n\n const validateServer = useCallback(\n async (serverName: string) => {\n const data = await fetchServerValidation(serverName);\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 ? formatApiError(data.validation?.error) ||\n 'Validation failed'\n : undefined,\n }\n : server,\n ),\n );\n return data;\n },\n [fetchServerValidation],\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 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 } catch (e) {\n setError(\n e instanceof Error ? e.message : 'Failed to load MCP server settings',\n );\n } finally {\n setIsLoading(false);\n }\n }, [fetchJson, getBaseUrl, validateServer]);\n\n useEffect(() => {\n if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {\n return;\n }\n loadServers();\n }, [loadServers, mcpToolsPermissionLoading, hasMcpToolsAccess]);\n\n const patchServer = useCallback(\n async (\n serverName: string,\n body: { enabled?: boolean; token?: string | null },\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 [fetchJson, getBaseUrl, loadServers],\n );\n\n const configureModal = useMcpConfigureModal({\n servers,\n isSaving,\n patchServer,\n validateServer,\n validateCredentials,\n fetchServerValidation,\n });\n\n const selectedCount = servers.filter(server => {\n const displayStatus = getDisplayStatus(server);\n const isUnavailable =\n displayStatus === 'failed' || displayStatus === 'tokenRequired';\n return server.enabled && !isUnavailable;\n }).length;\n\n const sortedServers = [...servers].sort((a, b) =>\n compareMcpServers(a, b, sortColumn, sortAsc),\n );\n\n const onSortColumnClick = (column: McpServerSortColumn) => {\n if (sortColumn === column) {\n setSortAsc(prev => !prev);\n return;\n }\n setSortColumn(column);\n setSortAsc(true);\n };\n\n const renderSortIcon = (column: McpServerSortColumn) => {\n const isActive = sortColumn === column;\n let Icon = SortAmountDownIcon;\n if (isActive && !sortAsc) {\n Icon = SortAmountUpIcon;\n }\n\n return (\n <Icon\n className={\n isActive\n ? mcpClasses.sortHeaderIconActive\n : mcpClasses.sortHeaderIconInactive\n }\n />\n );\n };\n\n if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {\n return null;\n }\n\n return (\n <StyledMcpRoot style={backgroundColor ? { backgroundColor } : undefined}>\n <GlobalStyles\n styles={{\n '.pf-v6-c-backdrop': {\n zIndex: '1400 !important',\n },\n '.pf-v5-c-backdrop': {\n zIndex: '1400 !important',\n },\n }}\n />\n <div className={mcpClasses.headerRow}>\n <div>\n <Title headingLevel=\"h2\" size=\"xl\" className={mcpClasses.title}>\n {t('mcp.settings.title')}\n </Title>\n <div className={mcpClasses.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={mcpClasses.closeButton}\n onClick={onClose}\n />\n </div>\n {error && (\n <Alert\n variant=\"danger\"\n isInline\n title={error}\n className={mcpClasses.alert}\n />\n )}\n <Table\n variant=\"compact\"\n aria-label={t('mcp.settings.tableAriaLabel')}\n className={mcpClasses.table}\n >\n <Thead>\n <Tr>\n <Th width={10} screenReaderText={t('mcp.settings.enabled')} />\n <Th>\n <Button\n variant=\"link\"\n className={mcpClasses.nameHeaderButton}\n icon={renderSortIcon('name')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('name')}\n >\n <Typography\n component=\"span\"\n className={mcpClasses.nameHeaderText}\n >\n {t('mcp.settings.name')}\n </Typography>\n </Button>\n </Th>\n <Th className={mcpClasses.statusHeader}>\n <Button\n variant=\"link\"\n className={mcpClasses.statusHeaderButton}\n icon={renderSortIcon('status')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('status')}\n >\n <Typography\n component=\"span\"\n className={mcpClasses.nameHeaderText}\n >\n {t('mcp.settings.status')}\n </Typography>\n </Button>\n </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, t);\n let statusClass:\n | typeof mcpClasses.statusOk\n | typeof mcpClasses.statusWarn\n | typeof mcpClasses.statusDisabled = mcpClasses.statusWarn;\n if (displayStatus === 'ok') {\n statusClass = mcpClasses.statusOk;\n } else if (displayStatus === 'disabled') {\n statusClass = mcpClasses.statusDisabled;\n }\n\n return (\n <Tr key={server.id} className={mcpClasses.tableRow}>\n <Td width={10} className={mcpClasses.toggleCell}>\n {(() => {\n const isUnavailable =\n isEnabledToggleUnavailable(displayStatus);\n const isChecked = getEnabledToggleChecked(\n server,\n displayStatus,\n );\n const isRowSaving = Boolean(isSaving[server.name]);\n const isToggleDisabled = isUnavailable || isRowSaving;\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={`${mcpClasses.rowName} ${mcpClasses.nameCell}`}\n >\n <Typography component=\"span\" className={mcpClasses.nameValue}>\n {server.name}\n </Typography>\n </Td>\n <Td width={40} className={mcpClasses.statusColumnCell}>\n <div className={mcpClasses.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={mcpClasses.statusValue}\n >\n {displayDetail}\n </Typography>\n </Tooltip>\n ) : (\n <Typography\n component=\"span\"\n className={mcpClasses.statusValue}\n >\n {displayDetail}\n </Typography>\n )}\n </div>\n </Td>\n <Td width={15} isActionCell style={{ textAlign: 'right' }}>\n <Button\n aria-label={t('mcp.settings.editServerAriaLabel' as any, {\n serverName: server.name,\n })}\n icon={<PencilAltIcon />}\n variant=\"plain\"\n className={mcpClasses.actionButton}\n onClick={() => configureModal.open(server)}\n />\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n <McpConfigureServerModal {...configureModal} />\n </StyledMcpRoot>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,38 +1,37 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
- import { makeStyles } from '@material-ui/core';
4
- import { Dropdown, DropdownList, DropdownItem, Tooltip, MenuToggle } from '@patternfly/react-core';
3
+ import { styled } from '@mui/material/styles';
4
+ import Typography from '@mui/material/Typography';
5
+ import { MenuToggle, Dropdown, DropdownList, DropdownItem, Tooltip } from '@patternfly/react-core';
5
6
  import { AngleDownIcon } from '@patternfly/react-icons';
6
7
  import { useTranslation } from '../hooks/useTranslation.esm.js';
7
8
 
8
- const useStyles = makeStyles((theme) => ({
9
- selectorToggle: {
10
- display: "flex",
11
- alignItems: "center",
12
- gap: 4,
13
- color: theme.palette.text.secondary,
14
- fontSize: 14,
15
- fontWeight: 500,
16
- cursor: "pointer",
17
- padding: "4px 8px",
18
- borderRadius: 8,
19
- border: "none",
20
- background: "transparent",
21
- "&:hover": {
22
- backgroundColor: theme.palette.action.hover
23
- },
24
- "&:disabled": {
25
- cursor: "not-allowed",
26
- opacity: 0.5
27
- }
9
+ const SelectorToggle = styled(MenuToggle)(({ theme }) => ({
10
+ display: "flex",
11
+ alignItems: "center",
12
+ gap: 4,
13
+ color: theme.palette.text.secondary,
14
+ fontSize: 14,
15
+ fontWeight: 500,
16
+ cursor: "pointer",
17
+ padding: "4px 8px",
18
+ borderRadius: 8,
19
+ border: "none",
20
+ background: "transparent",
21
+ "&:hover": {
22
+ backgroundColor: theme.palette.action.hover
28
23
  },
29
- dropdown: {
30
- "& ul, & li": {
31
- padding: 0,
32
- margin: 0
33
- }
24
+ "&:disabled": {
25
+ cursor: "not-allowed",
26
+ opacity: 0.5
34
27
  }
35
28
  }));
29
+ const StyledDropdown = styled(Dropdown)({
30
+ "& ul, & li": {
31
+ padding: 0,
32
+ margin: 0
33
+ }
34
+ });
36
35
  const MessageBarModelSelector = ({
37
36
  selectedModel,
38
37
  models,
@@ -41,7 +40,6 @@ const MessageBarModelSelector = ({
41
40
  disabledTooltip
42
41
  }) => {
43
42
  const [isOpen, setIsOpen] = useState(false);
44
- const classes = useStyles();
45
43
  const { t } = useTranslation();
46
44
  useEffect(() => {
47
45
  if (disabled) {
@@ -50,14 +48,13 @@ const MessageBarModelSelector = ({
50
48
  }, [disabled]);
51
49
  const selectedModelLabel = models.find((m) => m.value === selectedModel)?.label ?? selectedModel;
52
50
  const toggle = (toggleRef) => /* @__PURE__ */ jsxs(
53
- MenuToggle,
51
+ SelectorToggle,
54
52
  {
55
53
  ref: toggleRef,
56
54
  onClick: () => setIsOpen(!isOpen),
57
55
  isExpanded: isOpen,
58
56
  isDisabled: disabled,
59
57
  variant: "plain",
60
- className: classes.selectorToggle,
61
58
  "aria-label": t("aria.chatbotSelector"),
62
59
  children: [
63
60
  selectedModelLabel,
@@ -66,9 +63,8 @@ const MessageBarModelSelector = ({
66
63
  }
67
64
  );
68
65
  const dropdown = /* @__PURE__ */ jsx(
69
- Dropdown,
66
+ StyledDropdown,
70
67
  {
71
- className: classes.dropdown,
72
68
  isOpen: isOpen && !disabled,
73
69
  onSelect: (_e, value) => {
74
70
  if (disabled) return;
@@ -94,7 +90,7 @@ const MessageBarModelSelector = ({
94
90
  }
95
91
  );
96
92
  if (disabled && disabledTooltip) {
97
- return /* @__PURE__ */ jsx(Tooltip, { content: disabledTooltip, children: /* @__PURE__ */ jsx("span", { children: dropdown }) });
93
+ return /* @__PURE__ */ jsx(Tooltip, { content: disabledTooltip, children: /* @__PURE__ */ jsx(Typography, { component: "span", children: dropdown }) });
98
94
  }
99
95
  return dropdown;
100
96
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MessageBarModelSelector.esm.js","sources":["../../src/components/MessageBarModelSelector.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useEffect, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core';\nimport {\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n Tooltip,\n} from '@patternfly/react-core';\nimport { AngleDownIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype MessageBarModelSelectorProps = {\n selectedModel: string;\n models: { label: string; value: string; provider: string }[];\n onSelect: (model: string) => void;\n disabled?: boolean;\n disabledTooltip?: string;\n};\n\nconst useStyles = makeStyles(theme => ({\n selectorToggle: {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n color: theme.palette.text.secondary,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: 8,\n border: 'none',\n background: 'transparent',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.5,\n },\n },\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n}));\n\nexport const MessageBarModelSelector = ({\n selectedModel,\n models,\n onSelect,\n disabled = false,\n disabledTooltip,\n}: MessageBarModelSelectorProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const classes = useStyles();\n const { t } = useTranslation();\n\n useEffect(() => {\n if (disabled) {\n setIsOpen(false);\n }\n }, [disabled]);\n\n const selectedModelLabel =\n models.find(m => m.value === selectedModel)?.label ?? selectedModel;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setIsOpen(!isOpen)}\n isExpanded={isOpen}\n isDisabled={disabled}\n variant=\"plain\"\n className={classes.selectorToggle}\n aria-label={t('aria.chatbotSelector')}\n >\n {selectedModelLabel}\n <AngleDownIcon />\n </MenuToggle>\n );\n\n const dropdown = (\n <Dropdown\n className={classes.dropdown}\n isOpen={isOpen && !disabled}\n onSelect={(_e, value) => {\n if (disabled) return;\n onSelect(value as string);\n setIsOpen(false);\n }}\n onOpenChange={open => setIsOpen(open)}\n popperProps={{ position: 'left' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={models.length > 10}\n maxMenuHeight={models.length > 10 ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n ))}\n </DropdownList>\n </Dropdown>\n );\n\n if (disabled && disabledTooltip) {\n return (\n <Tooltip content={disabledTooltip}>\n <span>{dropdown}</span>\n </Tooltip>\n );\n }\n\n return dropdown;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageBarModelSelector.esm.js","sources":["../../src/components/MessageBarModelSelector.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useEffect, useState } from 'react';\n\nimport { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport {\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n Tooltip,\n} from '@patternfly/react-core';\nimport { AngleDownIcon } from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype MessageBarModelSelectorProps = {\n selectedModel: string;\n models: { label: string; value: string; provider: string }[];\n onSelect: (model: string) => void;\n disabled?: boolean;\n disabledTooltip?: string;\n};\n\nconst SelectorToggle = styled(MenuToggle)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n color: theme.palette.text.secondary,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: 8,\n border: 'none',\n background: 'transparent',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.5,\n },\n}));\n\nconst StyledDropdown = styled(Dropdown)({\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n});\n\nexport const MessageBarModelSelector = ({\n selectedModel,\n models,\n onSelect,\n disabled = false,\n disabledTooltip,\n}: MessageBarModelSelectorProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (disabled) {\n setIsOpen(false);\n }\n }, [disabled]);\n\n const selectedModelLabel =\n models.find(m => m.value === selectedModel)?.label ?? selectedModel;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <SelectorToggle\n ref={toggleRef}\n onClick={() => setIsOpen(!isOpen)}\n isExpanded={isOpen}\n isDisabled={disabled}\n variant=\"plain\"\n aria-label={t('aria.chatbotSelector')}\n >\n {selectedModelLabel}\n <AngleDownIcon />\n </SelectorToggle>\n );\n\n const dropdown = (\n <StyledDropdown\n isOpen={isOpen && !disabled}\n onSelect={(_e, value) => {\n if (disabled) return;\n onSelect(value as string);\n setIsOpen(false);\n }}\n onOpenChange={open => setIsOpen(open)}\n popperProps={{ position: 'left' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={models.length > 10}\n maxMenuHeight={models.length > 10 ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n ))}\n </DropdownList>\n </StyledDropdown>\n );\n\n if (disabled && disabledTooltip) {\n return (\n <Tooltip content={disabledTooltip}>\n <Typography component=\"span\">{dropdown}</Typography>\n </Tooltip>\n );\n }\n\n return dropdown;\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
- import { TextField } from '@material-ui/core';
4
3
  import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
5
4
  import CloseIcon from '@mui/icons-material/Close';
6
5
  import Alert from '@mui/material/Alert';
@@ -11,6 +10,7 @@ import DialogActions from '@mui/material/DialogActions';
11
10
  import DialogContent from '@mui/material/DialogContent';
12
11
  import DialogTitle from '@mui/material/DialogTitle';
13
12
  import IconButton from '@mui/material/IconButton';
13
+ import TextField from '@mui/material/TextField';
14
14
  import Typography from '@mui/material/Typography';
15
15
  import { useConversations } from '../hooks/useConversations.esm.js';
16
16
  import { useRenameConversation } from '../hooks/useRenameConversation.esm.js';
@@ -68,35 +68,42 @@ const RenameConversationModal = ({
68
68
  "aria-describedby": "rename-modal-confirmation",
69
69
  fullWidth: true,
70
70
  children: [
71
- /* @__PURE__ */ jsx(DialogTitle, { sx: { p: "16px 20px", fontStyle: "inherit" }, children: /* @__PURE__ */ jsxs(
72
- Box,
71
+ /* @__PURE__ */ jsx(
72
+ DialogTitle,
73
73
  {
74
- sx: {
75
- display: "flex",
76
- alignItems: "center",
77
- gap: 1
78
- },
79
- children: [
80
- /* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: t("conversation.rename.confirm.title") }),
81
- /* @__PURE__ */ jsx(
82
- IconButton,
83
- {
84
- "aria-label": "close",
85
- onClick: onClose,
86
- title: t("common.close"),
87
- size: "large",
88
- sx: {
89
- position: "absolute",
90
- right: 1,
91
- top: 1,
92
- color: "text.primary"
93
- },
94
- children: /* @__PURE__ */ jsx(CloseIcon, {})
95
- }
96
- )
97
- ]
74
+ id: "rename-modal",
75
+ sx: { p: "16px 20px", fontStyle: "inherit" },
76
+ children: /* @__PURE__ */ jsxs(
77
+ Box,
78
+ {
79
+ sx: {
80
+ display: "flex",
81
+ alignItems: "center",
82
+ gap: 1
83
+ },
84
+ children: [
85
+ /* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: t("conversation.rename.confirm.title") }),
86
+ /* @__PURE__ */ jsx(
87
+ IconButton,
88
+ {
89
+ "aria-label": "close",
90
+ onClick: onClose,
91
+ title: t("common.close"),
92
+ size: "large",
93
+ sx: {
94
+ position: "absolute",
95
+ right: 1,
96
+ top: 1,
97
+ color: "text.primary"
98
+ },
99
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
100
+ }
101
+ )
102
+ ]
103
+ }
104
+ )
98
105
  }
99
- ) }),
106
+ ),
100
107
  /* @__PURE__ */ jsx(DialogContent, { id: "rename-modal-body-input", children: /* @__PURE__ */ jsx(
101
108
  TextField,
102
109
  {
@@ -105,7 +112,7 @@ const RenameConversationModal = ({
105
112
  onChange: handleChatNameChange,
106
113
  fullWidth: true,
107
114
  value: chatName,
108
- style: { marginTop: "10px" },
115
+ sx: { mt: "10px" },
109
116
  variant: "outlined",
110
117
  InputProps: {
111
118
  autoFocus: true,
@@ -121,8 +128,8 @@ const RenameConversationModal = ({
121
128
  }
122
129
  }
123
130
  ) }),
124
- isError && /* @__PURE__ */ jsx(Box, { maxWidth: "650px", marginLeft: "20px", marginRight: "20px", children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error) }) }),
125
- /* @__PURE__ */ jsxs(DialogActions, { style: { justifyContent: "left", padding: "20px" }, children: [
131
+ isError && /* @__PURE__ */ jsx(Box, { sx: { maxWidth: "650px", mx: "20px" }, children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error) }) }),
132
+ /* @__PURE__ */ jsxs(DialogActions, { sx: { justifyContent: "left", p: "20px" }, children: [
126
133
  /* @__PURE__ */ jsx(
127
134
  Button,
128
135
  {
@@ -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: 'text.primary',\n }}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent id=\"rename-modal-body-input\">\n <TextField\n id=\"outlined-chat-name-input\"\n label={t('conversation.rename.placeholder')}\n onChange={handleChatNameChange}\n fullWidth\n value={chatName}\n style={{ marginTop: '10px' }}\n variant=\"outlined\"\n InputProps={{\n autoFocus: true,\n endAdornment: (\n <IconButton\n aria-label=\"clear-input\"\n onClick={() => setChatName('')}\n edge=\"end\"\n >\n <CancelOutlinedIcon />\n </IconButton>\n ),\n }}\n />\n </DialogContent>\n {isError && (\n <Box maxWidth=\"650px\" marginLeft=\"20px\" marginRight=\"20px\">\n <Alert severity=\"error\">{String(error)}</Alert>\n </Box>\n )}\n <DialogActions style={{ justifyContent: 'left', padding: '20px' }}>\n <Button\n variant=\"contained\"\n sx={{\n textTransform: 'none',\n }}\n disabled={\n chatName.trim() === '' ||\n chatName.trim() === originalChatName.trim()\n }\n onClick={handleRename}\n >\n {t('conversation.rename.confirm.action')}\n </Button>\n <Button\n key=\"cancel\"\n variant=\"outlined\"\n sx={{\n textTransform: 'none',\n }}\n onClick={onClose}\n >\n {t('common.cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
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 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 TextField from '@mui/material/TextField';\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\n id=\"rename-modal\"\n sx={{ p: '16px 20px', fontStyle: 'inherit' }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n {t('conversation.rename.confirm.title')}\n </Typography>\n\n <IconButton\n aria-label=\"close\"\n onClick={onClose}\n title={t('common.close')}\n size=\"large\"\n sx={{\n position: 'absolute',\n right: 1,\n top: 1,\n color: 'text.primary',\n }}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent id=\"rename-modal-body-input\">\n <TextField\n id=\"outlined-chat-name-input\"\n label={t('conversation.rename.placeholder')}\n onChange={handleChatNameChange}\n fullWidth\n value={chatName}\n sx={{ mt: '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 sx={{ maxWidth: '650px', mx: '20px' }}>\n <Alert severity=\"error\">{String(error)}</Alert>\n </Box>\n )}\n <DialogActions sx={{ justifyContent: 'left', p: '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,15 +1,12 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { Routes, Route } from 'react-router-dom';
3
3
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
4
- import { StylesProvider as StylesProvider$1 } from '@material-ui/core/styles';
5
- import { StylesProvider } from '@mui/styles';
6
- import { generateClassName, generateClassNameV4 } from '../utils/generateClassName.esm.js';
7
4
  import { LightspeedPage } from './LightspeedPage.esm.js';
8
5
 
9
6
  const Router = () => {
10
7
  const configApi = useApi(configApiRef);
11
8
  const notebooksEnabled = configApi.getOptionalBoolean("intelligent-assistant.notebooks.enabled") ?? false;
12
- return /* @__PURE__ */ jsx(StylesProvider, { generateClassName, children: /* @__PURE__ */ jsx(StylesProvider$1, { generateClassName: generateClassNameV4, children: /* @__PURE__ */ jsxs(Routes, { children: [
9
+ return /* @__PURE__ */ jsxs(Routes, { children: [
13
10
  /* @__PURE__ */ jsx(Route, { path: "/", element: /* @__PURE__ */ jsx(LightspeedPage, {}) }),
14
11
  /* @__PURE__ */ jsx(
15
12
  Route,
@@ -20,15 +17,9 @@ const Router = () => {
20
17
  ),
21
18
  notebooksEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
22
19
  /* @__PURE__ */ jsx(Route, { path: "/notebooks", element: /* @__PURE__ */ jsx(LightspeedPage, {}) }),
23
- /* @__PURE__ */ jsx(
24
- Route,
25
- {
26
- path: "/notebooks/:notebookId",
27
- element: /* @__PURE__ */ jsx(LightspeedPage, {})
28
- }
29
- )
20
+ /* @__PURE__ */ jsx(Route, { path: "/notebooks/:notebookId", element: /* @__PURE__ */ jsx(LightspeedPage, {}) })
30
21
  ] })
31
- ] }) }) });
22
+ ] });
32
23
  };
33
24
 
34
25
  export { Router };
@@ -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 { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { StylesProvider as StylesProviderV4 } from '@material-ui/core/styles';\nimport { StylesProvider } from '@mui/styles';\n\nimport {\n generateClassName,\n generateClassNameV4,\n} from '../utils/generateClassName';\nimport { LightspeedPage } from './LightspeedPage';\n\n/**\n * @public\n */\nexport const Router = () => {\n const configApi = useApi(configApiRef);\n const notebooksEnabled =\n configApi.getOptionalBoolean('intelligent-assistant.notebooks.enabled') ??\n false;\n\n return (\n <StylesProvider generateClassName={generateClassName}>\n <StylesProviderV4 generateClassName={generateClassNameV4}>\n <Routes>\n <Route path=\"/\" element={<LightspeedPage />} />\n <Route\n path=\"/conversation/:conversationId\"\n element={<LightspeedPage />}\n />\n {notebooksEnabled && (\n <>\n <Route path=\"/notebooks\" element={<LightspeedPage />} />\n <Route\n path=\"/notebooks/:notebookId\"\n element={<LightspeedPage />}\n />\n </>\n )}\n </Routes>\n </StylesProviderV4>\n </StylesProvider>\n );\n};\n"],"names":["StylesProviderV4"],"mappings":";;;;;;;;AAgCO,MAAM,SAAS,MAAM;AAC1B,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,gBAAA,GACJ,SAAA,CAAU,kBAAA,CAAmB,yCAAyC,CAAA,IACtE,KAAA;AAEF,EAAA,uBACE,GAAA,CAAC,kBAAe,iBAAA,EACd,QAAA,kBAAA,GAAA,CAACA,oBAAiB,iBAAA,EAAmB,mBAAA,EACnC,+BAAC,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,IACC,oCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAM,IAAA,EAAK,YAAA,EAAa,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,sBACtD,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,wBAAA;AAAA,UACL,OAAA,sBAAU,cAAA,EAAA,EAAe;AAAA;AAAA;AAC3B,KAAA,EACF;AAAA,GAAA,EAEJ,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
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 { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { LightspeedPage } from './LightspeedPage';\n\n/**\n * @public\n */\nexport const Router = () => {\n const configApi = useApi(configApiRef);\n const notebooksEnabled =\n configApi.getOptionalBoolean('intelligent-assistant.notebooks.enabled') ??\n false;\n\n return (\n <Routes>\n <Route path=\"/\" element={<LightspeedPage />} />\n <Route\n path=\"/conversation/:conversationId\"\n element={<LightspeedPage />}\n />\n {notebooksEnabled && (\n <>\n <Route path=\"/notebooks\" element={<LightspeedPage />} />\n <Route path=\"/notebooks/:notebookId\" element={<LightspeedPage />} />\n </>\n )}\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;;AAyBO,MAAM,SAAS,MAAM;AAC1B,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,gBAAA,GACJ,SAAA,CAAU,kBAAA,CAAmB,yCAAyC,CAAA,IACtE,KAAA;AAEF,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,IACC,oCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAM,IAAA,EAAK,YAAA,EAAa,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,0BACrD,KAAA,EAAA,EAAM,IAAA,EAAK,0BAAyB,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI;AAAA,KAAA,EACpE;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}