diff --git a/x-pack/platform/plugins/shared/alerting_v2/README.md b/x-pack/platform/plugins/shared/alerting_v2/README.md index df751dcd97157..f33d68c9c13f3 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/README.md +++ b/x-pack/platform/plugins/shared/alerting_v2/README.md @@ -8,26 +8,26 @@ If you want the system architecture, read [`server/README.md`](server/README.md) If you want implementation detail for one subsystem, continue with: -| Area | Document | -| --- | --- | -| High-level plugin architecture | [`server/README.md`](server/README.md) | -| Rule execution pipeline | [`server/lib/rule_executor/README.md`](server/lib/rule_executor/README.md) | -| Alert lifecycle / episodes | [`server/lib/director/README.md`](server/lib/director/README.md) | -| Notification dispatch pipeline | [`server/lib/dispatcher/README.md`](server/lib/dispatcher/README.md) | -| Elasticsearch resources and schemas | [`server/resources/README.md`](server/resources/README.md) | +| Area | Document | +| ----------------------------------- | -------------------------------------------------------------------------- | +| High-level plugin architecture | [`server/README.md`](server/README.md) | +| Rule execution pipeline | [`server/lib/rule_executor/README.md`](server/lib/rule_executor/README.md) | +| Alert lifecycle / episodes | [`server/lib/director/README.md`](server/lib/director/README.md) | +| Notification dispatch pipeline | [`server/lib/dispatcher/README.md`](server/lib/dispatcher/README.md) | +| Elasticsearch resources and schemas | [`server/resources/README.md`](server/resources/README.md) | ## Repository guide -| Path | Purpose | -| --- | --- | -| `public/` | Management UI for rules, alerts/episodes, and notification policies. | -| `server/routes/` | HTTP APIs for rules, alert actions, notification policies, and suggestions. | -| `server/saved_objects/` | Persisted models and mappings for rules and notification policies. | -| `server/lib/rule_executor/` | Per-rule Task Manager execution pipeline. | -| `server/lib/director/` | Episode state engine for alert rules. | -| `server/lib/dispatcher/` | Asynchronous notification matching, throttling, and delivery. | -| `server/resources/` | Data streams and ES|QL views (`.rule-events`, `.alert-actions`, alert episode views). | -| `server/setup/` | Dependency injection, task registration, routes, and plugin startup wiring. | +| Path | Purpose | +| --------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `public/` | Management UI for rules, alerts/episodes, and notification policies. | +| `server/routes/` | HTTP APIs for rules, alert actions, notification policies, and suggestions. | +| `server/saved_objects/` | Persisted models and mappings for rules and notification policies. | +| `server/lib/rule_executor/` | Per-rule Task Manager execution pipeline. | +| `server/lib/director/` | Episode state engine for alert rules. | +| `server/lib/dispatcher/` | Asynchronous notification matching, throttling, and delivery. | +| `server/resources/` | Data streams and ES | QL views (`.rule-events`, `.alert-actions`, alert episode views). | +| `server/setup/` | Dependency injection, task registration, routes, and plugin startup wiring. | ## Quick mental model @@ -44,4 +44,6 @@ If you want implementation detail for one subsystem, continue with: - Notification matching, grouping, throttling, or delivery: start in [`server/lib/dispatcher/README.md`](server/lib/dispatcher/README.md) - Document shape or ES|QL views: start in [`server/resources/README.md`](server/resources/README.md) - API shape or saved object contracts: inspect `server/routes/` and `server/saved_objects/` together with the relevant subsystem docs -- Workflow triggers (workflows_extensions registration, server + public wiring): start in [`common/workflows_extensions/README.md`](common/workflows_extensions/README.md) +- Workflow triggers (workflows_extensions registration + runtime emission): see the public and server READMEs + - [`public/lib/workflow_extensions/README.md`](public/lib/workflow_extensions/README.md) + - [`server/lib/services/workflow_extensions_service/README.md`](server/lib/services/workflow_extensions_service/README.md) diff --git a/x-pack/platform/plugins/shared/alerting_v2/common/workflows_extensions/README.md b/x-pack/platform/plugins/shared/alerting_v2/common/workflows_extensions/README.md deleted file mode 100644 index c37bdd5ea92e6..0000000000000 --- a/x-pack/platform/plugins/shared/alerting_v2/common/workflows_extensions/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Alerting V2 workflows_extensions integration - -This document explains how to register workflow triggers in `alerting_v2` using the new wrapper services. - -## Architecture - -- `server/lib/services/workflow_extensions_service/workflow_extensions_service.ts` - - Wraps `WorkflowsExtensionsServerPluginSetup` and `WorkflowsExtensionsServerPluginStart`. - - Use `registerTriggerDefinitions(...)` and `registerStepDefinitions(...)` during setup. - - Use `emitEvent(...)` at runtime when you need to emit a trigger event. -- `public/services/workflow_extensions_service.ts` - - Wraps `WorkflowsExtensionsPublicPluginSetup`. - - Use `registerPublicTriggerDefinitions(...)` during public setup to register trigger UI metadata. -- `public/lib/workflow_extensions/register_trigger_definitions.ts` - - Exports `registerTriggerDefinitions(service)`; calls `registerPublicTriggerDefinitions([...])`. - -## Typical trigger setup flow - -1. Define a shared trigger definition in `common` (`id` + `eventSchema`) with Zod. -2. Register it on the server in `server/lib/workflow_extensions/register_trigger_definitions.ts` via `registerTriggerDefinitions(service)`, which calls `WorkflowExtensionsService.registerTriggerDefinitions(...)`. -3. Define a public trigger definition (`PublicTriggerDefinition`) with UI metadata (title, description, icon, docs). -4. Register it on the public side in `public/lib/workflow_extensions/register_trigger_definitions.ts` via `registerTriggerDefinitions(service)`. -5. Add/update the trigger schema hash in: - - `src/platform/plugins/shared/workflows_extensions/test/scout/api/fixtures/approved_trigger_definitions.ts` - -## Server usage - -`bind_on_setup.ts` calls `registerTriggerDefinitions(container.get(WorkflowExtensionsService))` from `server/lib/workflow_extensions/register_trigger_definitions.ts`. - -Add your `ServerTriggerDefinition` entries to the array inside that function. - -## Public usage - -`public/index.ts` calls `registerTriggerDefinitions(container.get(WorkflowExtensionsService))` from `public/lib/workflow_extensions/register_trigger_definitions.ts`. - -Add your `PublicTriggerDefinition` entries to the array inside that function. - -## Notes - -- Registration should happen in setup, not start. -- Keep server and public trigger IDs aligned. -- Public registration controls Workflows UI discoverability; server registration controls runtime validation/execution. diff --git a/x-pack/platform/plugins/shared/alerting_v2/public/index.ts b/x-pack/platform/plugins/shared/alerting_v2/public/index.ts index 78469bfc0cb1b..e65dd95fd00a5 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/public/index.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/public/index.ts @@ -16,6 +16,7 @@ import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import type { AgentBuilderPluginStart } from '@kbn/agent-builder-plugin/public'; +import type { WorkflowsExtensionsPublicPluginSetup } from '@kbn/workflows-extensions/public'; import { ALERTING_V2_SECTION_ID, ALERTING_V2_RULES_APP_ID, @@ -27,7 +28,6 @@ import { ALERTING_V2_EXPERIMENTAL_FEATURES_SETTING_ID } from '../common/advanced import { ActionPoliciesApi } from './services/action_policies_api'; import { RulesApi } from './services/rules_api'; import { WorkflowsApi } from './services/workflows_api'; -import { WorkflowExtensionsService } from './services/workflow_extensions_service'; import { registerTriggerDefinitions } from './lib/workflow_extensions/register_trigger_definitions'; import { setKibanaServices } from './kibana_services'; import { DynamicRuleFormFlyout } from './create_rule_form_flyout'; @@ -40,18 +40,16 @@ export const module = new ContainerModule(({ bind }) => { bind(RulesApi).toSelf().inSingletonScope(); bind(ActionPoliciesApi).toSelf().inSingletonScope(); bind(WorkflowsApi).toSelf().inSingletonScope(); - bind(WorkflowExtensionsService) - .toDynamicValue( - ({ get }) => new WorkflowExtensionsService(get(PluginSetup('workflowsExtensions'))) - ) - .inSingletonScope(); bind(Start).toConstantValue({ DynamicRuleFormFlyout, } satisfies AlertingV2PublicStart); bind(OnSetup).toConstantValue((container) => { const getStartServices = container.get(CoreSetup('getStartServices')); + const workflowsExtensionsSetup = container.get( + PluginSetup('workflowsExtensions') + ) as WorkflowsExtensionsPublicPluginSetup; - registerTriggerDefinitions(container.get(WorkflowExtensionsService)); + registerTriggerDefinitions(workflowsExtensionsSetup); getStartServices().then(([coreStart]) => { const diContainer = coreStart.injection.getContainer(); diff --git a/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/README.md b/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/README.md new file mode 100644 index 0000000000000..89d2269b69e2f --- /dev/null +++ b/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/README.md @@ -0,0 +1,40 @@ +# Alerting V2 — public workflow extensions + +This folder owns the **public-side (browser) registration** of `alerting_v2` workflow trigger UI metadata with the `workflows_extensions` plugin. + +## Why this exists separately from the server + +`workflows_extensions` exposes two contracts that need to be populated at setup time: + +- **Public setup contract** (`WorkflowsExtensionsPublicPluginSetup`) — UI metadata for the Workflows builder (title, description, icon, docs, snippets). This is what controls discoverability of a trigger in the Workflows UI. +- **Server setup contract** (`WorkflowsExtensionsServerPluginSetup`) — runtime validation/execution of triggers and steps. + +This README covers the **public** side. For the server side (where runtime emission also lives), see [`server/lib/services/workflow_extensions_service/README.md`](../../../server/lib/services/workflow_extensions_service/README.md). + +## Registering a new trigger + +Add public trigger definitions in [`register_trigger_definitions.ts`](register_trigger_definitions.ts). + +The helper receives the `workflowsExtensions` setup contract and registers every `PublicTriggerDefinition`: + +```ts +export function registerTriggerDefinitions( + workflowsExtensions: WorkflowsExtensionsPublicPluginSetup +): void { + const triggerDefinitions: PublicTriggerDefinition[] = [ + // Add trigger UI metadata here. + ]; + + for (const definition of triggerDefinitions) { + workflowsExtensions.registerTriggerDefinition(definition); + } +} +``` + +When adding a trigger: + +1. Define the shared trigger (`id` + Zod `eventSchema`) in `common/`. +2. Register it on the **server** via the server-side `registerTriggerDefinitions` helper (so the runtime validates and dispatches it). +3. Add the public `PublicTriggerDefinition` to this file's `triggerDefinitions` array. +4. Update the trigger schema hash fixture in `src/platform/plugins/shared/workflows_extensions/test/scout/api/fixtures/approved_trigger_definitions.ts`. +5. Keep the server and public trigger ids aligned. diff --git a/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/register_trigger_definitions.ts b/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/register_trigger_definitions.ts index a8ba884d0bc31..ded352023de50 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/register_trigger_definitions.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/public/lib/workflow_extensions/register_trigger_definitions.ts @@ -5,16 +5,23 @@ * 2.0. */ -import type { WorkflowExtensionsPublicServiceContract } from '../../services/workflow_extensions_service'; +import type { + PublicTriggerDefinition, + WorkflowsExtensionsPublicPluginSetup, +} from '@kbn/workflows-extensions/public'; /** * Registers all alerting-v2 public workflow trigger definitions (UI metadata). - * Call once during plugin setup with the resolved {@link WorkflowExtensionsService}. + * Call once during plugin setup with the `workflowsExtensions` setup contract. */ export function registerTriggerDefinitions( - workflowExtensionsService: WorkflowExtensionsPublicServiceContract + workflowsExtensions: WorkflowsExtensionsPublicPluginSetup ): void { - workflowExtensionsService.registerPublicTriggerDefinitions([ + const triggerDefinitions: PublicTriggerDefinition[] = [ // Add PublicTriggerDefinition entries here (spread common id + eventSchema + title, icon, docs). - ]); + ]; + + for (const definition of triggerDefinitions) { + workflowsExtensions.registerTriggerDefinition(definition); + } } diff --git a/x-pack/platform/plugins/shared/alerting_v2/public/services/workflow_extensions_service.ts b/x-pack/platform/plugins/shared/alerting_v2/public/services/workflow_extensions_service.ts deleted file mode 100644 index e21dba3d876eb..0000000000000 --- a/x-pack/platform/plugins/shared/alerting_v2/public/services/workflow_extensions_service.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { WorkflowsExtensionsPublicPluginSetup } from '@kbn/workflows-extensions/public'; -import type { PublicTriggerDefinition } from '@kbn/workflows-extensions/public'; - -export interface WorkflowExtensionsPublicServiceContract { - registerPublicTriggerDefinitions(triggerDefinitions: PublicTriggerDefinition[]): void; -} - -export class WorkflowExtensionsService implements WorkflowExtensionsPublicServiceContract { - constructor(private readonly workflowsExtensions: WorkflowsExtensionsPublicPluginSetup) {} - - public registerPublicTriggerDefinitions(triggerDefinitions: PublicTriggerDefinition[]): void { - triggerDefinitions.forEach((triggerDefinition) => - this.workflowsExtensions.registerTriggerDefinition(triggerDefinition) - ); - } -} diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/README.md b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/README.md new file mode 100644 index 0000000000000..80e88f592f162 --- /dev/null +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/README.md @@ -0,0 +1,65 @@ +# Alerting V2 server + +This README explains how `alerting_v2` integrates with `workflows_extensions` on the server: + +- Registering workflow triggers during setup. +- Emitting workflow trigger events at request time. + +For public trigger UI metadata, see [`public/lib/workflow_extensions/README.md`](../../../../public/lib/workflow_extensions/README.md). + +## Registering a new trigger + +Add server-side trigger definitions in [`server/lib/workflow_extensions/register_trigger_definitions.ts`](../../workflow_extensions/register_trigger_definitions.ts). + +The helper receives the `workflowsExtensions` setup contract and registers every `ServerTriggerDefinition`: + +```ts +export function registerTriggerDefinitions( + workflowsExtensions: WorkflowsExtensionsServerPluginSetup +): void { + const triggerDefinitions: ServerTriggerDefinition[] = [ + // Add trigger definitions here. + ]; + + for (const definition of triggerDefinitions) { + workflowsExtensions.registerTriggerDefinition(definition); + } +} +``` + +This helper is called from [`server/setup/bind_on_setup.ts`](../../../setup/bind_on_setup.ts) inside the `OnSetup` callback, so registration happens during plugin setup. + +When adding a trigger: + +1. Define the shared trigger id and event schema in `common/`. +2. Add the server `ServerTriggerDefinition` to `register_trigger_definitions.ts`. +3. Add the matching public `PublicTriggerDefinition` so the trigger appears in the Workflows UI. +4. Keep the server and public trigger ids aligned. + +## Emitting an event + +Runtime code should emit events through `WorkflowExtensionsService`. + +Inject `WorkflowExtensionsServiceToken` into a request-scoped service or consumer: + +```ts +@injectable() +class SomeRequestScopedConsumer { + constructor( + @inject(WorkflowExtensionsServiceToken) + private readonly workflowExtensions: WorkflowExtensionsServiceContract + ) {} + + async run() { + await this.workflowExtensions.emitEvent('alerting_v2.some-trigger', { ruleId: '…' }); + } +} +``` + +The service exposes a single method: + +```ts +emitEvent(triggerId: string, payload: Record): Promise +``` + +The service uses a request-scoped `WorkflowsClient`, so emitted events include the current request auth context. diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/tokens.ts b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/tokens.ts index 398a706688501..f8c2c88a047f8 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/tokens.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/tokens.ts @@ -6,8 +6,13 @@ */ import type { ServiceIdentifier } from 'inversify'; +import type { WorkflowsClient } from '@kbn/workflows/server/types'; import type { WorkflowExtensionsServiceContract } from './workflow_extensions_service'; export const WorkflowExtensionsServiceToken = Symbol.for( 'alerting_v2.WorkflowExtensionsService' ) as ServiceIdentifier; + +export const WorkflowsClientToken = Symbol.for( + 'alerting_v2.WorkflowsClient' +) as ServiceIdentifier; diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.test.ts b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.test.ts index 43280ddf41b86..b0217e1a4a020 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.test.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.test.ts @@ -5,54 +5,24 @@ * 2.0. */ -import { z } from '@kbn/zod/v4'; import { httpServerMock } from '@kbn/core-http-server-mocks'; import { workflowsExtensionsMock } from '@kbn/workflows-extensions/server/mocks'; import { WorkflowExtensionsService } from './workflow_extensions_service'; -function createService() { - const setup = workflowsExtensionsMock.createSetup(); - const start = workflowsExtensionsMock.createStart(); - const service = new WorkflowExtensionsService(setup, () => start); - return { service, setup, start }; -} - describe('WorkflowExtensionsService', () => { - it('registerTriggerDefinitions delegates to workflows extensions setup', () => { - const { service, setup } = createService(); - const triggerDefinition = { - id: 'alerting-v2-unit-test.trigger' as const, - eventSchema: z.object({ key: z.string() }), - }; - - service.registerTriggerDefinitions([triggerDefinition]); - - expect(setup.registerTriggerDefinition).toHaveBeenCalledTimes(1); - expect(setup.registerTriggerDefinition).toHaveBeenCalledWith(triggerDefinition); - }); - - it('registerStepDefinitions delegates to workflows extensions setup', () => { - const { service, setup } = createService(); - const stepLoader = () => Promise.resolve(undefined); - - service.registerStepDefinitions([stepLoader]); - - expect(setup.registerStepDefinition).toHaveBeenCalledTimes(1); - expect(setup.registerStepDefinition).toHaveBeenCalledWith(stepLoader); - }); - - it('emitEvent resolves the workflows client and delegates emitEvent', async () => { - const { service, start } = createService(); + it('emitEvent delegates to the injected workflows client', async () => { + const start = workflowsExtensionsMock.createStart(); const emitEvent = jest.fn().mockResolvedValue(undefined); start.getClient.mockResolvedValue({ isWorkflowsAvailable: true, emitEvent, }); - const request = httpServerMock.createKibanaRequest(); - await service.emitEvent(request, 'some.trigger', { a: 1 }); + const client = await start.getClient(httpServerMock.createKibanaRequest()); + const service = new WorkflowExtensionsService(client); + + await service.emitEvent('some.trigger', { a: 1 }); - expect(start.getClient).toHaveBeenCalledWith(request); expect(emitEvent).toHaveBeenCalledWith('some.trigger', { a: 1 }); }); }); diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.ts b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.ts index 995ca5f4d95c9..2117dd44b08c6 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/services/workflow_extensions_service/workflow_extensions_service.ts @@ -5,55 +5,19 @@ * 2.0. */ -import type { KibanaRequest } from '@kbn/core/server'; -import type { - WorkflowsExtensionsServerPluginSetup, - WorkflowsExtensionsServerPluginStart, - ServerTriggerDefinition, -} from '@kbn/workflows-extensions/server'; - -type ServerStepDefinitionOrLoader = Parameters< - WorkflowsExtensionsServerPluginSetup['registerStepDefinition'] ->[0]; +import { inject, injectable } from 'inversify'; +import type { WorkflowsClient } from '@kbn/workflows/server/types'; +import { WorkflowsClientToken } from './tokens'; export interface WorkflowExtensionsServiceContract { - /** - * Registers all alerting-v2-owned workflow triggers and steps. Call once during - * plugin setup (see bind_on_setup). - */ - registerTriggerDefinitions(triggerDefinitions: ServerTriggerDefinition[]): void; - registerStepDefinitions(stepDefintions: ServerStepDefinitionOrLoader[]): void; - emitEvent( - request: KibanaRequest, - triggerId: string, - payload: Record - ): Promise; + emitEvent(triggerId: string, payload: Record): Promise; } +@injectable() export class WorkflowExtensionsService implements WorkflowExtensionsServiceContract { - constructor( - private readonly workflowsExtensionsSetup: WorkflowsExtensionsServerPluginSetup, - private readonly getWorkflowsExtensionsStart: () => WorkflowsExtensionsServerPluginStart - ) {} - - public registerStepDefinitions(stepDefintions: ServerStepDefinitionOrLoader[]): void { - stepDefintions.forEach((stepDefinition) => - this.workflowsExtensionsSetup.registerStepDefinition(stepDefinition) - ); - } - - public registerTriggerDefinitions(triggerDefinitions: ServerTriggerDefinition[]): void { - triggerDefinitions.forEach((triggerDefinition) => - this.workflowsExtensionsSetup.registerTriggerDefinition(triggerDefinition) - ); - } + constructor(@inject(WorkflowsClientToken) private readonly client: WorkflowsClient) {} - public async emitEvent( - request: KibanaRequest, - triggerId: string, - payload: Record - ): Promise { - const client = await this.getWorkflowsExtensionsStart().getClient(request); - await client.emitEvent(triggerId, payload); + public async emitEvent(triggerId: string, payload: Record): Promise { + await this.client.emitEvent(triggerId, payload); } } diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_step_definitions.ts b/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_step_definitions.ts new file mode 100644 index 0000000000000..9f0bc8cc399cf --- /dev/null +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_step_definitions.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { WorkflowsExtensionsServerPluginSetup } from '@kbn/workflows-extensions/server'; + +type ServerStepDefinitionOrLoader = Parameters< + WorkflowsExtensionsServerPluginSetup['registerStepDefinition'] +>[0]; + +/** + * Registers all alerting-v2 server-side workflow step definitions. + * Called once during plugin setup. + */ +export function registerStepDefinitions( + workflowsExtensions: WorkflowsExtensionsServerPluginSetup +): void { + const stepDefinitions: ServerStepDefinitionOrLoader[] = [ + // Add ServerStepDefinition or loader entries here. + ]; + + for (const definition of stepDefinitions) { + workflowsExtensions.registerStepDefinition(definition); + } +} diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_trigger_definitions.ts b/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_trigger_definitions.ts index 7461468353dc2..777b7326c4e9e 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_trigger_definitions.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/lib/workflow_extensions/register_trigger_definitions.ts @@ -5,16 +5,23 @@ * 2.0. */ -import type { WorkflowExtensionsServiceContract } from '../services/workflow_extensions_service/workflow_extensions_service'; +import type { + ServerTriggerDefinition, + WorkflowsExtensionsServerPluginSetup, +} from '@kbn/workflows-extensions/server'; /** * Registers all alerting-v2 server-side workflow trigger definitions. - * Call once during plugin setup with the resolved {@link WorkflowExtensionsService}. + * Call once during plugin setup . */ export function registerTriggerDefinitions( - workflowExtensionsService: WorkflowExtensionsServiceContract + workflowsExtensions: WorkflowsExtensionsServerPluginSetup ): void { - workflowExtensionsService.registerTriggerDefinitions([ + const triggerDefinitions: ServerTriggerDefinition[] = [ // Add CommonTriggerDefinition-backed entries here (import from common when added). - ]); + ]; + + for (const definition of triggerDefinitions) { + workflowsExtensions.registerTriggerDefinition(definition); + } } diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_on_setup.ts b/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_on_setup.ts index 9c6ec1124d5db..8dd29cd72e343 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_on_setup.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_on_setup.ts @@ -23,7 +23,7 @@ import { createRuleSmlType } from '../agent_builder/sml/rule_sml_type'; import { registerSkills } from '../agent_builder/skills/register_skills'; import { RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; import { EventLoggerToken } from '../lib/services/event_log_service/tokens'; -import { WorkflowExtensionsService } from '../lib/services/workflow_extensions_service/workflow_extensions_service'; +import { registerStepDefinitions } from '../lib/workflow_extensions/register_step_definitions'; import { registerTriggerDefinitions } from '../lib/workflow_extensions/register_trigger_definitions'; import { ACTION_POLICY_EVENT_ACTIONS, @@ -73,7 +73,11 @@ export function bindOnSetup({ bind }: ContainerModuleLoadOptions) { }); container.bind(EventLoggerToken).toConstantValue(eventLogger); - registerTriggerDefinitions(container.get(WorkflowExtensionsService)); + const workflowsExtensionsSetup = container.get( + PluginSetup('workflowsExtensions') + ); + registerTriggerDefinitions(workflowsExtensionsSetup); + registerStepDefinitions(workflowsExtensionsSetup); // Trigger task registration via onActivation callbacks container.getAll(TaskDefinition); diff --git a/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_services.ts b/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_services.ts index fefd5e6d9c090..bd157009a941c 100644 --- a/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_services.ts +++ b/x-pack/platform/plugins/shared/alerting_v2/server/setup/bind_services.ts @@ -61,7 +61,10 @@ import { } from '../lib/services/task_run_scope_service/create_task_runner'; import { UserService } from '../lib/services/user_service/user_service'; import { WorkflowExtensionsService } from '../lib/services/workflow_extensions_service/workflow_extensions_service'; -import { WorkflowExtensionsServiceToken } from '../lib/services/workflow_extensions_service/tokens'; +import { + WorkflowExtensionsServiceToken, + WorkflowsClientToken, +} from '../lib/services/workflow_extensions_service/tokens'; import { ApiKeyServiceSavedObjectsClientToken } from '../lib/services/api_key_service/tokens'; import { API_KEY_PENDING_INVALIDATION_TYPE, @@ -133,18 +136,16 @@ export function bindServices({ bind }: ContainerModuleLoadOptions) { bind(LoggerServiceToken).toService(LoggerService); bind(EventLogService).toSelf().inSingletonScope(); bind(EventLogServiceToken).toService(EventLogService); - bind(WorkflowExtensionsService) - .toDynamicValue(({ get }) => { - const workflowsExtensionsSetup = get( - PluginSetup('workflowsExtensions') - ); - const getWorkflowsExtensionsStart = () => - get( - PluginStart('workflowsExtensions') - ); - return new WorkflowExtensionsService(workflowsExtensionsSetup, getWorkflowsExtensionsStart); - }) - .inSingletonScope(); + bind(WorkflowsClientToken) + .toResolvedValue( + async (workflowsExtensionsStart, request) => workflowsExtensionsStart.getClient(request), + [ + PluginStart('workflowsExtensions'), + Request, + ] + ) + .inRequestScope(); + bind(WorkflowExtensionsService).toSelf().inRequestScope(); bind(WorkflowExtensionsServiceToken).toService(WorkflowExtensionsService); bind(ResourceManager).toSelf().inSingletonScope();