diff --git a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts index eec2762e3fd81..2886aa1babcef 100644 --- a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts +++ b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts @@ -29,6 +29,6 @@ export const connectorTypes: string[] = [ '.bedrock', '.d3security', '.sentinelone', - '.observability-ai-assistant', '.cases', + '.observability-ai-assistant', ]; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc index 1968c772eccfb..39af4d91bc87b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc @@ -14,9 +14,6 @@ "security", "taskManager", "dataViews", - "triggersActionsUi", - "ruleRegistry", - "alerting" ], "requiredBundles": ["kibanaReact", "kibanaUtils"], "optionalPlugins": ["cloud", "serverless"], diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts index 91f1c640141f9..d42c96715523e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts @@ -31,6 +31,7 @@ export type { export { AssistantAvatar } from './components/assistant_avatar'; export { ConnectorSelectorBase } from './components/connector_selector/connector_selector_base'; export { useAbortableAsync, type AbortableAsyncState } from './hooks/use_abortable_async'; +export { useGenAIConnectorsWithoutContext } from './hooks/use_genai_connectors'; export { createStorybookChatService, createStorybookService } from './storybook_mock'; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx index ccd67edc58dd6..2b9ab400a08f8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx @@ -29,7 +29,6 @@ import type { ObservabilityAIAssistantPublicStart, ObservabilityAIAssistantService, } from './types'; -import { getObsAIAssistantConnectorType } from './rule_connector'; export class ObservabilityAIAssistantPlugin implements @@ -88,10 +87,6 @@ export class ObservabilityAIAssistantPlugin const isEnabled = service.isEnabled(); - pluginsStart.triggersActionsUi.actionTypeRegistry.register( - getObsAIAssistantConnectorType(service) - ); - return { service, useGenAIConnectors: () => useGenAIConnectorsWithoutContext(service), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts index 77075da8d3195..4e3a0b8ecabd7 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts @@ -8,7 +8,6 @@ import { CoreSetup, DEFAULT_APP_CATEGORIES, - KibanaRequest, Logger, Plugin, PluginInitializerContext, @@ -24,10 +23,7 @@ import { firstValueFrom } from 'rxjs'; import { OBSERVABILITY_AI_ASSISTANT_FEATURE_ID } from '../common/feature'; import type { ObservabilityAIAssistantConfig } from './config'; import { registerServerRoutes } from './routes/register_routes'; -import { - ObservabilityAIAssistantRequestHandlerContext, - ObservabilityAIAssistantRouteHandlerResources, -} from './routes/types'; +import { ObservabilityAIAssistantRouteHandlerResources } from './routes/types'; import { ObservabilityAIAssistantService } from './service'; import { ObservabilityAIAssistantServerSetup, @@ -38,10 +34,6 @@ import { import { addLensDocsToKb } from './service/knowledge_base_service/kb_docs/lens'; import { registerFunctions } from './functions'; import { recallRankingEvent } from './analytics/recall_ranking'; -import { - getObsAIAssistantConnectorType, - getObsAIAssistantConnectorAdapter, -} from './rule_connector'; export class ObservabilityAIAssistantPlugin implements @@ -162,55 +154,6 @@ export class ObservabilityAIAssistantPlugin addLensDocsToKb({ service, logger: this.logger.get('kb').get('lens') }); - const initResources = async ( - request: KibanaRequest - ): Promise => { - const [coreStart, pluginsStart] = await core.getStartServices(); - const license = await firstValueFrom(pluginsStart.licensing.license$); - const savedObjectsClient = coreStart.savedObjects.getScopedClient(request); - - const context: ObservabilityAIAssistantRequestHandlerContext = { - rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => { - return { - getAlertsClient() { - return startContract.getRacClientWithRequest(request); - }, - }; - }), - alerting: routeHandlerPlugins.alerting.start().then((startContract) => { - return { - getRulesClient() { - return startContract.getRulesClientWithRequest(request); - }, - }; - }), - core: Promise.resolve({ - coreStart, - elasticsearch: { - client: coreStart.elasticsearch.client.asScoped(request), - }, - uiSettings: { - client: coreStart.uiSettings.asScopedToClient(savedObjectsClient), - }, - savedObjects: { - client: savedObjectsClient, - }, - }), - licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }), - }; - - return { - request, - service, - context, - logger: this.logger.get('connector'), - plugins: routeHandlerPlugins, - }; - }; - - plugins.actions.registerType(getObsAIAssistantConnectorType(initResources)); - plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter()); - registerServerRoutes({ core, logger: this.logger, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json index b6502b6ef5517..eee8ea0d56911 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json @@ -48,7 +48,6 @@ "@kbn/cloud-plugin", "@kbn/serverless", "@kbn/triggers-actions-ui-plugin", - "@kbn/stack-connectors-plugin", ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts new file mode 100644 index 0000000000000..84c7b1f3e8d64 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts @@ -0,0 +1,8 @@ +/* + * 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 const OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID = '.observability-ai-assistant'; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc index f4aac7df8a389..b64d31e3f13b9 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc @@ -21,7 +21,9 @@ "share", "security", "licensing", - "ml" + "ml", + "alerting", + "features" ], "requiredBundles": ["kibanaReact"], "optionalPlugins": ["cloud"], diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx index 1e226aa99c8a8..6e188043a6a31 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx @@ -26,6 +26,7 @@ import type { import { createAppService, ObservabilityAIAssistantAppService } from './service/create_app_service'; import { SharedProviders } from './utils/shared_providers'; import { LazyNavControl } from './components/nav_control/lazy_nav_control'; +import { getObsAIAssistantConnectorType } from './rule_connector'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ConfigSchema {} @@ -124,12 +125,17 @@ export class ObservabilityAIAssistantAppPlugin order: 1001, }); - pluginsStart.observabilityAIAssistant.service.register(async ({ registerRenderFunction }) => { + const service = pluginsStart.observabilityAIAssistant.service; + + service.register(async ({ registerRenderFunction }) => { const { registerFunctions } = await import('./functions'); await registerFunctions({ pluginsStart, registerRenderFunction }); }); + pluginsStart.triggersActionsUi.actionTypeRegistry.register( + getObsAIAssistantConnectorType(service) + ); return {}; } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx similarity index 93% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx index beadd590ce2f5..bd024e9231ac0 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx @@ -10,10 +10,12 @@ import type { ActionTypeModel as ConnectorTypeModel, GenericValidationResult, } from '@kbn/triggers-actions-ui-plugin/public/types'; -import { ObsAIAssistantActionParams } from './types'; -import { ObservabilityAIAssistantService } from '../types'; -import { AssistantAvatar } from '../components/assistant_avatar'; +import { + AssistantAvatar, + ObservabilityAIAssistantService, +} from '@kbn/observability-ai-assistant-plugin/public'; import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector'; +import { ObsAIAssistantActionParams } from './types'; import { CONNECTOR_DESC, CONNECTOR_REQUIRED, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx similarity index 94% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx index 95793f95a437d..4e3683625e819 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx @@ -9,9 +9,11 @@ import React, { useEffect } from 'react'; import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiFlexItem, EuiSelect, EuiSpacer, EuiTextArea } from '@elastic/eui'; +import { + ObservabilityAIAssistantService, + useGenAIConnectorsWithoutContext, +} from '@kbn/observability-ai-assistant-plugin/public'; import { ObsAIAssistantActionParams } from './types'; -import { ObservabilityAIAssistantService } from '../types'; -import { useGenAIConnectorsWithoutContext } from '../hooks/use_genai_connectors'; const ObsAIAssistantParamsFields: React.FunctionComponent< ActionParamsProps & { service: ObservabilityAIAssistantService } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/index.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/translations.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/translations.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/types.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts index 097c50bad0bd9..903c3c0c26826 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts @@ -11,9 +11,21 @@ import { Plugin, type PluginInitializerContext, type CoreStart, + KibanaRequest, } from '@kbn/core/server'; +import { + ObservabilityAIAssistantRequestHandlerContext, + ObservabilityAIAssistantRouteHandlerResources, +} from '@kbn/observability-ai-assistant-plugin/server/routes/types'; +import { ObservabilityAIAssistantPluginStartDependencies } from '@kbn/observability-ai-assistant-plugin/server/types'; +import { mapValues } from 'lodash'; +import { firstValueFrom } from 'rxjs'; import type { ObservabilityAIAssistantAppConfig } from './config'; import { registerFunctions } from './functions'; +import { + getObsAIAssistantConnectorAdapter, + getObsAIAssistantConnectorType, +} from './rule_connector'; import type { ObservabilityAIAssistantAppPluginSetupDependencies, ObservabilityAIAssistantAppPluginStartDependencies, @@ -42,6 +54,68 @@ export class ObservabilityAIAssistantAppPlugin >, plugins: ObservabilityAIAssistantAppPluginSetupDependencies ): ObservabilityAIAssistantAppServerSetup { + const routeHandlerPlugins = mapValues(plugins, (value, key) => { + return { + setup: value, + start: () => + core.getStartServices().then((services) => { + const [, pluginsStartContracts] = services; + return pluginsStartContracts[ + key as keyof ObservabilityAIAssistantPluginStartDependencies + ]; + }), + }; + }) as ObservabilityAIAssistantRouteHandlerResources['plugins']; + + const initResources = async ( + request: KibanaRequest + ): Promise => { + const [coreStart, pluginsStart] = await core.getStartServices(); + const license = await firstValueFrom(pluginsStart.licensing.license$); + const savedObjectsClient = coreStart.savedObjects.getScopedClient(request); + + const context: ObservabilityAIAssistantRequestHandlerContext = { + rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => { + return { + getAlertsClient() { + return startContract.getRacClientWithRequest(request); + }, + }; + }), + alerting: routeHandlerPlugins.alerting.start().then((startContract) => { + return { + getRulesClient() { + return startContract.getRulesClientWithRequest(request); + }, + }; + }), + core: Promise.resolve({ + coreStart, + elasticsearch: { + client: coreStart.elasticsearch.client.asScoped(request), + }, + uiSettings: { + client: coreStart.uiSettings.asScopedToClient(savedObjectsClient), + }, + savedObjects: { + client: savedObjectsClient, + }, + }), + licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }), + }; + + return { + request, + context, + service: plugins.observabilityAIAssistant.service, + logger: this.logger.get('connector'), + plugins: routeHandlerPlugins, + }; + }; + + plugins.actions.registerType(getObsAIAssistantConnectorType(initResources)); + plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter()); + return {}; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts similarity index 93% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts index 44b3c80a9a33f..89a49e6081b5d 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts @@ -8,7 +8,7 @@ import joiToJsonSchema from 'joi-to-json'; import type { Type } from '@kbn/config-schema'; import { castArray, isPlainObject, forEach, unset } from 'lodash'; -import type { CompatibleJSONSchema } from '../../common/functions/types'; +import type { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types'; function dropUnknownProperties(object: CompatibleJSONSchema) { if (!isPlainObject(object)) { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts new file mode 100644 index 0000000000000..7990f353062da --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts @@ -0,0 +1,168 @@ +/* + * 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 { AlertHit } from '@kbn/alerting-plugin/server/types'; +import { ObservabilityAIAssistantRouteHandlerResources } from '@kbn/observability-ai-assistant-plugin/server/routes/types'; +import { getFakeKibanaRequest } from '@kbn/security-plugin/server/authentication/api_keys/fake_kibana_request'; +import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector'; +import { + getObsAIAssistantConnectorAdapter, + getObsAIAssistantConnectorType, + ObsAIAssistantConnectorTypeExecutorOptions, +} from '.'; +import { Observable } from 'rxjs'; +import { MessageRole } from '@kbn/observability-ai-assistant-plugin/public'; + +describe('observabilityAIAssistant rule_connector', () => { + describe('getObsAIAssistantConnectorAdapter', () => { + it('uses correct connector_id', () => { + const adapter = getObsAIAssistantConnectorAdapter(); + expect(adapter.connectorTypeId).toEqual(OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID); + }); + + it('builds action params', () => { + const adapter = getObsAIAssistantConnectorAdapter(); + const params = adapter.buildActionParams({ + params: { connector: '.azure', message: 'hello' }, + rule: { id: 'foo', name: 'bar', tags: [], consumer: '', producer: '' }, + ruleUrl: 'http://myrule.com', + spaceId: 'default', + alerts: { + all: { count: 1, data: [] }, + new: { count: 1, data: [{ _id: 'new_alert' } as AlertHit] }, + ongoing: { count: 1, data: [] }, + recovered: { count: 1, data: [{ _id: 'recovered_alert' } as AlertHit] }, + }, + }); + + expect(params).toEqual({ + connector: '.azure', + message: 'hello', + rule: { id: 'foo', name: 'bar', tags: [], ruleUrl: 'http://myrule.com' }, + alerts: { + new: [{ _id: 'new_alert' }], + recovered: [{ _id: 'recovered_alert' }], + }, + }); + }); + }); + + describe('getObsAIAssistantConnectorType', () => { + it('is correctly configured', () => { + const initResources = jest + .fn() + .mockResolvedValue({} as ObservabilityAIAssistantRouteHandlerResources); + const connectorType = getObsAIAssistantConnectorType(initResources); + expect(connectorType.id).toEqual(OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID); + expect(connectorType.isSystemActionType).toEqual(true); + expect(connectorType.minimumLicenseRequired).toEqual('enterprise'); + }); + + it('does not execute when no new or recovered alerts', async () => { + const initResources = jest + .fn() + .mockResolvedValue({} as ObservabilityAIAssistantRouteHandlerResources); + const connectorType = getObsAIAssistantConnectorType(initResources); + const result = await connectorType.executor({ + actionId: 'observability-ai-assistant', + request: getFakeKibanaRequest({ id: 'foo', api_key: 'bar' }), + params: { alerts: { new: [], recovered: [] } }, + } as unknown as ObsAIAssistantConnectorTypeExecutorOptions); + expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' }); + expect(initResources).not.toHaveBeenCalled(); + }); + + it('calls complete api', async () => { + const completeMock = jest.fn().mockReturnValue(new Observable()); + const initResources = jest.fn().mockResolvedValue({ + service: { + getClient: async () => ({ complete: completeMock }), + getFunctionClient: async () => ({ + getContexts: () => [{ name: 'core', description: 'my_system_message' }], + }), + }, + context: { + core: Promise.resolve({ + coreStart: { http: { basePath: { publicBaseUrl: 'http://kibana.com' } } }, + }), + }, + plugins: { + actions: { + start: async () => { + return { + getActionsClientWithRequest: jest.fn().mockResolvedValue({ + async getAll() { + return [{ id: 'connector_1' }]; + }, + }), + }; + }, + }, + }, + } as unknown as ObservabilityAIAssistantRouteHandlerResources); + + const connectorType = getObsAIAssistantConnectorType(initResources); + const result = await connectorType.executor({ + actionId: 'observability-ai-assistant', + request: getFakeKibanaRequest({ id: 'foo', api_key: 'bar' }), + params: { + message: 'hello', + connector: 'azure-open-ai', + alerts: { new: [{ _id: 'new_alert' }], recovered: [] }, + }, + } as unknown as ObsAIAssistantConnectorTypeExecutorOptions); + + expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' }); + expect(initResources).toHaveBeenCalledTimes(1); + expect(completeMock).toHaveBeenCalledTimes(1); + expect(completeMock).toHaveBeenCalledWith( + expect.objectContaining({ + persist: true, + isPublic: true, + connectorId: 'azure-open-ai', + kibanaPublicUrl: 'http://kibana.com', + messages: [ + { + '@timestamp': expect.any(String), + message: { + role: MessageRole.System, + content: 'my_system_message', + }, + }, + { + '@timestamp': expect.any(String), + message: { + role: MessageRole.User, + content: 'hello', + }, + }, + { + '@timestamp': expect.any(String), + message: { + role: MessageRole.Assistant, + content: '', + function_call: { + name: 'get_connectors', + arguments: JSON.stringify({}), + trigger: MessageRole.Assistant as const, + }, + }, + }, + { + '@timestamp': expect.any(String), + message: { + role: MessageRole.User, + name: 'get_connectors', + content: JSON.stringify({ connectors: [{ id: 'connector_1' }] }), + }, + }, + ], + }) + ); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts similarity index 95% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts index ee3eac655fa84..567c326945ef8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts @@ -24,16 +24,16 @@ import { SlackParamsSchema, WebhookParamsSchema, } from '@kbn/stack-connectors-plugin/server'; -import { ObservabilityAIAssistantRouteHandlerResources } from '../routes/types'; +import { ObservabilityAIAssistantRouteHandlerResources } from '@kbn/observability-ai-assistant-plugin/server/routes/types'; import { ChatCompletionChunkEvent, MessageRole, StreamingChatResponseEventType, -} from '../../common'; -import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector'; -import { concatenateChatCompletionChunks } from '../../common/utils/concatenate_chat_completion_chunks'; +} from '@kbn/observability-ai-assistant-plugin/common'; +import { concatenateChatCompletionChunks } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks'; +import { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types'; import { convertSchemaToOpenApi } from './convert_schema_to_open_api'; -import { CompatibleJSONSchema } from '../../common/functions/types'; +import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector'; const CONNECTOR_PRIVILEGES = ['api:observabilityAIAssistant', 'app:observabilityAIAssistant']; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts index 996279329ab90..902774bacd800 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts @@ -5,6 +5,23 @@ * 2.0. */ +import type { + PluginSetupContract as ActionsPluginSetup, + PluginStartContract as ActionsPluginStart, +} from '@kbn/actions-plugin/server'; +import type { + PluginSetupContract as AlertingPluginSetup, + PluginStartContract as AlertingPluginStart, +} from '@kbn/alerting-plugin/server'; +import type { + DataViewsServerPluginSetup, + DataViewsServerPluginStart, +} from '@kbn/data-views-plugin/server'; +import type { + PluginStartContract as FeaturesPluginStart, + PluginSetupContract as FeaturesPluginSetup, +} from '@kbn/features-plugin/server'; +import type { LicensingPluginSetup, LicensingPluginStart } from '@kbn/licensing-plugin/server'; import type { ObservabilityAIAssistantServerSetup, ObservabilityAIAssistantServerStart, @@ -13,6 +30,13 @@ import type { RuleRegistryPluginSetupContract, RuleRegistryPluginStartContract, } from '@kbn/rule-registry-plugin/server'; +import type { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/server'; +import type { + TaskManagerSetupContract, + TaskManagerStartContract, +} from '@kbn/task-manager-plugin/server'; +import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/server'; +import type { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ObservabilityAIAssistantAppServerStart {} @@ -22,9 +46,27 @@ export interface ObservabilityAIAssistantAppServerSetup {} export interface ObservabilityAIAssistantAppPluginStartDependencies { observabilityAIAssistant: ObservabilityAIAssistantServerStart; ruleRegistry: RuleRegistryPluginStartContract; + alerting: AlertingPluginStart; + licensing: LicensingPluginStart; + actions: ActionsPluginStart; + security: SecurityPluginStart; + features: FeaturesPluginStart; + taskManager: TaskManagerStartContract; + dataViews: DataViewsServerPluginStart; + cloud?: CloudStart; + serverless?: ServerlessPluginStart; } export interface ObservabilityAIAssistantAppPluginSetupDependencies { observabilityAIAssistant: ObservabilityAIAssistantServerSetup; ruleRegistry: RuleRegistryPluginSetupContract; + alerting: AlertingPluginSetup; + licensing: LicensingPluginSetup; + actions: ActionsPluginSetup; + security: SecurityPluginSetup; + features: FeaturesPluginSetup; + taskManager: TaskManagerSetupContract; + dataViews: DataViewsServerPluginSetup; + cloud?: CloudSetup; + serverless?: ServerlessPluginSetup; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json index e35d24bc573ed..8c7224647ce24 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json @@ -55,7 +55,13 @@ "@kbn/ai-assistant-management-plugin", "@kbn/deeplinks-observability", "@kbn/management-settings-ids", - "@kbn/apm-utils" + "@kbn/apm-utils", + "@kbn/alerting-plugin", + "@kbn/stack-connectors-plugin", + "@kbn/features-plugin", + "@kbn/serverless", + "@kbn/task-manager-plugin", + "@kbn/cloud-plugin" ], "exclude": ["target/**/*"] }