+
);
diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx
index d2595354a4581..7afbbc8e5b89c 100644
--- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx
@@ -4,26 +4,39 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import { EuiFlexGroup, EuiFlexItem, EuiFlyout } from '@elastic/eui';
-import React, { useState } from 'react';
+import { EuiFlexGroup, EuiFlexItem, EuiFlyout, EuiLink, EuiPanel, useEuiTheme } from '@elastic/eui';
+import { css } from '@emotion/css';
+import React from 'react';
+import { i18n } from '@kbn/i18n';
import type { Message } from '../../../common/types';
import { useCurrentUser } from '../../hooks/use_current_user';
import { useGenAIConnectors } from '../../hooks/use_genai_connectors';
import { useKibana } from '../../hooks/use_kibana';
import { useObservabilityAIAssistant } from '../../hooks/use_observability_ai_assistant';
+import { useObservabilityAIAssistantRouter } from '../../hooks/use_observability_ai_assistant_router';
import { getConnectorsManagementHref } from '../../utils/get_connectors_management_href';
import { ChatBody } from './chat_body';
+const containerClassName = css`
+ max-height: 100%;
+`;
+
export function ChatFlyout({
title,
messages,
+ conversationId,
isOpen,
onClose,
+ onChatUpdate,
+ onChatComplete,
}: {
title: string;
messages: Message[];
+ conversationId?: string;
isOpen: boolean;
onClose: () => void;
+ onChatUpdate?: (messages: Message[]) => void;
+ onChatComplete?: (messages: Message[]) => void;
}) {
const connectors = useGenAIConnectors();
@@ -33,13 +46,46 @@ export function ChatFlyout({
services: { http },
} = useKibana();
- const [isConversationListExpanded, setIsConversationListExpanded] = useState(false);
-
const service = useObservabilityAIAssistant();
+ const { euiTheme } = useEuiTheme();
+
+ const router = useObservabilityAIAssistantRouter();
+
return isOpen ? (
-
+
+
+
+ {conversationId ? (
+
+ {i18n.translate('xpack.observabilityAiAssistant.conversationDeepLinkLabel', {
+ defaultMessage: 'Open conversation',
+ })}
+
+ ) : (
+
+ {i18n.translate('xpack.observabilityAiAssistant.conversationListDeepLinkLabel', {
+ defaultMessage: 'Go to conversations',
+ })}
+
+ )}
+
+
- setIsConversationListExpanded(!isConversationListExpanded)
- }
- onChatComplete={() => {}}
- onChatUpdate={() => {}}
+ onChatUpdate={(nextMessages) => {
+ if (onChatUpdate) {
+ onChatUpdate(nextMessages);
+ }
+ }}
+ onChatComplete={(nextMessages) => {
+ if (onChatComplete) {
+ onChatComplete(nextMessages);
+ }
+ }}
/>
diff --git a/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_kibana.ts b/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_kibana.ts
index 41239c6e4af1a..d9ab341dce80d 100644
--- a/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_kibana.ts
+++ b/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_kibana.ts
@@ -15,6 +15,11 @@ export function useKibana() {
}
},
},
+ http: {
+ basePath: {
+ prepend: () => '',
+ },
+ },
notifications: {
toasts: {
addSuccess: () => {},
diff --git a/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts b/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts
new file mode 100644
index 0000000000000..15aa5d0428ab3
--- /dev/null
+++ b/x-pack/plugins/observability_ai_assistant/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts
@@ -0,0 +1,10 @@
+/*
+ * 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.
+ */
+
+export function useObservabilityAIAssistant() {
+ return {};
+}
diff --git a/x-pack/plugins/observability_ai_assistant/public/hooks/use_conversation.ts b/x-pack/plugins/observability_ai_assistant/public/hooks/use_conversation.ts
new file mode 100644
index 0000000000000..39e64c5c95666
--- /dev/null
+++ b/x-pack/plugins/observability_ai_assistant/public/hooks/use_conversation.ts
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ */
+import { i18n } from '@kbn/i18n';
+import { merge, omit } from 'lodash';
+import { Dispatch, SetStateAction, useState } from 'react';
+import type { Conversation, Message } from '../../common';
+import type { ConversationCreateRequest } from '../../common/types';
+import { useAbortableAsync, type AbortableAsyncState } from './use_abortable_async';
+import { useKibana } from './use_kibana';
+import { useObservabilityAIAssistant } from './use_observability_ai_assistant';
+import { createNewConversation } from './use_timeline';
+
+export function useConversation(conversationId?: string): {
+ conversation: AbortableAsyncState;
+ displayedMessages: Message[];
+ setDisplayedMessages: Dispatch>;
+ save: (messages: Message[]) => Promise;
+} {
+ const service = useObservabilityAIAssistant();
+
+ const {
+ services: { notifications },
+ } = useKibana();
+
+ const [displayedMessages, setDisplayedMessages] = useState([]);
+
+ const conversation: AbortableAsyncState =
+ useAbortableAsync(
+ ({ signal }) => {
+ if (!conversationId) {
+ const nextConversation = createNewConversation();
+ setDisplayedMessages(nextConversation.messages);
+ return nextConversation;
+ }
+
+ return service
+ .callApi('GET /internal/observability_ai_assistant/conversation/{conversationId}', {
+ signal,
+ params: { path: { conversationId } },
+ })
+ .then((nextConversation) => {
+ setDisplayedMessages(nextConversation.messages);
+ return nextConversation;
+ })
+ .catch((error) => {
+ setDisplayedMessages([]);
+ throw error;
+ });
+ },
+ [conversationId]
+ );
+
+ return {
+ conversation,
+ displayedMessages,
+ setDisplayedMessages,
+ save: (messages: Message[]) => {
+ const conversationObject = conversation.value!;
+ return conversationId
+ ? service
+ .callApi(`POST /internal/observability_ai_assistant/conversation/{conversationId}`, {
+ signal: null,
+ params: {
+ path: {
+ conversationId,
+ },
+ body: {
+ conversation: merge(
+ {
+ '@timestamp': conversationObject['@timestamp'],
+ conversation: {
+ id: conversationId,
+ },
+ },
+ omit(conversationObject, 'conversation.last_updated', 'namespace', 'user'),
+ { messages }
+ ),
+ },
+ },
+ })
+ .catch((err) => {
+ notifications.toasts.addError(err, {
+ title: i18n.translate('xpack.observabilityAiAssistant.errorUpdatingConversation', {
+ defaultMessage: 'Could not update conversation',
+ }),
+ });
+ throw err;
+ })
+ : service
+ .callApi(`PUT /internal/observability_ai_assistant/conversation`, {
+ signal: null,
+ params: {
+ body: {
+ conversation: merge({}, conversationObject, { messages }),
+ },
+ },
+ })
+ .catch((err) => {
+ notifications.toasts.addError(err, {
+ title: i18n.translate('xpack.observabilityAiAssistant.errorCreatingConversation', {
+ defaultMessage: 'Could not create conversation',
+ }),
+ });
+ throw err;
+ });
+ },
+ };
+}
diff --git a/x-pack/plugins/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts b/x-pack/plugins/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts
index 8d8938fc49521..041d2ebcba498 100644
--- a/x-pack/plugins/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts
+++ b/x-pack/plugins/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts
@@ -7,6 +7,12 @@
import { useContext } from 'react';
import { ObservabilityAIAssistantContext } from '../context/observability_ai_assistant_provider';
+export function useObservabilityAIAssistantOptional() {
+ const services = useContext(ObservabilityAIAssistantContext);
+
+ return services;
+}
+
export function useObservabilityAIAssistant() {
const services = useContext(ObservabilityAIAssistantContext);
diff --git a/x-pack/plugins/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_ai_assistant/public/index.ts
index bdb716557db5c..18039652eaa66 100644
--- a/x-pack/plugins/observability_ai_assistant/public/index.ts
+++ b/x-pack/plugins/observability_ai_assistant/public/index.ts
@@ -20,11 +20,22 @@ export const ContextualInsight = withSuspense(
lazy(() => import('./components/insight/insight').then((m) => ({ default: m.Insight })))
);
+export const ObservabilityAIAssistantActionMenuItem = withSuspense(
+ lazy(() =>
+ import('./components/action_menu_item/action_menu_item').then((m) => ({
+ default: m.ObservabilityAIAssistantActionMenuItem,
+ }))
+ )
+);
+
export { ObservabilityAIAssistantProvider } from './context/observability_ai_assistant_provider';
export type { ObservabilityAIAssistantPluginSetup, ObservabilityAIAssistantPluginStart };
-export { useObservabilityAIAssistant } from './hooks/use_observability_ai_assistant';
+export {
+ useObservabilityAIAssistant,
+ useObservabilityAIAssistantOptional,
+} from './hooks/use_observability_ai_assistant';
export type { Conversation, Message } from '../common';
export { MessageRole } from '../common';
diff --git a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
index 6ceff112ada4c..4c0b184131557 100644
--- a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
@@ -68,7 +68,7 @@ export class ObservabilityAIAssistantPlugin
title: i18n.translate('xpack.observabilityAiAssistant.conversationsDeepLinkTitle', {
defaultMessage: 'Conversations',
}),
- path: '/conversations',
+ path: '/conversations/new',
},
],
diff --git a/x-pack/plugins/observability_ai_assistant/public/routes/config.tsx b/x-pack/plugins/observability_ai_assistant/public/routes/config.tsx
index db3384d7005d5..f4245cb69d9e7 100644
--- a/x-pack/plugins/observability_ai_assistant/public/routes/config.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/routes/config.tsx
@@ -38,6 +38,9 @@ const observabilityAIAssistantRoutes = {
}),
element: ,
},
+ '/conversations': {
+ element: ,
+ },
},
},
};
diff --git a/x-pack/plugins/observability_ai_assistant/public/routes/conversations/conversation_view.tsx b/x-pack/plugins/observability_ai_assistant/public/routes/conversations/conversation_view.tsx
index 4ffaa69d2acf8..2092390aedb90 100644
--- a/x-pack/plugins/observability_ai_assistant/public/routes/conversations/conversation_view.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/routes/conversations/conversation_view.tsx
@@ -7,20 +7,18 @@
import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiSpacer } from '@elastic/eui';
import { css } from '@emotion/css';
import { i18n } from '@kbn/i18n';
-import { merge, omit } from 'lodash';
import React, { useMemo, useState } from 'react';
-import type { ConversationCreateRequest, Message } from '../../../common/types';
import { ChatBody } from '../../components/chat/chat_body';
import { ConversationList } from '../../components/chat/conversation_list';
-import { AbortableAsyncState, useAbortableAsync } from '../../hooks/use_abortable_async';
+import { useAbortableAsync } from '../../hooks/use_abortable_async';
import { useConfirmModal } from '../../hooks/use_confirm_modal';
+import { useConversation } from '../../hooks/use_conversation';
import { useCurrentUser } from '../../hooks/use_current_user';
import { useGenAIConnectors } from '../../hooks/use_genai_connectors';
import { useKibana } from '../../hooks/use_kibana';
import { useObservabilityAIAssistant } from '../../hooks/use_observability_ai_assistant';
import { useObservabilityAIAssistantParams } from '../../hooks/use_observability_ai_assistant_params';
import { useObservabilityAIAssistantRouter } from '../../hooks/use_observability_ai_assistant_router';
-import { createNewConversation } from '../../hooks/use_timeline';
import { EMPTY_CONVERSATION_TITLE } from '../../i18n';
import { getConnectorsManagementHref } from '../../utils/get_connectors_management_href';
@@ -63,31 +61,8 @@ export function ConversationView() {
const conversationId = 'conversationId' in path ? path.conversationId : undefined;
- const conversation: AbortableAsyncState =
- useAbortableAsync(
- ({ signal }) => {
- if (!conversationId) {
- const nextConversation = createNewConversation();
- setDisplayedMessages(nextConversation.messages);
- return nextConversation;
- }
-
- return service
- .callApi('GET /internal/observability_ai_assistant/conversation/{conversationId}', {
- signal,
- params: { path: { conversationId } },
- })
- .then((nextConversation) => {
- setDisplayedMessages(nextConversation.messages);
- return nextConversation;
- })
- .catch((error) => {
- setDisplayedMessages([]);
- throw error;
- });
- },
- [conversationId]
- );
+ const { conversation, displayedMessages, setDisplayedMessages, save } =
+ useConversation(conversationId);
const conversations = useAbortableAsync(
({ signal }) => {
@@ -113,8 +88,6 @@ export function ConversationView() {
];
}, [conversations.value?.conversations, conversationId, observabilityAIAssistantRouter]);
- const [displayedMessages, setDisplayedMessages] = useState([]);
-
function navigateToConversation(nextConversationId?: string) {
observabilityAIAssistantRouter.push(
nextConversationId ? '/conversations/{conversationId}' : '/conversations/new',
@@ -233,71 +206,14 @@ export function ConversationView() {
service={service}
messages={displayedMessages}
onChatComplete={(messages) => {
- const conversationObject = conversation.value!;
- if (conversationId) {
- service
- .callApi(
- `POST /internal/observability_ai_assistant/conversation/{conversationId}`,
- {
- signal: null,
- params: {
- path: {
- conversationId,
- },
- body: {
- conversation: merge(
- {
- '@timestamp': conversationObject['@timestamp'],
- conversation: {
- id: conversationId,
- },
- },
- omit(
- conversationObject,
- 'conversation.last_updated',
- 'namespace',
- 'user'
- ),
- { messages }
- ),
- },
- },
- }
- )
- .then(() => {
- conversations.refresh();
- })
- .catch((err) => {
- notifications.toasts.addError(err, {
- title: i18n.translate(
- 'xpack.observabilityAiAssistant.errorCreatingConversation',
- { defaultMessage: 'Could not create conversation' }
- ),
- });
- });
- } else {
- service
- .callApi(`PUT /internal/observability_ai_assistant/conversation`, {
- signal: null,
- params: {
- body: {
- conversation: merge({}, conversationObject, { messages }),
- },
- },
- })
- .then((createdConversation) => {
- navigateToConversation(createdConversation.conversation.id);
- conversations.refresh();
- })
- .catch((err) => {
- notifications.toasts.addError(err, {
- title: i18n.translate(
- 'xpack.observabilityAiAssistant.errorCreatingConversation',
- { defaultMessage: 'Could not create conversation' }
- ),
- });
- });
- }
+ save(messages)
+ .then((nextConversation) => {
+ conversations.refresh();
+ if (!conversationId) {
+ navigateToConversation(nextConversation.conversation.id);
+ }
+ })
+ .catch(() => {});
}}
onChatUpdate={(messages) => {
setDisplayedMessages(messages);
diff --git a/x-pack/plugins/profiling/public/components/profiling_header_action_menu.tsx b/x-pack/plugins/profiling/public/components/profiling_header_action_menu.tsx
index b973c763142be..fafcc1b36d9d8 100644
--- a/x-pack/plugins/profiling/public/components/profiling_header_action_menu.tsx
+++ b/x-pack/plugins/profiling/public/components/profiling_header_action_menu.tsx
@@ -7,6 +7,7 @@
import { EuiFlexGroup, EuiFlexItem, EuiHeaderLink, EuiHeaderLinks, EuiIcon } from '@elastic/eui';
import React from 'react';
import { i18n } from '@kbn/i18n';
+import { ObservabilityAIAssistantActionMenuItem } from '@kbn/observability-ai-assistant-plugin/public';
import { useProfilingRouter } from '../hooks/use_profiling_router';
import { NoDataTabs } from '../views/no_data_view';
@@ -31,6 +32,7 @@ export function ProfilingHeaderActionMenu() {
+
);
}
diff --git a/x-pack/plugins/synthetics/kibana.jsonc b/x-pack/plugins/synthetics/kibana.jsonc
index bfef1566d7e9c..511666996f829 100644
--- a/x-pack/plugins/synthetics/kibana.jsonc
+++ b/x-pack/plugins/synthetics/kibana.jsonc
@@ -24,6 +24,7 @@
"licensing",
"observability",
"observabilityShared",
+ "observabilityAIAssistant",
"ruleRegistry",
"security",
"share",
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/header/action_menu_content.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/header/action_menu_content.tsx
index d74492794d08f..a123f4be95382 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/header/action_menu_content.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/header/action_menu_content.tsx
@@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { useHistory, useRouteMatch } from 'react-router-dom';
import { createExploratoryViewUrl } from '@kbn/exploratory-view-plugin/public';
+import { ObservabilityAIAssistantActionMenuItem } from '@kbn/observability-ai-assistant-plugin/public';
import { LastRefreshed } from '../components/last_refreshed';
import { AutoRefreshButton } from '../components/auto_refresh_button';
import { useSyntheticsSettingsContext } from '../../../contexts';
@@ -102,8 +103,8 @@ export function ActionMenuContent(): React.ReactElement {
{ANALYZE_DATA}
-
+
);
}
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx
index 1be49596f1480..f9b37b64df403 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx
@@ -17,6 +17,7 @@ import {
} from '@kbn/kibana-react-plugin/public';
import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common';
import { InspectorContextProvider } from '@kbn/observability-shared-plugin/public';
+import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public';
import { SyntheticsAppProps } from './contexts';
import {
@@ -98,30 +99,32 @@ const Application = (props: SyntheticsAppProps) => {
fleet: startPlugins.fleet,
}}
>
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x-pack/plugins/synthetics/public/plugin.ts b/x-pack/plugins/synthetics/public/plugin.ts
index 28802415c38bf..28ac4ba859e5f 100644
--- a/x-pack/plugins/synthetics/public/plugin.ts
+++ b/x-pack/plugins/synthetics/public/plugin.ts
@@ -49,6 +49,10 @@ import type {
ObservabilitySharedPluginSetup,
ObservabilitySharedPluginStart,
} from '@kbn/observability-shared-plugin/public';
+import {
+ ObservabilityAIAssistantPluginStart,
+ ObservabilityAIAssistantPluginSetup,
+} from '@kbn/observability-ai-assistant-plugin/public';
import { PLUGIN } from '../common/constants/plugin';
import { OVERVIEW_ROUTE } from '../common/constants/ui';
import { locators } from './apps/locators';
@@ -61,6 +65,7 @@ export interface ClientPluginsSetup {
exploratoryView: ExploratoryViewPublicSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginSetup;
share: SharePluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
cloud?: CloudSetup;
@@ -76,6 +81,7 @@ export interface ClientPluginsStart {
exploratoryView: ExploratoryViewPublicStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginStart;
share: SharePluginStart;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
cases: CasesUiStart;
diff --git a/x-pack/plugins/synthetics/tsconfig.json b/x-pack/plugins/synthetics/tsconfig.json
index 85727394263a6..12bc371fef915 100644
--- a/x-pack/plugins/synthetics/tsconfig.json
+++ b/x-pack/plugins/synthetics/tsconfig.json
@@ -76,6 +76,7 @@
"@kbn/std",
"@kbn/core-saved-objects-server-mocks",
"@kbn/shared-ux-page-kibana-template",
+ "@kbn/observability-ai-assistant-plugin",
],
"exclude": [
"target/**/*",
diff --git a/x-pack/plugins/uptime/kibana.jsonc b/x-pack/plugins/uptime/kibana.jsonc
index 9d082f5f1a70b..df0b2e13839cf 100644
--- a/x-pack/plugins/uptime/kibana.jsonc
+++ b/x-pack/plugins/uptime/kibana.jsonc
@@ -24,6 +24,7 @@
"licensing",
"observability",
"observabilityShared",
+ "observabilityAIAssistant",
"ruleRegistry",
"security",
"share",
diff --git a/x-pack/plugins/uptime/public/legacy_uptime/app/uptime_app.tsx b/x-pack/plugins/uptime/public/legacy_uptime/app/uptime_app.tsx
index c967c732ec8d4..fb45099888592 100644
--- a/x-pack/plugins/uptime/public/legacy_uptime/app/uptime_app.tsx
+++ b/x-pack/plugins/uptime/public/legacy_uptime/app/uptime_app.tsx
@@ -18,6 +18,7 @@ import {
} from '@kbn/kibana-react-plugin/public';
import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common';
import { InspectorContextProvider } from '@kbn/observability-shared-plugin/public';
+import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public';
import { ClientPluginsSetup, ClientPluginsStart } from '../../plugin';
import { UMUpdateBadge } from '../lib/lib';
import {
@@ -129,32 +130,34 @@ const Application = (props: UptimeAppProps) => {
cases: startPlugins.cases,
}}
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/common/header/action_menu_content.tsx b/x-pack/plugins/uptime/public/legacy_uptime/components/common/header/action_menu_content.tsx
index 38047aff244b4..d6a37ea9bd4ee 100644
--- a/x-pack/plugins/uptime/public/legacy_uptime/components/common/header/action_menu_content.tsx
+++ b/x-pack/plugins/uptime/public/legacy_uptime/components/common/header/action_menu_content.tsx
@@ -13,6 +13,7 @@ import { useHistory, useRouteMatch } from 'react-router-dom';
import { useSelector } from 'react-redux';
import { createExploratoryViewUrl } from '@kbn/exploratory-view-plugin/public';
import { useKibana } from '@kbn/kibana-react-plugin/public';
+import { ObservabilityAIAssistantActionMenuItem } from '@kbn/observability-ai-assistant-plugin/public';
import { stringifyUrlParams } from '../../../lib/helper/url_params/stringify_url_params';
import { useUptimeSettingsContext } from '../../../contexts/uptime_settings_context';
import { useGetUrlParams } from '../../../hooks';
@@ -116,6 +117,7 @@ export function ActionMenuContent(): React.ReactElement {
{ADD_DATA_LABEL}
+
);
}
diff --git a/x-pack/plugins/uptime/public/plugin.ts b/x-pack/plugins/uptime/public/plugin.ts
index 0b4942e4020d7..7a13252327a90 100644
--- a/x-pack/plugins/uptime/public/plugin.ts
+++ b/x-pack/plugins/uptime/public/plugin.ts
@@ -51,6 +51,10 @@ import type {
ObservabilitySharedPluginStart,
} from '@kbn/observability-shared-plugin/public';
import { AppStatus, AppUpdater } from '@kbn/core-application-browser';
+import {
+ ObservabilityAIAssistantPluginStart,
+ ObservabilityAIAssistantPluginSetup,
+} from '@kbn/observability-ai-assistant-plugin/public';
import { PLUGIN } from '../common/constants/plugin';
import {
LazySyntheticsPolicyCreateExtension,
@@ -69,6 +73,7 @@ export interface ClientPluginsSetup {
exploratoryView: ExploratoryViewPublicSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginSetup;
share: SharePluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
cloud?: CloudSetup;
@@ -84,6 +89,7 @@ export interface ClientPluginsStart {
exploratoryView: ExploratoryViewPublicStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginStart;
share: SharePluginStart;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
cases: CasesUiStart;
diff --git a/x-pack/plugins/uptime/tsconfig.json b/x-pack/plugins/uptime/tsconfig.json
index 0bc244a45de0e..ddfe50db65940 100644
--- a/x-pack/plugins/uptime/tsconfig.json
+++ b/x-pack/plugins/uptime/tsconfig.json
@@ -72,6 +72,7 @@
"@kbn/core-http-router-server-internal",
"@kbn/actions-plugin",
"@kbn/core-saved-objects-server",
+ "@kbn/observability-ai-assistant-plugin",
],
"exclude": [
"target/**/*",
diff --git a/x-pack/plugins/ux/kibana.jsonc b/x-pack/plugins/ux/kibana.jsonc
index 341d9d8fcc1f8..26a2ab78a926a 100644
--- a/x-pack/plugins/ux/kibana.jsonc
+++ b/x-pack/plugins/ux/kibana.jsonc
@@ -15,6 +15,7 @@
"licensing",
"triggersActionsUi",
"observabilityShared",
+ "observabilityAIAssistant",
"embeddable",
"infra",
"inspector",
diff --git a/x-pack/plugins/ux/public/application/ux_app.tsx b/x-pack/plugins/ux/public/application/ux_app.tsx
index 85af82597863a..aa1ae124d0279 100644
--- a/x-pack/plugins/ux/public/application/ux_app.tsx
+++ b/x-pack/plugins/ux/public/application/ux_app.tsx
@@ -32,6 +32,7 @@ import {
InspectorContextProvider,
useBreadcrumbs,
} from '@kbn/observability-shared-plugin/public';
+import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public';
import { CsmSharedContextProvider } from '../components/app/rum_dashboard/csm_shared_context';
import {
DASHBOARD_LABEL,
@@ -111,6 +112,7 @@ export function UXAppRoot({
maps,
observability,
observabilityShared,
+ observabilityAIAssistant,
exploratoryView,
data,
dataViews,
@@ -147,40 +149,42 @@ export function UXAppRoot({
lens,
}}
>
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
diff --git a/x-pack/plugins/ux/public/components/app/rum_dashboard/action_menu/index.tsx b/x-pack/plugins/ux/public/components/app/rum_dashboard/action_menu/index.tsx
index 4a18759a0aebe..88709a068fea8 100644
--- a/x-pack/plugins/ux/public/components/app/rum_dashboard/action_menu/index.tsx
+++ b/x-pack/plugins/ux/public/components/app/rum_dashboard/action_menu/index.tsx
@@ -14,6 +14,7 @@ import {
createExploratoryViewUrl,
} from '@kbn/exploratory-view-plugin/public';
import { AppMountParameters } from '@kbn/core/public';
+import { ObservabilityAIAssistantActionMenuItem } from '@kbn/observability-ai-assistant-plugin/public';
import { useLegacyUrlParams } from '../../../../context/url_params_context/use_url_params';
import { SERVICE_NAME } from '../../../../../common/elasticsearch_fieldnames';
import { UxInspectorHeaderLink } from './inpector_link';
@@ -85,6 +86,7 @@ export function UXActionMenu({
})}
+
);
diff --git a/x-pack/plugins/ux/public/plugin.ts b/x-pack/plugins/ux/public/plugin.ts
index a578b6aca0b79..9cb846238aa47 100644
--- a/x-pack/plugins/ux/public/plugin.ts
+++ b/x-pack/plugins/ux/public/plugin.ts
@@ -42,6 +42,10 @@ import {
ObservabilitySharedPluginSetup,
ObservabilitySharedPluginStart,
} from '@kbn/observability-shared-plugin/public';
+import {
+ ObservabilityAIAssistantPluginStart,
+ ObservabilityAIAssistantPluginSetup,
+} from '@kbn/observability-ai-assistant-plugin/public';
export type UxPluginSetup = void;
export type UxPluginStart = void;
@@ -54,6 +58,7 @@ export interface ApmPluginSetupDeps {
licensing: LicensingPluginSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginSetup;
}
export interface ApmPluginStartDeps {
@@ -65,6 +70,7 @@ export interface ApmPluginStartDeps {
inspector: InspectorPluginStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
+ observabilityAIAssistant: ObservabilityAIAssistantPluginStart;
exploratoryView: ExploratoryViewPublicStart;
dataViews: DataViewsPublicPluginStart;
lens: LensPublicStart;
diff --git a/x-pack/plugins/ux/tsconfig.json b/x-pack/plugins/ux/tsconfig.json
index e91b3b24198f6..0b2adfd3e66b7 100644
--- a/x-pack/plugins/ux/tsconfig.json
+++ b/x-pack/plugins/ux/tsconfig.json
@@ -39,6 +39,7 @@
"@kbn/exploratory-view-plugin",
"@kbn/observability-shared-plugin",
"@kbn/shared-ux-router",
+ "@kbn/observability-ai-assistant-plugin",
],
"exclude": [
"target/**/*",