@red-hat-developer-hub/backstage-plugin-intelligent-assistant 4.1.0 → 4.3.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 (57) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +23 -0
  3. package/config.schema.json +117 -0
  4. package/dist/api/NotebooksApiClient.esm.js +3 -2
  5. package/dist/api/NotebooksApiClient.esm.js.map +1 -1
  6. package/dist/api/notebooksApi.esm.js.map +1 -1
  7. package/dist/components/LightSpeedChat.esm.js +280 -118
  8. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  9. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  10. package/dist/components/LightspeedDrawerProvider.esm.js +5 -4
  11. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  12. package/dist/components/ToastAlertGroup.esm.js +56 -0
  13. package/dist/components/ToastAlertGroup.esm.js.map +1 -0
  14. package/dist/components/notebooks/AddDocumentModal.esm.js +165 -144
  15. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  16. package/dist/components/notebooks/DeleteDocumentModal.esm.js +73 -38
  17. package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -1
  18. package/dist/components/notebooks/DeleteNotebookModal.esm.js +80 -40
  19. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -1
  20. package/dist/components/notebooks/NotebookHeaderActions.esm.js +78 -0
  21. package/dist/components/notebooks/NotebookHeaderActions.esm.js.map +1 -0
  22. package/dist/components/notebooks/NotebookStreamProvider.esm.js +47 -0
  23. package/dist/components/notebooks/NotebookStreamProvider.esm.js.map +1 -0
  24. package/dist/components/notebooks/NotebookView.esm.js +284 -349
  25. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  26. package/dist/components/notebooks/NotebooksTab.esm.js +2 -2
  27. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
  28. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +126 -82
  29. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  30. package/dist/components/notebooks/SidebarCollapseIcon.esm.js +8 -6
  31. package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
  32. package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -0
  33. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
  34. package/dist/components/notebooks/notebookDialogStyles.esm.js +40 -0
  35. package/dist/components/notebooks/notebookDialogStyles.esm.js.map +1 -0
  36. package/dist/components/notebooks/notebookStreamStore.esm.js +282 -0
  37. package/dist/components/notebooks/notebookStreamStore.esm.js.map +1 -0
  38. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +3 -2
  39. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -1
  40. package/dist/hooks/useConversationMessages.esm.js +31 -108
  41. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  42. package/dist/hooks/useLightspeedProviderState.esm.js +14 -5
  43. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  44. package/dist/index.esm.js +2 -2
  45. package/dist/index.esm.js.map +1 -1
  46. package/dist/utils/dom-extractor.esm.js +816 -0
  47. package/dist/utils/dom-extractor.esm.js.map +1 -0
  48. package/dist/utils/dom-selectors.esm.js +91 -0
  49. package/dist/utils/dom-selectors.esm.js.map +1 -0
  50. package/dist/utils/scoped-dialog-utils.esm.js +35 -0
  51. package/dist/utils/scoped-dialog-utils.esm.js.map +1 -0
  52. package/dist/utils/sensitive-data-redactor.esm.js +66 -0
  53. package/dist/utils/sensitive-data-redactor.esm.js.map +1 -0
  54. package/dist/utils/stream-event-helpers.esm.js +105 -0
  55. package/dist/utils/stream-event-helpers.esm.js.map +1 -0
  56. package/package.json +14 -14
  57. package/config.d.ts +0 -99
@@ -8,33 +8,10 @@ import botAvatarDark from '../images/bot-avatar-dark.svg';
8
8
  import botAvatarLight from '../images/bot-avatar.svg';
9
9
  import userAvatar from '../images/user-avatar.svg';
10
10
  import { getConversationsData, createUserMessage, createBotMessage, transformDocumentsToSources, normalizeChatUserInput, getTimestamp } from '../utils/lightspeed-chatbox-utils.esm.js';
11
+ import { createTempToolCallsCacheSessionPrefix, parseSSEBuffer, parseToolCallFromEvent, toolCallIdKey, normalizeToolCalls, parseToolResultFromEvent, applyToolResultToToolCalls } from '../utils/stream-event-helpers.esm.js';
11
12
  import { getSharedToolCallsCache, setSharedToolCallsCache, migrateSharedToolCallsCacheSessionPrefixToConversation, clearSharedToolCallsCacheSessionPrefix } from './toolCallsCacheStore.esm.js';
12
13
  import { useCreateConversationMessage } from './useCreateCoversationMessage.esm.js';
13
14
 
14
- const toolCallIdKey = (id) => {
15
- return String(id);
16
- };
17
- const normalizeToolCalls = (calls) => (calls ?? []).filter((tc) => tc !== null);
18
- const isMcpStyleToolCallPayload = (data) => {
19
- return !!data && typeof data.name === "string" && data.name.trim().length > 0 && data.id !== null;
20
- };
21
- const isLegacyToolResultToken = (token) => {
22
- return !!token && typeof token === "object" && !Array.isArray(token) && typeof token.tool_name === "string" && token.tool_name.length > 0;
23
- };
24
- let tempToolCallsCachePrefixFallbackSeq = 0;
25
- function createTempToolCallsCacheSessionPrefix() {
26
- const suffix = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;
27
- return `lightspeed-temp:${suffix}`;
28
- }
29
- const legacyToolResultToString = (response) => {
30
- if (!response) return "";
31
- if (typeof response === "string") return response;
32
- try {
33
- return JSON.stringify(response);
34
- } catch {
35
- return String(response);
36
- }
37
- };
38
15
  const useFetchConversationMessages = (currentConversation) => {
39
16
  const lightspeedApi = useApi(lightspeedApiRef);
40
17
  return useQuery({
@@ -50,7 +27,7 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
50
27
  const theme = useTheme();
51
28
  const botAvatar = theme.palette.mode === "dark" ? botAvatarDark : botAvatarLight;
52
29
  const { mutateAsync: defaultCreateMessage } = useCreateConversationMessage();
53
- const createMessage = createMessageOverride ?? defaultCreateMessage;
30
+ const createMessage = defaultCreateMessage;
54
31
  const scrollToBottomRef = useRef(null);
55
32
  const [currentConversation, setCurrentConversation] = useState(conversationId);
56
33
  const [conversations, setConversations] = useState({
@@ -198,45 +175,29 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
198
175
  break;
199
176
  }
200
177
  buffer += decoder.decode(value, { stream: true });
201
- const parts = buffer.split("\n\n");
202
- buffer = parts.pop();
203
- for (const part of parts) {
204
- const lines = part.split("\n").filter((line) => line.startsWith("data:"));
205
- const jsonString = lines.map((line) => line.trim().slice(5).trim()).join("");
178
+ const {
179
+ events: parsedEvents,
180
+ parseErrors,
181
+ remainder
182
+ } = parseSSEBuffer(buffer);
183
+ buffer = remainder;
184
+ if (parseErrors.length > 0) {
185
+ console.warn("Error parsing JSON:", parseErrors[0]);
186
+ if (typeof onComplete === "function") {
187
+ onComplete("Invalid JSON received");
188
+ }
189
+ }
190
+ for (const { event, data } of parsedEvents) {
206
191
  try {
207
- const { event, data } = JSON.parse(jsonString);
208
192
  if (event === "start") {
209
193
  requestId = data?.request_id;
210
- onRequestIdReady?.(requestId);
211
194
  if (currentConversation === TEMP_CONVERSATION_ID) {
212
195
  newConversationId = data?.conversation_id;
213
196
  }
197
+ onRequestIdReady?.(requestId, newConversationId || void 0);
214
198
  }
215
199
  if (event === "tool_call") {
216
- const toolCallData = data?.token;
217
- const legacyObjectCall = typeof toolCallData === "object" && toolCallData !== null && !Array.isArray(toolCallData) && toolCallData.tool_name;
218
- const mcpStyle = isMcpStyleToolCallPayload(data);
219
- const rawArgs = data?.args ?? data?.arguments;
220
- const mcpArgs = rawArgs && typeof rawArgs === "object" && !Array.isArray(rawArgs) ? rawArgs : {};
221
- let toolCall;
222
- if (legacyObjectCall && data.id !== null) {
223
- toolCall = {
224
- id: data.id,
225
- toolName: toolCallData.tool_name,
226
- arguments: toolCallData.arguments || {},
227
- startTime: Date.now(),
228
- isLoading: true
229
- };
230
- } else if (mcpStyle) {
231
- toolCall = {
232
- id: data.id,
233
- toolName: data.name.trim(),
234
- description: typeof data.type === "string" && data.type !== data.name ? data.type : void 0,
235
- arguments: mcpArgs,
236
- startTime: Date.now(),
237
- isLoading: true
238
- };
239
- }
200
+ const toolCall = parseToolCallFromEvent(data);
240
201
  if (toolCall && data.id !== null) {
241
202
  const newToolCall = toolCall;
242
203
  pendingToolCalls.current[toolCallIdKey(data.id)] = newToolCall;
@@ -284,48 +245,20 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
284
245
  }
285
246
  }
286
247
  if (event === "tool_result") {
287
- const tokenResult = data?.token;
288
- const legacyResult = isLegacyToolResultToken(tokenResult);
289
- const mcpHasContent = data?.id !== null && data.content !== void 0 && !legacyResult;
290
- let responsePayload;
291
- let matchToolName;
292
- let toolIdKey;
293
- if (legacyResult) {
294
- responsePayload = legacyToolResultToString(
295
- tokenResult.response
296
- );
297
- matchToolName = tokenResult.tool_name;
298
- toolIdKey = data?.id !== null ? toolCallIdKey(data.id) : void 0;
299
- } else if (mcpHasContent) {
300
- toolIdKey = toolCallIdKey(data.id);
301
- responsePayload = typeof data.content === "string" ? data.content : JSON.stringify(data.content);
302
- if (typeof data.status === "string" && data.status !== "success") {
303
- responsePayload = `[${data.status}] ${responsePayload}`;
304
- }
305
- }
306
- if (responsePayload !== void 0 && toolIdKey !== void 0) {
307
- const pendingCall = pendingToolCalls.current[toolIdKey];
308
- const endTime = Date.now();
309
- const executionTime = pendingCall ? (endTime - pendingCall.startTime) / 1e3 : 0;
248
+ const result = parseToolResultFromEvent(
249
+ data,
250
+ pendingToolCalls.current
251
+ );
252
+ if (result) {
310
253
  setConversations((prevConversations) => {
311
254
  const conversation = prevConversations[currentConversation] ?? [];
312
255
  const lastMessageIndex = conversation.length - 1;
313
256
  if (lastMessageIndex < 0) return prevConversations;
314
257
  const lastMessage = { ...conversation[lastMessageIndex] };
315
- const toolCalls = lastMessage.toolCalls || [];
316
- const updatedToolCalls = toolCalls.map((tc) => {
317
- const idMatches = toolCallIdKey(tc.id) === toolIdKey || matchToolName !== void 0 && tc.toolName === matchToolName;
318
- if (idMatches) {
319
- return {
320
- ...tc,
321
- response: responsePayload,
322
- endTime,
323
- executionTime,
324
- isLoading: false
325
- };
326
- }
327
- return tc;
328
- });
258
+ const updatedToolCalls = applyToolResultToToolCalls(
259
+ lastMessage.toolCalls || [],
260
+ result
261
+ );
329
262
  lastMessage.toolCalls = updatedToolCalls;
330
263
  const messageIndex = Math.floor(lastMessageIndex / 2);
331
264
  const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;
@@ -341,26 +274,16 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
341
274
  });
342
275
  const [humanMessage, aiMessage] = streamingConversations.current[currentConversation] || [];
343
276
  if (aiMessage) {
344
- const toolCalls = aiMessage.toolCalls || [];
345
- const updatedToolCalls = toolCalls.map((tc) => {
346
- const idMatches = toolCallIdKey(tc.id) === toolIdKey || matchToolName !== void 0 && tc.toolName === matchToolName;
347
- if (idMatches) {
348
- return {
349
- ...tc,
350
- response: responsePayload,
351
- endTime,
352
- executionTime,
353
- isLoading: false
354
- };
355
- }
356
- return tc;
357
- });
277
+ const updatedToolCalls = applyToolResultToToolCalls(
278
+ aiMessage.toolCalls || [],
279
+ result
280
+ );
358
281
  streamingConversations.current[currentConversation] = [
359
282
  humanMessage,
360
283
  { ...aiMessage, toolCalls: updatedToolCalls }
361
284
  ];
362
285
  }
363
- delete pendingToolCalls.current[toolIdKey];
286
+ delete pendingToolCalls.current[result.toolIdKey];
364
287
  }
365
288
  }
366
289
  if (event === "token") {
@@ -1 +1 @@
1
- {"version":3,"file":"useConversationMessages.esm.js","sources":["../../src/hooks/useConversationMessages.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 { RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useTheme } from '@mui/material/styles';\nimport { MessageProps } from '@patternfly/chatbot';\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ScrollContainerHandle } from '../components/LightspeedChatBox';\nimport { TEMP_CONVERSATION_ID } from '../const';\nimport botAvatarDark from '../images/bot-avatar-dark.svg';\nimport botAvatarLight from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport { Attachment, BaseMessage, LCSConversation, ToolCall } from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n normalizeChatUserInput,\n transformDocumentsToSources,\n} from '../utils/lightspeed-chatbox-utils';\nimport {\n clearSharedToolCallsCacheSessionPrefix,\n getSharedToolCallsCache,\n migrateSharedToolCallsCacheSessionPrefixToConversation,\n setSharedToolCallsCache,\n} from './toolCallsCacheStore';\nimport {\n CreateMessageVariables,\n useCreateConversationMessage,\n} from './useCreateCoversationMessage';\n\nconst toolCallIdKey = (id: string | number): string => {\n return String(id);\n};\n\nconst normalizeToolCalls = (\n calls: (ToolCall | undefined)[] | undefined,\n): ToolCall[] => (calls ?? []).filter((tc): tc is ToolCall => tc !== null);\n\nconst isMcpStyleToolCallPayload = (\n data: Record<string, any> | undefined,\n): boolean => {\n return (\n !!data &&\n typeof data.name === 'string' &&\n data.name.trim().length > 0 &&\n data.id !== null\n );\n};\n\n/** Legacy tool_result uses data.token with at least tool_name and response. */\nconst isLegacyToolResultToken = (\n token: unknown,\n): token is { tool_name: string; response?: unknown } => {\n return (\n !!token &&\n typeof token === 'object' &&\n !Array.isArray(token) &&\n typeof (token as { tool_name?: string }).tool_name === 'string' &&\n (token as { tool_name: string }).tool_name.length > 0\n );\n};\n\nlet tempToolCallsCachePrefixFallbackSeq = 0;\n\n/** Unique prefix per temp send so late streams cannot migrate another session's tool cache. */\nfunction createTempToolCallsCacheSessionPrefix(): string {\n const suffix =\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;\n return `lightspeed-temp:${suffix}`;\n}\n\nconst legacyToolResultToString = (response: unknown): string => {\n if (!response) return '';\n if (typeof response === 'string') return response;\n try {\n return JSON.stringify(response);\n } catch {\n return String(response);\n }\n};\n\n// Fetch all conversation messages\nexport const useFetchConversationMessages = (\n currentConversation: string,\n): UseQueryResult<BaseMessage[] | undefined, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversationMessages', currentConversation],\n queryFn: currentConversation\n ? async () => {\n const response =\n await lightspeedApi.getConversationMessages(currentConversation);\n\n return response;\n }\n : undefined,\n retry: false,\n });\n};\n\n// Extended message type to include tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype Conversations = { [_key: string]: ExtendedMessageProps[] };\n\nexport type UseConversationMessagesReturn = {\n conversationMessages: ExtendedMessageProps[];\n handleInputPrompt: (\n prompt: string,\n attachments?: Attachment[],\n ) => Promise<void>;\n conversations: Conversations;\n scrollToBottomRef: RefObject<ScrollContainerHandle | null>;\n streamingConversationId: string | null;\n data?: BaseMessage[] | undefined;\n error: Error | null;\n isPending: boolean;\n isFetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n status: 'pending' | 'error' | 'success';\n refetch: () => void;\n};\n\n/**\n * Fetches all the messages for given conversation_id\n * @param conversationId\n * @param userName\n * @param selectedModel\n * @param selectedProvider\n * @param avatar\n *\n */\nexport const useConversationMessages = (\n conversationId: string,\n userName: string | undefined,\n selectedModel: string,\n selectedProvider: string,\n avatar: string = userAvatar,\n onComplete?: (message: string) => void,\n onStart?: (conversation_id: string) => void,\n createMessageOverride?: (\n vars: CreateMessageVariables,\n ) => Promise<ReadableStreamDefaultReader<Uint8Array>>,\n onRequestIdReady?: (request_id: string) => void,\n): UseConversationMessagesReturn => {\n const theme = useTheme();\n const botAvatar =\n theme.palette.mode === 'dark' ? botAvatarDark : botAvatarLight;\n const { mutateAsync: defaultCreateMessage } = useCreateConversationMessage();\n const createMessage = createMessageOverride ?? defaultCreateMessage;\n const scrollToBottomRef = useRef<ScrollContainerHandle>(null);\n\n const [currentConversation, setCurrentConversation] =\n useState(conversationId);\n const [conversations, setConversations] = useState<Conversations>({\n [currentConversation]: [],\n });\n const streamingConversations = useRef<Conversations>({\n [currentConversation]: [],\n });\n\n /** True while a send on the provisional thread is still running (even if UI switched to another conv). */\n const isTempStreamInProgressRef = useRef(false);\n\n const [streamingConversationId, setStreamingConversationId] = useState<\n string | null\n >(null);\n\n // Track pending tool calls during streaming\n const pendingToolCalls = useRef<Record<string, ToolCall>>({});\n\n useEffect(() => {\n if (currentConversation !== conversationId) {\n setCurrentConversation(conversationId);\n setConversations(prev => {\n // New chat from the nav resets TEMP to []. When returning to a still-streaming temp thread,\n // keep existing messages so the user sees the full inflight exchange (RHDHBUGS-3040).\n if (conversationId === TEMP_CONVERSATION_ID) {\n if (\n isTempStreamInProgressRef.current &&\n (prev[TEMP_CONVERSATION_ID]?.length ?? 0) > 0\n ) {\n return prev;\n }\n return { ...prev, [TEMP_CONVERSATION_ID]: [] };\n }\n if (prev[conversationId]) return prev;\n return {\n ...prev,\n [conversationId]: [],\n };\n });\n }\n }, [currentConversation, conversationId]);\n\n const { data: conversationsData = [], ...queryProps } =\n useFetchConversationMessages(currentConversation);\n\n useEffect(() => {\n if (!Array.isArray(conversationsData) || conversationsData.length === 0)\n return;\n\n const newConvoIndex: number[] = [];\n\n if (conversations) {\n const _conversations: { [key: string]: any[] } = {\n [currentConversation]: [],\n };\n\n let index = 0;\n for (let i = 0; i < conversationsData.length; i++) {\n const [userMessage, aiMessage] = getConversationsData(\n conversationsData[i] as unknown as LCSConversation,\n );\n\n // Create user message\n const userMsg = createUserMessage({\n avatar,\n name: userName,\n content: userMessage.content,\n timestamp: userMessage.timestamp,\n });\n\n // Create bot message\n const botMsg = createBotMessage({\n avatar: botAvatar,\n isLoading: false,\n name: conversationsData[i].model ?? selectedModel,\n content: aiMessage.content,\n timestamp: aiMessage.timestamp,\n sources: transformDocumentsToSources(\n aiMessage?.referenced_documents ?? [],\n ),\n });\n\n // Merge cached tool calls if available\n const cacheKey = `${currentConversation}-${i}`;\n const cachedToolCalls = getSharedToolCallsCache(cacheKey);\n if (cachedToolCalls && cachedToolCalls.length > 0) {\n botMsg.toolCalls = cachedToolCalls;\n }\n\n _conversations[currentConversation].push(userMsg, botMsg);\n\n newConvoIndex.push(index);\n index++;\n }\n\n if (streamingConversations.current[currentConversation]) {\n _conversations[currentConversation].push(\n ...streamingConversations.current[currentConversation],\n );\n }\n\n setConversations(prev => ({\n ...prev,\n ..._conversations,\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n conversationsData,\n userName,\n avatar,\n currentConversation,\n selectedModel,\n streamingConversations,\n ]);\n\n const handleInputPrompt = useCallback(\n async (prompt: string, attachments: Attachment[] = []) => {\n const normalizedPrompt = normalizeChatUserInput(prompt);\n if (!normalizedPrompt) {\n return;\n }\n\n const streamStartedOnTemp = currentConversation === TEMP_CONVERSATION_ID;\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = true;\n }\n\n try {\n let newConversationId = '';\n let requestId = '';\n setStreamingConversationId(currentConversation);\n\n const toolCallsCacheKeyPrefix =\n currentConversation === TEMP_CONVERSATION_ID\n ? createTempToolCallsCacheSessionPrefix()\n : currentConversation;\n\n const conversationTuple = [\n createUserMessage({\n avatar,\n name: userName,\n content: normalizedPrompt,\n timestamp: getTimestamp(Date.now()) ?? '',\n }),\n createBotMessage({\n avatar: botAvatar,\n isLoading: true,\n name: selectedModel,\n content: '',\n timestamp: '',\n }),\n ];\n\n streamingConversations.current = {\n ...streamingConversations.current,\n [currentConversation]: conversationTuple,\n };\n\n setConversations((prevConv: Conversations) => {\n return {\n ...prevConv,\n [currentConversation]: [\n ...(prevConv?.[currentConversation] ?? []),\n ...conversationTuple,\n ],\n };\n });\n\n setTimeout(() => {\n scrollToBottomRef.current?.scrollToBottom();\n }, 0);\n const finalMessages: string[] = [];\n let buffer = '';\n\n try {\n const reader = await createMessage({\n prompt: normalizedPrompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n });\n\n const decoder = new TextDecoder('utf-8');\n let streamEnded = false;\n\n while (!streamEnded) {\n const { value, done } = await reader.read();\n if (done) {\n streamEnded = true;\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process all complete messages separated by double newlines\n const parts = buffer.split('\\n\\n');\n buffer = parts.pop()!;\n\n for (const part of parts) {\n const lines = part\n .split('\\n')\n .filter(line => line.startsWith('data:'));\n\n const jsonString = lines\n .map(line => line.trim().slice(5).trim())\n .join('');\n try {\n const { event, data } = JSON.parse(jsonString);\n if (event === 'start') {\n requestId = data?.request_id;\n onRequestIdReady?.(requestId);\n\n if (currentConversation === TEMP_CONVERSATION_ID) {\n // If the conversation is temp, we need to set the new conversation id\n newConversationId = data?.conversation_id;\n }\n }\n\n // Handle tool_call event\n if (event === 'tool_call') {\n const toolCallData = data?.token;\n const legacyObjectCall =\n typeof toolCallData === 'object' &&\n toolCallData !== null &&\n !Array.isArray(toolCallData) &&\n (toolCallData as { tool_name?: string }).tool_name;\n\n const mcpStyle = isMcpStyleToolCallPayload(data);\n const rawArgs = data?.args ?? data?.arguments;\n const mcpArgs: Record<string, any> =\n rawArgs &&\n typeof rawArgs === 'object' &&\n !Array.isArray(rawArgs)\n ? rawArgs\n : {};\n\n let toolCall: ToolCall | undefined;\n // Prefer legacy token object when present (backward compatible)\n if (legacyObjectCall && data.id !== null) {\n toolCall = {\n id: data.id,\n toolName: (toolCallData as { tool_name: string })\n .tool_name,\n arguments:\n (toolCallData as { arguments?: Record<string, any> })\n .arguments || {},\n startTime: Date.now(),\n isLoading: true,\n };\n } else if (mcpStyle) {\n toolCall = {\n id: data.id,\n toolName: data.name.trim(),\n description:\n typeof data.type === 'string' && data.type !== data.name\n ? data.type\n : undefined,\n arguments: mcpArgs,\n startTime: Date.now(),\n isLoading: true,\n };\n }\n\n if (toolCall && data.id !== null) {\n const newToolCall: ToolCall = toolCall;\n pendingToolCalls.current[toolCallIdKey(data.id)] =\n newToolCall;\n\n // Update the bot message with the pending tool call\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const existingToolCalls = normalizeToolCalls(\n lastMessage.toolCalls,\n );\n const nextToolCalls: ToolCall[] = [\n ...existingToolCalls,\n newToolCall,\n ];\n lastMessage.toolCalls = nextToolCalls;\n\n // Cache tool calls for this message (message pair index)\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, nextToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const existingStreamingToolCalls = normalizeToolCalls(\n aiMessage.toolCalls,\n );\n streamingConversations.current[currentConversation] = [\n humanMessage,\n {\n ...aiMessage,\n toolCalls: [\n ...existingStreamingToolCalls,\n newToolCall,\n ],\n },\n ];\n }\n }\n }\n\n // Handle tool_result event\n if (event === 'tool_result') {\n const tokenResult = data?.token;\n const legacyResult = isLegacyToolResultToken(tokenResult);\n\n const mcpHasContent =\n data?.id !== null &&\n data.content !== undefined &&\n !legacyResult;\n\n let responsePayload: string | undefined;\n let matchToolName: string | undefined;\n let toolIdKey: string | undefined;\n\n if (legacyResult) {\n responsePayload = legacyToolResultToString(\n tokenResult.response,\n );\n matchToolName = tokenResult.tool_name;\n toolIdKey =\n data?.id !== null ? toolCallIdKey(data.id) : undefined;\n } else if (mcpHasContent) {\n toolIdKey = toolCallIdKey(data.id);\n responsePayload =\n typeof data.content === 'string'\n ? data.content\n : JSON.stringify(data.content);\n if (\n typeof data.status === 'string' &&\n data.status !== 'success'\n ) {\n responsePayload = `[${data.status}] ${responsePayload}`;\n }\n }\n\n if (\n responsePayload !== undefined &&\n toolIdKey !== undefined\n ) {\n const pendingCall = pendingToolCalls.current[toolIdKey];\n const endTime = Date.now();\n const executionTime = pendingCall\n ? (endTime - pendingCall.startTime) / 1000\n : 0;\n\n // Update the tool call with result\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const toolCalls = lastMessage.toolCalls || [];\n\n // Find and update the matching tool call\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n\n lastMessage.toolCalls = updatedToolCalls;\n\n // Update cache with completed tool call\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, updatedToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const toolCalls = aiMessage.toolCalls || [];\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, toolCalls: updatedToolCalls },\n ];\n }\n\n // Clean up pending tool call\n delete pendingToolCalls.current[toolIdKey];\n }\n }\n\n if (event === 'token') {\n const content = data?.token || '';\n\n finalMessages.push(content);\n\n // Store streaming message\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation];\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, content: aiMessage.content + content },\n ];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n if ((lastMessage?.content ?? '').trim().length > 0) {\n lastMessage.isLoading = false;\n }\n lastMessage.content += content;\n lastMessage.name =\n data?.response_metadata?.model || selectedModel;\n lastMessage.timestamp = getTimestamp(\n // TODO: To be fixed in the query response\n data?.response_metadata?.created_at || Date.now(),\n );\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n\n if (event === 'interrupted') {\n if (\n currentConversation === TEMP_CONVERSATION_ID &&\n data?.conversation_id\n ) {\n newConversationId = data.conversation_id;\n }\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : {\n ...conversation[lastMessageIndex],\n isLoading: false,\n };\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n streamEnded = true;\n break;\n }\n\n if (event === 'end') {\n const documents = data?.referenced_documents || [];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : {\n ...conversation[lastMessageIndex],\n isLoading: false,\n };\n\n const sourcesFromDocs =\n transformDocumentsToSources(documents);\n if (sourcesFromDocs) {\n lastMessage.sources = sourcesFromDocs;\n }\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error parsing JSON:', error);\n if (typeof onComplete === 'function') {\n onComplete('Invalid JSON received');\n }\n }\n }\n if (streamEnded) break;\n }\n } catch (e) {\n setConversations(prevConversations => {\n const conversation = prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n lastMessage.isLoading = false;\n lastMessage.content += e;\n lastMessage.error = {\n title: e.message,\n };\n lastMessage.timestamp = getTimestamp(Date.now());\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n finalMessages.push(`${e}`);\n\n return {\n ...prevConversations,\n [newConversationId.length > 0\n ? newConversationId\n : currentConversation]: updatedConversation,\n };\n });\n }\n // reset current streaming\n streamingConversations.current[currentConversation] = [];\n if (typeof onComplete === 'function') {\n onComplete(finalMessages.join(''));\n }\n // Swap temp conversation messages with new conversation\n\n if (currentConversation === TEMP_CONVERSATION_ID && newConversationId) {\n migrateSharedToolCallsCacheSessionPrefixToConversation(\n toolCallsCacheKeyPrefix,\n newConversationId,\n );\n\n setConversations(prevConversations => {\n return {\n ...prevConversations,\n [newConversationId]: prevConversations[TEMP_CONVERSATION_ID],\n };\n });\n\n onStart?.(newConversationId);\n\n // Defer removal so it runs after the sync useEffect updates currentConversation.\n setTimeout(() => {\n setConversations(prev => {\n const { [TEMP_CONVERSATION_ID]: _, ...rest } = prev;\n return rest;\n });\n }, 0);\n } else if (currentConversation === TEMP_CONVERSATION_ID) {\n clearSharedToolCallsCacheSessionPrefix(toolCallsCacheKeyPrefix);\n }\n } finally {\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = false;\n }\n setStreamingConversationId(null);\n }\n },\n\n [\n avatar,\n botAvatar,\n userName,\n onComplete,\n onStart,\n onRequestIdReady,\n selectedModel,\n selectedProvider,\n createMessage,\n currentConversation,\n ],\n );\n\n return {\n conversationMessages: conversations[currentConversation] ?? [],\n handleInputPrompt,\n conversations,\n scrollToBottomRef,\n streamingConversationId,\n ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useConversationMessages.esm.js","sources":["../../src/hooks/useConversationMessages.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 { RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useTheme } from '@mui/material/styles';\nimport { MessageProps } from '@patternfly/chatbot';\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ScrollContainerHandle } from '../components/LightspeedChatBox';\nimport { TEMP_CONVERSATION_ID } from '../const';\nimport botAvatarDark from '../images/bot-avatar-dark.svg';\nimport botAvatarLight from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport { Attachment, BaseMessage, LCSConversation, ToolCall } from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n normalizeChatUserInput,\n transformDocumentsToSources,\n} from '../utils/lightspeed-chatbox-utils';\nimport {\n applyToolResultToToolCalls,\n createTempToolCallsCacheSessionPrefix,\n normalizeToolCalls,\n parseSSEBuffer,\n parseToolCallFromEvent,\n parseToolResultFromEvent,\n toolCallIdKey,\n} from '../utils/stream-event-helpers';\nimport {\n clearSharedToolCallsCacheSessionPrefix,\n getSharedToolCallsCache,\n migrateSharedToolCallsCacheSessionPrefixToConversation,\n setSharedToolCallsCache,\n} from './toolCallsCacheStore';\nimport {\n CreateMessageVariables,\n useCreateConversationMessage,\n} from './useCreateCoversationMessage';\n\n// Fetch all conversation messages\nexport const useFetchConversationMessages = (\n currentConversation: string,\n): UseQueryResult<BaseMessage[] | undefined, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversationMessages', currentConversation],\n queryFn: currentConversation\n ? async () => {\n const response =\n await lightspeedApi.getConversationMessages(currentConversation);\n\n return response;\n }\n : undefined,\n retry: false,\n });\n};\n\n// Extended message type to include tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype Conversations = { [_key: string]: ExtendedMessageProps[] };\n\nexport type UseConversationMessagesReturn = {\n conversationMessages: ExtendedMessageProps[];\n handleInputPrompt: (\n prompt: string,\n attachments?: Attachment[],\n ) => Promise<void>;\n conversations: Conversations;\n scrollToBottomRef: RefObject<ScrollContainerHandle | null>;\n streamingConversationId: string | null;\n data?: BaseMessage[] | undefined;\n error: Error | null;\n isPending: boolean;\n isFetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n status: 'pending' | 'error' | 'success';\n refetch: () => void;\n};\n\n/**\n * Fetches all the messages for given conversation_id\n * @param conversationId\n * @param userName\n * @param selectedModel\n * @param selectedProvider\n * @param avatar\n *\n */\nexport const useConversationMessages = (\n conversationId: string,\n userName: string | undefined,\n selectedModel: string,\n selectedProvider: string,\n avatar: string = userAvatar,\n onComplete?: (message: string) => void,\n onStart?: (conversation_id: string) => void,\n createMessageOverride?: (\n vars: CreateMessageVariables,\n ) => Promise<ReadableStreamDefaultReader<Uint8Array>>,\n onRequestIdReady?: (request_id: string, conversation_id?: string) => void,\n): UseConversationMessagesReturn => {\n const theme = useTheme();\n const botAvatar =\n theme.palette.mode === 'dark' ? botAvatarDark : botAvatarLight;\n const { mutateAsync: defaultCreateMessage } = useCreateConversationMessage();\n const createMessage = createMessageOverride ?? defaultCreateMessage;\n const scrollToBottomRef = useRef<ScrollContainerHandle>(null);\n\n const [currentConversation, setCurrentConversation] =\n useState(conversationId);\n const [conversations, setConversations] = useState<Conversations>({\n [currentConversation]: [],\n });\n const streamingConversations = useRef<Conversations>({\n [currentConversation]: [],\n });\n\n /** True while a send on the provisional thread is still running (even if UI switched to another conv). */\n const isTempStreamInProgressRef = useRef(false);\n\n const [streamingConversationId, setStreamingConversationId] = useState<\n string | null\n >(null);\n\n // Track pending tool calls during streaming\n const pendingToolCalls = useRef<Record<string, ToolCall>>({});\n\n useEffect(() => {\n if (currentConversation !== conversationId) {\n setCurrentConversation(conversationId);\n setConversations(prev => {\n // New chat from the nav resets TEMP to []. When returning to a still-streaming temp thread,\n // keep existing messages so the user sees the full inflight exchange (RHDHBUGS-3040).\n if (conversationId === TEMP_CONVERSATION_ID) {\n if (\n isTempStreamInProgressRef.current &&\n (prev[TEMP_CONVERSATION_ID]?.length ?? 0) > 0\n ) {\n return prev;\n }\n return { ...prev, [TEMP_CONVERSATION_ID]: [] };\n }\n if (prev[conversationId]) return prev;\n return {\n ...prev,\n [conversationId]: [],\n };\n });\n }\n }, [currentConversation, conversationId]);\n\n const { data: conversationsData = [], ...queryProps } =\n useFetchConversationMessages(currentConversation);\n\n useEffect(() => {\n if (!Array.isArray(conversationsData) || conversationsData.length === 0)\n return;\n\n const newConvoIndex: number[] = [];\n\n if (conversations) {\n const _conversations: { [key: string]: any[] } = {\n [currentConversation]: [],\n };\n\n let index = 0;\n for (let i = 0; i < conversationsData.length; i++) {\n const [userMessage, aiMessage] = getConversationsData(\n conversationsData[i] as unknown as LCSConversation,\n );\n\n // Create user message\n const userMsg = createUserMessage({\n avatar,\n name: userName,\n content: userMessage.content,\n timestamp: userMessage.timestamp,\n });\n\n // Create bot message\n const botMsg = createBotMessage({\n avatar: botAvatar,\n isLoading: false,\n name: conversationsData[i].model ?? selectedModel,\n content: aiMessage.content,\n timestamp: aiMessage.timestamp,\n sources: transformDocumentsToSources(\n aiMessage?.referenced_documents ?? [],\n ),\n });\n\n // Merge cached tool calls if available\n const cacheKey = `${currentConversation}-${i}`;\n const cachedToolCalls = getSharedToolCallsCache(cacheKey);\n if (cachedToolCalls && cachedToolCalls.length > 0) {\n botMsg.toolCalls = cachedToolCalls;\n }\n\n _conversations[currentConversation].push(userMsg, botMsg);\n\n newConvoIndex.push(index);\n index++;\n }\n\n if (streamingConversations.current[currentConversation]) {\n _conversations[currentConversation].push(\n ...streamingConversations.current[currentConversation],\n );\n }\n\n setConversations(prev => ({\n ...prev,\n ..._conversations,\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n conversationsData,\n userName,\n avatar,\n currentConversation,\n selectedModel,\n streamingConversations,\n ]);\n\n const handleInputPrompt = useCallback(\n async (prompt: string, attachments: Attachment[] = []) => {\n const normalizedPrompt = normalizeChatUserInput(prompt);\n if (!normalizedPrompt) {\n return;\n }\n\n const streamStartedOnTemp = currentConversation === TEMP_CONVERSATION_ID;\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = true;\n }\n\n try {\n let newConversationId = '';\n let requestId = '';\n setStreamingConversationId(currentConversation);\n\n const toolCallsCacheKeyPrefix =\n currentConversation === TEMP_CONVERSATION_ID\n ? createTempToolCallsCacheSessionPrefix()\n : currentConversation;\n\n const conversationTuple = [\n createUserMessage({\n avatar,\n name: userName,\n content: normalizedPrompt,\n timestamp: getTimestamp(Date.now()) ?? '',\n }),\n createBotMessage({\n avatar: botAvatar,\n isLoading: true,\n name: selectedModel,\n content: '',\n timestamp: '',\n }),\n ];\n\n streamingConversations.current = {\n ...streamingConversations.current,\n [currentConversation]: conversationTuple,\n };\n\n setConversations((prevConv: Conversations) => {\n return {\n ...prevConv,\n [currentConversation]: [\n ...(prevConv?.[currentConversation] ?? []),\n ...conversationTuple,\n ],\n };\n });\n\n setTimeout(() => {\n scrollToBottomRef.current?.scrollToBottom();\n }, 0);\n const finalMessages: string[] = [];\n let buffer = '';\n\n try {\n const reader = await createMessage({\n prompt: normalizedPrompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n });\n\n const decoder = new TextDecoder('utf-8');\n let streamEnded = false;\n\n while (!streamEnded) {\n const { value, done } = await reader.read();\n if (done) {\n streamEnded = true;\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const {\n events: parsedEvents,\n parseErrors,\n remainder,\n } = parseSSEBuffer(buffer);\n buffer = remainder;\n\n if (parseErrors.length > 0) {\n // eslint-disable-next-line no-console\n console.warn('Error parsing JSON:', parseErrors[0]);\n if (typeof onComplete === 'function') {\n onComplete('Invalid JSON received');\n }\n }\n\n for (const { event, data } of parsedEvents) {\n try {\n if (event === 'start') {\n requestId = data?.request_id;\n\n if (currentConversation === TEMP_CONVERSATION_ID) {\n newConversationId = data?.conversation_id;\n }\n\n onRequestIdReady?.(requestId, newConversationId || undefined);\n }\n\n if (event === 'tool_call') {\n const toolCall = parseToolCallFromEvent(data);\n\n if (toolCall && data.id !== null) {\n const newToolCall: ToolCall = toolCall;\n pendingToolCalls.current[toolCallIdKey(data.id)] =\n newToolCall;\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const existingToolCalls = normalizeToolCalls(\n lastMessage.toolCalls,\n );\n const nextToolCalls: ToolCall[] = [\n ...existingToolCalls,\n newToolCall,\n ];\n lastMessage.toolCalls = nextToolCalls;\n\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, nextToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const existingStreamingToolCalls = normalizeToolCalls(\n aiMessage.toolCalls,\n );\n streamingConversations.current[currentConversation] = [\n humanMessage,\n {\n ...aiMessage,\n toolCalls: [\n ...existingStreamingToolCalls,\n newToolCall,\n ],\n },\n ];\n }\n }\n }\n\n if (event === 'tool_result') {\n const result = parseToolResultFromEvent(\n data,\n pendingToolCalls.current,\n );\n\n if (result) {\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const updatedToolCalls = applyToolResultToToolCalls(\n lastMessage.toolCalls || [],\n result,\n );\n\n lastMessage.toolCalls = updatedToolCalls;\n\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, updatedToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const updatedToolCalls = applyToolResultToToolCalls(\n aiMessage.toolCalls || [],\n result,\n );\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, toolCalls: updatedToolCalls },\n ];\n }\n\n delete pendingToolCalls.current[result.toolIdKey];\n }\n }\n\n if (event === 'token') {\n const content = data?.token || '';\n\n finalMessages.push(content);\n\n // Store streaming message\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation];\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, content: aiMessage.content + content },\n ];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n if ((lastMessage?.content ?? '').trim().length > 0) {\n lastMessage.isLoading = false;\n }\n lastMessage.content += content;\n lastMessage.name =\n data?.response_metadata?.model || selectedModel;\n lastMessage.timestamp = getTimestamp(\n // TODO: To be fixed in the query response\n data?.response_metadata?.created_at || Date.now(),\n );\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n\n if (event === 'interrupted') {\n if (\n currentConversation === TEMP_CONVERSATION_ID &&\n data?.conversation_id\n ) {\n newConversationId = data.conversation_id;\n }\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : {\n ...conversation[lastMessageIndex],\n isLoading: false,\n };\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n streamEnded = true;\n break;\n }\n\n if (event === 'end') {\n const documents = data?.referenced_documents || [];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : {\n ...conversation[lastMessageIndex],\n isLoading: false,\n };\n\n const sourcesFromDocs =\n transformDocumentsToSources(documents);\n if (sourcesFromDocs) {\n lastMessage.sources = sourcesFromDocs;\n }\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error parsing JSON:', error);\n if (typeof onComplete === 'function') {\n onComplete('Invalid JSON received');\n }\n }\n }\n if (streamEnded) break;\n }\n } catch (e) {\n setConversations(prevConversations => {\n const conversation = prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n lastMessage.isLoading = false;\n lastMessage.content += e;\n lastMessage.error = {\n title: e.message,\n };\n lastMessage.timestamp = getTimestamp(Date.now());\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n finalMessages.push(`${e}`);\n\n return {\n ...prevConversations,\n [newConversationId.length > 0\n ? newConversationId\n : currentConversation]: updatedConversation,\n };\n });\n }\n // reset current streaming\n streamingConversations.current[currentConversation] = [];\n if (typeof onComplete === 'function') {\n onComplete(finalMessages.join(''));\n }\n // Swap temp conversation messages with new conversation\n\n if (currentConversation === TEMP_CONVERSATION_ID && newConversationId) {\n migrateSharedToolCallsCacheSessionPrefixToConversation(\n toolCallsCacheKeyPrefix,\n newConversationId,\n );\n\n setConversations(prevConversations => {\n return {\n ...prevConversations,\n [newConversationId]: prevConversations[TEMP_CONVERSATION_ID],\n };\n });\n\n onStart?.(newConversationId);\n\n // Defer removal so it runs after the sync useEffect updates currentConversation.\n setTimeout(() => {\n setConversations(prev => {\n const { [TEMP_CONVERSATION_ID]: _, ...rest } = prev;\n return rest;\n });\n }, 0);\n } else if (currentConversation === TEMP_CONVERSATION_ID) {\n clearSharedToolCallsCacheSessionPrefix(toolCallsCacheKeyPrefix);\n }\n } finally {\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = false;\n }\n setStreamingConversationId(null);\n }\n },\n\n [\n avatar,\n botAvatar,\n userName,\n onComplete,\n onStart,\n onRequestIdReady,\n selectedModel,\n selectedProvider,\n createMessage,\n currentConversation,\n ],\n );\n\n return {\n conversationMessages: conversations[currentConversation] ?? [],\n handleInputPrompt,\n conversations,\n scrollToBottomRef,\n streamingConversationId,\n ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -25,6 +25,9 @@ function useLightspeedProviderState() {
25
25
  const [draftMessage, setDraftMessageState] = useState("");
26
26
  const [draftFileContents, setDraftFileContentsState] = useState([]);
27
27
  const [shellViewTab, setShellViewTabState] = useState(0);
28
+ const [activeNotebookId, setActiveNotebookId] = useState(
29
+ void 0
30
+ );
28
31
  const shellViewTabRef = useRef(shellViewTab);
29
32
  shellViewTabRef.current = shellViewTab;
30
33
  const setShellViewTab = useCallback((tab) => {
@@ -38,9 +41,13 @@ function useLightspeedProviderState() {
38
41
  const pendingOverlayThreadHandoffRef = useRef(false);
39
42
  const lightspeedPathnamePrevRef = useRef(null);
40
43
  const isLightspeedRouteRef = useRef(false);
44
+ const isOnNotebooksPathRef = useRef(false);
41
45
  const persistedDisplayModeRef = useRef(persistedDisplayMode);
42
46
  const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);
43
47
  isLightspeedRouteRef.current = isLightspeedRoute;
48
+ isOnNotebooksPathRef.current = location.pathname.startsWith(
49
+ `${LIGHTSPEED_PATH}/notebooks`
50
+ );
44
51
  persistedDisplayModeRef.current = persistedDisplayMode;
45
52
  const conversationMatch = useMatch(
46
53
  `${LIGHTSPEED_PATH}/conversation/:conversationId`
@@ -172,7 +179,7 @@ function useLightspeedProviderState() {
172
179
  const setCurrentConversationId = useCallback(
173
180
  (id) => {
174
181
  setCurrentConversationIdState(id);
175
- if (persistedDisplayModeRef.current === ChatbotDisplayMode.embedded && isLightspeedRouteRef.current) {
182
+ if (persistedDisplayModeRef.current === ChatbotDisplayMode.embedded && isLightspeedRouteRef.current && !isOnNotebooksPathRef.current) {
176
183
  navigate(lightspeedRoutePath(id), { replace: true });
177
184
  }
178
185
  },
@@ -210,7 +217,6 @@ function useLightspeedProviderState() {
210
217
  }
211
218
  setIsOpen(true);
212
219
  } else {
213
- setShellViewTab(0);
214
220
  if (isLightspeedRoute) {
215
221
  leavingLightspeedForNonEmbeddedShellRef.current = true;
216
222
  pendingOverlayThreadHandoffRef.current = true;
@@ -226,7 +232,6 @@ function useLightspeedProviderState() {
226
232
  leaveLightspeedRouteForShellDisplayMode,
227
233
  navigate,
228
234
  setPersistedDisplayMode,
229
- setShellViewTab,
230
235
  syncShellDrawerForMode
231
236
  ]
232
237
  );
@@ -247,7 +252,9 @@ function useLightspeedProviderState() {
247
252
  setDraftFileContents,
248
253
  consumePendingOverlayThreadHandoff,
249
254
  shellViewTab,
250
- setShellViewTab
255
+ setShellViewTab,
256
+ activeNotebookId,
257
+ setActiveNotebookId
251
258
  }),
252
259
  [
253
260
  isOpen,
@@ -263,7 +270,9 @@ function useLightspeedProviderState() {
263
270
  setDraftFileContents,
264
271
  consumePendingOverlayThreadHandoff,
265
272
  shellViewTab,
266
- setShellViewTab
273
+ setShellViewTab,
274
+ activeNotebookId,
275
+ setActiveNotebookId
267
276
  ]
268
277
  );
269
278
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useLightspeedProviderState.esm.js","sources":["../../src/hooks/useLightspeedProviderState.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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';\n\nimport type {\n LightspeedDrawerContextType,\n LightspeedEmbeddedNotebooksTarget,\n} from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID, LIGHTSPEED_PATH } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nfunction lightspeedRoutePath(conversationId?: string): string {\n return conversationId\n ? `${LIGHTSPEED_PATH}/conversation/${conversationId}`\n : LIGHTSPEED_PATH;\n}\n\n/**\n * Encapsulates LightspeedDrawerProvider state, routing, and ApplicationDrawer sync.\n *\n * @internal\n */\nexport function useLightspeedProviderState(): {\n contextValue: LightspeedDrawerContextType;\n shouldRenderOverlayModal: boolean;\n closeChatbot: () => void;\n} {\n const navigate = useNavigate();\n const location = useLocation();\n const { openDrawer, closeDrawer } = useAppDrawer();\n const user = useBackstageUserIdentity();\n const {\n displayMode: persistedDisplayMode,\n setDisplayMode: setPersistedDisplayMode,\n } = useDisplayModeSettings(user, ChatbotDisplayMode.default);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(persistedDisplayMode);\n const [isOpen, setIsOpen] = useState(false);\n const [drawerWidth, setDrawerWidth] = useState(400);\n const [currentConversationIdState, setCurrentConversationIdState] = useState<\n string | undefined\n >(undefined);\n const [draftMessage, setDraftMessageState] = useState('');\n const [draftFileContents, setDraftFileContentsState] = useState<\n FileContent[]\n >([]);\n const [shellViewTab, setShellViewTabState] = useState(0);\n const shellViewTabRef = useRef(shellViewTab);\n shellViewTabRef.current = shellViewTab;\n const setShellViewTab = useCallback((tab: number) => {\n const next = tab === 1 ? 1 : 0;\n shellViewTabRef.current = next;\n setShellViewTabState(next);\n }, []);\n const openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n /** True while navigating off /lightspeed after user chose overlay/docked (URL can lag persisted mode). */\n const leavingLightspeedForNonEmbeddedShellRef = useRef(false);\n /** True until overlay/docked LightspeedChat consumes it (new mount after leaving fullscreen route). */\n const pendingOverlayThreadHandoffRef = useRef(false);\n /** Used to detect in-app moves (e.g. Chat ↔ Notebooks) so display mode is not reset to embedded. */\n const lightspeedPathnamePrevRef = useRef<string | null>(null);\n\n const isLightspeedRouteRef = useRef(false);\n const persistedDisplayModeRef = useRef(persistedDisplayMode);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\n isLightspeedRouteRef.current = isLightspeedRoute;\n persistedDisplayModeRef.current = persistedDisplayMode;\n const conversationMatch = useMatch(\n `${LIGHTSPEED_PATH}/conversation/:conversationId`,\n );\n const conversationId = conversationMatch?.params?.conversationId;\n\n const syncShellDrawerForMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode === ChatbotDisplayMode.docked) {\n if (isLightspeedRoute) {\n dockedAfterLeavingFullscreenRef.current = true;\n } else {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else {\n dockedAfterLeavingFullscreenRef.current = false;\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n },\n [closeDrawer, isLightspeedRoute, openDrawer],\n );\n\n const navigateBackOrGoToCatalog = useCallback(() => {\n if (!openedViaFABRef.current) {\n navigate('/catalog');\n openedViaFABRef.current = true;\n return;\n }\n navigate(-1);\n }, [navigate]);\n\n /**\n * Leaving /lightspeed for overlay/docked must not use navigate(-1): after the first FAB\n * open, navigateBackOrGoToCatalog uses -1 and can land back on /lightspeed (fullscreen).\n */\n const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {\n navigate('/catalog', { replace: true });\n }, [navigate]);\n\n useEffect(() => {\n const pathname = location.pathname;\n const prevPathname = lightspeedPathnamePrevRef.current;\n const isUnderLightspeedPath = (p: string | null) =>\n Boolean(p && p.startsWith(LIGHTSPEED_PATH));\n const isInternalLightspeedRouteChange =\n isUnderLightspeedPath(prevPathname) &&\n isUnderLightspeedPath(pathname) &&\n prevPathname !== pathname;\n\n if (!isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = false;\n }\n\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else if (isLightspeedRoute) {\n // On `/lightspeed` without a `:conversationId` segment, URL implies a fresh thread.\n // When navigating to another app route (overlay/docked), keep the last id so display\n // mode switches and re-entry to fullscreen stay on the active conversation.\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n if (!isInternalLightspeedRouteChange) {\n if (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\n }\n }\n setIsOpen(true);\n if (!dockedAfterLeavingFullscreenRef.current) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {\n // Off /lightspeed there is no fullscreen surface; use overlay so FAB stays available.\n // (Persisted preference remains \"fullscreen\" for the next open.)\n setDisplayModeState(ChatbotDisplayMode.default);\n } else {\n setDisplayModeState(persistedDisplayMode);\n }\n\n lightspeedPathnamePrevRef.current = pathname;\n }, [\n closeDrawer,\n conversationId,\n isLightspeedRoute,\n location.pathname,\n persistedDisplayMode,\n ]);\n\n useEffect(() => {\n if (\n !isLightspeedRoute &&\n isOpen &&\n displayModeState === ChatbotDisplayMode.docked\n ) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n dockedAfterLeavingFullscreenRef.current = false;\n }\n }, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);\n\n const openChatbot = useCallback(() => {\n openedViaFABRef.current = true;\n const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;\n\n if (rawMode === ChatbotDisplayMode.embedded) {\n if (!isLightspeedRoute) {\n if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n navigate(lightspeedRoutePath(currentConversationIdState));\n }\n }\n setDisplayModeState(ChatbotDisplayMode.embedded);\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n setIsOpen(true);\n return;\n }\n\n setDisplayModeState(rawMode);\n\n if (rawMode === ChatbotDisplayMode.docked) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n } else {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n\n setIsOpen(true);\n }, [\n closeDrawer,\n currentConversationIdState,\n isLightspeedRoute,\n navigate,\n openDrawer,\n persistedDisplayMode,\n ]);\n\n const closeChatbot = useCallback(() => {\n dockedAfterLeavingFullscreenRef.current = false;\n if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n if (displayModeState === ChatbotDisplayMode.docked) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n setIsOpen(false);\n }, [\n closeDrawer,\n displayModeState,\n isLightspeedRoute,\n navigateBackOrGoToCatalog,\n ]);\n\n const toggleChatbot = useCallback(() => {\n if (isOpen) {\n closeChatbot();\n } else {\n openChatbot();\n }\n }, [isOpen, openChatbot, closeChatbot]);\n\n const setCurrentConversationId = useCallback(\n (id: string | undefined) => {\n setCurrentConversationIdState(id);\n // Refs: first-stream completion calls onStart after unmount / mode change; a stale\n // embedded + /lightspeed closure would navigate back to fullscreen without this.\n if (\n persistedDisplayModeRef.current === ChatbotDisplayMode.embedded &&\n isLightspeedRouteRef.current\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [navigate],\n );\n\n const setDraftMessage = useCallback((message: string) => {\n setDraftMessageState(message);\n }, []);\n\n const setDraftFileContents = useCallback((files: FileContent[]) => {\n setDraftFileContentsState(files);\n }, []);\n\n const consumePendingOverlayThreadHandoff = useCallback(() => {\n if (!pendingOverlayThreadHandoffRef.current) {\n return false;\n }\n pendingOverlayThreadHandoffRef.current = false;\n return true;\n }, []);\n\n const setDisplayMode = useCallback(\n (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n if (embeddedNotebooks) {\n const path =\n embeddedNotebooks === 'notebooks'\n ? `${LIGHTSPEED_PATH}/notebooks`\n : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;\n navigate(path);\n } else if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n }\n setIsOpen(true);\n } else {\n // Notebooks exist only in fullscreen; leaving embedded for overlay/docked\n // must not keep shellViewTab on Notebooks (next fullscreen open should be Chat).\n setShellViewTab(0);\n if (isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = true;\n pendingOverlayThreadHandoffRef.current = true;\n leaveLightspeedRouteForShellDisplayMode();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n leaveLightspeedRouteForShellDisplayMode,\n navigate,\n setPersistedDisplayMode,\n setShellViewTab,\n syncShellDrawerForMode,\n ],\n );\n\n const shouldRenderOverlayModal =\n isOpen &&\n displayModeState === ChatbotDisplayMode.default &&\n !isLightspeedRoute;\n\n const contextValue = useMemo(\n () => ({\n isChatbotActive: isOpen,\n toggleChatbot,\n displayMode: displayModeState,\n setDisplayMode,\n drawerWidth,\n setDrawerWidth,\n currentConversationId: currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useLightspeedProviderState.esm.js","sources":["../../src/hooks/useLightspeedProviderState.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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react';\n\nimport type {\n LightspeedDrawerContextType,\n LightspeedEmbeddedNotebooksTarget,\n} from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID, LIGHTSPEED_PATH } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nfunction lightspeedRoutePath(conversationId?: string): string {\n return conversationId\n ? `${LIGHTSPEED_PATH}/conversation/${conversationId}`\n : LIGHTSPEED_PATH;\n}\n\n/**\n * Encapsulates LightspeedDrawerProvider state, routing, and ApplicationDrawer sync.\n *\n * @internal\n */\nexport function useLightspeedProviderState(): {\n contextValue: LightspeedDrawerContextType;\n shouldRenderOverlayModal: boolean;\n closeChatbot: () => void;\n} {\n const navigate = useNavigate();\n const location = useLocation();\n const { openDrawer, closeDrawer } = useAppDrawer();\n const user = useBackstageUserIdentity();\n const {\n displayMode: persistedDisplayMode,\n setDisplayMode: setPersistedDisplayMode,\n } = useDisplayModeSettings(user, ChatbotDisplayMode.default);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(persistedDisplayMode);\n const [isOpen, setIsOpen] = useState(false);\n const [drawerWidth, setDrawerWidth] = useState(400);\n const [currentConversationIdState, setCurrentConversationIdState] = useState<\n string | undefined\n >(undefined);\n const [draftMessage, setDraftMessageState] = useState('');\n const [draftFileContents, setDraftFileContentsState] = useState<\n FileContent[]\n >([]);\n const [shellViewTab, setShellViewTabState] = useState(0);\n const [activeNotebookId, setActiveNotebookId] = useState<string | undefined>(\n undefined,\n );\n const shellViewTabRef = useRef(shellViewTab);\n shellViewTabRef.current = shellViewTab;\n const setShellViewTab = useCallback((tab: number) => {\n const next = tab === 1 ? 1 : 0;\n shellViewTabRef.current = next;\n setShellViewTabState(next);\n }, []);\n const openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n /** True while navigating off /lightspeed after user chose overlay/docked (URL can lag persisted mode). */\n const leavingLightspeedForNonEmbeddedShellRef = useRef(false);\n /** True until overlay/docked LightspeedChat consumes it (new mount after leaving fullscreen route). */\n const pendingOverlayThreadHandoffRef = useRef(false);\n /** Used to detect in-app moves (e.g. Chat ↔ Notebooks) so display mode is not reset to embedded. */\n const lightspeedPathnamePrevRef = useRef<string | null>(null);\n\n const isLightspeedRouteRef = useRef(false);\n const isOnNotebooksPathRef = useRef(false);\n const persistedDisplayModeRef = useRef(persistedDisplayMode);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\n isLightspeedRouteRef.current = isLightspeedRoute;\n isOnNotebooksPathRef.current = location.pathname.startsWith(\n `${LIGHTSPEED_PATH}/notebooks`,\n );\n persistedDisplayModeRef.current = persistedDisplayMode;\n const conversationMatch = useMatch(\n `${LIGHTSPEED_PATH}/conversation/:conversationId`,\n );\n const conversationId = conversationMatch?.params?.conversationId;\n\n const syncShellDrawerForMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (mode === ChatbotDisplayMode.docked) {\n if (isLightspeedRoute) {\n dockedAfterLeavingFullscreenRef.current = true;\n } else {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else {\n dockedAfterLeavingFullscreenRef.current = false;\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n },\n [closeDrawer, isLightspeedRoute, openDrawer],\n );\n\n const navigateBackOrGoToCatalog = useCallback(() => {\n if (!openedViaFABRef.current) {\n navigate('/catalog');\n openedViaFABRef.current = true;\n return;\n }\n navigate(-1);\n }, [navigate]);\n\n /**\n * Leaving /lightspeed for overlay/docked must not use navigate(-1): after the first FAB\n * open, navigateBackOrGoToCatalog uses -1 and can land back on /lightspeed (fullscreen).\n */\n const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {\n navigate('/catalog', { replace: true });\n }, [navigate]);\n\n useEffect(() => {\n const pathname = location.pathname;\n const prevPathname = lightspeedPathnamePrevRef.current;\n const isUnderLightspeedPath = (p: string | null) =>\n Boolean(p && p.startsWith(LIGHTSPEED_PATH));\n const isInternalLightspeedRouteChange =\n isUnderLightspeedPath(prevPathname) &&\n isUnderLightspeedPath(pathname) &&\n prevPathname !== pathname;\n\n if (!isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = false;\n }\n\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else if (isLightspeedRoute) {\n // On `/lightspeed` without a `:conversationId` segment, URL implies a fresh thread.\n // When navigating to another app route (overlay/docked), keep the last id so display\n // mode switches and re-entry to fullscreen stay on the active conversation.\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n if (!isInternalLightspeedRouteChange) {\n if (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\n }\n }\n setIsOpen(true);\n if (!dockedAfterLeavingFullscreenRef.current) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n } else if (persistedDisplayMode === ChatbotDisplayMode.embedded) {\n // Off /lightspeed there is no fullscreen surface; use overlay so FAB stays available.\n // (Persisted preference remains \"fullscreen\" for the next open.)\n setDisplayModeState(ChatbotDisplayMode.default);\n } else {\n setDisplayModeState(persistedDisplayMode);\n }\n\n lightspeedPathnamePrevRef.current = pathname;\n }, [\n closeDrawer,\n conversationId,\n isLightspeedRoute,\n location.pathname,\n persistedDisplayMode,\n ]);\n\n useEffect(() => {\n if (\n !isLightspeedRoute &&\n isOpen &&\n displayModeState === ChatbotDisplayMode.docked\n ) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n dockedAfterLeavingFullscreenRef.current = false;\n }\n }, [displayModeState, isLightspeedRoute, isOpen, openDrawer]);\n\n const openChatbot = useCallback(() => {\n openedViaFABRef.current = true;\n const rawMode = persistedDisplayMode || ChatbotDisplayMode.default;\n\n if (rawMode === ChatbotDisplayMode.embedded) {\n if (!isLightspeedRoute) {\n if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n navigate(lightspeedRoutePath(currentConversationIdState));\n }\n }\n setDisplayModeState(ChatbotDisplayMode.embedded);\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n setIsOpen(true);\n return;\n }\n\n setDisplayModeState(rawMode);\n\n if (rawMode === ChatbotDisplayMode.docked) {\n openDrawer(LIGHTSPEED_APP_DRAWER_ID);\n } else {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n\n setIsOpen(true);\n }, [\n closeDrawer,\n currentConversationIdState,\n isLightspeedRoute,\n navigate,\n openDrawer,\n persistedDisplayMode,\n ]);\n\n const closeChatbot = useCallback(() => {\n dockedAfterLeavingFullscreenRef.current = false;\n if (displayModeState === ChatbotDisplayMode.embedded && isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n if (displayModeState === ChatbotDisplayMode.docked) {\n closeDrawer(LIGHTSPEED_APP_DRAWER_ID);\n }\n setIsOpen(false);\n }, [\n closeDrawer,\n displayModeState,\n isLightspeedRoute,\n navigateBackOrGoToCatalog,\n ]);\n\n const toggleChatbot = useCallback(() => {\n if (isOpen) {\n closeChatbot();\n } else {\n openChatbot();\n }\n }, [isOpen, openChatbot, closeChatbot]);\n\n const setCurrentConversationId = useCallback(\n (id: string | undefined) => {\n setCurrentConversationIdState(id);\n // Refs: first-stream completion calls onStart after unmount / mode change; a stale\n // embedded + /lightspeed closure would navigate back to fullscreen without this.\n // Skip navigation when the user is on a notebooks path — conversation route updates\n // must not overwrite the notebooks URL (fixes notebook closing on mode switch).\n if (\n persistedDisplayModeRef.current === ChatbotDisplayMode.embedded &&\n isLightspeedRouteRef.current &&\n !isOnNotebooksPathRef.current\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [navigate],\n );\n\n const setDraftMessage = useCallback((message: string) => {\n setDraftMessageState(message);\n }, []);\n\n const setDraftFileContents = useCallback((files: FileContent[]) => {\n setDraftFileContentsState(files);\n }, []);\n\n const consumePendingOverlayThreadHandoff = useCallback(() => {\n if (!pendingOverlayThreadHandoffRef.current) {\n return false;\n }\n pendingOverlayThreadHandoffRef.current = false;\n return true;\n }, []);\n\n const setDisplayMode = useCallback(\n (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n if (embeddedNotebooks) {\n const path =\n embeddedNotebooks === 'notebooks'\n ? `${LIGHTSPEED_PATH}/notebooks`\n : `${LIGHTSPEED_PATH}/notebooks/${embeddedNotebooks.notebookSessionId}`;\n navigate(path);\n } else if (shellViewTabRef.current === 1) {\n navigate(`${LIGHTSPEED_PATH}/notebooks`);\n } else {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n }\n setIsOpen(true);\n } else {\n if (isLightspeedRoute) {\n leavingLightspeedForNonEmbeddedShellRef.current = true;\n pendingOverlayThreadHandoffRef.current = true;\n leaveLightspeedRouteForShellDisplayMode();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n leaveLightspeedRouteForShellDisplayMode,\n navigate,\n setPersistedDisplayMode,\n syncShellDrawerForMode,\n ],\n );\n\n const shouldRenderOverlayModal =\n isOpen &&\n displayModeState === ChatbotDisplayMode.default &&\n !isLightspeedRoute;\n\n const contextValue = useMemo(\n () => ({\n isChatbotActive: isOpen,\n toggleChatbot,\n displayMode: displayModeState,\n setDisplayMode,\n drawerWidth,\n setDrawerWidth,\n currentConversationId: currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n activeNotebookId,\n setActiveNotebookId,\n }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\n consumePendingOverlayThreadHandoff,\n shellViewTab,\n setShellViewTab,\n activeNotebookId,\n setActiveNotebookId,\n ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -4,7 +4,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
4
4
  import { createRouteRef, createSubRouteRef, ApiBlueprint, createApiFactory, fetchApiRef, configApiRef, PageBlueprint, createFrontendModule, createFrontendPlugin } from '@backstage/frontend-plugin-api';
5
5
  import { AppRootWrapperBlueprint, TranslationBlueprint } from '@backstage/plugin-app-react';
6
6
  import { unstable_ClassNameGenerator } from '@mui/material/className';
7
- import { AppDrawerContentBlueprint } from '@red-hat-developer-hub/backstage-plugin-app-react/alpha';
7
+ import { AppDrawerContentBlueprint } from '@red-hat-developer-hub/backstage-plugin-app-react';
8
8
  import { lightspeedApiRef } from './api/api.esm.js';
9
9
  import { LightspeedApiClient } from './api/LightspeedApiClient.esm.js';
10
10
  import { notebooksApiRef } from './api/notebooksApi.esm.js';
@@ -62,7 +62,7 @@ const intelligentAssistantDrawer = AppDrawerContentBlueprint.make({
62
62
  params: {
63
63
  id: LIGHTSPEED_APP_DRAWER_ID,
64
64
  element: /* @__PURE__ */ jsx(LightspeedChatContainer, {}),
65
- resizable: false,
65
+ resizable: true,
66
66
  defaultWidth: 400,
67
67
  priority: 100
68
68
  }