@red-hat-developer-hub/backstage-plugin-lightspeed 1.4.0 → 2.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 (92) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +59 -0
  3. package/dist/alpha/LightspeedFAB.esm.js +69 -0
  4. package/dist/alpha/LightspeedFAB.esm.js.map +1 -0
  5. package/dist/alpha/LightspeedProvider.esm.js +6 -0
  6. package/dist/alpha/LightspeedProvider.esm.js.map +1 -0
  7. package/dist/alpha.d.ts +170 -1
  8. package/dist/alpha.esm.js +97 -1
  9. package/dist/alpha.esm.js.map +1 -1
  10. package/dist/api/LightspeedApiClient.esm.js +19 -0
  11. package/dist/api/LightspeedApiClient.esm.js.map +1 -1
  12. package/dist/api/NotebooksApiClient.esm.js +72 -0
  13. package/dist/api/NotebooksApiClient.esm.js.map +1 -0
  14. package/dist/api/api.esm.js.map +1 -1
  15. package/dist/api/notebooksApi.esm.js +10 -0
  16. package/dist/api/notebooksApi.esm.js.map +1 -0
  17. package/dist/components/DeleteModal.esm.js +2 -0
  18. package/dist/components/DeleteModal.esm.js.map +1 -1
  19. package/dist/components/LightSpeedChat.esm.js +714 -66
  20. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  21. package/dist/components/LightspeedChatBox.esm.js +18 -4
  22. package/dist/components/LightspeedChatBox.esm.js.map +1 -1
  23. package/dist/components/LightspeedChatBoxHeader.esm.js +59 -50
  24. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  25. package/dist/components/LightspeedChatContainer.esm.js +26 -2
  26. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  27. package/dist/components/LightspeedDrawerProvider.esm.js +12 -157
  28. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  29. package/dist/components/LightspeedFAB.esm.js +5 -4
  30. package/dist/components/LightspeedFAB.esm.js.map +1 -1
  31. package/dist/components/McpServersSettings.esm.js +932 -0
  32. package/dist/components/McpServersSettings.esm.js.map +1 -0
  33. package/dist/components/McpSettingsIcon.esm.js +26 -0
  34. package/dist/components/McpSettingsIcon.esm.js.map +1 -0
  35. package/dist/components/PermissionRequiredState.esm.js +18 -22
  36. package/dist/components/PermissionRequiredState.esm.js.map +1 -1
  37. package/dist/components/RenameConversationModal.esm.js +2 -2
  38. package/dist/components/RenameConversationModal.esm.js.map +1 -1
  39. package/dist/components/ToolCallContent.esm.js +14 -4
  40. package/dist/components/ToolCallContent.esm.js.map +1 -1
  41. package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
  42. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
  43. package/dist/components/notebooks/NotebookCard.esm.js +96 -0
  44. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
  45. package/dist/components/notebooks/NotebooksTab.esm.js +61 -0
  46. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
  47. package/dist/components/notebooks/RenameNotebookModal.esm.js +187 -0
  48. package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -0
  49. package/dist/const.esm.js +3 -1
  50. package/dist/const.esm.js.map +1 -1
  51. package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
  52. package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
  53. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +15 -0
  54. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -0
  55. package/dist/hooks/notebooks/useNotebookSessions.esm.js +18 -0
  56. package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -0
  57. package/dist/hooks/notebooks/useRenameNotebook.esm.js +19 -0
  58. package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -0
  59. package/dist/hooks/useConversationMessages.esm.js +136 -36
  60. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  61. package/dist/hooks/useConversations.esm.js +6 -0
  62. package/dist/hooks/useConversations.esm.js.map +1 -1
  63. package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
  64. package/dist/hooks/useLightspeedProviderState.esm.js +205 -0
  65. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
  66. package/dist/hooks/useStopConversation.esm.js +18 -0
  67. package/dist/hooks/useStopConversation.esm.js.map +1 -0
  68. package/dist/hooks/useWelcomePrompts.esm.js +2 -2
  69. package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
  70. package/dist/index.d.ts +31 -31
  71. package/dist/plugin.esm.js +10 -0
  72. package/dist/plugin.esm.js.map +1 -1
  73. package/dist/translations/de.esm.js +78 -0
  74. package/dist/translations/de.esm.js.map +1 -1
  75. package/dist/translations/es.esm.js +78 -0
  76. package/dist/translations/es.esm.js.map +1 -1
  77. package/dist/translations/fr.esm.js +64 -1
  78. package/dist/translations/fr.esm.js.map +1 -1
  79. package/dist/translations/it.esm.js +66 -1
  80. package/dist/translations/it.esm.js.map +1 -1
  81. package/dist/translations/ja.esm.js +66 -1
  82. package/dist/translations/ja.esm.js.map +1 -1
  83. package/dist/translations/ref.esm.js +65 -1
  84. package/dist/translations/ref.esm.js.map +1 -1
  85. package/dist/types.esm.js.map +1 -1
  86. package/dist/utils/formatToolResponseForMarkdown.esm.js +46 -0
  87. package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
  88. package/dist/utils/lightspeed-chatbox-utils.esm.js +7 -3
  89. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
  90. package/dist/utils/notebooks-utils.esm.js +25 -0
  91. package/dist/utils/notebooks-utils.esm.js.map +1 -0
  92. package/package.json +21 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServersSettings.esm.js","sources":["../../src/components/McpServersSettings.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { configApiRef, fetchApiRef, useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { makeStyles } from '@material-ui/core';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport 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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"}
@@ -0,0 +1,26 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import SvgIcon from '@mui/material/SvgIcon';
3
+
4
+ const McpSettingsIcon = () => /* @__PURE__ */ jsxs(SvgIcon, { sx: { marginTop: "8px" }, viewBox: "0 0 12 12", fontSize: "small", children: [
5
+ /* @__PURE__ */ jsx(
6
+ "path",
7
+ {
8
+ fillRule: "evenodd",
9
+ clipRule: "evenodd",
10
+ 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",
11
+ fill: "currentColor"
12
+ }
13
+ ),
14
+ /* @__PURE__ */ jsx(
15
+ "path",
16
+ {
17
+ fillRule: "evenodd",
18
+ clipRule: "evenodd",
19
+ 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",
20
+ fill: "currentColor"
21
+ }
22
+ )
23
+ ] });
24
+
25
+ export { McpSettingsIcon };
26
+ //# sourceMappingURL=McpSettingsIcon.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpSettingsIcon.esm.js","sources":["../../src/components/McpSettingsIcon.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\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,eAAkB,GAAA,sBAC5B,IAAA,CAAA,OAAA,EAAA,EAAQ,EAAI,EAAA,EAAE,SAAW,EAAA,KAAA,EAAS,EAAA,OAAA,EAAQ,WAAY,EAAA,QAAA,EAAS,OAC9D,EAAA,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,SAAA;AAAA,MACT,QAAS,EAAA,SAAA;AAAA,MACT,CAAE,EAAA,+8EAAA;AAAA,MACF,IAAK,EAAA;AAAA;AAAA,GACP;AAAA,kBACA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,SAAA;AAAA,MACT,QAAS,EAAA,SAAA;AAAA,MACT,CAAE,EAAA,usCAAA;AAAA,MACF,IAAK,EAAA;AAAA;AAAA;AACP,CACF,EAAA;;;;"}
@@ -1,25 +1,34 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { Fragment as Fragment$1 } from 'react';
2
3
  import { EmptyState } from '@backstage/core-components';
3
- import { Typography, Button } from '@material-ui/core';
4
+ import { Typography } from '@material-ui/core';
4
5
  import { makeStyles, createStyles } from '@material-ui/core/styles';
5
- import OpenInNewIcon from '@mui/icons-material/OpenInNew';
6
6
  import { useTranslation } from '../hooks/useTranslation.esm.js';
7
7
  import { PermissionRequiredIcon } from './PermissionRequiredIcon.esm.js';
8
8
  import { Trans } from './Trans.esm.js';
9
9
 
10
10
  const useStyles = makeStyles(
11
- () => createStyles({
11
+ (theme) => createStyles({
12
12
  permissionError: {
13
13
  display: "flex",
14
14
  height: "100%",
15
15
  alignItems: "center",
16
- padding: "100px"
16
+ padding: "100px",
17
+ backgroundColor: theme.palette.background.default
17
18
  }
18
19
  })
19
20
  );
20
- const PermissionRequiredState = () => {
21
+ const PermissionRequiredState = ({
22
+ subject,
23
+ permissions,
24
+ action
25
+ }) => {
21
26
  const classes = useStyles();
22
27
  const { t } = useTranslation();
28
+ const permissionsList = /* @__PURE__ */ jsx(Fragment, { children: permissions.map((perm, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
29
+ /* @__PURE__ */ jsx("b", { children: perm }),
30
+ i < permissions.length - 1 && " and "
31
+ ] }, perm)) });
23
32
  return /* @__PURE__ */ jsx("div", { className: classes.permissionError, children: /* @__PURE__ */ jsx(
24
33
  EmptyState,
25
34
  {
@@ -29,26 +38,13 @@ const PermissionRequiredState = () => {
29
38
  {
30
39
  message: "permission.required.description",
31
40
  components: {
32
- "<b>lightspeed.chat.read</b>": /* @__PURE__ */ jsx("b", { children: "lightspeed.chat.read" }),
33
- "<b>lightspeed.chat.create</b>": /* @__PURE__ */ jsx("b", { children: "lightspeed.chat.create" })
41
+ "<subject/>": /* @__PURE__ */ jsx(Fragment, { children: subject }),
42
+ "<permissions/>": permissionsList
34
43
  }
35
44
  }
36
45
  ) }),
37
46
  missing: { customImage: /* @__PURE__ */ jsx(PermissionRequiredIcon, {}) },
38
- action: /* @__PURE__ */ jsxs(
39
- Button,
40
- {
41
- variant: "outlined",
42
- color: "primary",
43
- target: "_blank",
44
- href: "https://github.com/redhat-developer/rhdh-plugins/blob/main/workspaces/lightspeed/plugins/lightspeed/README.md#permission-framework-support",
45
- children: [
46
- t("common.readMore"),
47
- " \xA0 ",
48
- /* @__PURE__ */ jsx(OpenInNewIcon, {})
49
- ]
50
- }
51
- )
47
+ action
52
48
  }
53
49
  ) });
54
50
  };
@@ -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 { EmptyState } from '@backstage/core-components';\n\nimport { Button, Typography } from '@material-ui/core';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { PermissionRequiredIcon } from './PermissionRequiredIcon';\nimport { Trans } from './Trans';\n\nconst useStyles = makeStyles(() =>\n createStyles({\n permissionError: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n padding: '100px',\n },\n }),\n);\n\nconst PermissionRequiredState = () => {\n const classes = useStyles();\n const { t } = useTranslation();\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 '<b>lightspeed.chat.read</b>': <b>lightspeed.chat.read</b>,\n '<b>lightspeed.chat.create</b>': <b>lightspeed.chat.create</b>,\n }}\n />\n </Typography>\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://github.com/redhat-developer/rhdh-plugins/blob/main/workspaces/lightspeed/plugins/lightspeed/README.md#permission-framework-support\"\n >\n {t('common.readMore')} &nbsp; <OpenInNewIcon />\n </Button>\n }\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":[],"mappings":";;;;;;;;;AA0BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,MAC3B,YAAa,CAAA;AAAA,IACX,eAAiB,EAAA;AAAA,MACf,OAAS,EAAA,MAAA;AAAA,MACT,MAAQ,EAAA,MAAA;AAAA,MACR,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA;AAAA;AACX,GACD;AACH,CAAA;AAEA,MAAM,0BAA0B,MAAM;AACpC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,eACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,iCAAA;AAAA,UACR,UAAY,EAAA;AAAA,YACV,6BAAA,kBAAgC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAoB,EAAA,sBAAA,EAAA,CAAA;AAAA,YACtD,+BAAA,kBAAkC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAsB,EAAA,wBAAA,EAAA;AAAA;AAC5D;AAAA,OAEJ,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,EAAE,WAAa,kBAAA,GAAA,CAAC,0BAAuB,CAAG,EAAA;AAAA,MACnD,MACE,kBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,SAAA;AAAA,UACN,MAAO,EAAA,QAAA;AAAA,UACP,IAAK,EAAA,4IAAA;AAAA,UAEJ,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,YAAE,QAAA;AAAA,gCAAS,aAAc,EAAA,EAAA;AAAA;AAAA;AAAA;AAC/C;AAAA,GAGN,EAAA,CAAA;AAEJ;;;;"}
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,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,eAAiB,EAAA;AAAA,MACf,OAAS,EAAA,MAAA;AAAA,MACT,MAAQ,EAAA,MAAA;AAAA,MACR,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA,OAAA;AAAA,MACT,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA;AAAA;AAC5C,GACD;AACH,CAAA;AAQA,MAAM,0BAA0B,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAoC,KAAA;AAClC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAM,MAAA,eAAA,mCAED,QAAY,EAAA,WAAA,CAAA,GAAA,CAAI,CAAC,IAAM,EAAA,CAAA,qBACrBA,IAAAA,CAAAA,UAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAG,QAAK,EAAA,IAAA,EAAA,CAAA;AAAA,IACR,CAAA,GAAI,WAAY,CAAA,MAAA,GAAS,CAAK,IAAA;AAAA,GAFlB,EAAA,EAAA,IAGf,CACD,CACH,EAAA,CAAA;AAGF,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,eACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,iCAAA;AAAA,UACR,UAAY,EAAA;AAAA,YACV,YAAA,kCAAiB,QAAQ,EAAA,OAAA,EAAA,CAAA;AAAA,YACzB,gBAAkB,EAAA;AAAA;AACpB;AAAA,OAEJ,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,EAAE,WAAa,kBAAA,GAAA,CAAC,0BAAuB,CAAG,EAAA;AAAA,MACnD;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -36,8 +36,8 @@ const RenameConversationModal = ({
36
36
  (c) => c.conversation_id === conversationId
37
37
  );
38
38
  if (conversation) {
39
- setChatName(conversation.topic_summary);
40
- setOriginalChatName(conversation.topic_summary);
39
+ setChatName(conversation.topic_summary ?? "");
40
+ setOriginalChatName(conversation.topic_summary ?? "");
41
41
  } else {
42
42
  setChatName("");
43
43
  setOriginalChatName("");
@@ -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":"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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 { 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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"}
@@ -3,6 +3,7 @@ import { Message } from '@patternfly/chatbot';
3
3
  import { Flex, FlexItem, Content, ContentVariants, DescriptionList, DescriptionListGroup, DescriptionListTerm, DescriptionListDescription, Label } from '@patternfly/react-core';
4
4
  import { WrenchIcon } from '@patternfly/react-icons';
5
5
  import { useTranslation } from '../hooks/useTranslation.esm.js';
6
+ import { formatToolResponseForMarkdown } from '../utils/formatToolResponseForMarkdown.esm.js';
6
7
 
7
8
  const ToolCallContent = ({
8
9
  toolCall,
@@ -17,7 +18,7 @@ const ToolCallContent = ({
17
18
  const getParameterKeys = () => {
18
19
  if (!toolCall.arguments) return [];
19
20
  return Object.keys(toolCall.arguments).filter(
20
- (key) => toolCall.arguments[key] !== "" && toolCall.arguments[key] !== null
21
+ (key) => key !== "server_label" && toolCall.arguments[key] !== "" && toolCall.arguments[key] !== null
21
22
  );
22
23
  };
23
24
  const getThinkingTime = () => {
@@ -28,6 +29,13 @@ const ToolCallContent = ({
28
29
  };
29
30
  const thinkingTime = getThinkingTime();
30
31
  const parameterKeys = getParameterKeys();
32
+ const mcpServerTitle = (() => {
33
+ const label = toolCall.arguments?.server_label;
34
+ if (typeof label === "string" && label.trim() !== "") {
35
+ return label.trim();
36
+ }
37
+ return t("toolCall.mcpServer");
38
+ })();
31
39
  return /* @__PURE__ */ jsxs(
32
40
  Flex,
33
41
  {
@@ -75,7 +83,7 @@ const ToolCallContent = ({
75
83
  }
76
84
  }
77
85
  ),
78
- /* @__PURE__ */ jsx("strong", { children: t("toolCall.mcpServer") })
86
+ /* @__PURE__ */ jsx("strong", { children: mcpServerTitle })
79
87
  ]
80
88
  }
81
89
  ),
@@ -154,12 +162,14 @@ const ToolCallContent = ({
154
162
  children: /* @__PURE__ */ jsx(FlexItem, { children: /* @__PURE__ */ jsx(
155
163
  Message,
156
164
  {
157
- content: toolCall.response,
165
+ content: formatToolResponseForMarkdown(
166
+ toolCall.response
167
+ ),
158
168
  role,
159
169
  codeBlockProps: {
160
170
  isExpandable: true,
161
171
  expandableSectionProps: {
162
- truncateMaxLines: 1
172
+ truncateMaxLines: 12
163
173
  }
164
174
  }
165
175
  }
@@ -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';\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 => toolCall.arguments[key] !== '' && 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 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>{t('toolCall.mcpServer')}</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={toolCall.response}\n role={role}\n codeBlockProps={{\n isExpandable: true,\n expandableSectionProps: {\n truncateMaxLines: 1,\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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"}