diff --git a/src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts b/src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts index 469c8f4576746..ba45811d6c549 100644 --- a/src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts +++ b/src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts @@ -189,6 +189,12 @@ export const SECURITY_SOLUTION_ENABLE_ASSET_INVENTORY_SETTING = 'securitySolution:enableAssetInventory' as const; export const SECURITY_SOLUTION_ENABLE_CLOUD_CONNECTOR_SETTING = 'securitySolution:enableCloudConnector' as const; +export const SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES = + 'securitySolution:defaultValueReportMinutes' as const; +export const SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE = + 'securitySolution:defaultValueReportRate' as const; +export const SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE = + 'securitySolution:defaultValueReportTitle' as const; // Timelion settings export const TIMELION_ES_DEFAULT_INDEX_ID = 'timelion:es.default_index'; export const TIMELION_ES_TIME_FIELD_ID = 'timelion:es.timefield'; diff --git a/src/platform/packages/shared/serverless/settings/security_project/index.ts b/src/platform/packages/shared/serverless/settings/security_project/index.ts index f206d6d58f4f3..12f75bd722218 100644 --- a/src/platform/packages/shared/serverless/settings/security_project/index.ts +++ b/src/platform/packages/shared/serverless/settings/security_project/index.ts @@ -27,6 +27,9 @@ export const SECURITY_PROJECT_SETTINGS = [ settings.SECURITY_SOLUTION_ENABLE_GRAPH_VISUALIZATION_SETTING, settings.SECURITY_SOLUTION_ENABLE_ASSET_INVENTORY_SETTING, settings.SECURITY_SOLUTION_ENABLE_CLOUD_CONNECTOR_SETTING, + settings.SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES, + settings.SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE, + settings.SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE, settings.GEN_AI_SETTINGS_DEFAULT_AI_CONNECTOR, settings.GEN_AI_SETTINGS_DEFAULT_AI_CONNECTOR_DEFAULT_ONLY, ]; diff --git a/x-pack/platform/plugins/private/gen_ai_settings/common/constants.ts b/x-pack/platform/plugins/private/gen_ai_settings/common/constants.ts index d52578fbe6d27..1cfad15d32c6f 100644 --- a/x-pack/platform/plugins/private/gen_ai_settings/common/constants.ts +++ b/x-pack/platform/plugins/private/gen_ai_settings/common/constants.ts @@ -6,6 +6,3 @@ */ export const NO_DEFAULT_CONNECTOR = 'NO_DEFAULT_CONNECTOR'; -export const AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED = - 'aiAssistant.defaultLlmSettingEnabled' as const; -export const AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE = true as const; diff --git a/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.test.tsx b/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.test.tsx index fa3dde041adbc..9c10ac640e846 100644 --- a/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.test.tsx +++ b/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.test.tsx @@ -22,13 +22,10 @@ const mockUseEnabledFeatures = useEnabledFeatures as jest.MockedFunction { const coreStart = coreMock.createStart(); const setBreadcrumbs = jest.fn(); - const featureFlagsGetBooleanValueMock = jest.fn(); beforeEach(() => { jest.clearAllMocks(); - featureFlagsGetBooleanValueMock.mockReturnValue(true); - coreStart.application.capabilities = { ...coreStart.application.capabilities, management: { @@ -38,11 +35,6 @@ describe('GenAiSettingsApp', () => { }, }; - coreStart.featureFlags = { - ...coreStart.featureFlags, - getBooleanValue: featureFlagsGetBooleanValueMock, - }; - // Default mock for enabled features mockUseEnabledFeatures.mockReturnValue({ showSpacesIntegration: true, @@ -115,15 +107,6 @@ describe('GenAiSettingsApp', () => { expect(screen.getByTestId('goToSpacesButton')).toBeInTheDocument(); }); - it('does not render default llm setting when feature is disabled', () => { - featureFlagsGetBooleanValueMock.mockReturnValue(false); - - renderComponent(); - - expect(screen.queryByTestId('defaultAiConnectorComboBox')).not.toBeInTheDocument(); - expect(screen.queryByTestId('defaultAiConnectorCheckbox')).not.toBeInTheDocument(); - }); - it('should conditionally render sections based on settings', () => { mockUseEnabledFeatures.mockReturnValue({ showSpacesIntegration: false, diff --git a/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.tsx b/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.tsx index d505740c24b00..1e8394a1a14ba 100644 --- a/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.tsx +++ b/x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.tsx @@ -18,7 +18,6 @@ import { EuiTitle, EuiLink, useEuiTheme, - EuiButton, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -26,10 +25,6 @@ import type { ManagementAppMountParams } from '@kbn/management-plugin/public'; import { getSpaceIdFromPath } from '@kbn/spaces-utils'; import { isEmpty } from 'lodash'; -import { - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE, -} from '../../common/constants'; import { useEnabledFeatures } from '../contexts/enabled_features_context'; import { useKibana } from '../hooks/use_kibana'; import { GoToSpacesButton } from './go_to_spaces_button'; @@ -46,7 +41,7 @@ interface GenAiSettingsAppProps { export const GenAiSettingsApp: React.FC = ({ setBreadcrumbs }) => { const { services } = useKibana(); - const { application, http, docLinks, featureFlags } = services; + const { application, http, docLinks } = services; const { showSpacesIntegration, isPermissionsBased, @@ -97,11 +92,6 @@ export const GenAiSettingsApp: React.FC = ({ setBreadcrum }); }, [application, http.basePath, isPermissionsBased]); - const showDefaultLlmSetting = featureFlags.getBooleanValue( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE - ); - const connectorDescription = useMemo(() => { if (!hasElasticManagedLlm) { return ( @@ -112,7 +102,7 @@ export const GenAiSettingsApp: React.FC = ({ setBreadcrum hasConnectorsAllPrivilege ? 'set up' : 'have' } a Generative AI connector. {manageConnectors}`} values={{ - manageConnectors: showDefaultLlmSetting ? ( + manageConnectors: ( = ({ setBreadcrum } /> - ) : null, + ), }} />

@@ -156,7 +146,7 @@ export const GenAiSettingsApp: React.FC = ({ setBreadcrum /> ), - manageConnectors: showDefaultLlmSetting ? ( + manageConnectors: ( = ({ setBreadcrum defaultMessage="Manage connectors" /> - ) : null, + ), elasticManagedLlm: ( = ({ setBreadcrum canManageSpaces, docLinks, application, - showDefaultLlmSetting, ]); async function handleSave() { @@ -208,34 +197,6 @@ export const GenAiSettingsApp: React.FC = ({ setBreadcrum } } - const manageConnectorsButton = useMemo(() => { - return ( - { - application.navigateToApp('management', { - path: 'insightsAndAlerting/triggersActionsConnectors/connectors', - openInNewTab: true, - }); - }} - > - {hasConnectorsAllPrivilege ? ( - - ) : ( - - )} - - ); - }, [application, hasConnectorsAllPrivilege]); - return ( <>
@@ -277,11 +238,7 @@ export const GenAiSettingsApp: React.FC = ({ setBreadcrum - {showDefaultLlmSetting ? ( - - ) : ( - manageConnectorsButton - )} + diff --git a/x-pack/solutions/security/plugins/security_solution/common/constants.ts b/x-pack/solutions/security/plugins/security_solution/common/constants.ts index e6cab89ea8614..c7a57adad554f 100644 --- a/x-pack/solutions/security/plugins/security_solution/common/constants.ts +++ b/x-pack/solutions/security/plugins/security_solution/common/constants.ts @@ -194,22 +194,6 @@ export const ENABLE_NEWS_FEED_SETTING = 'securitySolution:enableNewsFeed' as con /** This Kibana Advanced Setting sets a default AI connector for serverless AI features (EASE) */ export const DEFAULT_AI_CONNECTOR = 'securitySolution:defaultAIConnector' as const; -/** Feature flag for the default AI connector setting */ -export const AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED = - 'aiAssistant.defaultLlmSettingEnabled' as const; - -/** The default value for the default AI connector setting */ -export const AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE = true as const; - -/** This Kibana Advanced Setting sets a default AI value report minutes per alert */ -export const DEFAULT_VALUE_REPORT_MINUTES = 'securitySolution:defaultValueReportMinutes' as const; - -/** This Kibana Advanced Setting sets a default AI value report hourly analyst rate */ -export const DEFAULT_VALUE_REPORT_RATE = 'securitySolution:defaultValueReportRate' as const; - -/** This Kibana Advanced Setting sets a default title for the AI value report page */ -export const DEFAULT_VALUE_REPORT_TITLE = 'securitySolution:defaultValueReportTitle' as const; - /** This Kibana Advanced Setting allows users to enable/disable querying cold and frozen data tiers in analyzer */ export const EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER = 'securitySolution:excludeColdAndFrozenTiersInAnalyzer' as const; diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.test.ts index bb466cf287872..2c6ac21f579cc 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.test.ts @@ -10,11 +10,6 @@ import { useDefaultAIConnectorId } from './use_default_ai_connector_id'; import { useKibana } from '../lib/kibana'; import { useAIConnectors } from './use_ai_connectors'; import { getDefaultConnector } from '@kbn/elastic-assistant/impl/assistant/helpers'; -import { - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE, - DEFAULT_AI_CONNECTOR, -} from '../../../common/constants'; jest.mock('../lib/kibana'); jest.mock('./use_ai_connectors'); @@ -26,12 +21,6 @@ const mockGetDefaultConnector = getDefaultConnector as jest.Mock; describe('useDefaultAIConnectorId', () => { const mockSettings = {}; - const mockUiSettings = { - get: jest.fn(), - }; - const mockFeatureFlags = { - getBooleanValue: jest.fn(), - }; const mockConnectors = [ { id: 'connector-1', name: 'Connector 1' }, { id: 'connector-2', name: 'Connector 2' }, @@ -43,8 +32,6 @@ describe('useDefaultAIConnectorId', () => { mockUseKibana.mockReturnValue({ services: { settings: mockSettings, - uiSettings: mockUiSettings, - featureFlags: mockFeatureFlags, }, }); @@ -53,29 +40,16 @@ describe('useDefaultAIConnectorId', () => { isLoading: false, }); - mockUiSettings.get.mockReturnValue('legacy-connector-id'); - mockFeatureFlags.getBooleanValue.mockReturnValue(false); - mockGetDefaultConnector.mockReturnValue({ id: 'new-connector-id' }); + mockGetDefaultConnector.mockReturnValue({ id: 'connector-id' }); }); - it('should return legacy connector id when new default connector feature is disabled', () => { - mockFeatureFlags.getBooleanValue.mockReturnValue(false); - - const { result } = renderHook(() => useDefaultAIConnectorId()); - - expect(result.current.defaultConnectorId).toBe('legacy-connector-id'); - }); - - it('should return new connector id when new default connector feature is enabled', () => { - mockFeatureFlags.getBooleanValue.mockReturnValue(true); - + it('should return connector id from getDefaultConnector', () => { const { result } = renderHook(() => useDefaultAIConnectorId()); - expect(result.current.defaultConnectorId).toBe('new-connector-id'); + expect(result.current.defaultConnectorId).toBe('connector-id'); }); - it('should return undefined when new default connector feature is enabled but getDefaultConnector returns undefined', () => { - mockFeatureFlags.getBooleanValue.mockReturnValue(true); + it('should return undefined when getDefaultConnector returns undefined', () => { mockGetDefaultConnector.mockReturnValue(undefined); const { result } = renderHook(() => useDefaultAIConnectorId()); @@ -83,8 +57,7 @@ describe('useDefaultAIConnectorId', () => { expect(result.current.defaultConnectorId).toBeUndefined(); }); - it('should return undefined when new default connector feature is enabled but getDefaultConnector returns null', () => { - mockFeatureFlags.getBooleanValue.mockReturnValue(true); + it('should return undefined when getDefaultConnector returns null', () => { mockGetDefaultConnector.mockReturnValue(null); const { result } = renderHook(() => useDefaultAIConnectorId()); @@ -92,36 +65,12 @@ describe('useDefaultAIConnectorId', () => { expect(result.current.defaultConnectorId).toBeUndefined(); }); - it('should call getBooleanValue with correct parameters', () => { - renderHook(() => useDefaultAIConnectorId()); - - expect(mockFeatureFlags.getBooleanValue).toHaveBeenCalledWith( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE - ); - }); - - it('should call uiSettings.get with correct parameter', () => { - renderHook(() => useDefaultAIConnectorId()); - - expect(mockUiSettings.get).toHaveBeenCalledWith(DEFAULT_AI_CONNECTOR); - }); - it('should call getDefaultConnector with correct parameters', () => { renderHook(() => useDefaultAIConnectorId()); expect(mockGetDefaultConnector).toHaveBeenCalledWith(mockConnectors, mockSettings); }); - it('should return undefined when legacy connector id is undefined and new feature is disabled', () => { - mockUiSettings.get.mockReturnValue(undefined); - mockFeatureFlags.getBooleanValue.mockReturnValue(false); - - const { result } = renderHook(() => useDefaultAIConnectorId()); - - expect(result.current.defaultConnectorId).toBeUndefined(); - }); - it('should return isLoading true when connectors are loading', () => { mockUseAIConnectors.mockReturnValue({ aiConnectors: mockConnectors, diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.ts b/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.ts index 34d0dbc00b94a..3aca18c2c3035 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.ts @@ -7,30 +7,20 @@ import { getDefaultConnector } from '@kbn/elastic-assistant/impl/assistant/helpers'; import { useMemo } from 'react'; -import { - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE, - DEFAULT_AI_CONNECTOR, -} from '../../../common/constants'; import { useAIConnectors } from './use_ai_connectors'; import { useKibana } from '../lib/kibana'; export const useDefaultAIConnectorId = () => { - const { settings, uiSettings, featureFlags } = useKibana().services; + const { settings } = useKibana().services; const { aiConnectors: connectors, isLoading: isLoadingConnectors } = useAIConnectors(); - const legacyDefaultConnectorId = uiSettings.get(DEFAULT_AI_CONNECTOR); - const useNewDefaultConnector = featureFlags.getBooleanValue( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE - ); - const newDefaultConnectorId = getDefaultConnector(connectors, settings)?.id; + const defaultConnectorId = getDefaultConnector(connectors, settings)?.id; return useMemo( () => ({ - defaultConnectorId: useNewDefaultConnector ? newDefaultConnectorId : legacyDefaultConnectorId, + defaultConnectorId, isLoading: isLoadingConnectors, }), - [useNewDefaultConnector, newDefaultConnectorId, legacyDefaultConnectorId, isLoadingConnectors] + [defaultConnectorId, isLoadingConnectors] ); }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.test.tsx index 14c66310dde85..8369d5d5c5990 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.test.tsx @@ -14,19 +14,10 @@ import { } from './connector_missing_callout'; import { useNavigateTo } from '@kbn/security-solution-navigation'; -const mockedUseKibana = { - services: { - featureFlags: { - getBooleanValue: jest.fn().mockReturnValue(false), - }, - }, -}; - jest.mock('@kbn/security-solution-navigation'); jest.mock('../../../common/lib/kibana', () => { return { ...jest.requireActual('../../../common/lib/kibana'), - useKibana: () => mockedUseKibana, }; }); @@ -57,23 +48,6 @@ describe('ConnectorMissingCallout', () => { getByTestId(MISSING_CONNECTOR_CALLOUT_LINK_TEST_ID).click(); - expect(navigateTo).toHaveBeenCalledWith({ - appId: 'management', - path: '/kibana/settings?query=defaultAIConnector', - }); - }); - - it('should call navigateTo genAiSettings when clicking on link and useNewDefaultConnector is true', () => { - const navigateTo = jest.fn(); - (useNavigateTo as jest.Mock).mockReturnValue({ - navigateTo, - }); - mockedUseKibana.services.featureFlags.getBooleanValue.mockReturnValue(true); - - const { getByTestId } = render(); - - getByTestId(MISSING_CONNECTOR_CALLOUT_LINK_TEST_ID).click(); - expect(navigateTo).toHaveBeenCalledWith({ appId: 'management', path: '/ai/genAiSettings', diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.tsx index 8a968526b9df5..7df40aadb962e 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/ease/components/connector_missing_callout.tsx @@ -9,11 +9,6 @@ import React, { memo, useCallback } from 'react'; import { EuiCallOut, EuiLink } from '@elastic/eui'; import { useNavigateTo } from '@kbn/security-solution-navigation'; import { i18n } from '@kbn/i18n'; -import { useKibana } from '../../../common/lib/kibana'; -import { - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE, -} from '../../../../common/constants'; const MISSING_CONNECTOR = i18n.translate('xpack.securitySolution.alertSummary.missingConnector', { defaultMessage: 'Missing connector', @@ -55,21 +50,14 @@ export interface ConnectorMissingCalloutProps { */ export const ConnectorMissingCallout = memo( ({ canSeeAdvancedSettings }: ConnectorMissingCalloutProps) => { - const { featureFlags } = useKibana().services; - const useNewDefaultConnector = featureFlags.getBooleanValue( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE - ); const { navigateTo } = useNavigateTo(); const goToKibanaSettings = useCallback( () => navigateTo({ appId: 'management', - path: useNewDefaultConnector - ? '/ai/genAiSettings' - : '/kibana/settings?query=defaultAIConnector', + path: '/ai/genAiSettings', }), - [navigateTo, useNewDefaultConnector] + [navigateTo] ); return ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/executive_summary.tsx b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/executive_summary.tsx index c23d1a3198e92..f7afc5b78fc0f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/executive_summary.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/executive_summary.tsx @@ -19,7 +19,7 @@ import { EuiSkeletonText, } from '@elastic/eui'; import { css } from '@emotion/react'; -import { DEFAULT_VALUE_REPORT_TITLE } from '../../../../common/constants'; +import { SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE } from '@kbn/management-settings-ids'; import { useKibana } from '../../../common/lib/kibana'; import { CostSavings } from './cost_savings'; import { getTimeRangeAsDays, formatDollars, formatThousands } from './metrics'; @@ -53,10 +53,12 @@ export const ExecutiveSummary: React.FC = ({ valueMetricsCompare, }) => { const { uiSettings } = useKibana().services; - const [title, setTitle] = useState(uiSettings.get(DEFAULT_VALUE_REPORT_TITLE)); + const [title, setTitle] = useState( + uiSettings.get(SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE) + ); const updateTitle = useCallback( (newTitle: string) => { - uiSettings.set(DEFAULT_VALUE_REPORT_TITLE, newTitle); + uiSettings.set(SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE, newTitle); setTitle(newTitle); }, [uiSettings] diff --git a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.test.tsx index 0fced80c9251f..4654eab09ed11 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.test.tsx @@ -7,6 +7,10 @@ import React from 'react'; import { render } from '@testing-library/react'; +import { + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES, + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE, +} from '@kbn/management-settings-ids'; import { AIValueMetrics } from '.'; import { useKibana } from '../../../common/lib/kibana'; import { useValueMetrics } from '../../hooks/use_value_metrics'; @@ -14,10 +18,6 @@ import { ExecutiveSummary } from './executive_summary'; import { AlertProcessing } from './alert_processing'; import { CostSavingsTrend } from './cost_savings_trend'; import { ValueReportSettings } from './value_report_settings'; -import { - DEFAULT_VALUE_REPORT_MINUTES, - DEFAULT_VALUE_REPORT_RATE, -} from '../../../../common/constants'; import type { StartServices } from '../../../types'; // Mock dependencies @@ -80,8 +80,8 @@ describe('AIValueMetrics', () => { services: { uiSettings: { get: jest.fn((key: string) => { - if (key === DEFAULT_VALUE_REPORT_MINUTES) return 10; - if (key === DEFAULT_VALUE_REPORT_RATE) return 50; + if (key === SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES) return 10; + if (key === SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE) return 50; return null; }), }, @@ -202,8 +202,8 @@ describe('AIValueMetrics', () => { uiSettings: { // @ts-ignore get: jest.fn((key: string) => { - if (key === DEFAULT_VALUE_REPORT_MINUTES) return 5; - if (key === DEFAULT_VALUE_REPORT_RATE) return 75; + if (key === SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES) return 5; + if (key === SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE) return 75; return null; }), }, diff --git a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.tsx index b7eab5b488757..38c1eda95c29d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.tsx @@ -8,11 +8,11 @@ import React, { useEffect, useMemo } from 'react'; import { EuiHorizontalRule, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; -import { ValueReportSettings } from './value_report_settings'; import { - DEFAULT_VALUE_REPORT_MINUTES, - DEFAULT_VALUE_REPORT_RATE, -} from '../../../../common/constants'; + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES, + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE, +} from '@kbn/management-settings-ids'; +import { ValueReportSettings } from './value_report_settings'; import { CostSavingsTrend } from './cost_savings_trend'; import { ExecutiveSummary } from './executive_summary'; import { AlertProcessing } from './alert_processing'; @@ -30,8 +30,8 @@ export const AIValueMetrics: React.FC = ({ setHasAttackDiscoveries, from, const { analystHourlyRate, minutesPerAlert } = useMemo( () => ({ - minutesPerAlert: uiSettings.get(DEFAULT_VALUE_REPORT_MINUTES), - analystHourlyRate: uiSettings.get(DEFAULT_VALUE_REPORT_RATE), + minutesPerAlert: uiSettings.get(SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES), + analystHourlyRate: uiSettings.get(SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE), }), [uiSettings] ); diff --git a/x-pack/solutions/security/plugins/security_solution/server/ui_settings.ts b/x-pack/solutions/security/plugins/security_solution/server/ui_settings.ts index 262ded89be203..722fa804504a2 100644 --- a/x-pack/solutions/security/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/solutions/security/plugins/security_solution/server/ui_settings.ts @@ -9,11 +9,13 @@ import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; import type { CoreSetup, UiSettingsParams } from '@kbn/core/server'; -import type { Connector } from '@kbn/actions-plugin/server/application/connector/types'; -import type { ReadonlyModeType } from '@kbn/core-ui-settings-common'; +import { + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES, + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE, + SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE, +} from '@kbn/management-settings-ids'; import { APP_ID, - DEFAULT_AI_CONNECTOR, DEFAULT_ALERT_TAGS_KEY, DEFAULT_ALERT_TAGS_VALUE, DEFAULT_ANOMALY_SCORE, @@ -30,9 +32,6 @@ import { DEFAULT_THREAT_INDEX_KEY, DEFAULT_THREAT_INDEX_VALUE, DEFAULT_TO, - DEFAULT_VALUE_REPORT_MINUTES, - DEFAULT_VALUE_REPORT_RATE, - DEFAULT_VALUE_REPORT_TITLE, ENABLE_ASSET_INVENTORY_SETTING, ENABLE_CCS_READ_WARNING_SETTING, ENABLE_CLOUD_CONNECTOR_SETTING, @@ -622,33 +621,8 @@ export const initUiSettings = ( uiSettings.register(orderSettings(securityUiSettings)); }; -export const getDefaultAIConnectorSetting = ( - connectors: Connector[], - readonlyMode?: ReadonlyModeType -): SettingsConfig => ({ - [DEFAULT_AI_CONNECTOR]: { - name: i18n.translate('xpack.securitySolution.uiSettings.defaultAIConnectorLabel', { - defaultMessage: 'Default AI Connector', - }), - // TODO, make Elastic LLM the default value once fully available in serverless - value: connectors.at(0)?.id, - description: i18n.translate('xpack.securitySolution.uiSettings.defaultAIConnectorDescription', { - defaultMessage: 'Default AI connector for serverless AI features (Elastic AI SOC Engine)', - }), - type: 'select', - options: connectors.map(({ id }) => id), - optionLabels: Object.fromEntries(connectors.map(({ id, name }) => [id, name])), - category: [APP_ID], - requiresPageReload: true, - schema: schema.string(), - solutionViews: ['classic', 'security'], - readonlyMode, - readonly: readonlyMode !== undefined, - }, -}); - export const getDefaultValueReportSettings = (): SettingsConfig => ({ - [DEFAULT_VALUE_REPORT_MINUTES]: { + [SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_MINUTES]: { name: i18n.translate('xpack.securitySolution.uiSettings.defaultValueMinutesLabel', { defaultMessage: 'Value report minutes per alert', }), @@ -666,7 +640,7 @@ export const getDefaultValueReportSettings = (): SettingsConfig => ({ schema: schema.number(), solutionViews: ['classic', 'security'], }, - [DEFAULT_VALUE_REPORT_RATE]: { + [SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_RATE]: { name: i18n.translate('xpack.securitySolution.uiSettings.defaultValueRateLabel', { defaultMessage: 'Value report analyst hourly rate', }), @@ -681,7 +655,7 @@ export const getDefaultValueReportSettings = (): SettingsConfig => ({ schema: schema.number(), solutionViews: ['classic', 'security'], }, - [DEFAULT_VALUE_REPORT_TITLE]: { + [SECURITY_SOLUTION_DEFAULT_VALUE_REPORT_TITLE]: { name: i18n.translate('xpack.securitySolution.uiSettings.defaultValueTitleLabel', { defaultMessage: 'Value report title', }), diff --git a/x-pack/solutions/security/plugins/security_solution/tsconfig.json b/x-pack/solutions/security/plugins/security_solution/tsconfig.json index bd9995ff8ab9a..97d130e8008af 100644 --- a/x-pack/solutions/security/plugins/security_solution/tsconfig.json +++ b/x-pack/solutions/security/plugins/security_solution/tsconfig.json @@ -259,7 +259,6 @@ "@kbn/onechat-server", "@kbn/core-analytics-server-mocks", "@kbn/object-utils", - "@kbn/core-ui-settings-common", "@kbn/react-query", "@kbn/core-chrome-layout-constants", "@kbn/response-ops-rule-form", diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts b/x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts index 614e035edc401..aa345a9c7ddba 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts +++ b/x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts @@ -14,13 +14,7 @@ import type { } from '@kbn/core/server'; import { SECURITY_PROJECT_SETTINGS } from '@kbn/serverless-security-settings'; -import { isSupportedConnector } from '@kbn/inference-common'; -import { - getDefaultAIConnectorSetting, - getDefaultValueReportSettings, -} from '@kbn/security-solution-plugin/server/ui_settings'; -import type { Connector } from '@kbn/actions-plugin/server/application/connector/types'; -import { AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED } from '@kbn/security-solution-plugin/common/constants'; +import { getDefaultValueReportSettings } from '@kbn/security-solution-plugin/server/ui_settings'; import { getEnabledProductFeatures } from '../common/pli/pli_features'; import type { ServerlessSecurityConfig } from './config'; @@ -97,35 +91,9 @@ export class SecuritySolutionServerlessPlugin pluginsSetup.serverless.setupProjectSettings(projectSettings); // Serverless Advanced Settings setup - coreSetup - .getStartServices() - .then(async ([coreStart, depsStart]) => { - const isNewDefaultConnectorEnabled = await coreStart.featureFlags.getBooleanValue( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - false - ); - try { - const unsecuredActionsClient = depsStart.actions.getUnsecuredActionsClient(); - // using "default" space actually forces the api to use undefined space (see getAllUnsecured) - const aiConnectors = (await unsecuredActionsClient.getAll('default')).filter( - (connector: Connector) => isSupportedConnector(connector) - ); - - // hide the setting if the new default connector feature is enabled - const defaultAIConnectorSetting = getDefaultAIConnectorSetting( - aiConnectors, - isNewDefaultConnectorEnabled ? 'ui' : undefined - ); - - coreSetup.uiSettings.register({ - ...defaultAIConnectorSetting, - ...getDefaultValueReportSettings(), - }); - } catch (error) { - this.logger.error(`Error registering default AI connector: ${error}`); - } - }) - .catch(() => {}); // it shouldn't reject, but just in case + coreSetup.uiSettings.register({ + ...getDefaultValueReportSettings(), + }); // Tasks this.cloudSecurityUsageReportingTask = new SecurityUsageReportingTask({ diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json b/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json index 6e8ec6d155f1d..8a5bc9b226c57 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json +++ b/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json @@ -46,7 +46,6 @@ "@kbn/dev-utils", "@kbn/ai-assistant-icon", "@kbn/core-application-browser", - "@kbn/inference-common", "@kbn/deeplinks-management", "@kbn/connector-schemas", ]