@red-hat-developer-hub/backstage-plugin-intelligent-assistant 5.0.2 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/alpha.d.ts +0 -7
- package/dist/components/LightSpeedChat.esm.js +100 -67
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +2 -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/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 +24 -38
- package/dist/components/McpServersSettings.esm.js.map +1 -1
- package/dist/hooks/useAllModels.esm.js +2 -1
- package/dist/hooks/useAllModels.esm.js.map +1 -1
- package/dist/hooks/useConversations.esm.js +2 -1
- package/dist/hooks/useConversations.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/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/useWelcomePrompts.esm.js +2 -2
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/translations/de.esm.js +0 -7
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +0 -7
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +0 -7
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/it.esm.js +0 -7
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js +0 -7
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js +0 -8
- package/dist/translations/ref.esm.js.map +1 -1
- package/package.json +3 -2
- 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,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
7
|
import { Title, Button, Alert, Switch, Tooltip } from '@patternfly/react-core';
|
|
9
8
|
import { TimesIcon, 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';
|
|
@@ -211,10 +210,7 @@ const McpServersSettings = ({
|
|
|
211
210
|
const { t } = useTranslation();
|
|
212
211
|
const configApi = useApi(configApiRef);
|
|
213
212
|
const fetchApi = useApi(fetchApiRef);
|
|
214
|
-
const
|
|
215
|
-
permission: iaMcpToolsPermission
|
|
216
|
-
});
|
|
217
|
-
const canManageMcp = mcpToolsPermission.allowed;
|
|
213
|
+
const { allowed: hasMcpToolsAccess, loading: mcpToolsPermissionLoading } = useIaMcpToolsPermission();
|
|
218
214
|
const [servers, setServers] = useState([]);
|
|
219
215
|
const [sortColumn, setSortColumn] = useState("name");
|
|
220
216
|
const [sortAsc, setSortAsc] = useState(true);
|
|
@@ -303,20 +299,18 @@ const McpServersSettings = ({
|
|
|
303
299
|
);
|
|
304
300
|
const uiServers = (data.servers ?? []).map((server) => toUiServer(server));
|
|
305
301
|
setServers(uiServers);
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
);
|
|
319
|
-
}
|
|
302
|
+
const serversToValidate = uiServers.filter((server) => server.hasToken);
|
|
303
|
+
void Promise.allSettled(
|
|
304
|
+
serversToValidate.map(async (server) => {
|
|
305
|
+
try {
|
|
306
|
+
await validateServer(server.name);
|
|
307
|
+
} catch (validationError) {
|
|
308
|
+
setError(
|
|
309
|
+
(prev) => prev ?? (validationError instanceof Error ? validationError.message : `Failed to validate ${server.name}`)
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
})
|
|
313
|
+
);
|
|
320
314
|
} catch (e) {
|
|
321
315
|
setError(
|
|
322
316
|
e instanceof Error ? e.message : "Failed to load MCP server settings"
|
|
@@ -324,15 +318,15 @@ const McpServersSettings = ({
|
|
|
324
318
|
} finally {
|
|
325
319
|
setIsLoading(false);
|
|
326
320
|
}
|
|
327
|
-
}, [
|
|
321
|
+
}, [fetchJson, getBaseUrl, validateServer]);
|
|
328
322
|
useEffect(() => {
|
|
323
|
+
if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
329
326
|
loadServers();
|
|
330
|
-
}, [loadServers]);
|
|
327
|
+
}, [loadServers, mcpToolsPermissionLoading, hasMcpToolsAccess]);
|
|
331
328
|
const patchServer = useCallback(
|
|
332
329
|
async (serverName, body) => {
|
|
333
|
-
if (!canManageMcp) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
330
|
setError(null);
|
|
337
331
|
setIsSaving((prev) => ({ ...prev, [serverName]: true }));
|
|
338
332
|
try {
|
|
@@ -362,11 +356,10 @@ const McpServersSettings = ({
|
|
|
362
356
|
setIsSaving((prev) => ({ ...prev, [serverName]: false }));
|
|
363
357
|
}
|
|
364
358
|
},
|
|
365
|
-
[
|
|
359
|
+
[fetchJson, getBaseUrl, loadServers]
|
|
366
360
|
);
|
|
367
361
|
const configureModal = useMcpConfigureModal({
|
|
368
362
|
servers,
|
|
369
|
-
canManageMcp,
|
|
370
363
|
isSaving,
|
|
371
364
|
patchServer,
|
|
372
365
|
validateServer,
|
|
@@ -402,6 +395,9 @@ const McpServersSettings = ({
|
|
|
402
395
|
}
|
|
403
396
|
);
|
|
404
397
|
};
|
|
398
|
+
if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
405
401
|
return /* @__PURE__ */ jsxs(StyledMcpRoot, { style: backgroundColor ? { backgroundColor } : void 0, children: [
|
|
406
402
|
/* @__PURE__ */ jsx(
|
|
407
403
|
GlobalStyles,
|
|
@@ -444,15 +440,6 @@ const McpServersSettings = ({
|
|
|
444
440
|
className: mcpClasses.alert
|
|
445
441
|
}
|
|
446
442
|
),
|
|
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
443
|
/* @__PURE__ */ jsxs(
|
|
457
444
|
Table,
|
|
458
445
|
{
|
|
@@ -520,7 +507,7 @@ const McpServersSettings = ({
|
|
|
520
507
|
displayStatus
|
|
521
508
|
);
|
|
522
509
|
const isRowSaving = Boolean(isSaving[server.name]);
|
|
523
|
-
const isToggleDisabled = isUnavailable || isRowSaving
|
|
510
|
+
const isToggleDisabled = isUnavailable || isRowSaving;
|
|
524
511
|
const switchControl = /* @__PURE__ */ jsx(
|
|
525
512
|
Switch,
|
|
526
513
|
{
|
|
@@ -587,7 +574,6 @@ const McpServersSettings = ({
|
|
|
587
574
|
icon: /* @__PURE__ */ jsx(PencilAltIcon, {}),
|
|
588
575
|
variant: "plain",
|
|
589
576
|
className: mcpClasses.actionButton,
|
|
590
|
-
isDisabled: !canManageMcp,
|
|
591
577
|
onClick: () => configureModal.open(server)
|
|
592
578
|
}
|
|
593
579
|
) })
|
|
@@ -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 TimesIcon,\n} from '@patternfly/react-icons';\nimport { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';\n\nimport { useIaMcpToolsPermission } from '../hooks/useIaMcpToolsPermission';\nimport { useMcpConfigureModal } from '../hooks/useMcpConfigureModal';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpConfigureServerModal } from './McpConfigureServerModal';\nimport {\n compareMcpServers,\n formatApiError,\n getDisplayDetail,\n getDisplayStatus,\n getEnabledToggleChecked,\n isEnabledToggleUnavailable,\n type McpConfigureServer,\n type McpServerSortColumn,\n type ServerStatus,\n} from './mcpServersDisplayUtils';\n\ntype McpServer = McpConfigureServer;\n\ntype McpServersSettingsProps = {\n onClose: () => void;\n backgroundColor?: string;\n};\n\nconst mcpClasses = {\n headerRow: 'ia-mcp-headerRow',\n selectedCount: 'ia-mcp-selectedCount',\n title: 'ia-mcp-title',\n closeButton: 'ia-mcp-closeButton',\n nameHeaderButton: 'ia-mcp-nameHeaderButton',\n statusHeaderButton: 'ia-mcp-statusHeaderButton',\n sortHeaderIconActive: 'ia-mcp-sortHeaderIconActive',\n sortHeaderIconInactive: 'ia-mcp-sortHeaderIconInactive',\n nameHeaderText: 'ia-mcp-nameHeaderText',\n nameCell: 'ia-mcp-nameCell',\n statusHeader: 'ia-mcp-statusHeader',\n statusColumnCell: 'ia-mcp-statusColumnCell',\n rowName: 'ia-mcp-rowName',\n nameValue: 'ia-mcp-nameValue',\n statusCell: 'ia-mcp-statusCell',\n statusValue: 'ia-mcp-statusValue',\n statusOk: 'ia-mcp-statusOk',\n statusWarn: 'ia-mcp-statusWarn',\n statusDisabled: 'ia-mcp-statusDisabled',\n actionButton: 'ia-mcp-actionButton',\n tableRow: 'ia-mcp-tableRow',\n toggleCell: 'ia-mcp-toggleCell',\n table: 'ia-mcp-table',\n alert: 'ia-mcp-alert',\n} as const;\n\nconst StyledMcpRoot = styled('div')(({ theme }) => ({\n padding: 0,\n height: '100%',\n minHeight: 0,\n flex: 1,\n width: '100%',\n overflow: 'auto',\n [`& .${mcpClasses.headerRow}`]: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(2),\n },\n [`& .${mcpClasses.selectedCount}`]: {\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n fontSize: '0.75rem',\n },\n [`& .${mcpClasses.title}`]: {\n fontSize: '1.125rem',\n },\n [`& .${mcpClasses.closeButton}`]: {\n marginTop: theme.spacing(-1),\n marginRight: theme.spacing(-1),\n color: theme.palette.text.primary,\n },\n [`& .${mcpClasses.nameHeaderButton}`]: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\n marginLeft: '-0.85rem',\n fontWeight: 600,\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n minHeight: 'auto',\n color: theme.palette.text.primary,\n textDecoration: 'none !important',\n display: 'inline-flex',\n alignItems: 'center',\n },\n [`& .${mcpClasses.statusHeaderButton}`]: {\n paddingLeft: 0,\n paddingTop: 0,\n paddingBottom: 0,\n fontWeight: 600,\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n minHeight: 'auto',\n color: theme.palette.text.primary,\n textDecoration: 'none !important',\n display: 'inline-flex',\n alignItems: 'center',\n },\n [`& .${mcpClasses.sortHeaderIconActive}`]: {\n color: 'var(--pf-t--global--icon--color--brand--default)',\n },\n [`& .${mcpClasses.sortHeaderIconInactive}`]: {\n color: 'var(--pf-t--global--icon--color--subtle)',\n },\n [`& .${mcpClasses.nameHeaderText}`]: {\n paddingLeft: '7px',\n fontSize: '0.75rem',\n lineHeight: '1.25rem',\n fontWeight: 600,\n },\n [`& .${mcpClasses.nameCell}`]: {\n paddingLeft: '8px !important',\n },\n [`& .${mcpClasses.statusHeader}`]: {\n paddingLeft: '0 !important',\n },\n [`& .${mcpClasses.statusColumnCell}`]: {\n paddingLeft: '0 !important',\n },\n [`& .${mcpClasses.rowName}`]: {\n fontSize: '1rem',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n },\n [`& .${mcpClasses.nameValue}`]: {\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n [`& .${mcpClasses.statusCell}`]: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n whiteSpace: 'nowrap',\n },\n [`& .${mcpClasses.statusValue}`]: {\n fontSize: '0.875rem',\n },\n [`& .${mcpClasses.statusOk}`]: {\n color: 'var(--pf-t--global--icon--color--status--custom--default)',\n },\n [`& .${mcpClasses.statusWarn}`]: {\n color: 'var(--pf-t--global--icon--color--status--danger--default)',\n },\n [`& .${mcpClasses.statusDisabled}`]: {\n color: 'var(--pf-t--global--icon--color--subtle)',\n },\n [`& .${mcpClasses.actionButton}`]: {\n color: theme.palette.text.secondary,\n opacity: 0,\n transition: 'opacity 0.15s ease-in-out',\n },\n [`& .${mcpClasses.tableRow}:hover .${mcpClasses.actionButton}, & .${mcpClasses.tableRow}:focus-within .${mcpClasses.actionButton}`]:\n {\n opacity: 1,\n },\n [`& .${mcpClasses.toggleCell}`]: {\n paddingRight: '0 !important',\n },\n [`& .${mcpClasses.table}`]: {\n width: '100%',\n backgroundColor: 'transparent',\n '--pf-v6-c-table--BackgroundColor': 'transparent',\n '--pf-v5-c-table--BackgroundColor': 'transparent',\n '& table, & thead, & tbody, & tr, & th, & td': {\n backgroundColor: 'transparent !important',\n },\n '& th': {\n borderBottom: 0,\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n textAlign: 'left',\n },\n '& td': {\n borderBottom: 0,\n paddingTop: theme.spacing(1.5),\n paddingBottom: theme.spacing(1.5),\n verticalAlign: 'middle',\n },\n },\n [`& .${mcpClasses.alert}`]: {\n marginLeft: theme.spacing(3),\n marginRight: theme.spacing(3),\n marginBottom: theme.spacing(2),\n },\n}));\n\ntype McpServerResponse = {\n name: string;\n url?: string;\n enabled: boolean;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n hasToken: boolean;\n hasUserToken: boolean;\n hasOrgToken: boolean;\n auth?: string;\n};\n\ntype McpServersListResponse = {\n servers?: McpServerResponse[];\n};\n\ntype McpServersPatchResponse = {\n server?: McpServerResponse;\n validation?: {\n error?: string;\n };\n};\n\ntype McpToolInfo = {\n name: string;\n description?: string;\n};\n\ntype McpServersValidateResponse = {\n name: string;\n status: 'connected' | 'error' | 'unknown';\n toolCount: number;\n validation?: {\n error?: unknown;\n tools?: McpToolInfo[];\n };\n};\n\ntype McpCredentialsValidateResponse = {\n valid: boolean;\n error?: unknown;\n toolCount: number;\n tools?: McpToolInfo[];\n};\n\nconst getStatusIcon = (status: ServerStatus, className: string) => {\n if (status === 'tokenRequired') return <KeyIcon className={className} />;\n if (status === 'disabled') return <InfoCircleIcon className={className} />;\n if (status === 'failed')\n return <ExclamationCircleIcon className={className} />;\n return <CheckCircleIcon className={className} />;\n};\n\nconst toUiServer = (\n server: McpServerResponse,\n validationError?: string,\n): McpServer => ({\n id: server.name,\n name: server.name,\n url: server.url,\n enabled: server.enabled,\n status: server.status,\n toolCount: server.toolCount,\n hasToken: server.hasToken,\n hasUserToken: server.hasUserToken,\n hasOrgToken: server.hasOrgToken,\n validationError: server.status === 'error' ? validationError : undefined,\n auth: server.auth,\n});\nexport const McpServersSettings = ({\n onClose,\n backgroundColor,\n}: McpServersSettingsProps) => {\n const { t } = useTranslation();\n const configApi = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const { allowed: hasMcpToolsAccess, loading: mcpToolsPermissionLoading } =\n useIaMcpToolsPermission();\n\n const [servers, setServers] = useState<McpServer[]>([]);\n const [sortColumn, setSortColumn] = useState<McpServerSortColumn>('name');\n const [sortAsc, setSortAsc] = useState(true);\n const [isLoading, setIsLoading] = useState(true);\n const [isSaving, setIsSaving] = useState<Record<string, boolean>>({});\n const [error, setError] = useState<string | null>(null);\n\n const getBaseUrl = useCallback(() => {\n return `${configApi.getString('backend.baseUrl')}/api/intelligent-assistant`;\n }, [configApi]);\n\n const fetchJson = useCallback(\n async <T,>(url: string, init?: RequestInit): Promise<T> => {\n const response = await fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n if (!response.ok) {\n let message = `${response.status} ${response.statusText}`;\n try {\n const bodyText = await response.text();\n if (bodyText) {\n const parsed = JSON.parse(bodyText);\n if (parsed?.error) {\n message = parsed.error;\n }\n }\n } catch {\n // Keep default message when parsing fails.\n }\n throw new Error(message);\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n },\n [fetchApi],\n );\n\n const fetchServerValidation = useCallback(\n async (serverName: string) => {\n const baseUrl = getBaseUrl();\n return fetchJson<McpServersValidateResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}/validate`,\n {\n method: 'POST',\n },\n );\n },\n [fetchJson, getBaseUrl],\n );\n\n const validateServer = useCallback(\n async (serverName: string) => {\n const data = await fetchServerValidation(serverName);\n\n setServers(prev =>\n prev.map(server =>\n server.name === serverName\n ? {\n ...server,\n status: data.status,\n toolCount: data.toolCount,\n validationError:\n data.status === 'error'\n ? formatApiError(data.validation?.error) ||\n 'Validation failed'\n : undefined,\n }\n : server,\n ),\n );\n return data;\n },\n [fetchServerValidation],\n );\n\n const validateCredentials = useCallback(\n async (url: string, token: string) => {\n const baseUrl = getBaseUrl();\n return await fetchJson<McpCredentialsValidateResponse>(\n `${baseUrl}/mcp-servers/validate`,\n {\n method: 'POST',\n body: JSON.stringify({ url, token }),\n },\n );\n },\n [fetchJson, getBaseUrl],\n );\n const loadServers = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const baseUrl = getBaseUrl();\n const data = await fetchJson<McpServersListResponse>(\n `${baseUrl}/mcp-servers`,\n );\n const uiServers = (data.servers ?? []).map(server => toUiServer(server));\n setServers(uiServers);\n\n const serversToValidate = uiServers.filter(server => server.hasToken);\n void Promise.allSettled(\n serversToValidate.map(async server => {\n try {\n await validateServer(server.name);\n } catch (validationError) {\n setError(\n prev =>\n prev ??\n (validationError instanceof Error\n ? validationError.message\n : `Failed to validate ${server.name}`),\n );\n }\n }),\n );\n } catch (e) {\n setError(\n e instanceof Error ? e.message : 'Failed to load MCP server settings',\n );\n } finally {\n setIsLoading(false);\n }\n }, [fetchJson, getBaseUrl, validateServer]);\n\n useEffect(() => {\n if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {\n return;\n }\n loadServers();\n }, [loadServers, mcpToolsPermissionLoading, hasMcpToolsAccess]);\n\n const patchServer = useCallback(\n async (\n serverName: string,\n body: { enabled?: boolean; token?: string | null },\n ) => {\n setError(null);\n setIsSaving(prev => ({ ...prev, [serverName]: true }));\n try {\n const baseUrl = getBaseUrl();\n const data = await fetchJson<McpServersPatchResponse>(\n `${baseUrl}/mcp-servers/${encodeURIComponent(serverName)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n if (data.server) {\n setServers(prev =>\n prev.map(server =>\n server.name === serverName\n ? toUiServer(data.server!, data.validation?.error)\n : server,\n ),\n );\n } else {\n await loadServers();\n }\n } catch (e) {\n setError(\n e instanceof Error\n ? e.message\n : `Failed to update ${serverName} settings`,\n );\n throw e;\n } finally {\n setIsSaving(prev => ({ ...prev, [serverName]: false }));\n }\n },\n [fetchJson, getBaseUrl, loadServers],\n );\n\n const configureModal = useMcpConfigureModal({\n servers,\n isSaving,\n patchServer,\n validateServer,\n validateCredentials,\n fetchServerValidation,\n });\n\n const selectedCount = servers.filter(server => {\n const displayStatus = getDisplayStatus(server);\n const isUnavailable =\n displayStatus === 'failed' || displayStatus === 'tokenRequired';\n return server.enabled && !isUnavailable;\n }).length;\n\n const sortedServers = [...servers].sort((a, b) =>\n compareMcpServers(a, b, sortColumn, sortAsc),\n );\n\n const onSortColumnClick = (column: McpServerSortColumn) => {\n if (sortColumn === column) {\n setSortAsc(prev => !prev);\n return;\n }\n setSortColumn(column);\n setSortAsc(true);\n };\n\n const renderSortIcon = (column: McpServerSortColumn) => {\n const isActive = sortColumn === column;\n let Icon = SortAmountDownIcon;\n if (isActive && !sortAsc) {\n Icon = SortAmountUpIcon;\n }\n\n return (\n <Icon\n className={\n isActive\n ? mcpClasses.sortHeaderIconActive\n : mcpClasses.sortHeaderIconInactive\n }\n />\n );\n };\n\n if (mcpToolsPermissionLoading || !hasMcpToolsAccess) {\n return null;\n }\n\n return (\n <StyledMcpRoot style={backgroundColor ? { backgroundColor } : undefined}>\n <GlobalStyles\n styles={{\n '.pf-v6-c-backdrop': {\n zIndex: '1400 !important',\n },\n '.pf-v5-c-backdrop': {\n zIndex: '1400 !important',\n },\n }}\n />\n <div className={mcpClasses.headerRow}>\n <div>\n <Title headingLevel=\"h2\" size=\"xl\" className={mcpClasses.title}>\n {t('mcp.settings.title')}\n </Title>\n <div className={mcpClasses.selectedCount}>\n {t('mcp.settings.selectedCount' as any, {\n selectedCount: String(selectedCount),\n totalCount: String(servers.length),\n })}\n </div>\n </div>\n <Button\n aria-label={t('mcp.settings.closeAriaLabel')}\n icon={<TimesIcon />}\n variant=\"plain\"\n className={mcpClasses.closeButton}\n onClick={onClose}\n />\n </div>\n {error && (\n <Alert\n variant=\"danger\"\n isInline\n title={error}\n className={mcpClasses.alert}\n />\n )}\n <Table\n variant=\"compact\"\n aria-label={t('mcp.settings.tableAriaLabel')}\n className={mcpClasses.table}\n >\n <Thead>\n <Tr>\n <Th width={10} screenReaderText={t('mcp.settings.enabled')} />\n <Th>\n <Button\n variant=\"link\"\n className={mcpClasses.nameHeaderButton}\n icon={renderSortIcon('name')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('name')}\n >\n <Typography\n component=\"span\"\n className={mcpClasses.nameHeaderText}\n >\n {t('mcp.settings.name')}\n </Typography>\n </Button>\n </Th>\n <Th className={mcpClasses.statusHeader}>\n <Button\n variant=\"link\"\n className={mcpClasses.statusHeaderButton}\n icon={renderSortIcon('status')}\n iconPosition=\"right\"\n onClick={() => onSortColumnClick('status')}\n >\n <Typography\n component=\"span\"\n className={mcpClasses.nameHeaderText}\n >\n {t('mcp.settings.status')}\n </Typography>\n </Button>\n </Th>\n <Th screenReaderText={t('mcp.settings.edit')} />\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (\n <Tr>\n <Td colSpan={4}>{t('mcp.settings.loading')}</Td>\n </Tr>\n )}\n {!isLoading && sortedServers.length === 0 && (\n <Tr>\n <Td colSpan={4}>{t('mcp.settings.noneAvailable')}</Td>\n </Tr>\n )}\n {sortedServers.map(server => {\n const displayStatus = getDisplayStatus(server);\n const displayDetail = getDisplayDetail(server, displayStatus, t);\n let statusClass:\n | typeof mcpClasses.statusOk\n | typeof mcpClasses.statusWarn\n | typeof mcpClasses.statusDisabled = mcpClasses.statusWarn;\n if (displayStatus === 'ok') {\n statusClass = mcpClasses.statusOk;\n } else if (displayStatus === 'disabled') {\n statusClass = mcpClasses.statusDisabled;\n }\n\n return (\n <Tr key={server.id} className={mcpClasses.tableRow}>\n <Td width={10} className={mcpClasses.toggleCell}>\n {(() => {\n const isUnavailable =\n isEnabledToggleUnavailable(displayStatus);\n const isChecked = getEnabledToggleChecked(\n server,\n displayStatus,\n );\n const isRowSaving = Boolean(isSaving[server.name]);\n const isToggleDisabled = isUnavailable || isRowSaving;\n const switchControl = (\n <Switch\n id={`mcp-switch-${server.id}`}\n aria-label={t(\n 'mcp.settings.toggleServerAriaLabel' as any,\n {\n serverName: server.name,\n },\n )}\n isChecked={isChecked}\n isDisabled={isToggleDisabled}\n onChange={(_event, checked) => {\n void patchServer(server.name, {\n enabled: checked,\n }).catch(() => {\n // patchServer already updates component error state.\n // Swallow here to avoid unhandled promise rejections\n // from event-handler fire-and-forget usage.\n });\n }}\n />\n );\n\n if (!isToggleDisabled) {\n return switchControl;\n }\n\n return (\n <Tooltip content={displayDetail}>\n <Typography component=\"span\">\n {switchControl}\n </Typography>\n </Tooltip>\n );\n })()}\n </Td>\n <Td\n width={35}\n className={`${mcpClasses.rowName} ${mcpClasses.nameCell}`}\n >\n <Typography component=\"span\" className={mcpClasses.nameValue}>\n {server.name}\n </Typography>\n </Td>\n <Td width={40} className={mcpClasses.statusColumnCell}>\n <div className={mcpClasses.statusCell}>\n {getStatusIcon(displayStatus, statusClass)}\n {displayStatus === 'failed' ? (\n <Tooltip\n content={\n server.validationError ??\n t('mcp.settings.token.validationFailed')\n }\n >\n <Typography\n component=\"span\"\n className={mcpClasses.statusValue}\n >\n {displayDetail}\n </Typography>\n </Tooltip>\n ) : (\n <Typography\n component=\"span\"\n className={mcpClasses.statusValue}\n >\n {displayDetail}\n </Typography>\n )}\n </div>\n </Td>\n <Td width={15} isActionCell style={{ textAlign: 'right' }}>\n <Button\n aria-label={t('mcp.settings.editServerAriaLabel' as any, {\n serverName: server.name,\n })}\n icon={<PencilAltIcon />}\n variant=\"plain\"\n className={mcpClasses.actionButton}\n onClick={() => configureModal.open(server)}\n />\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n <McpConfigureServerModal {...configureModal} />\n </StyledMcpRoot>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { useApi } from '@backstage/core-plugin-api';
|
|
|
2
2
|
import { useQuery } from '@tanstack/react-query';
|
|
3
3
|
import { lightspeedApiRef } from '../api/api.esm.js';
|
|
4
4
|
|
|
5
|
-
const useAllModels = () => {
|
|
5
|
+
const useAllModels = (enabled = true) => {
|
|
6
6
|
const lightspeedApi = useApi(lightspeedApiRef);
|
|
7
7
|
return useQuery({
|
|
8
8
|
queryKey: ["models"],
|
|
@@ -10,6 +10,7 @@ const useAllModels = () => {
|
|
|
10
10
|
const response = await lightspeedApi.getAllModels();
|
|
11
11
|
return response;
|
|
12
12
|
},
|
|
13
|
+
enabled,
|
|
13
14
|
staleTime: 1e3 * 60 * 5,
|
|
14
15
|
// 5 minutes
|
|
15
16
|
refetchOnWindowFocus: false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAllModels.esm.js","sources":["../../src/hooks/useAllModels.ts"],"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 { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { LCSModel } from '../types';\n\n// Fetch all models\nexport const useAllModels = (): UseQueryResult<LCSModel[], Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['models'],\n queryFn: async () => {\n const response = await lightspeedApi.getAllModels();\n return response;\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n refetchOnWindowFocus: false,\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,
|
|
1
|
+
{"version":3,"file":"useAllModels.esm.js","sources":["../../src/hooks/useAllModels.ts"],"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 { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { LCSModel } from '../types';\n\n// Fetch all models\nexport const useAllModels = (\n enabled = true,\n): UseQueryResult<LCSModel[], Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['models'],\n queryFn: async () => {\n const response = await lightspeedApi.getAllModels();\n return response;\n },\n enabled,\n staleTime: 1000 * 60 * 5, // 5 minutes\n refetchOnWindowFocus: false,\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,YAAA,GAAe,CAC1B,OAAA,GAAU,IAAA,KAC4B;AACtC,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,IACnB,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,YAAA,EAAa;AAClD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,CAAA;AAAA;AAAA,IACvB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACH;;;;"}
|
|
@@ -2,7 +2,7 @@ import { useApi } from '@backstage/core-plugin-api';
|
|
|
2
2
|
import { useQuery } from '@tanstack/react-query';
|
|
3
3
|
import { lightspeedApiRef } from '../api/api.esm.js';
|
|
4
4
|
|
|
5
|
-
const useConversations = () => {
|
|
5
|
+
const useConversations = (enabled = true) => {
|
|
6
6
|
const lightspeedApi = useApi(lightspeedApiRef);
|
|
7
7
|
return useQuery({
|
|
8
8
|
queryKey: ["conversations"],
|
|
@@ -10,6 +10,7 @@ const useConversations = () => {
|
|
|
10
10
|
const response = await lightspeedApi.getConversations();
|
|
11
11
|
return response;
|
|
12
12
|
},
|
|
13
|
+
enabled,
|
|
13
14
|
refetchInterval: (query) => {
|
|
14
15
|
const data = query.state.data;
|
|
15
16
|
if (!data?.length) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversations.esm.js","sources":["../../src/hooks/useConversations.ts"],"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 { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\n// Fetch all conversations\nexport const useConversations = (): UseQueryResult<ConversationList, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversations'],\n queryFn: async () => {\n const response = await lightspeedApi.getConversations();\n return response;\n },\n refetchInterval: query => {\n const data = query.state.data;\n if (!data?.length) return false;\n const hasNullSummary = data.some(c => !c.topic_summary);\n return hasNullSummary ? 2000 : false;\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,
|
|
1
|
+
{"version":3,"file":"useConversations.esm.js","sources":["../../src/hooks/useConversations.ts"],"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 { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\n// Fetch all conversations\nexport const useConversations = (\n enabled = true,\n): UseQueryResult<ConversationList, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversations'],\n queryFn: async () => {\n const response = await lightspeedApi.getConversations();\n return response;\n },\n enabled,\n refetchInterval: query => {\n const data = query.state.data;\n if (!data?.length) return false;\n const hasNullSummary = data.some(c => !c.topic_summary);\n return hasNullSummary ? 2000 : false;\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,gBAAA,GAAmB,CAC9B,OAAA,GAAU,IAAA,KACkC;AAC5C,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,eAAe,CAAA;AAAA,IAC1B,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,gBAAA,EAAiB;AACtD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAiB,CAAA,KAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,MAAA,MAAM,iBAAiB,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,EAAE,aAAa,CAAA;AACtD,MAAA,OAAO,iBAAiB,GAAA,GAAO,KAAA;AAAA,IACjC,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
+
import { iaChatPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
|
+
|
|
4
|
+
const useIaChatPermission = () => {
|
|
5
|
+
const result = usePermission({
|
|
6
|
+
permission: iaChatPermission
|
|
7
|
+
});
|
|
8
|
+
return {
|
|
9
|
+
loading: result.loading,
|
|
10
|
+
allowed: result.allowed
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { useIaChatPermission };
|
|
15
|
+
//# sourceMappingURL=useIaChatPermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIaChatPermission.esm.js","sources":["../../src/hooks/useIaChatPermission.ts"],"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 { usePermission } from '@backstage/plugin-permission-react';\n\nimport { iaChatPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useIaChatPermission = (): {\n loading: boolean;\n allowed: boolean;\n} => {\n const result = usePermission({\n permission: iaChatPermission,\n });\n\n return {\n loading: result.loading,\n allowed: result.allowed,\n };\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,sBAAsB,MAG9B;AACH,EAAA,MAAM,SAAS,aAAA,CAAc;AAAA,IAC3B,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
+
import { iaMcpToolsPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
|
+
|
|
4
|
+
const useIaMcpToolsPermission = () => {
|
|
5
|
+
const result = usePermission({
|
|
6
|
+
permission: iaMcpToolsPermission
|
|
7
|
+
});
|
|
8
|
+
return {
|
|
9
|
+
loading: result.loading,
|
|
10
|
+
allowed: result.allowed
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { useIaMcpToolsPermission };
|
|
15
|
+
//# sourceMappingURL=useIaMcpToolsPermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIaMcpToolsPermission.esm.js","sources":["../../src/hooks/useIaMcpToolsPermission.ts"],"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 { usePermission } from '@backstage/plugin-permission-react';\n\nimport { iaMcpToolsPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useIaMcpToolsPermission = (): {\n loading: boolean;\n allowed: boolean;\n} => {\n const result = usePermission({\n permission: iaMcpToolsPermission,\n });\n\n return {\n loading: result.loading,\n allowed: result.allowed,\n };\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,0BAA0B,MAGlC;AACH,EAAA,MAAM,SAAS,aAAA,CAAc;AAAA,IAC3B,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;;;;"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
2
|
import { iaNotebooksPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';
|
|
3
3
|
|
|
4
|
-
const
|
|
4
|
+
const useIaNotebooksPermission = () => {
|
|
5
5
|
const result = usePermission({
|
|
6
6
|
permission: iaNotebooksPermission
|
|
7
7
|
});
|
|
8
8
|
return {
|
|
9
9
|
loading: result.loading,
|
|
10
|
-
allowed: result.allowed
|
|
11
|
-
iaNotebooksPermissionName: iaNotebooksPermission.name
|
|
10
|
+
allowed: result.allowed
|
|
12
11
|
};
|
|
13
12
|
};
|
|
14
13
|
|
|
15
|
-
export {
|
|
16
|
-
//# sourceMappingURL=
|
|
14
|
+
export { useIaNotebooksPermission };
|
|
15
|
+
//# sourceMappingURL=useIaNotebooksPermission.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIaNotebooksPermission.esm.js","sources":["../../src/hooks/useIaNotebooksPermission.ts"],"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 { usePermission } from '@backstage/plugin-permission-react';\n\nimport { iaNotebooksPermission } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nexport const useIaNotebooksPermission = (): {\n loading: boolean;\n allowed: boolean;\n} => {\n const result = usePermission({\n permission: iaNotebooksPermission,\n });\n\n return {\n loading: result.loading,\n allowed: result.allowed,\n };\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,2BAA2B,MAGnC;AACH,EAAA,MAAM,SAAS,aAAA,CAAc;AAAA,IAC3B,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;;;;"}
|
|
@@ -5,7 +5,6 @@ import { useTranslation } from './useTranslation.esm.js';
|
|
|
5
5
|
const SAVED_TOKEN_MASK = "********************";
|
|
6
6
|
const useMcpConfigureModal = ({
|
|
7
7
|
servers,
|
|
8
|
-
canManageMcp,
|
|
9
8
|
isSaving,
|
|
10
9
|
patchServer,
|
|
11
10
|
validateServer,
|
|
@@ -201,7 +200,7 @@ const useMcpConfigureModal = ({
|
|
|
201
200
|
isDcrServer: editingServer?.auth === "dcr"
|
|
202
201
|
});
|
|
203
202
|
const removePersonalToken = useCallback(async () => {
|
|
204
|
-
if (!editingServer ||
|
|
203
|
+
if (!editingServer || isUpdatingModalStatus || editingServer.hasOrgToken) {
|
|
205
204
|
return;
|
|
206
205
|
}
|
|
207
206
|
setIsUpdatingModalStatus(true);
|
|
@@ -229,7 +228,6 @@ const useMcpConfigureModal = ({
|
|
|
229
228
|
setIsUpdatingModalStatus(false);
|
|
230
229
|
}
|
|
231
230
|
}, [
|
|
232
|
-
canManageMcp,
|
|
233
231
|
editingServer,
|
|
234
232
|
editingServerId,
|
|
235
233
|
isUpdatingModalStatus,
|
|
@@ -237,7 +235,7 @@ const useMcpConfigureModal = ({
|
|
|
237
235
|
servers
|
|
238
236
|
]);
|
|
239
237
|
const save = useCallback(async () => {
|
|
240
|
-
if (!editingServer
|
|
238
|
+
if (!editingServer) return;
|
|
241
239
|
const hasCredentialModeChange = modalCredentialMode !== initialCredentialMode;
|
|
242
240
|
const hasTokenInputChange = tokenInputValue !== initialTokenInputValue;
|
|
243
241
|
const hasEnabledInputChange = modalEnabled !== editingServer.enabled;
|
|
@@ -335,7 +333,6 @@ const useMcpConfigureModal = ({
|
|
|
335
333
|
markFailedTokenAttempt();
|
|
336
334
|
}
|
|
337
335
|
}, [
|
|
338
|
-
canManageMcp,
|
|
339
336
|
close,
|
|
340
337
|
editingServer,
|
|
341
338
|
initialCredentialMode,
|
|
@@ -350,12 +347,12 @@ const useMcpConfigureModal = ({
|
|
|
350
347
|
]);
|
|
351
348
|
const onModalEnabledChange = useCallback(
|
|
352
349
|
(_event, checked) => {
|
|
353
|
-
if (!editingServer
|
|
350
|
+
if (!editingServer) {
|
|
354
351
|
return;
|
|
355
352
|
}
|
|
356
353
|
setModalEnabled(checked);
|
|
357
354
|
},
|
|
358
|
-
[editingServer
|
|
355
|
+
[editingServer]
|
|
359
356
|
);
|
|
360
357
|
const modalVerifiedHasToken = editingServer ? editingServer.auth === "dcr" || getModalVerifiedHasToken({
|
|
361
358
|
hasOrgToken: editingServer.hasOrgToken,
|
|
@@ -373,7 +370,7 @@ const useMcpConfigureModal = ({
|
|
|
373
370
|
},
|
|
374
371
|
modalEnabled
|
|
375
372
|
) : "unknown";
|
|
376
|
-
const isModalEnabledToggleDisabled = !
|
|
373
|
+
const isModalEnabledToggleDisabled = !editingServer || isUpdatingModalStatus || isEnabledToggleUnavailable(modalDisplayStatus) || Boolean(isSaving[editingServer?.name ?? ""]);
|
|
377
374
|
const isModalEnabledChecked$1 = isModalEnabledChecked({
|
|
378
375
|
displayStatus: modalDisplayStatus,
|
|
379
376
|
modalEnabled
|
|
@@ -425,7 +422,6 @@ const useMcpConfigureModal = ({
|
|
|
425
422
|
close,
|
|
426
423
|
save,
|
|
427
424
|
removePersonalToken,
|
|
428
|
-
canManageMcp,
|
|
429
425
|
configureModalTitle,
|
|
430
426
|
isConfigureModalSaving,
|
|
431
427
|
isSaveTokenButtonDisabled,
|