@red-hat-developer-hub/backstage-plugin-intelligent-assistant 5.0.2 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +26 -3
- package/dist/alpha.d.ts +37 -7
- package/dist/api/LightspeedApiClient.esm.js +57 -0
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/api.esm.js.map +1 -1
- package/dist/components/DeleteModal.esm.js +2 -0
- package/dist/components/DeleteModal.esm.js.map +1 -1
- package/dist/components/DeleteSavedPromptModal.esm.js +75 -0
- package/dist/components/DeleteSavedPromptModal.esm.js.map +1 -0
- package/dist/components/LightSpeedChat.esm.js +296 -168
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +29 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedChatContainer.esm.js +38 -60
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
- package/dist/components/LightspeedFABContent.esm.js +9 -0
- package/dist/components/LightspeedFABContent.esm.js.map +1 -1
- package/dist/components/LightspeedPage.esm.js +11 -2
- package/dist/components/LightspeedPage.esm.js.map +1 -1
- package/dist/components/McpConfigureServerModal.esm.js +2 -3
- package/dist/components/McpConfigureServerModal.esm.js.map +1 -1
- package/dist/components/McpServersSettings.esm.js +33 -60
- package/dist/components/McpServersSettings.esm.js.map +1 -1
- package/dist/components/SavedPromptCard.esm.js +100 -0
- package/dist/components/SavedPromptCard.esm.js.map +1 -0
- package/dist/components/SavedPromptKebabMenu.esm.js +87 -0
- package/dist/components/SavedPromptKebabMenu.esm.js.map +1 -0
- package/dist/components/SavedPromptMenuItems.esm.js +52 -0
- package/dist/components/SavedPromptMenuItems.esm.js.map +1 -0
- package/dist/components/SavedPromptsEmptyState.esm.js +63 -0
- package/dist/components/SavedPromptsEmptyState.esm.js.map +1 -0
- package/dist/components/SavedPromptsList.esm.js +63 -0
- package/dist/components/SavedPromptsList.esm.js.map +1 -0
- package/dist/components/SavedPromptsSettings.esm.js +285 -0
- package/dist/components/SavedPromptsSettings.esm.js.map +1 -0
- package/dist/components/SettingsPanel.esm.js +135 -0
- package/dist/components/SettingsPanel.esm.js.map +1 -0
- package/dist/hooks/useAllModels.esm.js +2 -1
- package/dist/hooks/useAllModels.esm.js.map +1 -1
- package/dist/hooks/useConversationHistoryGroups.esm.js +71 -0
- package/dist/hooks/useConversationHistoryGroups.esm.js.map +1 -0
- package/dist/hooks/useConversations.esm.js +2 -1
- package/dist/hooks/useConversations.esm.js.map +1 -1
- package/dist/hooks/useFeedbackActions.esm.js.map +1 -1
- package/dist/hooks/useIaChatPermission.esm.js +15 -0
- package/dist/hooks/useIaChatPermission.esm.js.map +1 -0
- package/dist/hooks/useIaMcpToolsPermission.esm.js +15 -0
- package/dist/hooks/useIaMcpToolsPermission.esm.js.map +1 -0
- package/dist/hooks/{notebooks/useLightspeedNotebooksPermission.esm.js → useIaNotebooksPermission.esm.js} +4 -5
- package/dist/hooks/useIaNotebooksPermission.esm.js.map +1 -0
- package/dist/hooks/useLightspeedProviderState.esm.js +19 -5
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
- package/dist/hooks/useMcpConfigureModal.esm.js +5 -9
- package/dist/hooks/useMcpConfigureModal.esm.js.map +1 -1
- package/dist/hooks/useNotebookConversationIds.esm.js +2 -1
- package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -1
- package/dist/hooks/useQuestionValidation.esm.js +3 -2
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -1
- package/dist/hooks/useSavedPromptActions.esm.js +64 -0
- package/dist/hooks/useSavedPromptActions.esm.js.map +1 -0
- package/dist/hooks/useSavedPrompts.esm.js +75 -0
- package/dist/hooks/useSavedPrompts.esm.js.map +1 -0
- package/dist/hooks/useSavedPromptsSettings.esm.js +65 -0
- package/dist/hooks/useSavedPromptsSettings.esm.js.map +1 -0
- package/dist/hooks/useSettingsPanelUrlState.esm.js +95 -0
- package/dist/hooks/useSettingsPanelUrlState.esm.js.map +1 -0
- package/dist/hooks/useWelcomePrompts.esm.js +17 -6
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/translations/de.esm.js +40 -8
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +40 -8
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +40 -8
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/it.esm.js +40 -8
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js +40 -8
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js +40 -10
- package/dist/translations/ref.esm.js.map +1 -1
- package/dist/utils/buildConversationHistoryGroups.esm.js +241 -0
- package/dist/utils/buildConversationHistoryGroups.esm.js.map +1 -0
- package/dist/utils/prompt-utils.esm.js +18 -1
- package/dist/utils/prompt-utils.esm.js.map +1 -1
- package/package.json +5 -14
- package/dist/components/PermissionRequiredIcon.esm.js +0 -18
- package/dist/components/PermissionRequiredIcon.esm.js.map +0 -1
- package/dist/components/PermissionRequiredState.esm.js +0 -88
- package/dist/components/PermissionRequiredState.esm.js.map +0 -1
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +0 -1
- package/dist/hooks/useLightspeedDeletePermission.esm.js +0 -12
- package/dist/hooks/useLightspeedDeletePermission.esm.js.map +0 -1
- package/dist/hooks/useLightspeedUpdatePermission.esm.js +0 -12
- package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +0 -1
- package/dist/hooks/useLightspeedViewPermission.esm.js +0 -16
- package/dist/hooks/useLightspeedViewPermission.esm.js.map +0 -1
- package/dist/images/permission-required.svg +0 -319
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpConfigureServerModal.esm.js","sources":["../../src/components/McpConfigureServerModal.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 { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport {\n Alert,\n Button,\n Flex,\n FlexItem,\n Form,\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n List,\n ListItem,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Radio,\n Spinner,\n Stack,\n StackItem,\n Switch,\n TextInputGroup,\n TextInputGroupMain,\n TextInputGroupUtilities,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n KeyIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\n\nimport { type UseMcpConfigureModalResult } from '../hooks/useMcpConfigureModal';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst StyledModal = styled(Modal)({\n '& .pf-v6-c-modal-box__close, & .pf-v5-c-modal-box__close': {\n display: 'none',\n },\n '& .pf-v6-c-modal-box__body, & .pf-v5-c-modal-box__body': {\n paddingTop: 0,\n },\n '& .ia-mcp-modal-close': {\n position: 'absolute',\n insetBlockStart: 'var(--pf-v6-c-modal-box__close--InsetBlockStart, 1.5rem)',\n insetInlineEnd: 'var(--pf-v6-c-modal-box__close--InsetInlineEnd, 1.5rem)',\n zIndex: 1,\n },\n});\n\nconst ModalInfoAlert = styled(Alert)({\n '--pf-v6-c-alert--m-custom--BorderColor':\n 'var(--pf-t--global--color--status--info--default)',\n '--pf-v6-c-alert--m-custom__icon--Color':\n 'var(--pf-t--global--color--status--info--default)',\n '& .pf-v6-c-alert__icon': {\n alignSelf: 'start',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'center',\n boxSizing: 'border-box',\n marginBlockStart: 0,\n paddingBlockStart: '18.620px',\n paddingInline: 'var(--pf-t--global--spacer--md)',\n paddingBlockEnd: 'var(--pf-t--global--spacer--md)',\n },\n});\n\nconst sectionTitleSx = {\n fontSize: '0.875rem',\n fontWeight: 600,\n} as const;\n\nconst sectionDescriptionSx = {\n color: 'var(--pf-t--global--text--color--subtle)',\n fontSize: '0.875rem',\n} as const;\n\nconst credentialRadioDescriptionSx = {\n color: 'var(--pf-t--global--text--color--subtle)',\n fontSize: '0.875rem',\n} as const;\n\nconst StatusOkIcon = styled(CheckCircleIcon)({\n color: 'var(--pf-t--global--icon--color--status--custom--default)',\n});\n\nconst StatusWarnIcon = styled(ExclamationCircleIcon)({\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n});\n\nconst StatusDisabledIcon = styled(InfoCircleIcon)({\n color: 'var(--pf-t--global--icon--color--subtle)',\n});\n\nconst StatusWarnKeyIcon = styled(KeyIcon)({\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n});\n\nconst RemovePersonalTokenButton = styled(Button)({\n borderRadius: '1.25rem',\n boxShadow: 'none',\n});\n\ntype McpConfigureServerModalProps = UseMcpConfigureModalResult;\n\nexport const McpConfigureServerModal = ({\n isOpen,\n editingServer,\n close,\n save,\n removePersonalToken,\n canManageMcp,\n configureModalTitle,\n isConfigureModalSaving,\n isSaveTokenButtonDisabled,\n isUpdatingModalStatus,\n tokenInputValue,\n onTokenInputChange,\n clearTokenInput,\n tokenInputValidated,\n tokenValidationState,\n tokenHelperVariant,\n showTokenHelperText,\n tokenHelperText,\n modalCredentialMode,\n onCredentialModeChange,\n showCredentialRadios,\n showPersonalTokenField,\n onModalEnabledChange,\n isModalEnabledChecked,\n isModalEnabledToggleDisabled,\n modalDisplayStatus,\n modalStatusDetail,\n modalStatusText,\n modalTools,\n modalToolCount,\n isLoadingModalTools,\n modalToolsError,\n modalToolsEmptyText,\n modalVerifiedHasToken,\n modalEnabledDescription,\n canRemovePersonalToken,\n hasSavedTokenInModal,\n hasRemovedPersonalToken,\n}: McpConfigureServerModalProps) => {\n const { t } = useTranslation();\n\n const renderStatusIcon = () => {\n if (isUpdatingModalStatus || isLoadingModalTools) {\n return (\n <Spinner\n size=\"md\"\n aria-label={\n isUpdatingModalStatus\n ? t('mcp.settings.modal.loadingStatus')\n : t('mcp.settings.modal.fetchingStatus')\n }\n />\n );\n }\n if (modalDisplayStatus === 'disabled') {\n return <StatusDisabledIcon />;\n }\n if (modalDisplayStatus === 'tokenRequired') {\n return <StatusWarnKeyIcon />;\n }\n if (modalDisplayStatus === 'ok' && modalTools.length > 0) {\n return <StatusOkIcon />;\n }\n if (modalToolsError || modalDisplayStatus === 'failed') {\n return <StatusWarnIcon />;\n }\n return <StatusDisabledIcon />;\n };\n\n const renderToolsContent = () => {\n if (isLoadingModalTools) {\n return (\n <Spinner size=\"md\" aria-label={t('mcp.settings.modal.loadingTools')} />\n );\n }\n if (modalTools.length > 0) {\n return (\n <List\n isPlain\n aria-label={t('mcp.settings.modal.toolsHeading' as any, {\n count: String(modalToolCount),\n })}\n >\n {modalTools.map(toolName => (\n <ListItem key={toolName} icon={<StatusOkIcon />}>\n {toolName}\n </ListItem>\n ))}\n </List>\n );\n }\n return (\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mt-xs\"\n sx={sectionDescriptionSx}\n >\n {modalToolsEmptyText}\n </Typography>\n );\n };\n\n const enabledSwitch = (\n <Switch\n id=\"mcp-configure-enabled-switch\"\n aria-label={t('mcp.settings.toggleServerAriaLabel' as any, {\n serverName: editingServer?.name ?? '',\n })}\n isChecked={isModalEnabledChecked}\n isDisabled={isModalEnabledToggleDisabled}\n onChange={onModalEnabledChange}\n />\n );\n\n return (\n <StyledModal\n variant=\"small\"\n width={608}\n isOpen={isOpen}\n onClose={close}\n aria-labelledby=\"mcp-configure-modal\"\n aria-describedby=\"mcp-configure-modal-body\"\n >\n <ModalHeader\n title={configureModalTitle}\n labelId=\"mcp-configure-modal\"\n descriptorId=\"mcp-configure-modal-body\"\n />\n <Button\n className=\"ia-mcp-modal-close\"\n variant=\"plain\"\n icon={<TimesIcon />}\n aria-label={t('mcp.settings.closeConfigureModalAriaLabel')}\n onClick={close}\n />\n <ModalBody id=\"mcp-configure-modal-body\">\n <Stack hasGutter>\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modalDescription')}\n isInline\n />\n </StackItem>\n {editingServer?.auth === 'dcr' && (\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modalDescriptionDcr')}\n isInline\n />\n </StackItem>\n )}\n {hasRemovedPersonalToken && !editingServer?.hasOrgToken && (\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modal.tokenRemovedWarning')}\n isInline\n />\n </StackItem>\n )}\n <StackItem>\n <Typography\n component=\"div\"\n sx={sectionTitleSx}\n className=\"pf-v6-u-mb-sm\"\n >\n {t('mcp.settings.status')}\n </Typography>\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n <FlexItem>{renderStatusIcon()}</FlexItem>\n <FlexItem>\n <Typography component=\"span\">{modalStatusText}</Typography>\n </FlexItem>\n </Flex>\n </StackItem>\n {modalVerifiedHasToken && modalDisplayStatus === 'ok' && (\n <StackItem>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mb-sm\"\n sx={sectionTitleSx}\n >\n {t('mcp.settings.modal.toolsHeading' as any, {\n count: String(modalToolCount),\n })}\n </Typography>\n {renderToolsContent()}\n </StackItem>\n )}\n <StackItem>\n <Flex\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n alignItems={{ default: 'alignItemsFlexStart' }}\n spaceItems={{ default: 'spaceItemsMd' }}\n >\n <FlexItem flex={{ default: 'flex_1' }}>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mb-sm\"\n sx={sectionTitleSx}\n >\n {t('mcp.settings.enabled')}\n </Typography>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mt-xs\"\n sx={sectionDescriptionSx}\n >\n {modalEnabledDescription}\n </Typography>\n </FlexItem>\n <FlexItem>\n {isModalEnabledToggleDisabled ? (\n <Tooltip content={modalStatusDetail}>\n <Typography component=\"span\">{enabledSwitch}</Typography>\n </Tooltip>\n ) : (\n enabledSwitch\n )}\n </FlexItem>\n </Flex>\n </StackItem>\n {(showCredentialRadios || showPersonalTokenField) && (\n <StackItem>\n <Form>\n {showCredentialRadios && (\n <FormGroup\n role=\"radiogroup\"\n id=\"mcp-credential-mode\"\n fieldId=\"mcp-credential-mode\"\n label={t('mcp.settings.modal.authenticationHeading')}\n >\n <Stack hasGutter>\n <StackItem>\n <Radio\n id=\"mcp-credential-organization\"\n name=\"mcp-credential-mode\"\n label={t(\n 'mcp.settings.modal.credentialMode.organization',\n )}\n isChecked={modalCredentialMode === 'organization'}\n onChange={() =>\n onCredentialModeChange('organization')\n }\n />\n <Typography\n component=\"div\"\n className=\"pf-v6-u-ml-xl pf-v6-u-mt-xs\"\n sx={credentialRadioDescriptionSx}\n >\n {t(\n 'mcp.settings.modal.credentialMode.organizationDescription',\n )}\n </Typography>\n </StackItem>\n <StackItem>\n <Radio\n id=\"mcp-credential-personal\"\n name=\"mcp-credential-mode\"\n label={t(\n 'mcp.settings.modal.credentialMode.personal',\n )}\n isChecked={modalCredentialMode === 'personal'}\n onChange={() => onCredentialModeChange('personal')}\n />\n </StackItem>\n </Stack>\n </FormGroup>\n )}\n {showPersonalTokenField && (\n <FormGroup\n label={t('mcp.settings.authenticationToken')}\n fieldId=\"mcp-pat-input\"\n >\n <TextInputGroup validated={tokenInputValidated}>\n <TextInputGroupMain\n inputId=\"mcp-pat-input\"\n type=\"password\"\n value={tokenInputValue}\n onChange={(_event, value) => onTokenInputChange(value)}\n />\n {(tokenValidationState === 'idle' ||\n tokenValidationState === 'validating') && (\n <TextInputGroupUtilities>\n <Button\n variant=\"plain\"\n onClick={clearTokenInput}\n aria-label={t('mcp.settings.token.clearAriaLabel')}\n icon={<TimesIcon />}\n />\n </TextInputGroupUtilities>\n )}\n </TextInputGroup>\n {showTokenHelperText && (\n <FormHelperText>\n <HelperText>\n <HelperTextItem variant={tokenHelperVariant}>\n {tokenHelperText}\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n )}\n </FormGroup>\n )}\n </Form>\n </StackItem>\n )}\n </Stack>\n </ModalBody>\n <ModalFooter>\n <Button\n variant=\"primary\"\n onClick={() => void save()}\n isDisabled={\n !canManageMcp ||\n isConfigureModalSaving ||\n tokenValidationState === 'validating' ||\n isSaveTokenButtonDisabled ||\n isUpdatingModalStatus\n }\n >\n {t('modal.save')}\n </Button>\n {canRemovePersonalToken && (\n <RemovePersonalTokenButton\n variant=\"secondary\"\n isDanger\n onClick={() => void removePersonalToken()}\n isDisabled={\n !canManageMcp ||\n isConfigureModalSaving ||\n tokenValidationState === 'validating' ||\n isUpdatingModalStatus ||\n hasRemovedPersonalToken ||\n !hasSavedTokenInModal\n }\n >\n {t('mcp.settings.removePersonalToken')}\n </RemovePersonalTokenButton>\n )}\n <Button variant=\"link\" onClick={close}>\n {t('common.cancel')}\n </Button>\n </ModalFooter>\n </StyledModal>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"McpConfigureServerModal.esm.js","sources":["../../src/components/McpConfigureServerModal.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 { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport {\n Alert,\n Button,\n Flex,\n FlexItem,\n Form,\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n List,\n ListItem,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Radio,\n Spinner,\n Stack,\n StackItem,\n Switch,\n TextInputGroup,\n TextInputGroupMain,\n TextInputGroupUtilities,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n InfoCircleIcon,\n KeyIcon,\n TimesIcon,\n} from '@patternfly/react-icons';\n\nimport { type UseMcpConfigureModalResult } from '../hooks/useMcpConfigureModal';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst StyledModal = styled(Modal)({\n '& .pf-v6-c-modal-box__close, & .pf-v5-c-modal-box__close': {\n display: 'none',\n },\n '& .pf-v6-c-modal-box__body, & .pf-v5-c-modal-box__body': {\n paddingTop: 0,\n },\n '& .ia-mcp-modal-close': {\n position: 'absolute',\n insetBlockStart: 'var(--pf-v6-c-modal-box__close--InsetBlockStart, 1.5rem)',\n insetInlineEnd: 'var(--pf-v6-c-modal-box__close--InsetInlineEnd, 1.5rem)',\n zIndex: 1,\n },\n});\n\nconst ModalInfoAlert = styled(Alert)({\n '--pf-v6-c-alert--m-custom--BorderColor':\n 'var(--pf-t--global--color--status--info--default)',\n '--pf-v6-c-alert--m-custom__icon--Color':\n 'var(--pf-t--global--color--status--info--default)',\n '& .pf-v6-c-alert__icon': {\n alignSelf: 'start',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'center',\n boxSizing: 'border-box',\n marginBlockStart: 0,\n paddingBlockStart: '18.620px',\n paddingInline: 'var(--pf-t--global--spacer--md)',\n paddingBlockEnd: 'var(--pf-t--global--spacer--md)',\n },\n});\n\nconst sectionTitleSx = {\n fontSize: '0.875rem',\n fontWeight: 600,\n} as const;\n\nconst sectionDescriptionSx = {\n color: 'var(--pf-t--global--text--color--subtle)',\n fontSize: '0.875rem',\n} as const;\n\nconst credentialRadioDescriptionSx = {\n color: 'var(--pf-t--global--text--color--subtle)',\n fontSize: '0.875rem',\n} as const;\n\nconst StatusOkIcon = styled(CheckCircleIcon)({\n color: 'var(--pf-t--global--icon--color--status--custom--default)',\n});\n\nconst StatusWarnIcon = styled(ExclamationCircleIcon)({\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n});\n\nconst StatusDisabledIcon = styled(InfoCircleIcon)({\n color: 'var(--pf-t--global--icon--color--subtle)',\n});\n\nconst StatusWarnKeyIcon = styled(KeyIcon)({\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n});\n\nconst RemovePersonalTokenButton = styled(Button)({\n borderRadius: '1.25rem',\n boxShadow: 'none',\n});\n\ntype McpConfigureServerModalProps = UseMcpConfigureModalResult;\n\nexport const McpConfigureServerModal = ({\n isOpen,\n editingServer,\n close,\n save,\n removePersonalToken,\n configureModalTitle,\n isConfigureModalSaving,\n isSaveTokenButtonDisabled,\n isUpdatingModalStatus,\n tokenInputValue,\n onTokenInputChange,\n clearTokenInput,\n tokenInputValidated,\n tokenValidationState,\n tokenHelperVariant,\n showTokenHelperText,\n tokenHelperText,\n modalCredentialMode,\n onCredentialModeChange,\n showCredentialRadios,\n showPersonalTokenField,\n onModalEnabledChange,\n isModalEnabledChecked,\n isModalEnabledToggleDisabled,\n modalDisplayStatus,\n modalStatusDetail,\n modalStatusText,\n modalTools,\n modalToolCount,\n isLoadingModalTools,\n modalToolsError,\n modalToolsEmptyText,\n modalVerifiedHasToken,\n modalEnabledDescription,\n canRemovePersonalToken,\n hasSavedTokenInModal,\n hasRemovedPersonalToken,\n}: McpConfigureServerModalProps) => {\n const { t } = useTranslation();\n\n const renderStatusIcon = () => {\n if (isUpdatingModalStatus || isLoadingModalTools) {\n return (\n <Spinner\n size=\"md\"\n aria-label={\n isUpdatingModalStatus\n ? t('mcp.settings.modal.loadingStatus')\n : t('mcp.settings.modal.fetchingStatus')\n }\n />\n );\n }\n if (modalDisplayStatus === 'disabled') {\n return <StatusDisabledIcon />;\n }\n if (modalDisplayStatus === 'tokenRequired') {\n return <StatusWarnKeyIcon />;\n }\n if (modalDisplayStatus === 'ok' && modalTools.length > 0) {\n return <StatusOkIcon />;\n }\n if (modalToolsError || modalDisplayStatus === 'failed') {\n return <StatusWarnIcon />;\n }\n return <StatusDisabledIcon />;\n };\n\n const renderToolsContent = () => {\n if (isLoadingModalTools) {\n return (\n <Spinner size=\"md\" aria-label={t('mcp.settings.modal.loadingTools')} />\n );\n }\n if (modalTools.length > 0) {\n return (\n <List\n isPlain\n aria-label={t('mcp.settings.modal.toolsHeading' as any, {\n count: String(modalToolCount),\n })}\n >\n {modalTools.map(toolName => (\n <ListItem key={toolName} icon={<StatusOkIcon />}>\n {toolName}\n </ListItem>\n ))}\n </List>\n );\n }\n return (\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mt-xs\"\n sx={sectionDescriptionSx}\n >\n {modalToolsEmptyText}\n </Typography>\n );\n };\n\n const enabledSwitch = (\n <Switch\n id=\"mcp-configure-enabled-switch\"\n aria-label={t('mcp.settings.toggleServerAriaLabel' as any, {\n serverName: editingServer?.name ?? '',\n })}\n isChecked={isModalEnabledChecked}\n isDisabled={isModalEnabledToggleDisabled}\n onChange={onModalEnabledChange}\n />\n );\n\n return (\n <StyledModal\n variant=\"small\"\n width={608}\n isOpen={isOpen}\n onClose={close}\n aria-labelledby=\"mcp-configure-modal\"\n aria-describedby=\"mcp-configure-modal-body\"\n >\n <ModalHeader\n title={configureModalTitle}\n labelId=\"mcp-configure-modal\"\n descriptorId=\"mcp-configure-modal-body\"\n />\n <Button\n className=\"ia-mcp-modal-close\"\n variant=\"plain\"\n icon={<TimesIcon />}\n aria-label={t('mcp.settings.closeConfigureModalAriaLabel')}\n onClick={close}\n />\n <ModalBody id=\"mcp-configure-modal-body\">\n <Stack hasGutter>\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modalDescription')}\n isInline\n />\n </StackItem>\n {editingServer?.auth === 'dcr' && (\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modalDescriptionDcr')}\n isInline\n />\n </StackItem>\n )}\n {hasRemovedPersonalToken && !editingServer?.hasOrgToken && (\n <StackItem>\n <ModalInfoAlert\n variant=\"custom\"\n customIcon={<InfoCircleIcon />}\n title={t('mcp.settings.modal.tokenRemovedWarning')}\n isInline\n />\n </StackItem>\n )}\n <StackItem>\n <Typography\n component=\"div\"\n sx={sectionTitleSx}\n className=\"pf-v6-u-mb-sm\"\n >\n {t('mcp.settings.status')}\n </Typography>\n <Flex\n alignItems={{ default: 'alignItemsCenter' }}\n spaceItems={{ default: 'spaceItemsSm' }}\n >\n <FlexItem>{renderStatusIcon()}</FlexItem>\n <FlexItem>\n <Typography component=\"span\">{modalStatusText}</Typography>\n </FlexItem>\n </Flex>\n </StackItem>\n {modalVerifiedHasToken && modalDisplayStatus === 'ok' && (\n <StackItem>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mb-sm\"\n sx={sectionTitleSx}\n >\n {t('mcp.settings.modal.toolsHeading' as any, {\n count: String(modalToolCount),\n })}\n </Typography>\n {renderToolsContent()}\n </StackItem>\n )}\n <StackItem>\n <Flex\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n alignItems={{ default: 'alignItemsFlexStart' }}\n spaceItems={{ default: 'spaceItemsMd' }}\n >\n <FlexItem flex={{ default: 'flex_1' }}>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mb-sm\"\n sx={sectionTitleSx}\n >\n {t('mcp.settings.enabled')}\n </Typography>\n <Typography\n component=\"div\"\n className=\"pf-v6-u-mt-xs\"\n sx={sectionDescriptionSx}\n >\n {modalEnabledDescription}\n </Typography>\n </FlexItem>\n <FlexItem>\n {isModalEnabledToggleDisabled ? (\n <Tooltip content={modalStatusDetail}>\n <Typography component=\"span\">{enabledSwitch}</Typography>\n </Tooltip>\n ) : (\n enabledSwitch\n )}\n </FlexItem>\n </Flex>\n </StackItem>\n {(showCredentialRadios || showPersonalTokenField) && (\n <StackItem>\n <Form>\n {showCredentialRadios && (\n <FormGroup\n role=\"radiogroup\"\n id=\"mcp-credential-mode\"\n fieldId=\"mcp-credential-mode\"\n label={t('mcp.settings.modal.authenticationHeading')}\n >\n <Stack hasGutter>\n <StackItem>\n <Radio\n id=\"mcp-credential-organization\"\n name=\"mcp-credential-mode\"\n label={t(\n 'mcp.settings.modal.credentialMode.organization',\n )}\n isChecked={modalCredentialMode === 'organization'}\n onChange={() =>\n onCredentialModeChange('organization')\n }\n />\n <Typography\n component=\"div\"\n className=\"pf-v6-u-ml-xl pf-v6-u-mt-xs\"\n sx={credentialRadioDescriptionSx}\n >\n {t(\n 'mcp.settings.modal.credentialMode.organizationDescription',\n )}\n </Typography>\n </StackItem>\n <StackItem>\n <Radio\n id=\"mcp-credential-personal\"\n name=\"mcp-credential-mode\"\n label={t(\n 'mcp.settings.modal.credentialMode.personal',\n )}\n isChecked={modalCredentialMode === 'personal'}\n onChange={() => onCredentialModeChange('personal')}\n />\n </StackItem>\n </Stack>\n </FormGroup>\n )}\n {showPersonalTokenField && (\n <FormGroup\n label={t('mcp.settings.authenticationToken')}\n fieldId=\"mcp-pat-input\"\n >\n <TextInputGroup validated={tokenInputValidated}>\n <TextInputGroupMain\n inputId=\"mcp-pat-input\"\n type=\"password\"\n value={tokenInputValue}\n onChange={(_event, value) => onTokenInputChange(value)}\n />\n {(tokenValidationState === 'idle' ||\n tokenValidationState === 'validating') && (\n <TextInputGroupUtilities>\n <Button\n variant=\"plain\"\n onClick={clearTokenInput}\n aria-label={t('mcp.settings.token.clearAriaLabel')}\n icon={<TimesIcon />}\n />\n </TextInputGroupUtilities>\n )}\n </TextInputGroup>\n {showTokenHelperText && (\n <FormHelperText>\n <HelperText>\n <HelperTextItem variant={tokenHelperVariant}>\n {tokenHelperText}\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n )}\n </FormGroup>\n )}\n </Form>\n </StackItem>\n )}\n </Stack>\n </ModalBody>\n <ModalFooter>\n <Button\n variant=\"primary\"\n onClick={() => void save()}\n isDisabled={\n isConfigureModalSaving ||\n tokenValidationState === 'validating' ||\n isSaveTokenButtonDisabled ||\n isUpdatingModalStatus\n }\n >\n {t('modal.save')}\n </Button>\n {canRemovePersonalToken && (\n <RemovePersonalTokenButton\n variant=\"secondary\"\n isDanger\n onClick={() => void removePersonalToken()}\n isDisabled={\n isConfigureModalSaving ||\n tokenValidationState === 'validating' ||\n isUpdatingModalStatus ||\n hasRemovedPersonalToken ||\n !hasSavedTokenInModal\n }\n >\n {t('mcp.settings.removePersonalToken')}\n </RemovePersonalTokenButton>\n )}\n <Button variant=\"link\" onClick={close}>\n {t('common.cancel')}\n </Button>\n </ModalFooter>\n </StyledModal>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAuDA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAK,CAAA,CAAE;AAAA,EAChC,0DAAA,EAA4D;AAAA,IAC1D,OAAA,EAAS;AAAA,GACX;AAAA,EACA,wDAAA,EAA0D;AAAA,IACxD,UAAA,EAAY;AAAA,GACd;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,QAAA,EAAU,UAAA;AAAA,IACV,eAAA,EAAiB,0DAAA;AAAA,IACjB,cAAA,EAAgB,yDAAA;AAAA,IAChB,MAAA,EAAQ;AAAA;AAEZ,CAAC,CAAA;AAED,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAK,CAAA,CAAE;AAAA,EACnC,wCAAA,EACE,mDAAA;AAAA,EACF,wCAAA,EACE,mDAAA;AAAA,EACF,wBAAA,EAA0B;AAAA,IACxB,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,YAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,YAAA;AAAA,IACX,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,UAAA;AAAA,IACnB,aAAA,EAAe,iCAAA;AAAA,IACf,eAAA,EAAiB;AAAA;AAErB,CAAC,CAAA;AAED,MAAM,cAAA,GAAiB;AAAA,EACrB,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEA,MAAM,oBAAA,GAAuB;AAAA,EAC3B,KAAA,EAAO,0CAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,MAAM,4BAAA,GAA+B;AAAA,EACnC,KAAA,EAAO,0CAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,MAAM,YAAA,GAAe,MAAA,CAAO,eAAe,CAAA,CAAE;AAAA,EAC3C,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,cAAA,GAAiB,MAAA,CAAO,qBAAqB,CAAA,CAAE;AAAA,EACnD,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,kBAAA,GAAqB,MAAA,CAAO,cAAc,CAAA,CAAE;AAAA,EAChD,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,iBAAA,GAAoB,MAAA,CAAO,OAAO,CAAA,CAAE;AAAA,EACxC,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,yBAAA,GAA4B,MAAA,CAAO,MAAM,CAAA,CAAE;AAAA,EAC/C,YAAA,EAAc,SAAA;AAAA,EACd,SAAA,EAAW;AACb,CAAC,CAAA;AAIM,MAAM,0BAA0B,CAAC;AAAA,EACtC,MAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,yBAAyB,mBAAA,EAAqB;AAChD,MAAA,uBACE,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,cACE,qBAAA,GACI,CAAA,CAAE,kCAAkC,CAAA,GACpC,EAAE,mCAAmC;AAAA;AAAA,OAE7C;AAAA,IAEJ;AACA,IAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,MAAA,2BAAQ,kBAAA,EAAA,EAAmB,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,uBAAuB,eAAA,EAAiB;AAC1C,MAAA,2BAAQ,iBAAA,EAAA,EAAkB,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,kBAAA,KAAuB,IAAA,IAAQ,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACxD,MAAA,2BAAQ,YAAA,EAAA,EAAa,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,eAAA,IAAmB,uBAAuB,QAAA,EAAU;AACtD,MAAA,2BAAQ,cAAA,EAAA,EAAe,CAAA;AAAA,IACzB;AACA,IAAA,2BAAQ,kBAAA,EAAA,EAAmB,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,2BACG,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAK,YAAA,EAAY,CAAA,CAAE,iCAAiC,CAAA,EAAG,CAAA;AAAA,IAEzE;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,uBACE,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAO,IAAA;AAAA,UACP,YAAA,EAAY,EAAE,iCAAA,EAA0C;AAAA,YACtD,KAAA,EAAO,OAAO,cAAc;AAAA,WAC7B,CAAA;AAAA,UAEA,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAA,QAAA,qBACd,GAAA,CAAC,QAAA,EAAA,EAAwB,IAAA,kBAAM,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA,EAC1C,QAAA,EAAA,QAAA,EAAA,EADY,QAEf,CACD;AAAA;AAAA,OACH;AAAA,IAEJ;AACA,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,KAAA;AAAA,QACV,SAAA,EAAU,eAAA;AAAA,QACV,EAAA,EAAI,oBAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,aAAA,mBACJ,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,8BAAA;AAAA,MACH,YAAA,EAAY,EAAE,oCAAA,EAA6C;AAAA,QACzD,UAAA,EAAY,eAAe,IAAA,IAAQ;AAAA,OACpC,CAAA;AAAA,MACD,SAAA,EAAW,qBAAA;AAAA,MACX,UAAA,EAAY,4BAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AAAA,GACZ;AAGF,EAAA,uBACE,IAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAO,GAAA;AAAA,MACP,MAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,iBAAA,EAAgB,qBAAA;AAAA,MAChB,kBAAA,EAAiB,0BAAA;AAAA,MAEjB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,mBAAA;AAAA,YACP,OAAA,EAAQ,qBAAA;AAAA,YACR,YAAA,EAAa;AAAA;AAAA,SACf;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,sBAAO,SAAA,EAAA,EAAU,CAAA;AAAA,YACjB,YAAA,EAAY,EAAE,2CAA2C,CAAA;AAAA,YACzD,OAAA,EAAS;AAAA;AAAA,SACX;AAAA,4BACC,SAAA,EAAA,EAAU,EAAA,EAAG,4BACZ,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,WAAS,IAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,QAAA;AAAA,cACR,UAAA,sBAAa,cAAA,EAAA,EAAe,CAAA;AAAA,cAC5B,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,cACxC,QAAA,EAAQ;AAAA;AAAA,WACV,EACF,CAAA;AAAA,UACC,aAAA,EAAe,IAAA,KAAS,KAAA,oBACvB,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,QAAA;AAAA,cACR,UAAA,sBAAa,cAAA,EAAA,EAAe,CAAA;AAAA,cAC5B,KAAA,EAAO,EAAE,kCAAkC,CAAA;AAAA,cAC3C,QAAA,EAAQ;AAAA;AAAA,WACV,EACF,CAAA;AAAA,UAED,uBAAA,IAA2B,CAAC,aAAA,EAAe,WAAA,wBACzC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,QAAA;AAAA,cACR,UAAA,sBAAa,cAAA,EAAA,EAAe,CAAA;AAAA,cAC5B,KAAA,EAAO,EAAE,wCAAwC,CAAA;AAAA,cACjD,QAAA,EAAQ;AAAA;AAAA,WACV,EACF,CAAA;AAAA,+BAED,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,KAAA;AAAA,gBACV,EAAA,EAAI,cAAA;AAAA,gBACJ,SAAA,EAAU,eAAA;AAAA,gBAET,YAAE,qBAAqB;AAAA;AAAA,aAC1B;AAAA,4BACA,IAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,UAAA,EAAY,EAAE,OAAA,EAAS,kBAAA,EAAmB;AAAA,gBAC1C,UAAA,EAAY,EAAE,OAAA,EAAS,cAAA,EAAe;AAAA,gBAEtC,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,QAAA,EAAA,EAAU,4BAAiB,EAAE,CAAA;AAAA,sCAC7B,QAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAW,SAAA,EAAU,MAAA,EAAQ,2BAAgB,CAAA,EAChD;AAAA;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,UACC,qBAAA,IAAyB,kBAAA,KAAuB,IAAA,oBAC/C,IAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,KAAA;AAAA,gBACV,SAAA,EAAU,eAAA;AAAA,gBACV,EAAA,EAAI,cAAA;AAAA,gBAEH,YAAE,iCAAA,EAA0C;AAAA,kBAC3C,KAAA,EAAO,OAAO,cAAc;AAAA,iBAC7B;AAAA;AAAA,aACH;AAAA,YACC,kBAAA;AAAmB,WAAA,EACtB,CAAA;AAAA,8BAED,SAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,cAAA,EAAgB,EAAE,OAAA,EAAS,4BAAA,EAA6B;AAAA,cACxD,UAAA,EAAY,EAAE,OAAA,EAAS,qBAAA,EAAsB;AAAA,cAC7C,UAAA,EAAY,EAAE,OAAA,EAAS,cAAA,EAAe;AAAA,cAEtC,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,EAAE,OAAA,EAAS,UAAS,EAClC,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,KAAA;AAAA,sBACV,SAAA,EAAU,eAAA;AAAA,sBACV,EAAA,EAAI,cAAA;AAAA,sBAEH,YAAE,sBAAsB;AAAA;AAAA,mBAC3B;AAAA,kCACA,GAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,KAAA;AAAA,sBACV,SAAA,EAAU,eAAA;AAAA,sBACV,EAAA,EAAI,oBAAA;AAAA,sBAEH,QAAA,EAAA;AAAA;AAAA;AACH,iBAAA,EACF,CAAA;AAAA,gCACA,GAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA,4BAAA,mBACC,GAAA,CAAC,WAAQ,OAAA,EAAS,iBAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EAAQ,QAAA,EAAA,aAAA,EAAc,CAAA,EAC9C,IAEA,aAAA,EAEJ;AAAA;AAAA;AAAA,WACF,EACF,CAAA;AAAA,UAAA,CACE,oBAAA,IAAwB,sBAAA,qBACxB,GAAA,CAAC,SAAA,EAAA,EACC,+BAAC,IAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,oBAAA,oBACC,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,YAAA;AAAA,gBACL,EAAA,EAAG,qBAAA;AAAA,gBACH,OAAA,EAAQ,qBAAA;AAAA,gBACR,KAAA,EAAO,EAAE,0CAA0C,CAAA;AAAA,gBAEnD,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAS,IAAA,EACd,QAAA,EAAA;AAAA,kCAAA,IAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,EAAA,EAAG,6BAAA;AAAA,wBACH,IAAA,EAAK,qBAAA;AAAA,wBACL,KAAA,EAAO,CAAA;AAAA,0BACL;AAAA,yBACF;AAAA,wBACA,WAAW,mBAAA,KAAwB,cAAA;AAAA,wBACnC,QAAA,EAAU,MACR,sBAAA,CAAuB,cAAc;AAAA;AAAA,qBAEzC;AAAA,oCACA,GAAA;AAAA,sBAAC,UAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,KAAA;AAAA,wBACV,SAAA,EAAU,6BAAA;AAAA,wBACV,EAAA,EAAI,4BAAA;AAAA,wBAEH,QAAA,EAAA,CAAA;AAAA,0BACC;AAAA;AACF;AAAA;AACF,mBAAA,EACF,CAAA;AAAA,sCACC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,EAAA,EAAG,yBAAA;AAAA,sBACH,IAAA,EAAK,qBAAA;AAAA,sBACL,KAAA,EAAO,CAAA;AAAA,wBACL;AAAA,uBACF;AAAA,sBACA,WAAW,mBAAA,KAAwB,UAAA;AAAA,sBACnC,QAAA,EAAU,MAAM,sBAAA,CAAuB,UAAU;AAAA;AAAA,mBACnD,EACF;AAAA,iBAAA,EACF;AAAA;AAAA,aACF;AAAA,YAED,sBAAA,oBACC,IAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,EAAE,kCAAkC,CAAA;AAAA,gBAC3C,OAAA,EAAQ,eAAA;AAAA,gBAER,QAAA,EAAA;AAAA,kCAAA,IAAA,CAAC,cAAA,EAAA,EAAe,WAAW,mBAAA,EACzB,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,kBAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,eAAA;AAAA,wBACR,IAAA,EAAK,UAAA;AAAA,wBACL,KAAA,EAAO,eAAA;AAAA,wBACP,QAAA,EAAU,CAAC,MAAA,EAAQ,KAAA,KAAU,mBAAmB,KAAK;AAAA;AAAA,qBACvD;AAAA,oBAAA,CACE,oBAAA,KAAyB,MAAA,IACzB,oBAAA,KAAyB,YAAA,yBACxB,uBAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,OAAA;AAAA,wBACR,OAAA,EAAS,eAAA;AAAA,wBACT,YAAA,EAAY,EAAE,mCAAmC,CAAA;AAAA,wBACjD,IAAA,sBAAO,SAAA,EAAA,EAAU;AAAA;AAAA,qBACnB,EACF;AAAA,mBAAA,EAEJ,CAAA;AAAA,kBACC,mBAAA,oBACC,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAS,kBAAA,EACtB,QAAA,EAAA,eAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA;AAEJ,WAAA,EAEJ,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA,EACF,CAAA;AAAA,6BACC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK;AAAA,cACzB,UAAA,EACE,sBAAA,IACA,oBAAA,KAAyB,YAAA,IACzB,yBAAA,IACA,qBAAA;AAAA,cAGD,YAAE,YAAY;AAAA;AAAA,WACjB;AAAA,UACC,sBAAA,oBACC,GAAA;AAAA,YAAC,yBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAQ,IAAA;AAAA,cACR,OAAA,EAAS,MAAM,KAAK,mBAAA,EAAoB;AAAA,cACxC,YACE,sBAAA,IACA,oBAAA,KAAyB,YAAA,IACzB,qBAAA,IACA,2BACA,CAAC,oBAAA;AAAA,cAGF,YAAE,kCAAkC;AAAA;AAAA,WACvC;AAAA,0BAEF,GAAA,CAAC,UAAO,OAAA,EAAQ,MAAA,EAAO,SAAS,KAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useCallback, useEffect } from 'react';
|
|
3
3
|
import { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';
|
|
4
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
5
4
|
import GlobalStyles from '@mui/material/GlobalStyles';
|
|
6
5
|
import { styled } from '@mui/material/styles';
|
|
7
6
|
import Typography from '@mui/material/Typography';
|
|
8
|
-
import { Title,
|
|
9
|
-
import {
|
|
7
|
+
import { Title, Alert, Button, Switch, Tooltip } from '@patternfly/react-core';
|
|
8
|
+
import { PencilAltIcon, SortAmountDownIcon, KeyIcon, InfoCircleIcon, ExclamationCircleIcon, CheckCircleIcon, SortAmountUpIcon } from '@patternfly/react-icons';
|
|
10
9
|
import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
|
|
11
|
-
import {
|
|
10
|
+
import { useIaMcpToolsPermission } from '../hooks/useIaMcpToolsPermission.esm.js';
|
|
12
11
|
import { useMcpConfigureModal } from '../hooks/useMcpConfigureModal.esm.js';
|
|
13
12
|
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
14
13
|
import { McpConfigureServerModal } from './McpConfigureServerModal.esm.js';
|
|
@@ -205,16 +204,12 @@ const toUiServer = (server, validationError) => ({
|
|
|
205
204
|
auth: server.auth
|
|
206
205
|
});
|
|
207
206
|
const McpServersSettings = ({
|
|
208
|
-
onClose,
|
|
209
207
|
backgroundColor
|
|
210
208
|
}) => {
|
|
211
209
|
const { t } = useTranslation();
|
|
212
210
|
const configApi = useApi(configApiRef);
|
|
213
211
|
const fetchApi = useApi(fetchApiRef);
|
|
214
|
-
const
|
|
215
|
-
permission: iaMcpToolsPermission
|
|
216
|
-
});
|
|
217
|
-
const canManageMcp = mcpToolsPermission.allowed;
|
|
212
|
+
const { allowed: hasMcpToolsAccess, loading: mcpToolsPermissionLoading } = useIaMcpToolsPermission();
|
|
218
213
|
const [servers, setServers] = useState([]);
|
|
219
214
|
const [sortColumn, setSortColumn] = useState("name");
|
|
220
215
|
const [sortAsc, setSortAsc] = useState(true);
|
|
@@ -303,20 +298,18 @@ const McpServersSettings = ({
|
|
|
303
298
|
);
|
|
304
299
|
const uiServers = (data.servers ?? []).map((server) => toUiServer(server));
|
|
305
300
|
setServers(uiServers);
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
);
|
|
319
|
-
}
|
|
301
|
+
const serversToValidate = uiServers.filter((server) => server.hasToken);
|
|
302
|
+
void Promise.allSettled(
|
|
303
|
+
serversToValidate.map(async (server) => {
|
|
304
|
+
try {
|
|
305
|
+
await validateServer(server.name);
|
|
306
|
+
} catch (validationError) {
|
|
307
|
+
setError(
|
|
308
|
+
(prev) => prev ?? (validationError instanceof Error ? validationError.message : `Failed to validate ${server.name}`)
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
);
|
|
320
313
|
} catch (e) {
|
|
321
314
|
setError(
|
|
322
315
|
e instanceof Error ? e.message : "Failed to load MCP server settings"
|
|
@@ -324,15 +317,15 @@ const McpServersSettings = ({
|
|
|
324
317
|
} finally {
|
|
325
318
|
setIsLoading(false);
|
|
326
319
|
}
|
|
327
|
-
}, [
|
|
320
|
+
}, [fetchJson, getBaseUrl, validateServer]);
|
|
328
321
|
useEffect(() => {
|
|
322
|
+
if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
329
325
|
loadServers();
|
|
330
|
-
}, [loadServers]);
|
|
326
|
+
}, [loadServers, mcpToolsPermissionLoading, hasMcpToolsAccess]);
|
|
331
327
|
const patchServer = useCallback(
|
|
332
328
|
async (serverName, body) => {
|
|
333
|
-
if (!canManageMcp) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
329
|
setError(null);
|
|
337
330
|
setIsSaving((prev) => ({ ...prev, [serverName]: true }));
|
|
338
331
|
try {
|
|
@@ -362,11 +355,10 @@ const McpServersSettings = ({
|
|
|
362
355
|
setIsSaving((prev) => ({ ...prev, [serverName]: false }));
|
|
363
356
|
}
|
|
364
357
|
},
|
|
365
|
-
[
|
|
358
|
+
[fetchJson, getBaseUrl, loadServers]
|
|
366
359
|
);
|
|
367
360
|
const configureModal = useMcpConfigureModal({
|
|
368
361
|
servers,
|
|
369
|
-
canManageMcp,
|
|
370
362
|
isSaving,
|
|
371
363
|
patchServer,
|
|
372
364
|
validateServer,
|
|
@@ -402,6 +394,9 @@ const McpServersSettings = ({
|
|
|
402
394
|
}
|
|
403
395
|
);
|
|
404
396
|
};
|
|
397
|
+
if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
405
400
|
return /* @__PURE__ */ jsxs(StyledMcpRoot, { style: backgroundColor ? { backgroundColor } : void 0, children: [
|
|
406
401
|
/* @__PURE__ */ jsx(
|
|
407
402
|
GlobalStyles,
|
|
@@ -416,25 +411,13 @@ const McpServersSettings = ({
|
|
|
416
411
|
}
|
|
417
412
|
}
|
|
418
413
|
),
|
|
419
|
-
/* @__PURE__ */
|
|
420
|
-
/* @__PURE__ */
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
] }),
|
|
427
|
-
/* @__PURE__ */ jsx(
|
|
428
|
-
Button,
|
|
429
|
-
{
|
|
430
|
-
"aria-label": t("mcp.settings.closeAriaLabel"),
|
|
431
|
-
icon: /* @__PURE__ */ jsx(TimesIcon, {}),
|
|
432
|
-
variant: "plain",
|
|
433
|
-
className: mcpClasses.closeButton,
|
|
434
|
-
onClick: onClose
|
|
435
|
-
}
|
|
436
|
-
)
|
|
437
|
-
] }),
|
|
414
|
+
/* @__PURE__ */ jsx("div", { className: mcpClasses.headerRow, children: /* @__PURE__ */ jsxs("div", { children: [
|
|
415
|
+
/* @__PURE__ */ jsx(Title, { headingLevel: "h2", size: "xl", className: mcpClasses.title, children: t("mcp.settings.title") }),
|
|
416
|
+
/* @__PURE__ */ jsx("div", { className: mcpClasses.selectedCount, children: t("mcp.settings.selectedCount", {
|
|
417
|
+
selectedCount: String(selectedCount),
|
|
418
|
+
totalCount: String(servers.length)
|
|
419
|
+
}) })
|
|
420
|
+
] }) }),
|
|
438
421
|
error && /* @__PURE__ */ jsx(
|
|
439
422
|
Alert,
|
|
440
423
|
{
|
|
@@ -444,15 +427,6 @@ const McpServersSettings = ({
|
|
|
444
427
|
className: mcpClasses.alert
|
|
445
428
|
}
|
|
446
429
|
),
|
|
447
|
-
!mcpToolsPermission.loading && !canManageMcp && /* @__PURE__ */ jsx(
|
|
448
|
-
Alert,
|
|
449
|
-
{
|
|
450
|
-
variant: "info",
|
|
451
|
-
isInline: true,
|
|
452
|
-
title: t("mcp.settings.readOnlyAccess"),
|
|
453
|
-
className: mcpClasses.alert
|
|
454
|
-
}
|
|
455
|
-
),
|
|
456
430
|
/* @__PURE__ */ jsxs(
|
|
457
431
|
Table,
|
|
458
432
|
{
|
|
@@ -520,7 +494,7 @@ const McpServersSettings = ({
|
|
|
520
494
|
displayStatus
|
|
521
495
|
);
|
|
522
496
|
const isRowSaving = Boolean(isSaving[server.name]);
|
|
523
|
-
const isToggleDisabled = isUnavailable || isRowSaving
|
|
497
|
+
const isToggleDisabled = isUnavailable || isRowSaving;
|
|
524
498
|
const switchControl = /* @__PURE__ */ jsx(
|
|
525
499
|
Switch,
|
|
526
500
|
{
|
|
@@ -587,7 +561,6 @@ const McpServersSettings = ({
|
|
|
587
561
|
icon: /* @__PURE__ */ jsx(PencilAltIcon, {}),
|
|
588
562
|
variant: "plain",
|
|
589
563
|
className: mcpClasses.actionButton,
|
|
590
|
-
isDisabled: !canManageMcp,
|
|
591
564
|
onClick: () => configureModal.open(server)
|
|
592
565
|
}
|
|
593
566
|
) })
|
|
@@ -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 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 { 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 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 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 ? mcpClasses.sortHeaderIconActive\n : mcpClasses.sortHeaderIconInactive\n }\n />\n );\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 {!mcpToolsPermission.loading && !canManageMcp && (\n <Alert\n variant=\"info\"\n isInline\n title={t('mcp.settings.readOnlyAccess')}\n className={mcpClasses.alert}\n />\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 =\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={`${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 isDisabled={!canManageMcp}\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
|
+
{"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} 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 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 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 </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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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Tooltip, Content, ContentVariants } from '@patternfly/react-core';
|
|
3
|
+
import { makeStyles } from 'tss-react/mui';
|
|
4
|
+
import { SavedPromptKebabMenu } from './SavedPromptKebabMenu.esm.js';
|
|
5
|
+
|
|
6
|
+
const useStyles = makeStyles()((theme) => ({
|
|
7
|
+
card: {
|
|
8
|
+
padding: `${theme.spacing(1.5)} 0`
|
|
9
|
+
},
|
|
10
|
+
cardDivider: {
|
|
11
|
+
borderBottom: "1px solid var(--pf-t--global--border--color--default)"
|
|
12
|
+
},
|
|
13
|
+
row: {
|
|
14
|
+
display: "flex",
|
|
15
|
+
alignItems: "flex-start"
|
|
16
|
+
},
|
|
17
|
+
content: {
|
|
18
|
+
flex: "1 1 0%",
|
|
19
|
+
minWidth: 0
|
|
20
|
+
},
|
|
21
|
+
title: {
|
|
22
|
+
display: "block",
|
|
23
|
+
minWidth: 0,
|
|
24
|
+
maxWidth: "100%",
|
|
25
|
+
margin: 0,
|
|
26
|
+
marginBottom: theme.spacing(0.5),
|
|
27
|
+
fontWeight: 600,
|
|
28
|
+
overflow: "hidden",
|
|
29
|
+
textOverflow: "ellipsis",
|
|
30
|
+
whiteSpace: "nowrap"
|
|
31
|
+
},
|
|
32
|
+
body: {
|
|
33
|
+
margin: 0,
|
|
34
|
+
marginBottom: theme.spacing(0.5),
|
|
35
|
+
color: "var(--pf-t--global--text--color--subtle) !important",
|
|
36
|
+
overflow: "hidden",
|
|
37
|
+
textOverflow: "ellipsis",
|
|
38
|
+
display: "-webkit-box",
|
|
39
|
+
WebkitLineClamp: 2,
|
|
40
|
+
WebkitBoxOrient: "vertical"
|
|
41
|
+
},
|
|
42
|
+
date: {
|
|
43
|
+
margin: 0,
|
|
44
|
+
color: "var(--pf-t--global--text--color--disabled) !important"
|
|
45
|
+
},
|
|
46
|
+
actions: {
|
|
47
|
+
flexShrink: 0
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
const formatSavedDate = (isoDate) => {
|
|
51
|
+
const date = new Date(isoDate);
|
|
52
|
+
if (Number.isNaN(date.getTime())) {
|
|
53
|
+
return isoDate;
|
|
54
|
+
}
|
|
55
|
+
return date.toLocaleDateString(void 0, {
|
|
56
|
+
month: "numeric",
|
|
57
|
+
day: "numeric",
|
|
58
|
+
year: "numeric"
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const SavedPromptCard = ({
|
|
62
|
+
prompt,
|
|
63
|
+
variant,
|
|
64
|
+
showDivider = false,
|
|
65
|
+
onApplyToInput,
|
|
66
|
+
onSendDirectly,
|
|
67
|
+
onDelete,
|
|
68
|
+
isSendDirectlyDisabled
|
|
69
|
+
}) => {
|
|
70
|
+
const { classes, cx } = useStyles();
|
|
71
|
+
return /* @__PURE__ */ jsx(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
className: cx(classes.card, showDivider && classes.cardDivider),
|
|
75
|
+
"data-testid": `saved-prompt-card-${prompt.id}`,
|
|
76
|
+
"data-has-divider": showDivider ? "true" : "false",
|
|
77
|
+
children: /* @__PURE__ */ jsxs("div", { className: classes.row, children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("div", { className: classes.content, children: [
|
|
79
|
+
/* @__PURE__ */ jsx(Tooltip, { content: prompt.name, children: /* @__PURE__ */ jsx("span", { className: classes.title, children: prompt.name }) }),
|
|
80
|
+
/* @__PURE__ */ jsx(Tooltip, { content: prompt.content, children: /* @__PURE__ */ jsx(Content, { component: ContentVariants.p, className: classes.body, children: prompt.content }) }),
|
|
81
|
+
/* @__PURE__ */ jsx(Content, { component: ContentVariants.small, className: classes.date, children: formatSavedDate(prompt.created_at) })
|
|
82
|
+
] }),
|
|
83
|
+
/* @__PURE__ */ jsx("div", { className: classes.actions, children: /* @__PURE__ */ jsx(
|
|
84
|
+
SavedPromptKebabMenu,
|
|
85
|
+
{
|
|
86
|
+
prompt,
|
|
87
|
+
variant,
|
|
88
|
+
onApplyToInput,
|
|
89
|
+
onSendDirectly,
|
|
90
|
+
onDelete,
|
|
91
|
+
isSendDirectlyDisabled
|
|
92
|
+
}
|
|
93
|
+
) })
|
|
94
|
+
] })
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export { SavedPromptCard };
|
|
100
|
+
//# sourceMappingURL=SavedPromptCard.esm.js.map
|