@red-hat-developer-hub/backstage-plugin-lightspeed 2.6.0 → 2.6.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 +6 -0
- package/dist/alpha/LightspeedFAB.esm.js.map +1 -1
- package/dist/alpha/LightspeedProvider.esm.js.map +1 -1
- package/dist/alpha.esm.js +1 -1
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api/LightspeedApiClient.esm.js +1 -1
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/NotebooksApiClient.esm.js.map +1 -1
- package/dist/api/api.esm.js.map +1 -1
- package/dist/api/notebooksApi.esm.js.map +1 -1
- package/dist/components/Attachment.esm.js +2 -2
- package/dist/components/Attachment.esm.js.map +1 -1
- package/dist/components/AttachmentContext.esm.js +1 -1
- package/dist/components/AttachmentContext.esm.js.map +1 -1
- package/dist/components/DeleteModal.esm.js.map +1 -1
- package/dist/components/FilePreview.esm.js.map +1 -1
- package/dist/components/LightSpeedChat.esm.js +16 -16
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBox.esm.js +5 -5
- package/dist/components/LightspeedChatBox.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
- package/dist/components/LightspeedChatModelsState.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js +1 -1
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
- package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -1
- package/dist/components/LightspeedFAB.esm.js.map +1 -1
- package/dist/components/LightspeedIcon.esm.js.map +1 -1
- package/dist/components/LightspeedPage.esm.js.map +1 -1
- package/dist/components/McpServersSettings.esm.js +3 -3
- package/dist/components/McpServersSettings.esm.js.map +1 -1
- package/dist/components/McpSettingsIcon.esm.js.map +1 -1
- package/dist/components/PermissionRequiredIcon.esm.js.map +1 -1
- package/dist/components/PermissionRequiredState.esm.js.map +1 -1
- package/dist/components/RenameConversationModal.esm.js.map +1 -1
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/components/ToolCallContent.esm.js +3 -3
- package/dist/components/ToolCallContent.esm.js.map +1 -1
- package/dist/components/Trans.esm.js.map +1 -1
- package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
- package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -1
- package/dist/components/notebooks/DocumentSidebar.esm.js +2 -2
- package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
- package/dist/components/notebooks/FileListItem.esm.js.map +1 -1
- package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -1
- package/dist/components/notebooks/NotebookCard.esm.js +1 -1
- package/dist/components/notebooks/NotebookCard.esm.js.map +1 -1
- package/dist/components/notebooks/NotebookView.esm.js +3 -3
- package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
- package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
- package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
- package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -1
- package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
- package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -1
- package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
- package/dist/const.esm.js.map +1 -1
- package/dist/dev.esm.js.map +1 -1
- package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -1
- package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js.map +1 -1
- package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -1
- package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -1
- package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -1
- package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -1
- package/dist/hooks/toolCallsCacheStore.esm.js +1 -1
- package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -1
- package/dist/hooks/useAllModels.esm.js.map +1 -1
- package/dist/hooks/useAutoScroll.esm.js +1 -1
- package/dist/hooks/useAutoScroll.esm.js.map +1 -1
- package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -1
- package/dist/hooks/useBufferedMessages.esm.js.map +1 -1
- package/dist/hooks/useCaptureFeedback.esm.js.map +1 -1
- package/dist/hooks/useConversationMessages.esm.js +1 -1
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useConversations.esm.js.map +1 -1
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
- package/dist/hooks/useDeleteConversation.esm.js.map +1 -1
- package/dist/hooks/useDisplayModeSettings.esm.js +1 -1
- package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -1
- package/dist/hooks/useFeedbackActions.esm.js +3 -3
- package/dist/hooks/useFeedbackActions.esm.js.map +1 -1
- package/dist/hooks/useFeedbackState.esm.js.map +1 -1
- package/dist/hooks/useFeedbackStatus.esm.js.map +1 -1
- package/dist/hooks/useIsMobile.esm.js.map +1 -1
- package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -1
- package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -1
- package/dist/hooks/useLightspeedDrawerContext.esm.js +1 -1
- package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -1
- package/dist/hooks/useLightspeedProviderState.esm.js +2 -2
- package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
- package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -1
- package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -1
- package/dist/hooks/usePinnedChatsSettings.esm.js +2 -2
- package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -1
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -1
- package/dist/hooks/useRenameConversation.esm.js.map +1 -1
- package/dist/hooks/useSortSettings.esm.js +2 -2
- package/dist/hooks/useSortSettings.esm.js.map +1 -1
- package/dist/hooks/useStopConversation.esm.js.map +1 -1
- package/dist/hooks/useTranslation.esm.js.map +1 -1
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -2
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/index.esm.js.map +1 -1
- package/dist/translations/it.esm.js.map +1 -1
- package/dist/translations/ja.esm.js.map +1 -1
- package/dist/translations/ref.esm.js.map +1 -1
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/attachment-utils.esm.js.map +1 -1
- package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -1
- package/dist/utils/lightspeed-chatbox-utils.esm.js +4 -4
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
- package/dist/utils/notebook-upload-utils.esm.js +1 -1
- package/dist/utils/notebook-upload-utils.esm.js.map +1 -1
- package/dist/utils/notebooks-utils.esm.js +1 -1
- package/dist/utils/notebooks-utils.esm.js.map +1 -1
- package/dist/utils/prompt-utils.esm.js.map +1 -1
- package/dist/utils/queryClient.esm.js.map +1 -1
- package/dist/utils/reasoningParser.esm.js.map +1 -1
- package/dist/utils/toolCallMapper.esm.js +2 -2
- package/dist/utils/toolCallMapper.esm.js.map +1 -1
- package/dist/utils/user-utils.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -40,7 +40,7 @@ const useFetchConversationMessages = (currentConversation) => {
|
|
|
40
40
|
queryFn: currentConversation ? async () => {
|
|
41
41
|
const response = await lightspeedApi.getConversationMessages(currentConversation);
|
|
42
42
|
return response;
|
|
43
|
-
} :
|
|
43
|
+
} : void 0,
|
|
44
44
|
retry: false
|
|
45
45
|
});
|
|
46
46
|
};
|
|
@@ -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 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 { 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 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: 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 })\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 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 } finally {\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = false;\n }\n setStreamingConversationId(null);\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 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 { 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 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 { 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 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: 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 })\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 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 } finally {\n if (streamStartedOnTemp) {\n isTempStreamInProgressRef.current = false;\n }\n setStreamingConversationId(null);\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 streamingConversationId,\n ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversations.esm.js","sources":["../../src/hooks/useConversations.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\n// Fetch all conversations\nexport const useConversations = (): UseQueryResult<ConversationList, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversations'],\n queryFn: async () => {\n const response = await lightspeedApi.getConversations();\n return response;\n },\n refetchInterval: query => {\n const data = query.state.data;\n if (!data?.length) return false;\n const hasNullSummary = data.some(c => !c.topic_summary);\n return hasNullSummary ? 2000 : false;\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,mBAAmB,MAA+C;AAC7E,
|
|
1
|
+
{"version":3,"file":"useConversations.esm.js","sources":["../../src/hooks/useConversations.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\n// Fetch all conversations\nexport const useConversations = (): UseQueryResult<ConversationList, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversations'],\n queryFn: async () => {\n const response = await lightspeedApi.getConversations();\n return response;\n },\n refetchInterval: query => {\n const data = query.state.data;\n if (!data?.length) return false;\n const hasNullSummary = data.some(c => !c.topic_summary);\n return hasNullSummary ? 2000 : false;\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,mBAAmB,MAA+C;AAC7E,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,eAAe,CAAA;AAAA,IAC1B,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,gBAAA,EAAiB;AACtD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,iBAAiB,CAAA,KAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,MAAA,MAAM,iBAAiB,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,EAAE,aAAa,CAAA;AACtD,MAAA,OAAO,iBAAiB,GAAA,GAAO,KAAA;AAAA,IACjC,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCreateCoversationMessage.esm.js","sources":["../../src/hooks/useCreateCoversationMessage.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 { useMutation, type UseMutationResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { Attachment } from '../types';\n\nexport type CreateMessageVariables = {\n prompt: string;\n selectedModel: string;\n selectedProvider: string;\n currentConversation: string;\n attachments: Attachment[];\n};\n\nexport const useCreateConversationMessage = (): UseMutationResult<\n ReadableStreamDefaultReader<Uint8Array>,\n Error,\n CreateMessageVariables\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n\n return useMutation({\n mutationFn: async ({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n }: CreateMessageVariables) => {\n if (!currentConversation) {\n throw new Error('Failed to generate AI response');\n }\n\n return await lightspeedApi.createMessage(\n `${prompt}`,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n );\n },\n onError: error => {\n // eslint-disable-next-line\n console.warn(error);\n },\n });\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,+BAA+B,MAIvC;AACH,
|
|
1
|
+
{"version":3,"file":"useCreateCoversationMessage.esm.js","sources":["../../src/hooks/useCreateCoversationMessage.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 { useMutation, type UseMutationResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { Attachment } from '../types';\n\nexport type CreateMessageVariables = {\n prompt: string;\n selectedModel: string;\n selectedProvider: string;\n currentConversation: string;\n attachments: Attachment[];\n};\n\nexport const useCreateConversationMessage = (): UseMutationResult<\n ReadableStreamDefaultReader<Uint8Array>,\n Error,\n CreateMessageVariables\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n\n return useMutation({\n mutationFn: async ({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n }: CreateMessageVariables) => {\n if (!currentConversation) {\n throw new Error('Failed to generate AI response');\n }\n\n return await lightspeedApi.createMessage(\n `${prompt}`,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n );\n },\n onError: error => {\n // eslint-disable-next-line\n console.warn(error);\n },\n });\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,+BAA+B,MAIvC;AACH,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,KAA8B;AAC5B,MAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,QAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,MAClD;AAEA,MAAA,OAAO,MAAM,aAAA,CAAc,aAAA;AAAA,QACzB,GAAG,MAAM,CAAA,CAAA;AAAA,QACT,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,CAAA,KAAA,KAAS;AAEhB,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,GACD,CAAA;AACH;;;;"}
|
|
@@ -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';\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,
|
|
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,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,KAAA,KAGb;AACJ,MAAA,MAAM,aAAA,CAAc,kBAAA,CAAmB,KAAA,CAAM,eAAe,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,QAAA,EAAU,OAAM,KAAA,KAAS;AACvB,MAAA,MAAM,YAAY,aAAA,CAAc,EAAE,UAAU,CAAC,eAAe,GAAG,CAAA;AAE/D,MAAA,MAAM,qBAAA,GACJ,WAAA,CAAY,YAAA,CAAa,CAAC,eAAe,CAAC,CAAA;AAE5C,MAAA,WAAA,CAAY,YAAA;AAAA,QAAa,CAAC,eAAe,CAAA;AAAA,QAAG,CAAC,QAC3C,GAAA,CAAI,MAAA,CAAO,OAAK,CAAA,CAAE,eAAA,KAAoB,MAAM,eAAe;AAAA,OAC7D;AAEA,MAAA,OAAO,EAAE,qBAAA,EAAsB;AAAA,IACjC,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,KAAA,KAAU;AACvB,MAAA,wCAAA,CAAyC,MAAM,eAAe,CAAA;AAC9D,MAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,QAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,eAAe,GAAG,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,EAAG,EAAA,EAAI,OAAA,KAAY;AAC3B,MAAA,WAAA,CAAY,YAAA;AAAA,QACV,CAAC,eAAe,CAAA;AAAA,QAChB,OAAA,EAAS;AAAA,OACX;AACA,MAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,IAC1B;AAAA,GACD,CAAA;AACH;;;;"}
|
|
@@ -13,7 +13,7 @@ const useDisplayModeSettings = (user, defaultMode = ChatbotDisplayMode.default)
|
|
|
13
13
|
useEffect(() => {
|
|
14
14
|
if (!user || isGuestUser(user)) {
|
|
15
15
|
setDisplayModeState(defaultMode);
|
|
16
|
-
return
|
|
16
|
+
return void 0;
|
|
17
17
|
}
|
|
18
18
|
try {
|
|
19
19
|
const modeSnapshot = bucket.snapshot(DISPLAY_MODE_KEY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDisplayModeSettings.esm.js","sources":["../../src/hooks/useDisplayModeSettings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { storageApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { isGuestUser } from '../utils/user-utils';\n\nconst BUCKET_NAME = 'lightspeed';\nconst DISPLAY_MODE_KEY = 'displayMode';\n\ntype UseDisplayModeSettingsReturn = {\n displayMode: ChatbotDisplayMode;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\n/**\n * Hook to manage display mode settings with persistence using Backstage StorageApi.\n *\n * @param user - The user entity ref (e.g., \"user:default/john\")\n * @param defaultMode - The default display mode to use if no preference is stored\n * @returns Object containing display mode state and management function\n */\nexport const useDisplayModeSettings = (\n user: string | undefined,\n defaultMode: ChatbotDisplayMode = ChatbotDisplayMode.default,\n): UseDisplayModeSettingsReturn => {\n const storageApi = useApi(storageApiRef);\n const bucket = storageApi.forBucket(BUCKET_NAME);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(defaultMode);\n\n const shouldPersist = !isGuestUser(user);\n\n useEffect(() => {\n if (!user || isGuestUser(user)) {\n setDisplayModeState(defaultMode);\n return undefined;\n }\n\n try {\n const modeSnapshot =\n bucket.snapshot<ChatbotDisplayMode>(DISPLAY_MODE_KEY);\n setDisplayModeState(modeSnapshot.value ?? defaultMode);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error reading display mode from storage:', error);\n }\n\n const modeSubscription = bucket\n .observe$<ChatbotDisplayMode>(DISPLAY_MODE_KEY)\n .subscribe({\n next: snapshot => {\n setDisplayModeState(snapshot.value ?? defaultMode);\n },\n error: error => {\n // eslint-disable-next-line no-console\n console.error('Error observing displayMode:', error);\n },\n });\n\n return () => {\n modeSubscription.unsubscribe();\n };\n }, [bucket, user, defaultMode]);\n\n const setDisplayMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (!user) return;\n\n setDisplayModeState(mode);\n\n if (shouldPersist) {\n try {\n bucket.set(DISPLAY_MODE_KEY, mode);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving display mode:', error);\n }\n }\n },\n [bucket, user, shouldPersist],\n );\n\n return {\n displayMode: displayModeState,\n setDisplayMode,\n };\n};\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,
|
|
1
|
+
{"version":3,"file":"useDisplayModeSettings.esm.js","sources":["../../src/hooks/useDisplayModeSettings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { storageApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { isGuestUser } from '../utils/user-utils';\n\nconst BUCKET_NAME = 'lightspeed';\nconst DISPLAY_MODE_KEY = 'displayMode';\n\ntype UseDisplayModeSettingsReturn = {\n displayMode: ChatbotDisplayMode;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\n/**\n * Hook to manage display mode settings with persistence using Backstage StorageApi.\n *\n * @param user - The user entity ref (e.g., \"user:default/john\")\n * @param defaultMode - The default display mode to use if no preference is stored\n * @returns Object containing display mode state and management function\n */\nexport const useDisplayModeSettings = (\n user: string | undefined,\n defaultMode: ChatbotDisplayMode = ChatbotDisplayMode.default,\n): UseDisplayModeSettingsReturn => {\n const storageApi = useApi(storageApiRef);\n const bucket = storageApi.forBucket(BUCKET_NAME);\n\n const [displayModeState, setDisplayModeState] =\n useState<ChatbotDisplayMode>(defaultMode);\n\n const shouldPersist = !isGuestUser(user);\n\n useEffect(() => {\n if (!user || isGuestUser(user)) {\n setDisplayModeState(defaultMode);\n return undefined;\n }\n\n try {\n const modeSnapshot =\n bucket.snapshot<ChatbotDisplayMode>(DISPLAY_MODE_KEY);\n setDisplayModeState(modeSnapshot.value ?? defaultMode);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error reading display mode from storage:', error);\n }\n\n const modeSubscription = bucket\n .observe$<ChatbotDisplayMode>(DISPLAY_MODE_KEY)\n .subscribe({\n next: snapshot => {\n setDisplayModeState(snapshot.value ?? defaultMode);\n },\n error: error => {\n // eslint-disable-next-line no-console\n console.error('Error observing displayMode:', error);\n },\n });\n\n return () => {\n modeSubscription.unsubscribe();\n };\n }, [bucket, user, defaultMode]);\n\n const setDisplayMode = useCallback(\n (mode: ChatbotDisplayMode) => {\n if (!user) return;\n\n setDisplayModeState(mode);\n\n if (shouldPersist) {\n try {\n bucket.set(DISPLAY_MODE_KEY, mode);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving display mode:', error);\n }\n }\n },\n [bucket, user, shouldPersist],\n );\n\n return {\n displayMode: displayModeState,\n setDisplayMode,\n };\n};\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,WAAA,GAAc,YAAA;AACpB,MAAM,gBAAA,GAAmB,aAAA;AAclB,MAAM,sBAAA,GAAyB,CACpC,IAAA,EACA,WAAA,GAAkC,mBAAmB,OAAA,KACpB;AACjC,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA;AAE/C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAC1C,SAA6B,WAAW,CAAA;AAE1C,EAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,CAAY,IAAI,CAAA;AAEvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,WAAA,CAAY,IAAI,CAAA,EAAG;AAC9B,MAAA,mBAAA,CAAoB,WAAW,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GACJ,MAAA,CAAO,QAAA,CAA6B,gBAAgB,CAAA;AACtD,MAAA,mBAAA,CAAoB,YAAA,CAAa,SAAS,WAAW,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,gBAAA,GAAmB,MAAA,CACtB,QAAA,CAA6B,gBAAgB,EAC7C,SAAA,CAAU;AAAA,MACT,MAAM,CAAA,QAAA,KAAY;AAChB,QAAA,mBAAA,CAAoB,QAAA,CAAS,SAAS,WAAW,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,OAAO,CAAA,KAAA,KAAS;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,MACrD;AAAA,KACD,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,WAAA,EAAY;AAAA,IAC/B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,WAAW,CAAC,CAAA;AAE9B,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,IAAA,KAA6B;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAExB,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,GAAA,CAAI,kBAAkB,IAAI,CAAA;AAAA,QACnC,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,IAAA,EAAM,aAAa;AAAA,GAC9B;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,gBAAA;AAAA,IACb;AAAA,GACF;AACF;;;;"}
|
|
@@ -47,7 +47,7 @@ const useFeedbackActions = (messages, conversationId, isStreaming) => {
|
|
|
47
47
|
quickResponses: createQuickResponses[sentiment],
|
|
48
48
|
onSubmit: (quickResponse = "0", additionalFeedback) => {
|
|
49
49
|
const quickIndex = Number(quickResponse) - 1;
|
|
50
|
-
const quickText = quickResponse !== "0" ? createQuickResponses[sentiment]?.[quickIndex]?.content :
|
|
50
|
+
const quickText = quickResponse !== "0" ? createQuickResponses[sentiment]?.[quickIndex]?.content : void 0;
|
|
51
51
|
let user_feedback = "";
|
|
52
52
|
if (quickText && additionalFeedback) {
|
|
53
53
|
user_feedback = `${quickText}
|
|
@@ -82,7 +82,7 @@ Additional feedback: ${additionalFeedback}`;
|
|
|
82
82
|
onClose: () => {
|
|
83
83
|
dispatch.hideFeedbackForm(messageId, sentiment);
|
|
84
84
|
dispatch.resetButtonState(messageId);
|
|
85
|
-
dispatch.updateButtonState(messageId, { sentiment:
|
|
85
|
+
dispatch.updateButtonState(messageId, { sentiment: void 0 });
|
|
86
86
|
},
|
|
87
87
|
focusOnLoad: true
|
|
88
88
|
}),
|
|
@@ -105,7 +105,7 @@ Additional feedback: ${additionalFeedback}`;
|
|
|
105
105
|
const getUserFeedbackComplete = useCallback(
|
|
106
106
|
(messageId, sentiment) => {
|
|
107
107
|
const isVisible = state[messageId]?.completionForm?.[sentiment];
|
|
108
|
-
if (!isVisible) return
|
|
108
|
+
if (!isVisible) return void 0;
|
|
109
109
|
return {
|
|
110
110
|
id: `feebback-completion-${sentiment}-${messageId}`,
|
|
111
111
|
title: t("feedback.completion.title"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedbackActions.esm.js","sources":["../../src/hooks/useFeedbackActions.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { MessageProps } from '@patternfly/chatbot';\nimport { UserFeedbackProps } from '@patternfly/chatbot/dist/cjs/Message/UserFeedback/UserFeedback';\nimport { UserFeedbackCompleteProps } from '@patternfly/chatbot/dist/cjs/Message/UserFeedback/UserFeedbackComplete';\n\nimport { useCaptureFeedback } from '../hooks/useCaptureFeedback';\nimport { CaptureFeedback } from '../types';\nimport { Sentiment, useFeedbackState } from './useFeedbackState';\nimport { useFeedbackStatus } from './useFeedbackStatus';\nimport { useTranslation } from './useTranslation';\n\nexport const useFeedbackActions = <T extends MessageProps>(\n messages: T[],\n conversationId: string,\n isStreaming: boolean,\n): T[] => {\n const copyButtonRef = useRef<HTMLButtonElement>(null);\n const speakingButtonRef = useRef<HTMLButtonElement>(null);\n const currentSpeakingIdRef = useRef<string | null>(null);\n\n const { data: feedbackEnabled } = useFeedbackStatus();\n const { state, ...dispatch } = useFeedbackState();\n const { mutateAsync: captureFeedback } = useCaptureFeedback();\n const { t } = useTranslation();\n\n const createQuickResponses = useMemo(\n () => ({\n positive: [\n { id: '1', content: t('feedback.quickResponses.positive.helpful') },\n {\n id: '2',\n content: t('feedback.quickResponses.positive.easyToUnderstand'),\n },\n {\n id: '3',\n content: t('feedback.quickResponses.positive.resolvedIssue'),\n },\n ],\n negative: [\n { id: '1', content: t('feedback.quickResponses.negative.didntAnswer') },\n {\n id: '2',\n content: t('feedback.quickResponses.negative.hardToUnderstand'),\n },\n { id: '3', content: t('feedback.quickResponses.negative.notHelpful') },\n ],\n }),\n [t],\n );\n\n const getFeedbackForm = useCallback(\n (messageId: string, sentiment: 'positive' | 'negative') => ({\n key: `feedback-${sentiment}`,\n id: `feedback-${sentiment}-${messageId}`,\n hasTextArea: true,\n title: t('feedback.form.title'),\n textAreaPlaceholder: t('feedback.form.textAreaPlaceholder'),\n submitWord: t('feedback.form.submitWord'),\n quickResponses: createQuickResponses[sentiment],\n onSubmit: (\n quickResponse: string | undefined = '0',\n additionalFeedback: string | undefined,\n ) => {\n const quickIndex = Number(quickResponse) - 1;\n const quickText =\n quickResponse !== '0'\n ? createQuickResponses[sentiment]?.[quickIndex]?.content\n : undefined;\n\n let user_feedback = '';\n\n if (quickText && additionalFeedback) {\n user_feedback = `${quickText}\\nAdditional feedback: ${additionalFeedback}`;\n } else if (quickText) {\n user_feedback = quickText;\n } else if (additionalFeedback) {\n user_feedback = additionalFeedback;\n }\n\n const botAnswerId = Number(messageId.split('-').pop());\n const userQuestionId = botAnswerId - 1;\n\n const payload: CaptureFeedback = {\n conversation_id: conversationId,\n user_feedback,\n sentiment: sentiment === 'positive' ? 1 : -1,\n user_question: messages[userQuestionId].content || '',\n llm_response: messages[botAnswerId].content || '',\n };\n\n captureFeedback(payload).then(() => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.showCompletionForm(messageId, sentiment);\n dispatch.updateButtonState(messageId, {\n sentiment: sentiment,\n feedbackSubmitted: true,\n });\n\n setTimeout(() => {\n dispatch.hideCompletionForm(messageId, sentiment);\n }, 1000);\n });\n },\n\n // eslint-disable-next-line no-console\n onClose: () => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n dispatch.updateButtonState(messageId, { sentiment: undefined });\n },\n focusOnLoad: true,\n }),\n [\n captureFeedback,\n conversationId,\n dispatch,\n messages,\n createQuickResponses,\n t,\n ],\n );\n\n const feedbackForms = useCallback(\n (messageId: string): { [key in Sentiment]: UserFeedbackProps } => ({\n positive: getFeedbackForm(messageId, 'positive'),\n negative: getFeedbackForm(messageId, 'negative'),\n }),\n [getFeedbackForm],\n );\n\n const getUserFeedbackComplete = useCallback(\n (\n messageId: string,\n sentiment: Sentiment,\n ): UserFeedbackCompleteProps | undefined => {\n const isVisible = state[messageId]?.completionForm?.[sentiment];\n if (!isVisible) return undefined;\n\n return {\n id: `feebback-completion-${sentiment}-${messageId}`,\n title: t('feedback.completion.title'),\n body: t('feedback.completion.body'),\n onClose: () => {\n dispatch.hideCompletionForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n },\n };\n },\n [state, dispatch, t],\n );\n\n const scrollToFeedbackForm = useCallback(\n (messageId: string, sentiment: Sentiment) => {\n setTimeout(() => {\n const el = document.getElementById(\n `feedback-${sentiment}-${messageId}`,\n );\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n el.focus();\n }\n }, 0);\n },\n [],\n );\n\n const speakMessage = useCallback(\n (messageId: string, content: string) => {\n if (window.speechSynthesis.speaking || window.speechSynthesis.pending) {\n window.speechSynthesis.cancel();\n\n if (\n currentSpeakingIdRef.current &&\n currentSpeakingIdRef.current !== messageId\n ) {\n dispatch.updateButtonState(currentSpeakingIdRef.current, {\n isSpeaking: false,\n });\n }\n }\n\n // Track the current SpeakingId\n currentSpeakingIdRef.current = messageId;\n\n const utterance = new SpeechSynthesisUtterance(content);\n\n utterance.onstart = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: true });\n };\n\n utterance.onend = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n utterance.onerror = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n window.speechSynthesis.speak(utterance);\n },\n [dispatch],\n );\n\n const cancelSpeaking = useCallback(\n (messageId?: string) => {\n window.speechSynthesis.cancel();\n\n currentSpeakingIdRef.current = null;\n\n if (messageId) {\n // Cancel just this one message\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n } else {\n // Cancel all messages\n Object.keys(state).forEach(id => {\n if (state[id].buttonState?.isSpeaking) {\n dispatch.updateButtonState(id, { isSpeaking: false });\n }\n });\n }\n setTimeout(() => {\n const el = document.getElementById(`listen-${messageId}`);\n if (el) {\n el.blur();\n }\n }, 10);\n },\n [state, dispatch],\n );\n\n useEffect(() => {\n return () => {\n // Stop any ongoing speech when component unmounts\n cancelSpeaking();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationId]);\n\n return useMemo(() => {\n return feedbackEnabled\n ? messages.map((message, index) => {\n if (\n message.role === 'user' ||\n (isStreaming && messages.length - 1 === index)\n )\n return message;\n\n const messageId = `${conversationId}-${message.role}-${index}`;\n const { sentiment, copied, isSpeaking } =\n state[messageId]?.buttonState || {};\n const showFeedbackForm = state[messageId]?.feedbackForm?.[sentiment];\n const userFeedbackForm =\n showFeedbackForm && feedbackForms(messageId)[sentiment];\n\n const userFeedbackComplete = getUserFeedbackComplete(\n messageId,\n sentiment,\n );\n\n const createSentimentAction = (selected: Sentiment) => ({\n isClicked: sentiment === selected,\n onClick: () => {\n if (sentiment !== selected) {\n dispatch.toggleFeedbackForm(messageId, selected);\n dispatch.updateButtonState(messageId, { sentiment: selected });\n scrollToFeedbackForm(messageId, sentiment);\n }\n },\n tooltipContent:\n selected === 'positive'\n ? t('feedback.tooltips.goodResponse')\n : t('feedback.tooltips.badResponse'),\n 'aria-expanded': sentiment === selected,\n 'aria-controls': showFeedbackForm\n ? `feedback-${sentiment}-${messageId}`\n : `feebback-completion-${sentiment}-${messageId}`,\n });\n\n const copyAction = {\n isClicked: copied,\n ref: copyButtonRef,\n tooltipContent: copied\n ? t('feedback.tooltips.copied')\n : t('feedback.tooltips.copy'),\n onClick: async () => {\n await window.navigator.clipboard.writeText(\n message.content as string,\n );\n dispatch.updateButtonState(messageId, {\n copied: true,\n });\n\n setTimeout(() => {\n dispatch.updateButtonState(messageId, { copied: false });\n copyButtonRef?.current?.blur();\n }, 1000);\n },\n };\n\n const listenAction = {\n isClicked: isSpeaking,\n ref: speakingButtonRef,\n id: `listen-${messageId}`,\n tooltipContent: isSpeaking\n ? t('feedback.tooltips.listening')\n : t('feedback.tooltips.listen'),\n onClick: () => {\n const isCurrentlySpeaking =\n state[messageId]?.buttonState?.isSpeaking;\n\n if (isCurrentlySpeaking) {\n // Stop if it's already speaking this message\n cancelSpeaking(messageId);\n } else {\n cancelSpeaking();\n speakMessage(messageId, message.content as string);\n }\n },\n };\n\n return {\n ...message,\n userFeedbackForm,\n userFeedbackComplete,\n actions: {\n positive: createSentimentAction('positive'),\n negative: createSentimentAction('negative'),\n copy: copyAction,\n listen: listenAction,\n },\n };\n })\n : messages;\n }, [\n t,\n conversationId,\n messages,\n state,\n dispatch,\n isStreaming,\n speakMessage,\n feedbackForms,\n cancelSpeaking,\n feedbackEnabled,\n getUserFeedbackComplete,\n scrollToFeedbackForm,\n ]);\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFeedbackActions.esm.js","sources":["../../src/hooks/useFeedbackActions.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { MessageProps } from '@patternfly/chatbot';\nimport { UserFeedbackProps } from '@patternfly/chatbot/dist/cjs/Message/UserFeedback/UserFeedback';\nimport { UserFeedbackCompleteProps } from '@patternfly/chatbot/dist/cjs/Message/UserFeedback/UserFeedbackComplete';\n\nimport { useCaptureFeedback } from '../hooks/useCaptureFeedback';\nimport { CaptureFeedback } from '../types';\nimport { Sentiment, useFeedbackState } from './useFeedbackState';\nimport { useFeedbackStatus } from './useFeedbackStatus';\nimport { useTranslation } from './useTranslation';\n\nexport const useFeedbackActions = <T extends MessageProps>(\n messages: T[],\n conversationId: string,\n isStreaming: boolean,\n): T[] => {\n const copyButtonRef = useRef<HTMLButtonElement>(null);\n const speakingButtonRef = useRef<HTMLButtonElement>(null);\n const currentSpeakingIdRef = useRef<string | null>(null);\n\n const { data: feedbackEnabled } = useFeedbackStatus();\n const { state, ...dispatch } = useFeedbackState();\n const { mutateAsync: captureFeedback } = useCaptureFeedback();\n const { t } = useTranslation();\n\n const createQuickResponses = useMemo(\n () => ({\n positive: [\n { id: '1', content: t('feedback.quickResponses.positive.helpful') },\n {\n id: '2',\n content: t('feedback.quickResponses.positive.easyToUnderstand'),\n },\n {\n id: '3',\n content: t('feedback.quickResponses.positive.resolvedIssue'),\n },\n ],\n negative: [\n { id: '1', content: t('feedback.quickResponses.negative.didntAnswer') },\n {\n id: '2',\n content: t('feedback.quickResponses.negative.hardToUnderstand'),\n },\n { id: '3', content: t('feedback.quickResponses.negative.notHelpful') },\n ],\n }),\n [t],\n );\n\n const getFeedbackForm = useCallback(\n (messageId: string, sentiment: 'positive' | 'negative') => ({\n key: `feedback-${sentiment}`,\n id: `feedback-${sentiment}-${messageId}`,\n hasTextArea: true,\n title: t('feedback.form.title'),\n textAreaPlaceholder: t('feedback.form.textAreaPlaceholder'),\n submitWord: t('feedback.form.submitWord'),\n quickResponses: createQuickResponses[sentiment],\n onSubmit: (\n quickResponse: string | undefined = '0',\n additionalFeedback: string | undefined,\n ) => {\n const quickIndex = Number(quickResponse) - 1;\n const quickText =\n quickResponse !== '0'\n ? createQuickResponses[sentiment]?.[quickIndex]?.content\n : undefined;\n\n let user_feedback = '';\n\n if (quickText && additionalFeedback) {\n user_feedback = `${quickText}\\nAdditional feedback: ${additionalFeedback}`;\n } else if (quickText) {\n user_feedback = quickText;\n } else if (additionalFeedback) {\n user_feedback = additionalFeedback;\n }\n\n const botAnswerId = Number(messageId.split('-').pop());\n const userQuestionId = botAnswerId - 1;\n\n const payload: CaptureFeedback = {\n conversation_id: conversationId,\n user_feedback,\n sentiment: sentiment === 'positive' ? 1 : -1,\n user_question: messages[userQuestionId].content || '',\n llm_response: messages[botAnswerId].content || '',\n };\n\n captureFeedback(payload).then(() => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.showCompletionForm(messageId, sentiment);\n dispatch.updateButtonState(messageId, {\n sentiment: sentiment,\n feedbackSubmitted: true,\n });\n\n setTimeout(() => {\n dispatch.hideCompletionForm(messageId, sentiment);\n }, 1000);\n });\n },\n\n // eslint-disable-next-line no-console\n onClose: () => {\n dispatch.hideFeedbackForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n dispatch.updateButtonState(messageId, { sentiment: undefined });\n },\n focusOnLoad: true,\n }),\n [\n captureFeedback,\n conversationId,\n dispatch,\n messages,\n createQuickResponses,\n t,\n ],\n );\n\n const feedbackForms = useCallback(\n (messageId: string): { [key in Sentiment]: UserFeedbackProps } => ({\n positive: getFeedbackForm(messageId, 'positive'),\n negative: getFeedbackForm(messageId, 'negative'),\n }),\n [getFeedbackForm],\n );\n\n const getUserFeedbackComplete = useCallback(\n (\n messageId: string,\n sentiment: Sentiment,\n ): UserFeedbackCompleteProps | undefined => {\n const isVisible = state[messageId]?.completionForm?.[sentiment];\n if (!isVisible) return undefined;\n\n return {\n id: `feebback-completion-${sentiment}-${messageId}`,\n title: t('feedback.completion.title'),\n body: t('feedback.completion.body'),\n onClose: () => {\n dispatch.hideCompletionForm(messageId, sentiment);\n dispatch.resetButtonState(messageId);\n },\n };\n },\n [state, dispatch, t],\n );\n\n const scrollToFeedbackForm = useCallback(\n (messageId: string, sentiment: Sentiment) => {\n setTimeout(() => {\n const el = document.getElementById(\n `feedback-${sentiment}-${messageId}`,\n );\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n el.focus();\n }\n }, 0);\n },\n [],\n );\n\n const speakMessage = useCallback(\n (messageId: string, content: string) => {\n if (window.speechSynthesis.speaking || window.speechSynthesis.pending) {\n window.speechSynthesis.cancel();\n\n if (\n currentSpeakingIdRef.current &&\n currentSpeakingIdRef.current !== messageId\n ) {\n dispatch.updateButtonState(currentSpeakingIdRef.current, {\n isSpeaking: false,\n });\n }\n }\n\n // Track the current SpeakingId\n currentSpeakingIdRef.current = messageId;\n\n const utterance = new SpeechSynthesisUtterance(content);\n\n utterance.onstart = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: true });\n };\n\n utterance.onend = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n utterance.onerror = () => {\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n currentSpeakingIdRef.current = null;\n };\n\n window.speechSynthesis.speak(utterance);\n },\n [dispatch],\n );\n\n const cancelSpeaking = useCallback(\n (messageId?: string) => {\n window.speechSynthesis.cancel();\n\n currentSpeakingIdRef.current = null;\n\n if (messageId) {\n // Cancel just this one message\n dispatch.updateButtonState(messageId, { isSpeaking: false });\n } else {\n // Cancel all messages\n Object.keys(state).forEach(id => {\n if (state[id].buttonState?.isSpeaking) {\n dispatch.updateButtonState(id, { isSpeaking: false });\n }\n });\n }\n setTimeout(() => {\n const el = document.getElementById(`listen-${messageId}`);\n if (el) {\n el.blur();\n }\n }, 10);\n },\n [state, dispatch],\n );\n\n useEffect(() => {\n return () => {\n // Stop any ongoing speech when component unmounts\n cancelSpeaking();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationId]);\n\n return useMemo(() => {\n return feedbackEnabled\n ? messages.map((message, index) => {\n if (\n message.role === 'user' ||\n (isStreaming && messages.length - 1 === index)\n )\n return message;\n\n const messageId = `${conversationId}-${message.role}-${index}`;\n const { sentiment, copied, isSpeaking } =\n state[messageId]?.buttonState || {};\n const showFeedbackForm = state[messageId]?.feedbackForm?.[sentiment];\n const userFeedbackForm =\n showFeedbackForm && feedbackForms(messageId)[sentiment];\n\n const userFeedbackComplete = getUserFeedbackComplete(\n messageId,\n sentiment,\n );\n\n const createSentimentAction = (selected: Sentiment) => ({\n isClicked: sentiment === selected,\n onClick: () => {\n if (sentiment !== selected) {\n dispatch.toggleFeedbackForm(messageId, selected);\n dispatch.updateButtonState(messageId, { sentiment: selected });\n scrollToFeedbackForm(messageId, sentiment);\n }\n },\n tooltipContent:\n selected === 'positive'\n ? t('feedback.tooltips.goodResponse')\n : t('feedback.tooltips.badResponse'),\n 'aria-expanded': sentiment === selected,\n 'aria-controls': showFeedbackForm\n ? `feedback-${sentiment}-${messageId}`\n : `feebback-completion-${sentiment}-${messageId}`,\n });\n\n const copyAction = {\n isClicked: copied,\n ref: copyButtonRef,\n tooltipContent: copied\n ? t('feedback.tooltips.copied')\n : t('feedback.tooltips.copy'),\n onClick: async () => {\n await window.navigator.clipboard.writeText(\n message.content as string,\n );\n dispatch.updateButtonState(messageId, {\n copied: true,\n });\n\n setTimeout(() => {\n dispatch.updateButtonState(messageId, { copied: false });\n copyButtonRef?.current?.blur();\n }, 1000);\n },\n };\n\n const listenAction = {\n isClicked: isSpeaking,\n ref: speakingButtonRef,\n id: `listen-${messageId}`,\n tooltipContent: isSpeaking\n ? t('feedback.tooltips.listening')\n : t('feedback.tooltips.listen'),\n onClick: () => {\n const isCurrentlySpeaking =\n state[messageId]?.buttonState?.isSpeaking;\n\n if (isCurrentlySpeaking) {\n // Stop if it's already speaking this message\n cancelSpeaking(messageId);\n } else {\n cancelSpeaking();\n speakMessage(messageId, message.content as string);\n }\n },\n };\n\n return {\n ...message,\n userFeedbackForm,\n userFeedbackComplete,\n actions: {\n positive: createSentimentAction('positive'),\n negative: createSentimentAction('negative'),\n copy: copyAction,\n listen: listenAction,\n },\n };\n })\n : messages;\n }, [\n t,\n conversationId,\n messages,\n state,\n dispatch,\n isStreaming,\n speakMessage,\n feedbackForms,\n cancelSpeaking,\n feedbackEnabled,\n getUserFeedbackComplete,\n scrollToFeedbackForm,\n ]);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedbackState.esm.js","sources":["../../src/hooks/useFeedbackState.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useReducer } from 'react';\n\nexport type Sentiment = 'positive' | 'negative';\n\ntype FeedbackButtonState = {\n sentiment: Sentiment;\n copied: boolean;\n isSpeaking: boolean;\n feedbackSubmitted?: boolean;\n};\n\ntype MessageState = {\n feedbackForm: Record<Sentiment, boolean>;\n completionForm: Record<Sentiment, boolean>;\n buttonState: FeedbackButtonState;\n};\n\ntype State = Record<string, MessageState>;\n\ntype Action =\n | { type: 'SHOW_FEEDBACK_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'HIDE_FEEDBACK_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'SHOW_COMPLETION_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'HIDE_COMPLETION_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'RESET_BUTTON_STATE'; messageId: string }\n | {\n type: 'UPDATE_BUTTON_STATE';\n messageId: string;\n payload: Partial<FeedbackButtonState>;\n };\n\nfunction reducer(state: State, action: Action): State {\n const entry = state[action.messageId] ?? {\n feedbackForm: { positive: false, negative: false },\n completionForm: { positive: false, negative: false },\n buttonState: {},\n };\n\n switch (action.type) {\n case 'SHOW_FEEDBACK_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n feedbackForm: { ...entry.feedbackForm, [action.sentiment]: true },\n },\n };\n case 'HIDE_FEEDBACK_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n feedbackForm: { ...entry.feedbackForm, [action.sentiment]: false },\n },\n };\n case 'SHOW_COMPLETION_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n completionForm: { ...entry.completionForm, [action.sentiment]: true },\n },\n };\n case 'HIDE_COMPLETION_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n completionForm: {\n ...entry.completionForm,\n [action.sentiment]: false,\n },\n },\n };\n case 'UPDATE_BUTTON_STATE':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n buttonState: { ...entry.buttonState, ...action.payload },\n },\n };\n case 'RESET_BUTTON_STATE': {\n const { [action.messageId]: _, ...rest } = state;\n return rest;\n }\n default:\n return state;\n }\n}\n\nexport function useFeedbackState() {\n const [state, dispatch] = useReducer(reducer, {});\n\n const showFeedbackForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'SHOW_FEEDBACK_FORM', messageId, sentiment });\n\n const hideFeedbackForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'HIDE_FEEDBACK_FORM', messageId, sentiment });\n\n const showCompletionForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'SHOW_COMPLETION_FORM', messageId, sentiment });\n\n const hideCompletionForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'HIDE_COMPLETION_FORM', messageId, sentiment });\n\n const updateButtonState = (\n messageId: string,\n payload: Partial<FeedbackButtonState>,\n ) => dispatch({ type: 'UPDATE_BUTTON_STATE', messageId, payload });\n\n const resetButtonState = (messageId: string) =>\n dispatch({ type: 'RESET_BUTTON_STATE', messageId });\n\n const getFeedbackState = (messageId: string) =>\n state[messageId] ?? {\n feedbackForm: { positive: false, negative: false },\n completionForm: { positive: false, negative: false },\n buttonState: { sentiment: 'positive', copied: false },\n };\n\n const toggleFeedbackForm = (\n messageId: string,\n sentimentToShow: Sentiment,\n ) => {\n const opposite: Sentiment =\n sentimentToShow === 'positive' ? 'negative' : 'positive';\n\n hideFeedbackForm(messageId, opposite);\n showFeedbackForm(messageId, sentimentToShow);\n };\n\n return {\n state,\n getFeedbackState,\n showFeedbackForm,\n hideFeedbackForm,\n toggleFeedbackForm,\n showCompletionForm,\n hideCompletionForm,\n updateButtonState,\n resetButtonState,\n };\n}\n"],"names":[],"mappings":";;AA8CA,SAAS,OAAA,CAAQ,OAAc,
|
|
1
|
+
{"version":3,"file":"useFeedbackState.esm.js","sources":["../../src/hooks/useFeedbackState.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useReducer } from 'react';\n\nexport type Sentiment = 'positive' | 'negative';\n\ntype FeedbackButtonState = {\n sentiment: Sentiment;\n copied: boolean;\n isSpeaking: boolean;\n feedbackSubmitted?: boolean;\n};\n\ntype MessageState = {\n feedbackForm: Record<Sentiment, boolean>;\n completionForm: Record<Sentiment, boolean>;\n buttonState: FeedbackButtonState;\n};\n\ntype State = Record<string, MessageState>;\n\ntype Action =\n | { type: 'SHOW_FEEDBACK_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'HIDE_FEEDBACK_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'SHOW_COMPLETION_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'HIDE_COMPLETION_FORM'; messageId: string; sentiment: Sentiment }\n | { type: 'RESET_BUTTON_STATE'; messageId: string }\n | {\n type: 'UPDATE_BUTTON_STATE';\n messageId: string;\n payload: Partial<FeedbackButtonState>;\n };\n\nfunction reducer(state: State, action: Action): State {\n const entry = state[action.messageId] ?? {\n feedbackForm: { positive: false, negative: false },\n completionForm: { positive: false, negative: false },\n buttonState: {},\n };\n\n switch (action.type) {\n case 'SHOW_FEEDBACK_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n feedbackForm: { ...entry.feedbackForm, [action.sentiment]: true },\n },\n };\n case 'HIDE_FEEDBACK_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n feedbackForm: { ...entry.feedbackForm, [action.sentiment]: false },\n },\n };\n case 'SHOW_COMPLETION_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n completionForm: { ...entry.completionForm, [action.sentiment]: true },\n },\n };\n case 'HIDE_COMPLETION_FORM':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n completionForm: {\n ...entry.completionForm,\n [action.sentiment]: false,\n },\n },\n };\n case 'UPDATE_BUTTON_STATE':\n return {\n ...state,\n [action.messageId]: {\n ...entry,\n buttonState: { ...entry.buttonState, ...action.payload },\n },\n };\n case 'RESET_BUTTON_STATE': {\n const { [action.messageId]: _, ...rest } = state;\n return rest;\n }\n default:\n return state;\n }\n}\n\nexport function useFeedbackState() {\n const [state, dispatch] = useReducer(reducer, {});\n\n const showFeedbackForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'SHOW_FEEDBACK_FORM', messageId, sentiment });\n\n const hideFeedbackForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'HIDE_FEEDBACK_FORM', messageId, sentiment });\n\n const showCompletionForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'SHOW_COMPLETION_FORM', messageId, sentiment });\n\n const hideCompletionForm = (messageId: string, sentiment: Sentiment) =>\n dispatch({ type: 'HIDE_COMPLETION_FORM', messageId, sentiment });\n\n const updateButtonState = (\n messageId: string,\n payload: Partial<FeedbackButtonState>,\n ) => dispatch({ type: 'UPDATE_BUTTON_STATE', messageId, payload });\n\n const resetButtonState = (messageId: string) =>\n dispatch({ type: 'RESET_BUTTON_STATE', messageId });\n\n const getFeedbackState = (messageId: string) =>\n state[messageId] ?? {\n feedbackForm: { positive: false, negative: false },\n completionForm: { positive: false, negative: false },\n buttonState: { sentiment: 'positive', copied: false },\n };\n\n const toggleFeedbackForm = (\n messageId: string,\n sentimentToShow: Sentiment,\n ) => {\n const opposite: Sentiment =\n sentimentToShow === 'positive' ? 'negative' : 'positive';\n\n hideFeedbackForm(messageId, opposite);\n showFeedbackForm(messageId, sentimentToShow);\n };\n\n return {\n state,\n getFeedbackState,\n showFeedbackForm,\n hideFeedbackForm,\n toggleFeedbackForm,\n showCompletionForm,\n hideCompletionForm,\n updateButtonState,\n resetButtonState,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedbackStatus.esm.js","sources":["../../src/hooks/useFeedbackStatus.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\n\n// Fetch feedback status\nexport const useFeedbackStatus = (): UseQueryResult<boolean, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['feedbackStatus'],\n queryFn: async () => await lightspeedApi.getFeedbackStatus(),\n });\n};\n"],"names":[],"mappings":";;;;AAsBO,MAAM,oBAAoB,MAAsC;AACrE,
|
|
1
|
+
{"version":3,"file":"useFeedbackStatus.esm.js","sources":["../../src/hooks/useFeedbackStatus.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\n\n// Fetch feedback status\nexport const useFeedbackStatus = (): UseQueryResult<boolean, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['feedbackStatus'],\n queryFn: async () => await lightspeedApi.getFeedbackStatus(),\n });\n};\n"],"names":[],"mappings":";;;;AAsBO,MAAM,oBAAoB,MAAsC;AACrE,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,gBAAgB,CAAA;AAAA,IAC3B,OAAA,EAAS,YAAY,MAAM,aAAA,CAAc,iBAAA;AAAkB,GAC5D,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsMobile.esm.js","sources":["../../src/hooks/useIsMobile.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const useIsMobile = () => {\n const [isMobile, setIsMobile] = React.useState(window.innerWidth <= 768);\n\n React.useEffect(() => {\n const handleResize = () => setIsMobile(window.innerWidth <= 768);\n window.addEventListener('resize', handleResize);\n\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return isMobile;\n};\n"],"names":[],"mappings":";;AAiBO,MAAM,cAAc,MAAM;AAC/B,
|
|
1
|
+
{"version":3,"file":"useIsMobile.esm.js","sources":["../../src/hooks/useIsMobile.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const useIsMobile = () => {\n const [isMobile, setIsMobile] = React.useState(window.innerWidth <= 768);\n\n React.useEffect(() => {\n const handleResize = () => setIsMobile(window.innerWidth <= 768);\n window.addEventListener('resize', handleResize);\n\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return isMobile;\n};\n"],"names":[],"mappings":";;AAiBO,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAI,MAAM,QAAA,CAAS,MAAA,CAAO,cAAc,GAAG,CAAA;AAEvE,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,MAAA,CAAO,cAAc,GAAG,CAAA;AAC/D,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAE9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,QAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLastOpenedConversation.esm.js","sources":["../../src/hooks/useLastOpenedConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\ntype UseLastOpenedConversationReturn = {\n lastOpenedId: string | null;\n setLastOpenedId: Dispatch<SetStateAction<string | null>>;\n clearLastOpenedId: () => void;\n isReady: boolean;\n};\n\nexport const useLastOpenedConversation = (\n user: string | undefined,\n key = 'lastOpenedConversation',\n): UseLastOpenedConversationReturn => {\n const [lastOpenedId, setLastOpenedId] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!user) {\n setLastOpenedId(null);\n setIsReady(false);\n return;\n }\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n setLastOpenedId(parsedData[user] || null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error accessing localStorage:', error);\n } finally {\n setIsReady(true);\n }\n }, [user, key]);\n\n useEffect(() => {\n if (!user || lastOpenedId === null) return;\n // Update localStorage whenever the last opened ID changes\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n\n if (parsedData[user] !== lastOpenedId) {\n parsedData[user] = lastOpenedId;\n localStorage.setItem(key, JSON.stringify(parsedData));\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error updating localStorage:', error);\n }\n }, [lastOpenedId, user, key]);\n\n const clearLastOpenedId = useCallback(() => {\n if (!user) return;\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n delete parsedData[user];\n localStorage.setItem(key, JSON.stringify(parsedData));\n setLastOpenedId(null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error clearing localStorage:', error);\n }\n }, [user, key]);\n\n return { lastOpenedId, setLastOpenedId, clearLastOpenedId, isReady };\n};\n"],"names":[],"mappings":";;AA8BO,MAAM,
|
|
1
|
+
{"version":3,"file":"useLastOpenedConversation.esm.js","sources":["../../src/hooks/useLastOpenedConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react';\n\ntype UseLastOpenedConversationReturn = {\n lastOpenedId: string | null;\n setLastOpenedId: Dispatch<SetStateAction<string | null>>;\n clearLastOpenedId: () => void;\n isReady: boolean;\n};\n\nexport const useLastOpenedConversation = (\n user: string | undefined,\n key = 'lastOpenedConversation',\n): UseLastOpenedConversationReturn => {\n const [lastOpenedId, setLastOpenedId] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!user) {\n setLastOpenedId(null);\n setIsReady(false);\n return;\n }\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n setLastOpenedId(parsedData[user] || null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error accessing localStorage:', error);\n } finally {\n setIsReady(true);\n }\n }, [user, key]);\n\n useEffect(() => {\n if (!user || lastOpenedId === null) return;\n // Update localStorage whenever the last opened ID changes\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n\n if (parsedData[user] !== lastOpenedId) {\n parsedData[user] = lastOpenedId;\n localStorage.setItem(key, JSON.stringify(parsedData));\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error updating localStorage:', error);\n }\n }, [lastOpenedId, user, key]);\n\n const clearLastOpenedId = useCallback(() => {\n if (!user) return;\n\n try {\n const storedData = localStorage.getItem(key);\n const parsedData = storedData ? JSON.parse(storedData) : {};\n delete parsedData[user];\n localStorage.setItem(key, JSON.stringify(parsedData));\n setLastOpenedId(null);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error clearing localStorage:', error);\n }\n }, [user, key]);\n\n return { lastOpenedId, setLastOpenedId, clearLastOpenedId, isReady };\n};\n"],"names":[],"mappings":";;AA8BO,MAAM,yBAAA,GAA4B,CACvC,IAAA,EACA,GAAA,GAAM,wBAAA,KAC8B;AACpC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAC1D,MAAA,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA,IAAK,IAAI,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,IACtD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,YAAA,KAAiB,IAAA,EAAM;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAE1D,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,KAAM,YAAA,EAAc;AACrC,QAAA,UAAA,CAAW,IAAI,CAAA,GAAI,YAAA;AACnB,QAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,IAAA,EAAM,GAAG,CAAC,CAAA;AAE5B,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,EAAC;AAC1D,MAAA,OAAO,WAAW,IAAI,CAAA;AACtB,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AACpD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAEd,EAAA,OAAO,EAAE,YAAA,EAAc,eAAA,EAAiB,iBAAA,EAAmB,OAAA,EAAQ;AACrE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLightspeedDeletePermission.esm.js","sources":["../../src/hooks/useLightspeedDeletePermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { lightspeedChatDeletePermission } from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';\n\nexport const useLightspeedDeletePermission = () => {\n const lightspeedDeletePermissionResult = usePermission({\n permission: lightspeedChatDeletePermission,\n });\n\n return lightspeedDeletePermissionResult;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,mCAAmC,
|
|
1
|
+
{"version":3,"file":"useLightspeedDeletePermission.esm.js","sources":["../../src/hooks/useLightspeedDeletePermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { lightspeedChatDeletePermission } from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';\n\nexport const useLightspeedDeletePermission = () => {\n const lightspeedDeletePermissionResult = usePermission({\n permission: lightspeedChatDeletePermission,\n });\n\n return lightspeedDeletePermissionResult;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,mCAAmC,aAAA,CAAc;AAAA,IACrD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO,gCAAA;AACT;;;;"}
|