@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SavedPromptsSettings.esm.js","sources":["../../src/components/SavedPromptsSettings.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 */\nimport { useCallback, useState } from 'react';\n\nimport Typography from '@mui/material/Typography';\nimport {\n Alert,\n AlertActionLink,\n Button,\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n TextArea,\n TextInput,\n Tooltip,\n} from '@patternfly/react-core';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons';\nimport { makeStyles } from 'tss-react/mui';\n\nimport {\n SavedPrompt,\n SavedPromptsConfig,\n} from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nimport { useSavedPromptActions } from '../hooks/useSavedPromptActions';\nimport { useSavedPrompts } from '../hooks/useSavedPrompts';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { DeleteSavedPromptModal } from './DeleteSavedPromptModal';\nimport { SavedPromptsEmptyState } from './SavedPromptsEmptyState';\nimport { SavedPromptsList } from './SavedPromptsList';\n\ntype SavedPromptsSettingsProps = {\n isSavedPromptsEnabled: boolean;\n onEnableSavedPrompts: () => void;\n onApplyToInput: (content: string) => void;\n onSendDirectly: (content: string) => void;\n isChatStreaming?: boolean;\n savedPrompts?: SavedPrompt[];\n savedPromptsConfig?: SavedPromptsConfig;\n savedPromptsLoading?: boolean;\n savedPromptsError?: string | null;\n onCreateSavedPrompt?: (name: string, content: string) => Promise<void>;\n onRequestDelete?: (prompt: SavedPrompt) => void;\n};\n\ntype SavedPromptsSettingsContentProps = SavedPromptsSettingsProps & {\n savedPrompts: SavedPrompt[];\n savedPromptsConfig: SavedPromptsConfig;\n savedPromptsLoading: boolean;\n savedPromptsError: string | null;\n onCreateSavedPrompt: (name: string, content: string) => Promise<void>;\n onRequestDelete: (prompt: SavedPrompt) => void;\n};\n\nconst hasInjectedSavedPromptsData = (\n props: SavedPromptsSettingsProps,\n): props is SavedPromptsSettingsContentProps =>\n props.savedPrompts !== undefined &&\n props.savedPromptsConfig !== undefined &&\n props.onCreateSavedPrompt !== undefined &&\n props.onRequestDelete !== undefined;\n\nconst useStyles = makeStyles()(() => ({\n root: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n padding: '16px 24px',\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n borderBottom: '1px solid var(--pf-t--global--border--color--default)',\n },\n formActions: {\n display: 'flex',\n gap: '8px',\n },\n promptCount: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderBottom: '1px solid var(--pf-t--global--border--color--default)',\n paddingBottom: '12px',\n },\n}));\n\nconst SavedPromptsSettingsContent = ({\n isSavedPromptsEnabled,\n onEnableSavedPrompts,\n onApplyToInput,\n onSendDirectly,\n isChatStreaming = false,\n savedPrompts,\n savedPromptsConfig: config,\n savedPromptsLoading: loading,\n savedPromptsError: error,\n onCreateSavedPrompt: createPrompt,\n onRequestDelete,\n}: SavedPromptsSettingsContentProps) => {\n const { classes } = useStyles();\n const { t } = useTranslation();\n\n const [isFormOpen, setIsFormOpen] = useState(false);\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n\n const titleExceedsLimit = title.length > config.max_display_name_length;\n const contentExceedsLimit = content.length > config.max_content_length;\n const isFormValid =\n title.trim().length > 0 &&\n content.trim().length > 0 &&\n !titleExceedsLimit &&\n !contentExceedsLimit;\n const isLimitReached = savedPrompts.length >= config.max_prompts_per_user;\n const hasPrompts = savedPrompts.length > 0;\n const showEmptyState = !loading && !error && !hasPrompts && !isFormOpen;\n\n const handleSave = useCallback(async () => {\n if (!isFormValid) return;\n setIsSaving(true);\n setSaveError(null);\n try {\n await createPrompt(title.trim(), content.trim());\n setTitle('');\n setContent('');\n setIsFormOpen(false);\n } catch (e) {\n setSaveError(e instanceof Error ? e.message : 'Failed to save prompt');\n } finally {\n setIsSaving(false);\n }\n }, [isFormValid, title, content, createPrompt]);\n\n const handleCancel = () => {\n setTitle('');\n setContent('');\n setIsFormOpen(false);\n setSaveError(null);\n };\n\n const newPromptButton = (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n isDisabled={isLimitReached || isFormOpen}\n onClick={() => setIsFormOpen(true)}\n style={{ borderRadius: '999px' }}\n >\n {t('savedPrompts.newPrompt')}\n </Button>\n );\n\n return (\n <div className={classes.root}>\n {!isSavedPromptsEnabled && (\n <Alert\n variant=\"info\"\n isInline\n title={t('savedPrompts.disabled.title')}\n actionLinks={\n <AlertActionLink onClick={onEnableSavedPrompts}>\n {t('savedPrompts.disabled.enableLink')}\n </AlertActionLink>\n }\n style={{ marginBottom: '12px' }}\n >\n {t('savedPrompts.disabled.body')}\n </Alert>\n )}\n\n {(isFormOpen || hasPrompts) && (\n <div className={classes.promptCount}>\n <Typography\n component=\"span\"\n style={{ color: 'var(--pf-t--global--text--color--subtle)' }}\n >\n {savedPrompts.length === 0\n ? t('savedPrompts.count.zero')\n : (t as Function)('savedPrompts.count', {\n count: savedPrompts.length,\n })}\n </Typography>\n {isLimitReached ? (\n <Tooltip content={t('savedPrompts.limitReached')}>\n <Typography component=\"span\">{newPromptButton}</Typography>\n </Tooltip>\n ) : (\n newPromptButton\n )}\n </div>\n )}\n\n {isFormOpen && (\n <div className={classes.form}>\n <FormGroup\n label={t('savedPrompts.form.titleLabel')}\n isRequired\n fieldId=\"saved-prompt-title\"\n >\n <TextInput\n id=\"saved-prompt-title\"\n value={title}\n onChange={(_event, value) => setTitle(value)}\n validated={titleExceedsLimit ? 'error' : 'default'}\n isRequired\n placeholder={t('savedPrompts.form.titlePlaceholder')}\n />\n {titleExceedsLimit && (\n <FormHelperText>\n <HelperText>\n <HelperTextItem\n icon={<ExclamationCircleIcon />}\n variant=\"error\"\n >\n {t('savedPrompts.validation.titleMaxLength', {\n max: config.max_display_name_length,\n } as any)}\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n )}\n </FormGroup>\n\n <FormGroup\n label={t('savedPrompts.form.contentLabel')}\n isRequired\n fieldId=\"saved-prompt-content\"\n >\n <TextArea\n id=\"saved-prompt-content\"\n value={content}\n onChange={(_event, value) => setContent(value)}\n validated={contentExceedsLimit ? 'error' : 'default'}\n isRequired\n rows={4}\n resizeOrientation=\"vertical\"\n placeholder={t('savedPrompts.form.contentPlaceholder')}\n />\n {contentExceedsLimit && (\n <FormHelperText>\n <HelperText>\n <HelperTextItem\n icon={<ExclamationCircleIcon />}\n variant=\"error\"\n >\n {t('savedPrompts.validation.contentMaxLength', {\n max: config.max_content_length,\n } as any)}\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n )}\n </FormGroup>\n\n {saveError && (\n <Alert variant=\"danger\" isInline isPlain title={saveError} />\n )}\n\n <div className={classes.formActions}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n isDisabled={!isFormValid || isSaving}\n isLoading={isSaving}\n onClick={handleSave}\n >\n {t('savedPrompts.form.save')}\n </Button>\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={handleCancel}\n isDisabled={isSaving}\n >\n {t('savedPrompts.form.cancel')}\n </Button>\n </div>\n </div>\n )}\n\n {showEmptyState ? (\n <SavedPromptsEmptyState onNewPrompt={() => setIsFormOpen(true)} />\n ) : (\n <SavedPromptsList\n prompts={savedPrompts}\n loading={loading}\n error={error}\n variant=\"settings\"\n onApplyToInput={onApplyToInput}\n onSendDirectly={onSendDirectly}\n onDelete={onRequestDelete}\n isSendDirectlyDisabled={isChatStreaming}\n />\n )}\n </div>\n );\n};\n\nconst SavedPromptsSettingsWithHook = (props: SavedPromptsSettingsProps) => {\n const { savedPrompts, config, loading, error, createPrompt, deletePrompt } =\n useSavedPrompts();\n\n const {\n requestDelete,\n promptToDelete,\n closeDeleteModal,\n confirmDelete,\n isDeleting,\n deleteError,\n isDeleteModalOpen,\n } = useSavedPromptActions({\n onApplyToInput: props.onApplyToInput,\n onSendDirectly: props.onSendDirectly,\n onDelete: deletePrompt,\n });\n\n return (\n <>\n <SavedPromptsSettingsContent\n {...props}\n savedPrompts={savedPrompts}\n savedPromptsConfig={config}\n savedPromptsLoading={loading}\n savedPromptsError={error}\n onCreateSavedPrompt={createPrompt}\n onRequestDelete={requestDelete}\n />\n <DeleteSavedPromptModal\n isOpen={isDeleteModalOpen}\n promptName={promptToDelete?.name}\n isDeleting={isDeleting}\n error={deleteError}\n onClose={closeDeleteModal}\n onConfirm={confirmDelete}\n />\n </>\n );\n};\n\nexport const SavedPromptsSettings = (props: SavedPromptsSettingsProps) => {\n if (hasInjectedSavedPromptsData(props)) {\n return (\n <SavedPromptsSettingsContent\n {...props}\n savedPromptsLoading={props.savedPromptsLoading ?? false}\n savedPromptsError={props.savedPromptsError ?? null}\n />\n );\n }\n\n return <SavedPromptsSettingsWithHook {...props} />;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Title, Button } from '@patternfly/react-core';
|
|
3
|
+
import { TimesIcon } from '@patternfly/react-icons';
|
|
4
|
+
import { makeStyles } from 'tss-react/mui';
|
|
5
|
+
import { useTranslation } from '../hooks/useTranslation.esm.js';
|
|
6
|
+
import { McpServersSettings } from './McpServersSettings.esm.js';
|
|
7
|
+
import { SavedPromptsSettings } from './SavedPromptsSettings.esm.js';
|
|
8
|
+
|
|
9
|
+
const useStyles = makeStyles()((theme) => ({
|
|
10
|
+
root: {
|
|
11
|
+
display: "flex",
|
|
12
|
+
flexDirection: "column",
|
|
13
|
+
height: "100%",
|
|
14
|
+
width: "100%",
|
|
15
|
+
overflow: "hidden",
|
|
16
|
+
backgroundColor: "var(--pf-t--global--background--color--floating--default)"
|
|
17
|
+
},
|
|
18
|
+
headerRow: {
|
|
19
|
+
display: "flex",
|
|
20
|
+
alignItems: "flex-start",
|
|
21
|
+
justifyContent: "space-between",
|
|
22
|
+
padding: `${theme.spacing(2)} ${theme.spacing(2)} ${theme.spacing(1)} ${theme.spacing(3)}`
|
|
23
|
+
},
|
|
24
|
+
tabBar: {
|
|
25
|
+
display: "flex",
|
|
26
|
+
padding: `0 ${theme.spacing(3)}`,
|
|
27
|
+
gap: theme.spacing(1),
|
|
28
|
+
borderBottom: "1px solid var(--pf-t--global--border--color--default)"
|
|
29
|
+
},
|
|
30
|
+
tabButton: {
|
|
31
|
+
background: "none",
|
|
32
|
+
border: "none",
|
|
33
|
+
padding: `${theme.spacing(1)} ${theme.spacing(2)}`,
|
|
34
|
+
fontSize: "0.875rem",
|
|
35
|
+
cursor: "pointer",
|
|
36
|
+
color: theme.palette.text.secondary,
|
|
37
|
+
borderBottom: "2px solid transparent",
|
|
38
|
+
transition: "color 0.15s, border-color 0.15s",
|
|
39
|
+
"&:hover": {
|
|
40
|
+
color: theme.palette.text.primary
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
tabButtonActive: {
|
|
44
|
+
color: theme.palette.text.primary,
|
|
45
|
+
fontWeight: 600,
|
|
46
|
+
borderBottom: `2px solid var(--pf-t--global--color--brand--default, ${theme.palette.primary.main}) !important`,
|
|
47
|
+
borderRadius: "0 !important"
|
|
48
|
+
},
|
|
49
|
+
tabContent: {
|
|
50
|
+
flex: 1,
|
|
51
|
+
minHeight: 0,
|
|
52
|
+
overflow: "auto"
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
const SettingsPanel = ({
|
|
56
|
+
activeTab,
|
|
57
|
+
onTabChange,
|
|
58
|
+
onClose,
|
|
59
|
+
backgroundColor,
|
|
60
|
+
isSavedPromptsEnabled,
|
|
61
|
+
onEnableSavedPrompts,
|
|
62
|
+
onApplySavedPromptToInput,
|
|
63
|
+
onSendSavedPromptDirectly,
|
|
64
|
+
isChatStreaming = false,
|
|
65
|
+
savedPrompts,
|
|
66
|
+
savedPromptsConfig,
|
|
67
|
+
savedPromptsLoading,
|
|
68
|
+
savedPromptsError,
|
|
69
|
+
onCreateSavedPrompt,
|
|
70
|
+
onRequestSavedPromptDelete,
|
|
71
|
+
showMcpSettings = true
|
|
72
|
+
}) => {
|
|
73
|
+
const { t } = useTranslation();
|
|
74
|
+
const { classes } = useStyles();
|
|
75
|
+
const showMcpTab = showMcpSettings;
|
|
76
|
+
const showSavedPromptsTab = true;
|
|
77
|
+
const showTabBar = showMcpTab && showSavedPromptsTab;
|
|
78
|
+
const effectiveTab = showMcpTab ? activeTab : "saved-prompts";
|
|
79
|
+
return /* @__PURE__ */ jsxs("div", { className: classes.root, children: [
|
|
80
|
+
/* @__PURE__ */ jsxs("div", { className: classes.headerRow, children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Title, { headingLevel: "h2", size: "xl", children: t("settings.panel.title") }),
|
|
82
|
+
/* @__PURE__ */ jsx(
|
|
83
|
+
Button,
|
|
84
|
+
{
|
|
85
|
+
"aria-label": t("mcp.settings.closeAriaLabel"),
|
|
86
|
+
icon: /* @__PURE__ */ jsx(TimesIcon, {}),
|
|
87
|
+
variant: "plain",
|
|
88
|
+
onClick: onClose
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
] }),
|
|
92
|
+
showTabBar && /* @__PURE__ */ jsxs("div", { className: classes.tabBar, children: [
|
|
93
|
+
showMcpTab && /* @__PURE__ */ jsx(
|
|
94
|
+
Button,
|
|
95
|
+
{
|
|
96
|
+
variant: "plain",
|
|
97
|
+
className: `${classes.tabButton} ${effectiveTab === "mcp-servers" ? classes.tabButtonActive : ""}`,
|
|
98
|
+
onClick: () => onTabChange("mcp-servers"),
|
|
99
|
+
children: t("mcp.settings.title")
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
Button,
|
|
104
|
+
{
|
|
105
|
+
variant: "plain",
|
|
106
|
+
className: `${classes.tabButton} ${effectiveTab === "saved-prompts" ? classes.tabButtonActive : ""}`,
|
|
107
|
+
onClick: () => onTabChange("saved-prompts"),
|
|
108
|
+
children: t("savedPrompts.tab.title")
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { className: classes.tabContent, children: [
|
|
113
|
+
effectiveTab === "mcp-servers" && showMcpTab && /* @__PURE__ */ jsx(McpServersSettings, { backgroundColor }),
|
|
114
|
+
effectiveTab === "saved-prompts" && /* @__PURE__ */ jsx(
|
|
115
|
+
SavedPromptsSettings,
|
|
116
|
+
{
|
|
117
|
+
isSavedPromptsEnabled,
|
|
118
|
+
onEnableSavedPrompts,
|
|
119
|
+
onApplyToInput: onApplySavedPromptToInput,
|
|
120
|
+
onSendDirectly: onSendSavedPromptDirectly,
|
|
121
|
+
isChatStreaming,
|
|
122
|
+
savedPrompts,
|
|
123
|
+
savedPromptsConfig,
|
|
124
|
+
savedPromptsLoading,
|
|
125
|
+
savedPromptsError,
|
|
126
|
+
onCreateSavedPrompt,
|
|
127
|
+
onRequestDelete: onRequestSavedPromptDelete
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
] })
|
|
131
|
+
] });
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export { SettingsPanel };
|
|
135
|
+
//# sourceMappingURL=SettingsPanel.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsPanel.esm.js","sources":["../../src/components/SettingsPanel.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 */\nimport { Button, Title } from '@patternfly/react-core';\nimport { TimesIcon } from '@patternfly/react-icons';\nimport { makeStyles } from 'tss-react/mui';\n\nimport {\n SavedPrompt,\n SavedPromptsConfig,\n} from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nimport type { SettingsTab } from '../hooks/useSettingsPanelUrlState';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpServersSettings } from './McpServersSettings';\nimport { SavedPromptsSettings } from './SavedPromptsSettings';\n\nexport type { SettingsTab };\n\ntype SettingsPanelProps = {\n activeTab: SettingsTab;\n onTabChange: (tab: SettingsTab) => void;\n onClose: () => void;\n backgroundColor?: string;\n isSavedPromptsEnabled: boolean;\n onEnableSavedPrompts: () => void;\n onApplySavedPromptToInput: (content: string) => void;\n onSendSavedPromptDirectly: (content: string) => void;\n isChatStreaming?: boolean;\n savedPrompts?: SavedPrompt[];\n savedPromptsConfig?: SavedPromptsConfig;\n savedPromptsLoading?: boolean;\n savedPromptsError?: string | null;\n onCreateSavedPrompt?: (name: string, content: string) => Promise<void>;\n onRequestSavedPromptDelete?: (prompt: SavedPrompt) => void;\n /** When false, hides the MCP tab and shows saved prompts only. */\n showMcpSettings?: boolean;\n};\n\nconst useStyles = makeStyles()(theme => ({\n root: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n width: '100%',\n overflow: 'hidden',\n backgroundColor:\n 'var(--pf-t--global--background--color--floating--default)',\n },\n headerRow: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n padding: `${theme.spacing(2)} ${theme.spacing(2)} ${theme.spacing(1)} ${theme.spacing(3)}`,\n },\n tabBar: {\n display: 'flex',\n padding: `0 ${theme.spacing(3)}`,\n gap: theme.spacing(1),\n borderBottom: '1px solid var(--pf-t--global--border--color--default)',\n },\n tabButton: {\n background: 'none',\n border: 'none',\n padding: `${theme.spacing(1)} ${theme.spacing(2)}`,\n fontSize: '0.875rem',\n cursor: 'pointer',\n color: theme.palette.text.secondary,\n borderBottom: '2px solid transparent',\n transition: 'color 0.15s, border-color 0.15s',\n '&:hover': {\n color: theme.palette.text.primary,\n },\n },\n tabButtonActive: {\n color: theme.palette.text.primary,\n fontWeight: 600,\n borderBottom: `2px solid var(--pf-t--global--color--brand--default, ${theme.palette.primary.main}) !important`,\n borderRadius: '0 !important',\n },\n tabContent: {\n flex: 1,\n minHeight: 0,\n overflow: 'auto',\n },\n}));\n\nexport const SettingsPanel = ({\n activeTab,\n onTabChange,\n onClose,\n backgroundColor,\n isSavedPromptsEnabled,\n onEnableSavedPrompts,\n onApplySavedPromptToInput,\n onSendSavedPromptDirectly,\n isChatStreaming = false,\n savedPrompts,\n savedPromptsConfig,\n savedPromptsLoading,\n savedPromptsError,\n onCreateSavedPrompt,\n onRequestSavedPromptDelete,\n showMcpSettings = true,\n}: SettingsPanelProps) => {\n const { t } = useTranslation();\n const { classes } = useStyles();\n const showMcpTab = showMcpSettings;\n const showSavedPromptsTab = true;\n const showTabBar = showMcpTab && showSavedPromptsTab;\n const effectiveTab = showMcpTab ? activeTab : 'saved-prompts';\n\n return (\n <div className={classes.root}>\n <div className={classes.headerRow}>\n <Title headingLevel=\"h2\" size=\"xl\">\n {t('settings.panel.title')}\n </Title>\n <Button\n aria-label={t('mcp.settings.closeAriaLabel')}\n icon={<TimesIcon />}\n variant=\"plain\"\n onClick={onClose}\n />\n </div>\n\n {showTabBar && (\n <div className={classes.tabBar}>\n {showMcpTab && (\n <Button\n variant=\"plain\"\n className={`${classes.tabButton} ${effectiveTab === 'mcp-servers' ? classes.tabButtonActive : ''}`}\n onClick={() => onTabChange('mcp-servers')}\n >\n {t('mcp.settings.title')}\n </Button>\n )}\n {showSavedPromptsTab && (\n <Button\n variant=\"plain\"\n className={`${classes.tabButton} ${effectiveTab === 'saved-prompts' ? classes.tabButtonActive : ''}`}\n onClick={() => onTabChange('saved-prompts')}\n >\n {t('savedPrompts.tab.title')}\n </Button>\n )}\n </div>\n )}\n\n <div className={classes.tabContent}>\n {effectiveTab === 'mcp-servers' && showMcpTab && (\n <McpServersSettings backgroundColor={backgroundColor} />\n )}\n {effectiveTab === 'saved-prompts' && (\n <SavedPromptsSettings\n isSavedPromptsEnabled={isSavedPromptsEnabled}\n onEnableSavedPrompts={onEnableSavedPrompts}\n onApplyToInput={onApplySavedPromptToInput}\n onSendDirectly={onSendSavedPromptDirectly}\n isChatStreaming={isChatStreaming}\n savedPrompts={savedPrompts}\n savedPromptsConfig={savedPromptsConfig}\n savedPromptsLoading={savedPromptsLoading}\n savedPromptsError={savedPromptsError}\n onCreateSavedPrompt={onCreateSavedPrompt}\n onRequestDelete={onRequestSavedPromptDelete}\n />\n )}\n </div>\n </div>\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;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import { buildConversationHistoryGroups } from '../utils/buildConversationHistoryGroups.esm.js';
|
|
3
|
+
import { useTranslation } from './useTranslation.esm.js';
|
|
4
|
+
|
|
5
|
+
const useConversationHistoryGroups = ({
|
|
6
|
+
savedPrompts,
|
|
7
|
+
categorizedMessages,
|
|
8
|
+
filterValue,
|
|
9
|
+
isSavedPromptsEnabled,
|
|
10
|
+
isPinningChatsEnabled,
|
|
11
|
+
isSettingsOpen,
|
|
12
|
+
activeSettingsTab,
|
|
13
|
+
openSettings,
|
|
14
|
+
getSavedPromptMenuItems
|
|
15
|
+
}) => {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
const [savedPromptsExpanded, setSavedPromptsExpanded] = useState(true);
|
|
18
|
+
const [pinnedExpanded, setPinnedExpanded] = useState(true);
|
|
19
|
+
const [chatsExpanded, setChatsExpanded] = useState(true);
|
|
20
|
+
const [savedPromptsShowAllExpanded, setSavedPromptsShowAllExpanded] = useState(false);
|
|
21
|
+
const handleOpenSavedPromptsSettings = useCallback(() => {
|
|
22
|
+
if (isSettingsOpen && activeSettingsTab === "saved-prompts") {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
openSettings("saved-prompts");
|
|
26
|
+
}, [activeSettingsTab, isSettingsOpen, openSettings]);
|
|
27
|
+
const { groups: conversationGroups, hasNoSearchResults } = useMemo(
|
|
28
|
+
() => buildConversationHistoryGroups({
|
|
29
|
+
savedPrompts,
|
|
30
|
+
categorizedMessages,
|
|
31
|
+
filterValue,
|
|
32
|
+
isSavedPromptsEnabled,
|
|
33
|
+
isPinningChatsEnabled,
|
|
34
|
+
sectionState: {
|
|
35
|
+
savedPromptsExpanded,
|
|
36
|
+
pinnedExpanded,
|
|
37
|
+
chatsExpanded,
|
|
38
|
+
savedPromptsShowAllExpanded
|
|
39
|
+
},
|
|
40
|
+
onSavedPromptsExpandedChange: setSavedPromptsExpanded,
|
|
41
|
+
onPinnedExpandedChange: setPinnedExpanded,
|
|
42
|
+
onChatsExpandedChange: setChatsExpanded,
|
|
43
|
+
onSavedPromptsShowAllChange: setSavedPromptsShowAllExpanded,
|
|
44
|
+
onOpenSavedPromptsSettings: handleOpenSavedPromptsSettings,
|
|
45
|
+
getSavedPromptMenuItems,
|
|
46
|
+
t
|
|
47
|
+
}),
|
|
48
|
+
[
|
|
49
|
+
savedPrompts,
|
|
50
|
+
categorizedMessages,
|
|
51
|
+
filterValue,
|
|
52
|
+
isSavedPromptsEnabled,
|
|
53
|
+
isPinningChatsEnabled,
|
|
54
|
+
savedPromptsExpanded,
|
|
55
|
+
pinnedExpanded,
|
|
56
|
+
chatsExpanded,
|
|
57
|
+
savedPromptsShowAllExpanded,
|
|
58
|
+
handleOpenSavedPromptsSettings,
|
|
59
|
+
getSavedPromptMenuItems,
|
|
60
|
+
t
|
|
61
|
+
]
|
|
62
|
+
);
|
|
63
|
+
return {
|
|
64
|
+
conversationGroups,
|
|
65
|
+
hasNoSearchResults,
|
|
66
|
+
handleOpenSavedPromptsSettings
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { useConversationHistoryGroups };
|
|
71
|
+
//# sourceMappingURL=useConversationHistoryGroups.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationHistoryGroups.esm.js","sources":["../../src/hooks/useConversationHistoryGroups.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 */\nimport { ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { Conversation } from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';\n\nimport { SavedPrompt } from '@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common';\n\nimport { buildConversationHistoryGroups } from '../utils/buildConversationHistoryGroups';\nimport { SettingsTab } from './useSettingsPanelUrlState';\nimport { useTranslation } from './useTranslation';\n\ntype UseConversationHistoryGroupsOptions = {\n savedPrompts: SavedPrompt[];\n categorizedMessages: { [key: string]: Conversation[] };\n filterValue: string;\n isSavedPromptsEnabled: boolean;\n isPinningChatsEnabled: boolean;\n isSettingsOpen: boolean;\n activeSettingsTab: SettingsTab;\n openSettings: (tab: SettingsTab) => void;\n getSavedPromptMenuItems: (prompt: SavedPrompt) => ReactNode;\n};\n\nexport const useConversationHistoryGroups = ({\n savedPrompts,\n categorizedMessages,\n filterValue,\n isSavedPromptsEnabled,\n isPinningChatsEnabled,\n isSettingsOpen,\n activeSettingsTab,\n openSettings,\n getSavedPromptMenuItems,\n}: UseConversationHistoryGroupsOptions) => {\n const { t } = useTranslation();\n\n const [savedPromptsExpanded, setSavedPromptsExpanded] = useState(true);\n const [pinnedExpanded, setPinnedExpanded] = useState(true);\n const [chatsExpanded, setChatsExpanded] = useState(true);\n const [savedPromptsShowAllExpanded, setSavedPromptsShowAllExpanded] =\n useState(false);\n\n const handleOpenSavedPromptsSettings = useCallback(() => {\n if (isSettingsOpen && activeSettingsTab === 'saved-prompts') {\n return;\n }\n openSettings('saved-prompts');\n }, [activeSettingsTab, isSettingsOpen, openSettings]);\n\n const { groups: conversationGroups, hasNoSearchResults } = useMemo(\n () =>\n buildConversationHistoryGroups({\n savedPrompts,\n categorizedMessages,\n filterValue,\n isSavedPromptsEnabled,\n isPinningChatsEnabled,\n sectionState: {\n savedPromptsExpanded,\n pinnedExpanded,\n chatsExpanded,\n savedPromptsShowAllExpanded,\n },\n onSavedPromptsExpandedChange: setSavedPromptsExpanded,\n onPinnedExpandedChange: setPinnedExpanded,\n onChatsExpandedChange: setChatsExpanded,\n onSavedPromptsShowAllChange: setSavedPromptsShowAllExpanded,\n onOpenSavedPromptsSettings: handleOpenSavedPromptsSettings,\n getSavedPromptMenuItems,\n t,\n }),\n [\n savedPrompts,\n categorizedMessages,\n filterValue,\n isSavedPromptsEnabled,\n isPinningChatsEnabled,\n savedPromptsExpanded,\n pinnedExpanded,\n chatsExpanded,\n savedPromptsShowAllExpanded,\n handleOpenSavedPromptsSettings,\n getSavedPromptMenuItems,\n t,\n ],\n );\n\n return {\n conversationGroups,\n hasNoSearchResults,\n handleOpenSavedPromptsSettings,\n };\n};\n"],"names":[],"mappings":";;;;AAqCO,MAAM,+BAA+B,CAAC;AAAA,EAC3C,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAA2C;AACzC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAI,SAAS,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,2BAAA,EAA6B,8BAA8B,CAAA,GAChE,SAAS,KAAK,CAAA;AAEhB,EAAA,MAAM,8BAAA,GAAiC,YAAY,MAAM;AACvD,IAAA,IAAI,cAAA,IAAkB,sBAAsB,eAAA,EAAiB;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,eAAe,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,iBAAA,EAAmB,cAAA,EAAgB,YAAY,CAAC,CAAA;AAEpD,EAAA,MAAM,EAAE,MAAA,EAAQ,kBAAA,EAAoB,kBAAA,EAAmB,GAAI,OAAA;AAAA,IACzD,MACE,8BAAA,CAA+B;AAAA,MAC7B,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,oBAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,4BAAA,EAA8B,uBAAA;AAAA,MAC9B,sBAAA,EAAwB,iBAAA;AAAA,MACxB,qBAAA,EAAuB,gBAAA;AAAA,MACvB,2BAAA,EAA6B,8BAAA;AAAA,MAC7B,0BAAA,EAA4B,8BAAA;AAAA,MAC5B,uBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,MACE,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,2BAAA;AAAA,MACA,8BAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -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;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedbackActions.esm.js","sources":["../../src/hooks/useFeedbackActions.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 */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport {\n MessageProps,\n UserFeedbackCompleteProps,\n UserFeedbackProps,\n} from '@patternfly/chatbot';\n\nimport { useCaptureFeedback } from '../hooks/useCaptureFeedback';\nimport { CaptureFeedback } from '../types';\nimport { Sentiment, useFeedbackState } from './useFeedbackState';\nimport { useFeedbackStatus } from './useFeedbackStatus';\nimport { useTranslation } from './useTranslation';\n\nexport const useFeedbackActions = <T extends MessageProps>(\n messages: T[],\n conversationId: string,\n isStreaming: boolean,\n): T[] => {\n const copyButtonRef = useRef<HTMLButtonElement>(null);\n const speakingButtonRef = useRef<HTMLButtonElement>(null);\n const currentSpeakingIdRef = useRef<string | null>(null);\n\n const { data: feedbackEnabled } = useFeedbackStatus();\n const { state, ...dispatch } = useFeedbackState();\n const { mutateAsync: captureFeedback } = useCaptureFeedback();\n const { t } = useTranslation();\n\n const createQuickResponses = useMemo(\n () => ({\n positive: [\n { id: '1', content: t('feedback.quickResponses.positive.helpful') },\n {\n id: '2',\n content: t('feedback.quickResponses.positive.easyToUnderstand'),\n },\n {\n id: '3',\n content: t('feedback.quickResponses.positive.resolvedIssue'),\n },\n ],\n negative: [\n { id: '1', content: t('feedback.quickResponses.negative.didntAnswer') },\n {\n id: '2',\n content: t('feedback.quickResponses.negative.hardToUnderstand'),\n },\n { id: '3', content: t('feedback.quickResponses.negative.notHelpful') },\n ],\n }),\n [t],\n );\n\n const getFeedbackForm = useCallback(\n (messageId: string, sentiment: 'positive' | 'negative') => ({\n key: `feedback-${sentiment}`,\n id: `feedback-${sentiment}-${messageId}`,\n hasTextArea: true,\n title: t('feedback.form.title'),\n textAreaPlaceholder: t('feedback.form.textAreaPlaceholder'),\n submitWord: t('feedback.form.submitWord'),\n quickResponses: createQuickResponses[sentiment],\n onSubmit: (\n quickResponse: string | undefined = '0',\n additionalFeedback: string | undefined,\n ) => {\n const quickIndex = Number(quickResponse) - 1;\n const quickText =\n quickResponse !== '0'\n ? createQuickResponses[sentiment]?.[quickIndex]?.content\n : undefined;\n\n let user_feedback = '';\n\n if (quickText && additionalFeedback) {\n user_feedback = `${quickText}\\nAdditional feedback: ${additionalFeedback}`;\n } else if (quickText) {\n user_feedback = quickText;\n } else if (additionalFeedback) {\n user_feedback = additionalFeedback;\n }\n\n const botAnswerId = Number(messageId.split('-').pop());\n const userQuestionId = botAnswerId - 1;\n\n const payload: CaptureFeedback = {\n conversation_id: conversationId,\n user_feedback,\n sentiment: sentiment === 'positive' ? 1 : -1,\n user_question: messages[userQuestionId].content || '',\n llm_response: messages[botAnswerId].content || '',\n };\n\n captureFeedback(payload).then(() => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.showCompletionForm(messageId, sentiment);\n dispatch.updateButtonState(messageId, {\n sentiment: sentiment,\n feedbackSubmitted: true,\n });\n\n setTimeout(() => {\n dispatch.hideCompletionForm(messageId, sentiment);\n }, 1000);\n });\n },\n\n // eslint-disable-next-line no-console\n onClose: () => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n dispatch.updateButtonState(messageId, { sentiment: undefined });\n },\n focusOnLoad: true,\n }),\n [\n captureFeedback,\n conversationId,\n dispatch,\n messages,\n createQuickResponses,\n t,\n ],\n );\n\n const feedbackForms = useCallback(\n (messageId: string): { [key in Sentiment]: UserFeedbackProps } => ({\n positive: getFeedbackForm(messageId, 'positive'),\n negative: getFeedbackForm(messageId, 'negative'),\n }),\n [getFeedbackForm],\n );\n\n const getUserFeedbackComplete = useCallback(\n (\n messageId: string,\n sentiment: Sentiment,\n ): UserFeedbackCompleteProps | undefined => {\n const isVisible = state[messageId]?.completionForm?.[sentiment];\n if (!isVisible) return undefined;\n\n return {\n id: `feebback-completion-${sentiment}-${messageId}`,\n title: t('feedback.completion.title'),\n body: t('feedback.completion.body'),\n onClose: () => {\n dispatch.hideCompletionForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n },\n };\n },\n [state, dispatch, t],\n );\n\n const scrollToFeedbackForm = useCallback(\n (messageId: string, sentiment: Sentiment) => {\n setTimeout(() => {\n const el = document.getElementById(\n `feedback-${sentiment}-${messageId}`,\n );\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n el.focus();\n }\n }, 0);\n },\n [],\n );\n\n const speakMessage = useCallback(\n (messageId: string, content: string) => {\n if (window.speechSynthesis.speaking || window.speechSynthesis.pending) {\n window.speechSynthesis.cancel();\n\n if (\n currentSpeakingIdRef.current &&\n currentSpeakingIdRef.current !== messageId\n ) {\n dispatch.updateButtonState(currentSpeakingIdRef.current, {\n isSpeaking: false,\n });\n }\n }\n\n // Track the current SpeakingId\n currentSpeakingIdRef.current = messageId;\n\n const utterance = new SpeechSynthesisUtterance(content);\n\n utterance.onstart = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: true });\n };\n\n utterance.onend = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n utterance.onerror = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n window.speechSynthesis.speak(utterance);\n },\n [dispatch],\n );\n\n const cancelSpeaking = useCallback(\n (messageId?: string) => {\n window.speechSynthesis.cancel();\n\n currentSpeakingIdRef.current = null;\n\n if (messageId) {\n // Cancel just this one message\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n } else {\n // Cancel all messages\n Object.keys(state).forEach(id => {\n if (state[id].buttonState?.isSpeaking) {\n dispatch.updateButtonState(id, { isSpeaking: false });\n }\n });\n }\n setTimeout(() => {\n const el = document.getElementById(`listen-${messageId}`);\n if (el) {\n el.blur();\n }\n }, 10);\n },\n [state, dispatch],\n );\n\n useEffect(() => {\n return () => {\n // Stop any ongoing speech when component unmounts\n cancelSpeaking();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationId]);\n\n return useMemo(() => {\n return feedbackEnabled\n ? messages.map((message, index) => {\n if (\n message.role === 'user' ||\n (isStreaming && messages.length - 1 === index)\n )\n return message;\n\n const messageId = `${conversationId}-${message.role}-${index}`;\n const { sentiment, copied, isSpeaking } =\n state[messageId]?.buttonState || {};\n const showFeedbackForm = state[messageId]?.feedbackForm?.[sentiment];\n const userFeedbackForm =\n showFeedbackForm && feedbackForms(messageId)[sentiment];\n\n const userFeedbackComplete = getUserFeedbackComplete(\n messageId,\n sentiment,\n );\n\n const createSentimentAction = (selected: Sentiment) => ({\n isClicked: sentiment === selected,\n onClick: () => {\n if (sentiment !== selected) {\n dispatch.toggleFeedbackForm(messageId, selected);\n dispatch.updateButtonState(messageId, { sentiment: selected });\n scrollToFeedbackForm(messageId, sentiment);\n }\n },\n tooltipContent:\n selected === 'positive'\n ? t('feedback.tooltips.goodResponse')\n : t('feedback.tooltips.badResponse'),\n 'aria-expanded': sentiment === selected,\n 'aria-controls': showFeedbackForm\n ? `feedback-${sentiment}-${messageId}`\n : `feebback-completion-${sentiment}-${messageId}`,\n });\n\n const copyAction = {\n isClicked: copied,\n ref: copyButtonRef,\n tooltipContent: copied\n ? t('feedback.tooltips.copied')\n : t('feedback.tooltips.copy'),\n onClick: async () => {\n await window.navigator.clipboard.writeText(\n message.content as string,\n );\n dispatch.updateButtonState(messageId, {\n copied: true,\n });\n\n setTimeout(() => {\n dispatch.updateButtonState(messageId, { copied: false });\n copyButtonRef?.current?.blur();\n }, 1000);\n },\n };\n\n const listenAction = {\n isClicked: isSpeaking,\n ref: speakingButtonRef,\n id: `listen-${messageId}`,\n tooltipContent: isSpeaking\n ? t('feedback.tooltips.listening')\n : t('feedback.tooltips.listen'),\n onClick: () => {\n const isCurrentlySpeaking =\n state[messageId]?.buttonState?.isSpeaking;\n\n if (isCurrentlySpeaking) {\n // Stop if it's already speaking this message\n cancelSpeaking(messageId);\n } else {\n cancelSpeaking();\n speakMessage(messageId, message.content as string);\n }\n },\n };\n\n return {\n ...message,\n userFeedbackForm,\n userFeedbackComplete,\n actions: {\n positive: createSentimentAction('positive'),\n negative: createSentimentAction('negative'),\n copy: copyAction,\n listen: listenAction,\n },\n };\n })\n : messages;\n }, [\n t,\n conversationId,\n messages,\n state,\n dispatch,\n isStreaming,\n speakMessage,\n feedbackForms,\n cancelSpeaking,\n feedbackEnabled,\n getUserFeedbackComplete,\n scrollToFeedbackForm,\n ]);\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFeedbackActions.esm.js","sources":["../../src/hooks/useFeedbackActions.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 */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { MessageProps } from '@patternfly/chatbot';\n\nimport { useCaptureFeedback } from '../hooks/useCaptureFeedback';\nimport { CaptureFeedback } from '../types';\nimport {\n UserFeedbackCompleteProps,\n UserFeedbackProps,\n} from '../types/patternfly-chatbot-feedback';\nimport { Sentiment, useFeedbackState } from './useFeedbackState';\nimport { useFeedbackStatus } from './useFeedbackStatus';\nimport { useTranslation } from './useTranslation';\n\nexport const useFeedbackActions = <T extends MessageProps>(\n messages: T[],\n conversationId: string,\n isStreaming: boolean,\n): T[] => {\n const copyButtonRef = useRef<HTMLButtonElement>(null);\n const speakingButtonRef = useRef<HTMLButtonElement>(null);\n const currentSpeakingIdRef = useRef<string | null>(null);\n\n const { data: feedbackEnabled } = useFeedbackStatus();\n const { state, ...dispatch } = useFeedbackState();\n const { mutateAsync: captureFeedback } = useCaptureFeedback();\n const { t } = useTranslation();\n\n const createQuickResponses = useMemo(\n () => ({\n positive: [\n { id: '1', content: t('feedback.quickResponses.positive.helpful') },\n {\n id: '2',\n content: t('feedback.quickResponses.positive.easyToUnderstand'),\n },\n {\n id: '3',\n content: t('feedback.quickResponses.positive.resolvedIssue'),\n },\n ],\n negative: [\n { id: '1', content: t('feedback.quickResponses.negative.didntAnswer') },\n {\n id: '2',\n content: t('feedback.quickResponses.negative.hardToUnderstand'),\n },\n { id: '3', content: t('feedback.quickResponses.negative.notHelpful') },\n ],\n }),\n [t],\n );\n\n const getFeedbackForm = useCallback(\n (messageId: string, sentiment: 'positive' | 'negative') => ({\n key: `feedback-${sentiment}`,\n id: `feedback-${sentiment}-${messageId}`,\n hasTextArea: true,\n title: t('feedback.form.title'),\n textAreaPlaceholder: t('feedback.form.textAreaPlaceholder'),\n submitWord: t('feedback.form.submitWord'),\n quickResponses: createQuickResponses[sentiment],\n onSubmit: (\n quickResponse: string | undefined = '0',\n additionalFeedback: string | undefined,\n ) => {\n const quickIndex = Number(quickResponse) - 1;\n const quickText =\n quickResponse !== '0'\n ? createQuickResponses[sentiment]?.[quickIndex]?.content\n : undefined;\n\n let user_feedback = '';\n\n if (quickText && additionalFeedback) {\n user_feedback = `${quickText}\\nAdditional feedback: ${additionalFeedback}`;\n } else if (quickText) {\n user_feedback = quickText;\n } else if (additionalFeedback) {\n user_feedback = additionalFeedback;\n }\n\n const botAnswerId = Number(messageId.split('-').pop());\n const userQuestionId = botAnswerId - 1;\n\n const payload: CaptureFeedback = {\n conversation_id: conversationId,\n user_feedback,\n sentiment: sentiment === 'positive' ? 1 : -1,\n user_question: messages[userQuestionId].content || '',\n llm_response: messages[botAnswerId].content || '',\n };\n\n captureFeedback(payload).then(() => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.showCompletionForm(messageId, sentiment);\n dispatch.updateButtonState(messageId, {\n sentiment: sentiment,\n feedbackSubmitted: true,\n });\n\n setTimeout(() => {\n dispatch.hideCompletionForm(messageId, sentiment);\n }, 1000);\n });\n },\n\n // eslint-disable-next-line no-console\n onClose: () => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n dispatch.updateButtonState(messageId, { sentiment: undefined });\n },\n focusOnLoad: true,\n }),\n [\n captureFeedback,\n conversationId,\n dispatch,\n messages,\n createQuickResponses,\n t,\n ],\n );\n\n const feedbackForms = useCallback(\n (messageId: string): { [key in Sentiment]: UserFeedbackProps } => ({\n positive: getFeedbackForm(messageId, 'positive'),\n negative: getFeedbackForm(messageId, 'negative'),\n }),\n [getFeedbackForm],\n );\n\n const getUserFeedbackComplete = useCallback(\n (\n messageId: string,\n sentiment: Sentiment,\n ): UserFeedbackCompleteProps | undefined => {\n const isVisible = state[messageId]?.completionForm?.[sentiment];\n if (!isVisible) return undefined;\n\n return {\n id: `feebback-completion-${sentiment}-${messageId}`,\n title: t('feedback.completion.title'),\n body: t('feedback.completion.body'),\n onClose: () => {\n dispatch.hideCompletionForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n },\n };\n },\n [state, dispatch, t],\n );\n\n const scrollToFeedbackForm = useCallback(\n (messageId: string, sentiment: Sentiment) => {\n setTimeout(() => {\n const el = document.getElementById(\n `feedback-${sentiment}-${messageId}`,\n );\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n el.focus();\n }\n }, 0);\n },\n [],\n );\n\n const speakMessage = useCallback(\n (messageId: string, content: string) => {\n if (window.speechSynthesis.speaking || window.speechSynthesis.pending) {\n window.speechSynthesis.cancel();\n\n if (\n currentSpeakingIdRef.current &&\n currentSpeakingIdRef.current !== messageId\n ) {\n dispatch.updateButtonState(currentSpeakingIdRef.current, {\n isSpeaking: false,\n });\n }\n }\n\n // Track the current SpeakingId\n currentSpeakingIdRef.current = messageId;\n\n const utterance = new SpeechSynthesisUtterance(content);\n\n utterance.onstart = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: true });\n };\n\n utterance.onend = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n utterance.onerror = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n window.speechSynthesis.speak(utterance);\n },\n [dispatch],\n );\n\n const cancelSpeaking = useCallback(\n (messageId?: string) => {\n window.speechSynthesis.cancel();\n\n currentSpeakingIdRef.current = null;\n\n if (messageId) {\n // Cancel just this one message\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n } else {\n // Cancel all messages\n Object.keys(state).forEach(id => {\n if (state[id].buttonState?.isSpeaking) {\n dispatch.updateButtonState(id, { isSpeaking: false });\n }\n });\n }\n setTimeout(() => {\n const el = document.getElementById(`listen-${messageId}`);\n if (el) {\n el.blur();\n }\n }, 10);\n },\n [state, dispatch],\n );\n\n useEffect(() => {\n return () => {\n // Stop any ongoing speech when component unmounts\n cancelSpeaking();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationId]);\n\n return useMemo(() => {\n return feedbackEnabled\n ? messages.map((message, index) => {\n if (\n message.role === 'user' ||\n (isStreaming && messages.length - 1 === index)\n )\n return message;\n\n const messageId = `${conversationId}-${message.role}-${index}`;\n const { sentiment, copied, isSpeaking } =\n state[messageId]?.buttonState || {};\n const showFeedbackForm = state[messageId]?.feedbackForm?.[sentiment];\n const userFeedbackForm =\n showFeedbackForm && feedbackForms(messageId)[sentiment];\n\n const userFeedbackComplete = getUserFeedbackComplete(\n messageId,\n sentiment,\n );\n\n const createSentimentAction = (selected: Sentiment) => ({\n isClicked: sentiment === selected,\n onClick: () => {\n if (sentiment !== selected) {\n dispatch.toggleFeedbackForm(messageId, selected);\n dispatch.updateButtonState(messageId, { sentiment: selected });\n scrollToFeedbackForm(messageId, sentiment);\n }\n },\n tooltipContent:\n selected === 'positive'\n ? t('feedback.tooltips.goodResponse')\n : t('feedback.tooltips.badResponse'),\n 'aria-expanded': sentiment === selected,\n 'aria-controls': showFeedbackForm\n ? `feedback-${sentiment}-${messageId}`\n : `feebback-completion-${sentiment}-${messageId}`,\n });\n\n const copyAction = {\n isClicked: copied,\n ref: copyButtonRef,\n tooltipContent: copied\n ? t('feedback.tooltips.copied')\n : t('feedback.tooltips.copy'),\n onClick: async () => {\n await window.navigator.clipboard.writeText(\n message.content as string,\n );\n dispatch.updateButtonState(messageId, {\n copied: true,\n });\n\n setTimeout(() => {\n dispatch.updateButtonState(messageId, { copied: false });\n copyButtonRef?.current?.blur();\n }, 1000);\n },\n };\n\n const listenAction = {\n isClicked: isSpeaking,\n ref: speakingButtonRef,\n id: `listen-${messageId}`,\n tooltipContent: isSpeaking\n ? t('feedback.tooltips.listening')\n : t('feedback.tooltips.listen'),\n onClick: () => {\n const isCurrentlySpeaking =\n state[messageId]?.buttonState?.isSpeaking;\n\n if (isCurrentlySpeaking) {\n // Stop if it's already speaking this message\n cancelSpeaking(messageId);\n } else {\n cancelSpeaking();\n speakMessage(messageId, message.content as string);\n }\n },\n };\n\n return {\n ...message,\n userFeedbackForm,\n userFeedbackComplete,\n actions: {\n positive: createSentimentAction('positive'),\n negative: createSentimentAction('negative'),\n copy: copyAction,\n listen: listenAction,\n },\n };\n })\n : messages;\n }, [\n t,\n conversationId,\n messages,\n state,\n dispatch,\n isStreaming,\n speakMessage,\n feedbackForms,\n cancelSpeaking,\n feedbackEnabled,\n getUserFeedbackComplete,\n scrollToFeedbackForm,\n ]);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -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;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState,
|
|
1
|
+
import { useState, useCallback, useRef, useEffect, useMemo } from 'react';
|
|
2
2
|
import { useNavigate, useLocation, useMatch } from 'react-router-dom';
|
|
3
3
|
import { ChatbotDisplayMode } from '@patternfly/chatbot';
|
|
4
4
|
import { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';
|
|
@@ -28,6 +28,10 @@ function useLightspeedProviderState() {
|
|
|
28
28
|
const [activeNotebookId, setActiveNotebookId] = useState(
|
|
29
29
|
void 0
|
|
30
30
|
);
|
|
31
|
+
const [settingsTab, setSettingsTabState] = useState(null);
|
|
32
|
+
const setSettingsTab = useCallback((tab) => {
|
|
33
|
+
setSettingsTabState(tab);
|
|
34
|
+
}, []);
|
|
31
35
|
const shellViewTabRef = useRef(shellViewTab);
|
|
32
36
|
shellViewTabRef.current = shellViewTab;
|
|
33
37
|
const setShellViewTab = useCallback((tab) => {
|
|
@@ -180,10 +184,16 @@ function useLightspeedProviderState() {
|
|
|
180
184
|
(id) => {
|
|
181
185
|
setCurrentConversationIdState(id);
|
|
182
186
|
if (persistedDisplayModeRef.current === ChatbotDisplayMode.embedded && isLightspeedRouteRef.current && !isOnNotebooksPathRef.current) {
|
|
183
|
-
navigate(
|
|
187
|
+
navigate(
|
|
188
|
+
{
|
|
189
|
+
pathname: lightspeedRoutePath(id),
|
|
190
|
+
search: location.search
|
|
191
|
+
},
|
|
192
|
+
{ replace: true }
|
|
193
|
+
);
|
|
184
194
|
}
|
|
185
195
|
},
|
|
186
|
-
[navigate]
|
|
196
|
+
[navigate, location.search]
|
|
187
197
|
);
|
|
188
198
|
const setDraftMessage = useCallback((message) => {
|
|
189
199
|
setDraftMessageState(message);
|
|
@@ -254,7 +264,9 @@ function useLightspeedProviderState() {
|
|
|
254
264
|
shellViewTab,
|
|
255
265
|
setShellViewTab,
|
|
256
266
|
activeNotebookId,
|
|
257
|
-
setActiveNotebookId
|
|
267
|
+
setActiveNotebookId,
|
|
268
|
+
settingsTab,
|
|
269
|
+
setSettingsTab
|
|
258
270
|
}),
|
|
259
271
|
[
|
|
260
272
|
isOpen,
|
|
@@ -272,7 +284,9 @@ function useLightspeedProviderState() {
|
|
|
272
284
|
shellViewTab,
|
|
273
285
|
setShellViewTab,
|
|
274
286
|
activeNotebookId,
|
|
275
|
-
setActiveNotebookId
|
|
287
|
+
setActiveNotebookId,
|
|
288
|
+
settingsTab,
|
|
289
|
+
setSettingsTab
|
|
276
290
|
]
|
|
277
291
|
);
|
|
278
292
|
return {
|