Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ export const SECURITY_SOLUTION_ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING =
'securitySolution:enableVisualizationsInFlyout' as const;
export const SECURITY_SOLUTION_ENABLE_GRAPH_VISUALIZATION_SETTING =
'securitySolution:enableGraphVisualization' 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';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
*/
import '@testing-library/jest-dom';
import { act, render, screen } from '@testing-library/react';
import {
AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED,
DefaultAIConnector,
} from './default_ai_connector';
import { DefaultAIConnector } from './default_ai_connector';
import { QueryClient, QueryClientProvider } from '@kbn/react-query';
import { I18nProvider } from '@kbn/i18n-react';
import userEvent from '@testing-library/user-event';
Expand Down Expand Up @@ -86,16 +83,7 @@ function setupTest({
} as unknown as ApplicationStart
}
docLinks={{} as DocLinksStart}
featureFlags={
{
getBooleanValue: jest.fn().mockImplementation((flag) => {
if (flag === AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED && enabled) {
return true;
}
return false;
}),
} as unknown as FeatureFlagsStart
}
featureFlags={{} as unknown as FeatureFlagsStart}
toast={{} as IToasts}
>
{children}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,6 @@ import { i18n } from '@kbn/i18n';
import { NO_DEFAULT_CONNECTOR } from '../lib/constants';
import { useDefaultAiConnectorSettingContext } from '../context/default_ai_connector_context';

/** 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;

interface ConnectorData {
connectors?: Array<{
id: string;
Expand Down Expand Up @@ -146,7 +139,7 @@ const getOptionsByValues = (
};

export const DefaultAIConnector: React.FC<Props> = ({ connectors, settings }) => {
const { toast, application, docLinks, featureFlags } = useDefaultAiConnectorSettingContext();
const { toast, application, docLinks } = useDefaultAiConnectorSettingContext();
const options = useMemo(() => getOptions(connectors), [connectors]);
const { handleFieldChange, fields, unsavedChanges } = settings;

Expand Down Expand Up @@ -276,15 +269,6 @@ export const DefaultAIConnector: React.FC<Props> = ({ connectors, settings }) =>
);
}, [elasticManagedLlmExists, application, docLinks]);

if (
!featureFlags.getBooleanValue(
AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED,
AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE
)
) {
return null;
}

return (
<>
<EuiDescribedFormGroup
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,6 @@ describe('SettingsTab', () => {
});
useKibanaMock.mockReturnValue({
services: {
featureFlags: {
getBooleanValue: jest.fn().mockImplementation((flag) => {
if (flag === 'aiAssistant.defaultLlmSettingEnabled') {
return true;
}
return false;
}),
},
application: {
getUrlForApp: getUrlForAppMock,
capabilities: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ import {
import { useNavigateTo } from '@kbn/security-solution-navigation';

jest.mock('@kbn/security-solution-navigation');
jest.mock('../../../common/lib/kibana', () => {
return {
...jest.requireActual('../../../common/lib/kibana'),
};
});

describe('ConnectorMissingCallout', () => {
it('should render component', () => {
Expand Down Expand Up @@ -45,7 +50,7 @@ describe('ConnectorMissingCallout', () => {

expect(navigateTo).toHaveBeenCalledWith({
appId: 'management',
path: '/kibana/settings?query=defaultAIConnector',
path: '/ai/genAiSettings',
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,11 @@ export const ConnectorMissingCallout = memo(
({ canSeeAdvancedSettings }: ConnectorMissingCalloutProps) => {
const { navigateTo } = useNavigateTo();
const goToKibanaSettings = useCallback(
() => navigateTo({ appId: 'management', path: '/kibana/settings?query=defaultAIConnector' }),
() =>
navigateTo({
appId: 'management',
path: '/ai/genAiSettings',
}),
[navigateTo]
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ 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 {
APP_ID,
DEFAULT_ANOMALY_SCORE,
Expand Down Expand Up @@ -41,7 +40,6 @@ import {
EXCLUDED_DATA_TIERS_FOR_RULE_EXECUTION,
ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING,
ENABLE_GRAPH_VISUALIZATION_SETTING,
DEFAULT_AI_CONNECTOR,
} from '../common/constants';
import type { ExperimentalFeatures } from '../common/experimental_features';
import { LogLevelSetting } from '../common/api/detection_engine/rule_monitoring';
Expand Down Expand Up @@ -496,30 +494,3 @@ export const initUiSettings = (

uiSettings.register(orderSettings(securityUiSettings));
};
export const getDefaultAIConnectorSetting = (connectors: Connector[]): SettingsConfig | null =>
connectors.length > 0
? {
[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[0].id,
description: i18n.translate(
'xpack.securitySolution.uiSettings.defaultAIConnectorDescription',
{
// TODO update this copy, waiting on James Spiteri's input
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(),
solution: 'security',
},
}
: null;
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ import type {
} from '@kbn/core/server';

import { SECURITY_PROJECT_SETTINGS } from '@kbn/serverless-security-settings';
import { isSupportedConnector } from '@kbn/inference-common';
import { getDefaultAIConnectorSetting } from '@kbn/security-solution-plugin/server/ui_settings';
import type { Connector } from '@kbn/actions-plugin/server/application/connector/types';
import { getEnabledProductFeatures } from '../common/pli/pli_features';

import type { ServerlessSecurityConfig } from './config';
Expand Down Expand Up @@ -90,29 +87,6 @@ export class SecuritySolutionServerlessPlugin
// Setup project uiSettings whitelisting
pluginsSetup.serverless.setupProjectSettings(SECURITY_PROJECT_SETTINGS);

// use metering check which verifies AI4SOC is enabled
if (ai4SocMeteringService.shouldMeter(this.config)) {
// Serverless Advanced Settings setup
coreSetup
.getStartServices()
.then(async ([_, depsStart]) => {
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)
);
const defaultAIConnectorSetting = getDefaultAIConnectorSetting(aiConnectors);
if (defaultAIConnectorSetting !== null) {
coreSetup.uiSettings.register(defaultAIConnectorSetting);
}
} catch (error) {
this.logger.error(`Error registering default AI connector: ${error}`);
}
})
.catch(() => {}); // it shouldn't reject, but just in case
}

// Tasks
this.cloudSecurityUsageReportingTask = new SecurityUsageReportingTask({
core: coreSetup,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
"@kbn/integration-assistant-plugin",
"@kbn/cloud-security-posture-common",
"@kbn/core-application-browser",
"@kbn/inference-common",
"@kbn/dev-utils"
]
}