@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +7 -10
  3. package/config.d.ts +27 -0
  4. package/dist/alpha.d.ts +21 -7
  5. package/dist/api/NotebooksApiClient.esm.js +10 -0
  6. package/dist/api/NotebooksApiClient.esm.js.map +1 -1
  7. package/dist/api/notebooksApi.esm.js.map +1 -1
  8. package/dist/components/LightSpeedChat.esm.js +50 -37
  9. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  10. package/dist/components/LightspeedChatContainer.esm.js +7 -5
  11. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  12. package/dist/components/McpServersSettings.esm.js +4 -3
  13. package/dist/components/McpServersSettings.esm.js.map +1 -1
  14. package/dist/components/notebooks/AddDocumentModal.esm.js +181 -66
  15. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  16. package/dist/components/notebooks/DocumentSidebar.esm.js +258 -27
  17. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
  18. package/dist/components/notebooks/FileListItem.esm.js +15 -9
  19. package/dist/components/notebooks/FileListItem.esm.js.map +1 -1
  20. package/dist/components/notebooks/NotebookCard.esm.js +71 -14
  21. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -1
  22. package/dist/components/notebooks/NotebookView.esm.js +202 -42
  23. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  24. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
  25. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +122 -42
  26. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  27. package/dist/components/notebooks/UploadResourceScreen.esm.js +0 -1
  28. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
  29. package/dist/const.esm.js +2 -1
  30. package/dist/const.esm.js.map +1 -1
  31. package/dist/hooks/notebooks/useInlineEdit.esm.js +60 -0
  32. package/dist/hooks/notebooks/useInlineEdit.esm.js.map +1 -0
  33. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +4 -3
  34. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -1
  35. package/dist/hooks/notebooks/useRenameDocument.esm.js +50 -0
  36. package/dist/hooks/notebooks/useRenameDocument.esm.js.map +1 -0
  37. package/dist/hooks/notebooks/useRenameNotebook.esm.js +48 -1
  38. package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -1
  39. package/dist/hooks/notebooks/useRenameNotebookWithAlert.esm.js +34 -0
  40. package/dist/hooks/notebooks/useRenameNotebookWithAlert.esm.js.map +1 -0
  41. package/dist/hooks/useLightspeedDeletePermission.esm.js +2 -2
  42. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -1
  43. package/dist/hooks/useLightspeedUpdatePermission.esm.js +2 -2
  44. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -1
  45. package/dist/hooks/useLightspeedViewPermission.esm.js +6 -4
  46. package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -1
  47. package/dist/translations/de.esm.js +31 -17
  48. package/dist/translations/de.esm.js.map +1 -1
  49. package/dist/translations/es.esm.js +31 -17
  50. package/dist/translations/es.esm.js.map +1 -1
  51. package/dist/translations/fr.esm.js +31 -17
  52. package/dist/translations/fr.esm.js.map +1 -1
  53. package/dist/translations/it.esm.js +31 -17
  54. package/dist/translations/it.esm.js.map +1 -1
  55. package/dist/translations/ja.esm.js +31 -17
  56. package/dist/translations/ja.esm.js.map +1 -1
  57. package/dist/translations/ref.esm.js +32 -18
  58. package/dist/translations/ref.esm.js.map +1 -1
  59. package/dist/utils/notebook-upload-runner.esm.js +16 -0
  60. package/dist/utils/notebook-upload-runner.esm.js.map +1 -0
  61. package/package.json +4 -3
  62. package/dist/components/notebooks/RenameNotebookModal.esm.js +0 -187
  63. package/dist/components/notebooks/RenameNotebookModal.esm.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,92 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-intelligent-assistant
2
2
 
3
+ ## 4.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6c8f76d: Removed public `iaSavedPromptsManagePermission` from the common package. Saved-prompts backend routes now require `intelligent-assistant.chat.use`. Operators should drop `intelligent-assistant.saved-prompts.manage` from RBAC CSVs; `chat.use` is enough.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [6c8f76d]
12
+ - @red-hat-developer-hub/backstage-plugin-intelligent-assistant-common@4.1.0
13
+
14
+ ## 4.0.0
15
+
16
+ ### Major Changes
17
+
18
+ - adb65c9: Breaking changes to MCP permissions using behavior-linked vocabulary rather than CRUD-linked vocabulary:
19
+
20
+ | Before (Lightspeed) | Before (Intelligent Assistant) | After |
21
+ | ----------------------- | ---------------------------------- | ------------------ |
22
+ | `lightspeed.mcp.read` | `intelligent-assistant.mcp.read` | `mcp.tools.use` |
23
+ | `lightspeed.mcp.manage` | `intelligent-assistant.mcp.manage` | `mcp.tools.manage` |
24
+
25
+ Removed permission CRUD action attributes; RBAC entries for these permission sets now use the generic `use` action.
26
+
27
+ Permission variable renamed from `iaMcpReadPermission` to `iaMcpUsePermission`; `iaMcpManagePermission` keeps its name.
28
+
29
+ Plugin documentation and example RBAC policy CSV updated to reflect the new MCP permission names.
30
+
31
+ - 0ed3adc: Breaking changes to the notebooks permissions model that uses behavior-linked vocabulary:
32
+
33
+ | Before (Lightspeed) | Before (Intelligent Assistant) | After |
34
+ | -------------------------- | ------------------------------------- | ---------------------------------------- |
35
+ | `lightspeed.notebooks.use` | `intelligent-assistant.notebooks.use` | `intelligent-assistant.notebooks.use` |
36
+ | | | `intelligent-assistant.notebooks.manage` |
37
+ - `notebooks.use` covers list/read/create session, upload document, and query endpoints
38
+ - `notebooks.manage` covers update/delete session and document endpoints
39
+
40
+ Removed permission CRUD action attributes; RBAC entries for notebooks permission sets now use the generic `use` action.
41
+
42
+ Hard-coded permission names were replaced by constants from the permission entities.
43
+
44
+ Plugin documentation and example RBAC policy CSV updated to reflect the notebooks permission model.
45
+
46
+ - f1dba9b: Breaking changes to the permissions model that uses behavior-linked vocabulary rather than CRUD-linked vocabulary:
47
+
48
+ | Before (Lightspeed) | Before (Intelligent Assistant) | After |
49
+ | ------------------------ | ----------------------------------- | ----------------------------------- |
50
+ | `lightspeed.chat.read` | `intelligent-assistant.chat.read` | `intelligent-assistant.chat.access` |
51
+ | `lightspeed.chat.create` | `intelligent-assistant.chat.create` | `intelligent-assistant.chat.use` |
52
+ | `lightspeed.chat.delete` | `intelligent-assistant.chat.delete` | `intelligent-assistant.chat.manage` |
53
+ | `lightspeed.chat.update` | `intelligent-assistant.chat.update` | `intelligent-assistant.chat.manage` |
54
+
55
+ Changes are applied to `lightspeed` (Frontend), `lightspeed-backend`, and `lightspeed-common` plugins.
56
+
57
+ Removed permission CRUD action attributes, rbac entries for permission sets now to generic 'use' action, allows `intelligent-assistant.chat.manage` to combine the update and delete actions.
58
+
59
+ Any hard-coded permission names have been replaced by constants, source references permission names from the permission entities.
60
+
61
+ `Trans.test.tsx` component test unit has permission names to reflect Intelligent Assistant for RHDH.
62
+
63
+ Additionally, hard-coded permission names have been replaced by local constants with the new names set.
64
+
65
+ Plugin documentation changes to revise information to permissions model changes to Intelligent Assistant for RHDH.
66
+
67
+ Changed permission variable 'lightspeed' prefix to 'ia' to use Intelligent Assistant rebranding.
68
+
69
+ Changes to example RBAC policy CSV file to reflect Intelligent Assistant for RHDH.
70
+
71
+ ### Minor Changes
72
+
73
+ - 4a8aa72: Replace modal-based notebook rename with inline double-click-to-edit rename on notebook cards and sidebar, and remove redundant PatternFly CSS overrides.
74
+ - e996529: Add inline rename for notebook resources with click or kebab menu, optimistic updates with rollback, frontend conflict validation, and backend PATCH endpoint with rollback on failure
75
+ - b2f8ea7: Add screenshot capture utility with sensitive data redaction and performance guardrails for deep context awareness
76
+
77
+ ### Patch Changes
78
+
79
+ - fe5a58e: Improve notebook UI: enhance AddDocumentModal, OverwriteConfirmModal, NotebookCard, and NotebookView components with better UX text, document count formatting, and fix translation type errors
80
+ - bb7a863: Fix singular/plural handling for notebook card and document sidebar resource count using i18next `_one`/`_other` suffix keys.
81
+ - 549abd8: Fix MCP settings panel layout in docked and overlay modes to fill available space and remove gray borders
82
+ - 82742f0: Unify notebook terminology from "document" to "resource" across all UI strings, translations, and backend messages.
83
+ - e919230: bump monaco-editor to v0.56.0 to pick up dompurify update
84
+ - Updated dependencies [3d1d7d7]
85
+ - Updated dependencies [adb65c9]
86
+ - Updated dependencies [0ed3adc]
87
+ - Updated dependencies [f1dba9b]
88
+ - @red-hat-developer-hub/backstage-plugin-intelligent-assistant-common@4.0.0
89
+
3
90
  ## 3.2.0
4
91
 
5
92
  ### Minor Changes
package/README.md CHANGED
@@ -37,20 +37,17 @@ The Lightspeed plugin has support for the permission framework.
37
37
  - When [RBAC permission](https://github.com/backstage/community-plugins/tree/main/workspaces/rbac/plugins/rbac-backend#installation) framework is enabled, for non-admin users to access lightspeed UI, the role associated with your user should have the following permission policies associated with it. Add the following in your permission policies configuration file named `rbac-policy.csv`:
38
38
 
39
39
  ```CSV
40
- p, role:default/team_a, intelligent-assistant.chat.read, read, allow
41
- p, role:default/team_a, intelligent-assistant.chat.create, create, allow
42
- p, role:default/team_a, intelligent-assistant.chat.delete, delete, allow
43
- p, role:default/team_a, intelligent-assistant.chat.update, update, allow
40
+ p, role:default/team_a, intelligent-assistant.chat.access, use, allow
41
+ p, role:default/team_a, intelligent-assistant.chat.use, use, allow
42
+ p, role:default/team_a, intelligent-assistant.chat.manage, use, allow
44
43
 
45
44
  # Required for Notebooks feature (if enabled)
46
- p, role:default/team_a, intelligent-assistant.notebooks.use, update, allow
45
+ p, role:default/team_a, intelligent-assistant.notebooks.use, use, allow
46
+ p, role:default/team_a, intelligent-assistant.notebooks.manage, use, allow
47
47
 
48
48
  # Required for MCP server management (if configured)
49
- p, role:default/team_a, intelligent-assistant.mcp.read, read, allow
50
- p, role:default/team_a, intelligent-assistant.mcp.manage, update, allow
51
-
52
- # Required for saved prompts
53
- p, role:default/team_a, intelligent-assistant.saved-prompts.manage, update, allow
49
+ p, role:default/team_a, mcp.tools.use, use, allow
50
+ p, role:default/team_a, mcp.tools.manage, use, allow
54
51
 
55
52
  g, user:default/<your-user-name>, role:default/team_a
56
53
 
package/config.d.ts CHANGED
@@ -68,5 +68,32 @@ export interface Config {
68
68
  provider_id: string;
69
69
  };
70
70
  };
71
+ /**
72
+ * Configuration for Screen Context (deep context awareness)
73
+ * @visibility frontend
74
+ */
75
+ 'screen-context'?: {
76
+ /**
77
+ * Enable/disable the Screen Context feature.
78
+ * When enabled, the assistant can capture the user's current RHDH screen
79
+ * to provide context-aware responses.
80
+ * @default false
81
+ * @visibility frontend
82
+ */
83
+ enabled?: boolean;
84
+ /**
85
+ * Screenshot capture configuration
86
+ * @visibility frontend
87
+ */
88
+ screenshots?: {
89
+ /**
90
+ * Enable/disable screenshot capture within Screen Context.
91
+ * Admin can disable screenshots org-wide while keeping DOM text context.
92
+ * @default true
93
+ * @visibility frontend
94
+ */
95
+ enabled?: boolean;
96
+ };
97
+ };
71
98
  };
72
99
  }
package/dist/alpha.d.ts CHANGED
@@ -45,14 +45,12 @@ declare const intelligentAssistantTranslationRef: _backstage_frontend_plugin_api
45
45
  readonly 'notebooks.empty.title': string;
46
46
  readonly 'notebooks.empty.description': string;
47
47
  readonly 'notebooks.empty.action': string;
48
- readonly 'notebooks.documents': string;
48
+ readonly 'notebooks.documents_one': string;
49
+ readonly 'notebooks.documents_other': string;
49
50
  readonly 'notebooks.actions.rename': string;
50
51
  readonly 'notebooks.actions.delete': string;
51
- readonly 'notebooks.rename.title': string;
52
- readonly 'notebooks.rename.description': string;
53
- readonly 'notebooks.rename.label': string;
54
- readonly 'notebooks.rename.placeholder': string;
55
- readonly 'notebooks.rename.action': string;
52
+ readonly 'notebooks.rename.inline.tooltip': string;
53
+ readonly 'notebooks.rename.inline.error': string;
56
54
  readonly 'notebooks.delete.title': string;
57
55
  readonly 'notebooks.delete.message': string;
58
56
  readonly 'notebooks.delete.action': string;
@@ -64,7 +62,8 @@ declare const intelligentAssistantTranslationRef: _backstage_frontend_plugin_api
64
62
  readonly 'notebooks.card.openAria': string;
65
63
  readonly 'notebook.view.title': string;
66
64
  readonly 'notebook.view.close': string;
67
- readonly 'notebook.view.documents.count': string;
65
+ readonly 'notebook.view.documents.count_one': string;
66
+ readonly 'notebook.view.documents.count_other': string;
68
67
  readonly 'notebook.view.documents.add': string;
69
68
  readonly 'notebook.view.upload.heading': string;
70
69
  readonly 'notebook.view.upload.action': string;
@@ -84,15 +83,30 @@ declare const intelligentAssistantTranslationRef: _backstage_frontend_plugin_api
84
83
  readonly 'notebook.upload.modal.browseButton': string;
85
84
  readonly 'notebook.upload.modal.separator': string;
86
85
  readonly 'notebook.upload.modal.infoText': string;
86
+ readonly 'notebook.upload.modal.supportedFormats': string;
87
+ readonly 'notebook.upload.modal.maxFileSize': string;
87
88
  readonly 'notebook.upload.modal.selectedFiles': string;
88
89
  readonly 'notebook.upload.modal.addButton': string;
90
+ readonly 'notebook.upload.modal.addButtonEmpty': string;
89
91
  readonly 'notebook.upload.modal.removeFile': string;
90
92
  readonly 'notebook.upload.error.unsupportedType': string;
91
93
  readonly 'notebook.upload.error.fileTooLarge': string;
92
94
  readonly 'notebook.upload.error.tooManyFiles': string;
93
95
  readonly 'notebook.overwrite.modal.title': string;
96
+ readonly 'notebook.overwrite.modal.title.one': string;
97
+ readonly 'notebook.overwrite.modal.title.other': string;
94
98
  readonly 'notebook.overwrite.modal.description': string;
99
+ readonly 'notebook.overwrite.modal.description.one': string;
100
+ readonly 'notebook.overwrite.modal.description.other': string;
101
+ readonly 'notebook.overwrite.modal.replace': string;
102
+ readonly 'notebook.overwrite.modal.ignore': string;
95
103
  readonly 'notebook.overwrite.modal.action': string;
104
+ readonly 'notebook.overwrite.modal.back': string;
105
+ readonly 'notebook.document.rename': string;
106
+ readonly 'notebook.document.rename.tooltip': string;
107
+ readonly 'notebook.document.rename.error': string;
108
+ readonly 'notebook.document.rename.conflict': string;
109
+ readonly 'notebook.document.rename.tooLong': string;
96
110
  readonly 'notebook.document.delete': string;
97
111
  readonly 'notebook.document.delete.title': string;
98
112
  readonly 'notebook.document.delete.description': string;
@@ -132,6 +132,16 @@ class NotebooksApiClient {
132
132
  title: doc.title ?? doc.document_id
133
133
  }));
134
134
  }
135
+ async renameDocument(sessionId, documentId, newTitle) {
136
+ const baseUrl = await this.getBaseUrl();
137
+ await this.fetchJson(
138
+ `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}`,
139
+ {
140
+ method: "PATCH",
141
+ body: JSON.stringify({ title: newTitle })
142
+ }
143
+ );
144
+ }
135
145
  async deleteDocument(sessionId, documentId) {
136
146
  const baseUrl = await this.getBaseUrl();
137
147
  await this.fetchJson(
@@ -1 +1 @@
1
- {"version":3,"file":"NotebooksApiClient.esm.js","sources":["../../src/api/NotebooksApiClient.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 { ConfigApi, FetchApi } from '@backstage/core-plugin-api';\n\nimport {\n DocumentListResponse,\n DocumentStatus,\n NotebookSession,\n SessionResponse,\n UploadDocumentResponse,\n} from '../types';\nimport { NotebooksAPI } from './notebooksApi';\n\n/**\n * @public\n * AI Notebooks API client options\n */\nexport type NotebooksOptions = {\n configApi: ConfigApi;\n fetchApi: FetchApi;\n};\n\n/**\n * @public\n * AI Notebooks API client implementation\n */\nexport class NotebooksApiClient implements NotebooksAPI {\n private readonly configApi: ConfigApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: NotebooksOptions) {\n this.configApi = options.configApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBaseUrl() {\n return `${this.configApi.getString('backend.baseUrl')}/api/intelligent-assistant/notebooks`;\n }\n\n private async handleResponseError(response: Response): Promise<string> {\n let errorMessage = `failed to fetch data, status ${response.status}: ${response.statusText}`;\n try {\n const errorText = await response.text();\n if (errorText) {\n try {\n const errorBody = JSON.parse(errorText);\n if (errorBody?.error) {\n errorMessage = errorBody.error;\n }\n } catch {\n errorMessage = errorText;\n }\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return errorMessage;\n }\n\n private async fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await this.fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n\n if (!response.ok) {\n throw new Error(await this.handleResponseError(response));\n }\n\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n return JSON.parse(text) as T;\n }\n\n private async fetchFormData<T>(\n url: string,\n formData: FormData,\n method: string = 'PUT',\n ): Promise<T> {\n const response = await this.fetchApi.fetch(url, {\n method,\n body: formData,\n });\n\n if (!response.ok && response.status !== 202) {\n throw new Error(await this.handleResponseError(response));\n }\n\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n return JSON.parse(text) as T;\n }\n\n async createSession(name: string, description?: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<SessionResponse>(\n `${baseUrl}/v1/sessions`,\n {\n method: 'POST',\n body: JSON.stringify({ name, description }),\n },\n );\n if (!response.session) {\n throw new Error(response.error ?? 'Failed to create session');\n }\n return response.session;\n }\n\n async listSessions() {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<{ sessions?: NotebookSession[] }>(\n `${baseUrl}/v1/sessions`,\n );\n return response?.sessions ?? [];\n }\n\n async getSession(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<SessionResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n );\n if (!response.session) {\n throw new Error(response.error ?? 'Session not found');\n }\n return response.session;\n }\n\n async renameSession(sessionId: string, name: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: 'PUT',\n body: JSON.stringify({ name }),\n },\n );\n }\n\n async deleteSession(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: 'DELETE',\n },\n );\n }\n\n async uploadDocument(\n sessionId: string,\n file: File,\n fileType: string,\n title: string,\n newTitle?: string,\n ) {\n const baseUrl = await this.getBaseUrl();\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileType', fileType);\n formData.append('title', title);\n if (newTitle) {\n formData.append('newTitle', newTitle);\n }\n return this.fetchFormData<UploadDocumentResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents`,\n formData,\n );\n }\n\n async listDocuments(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<DocumentListResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents`,\n );\n const docs = response?.documents ?? [];\n return docs.map(doc => ({\n ...doc,\n title: (doc as any).title ?? doc.document_id,\n }));\n }\n\n async deleteDocument(sessionId: string, documentId: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}`,\n {\n method: 'DELETE',\n },\n );\n }\n\n async getDocumentStatus(sessionId: string, documentId: string) {\n const baseUrl = await this.getBaseUrl();\n return this.fetchJson<DocumentStatus>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}/status`,\n );\n }\n\n async querySession(\n sessionId: string,\n query: string,\n ): Promise<ReadableStreamDefaultReader<Uint8Array>> {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchApi.fetch(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query }),\n },\n );\n\n if (!response.body) {\n throw new Error('Readable stream is not supported or there is no body.');\n }\n\n if (!response.ok) {\n const reader = response.body.getReader();\n const { done, value } = await reader.read();\n const text = done ? '' : new TextDecoder('utf-8').decode(value);\n const errorMessage = JSON.parse(text);\n if (errorMessage?.error) {\n throw new Error(\n `failed to query notebook session: ${errorMessage.error}`,\n );\n }\n }\n\n return response.body.getReader();\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotebooksApiClient.esm.js","sources":["../../src/api/NotebooksApiClient.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 { ConfigApi, FetchApi } from '@backstage/core-plugin-api';\n\nimport {\n DocumentListResponse,\n DocumentStatus,\n NotebookSession,\n SessionResponse,\n UploadDocumentResponse,\n} from '../types';\nimport { NotebooksAPI } from './notebooksApi';\n\n/**\n * @public\n * AI Notebooks API client options\n */\nexport type NotebooksOptions = {\n configApi: ConfigApi;\n fetchApi: FetchApi;\n};\n\n/**\n * @public\n * AI Notebooks API client implementation\n */\nexport class NotebooksApiClient implements NotebooksAPI {\n private readonly configApi: ConfigApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: NotebooksOptions) {\n this.configApi = options.configApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBaseUrl() {\n return `${this.configApi.getString('backend.baseUrl')}/api/intelligent-assistant/notebooks`;\n }\n\n private async handleResponseError(response: Response): Promise<string> {\n let errorMessage = `failed to fetch data, status ${response.status}: ${response.statusText}`;\n try {\n const errorText = await response.text();\n if (errorText) {\n try {\n const errorBody = JSON.parse(errorText);\n if (errorBody?.error) {\n errorMessage = errorBody.error;\n }\n } catch {\n errorMessage = errorText;\n }\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return errorMessage;\n }\n\n private async fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await this.fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n });\n\n if (!response.ok) {\n throw new Error(await this.handleResponseError(response));\n }\n\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n return JSON.parse(text) as T;\n }\n\n private async fetchFormData<T>(\n url: string,\n formData: FormData,\n method: string = 'PUT',\n ): Promise<T> {\n const response = await this.fetchApi.fetch(url, {\n method,\n body: formData,\n });\n\n if (!response.ok && response.status !== 202) {\n throw new Error(await this.handleResponseError(response));\n }\n\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n return JSON.parse(text) as T;\n }\n\n async createSession(name: string, description?: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<SessionResponse>(\n `${baseUrl}/v1/sessions`,\n {\n method: 'POST',\n body: JSON.stringify({ name, description }),\n },\n );\n if (!response.session) {\n throw new Error(response.error ?? 'Failed to create session');\n }\n return response.session;\n }\n\n async listSessions() {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<{ sessions?: NotebookSession[] }>(\n `${baseUrl}/v1/sessions`,\n );\n return response?.sessions ?? [];\n }\n\n async getSession(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<SessionResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n );\n if (!response.session) {\n throw new Error(response.error ?? 'Session not found');\n }\n return response.session;\n }\n\n async renameSession(sessionId: string, name: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: 'PUT',\n body: JSON.stringify({ name }),\n },\n );\n }\n\n async deleteSession(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: 'DELETE',\n },\n );\n }\n\n async uploadDocument(\n sessionId: string,\n file: File,\n fileType: string,\n title: string,\n newTitle?: string,\n ) {\n const baseUrl = await this.getBaseUrl();\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileType', fileType);\n formData.append('title', title);\n if (newTitle) {\n formData.append('newTitle', newTitle);\n }\n return this.fetchFormData<UploadDocumentResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents`,\n formData,\n );\n }\n\n async listDocuments(sessionId: string) {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchJson<DocumentListResponse>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents`,\n );\n const docs = response?.documents ?? [];\n return docs.map(doc => ({\n ...doc,\n title: (doc as any).title ?? doc.document_id,\n }));\n }\n\n async renameDocument(\n sessionId: string,\n documentId: string,\n newTitle: string,\n ) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}`,\n {\n method: 'PATCH',\n body: JSON.stringify({ title: newTitle }),\n },\n );\n }\n\n async deleteDocument(sessionId: string, documentId: string) {\n const baseUrl = await this.getBaseUrl();\n await this.fetchJson(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}`,\n {\n method: 'DELETE',\n },\n );\n }\n\n async getDocumentStatus(sessionId: string, documentId: string) {\n const baseUrl = await this.getBaseUrl();\n return this.fetchJson<DocumentStatus>(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/documents/${encodeURIComponent(documentId)}/status`,\n );\n }\n\n async querySession(\n sessionId: string,\n query: string,\n ): Promise<ReadableStreamDefaultReader<Uint8Array>> {\n const baseUrl = await this.getBaseUrl();\n const response = await this.fetchApi.fetch(\n `${baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query }),\n },\n );\n\n if (!response.body) {\n throw new Error('Readable stream is not supported or there is no body.');\n }\n\n if (!response.ok) {\n const reader = response.body.getReader();\n const { done, value } = await reader.read();\n const text = done ? '' : new TextDecoder('utf-8').decode(value);\n const errorMessage = JSON.parse(text);\n if (errorMessage?.error) {\n throw new Error(\n `failed to query notebook session: ${errorMessage.error}`,\n );\n }\n }\n\n return response.body.getReader();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"notebooksApi.esm.js","sources":["../../src/api/notebooksApi.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 { createApiRef, type ApiRef } from '@backstage/core-plugin-api';\n\nimport {\n DocumentStatus,\n NotebookSession,\n SessionDocument,\n UploadDocumentResponse,\n} from '../types';\n\n/**\n * @public\n * AI Notebooks API\n */\nexport type NotebooksAPI = {\n createSession: (\n name: string,\n description?: string,\n ) => Promise<NotebookSession>;\n listSessions: () => Promise<NotebookSession[]>;\n getSession: (sessionId: string) => Promise<NotebookSession>;\n renameSession: (sessionId: string, name: string) => Promise<void>;\n deleteSession: (sessionId: string) => Promise<void>;\n uploadDocument: (\n sessionId: string,\n file: File,\n fileType: string,\n title: string,\n newTitle?: string,\n ) => Promise<UploadDocumentResponse>;\n listDocuments: (sessionId: string) => Promise<SessionDocument[]>;\n deleteDocument: (sessionId: string, documentId: string) => Promise<void>;\n getDocumentStatus: (\n sessionId: string,\n documentId: string,\n ) => Promise<DocumentStatus>;\n querySession: (\n sessionId: string,\n query: string,\n ) => Promise<ReadableStreamDefaultReader<Uint8Array>>;\n};\n\n/**\n * @public\n * AI Notebooks API interface\n */\nexport const notebooksApiRef: ApiRef<NotebooksAPI> = createApiRef<NotebooksAPI>(\n {\n id: 'plugin.intelligent-assistant.notebooks.service',\n },\n);\n"],"names":[],"mappings":";;AA6DO,MAAM,eAAA,GAAwC,YAAA;AAAA,EACnD;AAAA,IACE,EAAA,EAAI;AAAA;AAER;;;;"}
1
+ {"version":3,"file":"notebooksApi.esm.js","sources":["../../src/api/notebooksApi.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 { createApiRef, type ApiRef } from '@backstage/core-plugin-api';\n\nimport {\n DocumentStatus,\n NotebookSession,\n SessionDocument,\n UploadDocumentResponse,\n} from '../types';\n\n/**\n * @public\n * AI Notebooks API\n */\nexport type NotebooksAPI = {\n createSession: (\n name: string,\n description?: string,\n ) => Promise<NotebookSession>;\n listSessions: () => Promise<NotebookSession[]>;\n getSession: (sessionId: string) => Promise<NotebookSession>;\n renameSession: (sessionId: string, name: string) => Promise<void>;\n deleteSession: (sessionId: string) => Promise<void>;\n uploadDocument: (\n sessionId: string,\n file: File,\n fileType: string,\n title: string,\n newTitle?: string,\n ) => Promise<UploadDocumentResponse>;\n listDocuments: (sessionId: string) => Promise<SessionDocument[]>;\n renameDocument: (\n sessionId: string,\n documentId: string,\n newTitle: string,\n ) => Promise<void>;\n deleteDocument: (sessionId: string, documentId: string) => Promise<void>;\n getDocumentStatus: (\n sessionId: string,\n documentId: string,\n ) => Promise<DocumentStatus>;\n querySession: (\n sessionId: string,\n query: string,\n ) => Promise<ReadableStreamDefaultReader<Uint8Array>>;\n};\n\n/**\n * @public\n * AI Notebooks API interface\n */\nexport const notebooksApiRef: ApiRef<NotebooksAPI> = createApiRef<NotebooksAPI>(\n {\n id: 'plugin.intelligent-assistant.notebooks.service',\n },\n);\n"],"names":[],"mappings":";;AAkEO,MAAM,eAAA,GAAwC,YAAA;AAAA,EACnD;AAAA,IACE,EAAA,EAAI;AAAA;AAER;;;;"}
@@ -28,6 +28,7 @@ import { useNotebookConversationIds } from '../hooks/useNotebookConversationIds.
28
28
  import { useNotebookSession } from '../hooks/notebooks/useNotebookSession.esm.js';
29
29
  import { useNotebookSessions } from '../hooks/notebooks/useNotebookSessions.esm.js';
30
30
  import { usePinnedChatsSettings } from '../hooks/usePinnedChatsSettings.esm.js';
31
+ import { useRenameNotebookWithAlert } from '../hooks/notebooks/useRenameNotebookWithAlert.esm.js';
31
32
  import { useSortSettings } from '../hooks/useSortSettings.esm.js';
32
33
  import { useStopConversation } from '../hooks/useStopConversation.esm.js';
33
34
  import { useCreateNotebook } from '../hooks/notebooks/useCreateNotebook.esm.js';
@@ -49,7 +50,6 @@ import { MessageBarModelSelector } from './MessageBarModelSelector.esm.js';
49
50
  import { DeleteNotebookModal } from './notebooks/DeleteNotebookModal.esm.js';
50
51
  import { NotebooksTab } from './notebooks/NotebooksTab.esm.js';
51
52
  import { NotebookView } from './notebooks/NotebookView.esm.js';
52
- import { RenameNotebookModal } from './notebooks/RenameNotebookModal.esm.js';
53
53
  import PermissionRequiredState from './PermissionRequiredState.esm.js';
54
54
  import { RenameConversationModal } from './RenameConversationModal.esm.js';
55
55
 
@@ -202,7 +202,7 @@ const useStyles = makeStyles((theme) => ({
202
202
  }
203
203
  },
204
204
  notebookCardHeader: {
205
- padding: theme.spacing(2),
205
+ padding: theme.spacing(3),
206
206
  paddingBottom: 0,
207
207
  alignItems: "center"
208
208
  },
@@ -211,17 +211,16 @@ const useStyles = makeStyles((theme) => ({
211
211
  marginTop: theme.spacing(1)
212
212
  },
213
213
  notebookCardBody: {
214
- padding: theme.spacing(2),
215
- paddingTop: theme.spacing(1.5)
214
+ padding: theme.spacing(3),
215
+ paddingTop: theme.spacing(2)
216
216
  },
217
217
  notebookDocuments: {
218
- paddingTop: theme.spacing(1),
219
- paddingLeft: theme.spacing(2)
218
+ paddingTop: theme.spacing(1)
220
219
  },
221
220
  notebookUpdated: {
222
- paddingBottom: theme.spacing(5),
223
- paddingLeft: theme.spacing(2),
224
- paddingTop: theme.spacing(2)
221
+ paddingBottom: theme.spacing(3),
222
+ paddingTop: theme.spacing(2),
223
+ fontStyle: "italic"
225
224
  },
226
225
  notebookTitle: {
227
226
  display: "flex",
@@ -236,7 +235,13 @@ const useStyles = makeStyles((theme) => ({
236
235
  notebookTitleText: {
237
236
  overflow: "hidden",
238
237
  textOverflow: "ellipsis",
239
- whiteSpace: "nowrap"
238
+ whiteSpace: "nowrap",
239
+ cursor: "pointer",
240
+ borderRadius: 4,
241
+ padding: "2px 6px",
242
+ "&:hover": {
243
+ backgroundColor: "var(--pf-t--global--background--color--action--plain--hover)"
244
+ }
240
245
  },
241
246
  notebookMenuButton: {
242
247
  color: theme.palette.text.secondary
@@ -253,8 +258,8 @@ const useStyles = makeStyles((theme) => ({
253
258
  notebookDropdownItem: {
254
259
  justifyContent: "flex-start",
255
260
  textAlign: "left",
256
- paddingLeft: theme.spacing(1.5),
257
- paddingRight: theme.spacing(1.5)
261
+ paddingLeft: theme.spacing(0.5),
262
+ paddingRight: theme.spacing(0.5)
258
263
  },
259
264
  footer: {
260
265
  "&.pf-chatbot__footer": {
@@ -348,32 +353,41 @@ const useStyles = makeStyles((theme) => ({
348
353
  settingsFlat: {
349
354
  height: "100%",
350
355
  width: "100%",
356
+ flex: 1,
357
+ minHeight: 0,
351
358
  "&.pf-chatbot__settings-form-container": {
352
- background: "var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))",
359
+ background: "var(--pf-t--global--background--color--floating--default)",
353
360
  padding: 0,
354
361
  margin: 0,
355
- minHeight: "100%",
362
+ minHeight: 0,
363
+ flex: 1,
356
364
  display: "flex",
357
365
  flexDirection: "column",
366
+ justifyContent: "flex-start",
358
367
  width: "100%",
359
- maxWidth: "none"
368
+ maxWidth: "none",
369
+ overflow: "hidden",
370
+ border: "none"
360
371
  },
361
372
  "& .pf-chatbot__settings-form": {
362
373
  margin: 0,
363
374
  padding: 0,
364
- background: "var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))",
365
- minHeight: "100%",
375
+ background: "var(--pf-t--global--background--color--floating--default)",
376
+ minHeight: 0,
377
+ flex: 1,
366
378
  display: "flex",
367
379
  flexDirection: "column",
368
380
  width: "100%",
369
- maxWidth: "none"
381
+ maxWidth: "none",
382
+ border: "none"
370
383
  },
371
384
  "& .pf-chatbot__settings-form-row": {
372
- background: "var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))",
373
- border: 0,
385
+ background: "var(--pf-t--global--background--color--floating--default)",
386
+ border: "none",
374
387
  margin: 0,
375
388
  padding: 0,
376
- minHeight: "100%",
389
+ minHeight: 0,
390
+ flex: 1,
377
391
  display: "flex",
378
392
  flexDirection: "column",
379
393
  width: "100%",
@@ -407,7 +421,7 @@ const useStyles = makeStyles((theme) => ({
407
421
  width: "100%",
408
422
  minWidth: 0,
409
423
  borderLeft: `1px solid ${theme.palette.divider}`,
410
- backgroundColor: "var(--pf-v6-c-table--BackgroundColor, var(--pf-t--global--background--color--primary--default))",
424
+ backgroundColor: "var(--pf-t--global--background--color--floating--default)",
411
425
  display: "flex",
412
426
  flexDirection: "column",
413
427
  minHeight: 0,
@@ -564,7 +578,11 @@ const LightspeedChat = ({
564
578
  }
565
579
  return 0;
566
580
  });
567
- const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } = useLightspeedNotebooksPermission();
581
+ const {
582
+ allowed: hasNotebooksAccess,
583
+ loading: notebooksPermissionLoading,
584
+ iaNotebooksUsePermissionName
585
+ } = useLightspeedNotebooksPermission();
568
586
  const notebooksPermissionResolved = !notebooksPermissionLoading && hasNotebooksAccess;
569
587
  const { data: notebookConversationIdsArray = [] } = useNotebookConversationIds();
570
588
  const { data: notebooks = [], refetch: refetchNotebooks } = useNotebookSessions(notebooksPermissionResolved);
@@ -572,7 +590,6 @@ const LightspeedChat = ({
572
590
  const [openNotebookMenuId, setOpenNotebookMenuId] = useState(
573
591
  null
574
592
  );
575
- const [renameNotebookId, setRenameNotebookId] = useState(null);
576
593
  const [deleteNotebookId, setDeleteNotebookId] = useState(null);
577
594
  const [activeNotebook, setActiveNotebook] = useState(
578
595
  null
@@ -602,6 +619,10 @@ const LightspeedChat = ({
602
619
  []
603
620
  );
604
621
  const createNotebookMutation = useCreateNotebook();
622
+ const handleRenameNotebook = useRenameNotebookWithAlert({
623
+ setAlerts: setNotebookAlerts,
624
+ getNotebookName: (sid) => notebooks.find((n) => n.session_id === sid)?.name ?? "notebook"
625
+ });
605
626
  const { data: notebookDocuments = [], isFetching: isDocumentsFetching } = useNotebookDocuments(activeNotebook?.session_id);
606
627
  const [conversationId, setConversationId] = useState("");
607
628
  const [requestId, setRequestId] = useState("");
@@ -655,6 +676,7 @@ const LightspeedChat = ({
655
676
  refetchNotebooks();
656
677
  }
657
678
  } else {
679
+ setActiveNotebook(null);
658
680
  navigate(
659
681
  routeConversationId ? `${LIGHTSPEED_PATH}/conversation/${routeConversationId}` : LIGHTSPEED_PATH
660
682
  );
@@ -690,9 +712,9 @@ const LightspeedChat = ({
690
712
  );
691
713
  }, [createNotebookMutation, navigate]);
692
714
  const handleCloseNotebook = useCallback(() => {
715
+ setActiveNotebook(null);
693
716
  navigate(`${LIGHTSPEED_PATH}/notebooks`);
694
- refetchNotebooks();
695
- }, [navigate, refetchNotebooks]);
717
+ }, [navigate]);
696
718
  const handleRemoveNotebookAlert = (key) => {
697
719
  setNotebookAlerts(
698
720
  (prevAlerts) => prevAlerts.filter((alert) => alert.key !== key)
@@ -1575,15 +1597,6 @@ const LightspeedChat = ({
1575
1597
  conversationId: targetConversationId
1576
1598
  }
1577
1599
  ),
1578
- renameNotebookId && /* @__PURE__ */ jsx(
1579
- RenameNotebookModal,
1580
- {
1581
- isOpen: Boolean(renameNotebookId),
1582
- onClose: () => setRenameNotebookId(null),
1583
- sessionId: renameNotebookId,
1584
- currentName: notebooks.find((n) => n.session_id === renameNotebookId)?.name ?? ""
1585
- }
1586
- ),
1587
1600
  deleteNotebookId && /* @__PURE__ */ jsx(
1588
1601
  DeleteNotebookModal,
1589
1602
  {
@@ -1850,7 +1863,7 @@ const LightspeedChat = ({
1850
1863
  onSelectNotebook: (notebook) => {
1851
1864
  navigate(`${LIGHTSPEED_PATH}/notebooks/${notebook.session_id}`);
1852
1865
  },
1853
- onRename: setRenameNotebookId,
1866
+ onRename: handleRenameNotebook,
1854
1867
  onDelete: setDeleteNotebookId,
1855
1868
  onCreateNotebook: handleCreateNotebook,
1856
1869
  t
@@ -1860,7 +1873,7 @@ const LightspeedChat = ({
1860
1873
  PermissionRequiredState,
1861
1874
  {
1862
1875
  subject: t("permission.subject.notebooks"),
1863
- permissions: ["intelligent-assistant.notebooks.use"],
1876
+ permissions: [iaNotebooksUsePermissionName],
1864
1877
  action: /* @__PURE__ */ jsx(
1865
1878
  Button,
1866
1879
  {