+ {i18n.translate('xpack.observabilityAiAssistant.chatService.div.helloLabel', {
+ defaultMessage: 'Hello',
+ })}
+ {name}
+
+ ),
+ hasFunction: () => true,
+ hasRenderFunction: () => true,
+};
+
+export const mockService: ObservabilityAIAssistantService = {
+ isEnabled: () => true,
+ start: async () => {
+ return mockChatService;
+ },
+ callApi: {} as ObservabilityAIAssistantAPIClient,
+ getCurrentUser: async (): Promise => ({
+ username: 'user',
+ roles: [],
+ enabled: true,
+ authentication_realm: { name: 'foo', type: '' },
+ lookup_realm: { name: 'foo', type: '' },
+ authentication_provider: { name: '', type: '' },
+ authentication_type: '',
+ elastic_cloud_user: false,
+ }),
+ getLicense: () => new Observable(),
+ getLicenseManagementLocator: () =>
+ ({
+ url: {},
+ navigate: () => {},
+ } as unknown as SharePluginStart),
+ register: () => {},
+};
+
+function createSetupContract(): ObservabilityAIAssistantPluginSetup {
+ return {};
+}
+
+function createStartContract(): ObservabilityAIAssistantPluginStart {
+ return {
+ service: mockService,
+
+ ObservabilityAIAssistantActionMenuItem: (() => (
+ // eslint-disable-next-line @kbn/i18n/strings_should_be_translated_with_i18n
+ Im a button
+ )) as unknown as ObservabilityAIAssistantPluginStart['ObservabilityAIAssistantActionMenuItem'],
+ ObservabilityAIAssistantContextualInsight: (
+ // eslint-disable-next-line @kbn/i18n/strings_should_be_translated_with_i18n
+ I give insight
+ ) as unknown as ObservabilityAIAssistantPluginStart['ObservabilityAIAssistantContextualInsight'],
+ useGenAIConnectors: () => ({
+ loading: false,
+ selectConnector: () => {},
+ reloadConnectors: () => {},
+ }),
+ };
+}
+
+export const observabilityAIAssistantPluginMock = {
+ createSetupContract,
+ createStartContract,
+};
diff --git a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
index 64a1f4ae8d2fa..5ee13a1c5b6e8 100644
--- a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx
@@ -4,7 +4,7 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import React from 'react';
+import React, { ComponentType, lazy, Ref } from 'react';
import ReactDOM from 'react-dom';
import {
AppNavLinkStatus,
@@ -17,6 +17,8 @@ import {
} from '@kbn/core/public';
import { i18n } from '@kbn/i18n';
import type { Logger } from '@kbn/logging';
+import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
+import { withSuspense } from '@kbn/shared-ux-utility';
import { createService } from './service/create_service';
import { useGenAIConnectorsWithoutContext } from './hooks/use_genai_connectors';
import type {
@@ -28,6 +30,7 @@ import type {
ObservabilityAIAssistantService,
} from './types';
import { registerTelemetryEventTypes } from './analytics';
+import { ObservabilityAIAssistantProvider } from './context/observability_ai_assistant_provider';
export class ObservabilityAIAssistantPlugin
implements
@@ -117,9 +120,54 @@ export class ObservabilityAIAssistantPlugin
});
});
+ const withProviders = (
+ Component: ComponentType
,
+ services: Omit & {
+ plugins: { start: ObservabilityAIAssistantPluginStartDependencies };
+ }
+ ) =>
+ React.forwardRef((props: P, ref: Ref) => (
+
+
+
+
+
+ ));
+
+ const services = {
+ ...coreStart,
+ plugins: {
+ start: pluginsStart,
+ },
+ };
+
+ const isEnabled = service.isEnabled();
+
return {
service,
useGenAIConnectors: () => useGenAIConnectorsWithoutContext(service),
+ ObservabilityAIAssistantContextualInsight: isEnabled
+ ? withSuspense(
+ withProviders(
+ lazy(() =>
+ import('./components/insight/insight').then((m) => ({ default: m.Insight }))
+ ),
+ services
+ )
+ )
+ : null,
+ ObservabilityAIAssistantActionMenuItem: isEnabled
+ ? withSuspense(
+ withProviders(
+ lazy(() =>
+ import('./components/action_menu_item/action_menu_item').then((m) => ({
+ default: m.ObservabilityAIAssistantActionMenuItem,
+ }))
+ ),
+ services
+ )
+ )
+ : null,
};
}
}
diff --git a/x-pack/plugins/observability_ai_assistant/public/types.ts b/x-pack/plugins/observability_ai_assistant/public/types.ts
index a664638365eaf..3c53243ffd48f 100644
--- a/x-pack/plugins/observability_ai_assistant/public/types.ts
+++ b/x-pack/plugins/observability_ai_assistant/public/types.ts
@@ -28,6 +28,8 @@ import type {
} from '@kbn/data-views-plugin/public';
import type { LicensingPluginStart, ILicense } from '@kbn/licensing-plugin/public';
import type { SharePluginStart } from '@kbn/share-plugin/public';
+import { ForwardRefExoticComponent, RefAttributes } from 'react';
+import { WithSuspenseExtendedDeps } from '@kbn/shared-ux-utility';
import type {
ContextDefinition,
FunctionDefinition,
@@ -38,6 +40,7 @@ import type { ObservabilityAIAssistantAPIClient } from './api';
import type { PendingMessage } from '../common/types';
import type { StreamingChatResponseEvent } from '../common/conversation_complete';
import type { UseGenAIConnectorsResult } from './hooks/use_genai_connectors';
+import type { InsightProps } from './components/insight/insight';
/* eslint-disable @typescript-eslint/no-empty-interface*/
@@ -92,12 +95,10 @@ export type ChatRegistrationRenderFunction = ({}: {
registerRenderFunction: RegisterRenderFunctionDefinition;
}) => Promise;
-export interface ObservabilityAIAssistantPluginStart {
- service: ObservabilityAIAssistantService;
- useGenAIConnectors: () => UseGenAIConnectorsResult;
-}
+export interface ConfigSchema {}
+
+export type { PendingMessage };
-export interface ObservabilityAIAssistantPluginSetup {}
export interface ObservabilityAIAssistantPluginSetupDependencies {
dataViews: DataViewsPublicPluginSetup;
features: FeaturesPluginSetup;
@@ -106,6 +107,7 @@ export interface ObservabilityAIAssistantPluginSetupDependencies {
security: SecurityPluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
}
+
export interface ObservabilityAIAssistantPluginStartDependencies {
dataViews: DataViewsPublicPluginStart;
features: FeaturesPluginStart;
@@ -117,6 +119,14 @@ export interface ObservabilityAIAssistantPluginStartDependencies {
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
}
-export interface ConfigSchema {}
+export interface ObservabilityAIAssistantPluginSetup {}
-export type { PendingMessage };
+export interface ObservabilityAIAssistantPluginStart {
+ service: ObservabilityAIAssistantService;
+ ObservabilityAIAssistantContextualInsight: React.ForwardRefExoticComponent | null;
+ ObservabilityAIAssistantActionMenuItem: ForwardRefExoticComponent<
+ Pick & WithSuspenseExtendedDeps, 'css' | 'key' | 'analytics'> &
+ RefAttributes<{}>
+ > | null;
+ useGenAIConnectors: () => UseGenAIConnectorsResult;
+}
diff --git a/x-pack/plugins/observability_ai_assistant/public/utils/storybook_decorator.tsx b/x-pack/plugins/observability_ai_assistant/public/utils/storybook_decorator.tsx
index 04a30ce53059d..0914bedbf82f2 100644
--- a/x-pack/plugins/observability_ai_assistant/public/utils/storybook_decorator.tsx
+++ b/x-pack/plugins/observability_ai_assistant/public/utils/storybook_decorator.tsx
@@ -4,69 +4,12 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import { i18n } from '@kbn/i18n';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
-import type { AuthenticatedUser } from '@kbn/security-plugin/common';
-import type { SharePluginStart } from '@kbn/share-plugin/public';
import React, { ComponentType } from 'react';
-import { Observable } from 'rxjs';
-import type { StreamingChatResponseEvent } from '../../common/conversation_complete';
-import { ObservabilityAIAssistantAPIClient } from '../api';
import { ObservabilityAIAssistantChatServiceProvider } from '../context/observability_ai_assistant_chat_service_provider';
import { ObservabilityAIAssistantProvider } from '../context/observability_ai_assistant_provider';
-import type {
- ObservabilityAIAssistantChatService,
- ObservabilityAIAssistantService,
- PendingMessage,
-} from '../types';
-import { buildFunctionElasticsearch, buildFunctionServiceSummary } from './builders';
-
-const chatService: ObservabilityAIAssistantChatService = {
- analytics: {
- optIn: () => {},
- reportEvent: () => {},
- telemetryCounter$: new Observable(),
- },
- chat: (options) => new Observable(),
- complete: (options) => new Observable(),
- getContexts: () => [],
- getFunctions: () => [buildFunctionElasticsearch(), buildFunctionServiceSummary()],
- renderFunction: (name) => (
-
- {i18n.translate('xpack.observabilityAiAssistant.chatService.div.helloLabel', {
- defaultMessage: 'Hello',
- })}
- {name}
-
- ),
- hasFunction: () => true,
- hasRenderFunction: () => true,
-};
-
-export const mockService: ObservabilityAIAssistantService = {
- isEnabled: () => true,
- start: async () => {
- return chatService;
- },
- callApi: {} as ObservabilityAIAssistantAPIClient,
- getCurrentUser: async (): Promise => ({
- username: 'user',
- roles: [],
- enabled: true,
- authentication_realm: { name: 'foo', type: '' },
- lookup_realm: { name: 'foo', type: '' },
- authentication_provider: { name: '', type: '' },
- authentication_type: '',
- elastic_cloud_user: false,
- }),
- getLicense: () => new Observable(),
- getLicenseManagementLocator: () =>
- ({
- url: {},
- navigate: () => {},
- } as unknown as SharePluginStart),
- register: () => {},
-};
+// eslint-disable-next-line @kbn/imports/no_boundary_crossing
+import { mockChatService, mockService } from '../mock';
export function KibanaReactStorybookDecorator(Story: ComponentType) {
return (
@@ -83,7 +26,7 @@ export function KibanaReactStorybookDecorator(Story: ComponentType) {
}}
>
-
+
diff --git a/x-pack/plugins/observability_ai_assistant/tsconfig.json b/x-pack/plugins/observability_ai_assistant/tsconfig.json
index fdac7a82d4df2..28b5b68b07b34 100644
--- a/x-pack/plugins/observability_ai_assistant/tsconfig.json
+++ b/x-pack/plugins/observability_ai_assistant/tsconfig.json
@@ -53,7 +53,8 @@
"@kbn/tooling-log",
"@kbn/babel-register",
"@kbn/dev-cli-runner",
- "@kbn/core-analytics-browser"
+ "@kbn/core-analytics-browser",
+ "@kbn/security-plugin-types-common"
],
"exclude": ["target/**/*"]
}
diff --git a/x-pack/plugins/profiling/public/app.tsx b/x-pack/plugins/profiling/public/app.tsx
index 2d5dd828c18b0..e91c2eef4ec72 100644
--- a/x-pack/plugins/profiling/public/app.tsx
+++ b/x-pack/plugins/profiling/public/app.tsx
@@ -13,7 +13,6 @@ import { RouteRenderer, RouterProvider } from '@kbn/typed-react-router-config';
import React, { useMemo } from 'react';
import ReactDOM from 'react-dom';
import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public';
-import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public';
import { CheckSetup } from './components/check_setup';
import { ProfilingDependenciesContextProvider } from './components/contexts/profiling_dependencies/profiling_dependencies_context';
import { RouteBreadcrumbsContextProvider } from './components/contexts/route_breadcrumbs_context';
@@ -84,35 +83,33 @@ function App({
-
-
-
-
-
-
-
-
- <>
-
-
-
-
-
-
-
-
- >
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ <>
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/frame_information_ai_assistant.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/frame_information_ai_assistant.tsx
index 9175115432f81..b82d8e2693a18 100644
--- a/x-pack/plugins/profiling/public/components/frame_information_window/frame_information_ai_assistant.tsx
+++ b/x-pack/plugins/profiling/public/components/frame_information_window/frame_information_ai_assistant.tsx
@@ -5,22 +5,20 @@
* 2.0.
*/
-import { i18n } from '@kbn/i18n';
-import {
- ContextualInsight,
- Message,
- MessageRole,
- useObservabilityAIAssistant,
-} from '@kbn/observability-ai-assistant-plugin/public';
import React, { useMemo } from 'react';
+import { i18n } from '@kbn/i18n';
+import { Message, MessageRole } from '@kbn/observability-ai-assistant-plugin/public';
import { Frame } from '.';
+import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies';
interface Props {
frame?: Frame;
}
export function FrameInformationAIAssistant({ frame }: Props) {
- const aiAssistant = useObservabilityAIAssistant();
+ const {
+ observabilityAIAssistant: { ObservabilityAIAssistantContextualInsight },
+ } = useProfilingDependencies().start;
const promptMessages = useMemo(() => {
if (frame?.functionName && frame.exeFileName) {
@@ -91,8 +89,8 @@ export function FrameInformationAIAssistant({ frame }: Props) {
return (
<>
- {aiAssistant.isEnabled() && promptMessages ? (
-
-
+ {ObservabilityAIAssistantActionMenuItem ? : null}
);
}
diff --git a/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx b/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx
index 15e4af7bedb94..52000e4783620 100644
--- a/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx
+++ b/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx
@@ -6,7 +6,6 @@
*/
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
-import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public';
import React, { ReactChild, useMemo } from 'react';
import { CoreSetup, CoreStart } from '@kbn/core/public';
import { Storage } from '@kbn/kibana-utils-plugin/public';
@@ -53,11 +52,7 @@ export function ProfilingEmbeddableProvider({ deps, children }: Props) {
-
- {children}
-
+ {children}
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 a123f4be95382..c9a0118815eca 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,10 +11,9 @@ 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';
+import { useSyntheticsSettingsContext, useSyntheticsStartPlugins } from '../../../contexts';
import { useGetUrlParams } from '../../../hooks';
import { MONITOR_ROUTE, SETTINGS_ROUTE } from '../../../../../../common/constants';
import { stringifyUrlParams } from '../../../utils/url_params';
@@ -32,6 +31,9 @@ const ANALYZE_MESSAGE = i18n.translate('xpack.synthetics.analyzeDataButtonLabel.
export function ActionMenuContent(): React.ReactElement {
const { basePath } = useSyntheticsSettingsContext();
+
+ const { observabilityAIAssistant: { ObservabilityAIAssistantActionMenuItem } = {} } =
+ useSyntheticsStartPlugins();
const params = useGetUrlParams();
const { dateRangeStart, dateRangeEnd } = params;
const history = useHistory();
@@ -104,7 +106,9 @@ export function ActionMenuContent(): React.ReactElement {
-
+ {ObservabilityAIAssistantActionMenuItem && ObservabilityAIAssistantActionMenuItem ? (
+
+ ) : null}
);
}
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 89bffbe6dfd73..3bd3407dcb3c1 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx
@@ -14,7 +14,6 @@ import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-pl
import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app';
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 { SyntheticsDataViewContextProvider } from './contexts/synthetics_data_view_context';
import { SyntheticsAppProps } from './contexts';
@@ -91,6 +90,7 @@ const Application = (props: SyntheticsAppProps) => {
triggersActionsUi: startPlugins.triggersActionsUi,
observability: startPlugins.observability,
observabilityShared: startPlugins.observabilityShared,
+ observabilityAIAssistant: startPlugins.observabilityAIAssistant,
exploratoryView: startPlugins.exploratoryView,
cases: startPlugins.cases,
spaces: startPlugins.spaces,
@@ -98,35 +98,31 @@ const Application = (props: SyntheticsAppProps) => {
}}
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
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 a87180eb0a932..0dd752ab2ff64 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
@@ -15,7 +15,6 @@ import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-pl
import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app';
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 {
@@ -127,37 +126,33 @@ const Application = (props: UptimeAppProps) => {
cases: startPlugins.cases,
}}
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+