@red-hat-developer-hub/backstage-plugin-lightspeed 2.5.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +5 -1
- package/dist/alpha.d.ts +5 -0
- package/dist/components/LightSpeedChat.esm.js +82 -17
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
- package/dist/components/notebooks/AddDocumentModal.esm.js +122 -23
- package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
- package/dist/components/notebooks/DocumentSidebar.esm.js +19 -1
- package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
- package/dist/components/notebooks/FileListItem.esm.js +94 -0
- package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
- package/dist/components/notebooks/NotebookView.esm.js +46 -26
- package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js +2 -1
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js +5 -2
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
- package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
- package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
- package/dist/hooks/useConversationMessages.esm.js +18 -14
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useDeleteConversation.esm.js +2 -0
- package/dist/hooks/useDeleteConversation.esm.js.map +1 -1
- package/dist/hooks/useLightspeedProviderState.esm.js +35 -8
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
- package/dist/translations/de.esm.js +5 -0
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +5 -0
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +5 -0
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/it.esm.js +5 -0
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js +5 -0
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js +5 -0
- package/dist/translations/ref.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -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 { 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 botAvatar from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport {\n Attachment,\n BaseMessage,\n LCSConversation,\n ReferencedDocument,\n ToolCall,\n} from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n transformDocumentsToSources,\n} from '../utils/lightspeed-chatbox-utils';\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\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 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 { 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 // Track pending tool calls during streaming\n const pendingToolCalls = useRef<Record<string, ToolCall>>({});\n\n // Cache tool calls by conversation ID and message index to persist across refetches\n // Key format: `${conversationId}-${messageIndex}`\n const toolCallsCache = useRef<{ [key: string]: ToolCall[] }>({});\n\n useEffect(() => {\n if (currentConversation !== conversationId) {\n setCurrentConversation(conversationId);\n setConversations(prev => {\n // Always clear TEMP when switching to it so \"New chat\" again gets empty messages and correct scroll.\n if (conversationId === TEMP_CONVERSATION_ID) {\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 = toolCallsCache.current[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(_conversations);\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 let newConversationId = '';\n let requestId = '';\n\n const conversationTuple = [\n createUserMessage({\n avatar,\n name: userName,\n content: prompt,\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,\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 }).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 = `${currentConversation}-${messageIndex}`;\n toolCallsCache.current[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: [...existingStreamingToolCalls, newToolCall],\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 (responsePayload !== undefined && toolIdKey !== undefined) {\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 = `${currentConversation}-${messageIndex}`;\n toolCallsCache.current[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 : { ...conversation[lastMessageIndex], isLoading: false };\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 : { ...conversation[lastMessageIndex], isLoading: false };\n\n if (documents.length) {\n lastMessage.sources = {\n sources: documents.map((doc: ReferencedDocument) => ({\n title: doc.doc_title,\n link: doc.doc_url,\n body: doc.doc_description,\n })),\n };\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 // Migrate tool calls cache from temp to new conversation ID\n Object.keys(toolCallsCache.current).forEach(key => {\n if (key.startsWith(`${TEMP_CONVERSATION_ID}-`)) {\n const messageIndex = key.replace(`${TEMP_CONVERSATION_ID}-`, '');\n const newKey = `${newConversationId}-${messageIndex}`;\n toolCallsCache.current[newKey] = toolCallsCache.current[key];\n delete toolCallsCache.current[key];\n }\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 }\n },\n\n [\n avatar,\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 ...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 { 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 botAvatar from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport {\n Attachment,\n BaseMessage,\n LCSConversation,\n ReferencedDocument,\n ToolCall,\n} from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\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 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 { 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 // 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 // Always clear TEMP when switching to it so \"New chat\" again gets empty messages and correct scroll.\n if (conversationId === TEMP_CONVERSATION_ID) {\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(_conversations);\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 let newConversationId = '';\n let requestId = '';\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: prompt,\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,\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 }).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: [...existingStreamingToolCalls, newToolCall],\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 (responsePayload !== undefined && toolIdKey !== undefined) {\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 : { ...conversation[lastMessageIndex], isLoading: false };\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 : { ...conversation[lastMessageIndex], isLoading: false };\n\n if (documents.length) {\n lastMessage.sources = {\n sources: documents.map((doc: ReferencedDocument) => ({\n title: doc.doc_title,\n link: doc.doc_url,\n body: doc.doc_description,\n })),\n };\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 },\n\n [\n avatar,\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 ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useApi } from '@backstage/core-plugin-api';
|
|
2
2
|
import { useQueryClient, useMutation } from '@tanstack/react-query';
|
|
3
3
|
import { lightspeedApiRef } from '../api/api.esm.js';
|
|
4
|
+
import { clearSharedToolCallsCacheForConversation } from './toolCallsCacheStore.esm.js';
|
|
4
5
|
|
|
5
6
|
const useDeleteConversation = () => {
|
|
6
7
|
const lightspeedApi = useApi(lightspeedApiRef);
|
|
@@ -19,6 +20,7 @@ const useDeleteConversation = () => {
|
|
|
19
20
|
return { previousConversations };
|
|
20
21
|
},
|
|
21
22
|
onSuccess: (_, props) => {
|
|
23
|
+
clearSharedToolCallsCacheForConversation(props.conversation_id);
|
|
22
24
|
if (props.invalidateCache) {
|
|
23
25
|
queryClient.invalidateQueries({ queryKey: ["conversations"] });
|
|
24
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteConversation.esm.js","sources":["../../src/hooks/useDeleteConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\ntype DeleteVariables = {\n conversation_id: string;\n invalidateCache?: boolean;\n};\n\ntype DeleteContext = {\n previousConversations?: ConversationList;\n};\n\nexport const useDeleteConversation = (): UseMutationResult<\n void,\n Error,\n DeleteVariables,\n DeleteContext\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (props: {\n conversation_id: string;\n invalidateCache?: boolean;\n }) => {\n await lightspeedApi.deleteConversation(props.conversation_id);\n },\n onMutate: async props => {\n await queryClient.cancelQueries({ queryKey: ['conversations'] });\n\n const previousConversations: ConversationList | undefined =\n queryClient.getQueryData(['conversations']);\n\n queryClient.setQueryData(['conversations'], (old: ConversationList) =>\n old.filter(c => c.conversation_id !== props.conversation_id),\n );\n\n return { previousConversations };\n },\n onSuccess: (_, props) => {\n if (props.invalidateCache) {\n queryClient.invalidateQueries({ queryKey: ['conversations'] });\n }\n },\n onError: (_, __, context) => {\n queryClient.setQueryData(\n ['conversations'],\n context?.previousConversations,\n );\n return { success: false };\n },\n });\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDeleteConversation.esm.js","sources":["../../src/hooks/useDeleteConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\nimport { clearSharedToolCallsCacheForConversation } from './toolCallsCacheStore';\n\ntype DeleteVariables = {\n conversation_id: string;\n invalidateCache?: boolean;\n};\n\ntype DeleteContext = {\n previousConversations?: ConversationList;\n};\n\nexport const useDeleteConversation = (): UseMutationResult<\n void,\n Error,\n DeleteVariables,\n DeleteContext\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (props: {\n conversation_id: string;\n invalidateCache?: boolean;\n }) => {\n await lightspeedApi.deleteConversation(props.conversation_id);\n },\n onMutate: async props => {\n await queryClient.cancelQueries({ queryKey: ['conversations'] });\n\n const previousConversations: ConversationList | undefined =\n queryClient.getQueryData(['conversations']);\n\n queryClient.setQueryData(['conversations'], (old: ConversationList) =>\n old.filter(c => c.conversation_id !== props.conversation_id),\n );\n\n return { previousConversations };\n },\n onSuccess: (_, props) => {\n clearSharedToolCallsCacheForConversation(props.conversation_id);\n if (props.invalidateCache) {\n queryClient.invalidateQueries({ queryKey: ['conversations'] });\n }\n },\n onError: (_, __, context) => {\n queryClient.setQueryData(\n ['conversations'],\n context?.previousConversations,\n );\n return { success: false };\n },\n });\n};\n"],"names":[],"mappings":";;;;;AAqCO,MAAM,wBAAwB,MAKhC;AACH,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,cAAc,cAAe,EAAA;AAEnC,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,UAAA,EAAY,OAAO,KAGb,KAAA;AACJ,MAAM,MAAA,aAAA,CAAc,kBAAmB,CAAA,KAAA,CAAM,eAAe,CAAA;AAAA,KAC9D;AAAA,IACA,QAAA,EAAU,OAAM,KAAS,KAAA;AACvB,MAAA,MAAM,YAAY,aAAc,CAAA,EAAE,UAAU,CAAC,eAAe,GAAG,CAAA;AAE/D,MAAA,MAAM,qBACJ,GAAA,WAAA,CAAY,YAAa,CAAA,CAAC,eAAe,CAAC,CAAA;AAE5C,MAAY,WAAA,CAAA,YAAA;AAAA,QAAa,CAAC,eAAe,CAAA;AAAA,QAAG,CAAC,QAC3C,GAAI,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,eAAA,KAAoB,MAAM,eAAe;AAAA,OAC7D;AAEA,MAAA,OAAO,EAAE,qBAAsB,EAAA;AAAA,KACjC;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,KAAU,KAAA;AACvB,MAAA,wCAAA,CAAyC,MAAM,eAAe,CAAA;AAC9D,MAAA,IAAI,MAAM,eAAiB,EAAA;AACzB,QAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,eAAe,GAAG,CAAA;AAAA;AAC/D,KACF;AAAA,IACA,OAAS,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,OAAY,KAAA;AAC3B,MAAY,WAAA,CAAA,YAAA;AAAA,QACV,CAAC,eAAe,CAAA;AAAA,QAChB,OAAS,EAAA;AAAA,OACX;AACA,MAAO,OAAA,EAAE,SAAS,KAAM,EAAA;AAAA;AAC1B,GACD,CAAA;AACH;;;;"}
|
|
@@ -27,7 +27,13 @@ function useLightspeedProviderState() {
|
|
|
27
27
|
const [draftFileContents, setDraftFileContentsState] = useState([]);
|
|
28
28
|
const openedViaFABRef = useRef(false);
|
|
29
29
|
const dockedAfterLeavingFullscreenRef = useRef(false);
|
|
30
|
+
const leavingLightspeedForNonEmbeddedShellRef = useRef(false);
|
|
31
|
+
const pendingOverlayThreadHandoffRef = useRef(false);
|
|
32
|
+
const isLightspeedRouteRef = useRef(false);
|
|
33
|
+
const persistedDisplayModeRef = useRef(persistedDisplayMode);
|
|
30
34
|
const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);
|
|
35
|
+
isLightspeedRouteRef.current = isLightspeedRoute;
|
|
36
|
+
persistedDisplayModeRef.current = persistedDisplayMode;
|
|
31
37
|
const conversationMatch = useMatch(
|
|
32
38
|
`${LIGHTSPEED_PATH}/conversation/:conversationId`
|
|
33
39
|
);
|
|
@@ -55,14 +61,24 @@ function useLightspeedProviderState() {
|
|
|
55
61
|
}
|
|
56
62
|
navigate(-1);
|
|
57
63
|
}, [navigate]);
|
|
64
|
+
const leaveLightspeedRouteForShellDisplayMode = useCallback(() => {
|
|
65
|
+
navigate("/catalog", { replace: true });
|
|
66
|
+
}, [navigate]);
|
|
58
67
|
useEffect(() => {
|
|
68
|
+
if (!isLightspeedRoute) {
|
|
69
|
+
leavingLightspeedForNonEmbeddedShellRef.current = false;
|
|
70
|
+
}
|
|
59
71
|
if (conversationId) {
|
|
60
72
|
setCurrentConversationIdState(conversationId);
|
|
61
|
-
} else {
|
|
73
|
+
} else if (isLightspeedRoute) {
|
|
62
74
|
setCurrentConversationIdState(undefined);
|
|
63
75
|
}
|
|
64
76
|
if (isLightspeedRoute) {
|
|
65
|
-
|
|
77
|
+
if (leavingLightspeedForNonEmbeddedShellRef.current && persistedDisplayMode !== ChatbotDisplayMode.embedded) {
|
|
78
|
+
setDisplayModeState(persistedDisplayMode);
|
|
79
|
+
} else {
|
|
80
|
+
setDisplayModeState(ChatbotDisplayMode.embedded);
|
|
81
|
+
}
|
|
66
82
|
setIsOpen(true);
|
|
67
83
|
if (!dockedAfterLeavingFullscreenRef.current) {
|
|
68
84
|
closeDrawer(LIGHTSPEED_APP_DRAWER_ID);
|
|
@@ -131,11 +147,11 @@ function useLightspeedProviderState() {
|
|
|
131
147
|
const setCurrentConversationId = useCallback(
|
|
132
148
|
(id) => {
|
|
133
149
|
setCurrentConversationIdState(id);
|
|
134
|
-
if (
|
|
150
|
+
if (persistedDisplayModeRef.current === ChatbotDisplayMode.embedded && isLightspeedRouteRef.current) {
|
|
135
151
|
navigate(lightspeedRoutePath(id), { replace: true });
|
|
136
152
|
}
|
|
137
153
|
},
|
|
138
|
-
[
|
|
154
|
+
[navigate]
|
|
139
155
|
);
|
|
140
156
|
const setDraftMessage = useCallback((message) => {
|
|
141
157
|
setDraftMessageState(message);
|
|
@@ -143,6 +159,13 @@ function useLightspeedProviderState() {
|
|
|
143
159
|
const setDraftFileContents = useCallback((files) => {
|
|
144
160
|
setDraftFileContentsState(files);
|
|
145
161
|
}, []);
|
|
162
|
+
const consumePendingOverlayThreadHandoff = useCallback(() => {
|
|
163
|
+
if (!pendingOverlayThreadHandoffRef.current) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
pendingOverlayThreadHandoffRef.current = false;
|
|
167
|
+
return true;
|
|
168
|
+
}, []);
|
|
146
169
|
const setDisplayMode = useCallback(
|
|
147
170
|
(mode, conversationIdParam) => {
|
|
148
171
|
if (mode === displayModeState) {
|
|
@@ -156,7 +179,9 @@ function useLightspeedProviderState() {
|
|
|
156
179
|
setIsOpen(true);
|
|
157
180
|
} else {
|
|
158
181
|
if (isLightspeedRoute) {
|
|
159
|
-
|
|
182
|
+
leavingLightspeedForNonEmbeddedShellRef.current = true;
|
|
183
|
+
pendingOverlayThreadHandoffRef.current = true;
|
|
184
|
+
leaveLightspeedRouteForShellDisplayMode();
|
|
160
185
|
}
|
|
161
186
|
setIsOpen(true);
|
|
162
187
|
}
|
|
@@ -165,8 +190,8 @@ function useLightspeedProviderState() {
|
|
|
165
190
|
currentConversationIdState,
|
|
166
191
|
displayModeState,
|
|
167
192
|
isLightspeedRoute,
|
|
193
|
+
leaveLightspeedRouteForShellDisplayMode,
|
|
168
194
|
navigate,
|
|
169
|
-
navigateBackOrGoToCatalog,
|
|
170
195
|
setPersistedDisplayMode,
|
|
171
196
|
syncShellDrawerForMode
|
|
172
197
|
]
|
|
@@ -185,7 +210,8 @@ function useLightspeedProviderState() {
|
|
|
185
210
|
draftMessage,
|
|
186
211
|
setDraftMessage,
|
|
187
212
|
draftFileContents,
|
|
188
|
-
setDraftFileContents
|
|
213
|
+
setDraftFileContents,
|
|
214
|
+
consumePendingOverlayThreadHandoff
|
|
189
215
|
}),
|
|
190
216
|
[
|
|
191
217
|
isOpen,
|
|
@@ -198,7 +224,8 @@ function useLightspeedProviderState() {
|
|
|
198
224
|
draftMessage,
|
|
199
225
|
setDraftMessage,
|
|
200
226
|
draftFileContents,
|
|
201
|
-
setDraftFileContents
|
|
227
|
+
setDraftFileContents,
|
|
228
|
+
consumePendingOverlayThreadHandoff
|
|
202
229
|
]
|
|
203
230
|
);
|
|
204
231
|
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 { LightspeedDrawerContextType } from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nconst LIGHTSPEED_PATH = '/lightspeed';\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 openedViaFABRef = useRef(false);\n const dockedAfterLeavingFullscreenRef = useRef(false);\n\n const isLightspeedRoute = location.pathname.startsWith(LIGHTSPEED_PATH);\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 useEffect(() => {\n if (conversationId) {\n setCurrentConversationIdState(conversationId);\n } else {\n setCurrentConversationIdState(undefined);\n }\n\n if (isLightspeedRoute) {\n setDisplayModeState(ChatbotDisplayMode.embedded);\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 }, [closeDrawer, conversationId, isLightspeedRoute, persistedDisplayMode]);\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 navigate(lightspeedRoutePath(currentConversationIdState));\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 if (\n displayModeState === ChatbotDisplayMode.embedded &&\n isLightspeedRoute\n ) {\n navigate(lightspeedRoutePath(id), { replace: true });\n }\n },\n [displayModeState, isLightspeedRoute, 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 setDisplayMode = useCallback(\n (mode: ChatbotDisplayMode, conversationIdParam?: string) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\n setIsOpen(true);\n } else {\n if (isLightspeedRoute) {\n navigateBackOrGoToCatalog();\n }\n setIsOpen(true);\n }\n },\n [\n currentConversationIdState,\n displayModeState,\n isLightspeedRoute,\n navigate,\n navigateBackOrGoToCatalog,\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 }),\n [\n isOpen,\n toggleChatbot,\n displayModeState,\n setDisplayMode,\n drawerWidth,\n currentConversationIdState,\n setCurrentConversationId,\n draftMessage,\n setDraftMessage,\n draftFileContents,\n setDraftFileContents,\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 { LightspeedDrawerContextType } from '../components/LightspeedDrawerContext';\nimport { LIGHTSPEED_APP_DRAWER_ID } from '../const';\nimport type { FileContent } from '../types';\nimport { useBackstageUserIdentity } from './useBackstageUserIdentity';\nimport { useDisplayModeSettings } from './useDisplayModeSettings';\n\nconst LIGHTSPEED_PATH = '/lightspeed';\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 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\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 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 (\n leavingLightspeedForNonEmbeddedShellRef.current &&\n persistedDisplayMode !== ChatbotDisplayMode.embedded\n ) {\n setDisplayModeState(persistedDisplayMode);\n } else {\n setDisplayModeState(ChatbotDisplayMode.embedded);\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 }, [closeDrawer, conversationId, isLightspeedRoute, persistedDisplayMode]);\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 navigate(lightspeedRoutePath(currentConversationIdState));\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 (mode: ChatbotDisplayMode, conversationIdParam?: string) => {\n if (mode === displayModeState) {\n return;\n }\n setPersistedDisplayMode(mode);\n syncShellDrawerForMode(mode);\n\n if (mode === ChatbotDisplayMode.embedded) {\n const convId = conversationIdParam ?? currentConversationIdState;\n navigate(lightspeedRoutePath(convId));\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 }),\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 ],\n );\n\n return {\n contextValue,\n shouldRenderOverlayModal,\n closeChatbot,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -38,10 +38,12 @@ const lightspeedTranslationDe = createTranslationMessages({
|
|
|
38
38
|
"notebook.view.upload.heading": "Laden Sie eine Ressource hoch, um zu beginnen",
|
|
39
39
|
"notebook.view.upload.action": "Ressource hochladen",
|
|
40
40
|
"notebook.view.input.placeholder": "Fragen Sie zu Ihren Dokumenten...",
|
|
41
|
+
"notebook.view.input.disabledTooltip": "W\xE4hlen Sie mindestens eine geladene Ressource aus, um den Chat zu starten",
|
|
41
42
|
"notebook.view.sidebar.collapse": "Seitenleiste einklappen",
|
|
42
43
|
"notebook.view.sidebar.expand": "Seitenleiste ausklappen",
|
|
43
44
|
"notebook.view.sidebar.resize": "Gr\xF6\xDFe der Seitenleiste \xE4ndern",
|
|
44
45
|
"notebook.view.documents.uploading": "Dokument wird hochgeladen",
|
|
46
|
+
"notebook.view.documents.maxReached": "Maximal 10 Dokumente sind erlaubt. L\xF6schen Sie ein Dokument, um ein neues hochzuladen.",
|
|
45
47
|
"notebook.upload.success": "{{fileName}} erfolgreich hochgeladen.",
|
|
46
48
|
"notebook.upload.failed": "Hochladen von {{fileName}} fehlgeschlagen.",
|
|
47
49
|
// Notebook upload modal
|
|
@@ -50,6 +52,9 @@ const lightspeedTranslationDe = createTranslationMessages({
|
|
|
50
52
|
"notebook.upload.modal.browseButton": "Hochladen",
|
|
51
53
|
"notebook.upload.modal.separator": "oder",
|
|
52
54
|
"notebook.upload.modal.infoText": "Akzeptierte Dateitypen: .md, .txt, .pdf, .json, .yaml, .log",
|
|
55
|
+
"notebook.upload.modal.selectedFiles": "{{count}} von {{max}} Dateien ausgew\xE4hlt",
|
|
56
|
+
"notebook.upload.modal.addButton": "Hinzuf\xFCgen ({{count}})",
|
|
57
|
+
"notebook.upload.modal.removeFile": "{{fileName}} entfernen",
|
|
53
58
|
"notebook.upload.error.unsupportedType": "Upload-Fehler: Nicht unterst\xFCtzte Dateitypen gefunden. Bitte laden Sie nur unterst\xFCtzte Dateitypen hoch.",
|
|
54
59
|
"notebook.upload.error.fileTooLarge": "Upload-Fehler: Dateigr\xF6\xDFe \xFCberschreitet das Limit von 25 MB.",
|
|
55
60
|
"notebook.upload.error.tooManyFiles": "Upload-Fehler: Maximal {{max}} Dateien erlaubt.",
|