From ef1e3798e1f6f26694a0e724d637a7a620612b28 Mon Sep 17 00:00:00 2001 From: Kenneth Kreindler <42113355+KDKHD@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:35:04 +0000 Subject: [PATCH 1/7] [GenAi] Clean up default LLM setting feature flag. (#242543) ## Summary Summarize your PR. If it involves visual changes include a screenshot or gif. Removes the `aiAssistant.defaultLlmSettingEnabled` feature flag and associated cleanup. ### Changes - **Removed feature flag**: Deleted `AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED` and `AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE` constants from both `gen_ai_settings` and `security_solution` plugins - **Simplified code**: Removed all feature flag checks - now always uses the new default connector behavior - **Centralized constants**: Moved `DEFAULT_VALUE_REPORT_*` settings to `@kbn/management-settings-ids` package to avoid duplication - **Fixed serverless**: Added value report settings to `SECURITY_PROJECT_SETTINGS` whitelist and removed unnecessary async wrapper in `security_solution_serverless` plugin - Serverless settings properly whitelisted for value report features ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [X] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md) - [X] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [X] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [X] This was checked for breaking HTTP API changes, and any breaking changes have been approved by the breaking-change committee. The `release_note:breaking` label should be applied in these situations. - [X] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [X] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) - [X] Review the [backport guidelines](https://docs.google.com/document/d/1VyN5k91e5OVumlc0Gb9RPa3h1ewuPE705nRtioPiTvY/edit?usp=sharing) and apply applicable `backport:*` labels. ### Identify risks Does this PR introduce any risks? For example, consider risks like hard to test bugs, performance regression, potential of data loss. Describe the risk, its severity, and mitigation for each identified risk. Invite stakeholders and evaluate how to proceed before merging. - [ ] [See some risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) - [ ] ... --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine (cherry picked from commit 2c75d4f550dc5a8308d291e542a8728296ed7d4e) # Conflicts: # src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts # src/platform/packages/shared/serverless/settings/security_project/index.ts # x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.test.tsx # x-pack/platform/plugins/private/gen_ai_settings/public/components/gen_ai_settings_app.tsx # x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.test.ts # x-pack/solutions/security/plugins/security_solution/public/common/hooks/use_default_ai_connector_id.ts # x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.test.tsx # x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.tsx # x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/executive_summary.tsx # x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.test.tsx # x-pack/solutions/security/plugins/security_solution/public/reports/components/ai_value/index.tsx # x-pack/solutions/security/plugins/security_solution/server/ui_settings.ts # x-pack/solutions/security/plugins/security_solution/tsconfig.json # x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts # x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json --- .../settings/setting_ids/index.ts | 1 - .../connector_missing_callout.test.tsx | 7 ++++- .../components/connector_missing_callout.tsx | 6 +++- .../security_solution/server/ui_settings.ts | 29 +------------------ .../server/plugin.ts | 23 --------------- 5 files changed, 12 insertions(+), 54 deletions(-) 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 8ab94b821b59f..c45d372fbcba7 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 @@ -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'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.test.tsx index e3b09c8fef8fc..8369d5d5c5990 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.test.tsx @@ -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', () => { @@ -45,7 +50,7 @@ describe('ConnectorMissingCallout', () => { expect(navigateTo).toHaveBeenCalledWith({ appId: 'management', - path: '/kibana/settings?query=defaultAIConnector', + path: '/ai/genAiSettings', }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.tsx index 7406169fd1b79..ba51a65df62f4 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/ai_for_soc/components/connector_missing_callout.tsx @@ -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] ); 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 ed2c20628ba3b..058e291e565ea 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 @@ -495,31 +495,4 @@ 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; +}; \ No newline at end of file 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 1ff3b29af4422..47b3dc0bb40b5 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 @@ -90,29 +90,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, From b351c16d4497430482870ed68a3e10cde031061e Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:03:41 +0000 Subject: [PATCH 2/7] Changes from node scripts/eslint_all_files --no-cache --fix --- .../security/plugins/security_solution/server/ui_settings.ts | 4 +--- .../plugins/security_solution_serverless/server/plugin.ts | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) 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 058e291e565ea..94fce7eecd1bb 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,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, @@ -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'; @@ -495,4 +493,4 @@ export const initUiSettings = ( }; uiSettings.register(orderSettings(securityUiSettings)); -}; \ No newline at end of file +}; 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 47b3dc0bb40b5..623885b5df7bf 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,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'; From b728ba4efcdc2c4a2149769055f197ad59ff4708 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:17:24 +0000 Subject: [PATCH 3/7] Changes from node scripts/lint_ts_projects --fix --- .../security/plugins/security_solution_serverless/tsconfig.json | 1 - 1 file changed, 1 deletion(-) 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 f1e73f8ff2743..80186c1d7ab5d 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json +++ b/x-pack/solutions/security/plugins/security_solution_serverless/tsconfig.json @@ -49,7 +49,6 @@ "@kbn/integration-assistant-plugin", "@kbn/cloud-security-posture-common", "@kbn/core-application-browser", - "@kbn/inference-common", "@kbn/dev-utils" ] } From 3e4f4aa3c5031ee9a0201913677bb069108bb8fb Mon Sep 17 00:00:00 2001 From: Kenneth Kreindler Date: Wed, 19 Nov 2025 14:35:07 +0100 Subject: [PATCH 4/7] cleanup --- .../src/components/default_ai_connector.tsx | 16 ---------------- .../settings_tab/settings_tab.test.tsx | 8 -------- 2 files changed, 24 deletions(-) diff --git a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx index 8e7a975b56ec7..2a37d631293f8 100644 --- a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx +++ b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx @@ -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; @@ -276,15 +269,6 @@ export const DefaultAIConnector: React.FC = ({ connectors, settings }) => ); }, [elasticManagedLlmExists, application, docLinks]); - if ( - !featureFlags.getBooleanValue( - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED, - AI_ASSISTANT_DEFAULT_LLM_SETTING_ENABLED_VALUE - ) - ) { - return null; - } - return ( <> { }); useKibanaMock.mockReturnValue({ services: { - featureFlags: { - getBooleanValue: jest.fn().mockImplementation((flag) => { - if (flag === 'aiAssistant.defaultLlmSettingEnabled') { - return true; - } - return false; - }), - }, application: { getUrlForApp: getUrlForAppMock, capabilities: { From 7c95df592cf6161db81dccccfbc7762d86b29149 Mon Sep 17 00:00:00 2001 From: Kenneth Kreindler Date: Wed, 19 Nov 2025 14:45:52 +0100 Subject: [PATCH 5/7] cleanup --- .../src/components/default_ai_connector.test.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx index 062db8c53dce9..9c1ea91d435b2 100644 --- a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx +++ b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx @@ -7,7 +7,6 @@ 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 { QueryClient, QueryClientProvider } from '@kbn/react-query'; @@ -87,14 +86,7 @@ function setupTest({ } 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 + {} as unknown as FeatureFlagsStart } toast={{} as IToasts} > From f1563fbdc9fe95c217542b8331291886a1a279e3 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:12:14 +0000 Subject: [PATCH 6/7] Changes from node scripts/eslint_all_files --no-cache --fix --- .../src/components/default_ai_connector.test.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx index 9c1ea91d435b2..f99943f96d2bf 100644 --- a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx +++ b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.test.tsx @@ -6,9 +6,7 @@ */ import '@testing-library/jest-dom'; import { act, render, screen } from '@testing-library/react'; -import { - 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'; @@ -85,9 +83,7 @@ function setupTest({ } as unknown as ApplicationStart } docLinks={{} as DocLinksStart} - featureFlags={ - {} as unknown as FeatureFlagsStart - } + featureFlags={{} as unknown as FeatureFlagsStart} toast={{} as IToasts} > {children} From ef04283516b48847524b08d1547604668233534b Mon Sep 17 00:00:00 2001 From: Kenneth Kreindler Date: Wed, 19 Nov 2025 15:26:21 +0100 Subject: [PATCH 7/7] cleanup --- .../src/components/default_ai_connector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx index 2a37d631293f8..900ef75123fe2 100644 --- a/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx +++ b/x-pack/platform/packages/shared/ai-assistant-default-llm-setting/src/components/default_ai_connector.tsx @@ -139,7 +139,7 @@ const getOptionsByValues = ( }; export const DefaultAIConnector: React.FC = ({ connectors, settings }) => { - const { toast, application, docLinks, featureFlags } = useDefaultAiConnectorSettingContext(); + const { toast, application, docLinks } = useDefaultAiConnectorSettingContext(); const options = useMemo(() => getOptions(connectors), [connectors]); const { handleFieldChange, fields, unsavedChanges } = settings;