@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.0.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 (238) hide show
  1. package/CHANGELOG.md +681 -0
  2. package/README.md +378 -0
  3. package/config.d.ts +70 -0
  4. package/dist/alpha.d.ts +285 -0
  5. package/dist/alpha.esm.js +3 -0
  6. package/dist/alpha.esm.js.map +1 -0
  7. package/dist/api/LightspeedApiClient.esm.js +234 -0
  8. package/dist/api/LightspeedApiClient.esm.js.map +1 -0
  9. package/dist/api/NotebooksApiClient.esm.js +179 -0
  10. package/dist/api/NotebooksApiClient.esm.js.map +1 -0
  11. package/dist/api/api.esm.js +8 -0
  12. package/dist/api/api.esm.js.map +1 -0
  13. package/dist/api/notebooksApi.esm.js +10 -0
  14. package/dist/api/notebooksApi.esm.js.map +1 -0
  15. package/dist/components/Attachment.esm.js +108 -0
  16. package/dist/components/Attachment.esm.js.map +1 -0
  17. package/dist/components/AttachmentContext.esm.js +125 -0
  18. package/dist/components/AttachmentContext.esm.js.map +1 -0
  19. package/dist/components/CollapsedHistoryStrip.esm.js +87 -0
  20. package/dist/components/CollapsedHistoryStrip.esm.js.map +1 -0
  21. package/dist/components/DeleteModal.esm.js +92 -0
  22. package/dist/components/DeleteModal.esm.js.map +1 -0
  23. package/dist/components/FilePreview.esm.js +49 -0
  24. package/dist/components/FilePreview.esm.js.map +1 -0
  25. package/dist/components/LightSpeedChat.esm.js +1898 -0
  26. package/dist/components/LightSpeedChat.esm.js.map +1 -0
  27. package/dist/components/LightspeedChatBox.esm.js +252 -0
  28. package/dist/components/LightspeedChatBox.esm.js.map +1 -0
  29. package/dist/components/LightspeedChatBoxHeader.esm.js +210 -0
  30. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -0
  31. package/dist/components/LightspeedChatContainer.esm.js +162 -0
  32. package/dist/components/LightspeedChatContainer.esm.js.map +1 -0
  33. package/dist/components/LightspeedChatModelsState.esm.js +198 -0
  34. package/dist/components/LightspeedChatModelsState.esm.js.map +1 -0
  35. package/dist/components/LightspeedDrawerContext.esm.js +15 -0
  36. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -0
  37. package/dist/components/LightspeedDrawerProvider.esm.js +44 -0
  38. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -0
  39. package/dist/components/LightspeedDrawerStateExposer.esm.js +34 -0
  40. package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -0
  41. package/dist/components/LightspeedFAB.esm.js +6 -0
  42. package/dist/components/LightspeedFAB.esm.js.map +1 -0
  43. package/dist/components/LightspeedFABContent.esm.js +65 -0
  44. package/dist/components/LightspeedFABContent.esm.js.map +1 -0
  45. package/dist/components/LightspeedIcon.esm.js +46 -0
  46. package/dist/components/LightspeedIcon.esm.js.map +1 -0
  47. package/dist/components/LightspeedPage.esm.js +31 -0
  48. package/dist/components/LightspeedPage.esm.js.map +1 -0
  49. package/dist/components/McpServersSettings.esm.js +953 -0
  50. package/dist/components/McpServersSettings.esm.js.map +1 -0
  51. package/dist/components/McpSettingsIcon.esm.js +18 -0
  52. package/dist/components/McpSettingsIcon.esm.js.map +1 -0
  53. package/dist/components/MessageBarModelSelector.esm.js +92 -0
  54. package/dist/components/MessageBarModelSelector.esm.js.map +1 -0
  55. package/dist/components/PermissionRequiredIcon.esm.js +18 -0
  56. package/dist/components/PermissionRequiredIcon.esm.js.map +1 -0
  57. package/dist/components/PermissionRequiredState.esm.js +88 -0
  58. package/dist/components/PermissionRequiredState.esm.js.map +1 -0
  59. package/dist/components/RenameConversationModal.esm.js +157 -0
  60. package/dist/components/RenameConversationModal.esm.js.map +1 -0
  61. package/dist/components/Router.esm.js +35 -0
  62. package/dist/components/Router.esm.js.map +1 -0
  63. package/dist/components/SourcesChipModal.esm.js +124 -0
  64. package/dist/components/SourcesChipModal.esm.js.map +1 -0
  65. package/dist/components/ToolCallContent.esm.js +208 -0
  66. package/dist/components/ToolCallContent.esm.js.map +1 -0
  67. package/dist/components/Trans.esm.js +33 -0
  68. package/dist/components/Trans.esm.js.map +1 -0
  69. package/dist/components/notebooks/AddDocumentModal.esm.js +271 -0
  70. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -0
  71. package/dist/components/notebooks/DeleteDocumentModal.esm.js +131 -0
  72. package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -0
  73. package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
  74. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
  75. package/dist/components/notebooks/DocumentSidebar.esm.js +235 -0
  76. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -0
  77. package/dist/components/notebooks/FileListItem.esm.js +94 -0
  78. package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
  79. package/dist/components/notebooks/FileTypeIcon.esm.js +59 -0
  80. package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -0
  81. package/dist/components/notebooks/NotebookCard.esm.js +118 -0
  82. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
  83. package/dist/components/notebooks/NotebookView.esm.js +681 -0
  84. package/dist/components/notebooks/NotebookView.esm.js.map +1 -0
  85. package/dist/components/notebooks/NotebooksTab.esm.js +71 -0
  86. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
  87. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +142 -0
  88. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -0
  89. package/dist/components/notebooks/RenameNotebookModal.esm.js +187 -0
  90. package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -0
  91. package/dist/components/notebooks/SidebarCollapseIcon.esm.js +50 -0
  92. package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -0
  93. package/dist/components/notebooks/UploadResourceScreen.esm.js +79 -0
  94. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -0
  95. package/dist/const.esm.js +74 -0
  96. package/dist/const.esm.js.map +1 -0
  97. package/dist/dev.d.ts +2 -0
  98. package/dist/dev.esm.js +48 -0
  99. package/dist/dev.esm.js.map +1 -0
  100. package/dist/hooks/notebooks/useCreateNotebook.esm.js +19 -0
  101. package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -0
  102. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +24 -0
  103. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -0
  104. package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
  105. package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
  106. package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js +40 -0
  107. package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js.map +1 -0
  108. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +15 -0
  109. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -0
  110. package/dist/hooks/notebooks/useNotebookDocuments.esm.js +18 -0
  111. package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -0
  112. package/dist/hooks/notebooks/useNotebookSession.esm.js +18 -0
  113. package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -0
  114. package/dist/hooks/notebooks/useNotebookSessions.esm.js +18 -0
  115. package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -0
  116. package/dist/hooks/notebooks/useRenameNotebook.esm.js +19 -0
  117. package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -0
  118. package/dist/hooks/notebooks/useUploadDocument.esm.js +28 -0
  119. package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -0
  120. package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
  121. package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
  122. package/dist/hooks/useAllModels.esm.js +20 -0
  123. package/dist/hooks/useAllModels.esm.js.map +1 -0
  124. package/dist/hooks/useAutoScroll.esm.js +78 -0
  125. package/dist/hooks/useAutoScroll.esm.js.map +1 -0
  126. package/dist/hooks/useBackstageUserIdentity.esm.js +14 -0
  127. package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -0
  128. package/dist/hooks/useBufferedMessages.esm.js +27 -0
  129. package/dist/hooks/useBufferedMessages.esm.js.map +1 -0
  130. package/dist/hooks/useCaptureFeedback.esm.js +21 -0
  131. package/dist/hooks/useCaptureFeedback.esm.js.map +1 -0
  132. package/dist/hooks/useConversationMessages.esm.js +544 -0
  133. package/dist/hooks/useConversationMessages.esm.js.map +1 -0
  134. package/dist/hooks/useConversations.esm.js +25 -0
  135. package/dist/hooks/useConversations.esm.js.map +1 -0
  136. package/dist/hooks/useCreateCoversationMessage.esm.js +33 -0
  137. package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -0
  138. package/dist/hooks/useDeleteConversation.esm.js +39 -0
  139. package/dist/hooks/useDeleteConversation.esm.js.map +1 -0
  140. package/dist/hooks/useDisplayModeSettings.esm.js +57 -0
  141. package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -0
  142. package/dist/hooks/useFeedbackActions.esm.js +275 -0
  143. package/dist/hooks/useFeedbackActions.esm.js.map +1 -0
  144. package/dist/hooks/useFeedbackState.esm.js +93 -0
  145. package/dist/hooks/useFeedbackState.esm.js.map +1 -0
  146. package/dist/hooks/useFeedbackStatus.esm.js +14 -0
  147. package/dist/hooks/useFeedbackStatus.esm.js.map +1 -0
  148. package/dist/hooks/useIsMobile.esm.js +14 -0
  149. package/dist/hooks/useIsMobile.esm.js.map +1 -0
  150. package/dist/hooks/useLastOpenedConversation.esm.js +51 -0
  151. package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -0
  152. package/dist/hooks/useLightspeedDeletePermission.esm.js +12 -0
  153. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -0
  154. package/dist/hooks/useLightspeedDrawerContext.esm.js +15 -0
  155. package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -0
  156. package/dist/hooks/useLightspeedProviderState.esm.js +277 -0
  157. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
  158. package/dist/hooks/useLightspeedUpdatePermission.esm.js +12 -0
  159. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -0
  160. package/dist/hooks/useLightspeedViewPermission.esm.js +18 -0
  161. package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -0
  162. package/dist/hooks/useNotebookConversationIds.esm.js +19 -0
  163. package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -0
  164. package/dist/hooks/useNotebookWelcomePrompts.esm.js +14 -0
  165. package/dist/hooks/useNotebookWelcomePrompts.esm.js.map +1 -0
  166. package/dist/hooks/usePinnedChatsSettings.esm.js +118 -0
  167. package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -0
  168. package/dist/hooks/useQuestionValidation.esm.js +16 -0
  169. package/dist/hooks/useQuestionValidation.esm.js.map +1 -0
  170. package/dist/hooks/useRenameConversation.esm.js +44 -0
  171. package/dist/hooks/useRenameConversation.esm.js.map +1 -0
  172. package/dist/hooks/useSortSettings.esm.js +60 -0
  173. package/dist/hooks/useSortSettings.esm.js.map +1 -0
  174. package/dist/hooks/useStopConversation.esm.js +18 -0
  175. package/dist/hooks/useStopConversation.esm.js.map +1 -0
  176. package/dist/hooks/useTranslation.esm.js +7 -0
  177. package/dist/hooks/useTranslation.esm.js.map +1 -0
  178. package/dist/hooks/useWelcomePrompts.esm.js +36 -0
  179. package/dist/hooks/useWelcomePrompts.esm.js.map +1 -0
  180. package/dist/images/bot-avatar-dark.svg +4 -0
  181. package/dist/images/bot-avatar.svg +4 -0
  182. package/dist/images/permission-required.svg +319 -0
  183. package/dist/images/user-avatar.svg +4 -0
  184. package/dist/index.d.ts +113 -0
  185. package/dist/index.esm.js +137 -0
  186. package/dist/index.esm.js.map +1 -0
  187. package/dist/intelligent-assistant-fab-module.d.ts +4 -0
  188. package/dist/intelligent-assistant-fab-module.esm.js +2 -0
  189. package/dist/intelligent-assistant-fab-module.esm.js.map +1 -0
  190. package/dist/intelligent-assistant-translations-module.d.ts +4 -0
  191. package/dist/intelligent-assistant-translations-module.esm.js +2 -0
  192. package/dist/intelligent-assistant-translations-module.esm.js.map +1 -0
  193. package/dist/legacy.d.ts +75 -0
  194. package/dist/legacy.esm.js +13 -0
  195. package/dist/legacy.esm.js.map +1 -0
  196. package/dist/plugin.esm.js +84 -0
  197. package/dist/plugin.esm.js.map +1 -0
  198. package/dist/routes.esm.js +23 -0
  199. package/dist/routes.esm.js.map +1 -0
  200. package/dist/translations/de.esm.js +278 -0
  201. package/dist/translations/de.esm.js.map +1 -0
  202. package/dist/translations/es.esm.js +278 -0
  203. package/dist/translations/es.esm.js.map +1 -0
  204. package/dist/translations/fr.esm.js +278 -0
  205. package/dist/translations/fr.esm.js.map +1 -0
  206. package/dist/translations/index.esm.js +16 -0
  207. package/dist/translations/index.esm.js.map +1 -0
  208. package/dist/translations/it.esm.js +278 -0
  209. package/dist/translations/it.esm.js.map +1 -0
  210. package/dist/translations/ja.esm.js +278 -0
  211. package/dist/translations/ja.esm.js.map +1 -0
  212. package/dist/translations/ref.esm.js +315 -0
  213. package/dist/translations/ref.esm.js.map +1 -0
  214. package/dist/types.esm.js +9 -0
  215. package/dist/types.esm.js.map +1 -0
  216. package/dist/utils/attachment-utils.esm.js +30 -0
  217. package/dist/utils/attachment-utils.esm.js.map +1 -0
  218. package/dist/utils/formatToolResponseForMarkdown.esm.js +98 -0
  219. package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
  220. package/dist/utils/generateClassName.esm.js +12 -0
  221. package/dist/utils/generateClassName.esm.js.map +1 -0
  222. package/dist/utils/lightspeed-chatbox-utils.esm.js +232 -0
  223. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -0
  224. package/dist/utils/notebook-upload-utils.esm.js +48 -0
  225. package/dist/utils/notebook-upload-utils.esm.js.map +1 -0
  226. package/dist/utils/notebooks-utils.esm.js +25 -0
  227. package/dist/utils/notebooks-utils.esm.js.map +1 -0
  228. package/dist/utils/prompt-utils.esm.js +17 -0
  229. package/dist/utils/prompt-utils.esm.js.map +1 -0
  230. package/dist/utils/queryClient.esm.js +6 -0
  231. package/dist/utils/queryClient.esm.js.map +1 -0
  232. package/dist/utils/reasoningParser.esm.js +33 -0
  233. package/dist/utils/reasoningParser.esm.js.map +1 -0
  234. package/dist/utils/toolCallMapper.esm.js +15 -0
  235. package/dist/utils/toolCallMapper.esm.js.map +1 -0
  236. package/dist/utils/user-utils.esm.js +7 -0
  237. package/dist/utils/user-utils.esm.js.map +1 -0
  238. package/package.json +182 -0
@@ -0,0 +1,681 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useCallback, useEffect, useRef } from 'react';
3
+ import { useApi, configApiRef } from '@backstage/core-plugin-api';
4
+ import { makeStyles, Typography } from '@material-ui/core';
5
+ import { ChatbotFooter, MessageBar, ChatbotContent } from '@patternfly/chatbot';
6
+ import { DrawerPanelContent, AlertGroup, Alert, AlertVariant, AlertActionCloseButton, Drawer, DrawerContent, DrawerContentBody, Tooltip, Button } from '@patternfly/react-core';
7
+ import { TimesIcon } from '@patternfly/react-icons';
8
+ import { useQueryClient } from '@tanstack/react-query';
9
+ import { notebooksApiRef } from '../../api/notebooksApi.esm.js';
10
+ import { TEMP_CONVERSATION_ID, UNTITLED_NOTEBOOK_NAME, NOTEBOOK_MAX_FILES } from '../../const.esm.js';
11
+ import { useCreateNotebookMessage } from '../../hooks/notebooks/useCreateNotebookMessage.esm.js';
12
+ import { useDocumentStatusPolling } from '../../hooks/notebooks/useDocumentStatusPolling.esm.js';
13
+ import { useConversationMessages } from '../../hooks/useConversationMessages.esm.js';
14
+ import { useNotebookWelcomePrompts } from '../../hooks/useNotebookWelcomePrompts.esm.js';
15
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
16
+ import { ChatbotFootnoteWithIcon } from '../../utils/lightspeed-chatbox-utils.esm.js';
17
+ import { LightspeedChatBox } from '../LightspeedChatBox.esm.js';
18
+ import { AddDocumentModal } from './AddDocumentModal.esm.js';
19
+ import { DeleteDocumentModal } from './DeleteDocumentModal.esm.js';
20
+ import { DocumentSidebar } from './DocumentSidebar.esm.js';
21
+ import { OverwriteConfirmModal } from './OverwriteConfirmModal.esm.js';
22
+ import { SidebarExpandIcon, AddCircleFilledIcon } from './SidebarCollapseIcon.esm.js';
23
+ import { UploadResourceScreen } from './UploadResourceScreen.esm.js';
24
+
25
+ const useStyles = makeStyles((theme) => ({
26
+ root: {
27
+ display: "flex",
28
+ flexDirection: "column",
29
+ flex: 1,
30
+ minHeight: 0,
31
+ height: "100%",
32
+ backgroundColor: "var(--pf-t--global--background--color--primary--default)"
33
+ },
34
+ drawerContainer: {
35
+ flex: 1,
36
+ minHeight: 0,
37
+ "& .pf-v6-c-drawer__panel, & .pf-v5-c-drawer__panel": {
38
+ backgroundColor: "var(--pf-t--global--background--color--floating--default) !important"
39
+ },
40
+ "& .pf-v6-c-drawer__panel-main, & .pf-v5-c-drawer__panel-main": {
41
+ backgroundColor: "var(--pf-t--global--background--color--floating--default) !important"
42
+ },
43
+ "& .pf-v6-c-drawer__panel-body, & .pf-v5-c-drawer__panel-body": {
44
+ backgroundColor: "var(--pf-t--global--background--color--floating--default) !important"
45
+ },
46
+ "& .pf-v6-c-drawer__splitter, & .pf-v5-c-drawer__splitter": {
47
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)"
48
+ }
49
+ },
50
+ expandStrip: {
51
+ display: "flex",
52
+ flexDirection: "column",
53
+ alignItems: "center",
54
+ paddingTop: theme.spacing(1.5),
55
+ gap: theme.spacing(1),
56
+ borderRight: "1px solid var(--pf-t--global--border--color--default)",
57
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)"
58
+ },
59
+ addIconButton: {
60
+ padding: 0,
61
+ minWidth: 0,
62
+ lineHeight: 1
63
+ },
64
+ mainArea: {
65
+ display: "flex",
66
+ flexDirection: "row",
67
+ height: "100%",
68
+ minWidth: 0
69
+ },
70
+ topBar: {
71
+ display: "flex",
72
+ justifyContent: "flex-end",
73
+ padding: `${theme.spacing(1.5)}px ${theme.spacing(2)}px`,
74
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)"
75
+ },
76
+ closeButton: {
77
+ textTransform: "none"
78
+ },
79
+ mainContent: {
80
+ display: "flex",
81
+ flexDirection: "column",
82
+ flex: 1,
83
+ minHeight: 0
84
+ },
85
+ drawerContentBody: {
86
+ backgroundColor: "var(--pf-t--global--background--color--primary--default)",
87
+ height: "100%"
88
+ },
89
+ contentColumn: {
90
+ display: "flex",
91
+ flexDirection: "column",
92
+ flex: 1,
93
+ minWidth: 0,
94
+ minHeight: 0,
95
+ overflow: "hidden"
96
+ },
97
+ notebookDisclaimerStrip: {
98
+ width: "100%",
99
+ maxWidth: "unset",
100
+ margin: 0,
101
+ padding: `0 0 ${theme.spacing(1)}px`,
102
+ boxSizing: "border-box",
103
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)",
104
+ "& .pf-v6-c-alert, & .pf-v5-c-alert": {
105
+ backgroundColor: "var(--pf-t--global--background--color--secondary--default) !important"
106
+ },
107
+ "& .pf-v6-c-alert__content, & .pf-v5-c-alert__content": {
108
+ backgroundColor: "transparent !important"
109
+ },
110
+ "& .pf-v6-c-alert__body, & .pf-v5-c-alert__body": {
111
+ backgroundColor: "transparent !important"
112
+ },
113
+ "& .pf-v6-c-alert__description, & .pf-v5-c-alert__description": {
114
+ backgroundColor: "transparent !important"
115
+ }
116
+ },
117
+ notebookDisclaimerInner: {
118
+ width: "95%",
119
+ maxWidth: "unset",
120
+ margin: "0 auto"
121
+ },
122
+ toastAlertGroup: {
123
+ "--pf-v6-c-alert-group--m-toast--InsetInlineEnd": `${theme.spacing(2.5)}px`,
124
+ "--pf-v6-c-alert-group--m-toast--InsetBlockStart": `${theme.spacing(2.5)}px`,
125
+ "--pf-v6-c-alert-group--m-toast--MaxWidth": "350px",
126
+ "--pf-v6-c-alert-group--m-toast--ZIndex": "9999"
127
+ },
128
+ toastAlert: {
129
+ maxWidth: "350px",
130
+ "& .pf-v6-c-alert__title": {
131
+ margin: 0
132
+ }
133
+ },
134
+ welcomeContainer: {
135
+ display: "flex",
136
+ flexDirection: "column",
137
+ flex: 1,
138
+ minHeight: 0,
139
+ overflow: "auto",
140
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)"
141
+ },
142
+ notebookEmptyUpload: {
143
+ flex: 1,
144
+ display: "flex",
145
+ flexDirection: "column",
146
+ minHeight: 0,
147
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)"
148
+ },
149
+ notebookContentArea: {
150
+ width: "95%",
151
+ maxWidth: "unset",
152
+ margin: `${theme.spacing(3)}px auto 0 auto`,
153
+ padding: 0
154
+ },
155
+ notebookHeading: {
156
+ fontSize: "2rem",
157
+ fontWeight: 500,
158
+ lineHeight: 1.25,
159
+ padding: `${theme.spacing(1)}px 0`
160
+ },
161
+ notebookSummary: {
162
+ fontSize: "1rem",
163
+ lineHeight: 2,
164
+ color: "var(--pf-t--global--text--color--regular)",
165
+ paddingTop: theme.spacing(0.5)
166
+ },
167
+ promptSuggestions: {
168
+ display: "flex",
169
+ flexWrap: "wrap",
170
+ gap: theme.spacing(1),
171
+ width: "95%",
172
+ maxWidth: "unset",
173
+ margin: `${theme.spacing(3)}px auto ${theme.spacing(3)}px auto`,
174
+ justifyContent: "flex-start"
175
+ },
176
+ promptPill: {
177
+ appearance: "none",
178
+ background: "transparent",
179
+ border: `1px solid var(--pf-t--global--border--color--default)`,
180
+ borderRadius: "999px",
181
+ padding: `${theme.spacing(1)}px ${theme.spacing(2.5)}px`,
182
+ fontSize: "0.875rem",
183
+ color: "var(--pf-t--global--text--color--regular)",
184
+ cursor: "pointer",
185
+ transition: "background-color 0.15s, border-color 0.15s",
186
+ "&:hover": {
187
+ backgroundColor: "var(--pf-t--global--background--color--secondary--default)",
188
+ borderColor: "var(--pf-t--global--border--color--hover)"
189
+ }
190
+ },
191
+ footer: {
192
+ backgroundColor: "var(--pf-t--global--background--color--floating--default) !important",
193
+ "&>.pf-chatbot__footer-container": {
194
+ width: "95% !important",
195
+ maxWidth: "unset !important"
196
+ },
197
+ "& .pf-chatbot__message-bar": {
198
+ backgroundColor: theme.palette.type === "light" ? theme.palette.grey[100] : "var(--pf-t--global--background--color--secondary--default)"
199
+ },
200
+ "& .pf-chatbot__button--send, & .pf-chatbot__button--microphone": {
201
+ "--pf-v6-c-button--BorderRadius": "var(--pf-t--global--border--radius--pill)",
202
+ borderRadius: "var(--pf-t--global--border--radius--pill) !important"
203
+ }
204
+ },
205
+ chatContent: {
206
+ minHeight: 0,
207
+ display: "flex",
208
+ flexDirection: "column",
209
+ flex: 1,
210
+ overflow: "auto"
211
+ }
212
+ }));
213
+ const NotebookView = ({
214
+ sessionId,
215
+ notebookName = UNTITLED_NOTEBOOK_NAME,
216
+ documents = [],
217
+ isDocumentsFetching = false,
218
+ metadata,
219
+ topicSummary,
220
+ userName,
221
+ avatar,
222
+ profileLoading,
223
+ topicRestrictionEnabled,
224
+ onClose
225
+ }) => {
226
+ const classes = useStyles();
227
+ const { t } = useTranslation();
228
+ const queryClient = useQueryClient();
229
+ const configApi = useApi(configApiRef);
230
+ const notebooksApi = useApi(notebooksApiRef);
231
+ const { mutateAsync: notebookCreateMessage } = useCreateNotebookMessage();
232
+ const notebookModel = configApi.getOptionalString(
233
+ "intelligent-assistant.notebooks.queryDefaults.model"
234
+ ) || "";
235
+ const [conversationId, setConversationId] = useState(
236
+ metadata?.conversation_id ?? TEMP_CONVERSATION_ID
237
+ );
238
+ const [isSendButtonDisabled, setIsSendButtonDisabled] = useState(false);
239
+ const [announcement, setAnnouncement] = useState(
240
+ void 0
241
+ );
242
+ const [deletingDocumentIds, setDeletingDocumentIds] = useState(
243
+ /* @__PURE__ */ new Set()
244
+ );
245
+ const [deleteDocumentTarget, setDeleteDocumentTarget] = useState(null);
246
+ const handleDeleteDocument = useCallback((documentId) => {
247
+ setDeleteDocumentTarget({ id: documentId, name: documentId });
248
+ }, []);
249
+ const onComplete = useCallback(
250
+ (message) => {
251
+ setIsSendButtonDisabled(false);
252
+ setAnnouncement(`Message from Bot: ${message}`);
253
+ queryClient.invalidateQueries({
254
+ queryKey: ["conversationMessages", conversationId]
255
+ });
256
+ },
257
+ [queryClient, conversationId]
258
+ );
259
+ const onStart = useCallback((conv_id) => {
260
+ setConversationId(conv_id);
261
+ }, []);
262
+ const createMessageAdapter = useCallback(
263
+ async (vars) => {
264
+ return notebookCreateMessage({
265
+ prompt: vars.prompt,
266
+ sessionId
267
+ });
268
+ },
269
+ [notebookCreateMessage, sessionId]
270
+ );
271
+ const { conversationMessages, handleInputPrompt, scrollToBottomRef } = useConversationMessages(
272
+ conversationId,
273
+ userName,
274
+ notebookModel,
275
+ "",
276
+ avatar,
277
+ onComplete,
278
+ onStart,
279
+ createMessageAdapter
280
+ );
281
+ const [messages, setMessages] = useState(conversationMessages);
282
+ useEffect(() => {
283
+ setMessages(conversationMessages);
284
+ }, [conversationMessages]);
285
+ const sendMessage = useCallback(
286
+ (message) => {
287
+ setAnnouncement(
288
+ t("conversation.announcement.userMessage", {
289
+ prompt: message.toString()
290
+ })
291
+ );
292
+ handleInputPrompt(message.toString(), []);
293
+ setIsSendButtonDisabled(true);
294
+ },
295
+ [handleInputPrompt, t]
296
+ );
297
+ const notebookPrompts = useNotebookWelcomePrompts();
298
+ const welcomePrompts = notebookPrompts.map((title) => ({
299
+ title,
300
+ onClick: () => sendMessage(title)
301
+ }));
302
+ const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
303
+ const [isUploadModalOpen, setIsUploadModalOpen] = useState(false);
304
+ const [uploadingFileNames, setUploadingFileNames] = useState([]);
305
+ const [pendingUploads, setPendingUploads] = useState([]);
306
+ const [toastAlerts, setToastAlerts] = useState([]);
307
+ const processedIds = useRef(/* @__PURE__ */ new Set());
308
+ const [completedFileNames, setCompletedFileNames] = useState(
309
+ /* @__PURE__ */ new Set()
310
+ );
311
+ const [filesToOverwrite, setFilesToOverwrite] = useState([]);
312
+ const [isOverwriteModalOpen, setIsOverwriteModalOpen] = useState(false);
313
+ const [filesToAddToModal, setFilesToAddToModal] = useState([]);
314
+ const confirmDeleteDocument = useCallback(async () => {
315
+ if (!deleteDocumentTarget) return;
316
+ const { id: documentId, name: documentName } = deleteDocumentTarget;
317
+ setDeleteDocumentTarget(null);
318
+ setDeletingDocumentIds((prev) => new Set(prev).add(documentId));
319
+ try {
320
+ await notebooksApi.deleteDocument(sessionId, documentId);
321
+ queryClient.invalidateQueries({
322
+ queryKey: ["notebooks", "documents", sessionId]
323
+ });
324
+ setToastAlerts((prev) => [
325
+ {
326
+ key: Date.now() + documentId,
327
+ title: t("notebook.document.delete.success", {
328
+ documentName
329
+ }),
330
+ variant: "success"
331
+ },
332
+ ...prev
333
+ ]);
334
+ } finally {
335
+ setDeletingDocumentIds((prev) => {
336
+ const next = new Set(prev);
337
+ next.delete(documentId);
338
+ return next;
339
+ });
340
+ }
341
+ }, [deleteDocumentTarget, notebooksApi, sessionId, queryClient, t]);
342
+ const handleOpenUploadModal = () => setIsUploadModalOpen(true);
343
+ const handleCloseUploadModal = () => setIsUploadModalOpen(false);
344
+ const handleFilesUploading = (files) => {
345
+ setUploadingFileNames((prev) => {
346
+ const newNames = files.map((f) => f.name).filter((name) => !prev.includes(name));
347
+ return [...prev, ...newNames];
348
+ });
349
+ };
350
+ const handleUploadStarted = (info) => {
351
+ processedIds.current.delete(info.documentId);
352
+ setPendingUploads((prev) => [
353
+ ...prev,
354
+ { fileName: info.fileName, documentId: info.documentId }
355
+ ]);
356
+ };
357
+ const handleUploadFailed = (fileName) => {
358
+ setUploadingFileNames((prev) => prev.filter((n) => n !== fileName));
359
+ setToastAlerts((prev) => [
360
+ {
361
+ key: Date.now() + fileName,
362
+ title: t("notebook.upload.failed", {
363
+ fileName
364
+ }),
365
+ variant: "danger"
366
+ },
367
+ ...prev
368
+ ]);
369
+ };
370
+ const handleDuplicatesFound = (files) => {
371
+ setFilesToOverwrite(files);
372
+ setIsOverwriteModalOpen(true);
373
+ };
374
+ const handleOverwriteConfirm = () => {
375
+ const files = filesToOverwrite;
376
+ setIsOverwriteModalOpen(false);
377
+ setFilesToOverwrite([]);
378
+ if (files.length === 0) return;
379
+ setFilesToAddToModal(files);
380
+ };
381
+ const handleFilesAddedToModal = () => {
382
+ setFilesToAddToModal([]);
383
+ };
384
+ const handleOverwriteCancel = () => {
385
+ setIsOverwriteModalOpen(false);
386
+ setFilesToOverwrite([]);
387
+ };
388
+ const pollingResults = useDocumentStatusPolling(sessionId, pendingUploads);
389
+ useEffect(() => {
390
+ const completedOrFailed = pollingResults.filter(
391
+ (r) => (r.status === "completed" || r.status === "failed" || r.status === "cancelled") && !processedIds.current.has(r.documentId)
392
+ );
393
+ if (completedOrFailed.length === 0) return;
394
+ const idsToRemove = /* @__PURE__ */ new Set();
395
+ const namesToRemove = /* @__PURE__ */ new Set();
396
+ const newAlerts = [];
397
+ const newCompletedNames = /* @__PURE__ */ new Set();
398
+ for (const result of completedOrFailed) {
399
+ processedIds.current.add(result.documentId);
400
+ idsToRemove.add(result.documentId);
401
+ namesToRemove.add(result.fileName);
402
+ if (result.status === "completed") {
403
+ newCompletedNames.add(result.fileName);
404
+ }
405
+ if (result.status !== "completed") {
406
+ const errorDetail = result.error ? ` ${result.error}` : "";
407
+ newAlerts.push({
408
+ key: Date.now() + result.documentId,
409
+ title: `${t("notebook.upload.failed", {
410
+ fileName: result.fileName
411
+ })}${errorDetail}`,
412
+ variant: "danger"
413
+ });
414
+ }
415
+ }
416
+ setPendingUploads((prev) => prev.filter((u) => !idsToRemove.has(u.documentId)));
417
+ setUploadingFileNames(
418
+ (prev) => prev.filter((name) => !namesToRemove.has(name))
419
+ );
420
+ if (newCompletedNames.size > 0) {
421
+ setCompletedFileNames((prev) => /* @__PURE__ */ new Set([...prev, ...newCompletedNames]));
422
+ queryClient.invalidateQueries({
423
+ queryKey: ["notebooks", "documents", sessionId]
424
+ });
425
+ }
426
+ setToastAlerts((prev) => [...newAlerts, ...prev]);
427
+ }, [pollingResults, t, queryClient, sessionId]);
428
+ const handleRemoveToastAlert = (key) => {
429
+ setToastAlerts((prev) => prev.filter((a) => a.key !== key));
430
+ };
431
+ const totalDocumentCount = documents.length + uploadingFileNames.length;
432
+ const hasUploadsInProgress = pendingUploads.length > 0 || isDocumentsFetching;
433
+ const hasNoDocuments = documents.length === 0;
434
+ const isAddDisabled = totalDocumentCount >= NOTEBOOK_MAX_FILES || hasUploadsInProgress;
435
+ const panelContent = /* @__PURE__ */ jsx(
436
+ DrawerPanelContent,
437
+ {
438
+ isResizable: true,
439
+ defaultSize: "310px",
440
+ minSize: "232px",
441
+ maxSize: "50%",
442
+ resizeAriaLabel: t("notebook.view.sidebar.resize"),
443
+ children: /* @__PURE__ */ jsx(
444
+ DocumentSidebar,
445
+ {
446
+ notebookName,
447
+ documents,
448
+ uploadingFileNames,
449
+ completedFileNames,
450
+ deletingDocumentIds,
451
+ collapsed: sidebarCollapsed,
452
+ hasUploadsInProgress,
453
+ onToggleCollapse: () => setSidebarCollapsed((prev) => !prev),
454
+ onAddDocument: handleOpenUploadModal,
455
+ onDeleteDocument: handleDeleteDocument
456
+ }
457
+ )
458
+ }
459
+ );
460
+ const renderNotebookDisclaimerAlert = () => /* @__PURE__ */ jsx("div", { className: classes.notebookDisclaimerStrip, children: /* @__PURE__ */ jsx("div", { className: classes.notebookDisclaimerInner, children: /* @__PURE__ */ jsx(Alert, { isInline: true, variant: "info", title: t("aria.important"), children: t("disclaimer.withoutValidation") }) }) });
461
+ const renderMainContent = () => {
462
+ if (hasNoDocuments && messages.length === 0) {
463
+ return /* @__PURE__ */ jsx(Typography, { component: "span", className: classes.notebookEmptyUpload, children: /* @__PURE__ */ jsx(
464
+ UploadResourceScreen,
465
+ {
466
+ onUploadClick: handleOpenUploadModal,
467
+ isProcessing: uploadingFileNames.length > 0
468
+ }
469
+ ) });
470
+ }
471
+ if (messages.length > 0) {
472
+ return /* @__PURE__ */ jsx(ChatbotContent, { className: classes.chatContent, children: /* @__PURE__ */ jsx(
473
+ LightspeedChatBox,
474
+ {
475
+ userName,
476
+ messages,
477
+ profileLoading,
478
+ announcement,
479
+ ref: scrollToBottomRef,
480
+ welcomePrompts: [],
481
+ conversationId,
482
+ isStreaming: isSendButtonDisabled,
483
+ topicRestrictionEnabled,
484
+ showSourcesChipPopover: true
485
+ }
486
+ ) });
487
+ }
488
+ return /* @__PURE__ */ jsxs("div", { className: classes.welcomeContainer, children: [
489
+ /* @__PURE__ */ jsx("div", { style: { flex: 1 } }),
490
+ renderNotebookDisclaimerAlert(),
491
+ /* @__PURE__ */ jsxs("div", { className: classes.notebookContentArea, children: [
492
+ /* @__PURE__ */ jsx(Typography, { className: classes.notebookHeading, children: notebookName }),
493
+ topicSummary && /* @__PURE__ */ jsx(Typography, { className: classes.notebookSummary, children: topicSummary })
494
+ ] }),
495
+ welcomePrompts.length > 0 && /* @__PURE__ */ jsx("div", { className: classes.promptSuggestions, children: welcomePrompts.map((prompt) => /* @__PURE__ */ jsx(
496
+ "button",
497
+ {
498
+ type: "button",
499
+ className: classes.promptPill,
500
+ onClick: prompt.onClick,
501
+ children: prompt.title
502
+ },
503
+ prompt.title
504
+ )) })
505
+ ] });
506
+ };
507
+ return /* @__PURE__ */ jsxs("div", { className: classes.root, children: [
508
+ toastAlerts.length > 0 && /* @__PURE__ */ jsx(
509
+ AlertGroup,
510
+ {
511
+ hasAnimations: true,
512
+ isToast: true,
513
+ isLiveRegion: true,
514
+ className: classes.toastAlertGroup,
515
+ children: toastAlerts.map(({ key, title, variant }) => /* @__PURE__ */ jsx(
516
+ Alert,
517
+ {
518
+ variant: AlertVariant[variant ?? "success"],
519
+ title,
520
+ className: classes.toastAlert,
521
+ timeout: 2e3,
522
+ onTimeout: () => handleRemoveToastAlert(key),
523
+ actionClose: /* @__PURE__ */ jsx(
524
+ AlertActionCloseButton,
525
+ {
526
+ title,
527
+ variantLabel: `${variant ?? "success"} alert`,
528
+ onClose: () => handleRemoveToastAlert(key)
529
+ }
530
+ )
531
+ },
532
+ key
533
+ ))
534
+ }
535
+ ),
536
+ /* @__PURE__ */ jsx(
537
+ Drawer,
538
+ {
539
+ isExpanded: !sidebarCollapsed,
540
+ isInline: true,
541
+ position: "start",
542
+ className: classes.drawerContainer,
543
+ children: /* @__PURE__ */ jsx(
544
+ DrawerContent,
545
+ {
546
+ panelContent: !sidebarCollapsed ? panelContent : void 0,
547
+ children: /* @__PURE__ */ jsx(DrawerContentBody, { className: classes.drawerContentBody, children: /* @__PURE__ */ jsxs("div", { className: classes.mainArea, children: [
548
+ sidebarCollapsed && /* @__PURE__ */ jsxs("div", { className: classes.expandStrip, children: [
549
+ /* @__PURE__ */ jsx(
550
+ Tooltip,
551
+ {
552
+ content: t("notebook.view.sidebar.expand"),
553
+ position: "right",
554
+ children: /* @__PURE__ */ jsx(
555
+ Button,
556
+ {
557
+ variant: "plain",
558
+ onClick: () => setSidebarCollapsed(false),
559
+ "aria-label": t("notebook.view.sidebar.expand"),
560
+ size: "sm",
561
+ children: /* @__PURE__ */ jsx(SidebarExpandIcon, {})
562
+ }
563
+ )
564
+ }
565
+ ),
566
+ /* @__PURE__ */ jsx(
567
+ Tooltip,
568
+ {
569
+ content: (() => {
570
+ if (hasUploadsInProgress)
571
+ return t("notebook.view.documents.uploadsInProgress");
572
+ if (isAddDisabled)
573
+ return t("notebook.view.documents.maxReached");
574
+ return t("notebook.view.documents.add");
575
+ })(),
576
+ position: "right",
577
+ children: /* @__PURE__ */ jsx(Typography, { component: "span", children: /* @__PURE__ */ jsx(
578
+ Button,
579
+ {
580
+ variant: "plain",
581
+ className: classes.addIconButton,
582
+ onClick: isAddDisabled ? void 0 : handleOpenUploadModal,
583
+ "aria-label": t("notebook.view.documents.add"),
584
+ isDisabled: isAddDisabled,
585
+ children: /* @__PURE__ */ jsx(AddCircleFilledIcon, { disabled: isAddDisabled })
586
+ }
587
+ ) })
588
+ }
589
+ )
590
+ ] }),
591
+ /* @__PURE__ */ jsxs("div", { className: classes.contentColumn, children: [
592
+ /* @__PURE__ */ jsx("div", { className: classes.topBar, children: /* @__PURE__ */ jsx(
593
+ Button,
594
+ {
595
+ variant: "link",
596
+ className: classes.closeButton,
597
+ onClick: onClose,
598
+ icon: /* @__PURE__ */ jsx(TimesIcon, {}),
599
+ iconPosition: "end",
600
+ children: t("notebook.view.close")
601
+ }
602
+ ) }),
603
+ /* @__PURE__ */ jsx("div", { className: classes.mainContent, children: renderMainContent() }),
604
+ hasNoDocuments && messages.length === 0 && renderNotebookDisclaimerAlert(),
605
+ /* @__PURE__ */ jsxs(ChatbotFooter, { className: classes.footer, children: [
606
+ hasNoDocuments ? /* @__PURE__ */ jsx(
607
+ Tooltip,
608
+ {
609
+ content: t("notebook.view.input.disabledTooltip"),
610
+ position: "top",
611
+ children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
612
+ MessageBar,
613
+ {
614
+ hasAttachButton: false,
615
+ hasMicrophoneButton: false,
616
+ hasStopButton: false,
617
+ isSendButtonDisabled: true,
618
+ isDisabled: true,
619
+ onSendMessage: sendMessage,
620
+ placeholder: t("notebook.view.input.placeholder")
621
+ }
622
+ ) })
623
+ }
624
+ ) : /* @__PURE__ */ jsx(
625
+ MessageBar,
626
+ {
627
+ hasAttachButton: false,
628
+ hasMicrophoneButton: true,
629
+ hasStopButton: false,
630
+ isSendButtonDisabled,
631
+ onSendMessage: sendMessage,
632
+ placeholder: t("notebook.view.input.placeholder")
633
+ }
634
+ ),
635
+ /* @__PURE__ */ jsx(ChatbotFootnoteWithIcon, { label: t("footer.accuracy.label") })
636
+ ] })
637
+ ] })
638
+ ] }) })
639
+ }
640
+ )
641
+ }
642
+ ),
643
+ /* @__PURE__ */ jsx(
644
+ AddDocumentModal,
645
+ {
646
+ isOpen: isUploadModalOpen,
647
+ onClose: handleCloseUploadModal,
648
+ sessionId,
649
+ existingDocumentNames: documents.map((d) => d.title),
650
+ hasUploadsInProgress,
651
+ onFilesUploading: handleFilesUploading,
652
+ onUploadStarted: handleUploadStarted,
653
+ onUploadFailed: handleUploadFailed,
654
+ onDuplicatesFound: handleDuplicatesFound,
655
+ filesToAdd: filesToAddToModal,
656
+ onFilesAdded: handleFilesAddedToModal
657
+ }
658
+ ),
659
+ /* @__PURE__ */ jsx(
660
+ OverwriteConfirmModal,
661
+ {
662
+ isOpen: isOverwriteModalOpen,
663
+ onClose: handleOverwriteCancel,
664
+ onConfirm: handleOverwriteConfirm,
665
+ fileNames: filesToOverwrite.map((f) => f.name)
666
+ }
667
+ ),
668
+ /* @__PURE__ */ jsx(
669
+ DeleteDocumentModal,
670
+ {
671
+ isOpen: deleteDocumentTarget !== null,
672
+ onClose: () => setDeleteDocumentTarget(null),
673
+ onConfirm: confirmDeleteDocument,
674
+ documentName: deleteDocumentTarget?.name ?? ""
675
+ }
676
+ )
677
+ ] });
678
+ };
679
+
680
+ export { NotebookView };
681
+ //# sourceMappingURL=NotebookView.esm.js.map