"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Insight = Insight; var _react = _interopRequireWildcard(require("react")); var _lodash = require("lodash"); var _eui = require("@elastic/eui"); var _common = require("@kbn/kibana-utils-plugin/common"); var _types = require("../../../common/types"); var _observability_ai_assistant_chat_service_provider = require("../../context/observability_ai_assistant_chat_service_provider"); var _use_kibana = require("../../hooks/use_kibana"); var _use_abortable_async = require("../../hooks/use_abortable_async"); var _use_conversation = require("../../hooks/use_conversation"); var _use_genai_connectors = require("../../hooks/use_genai_connectors"); var _use_observability_ai_assistant = require("../../hooks/use_observability_ai_assistant"); var _use_observability_ai_assistant_chat_service = require("../../hooks/use_observability_ai_assistant_chat_service"); var _get_connectors_management_href = require("../../utils/get_connectors_management_href"); var _regenerate_response_button = require("../buttons/regenerate_response_button"); var _start_chat_button = require("../buttons/start_chat_button"); var _stop_generating_button = require("../buttons/stop_generating_button"); var _chat_flyout = require("../chat/chat_flyout"); var _connector_selector_base = require("../connector_selector/connector_selector_base"); var _message_panel = require("../message_panel/message_panel"); var _message_text = require("../message_panel/message_text"); var _missing_credentials_callout = require("../missing_credentials_callout"); var _insight_base = require("./insight_base"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ function ChatContent({ title: defaultTitle, initialMessages, connectorId }) { var _conversation$value, _lastMessage$message$; const chatService = (0, _use_observability_ai_assistant_chat_service.useObservabilityAIAssistantChatService)(); const [pendingMessage, setPendingMessage] = (0, _react.useState)(); const [loading, setLoading] = (0, _react.useState)(false); const [subscription, setSubscription] = (0, _react.useState)(); const [conversationId, setConversationId] = (0, _react.useState)(); const { conversation, displayedMessages, setDisplayedMessages, save, saveTitle } = (0, _use_conversation.useConversation)({ conversationId, connectorId, chatService }); const conversationTitle = conversationId ? ((_conversation$value = conversation.value) === null || _conversation$value === void 0 ? void 0 : _conversation$value.conversation.title) || '' : defaultTitle; const reloadReply = (0, _react.useCallback)(() => { setLoading(true); let lastPendingMessage; const nextSubscription = chatService.chat({ messages: initialMessages, connectorId, function: 'none' }).subscribe({ next: msg => { lastPendingMessage = msg; setPendingMessage(() => msg); }, complete: () => { setDisplayedMessages(prevMessages => prevMessages.concat({ '@timestamp': new Date().toISOString(), message: { ...lastPendingMessage.message } })); setLoading(false); } }); setSubscription(nextSubscription); }, [initialMessages, setDisplayedMessages, connectorId, chatService]); (0, _react.useEffect)(() => { reloadReply(); }, [reloadReply]); (0, _react.useEffect)(() => { setDisplayedMessages(initialMessages); }, [initialMessages, setDisplayedMessages]); const [isOpen, setIsOpen] = (0, _react.useState)(false); const messagesWithPending = (0, _react.useMemo)(() => { return pendingMessage ? displayedMessages.concat({ '@timestamp': new Date().toISOString(), message: { ...pendingMessage.message } }) : displayedMessages; }, [pendingMessage, displayedMessages]); const lastMessage = (0, _lodash.last)(messagesWithPending); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_message_panel.MessagePanel, { body: /*#__PURE__*/_react.default.createElement(_message_text.MessageText, { content: (_lastMessage$message$ = lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.message.content) !== null && _lastMessage$message$ !== void 0 ? _lastMessage$message$ : '', loading: loading }), error: pendingMessage === null || pendingMessage === void 0 ? void 0 : pendingMessage.error, controls: loading ? /*#__PURE__*/_react.default.createElement(_stop_generating_button.StopGeneratingButton, { onClick: () => { subscription === null || subscription === void 0 ? void 0 : subscription.unsubscribe(); setLoading(false); setDisplayedMessages(prevMessages => prevMessages.concat({ '@timestamp': new Date().toISOString(), message: { ...pendingMessage.message } })); setPendingMessage(prev => ({ message: { role: _types.MessageRole.Assistant, ...(prev === null || prev === void 0 ? void 0 : prev.message) }, aborted: true, error: new _common.AbortError() })); } }) : /*#__PURE__*/_react.default.createElement(_eui.EuiFlexGroup, { direction: "row" }, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_regenerate_response_button.RegenerateResponseButton, { onClick: () => { reloadReply(); } })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_start_chat_button.StartChatButton, { onClick: () => { setIsOpen(() => true); } }))) }), /*#__PURE__*/_react.default.createElement(_chat_flyout.ChatFlyout, { title: conversationTitle, isOpen: isOpen, onClose: () => { setIsOpen(() => false); }, messages: displayedMessages, conversationId: conversationId, startedFrom: "contextualInsight", onChatComplete: nextMessages => { save(nextMessages).then(nextConversation => { setConversationId(nextConversation.conversation.id); }).catch(() => {}); }, onChatUpdate: nextMessages => { setDisplayedMessages(nextMessages); }, onChatTitleSave: newTitle => { saveTitle(newTitle); } })); } function Insight({ messages, title }) { var _connectors$connector; const [hasOpened, setHasOpened] = (0, _react.useState)(false); const connectors = (0, _use_genai_connectors.useGenAIConnectors)(); const service = (0, _use_observability_ai_assistant.useObservabilityAIAssistant)(); const chatService = (0, _use_abortable_async.useAbortableAsync)(({ signal }) => { return service.start({ signal }); }, [service]); const { services: { http } } = (0, _use_kibana.useKibana)(); let children = null; if (hasOpened && connectors.selectedConnector) { children = /*#__PURE__*/_react.default.createElement(ChatContent, { title: title, initialMessages: messages, connectorId: connectors.selectedConnector }); } else if (!connectors.loading && !((_connectors$connector = connectors.connectors) !== null && _connectors$connector !== void 0 && _connectors$connector.length)) { children = /*#__PURE__*/_react.default.createElement(_missing_credentials_callout.MissingCredentialsCallout, { connectorsManagementHref: (0, _get_connectors_management_href.getConnectorsManagementHref)(http) }); } return /*#__PURE__*/_react.default.createElement(_insight_base.InsightBase, { title: title, onToggle: isOpen => { setHasOpened(prevHasOpened => prevHasOpened || isOpen); }, controls: /*#__PURE__*/_react.default.createElement(_connector_selector_base.ConnectorSelectorBase, connectors), loading: connectors.loading || chatService.loading }, chatService.value ? /*#__PURE__*/_react.default.createElement(_observability_ai_assistant_chat_service_provider.ObservabilityAIAssistantChatServiceProvider, { value: chatService.value }, children) : null); }