@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.
Files changed (99) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +26 -3
  3. package/dist/alpha.d.ts +37 -7
  4. package/dist/api/LightspeedApiClient.esm.js +57 -0
  5. package/dist/api/LightspeedApiClient.esm.js.map +1 -1
  6. package/dist/api/api.esm.js.map +1 -1
  7. package/dist/components/DeleteModal.esm.js +2 -0
  8. package/dist/components/DeleteModal.esm.js.map +1 -1
  9. package/dist/components/DeleteSavedPromptModal.esm.js +75 -0
  10. package/dist/components/DeleteSavedPromptModal.esm.js.map +1 -0
  11. package/dist/components/LightSpeedChat.esm.js +296 -168
  12. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  13. package/dist/components/LightspeedChatBoxHeader.esm.js +29 -1
  14. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  15. package/dist/components/LightspeedChatContainer.esm.js +38 -60
  16. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  17. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  18. package/dist/components/LightspeedFABContent.esm.js +9 -0
  19. package/dist/components/LightspeedFABContent.esm.js.map +1 -1
  20. package/dist/components/LightspeedPage.esm.js +11 -2
  21. package/dist/components/LightspeedPage.esm.js.map +1 -1
  22. package/dist/components/McpConfigureServerModal.esm.js +2 -3
  23. package/dist/components/McpConfigureServerModal.esm.js.map +1 -1
  24. package/dist/components/McpServersSettings.esm.js +33 -60
  25. package/dist/components/McpServersSettings.esm.js.map +1 -1
  26. package/dist/components/SavedPromptCard.esm.js +100 -0
  27. package/dist/components/SavedPromptCard.esm.js.map +1 -0
  28. package/dist/components/SavedPromptKebabMenu.esm.js +87 -0
  29. package/dist/components/SavedPromptKebabMenu.esm.js.map +1 -0
  30. package/dist/components/SavedPromptMenuItems.esm.js +52 -0
  31. package/dist/components/SavedPromptMenuItems.esm.js.map +1 -0
  32. package/dist/components/SavedPromptsEmptyState.esm.js +63 -0
  33. package/dist/components/SavedPromptsEmptyState.esm.js.map +1 -0
  34. package/dist/components/SavedPromptsList.esm.js +63 -0
  35. package/dist/components/SavedPromptsList.esm.js.map +1 -0
  36. package/dist/components/SavedPromptsSettings.esm.js +285 -0
  37. package/dist/components/SavedPromptsSettings.esm.js.map +1 -0
  38. package/dist/components/SettingsPanel.esm.js +135 -0
  39. package/dist/components/SettingsPanel.esm.js.map +1 -0
  40. package/dist/hooks/useAllModels.esm.js +2 -1
  41. package/dist/hooks/useAllModels.esm.js.map +1 -1
  42. package/dist/hooks/useConversationHistoryGroups.esm.js +71 -0
  43. package/dist/hooks/useConversationHistoryGroups.esm.js.map +1 -0
  44. package/dist/hooks/useConversations.esm.js +2 -1
  45. package/dist/hooks/useConversations.esm.js.map +1 -1
  46. package/dist/hooks/useFeedbackActions.esm.js.map +1 -1
  47. package/dist/hooks/useIaChatPermission.esm.js +15 -0
  48. package/dist/hooks/useIaChatPermission.esm.js.map +1 -0
  49. package/dist/hooks/useIaMcpToolsPermission.esm.js +15 -0
  50. package/dist/hooks/useIaMcpToolsPermission.esm.js.map +1 -0
  51. package/dist/hooks/{notebooks/useLightspeedNotebooksPermission.esm.js → useIaNotebooksPermission.esm.js} +4 -5
  52. package/dist/hooks/useIaNotebooksPermission.esm.js.map +1 -0
  53. package/dist/hooks/useLightspeedProviderState.esm.js +19 -5
  54. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  55. package/dist/hooks/useMcpConfigureModal.esm.js +5 -9
  56. package/dist/hooks/useMcpConfigureModal.esm.js.map +1 -1
  57. package/dist/hooks/useNotebookConversationIds.esm.js +2 -1
  58. package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -1
  59. package/dist/hooks/useQuestionValidation.esm.js +3 -2
  60. package/dist/hooks/useQuestionValidation.esm.js.map +1 -1
  61. package/dist/hooks/useSavedPromptActions.esm.js +64 -0
  62. package/dist/hooks/useSavedPromptActions.esm.js.map +1 -0
  63. package/dist/hooks/useSavedPrompts.esm.js +75 -0
  64. package/dist/hooks/useSavedPrompts.esm.js.map +1 -0
  65. package/dist/hooks/useSavedPromptsSettings.esm.js +65 -0
  66. package/dist/hooks/useSavedPromptsSettings.esm.js.map +1 -0
  67. package/dist/hooks/useSettingsPanelUrlState.esm.js +95 -0
  68. package/dist/hooks/useSettingsPanelUrlState.esm.js.map +1 -0
  69. package/dist/hooks/useWelcomePrompts.esm.js +17 -6
  70. package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
  71. package/dist/translations/de.esm.js +40 -8
  72. package/dist/translations/de.esm.js.map +1 -1
  73. package/dist/translations/es.esm.js +40 -8
  74. package/dist/translations/es.esm.js.map +1 -1
  75. package/dist/translations/fr.esm.js +40 -8
  76. package/dist/translations/fr.esm.js.map +1 -1
  77. package/dist/translations/it.esm.js +40 -8
  78. package/dist/translations/it.esm.js.map +1 -1
  79. package/dist/translations/ja.esm.js +40 -8
  80. package/dist/translations/ja.esm.js.map +1 -1
  81. package/dist/translations/ref.esm.js +40 -10
  82. package/dist/translations/ref.esm.js.map +1 -1
  83. package/dist/utils/buildConversationHistoryGroups.esm.js +241 -0
  84. package/dist/utils/buildConversationHistoryGroups.esm.js.map +1 -0
  85. package/dist/utils/prompt-utils.esm.js +18 -1
  86. package/dist/utils/prompt-utils.esm.js.map +1 -1
  87. package/package.json +5 -14
  88. package/dist/components/PermissionRequiredIcon.esm.js +0 -18
  89. package/dist/components/PermissionRequiredIcon.esm.js.map +0 -1
  90. package/dist/components/PermissionRequiredState.esm.js +0 -88
  91. package/dist/components/PermissionRequiredState.esm.js.map +0 -1
  92. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +0 -1
  93. package/dist/hooks/useLightspeedDeletePermission.esm.js +0 -12
  94. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +0 -1
  95. package/dist/hooks/useLightspeedUpdatePermission.esm.js +0 -12
  96. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +0 -1
  97. package/dist/hooks/useLightspeedViewPermission.esm.js +0 -16
  98. package/dist/hooks/useLightspeedViewPermission.esm.js.map +0 -1
  99. 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":";;;;;;;;AAmDA,MAAM,SAAA,GAAY,UAAA,EAAW,CAAE,CAAA,KAAA,MAAU;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,QAAA;AAAA,IACV,eAAA,EACE;AAAA,GACJ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,YAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAA,EAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAC,CAAC,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,GAC1F;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IAC9B,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IAChD,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,IAC1B,YAAA,EAAc,uBAAA;AAAA,IACd,UAAA,EAAY,iCAAA;AAAA,IACZ,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA;AAC5B,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc,CAAA,qDAAA,EAAwD,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA,YAAA,CAAA;AAAA,IAChG,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW,CAAA;AAAA,IACX,QAAA,EAAU;AAAA;AAEd,CAAA,CAAE,CAAA;AAEK,MAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,0BAAA;AAAA,EACA,eAAA,GAAkB;AACpB,CAAA,KAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,EAAU;AAC9B,EAAA,MAAM,UAAA,GAAa,eAAA;AACnB,EAAA,MAAM,mBAAA,GAAsB,IAAA;AAC5B,EAAA,MAAM,aAAa,UAAA,IAAc,mBAAA;AACjC,EAAA,MAAM,YAAA,GAAe,aAAa,SAAA,GAAY,eAAA;AAE9C,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,EACtB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAM,YAAA,EAAa,IAAA,EAAK,MAAK,IAAA,EAC3B,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,EAAE,6BAA6B,CAAA;AAAA,UAC3C,IAAA,sBAAO,SAAA,EAAA,EAAU,CAAA;AAAA,UACjB,OAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS;AAAA;AAAA;AACX,KAAA,EACF,CAAA;AAAA,IAEC,UAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,MAAA,EACrB,QAAA,EAAA;AAAA,MAAA,UAAA,oBACC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,GAAG,OAAA,CAAQ,SAAS,IAAI,YAAA,KAAiB,aAAA,GAAgB,OAAA,CAAQ,eAAA,GAAkB,EAAE,CAAA,CAAA;AAAA,UAChG,OAAA,EAAS,MAAM,WAAA,CAAY,aAAa,CAAA;AAAA,UAEvC,YAAE,oBAAoB;AAAA;AAAA,OACzB;AAAA,MAGA,gBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,GAAG,OAAA,CAAQ,SAAS,IAAI,YAAA,KAAiB,eAAA,GAAkB,OAAA,CAAQ,eAAA,GAAkB,EAAE,CAAA,CAAA;AAAA,UAClG,OAAA,EAAS,MAAM,WAAA,CAAY,eAAe,CAAA;AAAA,UAEzC,YAAE,wBAAwB;AAAA;AAAA;AAC7B,KAAA,EAEJ,CAAA;AAAA,oBAGF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,UAAA,EACrB,QAAA,EAAA;AAAA,MAAA,YAAA,KAAiB,aAAA,IAAiB,UAAA,oBACjC,GAAA,CAAC,kBAAA,EAAA,EAAmB,eAAA,EAAkC,CAAA;AAAA,MAEvD,iBAAiB,eAAA,oBAChB,GAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,qBAAA;AAAA,UACA,oBAAA;AAAA,UACA,cAAA,EAAgB,yBAAA;AAAA,UAChB,cAAA,EAAgB,yBAAA;AAAA,UAChB,eAAA;AAAA,UACA,YAAA;AAAA,UACA,kBAAA;AAAA,UACA,mBAAA;AAAA,UACA,iBAAA;AAAA,UACA,mBAAA;AAAA,UACA,eAAA,EAAiB;AAAA;AAAA;AACnB,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -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,eAAe,MAAyC;AACnE,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,SAAA,EAAW,MAAO,EAAA,GAAK,CAAA;AAAA;AAAA,IACvB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACH;;;;"}
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,mBAAmB,MAA+C;AAC7E,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,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
+ {"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 useLightspeedNotebooksPermission = () => {
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 { useLightspeedNotebooksPermission };
16
- //# sourceMappingURL=useLightspeedNotebooksPermission.esm.js.map
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, useRef, useCallback, useEffect, useMemo } from 'react';
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(lightspeedRoutePath(id), { replace: true });
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 {