diff --git a/src/platform/packages/shared/kbn-workflows/common/constants.ts b/src/platform/packages/shared/kbn-workflows/common/constants.ts index c55fbd9ade319..e724f1d9074cb 100644 --- a/src/platform/packages/shared/kbn-workflows/common/constants.ts +++ b/src/platform/packages/shared/kbn-workflows/common/constants.ts @@ -19,7 +19,6 @@ export const WORKFLOWS_UI_SETTING_ID = 'workflows:ui:enabled'; export const WORKFLOWS_UI_VISUAL_EDITOR_SETTING_ID = 'workflows:ui:visualEditor:enabled'; export const WORKFLOWS_UI_EXECUTION_GRAPH_SETTING_ID = 'workflows:ui:executionGraph:enabled'; export const WORKFLOWS_UI_SHOW_EXECUTOR_SETTING_ID = 'workflows:ui:showExecutor:enabled'; -export const WORKFLOWS_AI_AGENT_SETTING_ID = 'workflows:aiAgent:enabled'; /** * Feature flag ID for enabling / disabling the workflow execution stats bar UI diff --git a/src/platform/packages/shared/serverless/settings/observability_project/index.ts b/src/platform/packages/shared/serverless/settings/observability_project/index.ts index 2e3bc87ae91da..b8e0e89466c8e 100644 --- a/src/platform/packages/shared/serverless/settings/observability_project/index.ts +++ b/src/platform/packages/shared/serverless/settings/observability_project/index.ts @@ -8,10 +8,7 @@ */ import * as settings from '@kbn/management-settings-ids'; -import { - WORKFLOWS_AI_AGENT_SETTING_ID, - WORKFLOWS_UI_SETTING_ID, -} from '@kbn/workflows/common/constants'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows/common/constants'; export const OBSERVABILITY_PROJECT_SETTINGS = [ settings.DEFAULT_ROUTE_ID, @@ -41,10 +38,8 @@ export const OBSERVABILITY_PROJECT_SETTINGS = [ export const OBSERVABILITY_STREAMS_TIERED_PROJECT_SETTINGS = [ settings.OBSERVABILITY_STREAMS_ENABLE_SIGNIFICANT_EVENTS, settings.OBSERVABILITY_STREAMS_ENABLE_SIGNIFICANT_EVENTS_DISCOVERY, - // These settings are only registered in complete tier. They're temporary, will be removed on 9.4.0 release. - // WORKFLOWS_AI_AGENT_SETTING_ID only works when WORKFLOWS_UI_SETTING_ID is enabled. + // This setting is only registered in complete tier. It's temporary, will be removed on 9.4.0 release. WORKFLOWS_UI_SETTING_ID, - WORKFLOWS_AI_AGENT_SETTING_ID, ]; export const OBSERVABILITY_AI_ASSISTANT_PROJECT_SETTINGS = [ diff --git a/src/platform/packages/shared/serverless/settings/search_project/index.ts b/src/platform/packages/shared/serverless/settings/search_project/index.ts index d037e22290c21..e4b4c20682676 100644 --- a/src/platform/packages/shared/serverless/settings/search_project/index.ts +++ b/src/platform/packages/shared/serverless/settings/search_project/index.ts @@ -19,10 +19,7 @@ import { GEN_AI_SETTINGS_DEFAULT_AI_CONNECTOR_DEFAULT_ONLY, } from '@kbn/management-settings-ids'; import { ENABLE_DOCKED_CONSOLE_UI_SETTING_ID } from '@kbn/dev-tools-plugin/common'; -import { - WORKFLOWS_AI_AGENT_SETTING_ID, - WORKFLOWS_UI_SETTING_ID, -} from '@kbn/workflows/common/constants'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows/common/constants'; export const SEARCH_PROJECT_SETTINGS = [ COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID, @@ -35,8 +32,6 @@ export const SEARCH_PROJECT_SETTINGS = [ AGENT_BUILDER_PRE_PROMPT_WORKFLOW_IDS, GEN_AI_SETTINGS_DEFAULT_AI_CONNECTOR, GEN_AI_SETTINGS_DEFAULT_AI_CONNECTOR_DEFAULT_ONLY, - // These settings are temporary, will be removed on 9.4.0 release. - // WORKFLOWS_AI_AGENT_SETTING_ID only works when WORKFLOWS_UI_SETTING_ID is enabled. + // This setting is temporary, will be removed on 9.4.0 release. WORKFLOWS_UI_SETTING_ID, - WORKFLOWS_AI_AGENT_SETTING_ID, ]; diff --git a/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/schema.ts b/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/schema.ts index 2d7894b35f6af..50114126a6a52 100644 --- a/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/schema.ts @@ -539,10 +539,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Whether Elastic Workflows and related experiences are enabled.' }, }, - 'workflows:aiAgent:enabled': { - type: 'boolean', - _meta: { description: 'Whether AI-powered workflow authoring assistance is enabled.' }, - }, 'banners:placement': { type: 'keyword', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/types.ts b/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/types.ts index 9184db7c22a3b..f1c9a701a3871 100644 --- a/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/platform/plugins/private/kibana_usage_collection/server/collectors/management/types.ts @@ -56,7 +56,6 @@ export interface UsageStats { 'agentBuilder:externalMcp': boolean; 'agentBuilder:experimentalFeatures': boolean; 'workflows:ui:enabled': boolean; - 'workflows:aiAgent:enabled': boolean; 'visualization:heatmap:maxBuckets': number; 'visualization:regionmap:showWarnings': boolean; 'visualization:tileMap:maxPrecision': number; diff --git a/src/platform/plugins/shared/telemetry/schema/oss_platform.json b/src/platform/plugins/shared/telemetry/schema/oss_platform.json index da694379399ba..05f9e113f0544 100644 --- a/src/platform/plugins/shared/telemetry/schema/oss_platform.json +++ b/src/platform/plugins/shared/telemetry/schema/oss_platform.json @@ -11473,12 +11473,6 @@ "description": "Whether Elastic Workflows and related experiences are enabled." } }, - "workflows:aiAgent:enabled": { - "type": "boolean", - "_meta": { - "description": "Whether AI-powered workflow authoring assistance is enabled." - } - }, "banners:placement": { "type": "keyword", "_meta": { diff --git a/src/platform/plugins/shared/workflows_management/moon.yml b/src/platform/plugins/shared/workflows_management/moon.yml index 4b176b96fe094..9e88ff4eaef09 100644 --- a/src/platform/plugins/shared/workflows_management/moon.yml +++ b/src/platform/plugins/shared/workflows_management/moon.yml @@ -92,6 +92,7 @@ dependsOn: - '@kbn/agent-builder-browser' - '@kbn/share-plugin' - '@kbn/core-security-server' + - '@kbn/management-settings-ids' tags: - plugin - prod diff --git a/src/platform/plugins/shared/workflows_management/public/plugin.test.ts b/src/platform/plugins/shared/workflows_management/public/plugin.test.ts index c2e98a27b9aa6..40a29270a490d 100644 --- a/src/platform/plugins/shared/workflows_management/public/plugin.test.ts +++ b/src/platform/plugins/shared/workflows_management/public/plugin.test.ts @@ -74,8 +74,7 @@ describe('WorkflowsPlugin', () => { }); it('should register the workflows app when workflows UI is enabled', () => { - // First call: WORKFLOWS_UI_SETTING_ID -> true, second call: WORKFLOWS_AI_AGENT_SETTING_ID -> false - coreSetup.uiSettings.get.mockReturnValueOnce(true).mockReturnValueOnce(false); + coreSetup.uiSettings.get.mockReturnValueOnce(true); const result = plugin.setup(coreSetup, setupDeps as any); diff --git a/src/platform/plugins/shared/workflows_management/public/plugin.ts b/src/platform/plugins/shared/workflows_management/public/plugin.ts index b5c160ae7e9ba..1ccc98412ec46 100644 --- a/src/platform/plugins/shared/workflows_management/public/plugin.ts +++ b/src/platform/plugins/shared/workflows_management/public/plugin.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { Subject } from 'rxjs'; +import { first, Subject } from 'rxjs'; import { type AppDeepLinkLocations, type AppMountParameters, @@ -19,10 +19,8 @@ import { type Plugin, } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; -import { - WORKFLOWS_AI_AGENT_SETTING_ID, - WORKFLOWS_UI_SETTING_ID, -} from '@kbn/workflows/common/constants'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows/common/constants'; import { TelemetryService } from './common/lib/telemetry/telemetry_service'; import { triggerSchemas } from './trigger_schemas'; import type { @@ -129,36 +127,39 @@ export class WorkflowsPlugin public stop() {} /** - * Sets up AI authoring features: resolves the Agent Builder contract and - * registers workflow attachment renderers. Eagerly kicks off the dynamic - * import so the chunk downloads in parallel with onStart resolution, - * minimising the window where renderers are not yet registered. + * Sets up AI authoring features: subscribes to `agentBuilder:experimentalFeatures` + * reactively via `get$` so that toggling the setting registers renderers without + * a page reload. Once registered, renderers stay (addAttachmentType is idempotent-safe + * via the guard flag) — this is fine because the server-side tools independently gate + * on the same setting and won't create attachments when it's off. */ private setupAiIntegration( core: CoreSetup ): void { - const isAiAgentEnabled = core.uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID, false); - if (!isAiAgentEnabled) { - return; - } + const register = async () => { + const aiIntegrationModule = import('./features/ai_integration'); + + this.agentBuilderPromise = core.plugins + .onStart<{ agentBuilder: AgentBuilderPluginStartContract }>('agentBuilder') + .then(async ({ agentBuilder }) => { + if (agentBuilder.found) { + const [coreStart] = await core.getStartServices(); + const { registerWorkflowAttachmentRenderers } = await aiIntegrationModule; + registerWorkflowAttachmentRenderers(agentBuilder.contract.attachments, { + core: coreStart, + telemetry: this.telemetryService.getClient(), + }); + return agentBuilder.contract; + } + return undefined; + }) + .catch(() => undefined); + }; - const aiIntegrationModule = import('./features/ai_integration'); - - this.agentBuilderPromise = core.plugins - .onStart<{ agentBuilder: AgentBuilderPluginStartContract }>('agentBuilder') - .then(async ({ agentBuilder }) => { - if (agentBuilder.found) { - const [coreStart] = await core.getStartServices(); - const { registerWorkflowAttachmentRenderers } = await aiIntegrationModule; - registerWorkflowAttachmentRenderers(agentBuilder.contract.attachments, { - core: coreStart, - telemetry: this.telemetryService.getClient(), - }); - return agentBuilder.contract; - } - return undefined; - }) - .catch(() => undefined); + core.uiSettings + .get$(AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID) + .pipe(first((enabled) => enabled)) + .subscribe(() => register()); } /** Creates the start services to be used in the Kibana services context of the workflows application */ diff --git a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.test.ts b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.test.ts index b5f3e53ab69b5..4d9fc7a346b66 100644 --- a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.test.ts +++ b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.test.ts @@ -8,6 +8,7 @@ */ import { act, renderHook } from '@testing-library/react'; +import { useUiSetting } from '@kbn/kibana-react-plugin/public'; import { useAgentBuilderIntegration } from './use_agent_builder_integration'; import { WORKFLOW_YAML_ATTACHMENT_TYPE } from '../../../../../common/agent_builder/constants'; import { useKibana } from '../../../../hooks/use_kibana'; @@ -18,6 +19,11 @@ jest.mock('react-redux', () => ({ useDispatch: () => mockDispatch, })); jest.mock('../../../../hooks/use_kibana'); +jest.mock('@kbn/kibana-react-plugin/public', () => ({ + ...jest.requireActual('@kbn/kibana-react-plugin/public'), + useUiSetting: jest.fn(), +})); +const useUiSettingMock = useUiSetting as jest.MockedFunction; jest.mock('uuid', () => ({ v4: () => 'mock-uuid-1234' })); jest.mock('../../../../features/ai_integration', () => ({ AttachmentBridge: jest.fn().mockImplementation(() => ({ @@ -114,6 +120,7 @@ describe('useAgentBuilderIntegration', () => { beforeEach(() => { jest.useFakeTimers(); mockModel = createMockModel(INITIAL_YAML); + useUiSettingMock.mockReturnValue(true); }); afterEach(() => { @@ -513,9 +520,10 @@ describe('useAgentBuilderIntegration', () => { }); describe('isAgentBuilderAvailable', () => { - it('returns true when agentBuilder is available', () => { + it('returns true when agentBuilder is available and experimental features enabled', () => { const agentBuilder = createMockAgentBuilder(); setupKibanaMock(agentBuilder); + useUiSettingMock.mockReturnValue(true); const editor = createMockEditor(mockModel); const { result } = renderHook(() => @@ -541,5 +549,21 @@ describe('useAgentBuilderIntegration', () => { expect(result.current.isAgentBuilderAvailable).toBe(false); }); + + it('returns false when experimental features are disabled', () => { + const agentBuilder = createMockAgentBuilder(); + setupKibanaMock(agentBuilder); + useUiSettingMock.mockReturnValue(false); + const editor = createMockEditor(mockModel); + + const { result } = renderHook(() => + useAgentBuilderIntegration({ + editorRef: { current: editor }, + isEditorMounted: true, + }) + ); + + expect(result.current.isAgentBuilderAvailable).toBe(false); + }); }); }); diff --git a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.ts b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.ts index d42ea4a426513..7d2c3f590712b 100644 --- a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.ts +++ b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/hooks/use_agent_builder_integration.ts @@ -11,6 +11,8 @@ import { useCallback, useEffect, useRef } from 'react'; import { useDispatch } from 'react-redux'; import { v4 } from 'uuid'; import { isConversationIdSetEvent } from '@kbn/agent-builder-common/chat/events'; +import { useUiSetting } from '@kbn/kibana-react-plugin/public'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import type { monaco } from '@kbn/monaco'; import { WORKFLOW_YAML_ATTACHMENT_TYPE } from '../../../../../common/agent_builder/constants'; import { setAiAssisted } from '../../../../entities/workflows/store/workflow_detail/slice'; @@ -50,6 +52,9 @@ export const useAgentBuilderIntegration = ({ }: UseAgentBuilderIntegrationParams): UseAgentBuilderIntegrationReturn => { const { workflowsManagement } = useKibana().services; const agentBuilder = workflowsManagement?.agentBuilder; + const isExperimentalEnabled = useUiSetting( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); const telemetry = useTelemetry(); const dispatch = useDispatch(); const proposalManagerRef = useRef(null); @@ -68,7 +73,7 @@ export const useAgentBuilderIntegration = ({ useEffect(() => { const editor = editorRef.current; - if (!isEditorMounted || !editor || !agentBuilder) { + if (!isEditorMounted || !editor || !agentBuilder || !isExperimentalEnabled) { return; } @@ -253,11 +258,20 @@ export const useAgentBuilderIntegration = ({ // eslint-disable-next-line @typescript-eslint/no-explicit-any delete (window as any).__wfTestBridge; }; - }, [isEditorMounted, editorRef, agentBuilder, attachmentId, workflowId, telemetry, dispatch]); + }, [ + isEditorMounted, + editorRef, + agentBuilder, + isExperimentalEnabled, + attachmentId, + workflowId, + telemetry, + dispatch, + ]); const openAgentChat = useCallback( (options?: OpenAgentChatOptions) => { - if (!agentBuilder) { + if (!agentBuilder || !isExperimentalEnabled) { return; } @@ -288,12 +302,21 @@ export const useAgentBuilderIntegration = ({ chatOpenedReportedRef.current = true; } }, - [agentBuilder, editorRef, attachmentId, workflowId, workflowName, validationErrors, telemetry] + [ + agentBuilder, + isExperimentalEnabled, + editorRef, + attachmentId, + workflowId, + workflowName, + validationErrors, + telemetry, + ] ); return { openAgentChat, - isAgentBuilderAvailable: agentBuilder != null, + isAgentBuilderAvailable: agentBuilder != null && isExperimentalEnabled, proposalManager: proposalManagerRef.current, }; }; diff --git a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/workflow_yaml_editor.test.tsx b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/workflow_yaml_editor.test.tsx index 6169924223a96..14a90680bb048 100644 --- a/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/workflow_yaml_editor.test.tsx +++ b/src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/workflow_yaml_editor.test.tsx @@ -209,6 +209,14 @@ jest.mock('../lib/autocomplete/intercept_monaco_yaml_provider', () => ({ interceptMonacoYamlProvider: jest.fn(), })); +jest.mock('./hooks/use_agent_builder_integration', () => ({ + useAgentBuilderIntegration: jest.fn(() => ({ + openAgentChat: jest.fn(), + isAgentBuilderAvailable: false, + proposalManager: null, + })), +})); + jest.mock('@kbn/monaco', () => ({ monaco: { editor: { diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_connectors_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_connectors_tool.ts index 94da2b047ba06..2f48b5065c980 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_connectors_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_connectors_tool.ts @@ -8,7 +8,7 @@ */ import { ToolType } from '@kbn/agent-builder-common'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; import type { WorkflowsManagementApi } from '../../api/workflows_management_api'; @@ -45,7 +45,9 @@ The connector \`id\` is what you put in the \`connector-id\` field of a workflow tags: ['workflows', 'connectors'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_examples_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_examples_tool.ts index 79bc4cbfc78a2..c137c9b1950c1 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_examples_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_examples_tool.ts @@ -8,8 +8,8 @@ */ import { ToolType } from '@kbn/agent-builder-common'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { getWorkflowExamples, WORKFLOW_EXAMPLE_IDS } from '@kbn/workflows'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; import { loadWorkflowExampleContent } from '@kbn/workflows/server'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; @@ -45,7 +45,9 @@ Supports keyword search across names, descriptions, and tags.`, tags: ['workflows', 'yaml', 'examples'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_step_definitions_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_step_definitions_tool.ts index 3c6c6ccacaa18..228ea3bc0010c 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_step_definitions_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_step_definitions_tool.ts @@ -8,6 +8,7 @@ */ import { ToolType } from '@kbn/agent-builder-common'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import type { BaseStepDefinition, ConnectorContractUnion, StepParamSummary } from '@kbn/workflows'; import { buildBuiltInStepSchema, @@ -18,7 +19,6 @@ import { StepCategories, StepCategory, } from '@kbn/workflows'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; import { @@ -180,7 +180,9 @@ Set includeFullSchema=true to get the full JSON Schema for step input params (us tags: ['workflows', 'yaml', 'steps'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_trigger_definitions_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_trigger_definitions_tool.ts index 3f6b2506b873f..1f83e31f4338f 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_trigger_definitions_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_trigger_definitions_tool.ts @@ -8,8 +8,8 @@ */ import { ToolType } from '@kbn/agent-builder-common'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { AlertEventSchema, BaseEventSchema, builtInTriggerDefinitions } from '@kbn/workflows'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; import type { AgentBuilderPluginSetupContract } from '../../types'; @@ -89,7 +89,9 @@ Returns built-in trigger types (manual, scheduled, alert) including the event co tags: ['workflows', 'yaml', 'triggers'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_workflow_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_workflow_tool.ts index 7ffec8e3d1ada..c3ae85c5fd5be 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_workflow_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/get_workflow_tool.ts @@ -8,7 +8,7 @@ */ import { ToolType } from '@kbn/agent-builder-common'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; import type { WorkflowsManagementApi } from '../../api/workflows_management_api'; @@ -31,7 +31,9 @@ export function registerGetWorkflowTool( tags: ['workflows', 'yaml'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/list_workflows_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/list_workflows_tool.ts index bb67b362a6d02..a0d91a411919d 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/list_workflows_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/list_workflows_tool.ts @@ -8,7 +8,7 @@ */ import { ToolType } from '@kbn/agent-builder-common'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { z } from '@kbn/zod/v4'; import { workflowTools } from '../../../common/agent_builder/constants'; import type { WorkflowsManagementApi } from '../../api/workflows_management_api'; @@ -39,7 +39,9 @@ Returns workflow summaries: id, name, description, tags, enabled status.`, tags: ['workflows'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/validate_workflow_tool.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/validate_workflow_tool.ts index 27304dffe713a..c0123dcd3b976 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/validate_workflow_tool.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/validate_workflow_tool.ts @@ -8,9 +8,9 @@ */ import { ToolType } from '@kbn/agent-builder-common'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import type { ConnectorContractUnion } from '@kbn/workflows'; import { builtInStepDefinitions } from '@kbn/workflows'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; import { z } from '@kbn/zod/v4'; import type { StepDefinitionForAgent } from './get_step_definitions_tool'; import { @@ -101,7 +101,9 @@ If validation fails, fix the issues and re-validate until the YAML is valid.`, tags: ['workflows', 'yaml', 'validation'], availability: { handler: async ({ uiSettings }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get( + AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID + ); return isEnabled ? { status: 'available' } : { status: 'unavailable', reason: 'AI workflow authoring is disabled' }; diff --git a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/workflow_edit_tools.ts b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/workflow_edit_tools.ts index fc43c9fb60212..6cd28ff695ca0 100644 --- a/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/workflow_edit_tools.ts +++ b/src/platform/plugins/shared/workflows_management/server/agent_builder/tools/workflow_edit_tools.ts @@ -10,7 +10,7 @@ import { v4 } from 'uuid'; import { ToolType } from '@kbn/agent-builder-common'; import type { ToolHandlerContext } from '@kbn/agent-builder-server'; -import { WORKFLOWS_AI_AGENT_SETTING_ID } from '@kbn/workflows/common/constants'; +import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { z } from '@kbn/zod/v4'; import type { EditResult, StepDefinition } from './yaml_edit_utils'; import { @@ -33,7 +33,7 @@ import type { AgentBuilderPluginSetupContract } from '../../types'; const workflowEditAvailability = { handler: async ({ uiSettings }: { uiSettings: { get: (id: string) => Promise } }) => { - const isEnabled = await uiSettings.get(WORKFLOWS_AI_AGENT_SETTING_ID); + const isEnabled = await uiSettings.get(AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID); return isEnabled ? ({ status: 'available' } as const) : ({ status: 'unavailable', reason: 'AI workflow authoring is disabled' } as const); diff --git a/src/platform/plugins/shared/workflows_management/server/ui_settings.test.ts b/src/platform/plugins/shared/workflows_management/server/ui_settings.test.ts index dada0b5a4f401..ce0383b28cd9c 100644 --- a/src/platform/plugins/shared/workflows_management/server/ui_settings.test.ts +++ b/src/platform/plugins/shared/workflows_management/server/ui_settings.test.ts @@ -8,7 +8,7 @@ */ import { createCoreSetupMock } from '@kbn/core-lifecycle-server-mocks/src/core_setup.mock'; -import { WORKFLOWS_AI_AGENT_SETTING_ID, WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows'; import type { WorkflowsServerPluginSetupDeps } from './types'; import { registerUISettings } from './ui_settings'; @@ -33,16 +33,6 @@ describe('Workflows Management UI Settings', () => { requiresPageReload: true, category: expect.any(Array), }, - [WORKFLOWS_AI_AGENT_SETTING_ID]: { - description: expect.any(String), - name: expect.any(String), - schema: expect.any(Object), - value: false, - readonly: false, - technicalPreview: true, - requiresPageReload: true, - category: expect.any(Array), - }, }); }); @@ -60,9 +50,6 @@ describe('Workflows Management UI Settings', () => { [WORKFLOWS_UI_SETTING_ID]: expect.objectContaining({ description: expect.stringContaining('Requires enterprise license'), }), - [WORKFLOWS_AI_AGENT_SETTING_ID]: expect.objectContaining({ - description: expect.stringContaining('Requires enterprise license'), - }), }) ); }); @@ -75,9 +62,6 @@ describe('Workflows Management UI Settings', () => { [WORKFLOWS_UI_SETTING_ID]: expect.objectContaining({ description: expect.not.stringContaining('Requires enterprise license'), }), - [WORKFLOWS_AI_AGENT_SETTING_ID]: expect.objectContaining({ - description: expect.not.stringContaining('Requires enterprise license'), - }), }) ); }); diff --git a/src/platform/plugins/shared/workflows_management/server/ui_settings.ts b/src/platform/plugins/shared/workflows_management/server/ui_settings.ts index 753b742d9957b..59a0591f48db1 100644 --- a/src/platform/plugins/shared/workflows_management/server/ui_settings.ts +++ b/src/platform/plugins/shared/workflows_management/server/ui_settings.ts @@ -10,10 +10,7 @@ import { schema } from '@kbn/config-schema'; import type { CoreSetup } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { - WORKFLOWS_AI_AGENT_SETTING_ID, - WORKFLOWS_UI_SETTING_ID, -} from '@kbn/workflows/common/constants'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows/common/constants'; import type { WorkflowsServerPluginSetupDeps } from './types'; import { WORKFLOWS_DOCUMENTATION_URL } from '../common'; @@ -53,27 +50,5 @@ export const registerUISettings = ( requiresPageReload: true, category: ['general'], }, - [WORKFLOWS_AI_AGENT_SETTING_ID]: { - description: i18n.translate('workflowsManagement.uiSettings.aiAgent.description', { - defaultMessage: - 'Enables AI-powered workflow authoring experiences. {licenseText} {learnMoreLink}', - values: { - learnMoreLink: `${i18n.translate( - 'workflowsManagement.uiSettings.aiAgent.learnMore', - { defaultMessage: 'Learn more' } - )}.`, - licenseText, - }, - }), - name: i18n.translate('workflowsManagement.uiSettings.aiAgent.name', { - defaultMessage: 'Elastic Workflows: AI agent authoring', - }), - schema: schema.boolean(), - value: false, - readonly: false, - technicalPreview: true, - requiresPageReload: true, - category: ['general'], - }, }); }; diff --git a/src/platform/plugins/shared/workflows_management/test/scout_workflows_ui/ui/parallel_tests/workflow_editor/proposed_changes.spec.ts b/src/platform/plugins/shared/workflows_management/test/scout_workflows_ui/ui/parallel_tests/workflow_editor/proposed_changes.spec.ts index 405bf31edcb3d..9c6c32d6436eb 100644 --- a/src/platform/plugins/shared/workflows_management/test/scout_workflows_ui/ui/parallel_tests/workflow_editor/proposed_changes.spec.ts +++ b/src/platform/plugins/shared/workflows_management/test/scout_workflows_ui/ui/parallel_tests/workflow_editor/proposed_changes.spec.ts @@ -84,7 +84,6 @@ const ALL_STEPS_MODIFIED = INITIAL_YAML.replace( test.describe('Proposed changes accept and reject', { tag: [...tags.stateful.classic] }, () => { test.beforeAll(async ({ scoutSpace }) => { await scoutSpace.uiSettings.set({ - 'workflows:aiAgent:enabled': true, 'agentBuilder:experimentalFeatures': true, }); }); @@ -97,10 +96,7 @@ test.describe('Proposed changes accept and reject', { tag: [...tags.stateful.cla }); test.afterAll(async ({ scoutSpace, apiServices }) => { - await scoutSpace.uiSettings.unset( - 'workflows:aiAgent:enabled', - 'agentBuilder:experimentalFeatures' - ); + await scoutSpace.uiSettings.unset('agentBuilder:experimentalFeatures'); await cleanupWorkflowsAndRules({ scoutSpace, apiServices }); }); diff --git a/src/platform/plugins/shared/workflows_management/tsconfig.json b/src/platform/plugins/shared/workflows_management/tsconfig.json index 3defc4e83dc41..a5549a2c8f2ec 100644 --- a/src/platform/plugins/shared/workflows_management/tsconfig.json +++ b/src/platform/plugins/shared/workflows_management/tsconfig.json @@ -90,6 +90,7 @@ "@kbn/agent-builder-browser", "@kbn/share-plugin", "@kbn/core-security-server", + "@kbn/management-settings-ids" ], "exclude": ["target/**/*"] } 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 bcaa50f7d3275..87838546b5ec6 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 @@ -15,10 +15,7 @@ import type { import { AGENT_BUILDER_EXPERIMENTAL_FEATURES_SETTING_ID } from '@kbn/management-settings-ids'; import { SECURITY_PROJECT_SETTINGS } from '@kbn/serverless-security-settings'; -import { - WORKFLOWS_AI_AGENT_SETTING_ID, - WORKFLOWS_UI_SETTING_ID, -} from '@kbn/workflows/common/constants'; +import { WORKFLOWS_UI_SETTING_ID } from '@kbn/workflows/common/constants'; import { ENABLE_ALERTS_AND_ATTACKS_ALIGNMENT_SETTING } from '@kbn/security-solution-navigation'; import { ProductTier } from '../common/product'; import { getEnabledProductFeatures } from '../common/pli/pli_features'; @@ -109,8 +106,7 @@ export class SecuritySolutionServerlessPlugin (productType) => productType.product_tier !== ProductTier.essentials ) ) { - // WORKFLOWS_AI_AGENT_SETTING_ID only works when WORKFLOWS_UI_SETTING_ID is enabled - projectSettings.push(WORKFLOWS_UI_SETTING_ID, WORKFLOWS_AI_AGENT_SETTING_ID); + projectSettings.push(WORKFLOWS_UI_SETTING_ID); } // Agent Builder is only enabled for Security projects in complete and EASE (search_ai_lake) tiers.