From 14f2d95fd06d208aff2f51bbcab572ebd3c6186a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 22 Apr 2024 09:48:47 +0200
Subject: [PATCH 001/183] Update dependency elastic-apm-node to ^4.5.2 (main)
(#181241)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [elastic-apm-node](https://togithub.com/elastic/apm-agent-nodejs) |
[`^4.5.0` ->
`^4.5.2`](https://renovatebot.com/diffs/npm/elastic-apm-node/4.5.0/4.5.2)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/elastic-apm-node/4.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/elastic-apm-node/4.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/elastic-apm-node/4.5.0/4.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/elastic-apm-node/4.5.0/4.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
elastic/apm-agent-nodejs (elastic-apm-node)
###
[`v4.5.2`](https://togithub.com/elastic/apm-agent-nodejs/releases/tag/v4.5.2)
[Compare
Source](https://togithub.com/elastic/apm-agent-nodejs/compare/v4.5.0...v4.5.2)
For more information, please see the
[changelog](https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes-4.x.html#release-notes-4.5.2).
##### Elastic APM Node.js agent layer ARNs
|Region|ARN|
|------|---|
|af-south-1|arn:aws:lambda:af-south-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-east-1|arn:aws:lambda:ap-east-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-northeast-1|arn:aws:lambda:ap-northeast-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-northeast-2|arn:aws:lambda:ap-northeast-2:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-northeast-3|arn:aws:lambda:ap-northeast-3:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-south-1|arn:aws:lambda:ap-south-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-southeast-1|arn:aws:lambda:ap-southeast-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-southeast-2|arn:aws:lambda:ap-southeast-2:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ap-southeast-3|arn:aws:lambda:ap-southeast-3:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|ca-central-1|arn:aws:lambda:ca-central-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-central-1|arn:aws:lambda:eu-central-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-north-1|arn:aws:lambda:eu-north-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-south-1|arn:aws:lambda:eu-south-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-west-1|arn:aws:lambda:eu-west-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-west-2|arn:aws:lambda:eu-west-2:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|eu-west-3|arn:aws:lambda:eu-west-3:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|me-south-1|arn:aws:lambda:me-south-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|sa-east-1|arn:aws:lambda:sa-east-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|us-east-1|arn:aws:lambda:us-east-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|us-east-2|arn:aws:lambda:us-east-2:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|us-west-1|arn:aws:lambda:us-west-1:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
|us-west-2|arn:aws:lambda:us-west-2:267093732750:layer:elastic-apm-node-ver-4-5-2:1|
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/elastic/kibana).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package.json b/package.json
index 50926c34539d4..06040e5681c0b 100644
--- a/package.json
+++ b/package.json
@@ -983,7 +983,7 @@
"deepmerge": "^4.2.2",
"del": "^6.1.0",
"diff": "^5.1.0",
- "elastic-apm-node": "^4.5.0",
+ "elastic-apm-node": "^4.5.2",
"email-addresses": "^5.0.0",
"eventsource-parser": "^1.1.1",
"execa": "^5.1.1",
diff --git a/yarn.lock b/yarn.lock
index 290f304922ce1..8cc252b3258d0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15923,10 +15923,10 @@ elastic-apm-node@3.46.0:
traverse "^0.6.6"
unicode-byte-truncate "^1.0.0"
-elastic-apm-node@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.5.0.tgz#9ee75189ac4bd919d432c6c1457c8cb2ef0b3903"
- integrity sha512-doIe7VPdCRgbFjEdswQvHj1Puem8L2pDFEdeUuT7CX3Xr3+gbOvgQGV7s742dJWgO2l0nSekvdgc7UBaPvOb6A==
+elastic-apm-node@^4.5.2:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.5.2.tgz#7c4a9d77a891302f16e988a6ff4ade5563e805ec"
+ integrity sha512-m4hvI/1MpVlR5B8k6BOU7WzdFOXjYux/iRso6av6qqJhYKSbHKhF93ncatw4nXU1q88tu31gwB9CzA2/6F4hFQ==
dependencies:
"@elastic/ecs-pino-format" "^1.5.0"
"@opentelemetry/api" "^1.4.1"
From be1248ac98c154fee230d621d22d5af36df20318 Mon Sep 17 00:00:00 2001
From: Dima Arnautov
Date: Mon, 22 Apr 2024 09:49:57 +0200
Subject: [PATCH 002/183] [ML] Enable transform health rule API tests
(#181147)
## Summary
Closes https://github.com/elastic/kibana/issues/177215
### Checklist
- [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] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
---
.../transform_rule_types/transform_health/rule.ts | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts
index 76b3a37e7b7ab..a46360b40259b 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts
@@ -80,8 +80,7 @@ export default function ruleTests({ getService }: FtrProviderContext) {
`.internal.alerts-transform.health.alerts-default-000001`
);
- // FLAKY: https://github.com/elastic/kibana/issues/177215
- describe.skip('rule', async () => {
+ describe('rule', async () => {
const objectRemover = new ObjectRemover(supertest);
let connectorId: string;
const transformId = 'test_transform_01';
@@ -134,9 +133,12 @@ export default function ruleTests({ getService }: FtrProviderContext) {
const aadDocs = await getAllAADDocs(1);
const alertDoc = aadDocs.body.hits.hits[0]._source;
expect(alertDoc[ALERT_REASON]).to.be(`Transform test_transform_01 is not started.`);
- expect(alertDoc[TRANSFORM_HEALTH_RESULTS]).to.eql([
- { transform_id: 'test_transform_01', transform_state: 'stopped', health_status: 'green' },
- ]);
+
+ const transformHealthResult = alertDoc[TRANSFORM_HEALTH_RESULTS][0];
+ expect(transformHealthResult.transform_id).to.be('test_transform_01');
+ expect(transformHealthResult.transform_state).to.match(/stopped|stopping/);
+ expect(transformHealthResult.health_status).to.be('green');
+
expect(alertDoc[ALERT_RULE_CATEGORY]).to.be(`Transform health`);
expect(alertDoc[ALERT_RULE_NAME]).to.be(`Test all transforms`);
expect(alertDoc[ALERT_RULE_TYPE_ID]).to.be(`transform_health`);
From 0682fd3ef4b1bd62d1dbb660b91a6d0b282042c6 Mon Sep 17 00:00:00 2001
From: Liam Thompson <32779855+leemthompo@users.noreply.github.com>
Date: Mon, 22 Apr 2024 10:16:52 +0200
Subject: [PATCH 003/183] [DOCS] Create stub page for Playground (#181266)
This PR creates a hidden page for use in the Kibana doc link service.
The URL can subsequently be turned into a full page.
---
docs/redirects.asciidoc | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc
index be017fbd1c94e..007a9d9f48cfc 100644
--- a/docs/redirects.asciidoc
+++ b/docs/redirects.asciidoc
@@ -432,4 +432,9 @@ This connector was renamed. Refer to <>.
== APIs
For the most up-to-date API details, refer to the
-{kib-repo}/tree/{branch}/x-pack/plugins/alerting/docs/openapi[alerting], {kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[cases], {kib-repo}/tree/{branch}/x-pack/plugins/actions/docs/openapi[connectors], and {kib-repo}/tree/{branch}/x-pack/plugins/ml/common/openapi[machine learning] open API specifications.
\ No newline at end of file
+{kib-repo}/tree/{branch}/x-pack/plugins/alerting/docs/openapi[alerting], {kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[cases], {kib-repo}/tree/{branch}/x-pack/plugins/actions/docs/openapi[connectors], and {kib-repo}/tree/{branch}/x-pack/plugins/ml/common/openapi[machine learning] open API specifications.
+
+[role="exclude",id="playground"]
+== Playground
+
+Coming in 8.14.0.
\ No newline at end of file
From d5c1335f78a0b578092d5e435308f028d4a7feed Mon Sep 17 00:00:00 2001
From: Christos Nasikas
Date: Mon, 22 Apr 2024 12:21:00 +0300
Subject: [PATCH 004/183] [Cases] Fix `useGetCases` flaky test (#181254)
## Summary
Following @JiaweiWu advice I replaced `waitForNextUpdate` with
`waitFor`.
Fix: https://github.com/elastic/kibana/issues/178163
### Checklist
Delete any items that are not applicable to this PR.
- [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
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../public/containers/use_get_cases.test.tsx | 48 +++++++++++--------
1 file changed, 28 insertions(+), 20 deletions(-)
diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx
index dd3ee856ba50c..53900a6920f20 100644
--- a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx
+++ b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx
@@ -17,8 +17,7 @@ import { OWNERS } from '../../common/constants';
jest.mock('./api');
jest.mock('../common/lib/kibana/hooks');
-// FLAKY: https://github.com/elastic/kibana/issues/178163
-describe.skip('useGetCases', () => {
+describe('useGetCases', () => {
const abortCtrl = new AbortController();
const addSuccess = jest.fn();
(useToasts as jest.Mock).mockReturnValue({ addSuccess, addError: jest.fn() });
@@ -32,11 +31,14 @@ describe.skip('useGetCases', () => {
it('calls getCases with correct arguments', async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
- const { waitForNextUpdate } = renderHook(() => useGetCases(), {
+ const { waitFor } = renderHook(() => useGetCases(), {
wrapper: appMockRender.AppWrapper,
});
- await waitForNextUpdate();
+ await waitFor(() => {
+ expect(spyOnGetCases).toBeCalled();
+ });
+
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS, owner: ['securitySolution'] },
queryParams: DEFAULT_QUERY_PARAMS,
@@ -53,12 +55,13 @@ describe.skip('useGetCases', () => {
const addError = jest.fn();
(useToasts as jest.Mock).mockReturnValue({ addSuccess, addError });
- const { waitForNextUpdate } = renderHook(() => useGetCases(), {
+ const { waitFor } = renderHook(() => useGetCases(), {
wrapper: appMockRender.AppWrapper,
});
- await waitForNextUpdate();
- expect(addError).toHaveBeenCalled();
+ await waitFor(() => {
+ expect(addError).toHaveBeenCalled();
+ });
});
it('should set all owners when no owner is provided', async () => {
@@ -87,11 +90,13 @@ describe.skip('useGetCases', () => {
};
const spyOnGetCases = jest.spyOn(api, 'getCases');
- const { waitForNextUpdate } = renderHook(() => useGetCases(), {
+ const { waitFor } = renderHook(() => useGetCases(), {
wrapper: appMockRender.AppWrapper,
});
- await waitForNextUpdate();
+ await waitFor(() => {
+ expect(spyOnGetCases).toHaveBeenCalled();
+ });
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS, owner: [...OWNERS] },
@@ -104,11 +109,13 @@ describe.skip('useGetCases', () => {
appMockRender = createAppMockRenderer({ owner: [] });
const spyOnGetCases = jest.spyOn(api, 'getCases');
- const { waitForNextUpdate } = renderHook(() => useGetCases(), {
+ const { waitFor } = renderHook(() => useGetCases(), {
wrapper: appMockRender.AppWrapper,
});
- await waitForNextUpdate();
+ await waitFor(() => {
+ expect(spyOnGetCases).toHaveBeenCalled();
+ });
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS, owner: ['cases'] },
@@ -121,11 +128,13 @@ describe.skip('useGetCases', () => {
appMockRender = createAppMockRenderer({ owner: ['observability'] });
const spyOnGetCases = jest.spyOn(api, 'getCases');
- const { waitForNextUpdate } = renderHook(() => useGetCases(), {
+ const { waitFor } = renderHook(() => useGetCases(), {
wrapper: appMockRender.AppWrapper,
});
- await waitForNextUpdate();
+ await waitFor(() => {
+ expect(spyOnGetCases).toHaveBeenCalled();
+ });
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS, owner: ['observability'] },
@@ -138,14 +147,13 @@ describe.skip('useGetCases', () => {
appMockRender = createAppMockRenderer({ owner: ['observability'] });
const spyOnGetCases = jest.spyOn(api, 'getCases');
- const { waitForNextUpdate } = renderHook(
- () => useGetCases({ filterOptions: { owner: ['my-owner'] } }),
- {
- wrapper: appMockRender.AppWrapper,
- }
- );
+ const { waitFor } = renderHook(() => useGetCases({ filterOptions: { owner: ['my-owner'] } }), {
+ wrapper: appMockRender.AppWrapper,
+ });
- await waitForNextUpdate();
+ await waitFor(() => {
+ expect(spyOnGetCases).toHaveBeenCalled();
+ });
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS, owner: ['my-owner'] },
From dd6483732de454d0940506f969a7aedb3ee4520c Mon Sep 17 00:00:00 2001
From: Antonio
Date: Mon, 22 Apr 2024 11:44:54 +0200
Subject: [PATCH 005/183] [Cases] Fix failing tests: `SuggestUsersPopover`
(#181051)
Fixes #171600
Fixes #171601
## Summary
I refactored the tests to follow a few best practices:
- Replaced all occurrences of `waitFor(() => screen.getBy...` with
`await screen.findBy`.
- Replaces `fireEvent` with `userEvent`.
- Refactored multiple instances where we did the same query multiple
times in the same test.
This at least made the warnings go away from the test suite.
There is still a `for` loop around the tests to check for flakiness.
---
.../components/suggest_users_popover.test.tsx | 97 ++++++++-----------
1 file changed, 38 insertions(+), 59 deletions(-)
diff --git a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx
index d84675d8e7883..147aeddbfe53d 100644
--- a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx
+++ b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx
@@ -8,7 +8,9 @@
import React from 'react';
import type { AppMockRenderer } from '../../../common/mock';
import { createAppMockRenderer } from '../../../common/mock';
-import { screen, fireEvent, waitFor } from '@testing-library/react';
+import { screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+
import type { SuggestUsersPopoverProps } from './suggest_users_popover';
import { SuggestUsersPopover } from './suggest_users_popover';
import { userProfiles } from '../../../containers/user_profiles/api.mock';
@@ -18,24 +20,25 @@ import type { AssigneeWithProfile } from '../../user_profiles/types';
jest.mock('../../../containers/user_profiles/api');
-// FLAKY: https://github.com/elastic/kibana/issues/171600
-// FLAKY: https://github.com/elastic/kibana/issues/171601
-describe.skip('SuggestUsersPopover', () => {
+const asAssignee = (profile: UserProfileWithAvatar): AssigneeWithProfile => ({
+ uid: profile.uid,
+ profile,
+});
+
+describe('SuggestUsersPopover', () => {
let appMockRender: AppMockRenderer;
- let defaultProps: SuggestUsersPopoverProps;
+ const defaultProps: SuggestUsersPopoverProps = {
+ isLoading: false,
+ assignedUsersWithProfiles: [],
+ isPopoverOpen: true,
+ onUsersChange: jest.fn(),
+ togglePopover: jest.fn(),
+ onClosePopover: jest.fn(),
+ currentUserProfile: undefined,
+ };
beforeEach(() => {
appMockRender = createAppMockRenderer();
-
- defaultProps = {
- isLoading: false,
- assignedUsersWithProfiles: [],
- isPopoverOpen: true,
- onUsersChange: jest.fn(),
- togglePopover: jest.fn(),
- onClosePopover: jest.fn(),
- currentUserProfile: undefined,
- };
});
it('calls onUsersChange when 1 user is selected', async () => {
@@ -45,13 +48,8 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- fireEvent.change(screen.getByPlaceholderText('Search users'), { target: { value: 'dingo' } });
-
- await waitFor(() => {
- expect(screen.getByText('WD')).toBeInTheDocument();
- });
-
- fireEvent.click(screen.getByText('WD'));
+ userEvent.paste(await screen.findByPlaceholderText('Search users'), 'dingo');
+ userEvent.click(await screen.findByText('WD'));
expect(onUsersChange.mock.calls[0][0]).toMatchInlineSnapshot(`
Array [
@@ -76,15 +74,9 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- fireEvent.change(screen.getByPlaceholderText('Search users'), { target: { value: 'elastic' } });
-
- await waitFor(() => {
- expect(screen.getByText('WD')).toBeInTheDocument();
- expect(screen.getByText('DR')).toBeInTheDocument();
- });
-
- fireEvent.click(screen.getByText('WD'));
- fireEvent.click(screen.getByText('DR'));
+ userEvent.paste(await screen.findByPlaceholderText('Search users'), 'elastic');
+ userEvent.click(await screen.findByText('WD'));
+ userEvent.click(await screen.findByText('DR'));
expect(onUsersChange.mock.calls[1][0]).toMatchInlineSnapshot(`
Array [
@@ -124,13 +116,8 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- fireEvent.change(screen.getByPlaceholderText('Search users'), { target: { value: 'elastic' } });
-
- await waitFor(() => {
- expect(screen.getByText('WD')).toBeInTheDocument();
- });
-
- fireEvent.click(screen.getByText('WD'));
+ userEvent.paste(await screen.findByPlaceholderText('Search users'), 'elastic');
+ userEvent.click(await screen.findByText('WD'));
expect(onUsersChange.mock.calls[0][0]).toMatchInlineSnapshot(`
Array [
@@ -174,14 +161,11 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
expect(screen.queryByText('assigned')).not.toBeInTheDocument();
- fireEvent.change(screen.getByPlaceholderText('Search users'), { target: { value: 'dingo' } });
- await waitFor(() => {
- expect(screen.getByText('WD')).toBeInTheDocument();
- });
+ userEvent.paste(await screen.findByPlaceholderText('Search users'), 'dingo');
+ userEvent.click(await screen.findByText('WD'));
- fireEvent.click(screen.getByText('WD'));
- expect(screen.getByText('1 assigned')).toBeInTheDocument();
+ expect(await screen.findByText('1 assigned')).toBeInTheDocument();
});
it('shows the 1 assigned total after clicking on a user', async () => {
@@ -190,9 +174,11 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
expect(screen.queryByText('assigned')).not.toBeInTheDocument();
- fireEvent.change(screen.getByPlaceholderText('Search users'), { target: { value: 'dingo' } });
- fireEvent.click(screen.getByText('WD'));
- expect(screen.getByText('1 assigned')).toBeInTheDocument();
+
+ userEvent.paste(await screen.findByPlaceholderText('Search users'), 'dingo');
+ userEvent.click(await screen.findByText('WD'));
+
+ expect(await screen.findByText('1 assigned')).toBeInTheDocument();
});
it('shows the 1 assigned total when the users are passed in', async () => {
@@ -204,8 +190,8 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- expect(screen.getByText('1 assigned')).toBeInTheDocument();
- expect(screen.getByText('Damaged Raccoon')).toBeInTheDocument();
+ expect(await screen.findByText('1 assigned')).toBeInTheDocument();
+ expect(await screen.findByText('Damaged Raccoon')).toBeInTheDocument();
});
it('calls onTogglePopover when clicking the edit button after the popover is already open', async () => {
@@ -218,11 +204,9 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- await waitFor(() => {
- expect(screen.getByTestId('case-view-assignees-edit-button')).not.toBeDisabled();
- });
+ expect(await screen.findByTestId('case-view-assignees-edit-button')).not.toBeDisabled();
- fireEvent.click(screen.getByTestId('case-view-assignees-edit-button'));
+ userEvent.click(await screen.findByTestId('case-view-assignees-edit-button'));
expect(togglePopover).toBeCalled();
});
@@ -232,11 +216,6 @@ describe.skip('SuggestUsersPopover', () => {
await waitForEuiPopoverOpen();
- await waitFor(() => expect(screen.getByText('Damaged Raccoon')).toBeInTheDocument());
+ expect(await screen.findByText('Damaged Raccoon')).toBeInTheDocument();
});
});
-
-const asAssignee = (profile: UserProfileWithAvatar): AssigneeWithProfile => ({
- uid: profile.uid,
- profile,
-});
From 5b40e10120cadfb50cccc3532d41ab300bc661d6 Mon Sep 17 00:00:00 2001
From: Ash <1849116+ashokaditya@users.noreply.github.com>
Date: Mon, 22 Apr 2024 11:52:09 +0200
Subject: [PATCH 006/183] [8.14][Security Solutions][Endpoint] Update test
dependencies after beats consolidation in 8.14 (#181265)
## Summary
As of 8.14 auditbeat, filebeat, heartbeat, metricbeat, osquerybeat, and
packetbeat have been combined into a single agentbeat. The test that
depended on filebeat earlier now uses this new beats filename.
closes elastic/kibana/issues/170370
### Checklist
- [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
---
.../response_console/process_operations.cy.ts | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
index c7120ded692b9..f7c70ebf8c7e9 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
@@ -24,6 +24,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy';
import { createEndpointHost } from '../../../tasks/create_endpoint_host';
import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data';
+const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat';
+
describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
@@ -80,7 +82,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
});
cy.get('tbody > tr').should('have.length.greaterThan', 0);
- cy.get('tbody > tr > td').should('contain', '/components/filebeat');
+ cy.get('tbody > tr > td').should('contain', AGENT_BEAT_FILE_PATH_SUFFIX);
});
});
@@ -89,7 +91,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
openResponseConsoleFromEndpointList();
// get running processes
- getRunningProcesses('/components/filebeat').then((pid) => {
+ getRunningProcesses(AGENT_BEAT_FILE_PATH_SUFFIX).then((pid) => {
// kill the process using PID
inputConsoleCommand(`kill-process --pid ${pid}`);
submitCommand();
@@ -102,7 +104,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
openResponseConsoleFromEndpointList();
// get running processes
- getRunningProcesses('/components/filebeat').then((pid) => {
+ getRunningProcesses(AGENT_BEAT_FILE_PATH_SUFFIX).then((pid) => {
// suspend the process using PID
inputConsoleCommand(`suspend-process --pid ${pid}`);
submitCommand();
From f91f86b28cc1acbfc01aa7ae9d94348964022d59 Mon Sep 17 00:00:00 2001
From: elena-shostak <165678770+elena-shostak@users.noreply.github.com>
Date: Mon, 22 Apr 2024 12:11:50 +0200
Subject: [PATCH 007/183] Space arbitrary destination support (#180872)
## Summary
1. Moved `parseNextURL ` and `isInternalURL` to `@kbn/std` package.
2. Added optional `next` query parameter for enter space endpoint to
navigate to specified destination.
3. If `next` query parameter is malformed, we fall back to space
`defaultRoute`.
### Checklist
- [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] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
__Fixes: https://github.com/elastic/kibana/issues/180711__
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
packages/kbn-std/index.ts | 2 +
.../kbn-std/src}/is_internal_url.test.ts | 5 +-
.../kbn-std/src}/is_internal_url.ts | 13 +-
.../kbn-std/src/parse_next_url.test.ts | 57 +++--
.../kbn-std/src/parse_next_url.ts | 22 +-
.../access_agreement_page.tsx | 4 +-
.../capture_url/capture_url_app.ts | 4 +-
.../logged_out/logged_out_page.tsx | 4 +-
.../overwritten_session_page.tsx | 4 +-
.../server/authentication/providers/saml.ts | 2 +-
.../server/routes/authentication/common.ts | 4 +-
.../security/server/routes/views/login.ts | 4 +-
.../spaces/server/routes/views/index.test.ts | 240 ++++++++++++++++++
.../spaces/server/routes/views/index.ts | 20 +-
x-pack/plugins/spaces/tsconfig.json | 1 +
.../functional/apps/spaces/enter_space.ts | 54 ++++
.../page_objects/space_selector_page.ts | 12 +
17 files changed, 395 insertions(+), 57 deletions(-)
rename {x-pack/plugins/security/common => packages/kbn-std/src}/is_internal_url.test.ts (94%)
rename {x-pack/plugins/security/common => packages/kbn-std/src}/is_internal_url.ts (80%)
rename x-pack/plugins/security/common/parse_next.test.ts => packages/kbn-std/src/parse_next_url.test.ts (78%)
rename x-pack/plugins/security/common/parse_next.ts => packages/kbn-std/src/parse_next_url.ts (56%)
create mode 100644 x-pack/plugins/spaces/server/routes/views/index.test.ts
diff --git a/packages/kbn-std/index.ts b/packages/kbn-std/index.ts
index 3ee605cbf98fa..ae45bb099e508 100644
--- a/packages/kbn-std/index.ts
+++ b/packages/kbn-std/index.ts
@@ -16,6 +16,8 @@ export { pick } from './src/pick';
export { withTimeout, isPromise } from './src/promise';
export type { URLMeaningfulParts } from './src/url';
export { isRelativeUrl, modifyUrl, getUrlOrigin } from './src/url';
+export { isInternalURL } from './src/is_internal_url';
+export { parseNextURL } from './src/parse_next_url';
export { unset } from './src/unset';
export { getFlattenedObject } from './src/get_flattened_object';
export { ensureNoUnsafeProperties } from './src/ensure_no_unsafe_properties';
diff --git a/x-pack/plugins/security/common/is_internal_url.test.ts b/packages/kbn-std/src/is_internal_url.test.ts
similarity index 94%
rename from x-pack/plugins/security/common/is_internal_url.test.ts
rename to packages/kbn-std/src/is_internal_url.test.ts
index d6fe64c0b33ce..cc1f5a32d7db4 100644
--- a/x-pack/plugins/security/common/is_internal_url.test.ts
+++ b/packages/kbn-std/src/is_internal_url.test.ts
@@ -1,8 +1,9 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
import { isInternalURL } from './is_internal_url';
diff --git a/x-pack/plugins/security/common/is_internal_url.ts b/packages/kbn-std/src/is_internal_url.ts
similarity index 80%
rename from x-pack/plugins/security/common/is_internal_url.ts
rename to packages/kbn-std/src/is_internal_url.ts
index ea121aeb7cbf8..434fa6eaf7c27 100644
--- a/x-pack/plugins/security/common/is_internal_url.ts
+++ b/packages/kbn-std/src/is_internal_url.ts
@@ -1,14 +1,18 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
-import { parse } from 'url';
+import { parse as parseUrl } from 'url';
+/**
+ * Determine if url is outside of this Kibana install.
+ */
export function isInternalURL(url: string, basePath = '') {
- const { protocol, hostname, port, pathname } = parse(
+ const { protocol, hostname, port, pathname } = parseUrl(
url,
false /* parseQueryString */,
true /* slashesDenoteHost */
@@ -27,6 +31,7 @@ export function isInternalURL(url: string, basePath = '') {
// Now we need to normalize URL to make sure any relative path segments (`..`) cannot escape expected
// base path. We can rely on `URL` with a localhost to automatically "normalize" the URL.
const normalizedPathname = new URL(String(pathname), 'https://localhost').pathname;
+
return (
// Normalized pathname can add a leading slash, but we should also make sure it's included in
// the original URL too
diff --git a/x-pack/plugins/security/common/parse_next.test.ts b/packages/kbn-std/src/parse_next_url.test.ts
similarity index 78%
rename from x-pack/plugins/security/common/parse_next.test.ts
rename to packages/kbn-std/src/parse_next_url.test.ts
index 49c4fdcd8e80b..2d56ae0e92b8a 100644
--- a/x-pack/plugins/security/common/parse_next.test.ts
+++ b/packages/kbn-std/src/parse_next_url.test.ts
@@ -1,15 +1,16 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
-import { parseNext } from './parse_next';
+import { parseNextURL } from './parse_next_url';
-describe('parseNext', () => {
+describe('parseNextURL', () => {
it('should return a function', () => {
- expect(parseNext).toBeInstanceOf(Function);
+ expect(parseNextURL).toBeInstanceOf(Function);
});
describe('with basePath defined', () => {
@@ -17,14 +18,14 @@ describe('parseNext', () => {
it('should return basePath with a trailing slash when next is not specified', () => {
const basePath = '/iqf';
const href = `${basePath}/login`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
it('should properly handle next without hash', () => {
const basePath = '/iqf';
const next = `${basePath}/app/kibana`;
const href = `${basePath}/login?next=${next}`;
- expect(parseNext(href, basePath)).toEqual(next);
+ expect(parseNextURL(href, basePath)).toEqual(next);
});
it('should properly handle next with hash', () => {
@@ -32,7 +33,7 @@ describe('parseNext', () => {
const next = `${basePath}/app/kibana`;
const hash = '/discover/New-Saved-Search';
const href = `${basePath}/login?next=${next}#${hash}`;
- expect(parseNext(href, basePath)).toEqual(`${next}#${hash}`);
+ expect(parseNextURL(href, basePath)).toEqual(`${next}#${hash}`);
});
it('should properly handle multiple next with hash', () => {
@@ -41,7 +42,7 @@ describe('parseNext', () => {
const next2 = `${basePath}/app/ml`;
const hash = '/discover/New-Saved-Search';
const href = `${basePath}/login?next=${next1}&next=${next2}#${hash}`;
- expect(parseNext(href, basePath)).toEqual(`${next1}#${hash}`);
+ expect(parseNextURL(href, basePath)).toEqual(`${next1}#${hash}`);
});
it('should properly decode special characters', () => {
@@ -49,7 +50,7 @@ describe('parseNext', () => {
const next = `${encodeURIComponent(basePath)}%2Fapp%2Fkibana`;
const hash = '/discover/New-Saved-Search';
const href = `${basePath}/login?next=${next}#${hash}`;
- expect(parseNext(href, basePath)).toEqual(decodeURIComponent(`${next}#${hash}`));
+ expect(parseNextURL(href, basePath)).toEqual(decodeURIComponent(`${next}#${hash}`));
});
// to help prevent open redirect to a different url
@@ -57,7 +58,7 @@ describe('parseNext', () => {
const basePath = '/iqf';
const next = `https://example.com${basePath}/app/kibana`;
const href = `${basePath}/login?next=${next}`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
// to help prevent open redirect to a different url by abusing encodings
@@ -67,7 +68,7 @@ describe('parseNext', () => {
const next = `${encodeURIComponent(baseUrl)}%2Fapp%2Fkibana`;
const hash = '/discover/New-Saved-Search';
const href = `${basePath}/login?next=${next}#${hash}`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
// to help prevent open redirect to a different port
@@ -75,7 +76,7 @@ describe('parseNext', () => {
const basePath = '/iqf';
const next = `http://localhost:5601${basePath}/app/kibana`;
const href = `${basePath}/login?next=${next}`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
// to help prevent open redirect to a different port by abusing encodings
@@ -85,7 +86,7 @@ describe('parseNext', () => {
const next = `${encodeURIComponent(baseUrl)}%2Fapp%2Fkibana`;
const hash = '/discover/New-Saved-Search';
const href = `${basePath}/login?next=${next}#${hash}`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
// to help prevent open redirect to a different base path
@@ -93,18 +94,18 @@ describe('parseNext', () => {
const basePath = '/iqf';
const next = '/notbasepath/app/kibana';
const href = `${basePath}/login?next=${next}`;
- expect(parseNext(href, basePath)).toEqual(`${basePath}/`);
+ expect(parseNextURL(href, basePath)).toEqual(`${basePath}/`);
});
// disallow network-path references
it('should return / if next is url without protocol', () => {
const nextWithTwoSlashes = '//example.com';
const hrefWithTwoSlashes = `/login?next=${nextWithTwoSlashes}`;
- expect(parseNext(hrefWithTwoSlashes)).toEqual('/');
+ expect(parseNextURL(hrefWithTwoSlashes)).toEqual('/');
const nextWithThreeSlashes = '///example.com';
const hrefWithThreeSlashes = `/login?next=${nextWithThreeSlashes}`;
- expect(parseNext(hrefWithThreeSlashes)).toEqual('/');
+ expect(parseNextURL(hrefWithThreeSlashes)).toEqual('/');
});
});
@@ -112,20 +113,20 @@ describe('parseNext', () => {
// trailing slash is important since it must match the cookie path exactly
it('should return / with a trailing slash when next is not specified', () => {
const href = '/login';
- expect(parseNext(href)).toEqual('/');
+ expect(parseNextURL(href)).toEqual('/');
});
it('should properly handle next without hash', () => {
const next = '/app/kibana';
const href = `/login?next=${next}`;
- expect(parseNext(href)).toEqual(next);
+ expect(parseNextURL(href)).toEqual(next);
});
it('should properly handle next with hash', () => {
const next = '/app/kibana';
const hash = '/discover/New-Saved-Search';
const href = `/login?next=${next}#${hash}`;
- expect(parseNext(href)).toEqual(`${next}#${hash}`);
+ expect(parseNextURL(href)).toEqual(`${next}#${hash}`);
});
it('should properly handle multiple next with hash', () => {
@@ -133,21 +134,21 @@ describe('parseNext', () => {
const next2 = '/app/ml';
const hash = '/discover/New-Saved-Search';
const href = `/login?next=${next1}&next=${next2}#${hash}`;
- expect(parseNext(href)).toEqual(`${next1}#${hash}`);
+ expect(parseNextURL(href)).toEqual(`${next1}#${hash}`);
});
it('should properly decode special characters', () => {
const next = '%2Fapp%2Fkibana';
const hash = '/discover/New-Saved-Search';
const href = `/login?next=${next}#${hash}`;
- expect(parseNext(href)).toEqual(decodeURIComponent(`${next}#${hash}`));
+ expect(parseNextURL(href)).toEqual(decodeURIComponent(`${next}#${hash}`));
});
// to help prevent open redirect to a different url
it('should return / if next includes a protocol/hostname', () => {
const next = 'https://example.com/app/kibana';
const href = `/login?next=${next}`;
- expect(parseNext(href)).toEqual('/');
+ expect(parseNextURL(href)).toEqual('/');
});
// to help prevent open redirect to a different url by abusing encodings
@@ -156,14 +157,14 @@ describe('parseNext', () => {
const next = `${encodeURIComponent(baseUrl)}%2Fapp%2Fkibana`;
const hash = '/discover/New-Saved-Search';
const href = `/login?next=${next}#${hash}`;
- expect(parseNext(href)).toEqual('/');
+ expect(parseNextURL(href)).toEqual('/');
});
// to help prevent open redirect to a different port
it('should return / if next includes a port', () => {
const next = 'http://localhost:5601/app/kibana';
const href = `/login?next=${next}`;
- expect(parseNext(href)).toEqual('/');
+ expect(parseNextURL(href)).toEqual('/');
});
// to help prevent open redirect to a different port by abusing encodings
@@ -172,18 +173,18 @@ describe('parseNext', () => {
const next = `${encodeURIComponent(baseUrl)}%2Fapp%2Fkibana`;
const hash = '/discover/New-Saved-Search';
const href = `/login?next=${next}#${hash}`;
- expect(parseNext(href)).toEqual('/');
+ expect(parseNextURL(href)).toEqual('/');
});
// disallow network-path references
it('should return / if next is url without protocol', () => {
const nextWithTwoSlashes = '//example.com';
const hrefWithTwoSlashes = `/login?next=${nextWithTwoSlashes}`;
- expect(parseNext(hrefWithTwoSlashes)).toEqual('/');
+ expect(parseNextURL(hrefWithTwoSlashes)).toEqual('/');
const nextWithThreeSlashes = '///example.com';
const hrefWithThreeSlashes = `/login?next=${nextWithThreeSlashes}`;
- expect(parseNext(hrefWithThreeSlashes)).toEqual('/');
+ expect(parseNextURL(hrefWithThreeSlashes)).toEqual('/');
});
});
});
diff --git a/x-pack/plugins/security/common/parse_next.ts b/packages/kbn-std/src/parse_next_url.ts
similarity index 56%
rename from x-pack/plugins/security/common/parse_next.ts
rename to packages/kbn-std/src/parse_next_url.ts
index bf7bb3b070736..1b54e02d581a0 100644
--- a/x-pack/plugins/security/common/parse_next.ts
+++ b/packages/kbn-std/src/parse_next_url.ts
@@ -1,19 +1,29 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
import { parse } from 'url';
-
-import { NEXT_URL_QUERY_STRING_PARAMETER } from './constants';
import { isInternalURL } from './is_internal_url';
-export function parseNext(href: string, basePath = '') {
+const DEFAULT_NEXT_URL_QUERY_STRING_PARAMETER = 'next';
+
+/**
+ * Parse the url value from query param. By default
+ *
+ * By default query param is set to next.
+ */
+export function parseNextURL(
+ href: string,
+ basePath = '',
+ nextUrlQueryParam = DEFAULT_NEXT_URL_QUERY_STRING_PARAMETER
+) {
const { query, hash } = parse(href, true);
- let next = query[NEXT_URL_QUERY_STRING_PARAMETER];
+ let next = query[nextUrlQueryParam];
if (!next) {
return `${basePath}/`;
}
diff --git a/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.tsx b/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.tsx
index c4c3c51d94d6f..23cdb93b460ef 100644
--- a/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.tsx
+++ b/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.tsx
@@ -30,9 +30,9 @@ import type {
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
+import { parseNextURL } from '@kbn/std';
import type { StartServices } from '../..';
-import { parseNext } from '../../../common/parse_next';
import { AuthenticationStatePage } from '../components';
interface Props {
@@ -59,7 +59,7 @@ export function AccessAgreementPage({ http, fatalErrors, notifications }: Props)
try {
setIsLoading(true);
await http.post('/internal/security/access_agreement/acknowledge');
- window.location.href = parseNext(window.location.href, http.basePath.serverBasePath);
+ window.location.href = parseNextURL(window.location.href, http.basePath.serverBasePath);
} catch (err) {
notifications.toasts.addError(err, {
title: i18n.translate('xpack.security.accessAgreement.acknowledgeErrorMessage', {
diff --git a/x-pack/plugins/security/public/authentication/capture_url/capture_url_app.ts b/x-pack/plugins/security/public/authentication/capture_url/capture_url_app.ts
index f27d5ea7b5466..cb96bdae01ae3 100644
--- a/x-pack/plugins/security/public/authentication/capture_url/capture_url_app.ts
+++ b/x-pack/plugins/security/public/authentication/capture_url/capture_url_app.ts
@@ -47,9 +47,9 @@ export const captureURLApp = Object.freeze({
try {
// This is an async import because it requires `url`, which is a sizable dependency.
// Otherwise this becomes part of the "page load bundle".
- const { parseNext } = await import('../../../common/parse_next');
+ const { parseNextURL } = await import('@kbn/std');
const url = new URL(
- parseNext(window.location.href, http.basePath.serverBasePath),
+ parseNextURL(window.location.href, http.basePath.serverBasePath),
window.location.origin
);
url.searchParams.append(AUTH_URL_HASH_QUERY_STRING_PARAMETER, window.location.hash);
diff --git a/x-pack/plugins/security/public/authentication/logged_out/logged_out_page.tsx b/x-pack/plugins/security/public/authentication/logged_out/logged_out_page.tsx
index c380bfa11c2b9..b42014d828c10 100644
--- a/x-pack/plugins/security/public/authentication/logged_out/logged_out_page.tsx
+++ b/x-pack/plugins/security/public/authentication/logged_out/logged_out_page.tsx
@@ -13,9 +13,9 @@ import useObservable from 'react-use/lib/useObservable';
import type { AppMountParameters, CustomBrandingStart, IBasePath } from '@kbn/core/public';
import { FormattedMessage } from '@kbn/i18n-react';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
+import { parseNextURL } from '@kbn/std';
import type { StartServices } from '../..';
-import { parseNext } from '../../../common/parse_next';
import { AuthenticationStatePage } from '../components';
interface Props {
@@ -35,7 +35,7 @@ export function LoggedOutPage({ basePath, customBranding }: Props) {
}
logo={customBrandingValue?.logo}
>
-
+
diff --git a/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_page.tsx b/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_page.tsx
index 42ef361bc1fd9..98a28f8919d0f 100644
--- a/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_page.tsx
+++ b/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_page.tsx
@@ -13,9 +13,9 @@ import type { AppMountParameters, IBasePath } from '@kbn/core/public';
import { FormattedMessage } from '@kbn/i18n-react';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
import type { AuthenticationServiceSetup } from '@kbn/security-plugin-types-public';
+import { parseNextURL } from '@kbn/std';
import type { StartServices } from '../..';
-import { parseNext } from '../../../common/parse_next';
import { AuthenticationStatePage } from '../components';
interface Props {
@@ -42,7 +42,7 @@ export function OverwrittenSessionPage({ authc, basePath }: Props) {
/>
}
>
-
+
{
const { providerType, providerName, currentURL, params } = request.body;
- const redirectURL = parseNext(currentURL, basePath.serverBasePath);
+ const redirectURL = parseNextURL(currentURL, basePath.serverBasePath);
const authenticationResult = await getAuthenticationService().login(request, {
provider: { name: providerName },
redirectURL,
diff --git a/x-pack/plugins/security/server/routes/views/login.ts b/x-pack/plugins/security/server/routes/views/login.ts
index 9a7145b0e09df..5d4468fcbba57 100644
--- a/x-pack/plugins/security/server/routes/views/login.ts
+++ b/x-pack/plugins/security/server/routes/views/login.ts
@@ -6,6 +6,7 @@
*/
import { schema } from '@kbn/config-schema';
+import { parseNextURL } from '@kbn/std';
import type { RouteDefinitionParams } from '..';
import {
@@ -14,7 +15,6 @@ import {
} from '../../../common/constants';
import type { LoginState } from '../../../common/login_state';
import { shouldProviderUseLoginForm } from '../../../common/model';
-import { parseNext } from '../../../common/parse_next';
/**
* Defines routes required for the Login view.
@@ -48,7 +48,7 @@ export function defineLoginRoutes({
if (isUserAlreadyLoggedIn || !shouldShowLogin) {
logger.debug('User is already authenticated, redirecting...');
return response.redirected({
- headers: { location: parseNext(request.url?.href ?? '', basePath.serverBasePath) },
+ headers: { location: parseNextURL(request.url?.href ?? '', basePath.serverBasePath) },
});
}
diff --git a/x-pack/plugins/spaces/server/routes/views/index.test.ts b/x-pack/plugins/spaces/server/routes/views/index.test.ts
new file mode 100644
index 0000000000000..6c035a5694fe4
--- /dev/null
+++ b/x-pack/plugins/spaces/server/routes/views/index.test.ts
@@ -0,0 +1,240 @@
+/*
+ * 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 } from '@kbn/config-schema';
+import type {
+ HttpResources,
+ HttpResourcesRequestHandler,
+ RequestHandlerContext,
+ RouteConfig,
+} from '@kbn/core/server';
+import {
+ coreMock,
+ httpResourcesMock,
+ httpServerMock,
+ httpServiceMock,
+ loggingSystemMock,
+ uiSettingsServiceMock,
+} from '@kbn/core/server/mocks';
+import type { DeeplyMockedKeys } from '@kbn/utility-types-jest';
+
+import type { ViewRouteDeps } from '.';
+import { initSpacesViewsRoutes } from '.';
+import { ENTER_SPACE_PATH } from '../../../common';
+
+const routeDefinitionParamsMock = {
+ create: () => {
+ uiSettingsServiceMock.createStartContract();
+
+ return {
+ basePath: httpServiceMock.createBasePath(),
+ logger: loggingSystemMock.create().get(),
+ httpResources: httpResourcesMock.createRegistrar(),
+ } as unknown as DeeplyMockedKeys;
+ },
+};
+
+describe('Space Selector view routes', () => {
+ let httpResources: jest.Mocked;
+ beforeEach(() => {
+ const routeParamsMock = routeDefinitionParamsMock.create();
+ httpResources = routeParamsMock.httpResources;
+
+ initSpacesViewsRoutes(routeParamsMock);
+ });
+
+ let routeHandler: HttpResourcesRequestHandler;
+ let routeConfig: RouteConfig;
+ beforeEach(() => {
+ const [viewRouteConfig, viewRouteHandler] = httpResources.register.mock.calls.find(
+ ([{ path }]) => path === '/spaces/space_selector'
+ )!;
+
+ routeConfig = viewRouteConfig;
+ routeHandler = viewRouteHandler;
+ });
+
+ it('correctly defines route.', () => {
+ expect(routeConfig.options).toBeUndefined();
+ expect(routeConfig.validate).toBe(false);
+ });
+
+ it('renders view.', async () => {
+ const request = httpServerMock.createKibanaRequest();
+ const responseFactory = httpResourcesMock.createResponseFactory();
+
+ await routeHandler({} as unknown as RequestHandlerContext, request, responseFactory);
+
+ expect(responseFactory.renderCoreApp).toHaveBeenCalledWith();
+ });
+});
+
+describe('Enter Space view routes', () => {
+ let httpResources: jest.Mocked;
+ beforeEach(() => {
+ const routeParamsMock = routeDefinitionParamsMock.create();
+ httpResources = routeParamsMock.httpResources;
+
+ initSpacesViewsRoutes(routeParamsMock);
+ });
+
+ let routeHandler: HttpResourcesRequestHandler;
+ let routeConfig: RouteConfig;
+ beforeEach(() => {
+ const [viewRouteConfig, viewRouteHandler] = httpResources.register.mock.calls.find(
+ ([{ path }]) => path === ENTER_SPACE_PATH
+ )!;
+
+ routeConfig = viewRouteConfig;
+ routeHandler = viewRouteHandler;
+ });
+
+ it('correctly defines route.', () => {
+ expect(routeConfig.validate).toEqual({
+ body: undefined,
+ query: expect.any(Type),
+ params: undefined,
+ });
+
+ const queryValidator = (routeConfig.validate as any).query as Type;
+ expect(queryValidator.validate({})).toEqual({});
+ expect(queryValidator.validate({ next: '/some-url', something: 'something' })).toEqual({
+ next: '/some-url',
+ });
+ });
+
+ it('correctly enters space default route.', async () => {
+ const request = httpServerMock.createKibanaRequest();
+ const responseFactory = httpResourcesMock.createResponseFactory();
+ const contextMock = coreMock.createRequestHandlerContext();
+
+ contextMock.uiSettings.client.get.mockResolvedValue('/home');
+
+ await routeHandler(
+ { core: contextMock } as unknown as RequestHandlerContext,
+ request,
+ responseFactory
+ );
+
+ expect(responseFactory.redirected).toHaveBeenCalledWith({
+ headers: { location: '/mock-server-basepath/home' },
+ });
+ });
+
+ it('correctly enters space with specified route.', async () => {
+ const nextRoute = '/app/management/kibana/objects';
+ const request = httpServerMock.createKibanaRequest({
+ query: {
+ next: nextRoute,
+ },
+ });
+
+ const responseFactory = httpResourcesMock.createResponseFactory();
+ const contextMock = coreMock.createRequestHandlerContext();
+
+ await routeHandler(
+ { core: contextMock } as unknown as RequestHandlerContext,
+ request,
+ responseFactory
+ );
+
+ expect(responseFactory.redirected).toHaveBeenCalledWith({
+ headers: { location: `/mock-server-basepath${nextRoute}` },
+ });
+ });
+
+ it('correctly enters space with specified route without leading slash.', async () => {
+ const nextRoute = 'app/management/kibana/objects';
+ const request = httpServerMock.createKibanaRequest({
+ query: {
+ next: nextRoute,
+ },
+ });
+
+ const responseFactory = httpResourcesMock.createResponseFactory();
+ const contextMock = coreMock.createRequestHandlerContext();
+
+ await routeHandler(
+ { core: contextMock } as unknown as RequestHandlerContext,
+ request,
+ responseFactory
+ );
+
+ expect(responseFactory.redirected).toHaveBeenCalledWith({
+ headers: { location: `/mock-server-basepath/${nextRoute}` },
+ });
+ });
+
+ it('correctly enters space and normalizes specified route.', async () => {
+ const responseFactory = httpResourcesMock.createResponseFactory();
+ const contextMock = coreMock.createRequestHandlerContext();
+
+ for (const { query, expectedLocation } of [
+ {
+ query: {
+ next: '/app/../app/management/kibana/objects',
+ },
+ expectedLocation: '/mock-server-basepath/app/management/kibana/objects',
+ },
+ {
+ query: {
+ next: '../../app/../app/management/kibana/objects',
+ },
+ expectedLocation: '/mock-server-basepath/app/management/kibana/objects',
+ },
+ {
+ query: {
+ next: '/../../app/home',
+ },
+ expectedLocation: '/mock-server-basepath/app/home',
+ },
+ {
+ query: {
+ next: '/app/management/kibana/objects/../../kibana/home',
+ },
+ expectedLocation: '/mock-server-basepath/app/management/kibana/home',
+ },
+ ]) {
+ const request = httpServerMock.createKibanaRequest({
+ query,
+ });
+ await routeHandler(
+ { core: contextMock } as unknown as RequestHandlerContext,
+ request,
+ responseFactory
+ );
+
+ expect(responseFactory.redirected).toHaveBeenCalledWith({
+ headers: { location: expectedLocation },
+ });
+
+ responseFactory.redirected.mockClear();
+ }
+ });
+
+ it('correctly enters space with default route if specificed route is not relative.', async () => {
+ const request = httpServerMock.createKibanaRequest({
+ query: {
+ next: 'http://evil.com/mock-server-basepath/app/kibana',
+ },
+ });
+
+ const responseFactory = httpResourcesMock.createResponseFactory();
+ const contextMock = coreMock.createRequestHandlerContext();
+ contextMock.uiSettings.client.get.mockResolvedValue('/home');
+
+ await routeHandler(
+ { core: contextMock } as unknown as RequestHandlerContext,
+ request,
+ responseFactory
+ );
+
+ expect(responseFactory.redirected).toHaveBeenCalledWith({
+ headers: { location: '/mock-server-basepath/home' },
+ });
+ });
+});
diff --git a/x-pack/plugins/spaces/server/routes/views/index.ts b/x-pack/plugins/spaces/server/routes/views/index.ts
index d0cff27e85433..73fa47338dd76 100644
--- a/x-pack/plugins/spaces/server/routes/views/index.ts
+++ b/x-pack/plugins/spaces/server/routes/views/index.ts
@@ -5,7 +5,9 @@
* 2.0.
*/
+import { schema } from '@kbn/config-schema';
import type { HttpResources, IBasePath, Logger } from '@kbn/core/server';
+import { parseNextURL } from '@kbn/std';
import { ENTER_SPACE_PATH } from '../../../common';
import { wrapError } from '../../lib/errors';
@@ -23,18 +25,28 @@ export function initSpacesViewsRoutes(deps: ViewRouteDeps) {
);
deps.httpResources.register(
- { path: ENTER_SPACE_PATH, validate: false },
+ {
+ path: ENTER_SPACE_PATH,
+ validate: {
+ query: schema.maybe(
+ schema.object({ next: schema.maybe(schema.string()) }, { unknowns: 'ignore' })
+ ),
+ },
+ },
async (context, request, response) => {
try {
const { uiSettings } = await context.core;
const defaultRoute = await uiSettings.client.get('defaultRoute');
-
const basePath = deps.basePath.get(request);
- const url = `${basePath}${defaultRoute}`;
+ const nextCandidateRoute = parseNextURL(request.url.href);
+
+ const route = nextCandidateRoute === '/' ? defaultRoute : nextCandidateRoute;
+ // need to get reed of ../../ to make sure we will not be out of space basePath
+ const normalizedRoute = new URL(route, 'https://localhost').pathname;
return response.redirected({
headers: {
- location: url,
+ location: `${basePath}${normalizedRoute}`,
},
});
} catch (e) {
diff --git a/x-pack/plugins/spaces/tsconfig.json b/x-pack/plugins/spaces/tsconfig.json
index 863027b382510..f912a1231e608 100644
--- a/x-pack/plugins/spaces/tsconfig.json
+++ b/x-pack/plugins/spaces/tsconfig.json
@@ -34,6 +34,7 @@
"@kbn/shared-ux-avatar-solution",
"@kbn/core-http-server",
"@kbn/react-kibana-context-render",
+ "@kbn/utility-types-jest",
],
"exclude": [
"target/**/*",
diff --git a/x-pack/test/functional/apps/spaces/enter_space.ts b/x-pack/test/functional/apps/spaces/enter_space.ts
index caae7bad10b0f..f070d8dfcad93 100644
--- a/x-pack/test/functional/apps/spaces/enter_space.ts
+++ b/x-pack/test/functional/apps/spaces/enter_space.ts
@@ -15,6 +15,7 @@ export default function enterSpaceFunctionalTests({
const kibanaServer = getService('kibanaServer');
const PageObjects = getPageObjects(['security', 'spaceSelector']);
const spacesService = getService('spaces');
+ const browser = getService('browser');
describe('Enter Space', function () {
this.tags('includeFirefox');
@@ -81,5 +82,58 @@ export default function enterSpaceFunctionalTests({
await PageObjects.spaceSelector.clickSpaceAvatar(newSpaceId);
await PageObjects.spaceSelector.expectHomePage(newSpaceId);
});
+
+ it('allows user to navigate to different space with provided next route', async () => {
+ const spaceId = 'another-space';
+
+ await PageObjects.security.login(undefined, undefined, {
+ expectSpaceSelector: true,
+ });
+
+ const anchorElement = await PageObjects.spaceSelector.getSpaceCardAnchor(spaceId);
+ const path = await anchorElement.getAttribute('href');
+
+ const pathWithNextRoute = `${path}?next=/app/management/kibana/objects`;
+
+ await browser.navigateTo(pathWithNextRoute);
+
+ await PageObjects.spaceSelector.expectRoute(spaceId, '/app/management/kibana/objects');
+ });
+
+ it('allows user to navigate to different space with provided next route, route is normalized', async () => {
+ const spaceId = 'another-space';
+
+ await PageObjects.security.login(undefined, undefined, {
+ expectSpaceSelector: true,
+ });
+
+ const anchorElement = await PageObjects.spaceSelector.getSpaceCardAnchor(spaceId);
+ const path = await anchorElement.getAttribute('href');
+
+ const pathWithNextRoute = `${path}?next=${encodeURIComponent(
+ '/../../../app/management/kibana/objects'
+ )}`;
+
+ await browser.navigateTo(pathWithNextRoute);
+
+ await PageObjects.spaceSelector.expectRoute(spaceId, '/app/management/kibana/objects');
+ });
+
+ it('falls back to the default home page if provided next route is malformed', async () => {
+ const spaceId = 'another-space';
+
+ await PageObjects.security.login(undefined, undefined, {
+ expectSpaceSelector: true,
+ });
+
+ const anchorElement = await PageObjects.spaceSelector.getSpaceCardAnchor(spaceId);
+ const path = await anchorElement.getAttribute('href');
+
+ const pathWithNextRoute = `${path}?next=http://example.com/evil`;
+
+ await browser.navigateTo(pathWithNextRoute);
+
+ await PageObjects.spaceSelector.expectRoute(spaceId, '/app/canvas');
+ });
});
}
diff --git a/x-pack/test/functional/page_objects/space_selector_page.ts b/x-pack/test/functional/page_objects/space_selector_page.ts
index 211193f6cf88a..8c56dee81f435 100644
--- a/x-pack/test/functional/page_objects/space_selector_page.ts
+++ b/x-pack/test/functional/page_objects/space_selector_page.ts
@@ -29,6 +29,18 @@ export class SpaceSelectorPageObject extends FtrService {
});
}
+ async getSpaceCardAnchor(spaceId: string) {
+ return await this.retry.try(async () => {
+ this.log.info(`SpaceSelectorPage:getSpaceCardAnchor(${spaceId})`);
+ const testSubjId = `space-card-${spaceId}`;
+ const anchorElement = await this.find.byCssSelector(
+ `[data-test-subj="${testSubjId}"] .euiCard__titleAnchor`
+ );
+
+ return anchorElement;
+ });
+ }
+
async expectHomePage(spaceId: string) {
return await this.expectRoute(spaceId, `/app/home#/`);
}
From 918f43ce932110cc3a7c8c811ae0fdf7228db2fa Mon Sep 17 00:00:00 2001
From: jennypavlova
Date: Mon, 22 Apr 2024 12:28:19 +0200
Subject: [PATCH 008/183] [Infra] Inform users about filters applied in the
Dashboards tab (#181175)
Closes #175552
## Summary
This PR adds a callout to explain when the linked dashboard is filtered
by asset id.
## Testing
The callout messages and mockups are added in the [issue
description](https://github.com/elastic/kibana/issues/175552#issue-2100558349).
- Go to asset details flyout or page dashboards tab
- Link a dashboard (leave the default filter option)
- Info callout content and tooltip:
![image](https://github.com/elastic/kibana/assets/14139027/a1aebda2-d67f-4beb-b882-2e3a03320b83)
- Link a dashboard (deselect the default filter option)
- Info callout content and tooltip:
---
.../tabs/dashboards/dashboards.tsx | 9 +++
.../dashboards/filter_explanation_callout.tsx | 76 +++++++++++++++++++
2 files changed, 85 insertions(+)
create mode 100644 x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/filter_explanation_callout.tsx
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
index 495cc306f02b8..5ca216a5734c9 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
@@ -41,6 +41,7 @@ import { useDataViewsContext } from '../../hooks/use_data_views';
import { DashboardSelector } from './dashboard_selector';
import { ContextMenu } from './context_menu';
import { useAssetDetailsUrlState } from '../../hooks/use_asset_details_url_state';
+import { FilterExplanationCallout } from './filter_explanation_callout';
export function Dashboards() {
const { dateRange } = useDatePickerContext();
@@ -182,6 +183,14 @@ export function Dashboards() {
)}
+ {currentDashboard && (
+ <>
+
+
+ >
+ )}
{urlState?.dashboardId && (
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/filter_explanation_callout.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/filter_explanation_callout.tsx
new file mode 100644
index 0000000000000..b2d36815f05d3
--- /dev/null
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/filter_explanation_callout.tsx
@@ -0,0 +1,76 @@
+/*
+ * 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 React from 'react';
+
+import { i18n } from '@kbn/i18n';
+import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiToolTip, EuiIcon, EuiCode } from '@elastic/eui';
+
+import { findInventoryFields } from '@kbn/metrics-data-access-plugin/common';
+import { css } from '@emotion/react';
+import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props';
+
+interface Props {
+ dashboardFilterAssetIdEnabled: boolean;
+}
+export const FilterExplanationCallout = ({ dashboardFilterAssetIdEnabled }: Props) => {
+ const { asset } = useAssetDetailsRenderPropsContext();
+
+ return (
+
+
+
+ {i18n.translate(
+ 'xpack.infra.customDashboards.filteredByCurrentAssetExplanation.tooltip',
+ {
+ defaultMessage: 'Filtered by',
+ }
+ )}
+ {`${findInventoryFields(asset.type).id}: ${asset.id}`}
+ >
+ ) : (
+ i18n.translate('xpack.infra.customDashboards.notFilteredExplanation.tooltip', {
+ defaultMessage:
+ 'You can change this dashboard to filter by the {assetType} by editing the link for it',
+ values: { assetType: asset.type },
+ })
+ )
+ }
+ >
+
+
+
+
+ {dashboardFilterAssetIdEnabled
+ ? i18n.translate(
+ 'xpack.infra.customDashboards.filteredByCurrentAssetExplanation.message',
+ {
+ defaultMessage: 'This dashboard is filtered by the current {assetType}',
+ values: { assetType: asset.type },
+ }
+ )
+ : i18n.translate('xpack.infra.customDashboards.notFilteredExplanation.message', {
+ defaultMessage:
+ 'This dashboard is not filtered by the {assetType} you are viewing',
+ values: { assetType: asset.type },
+ })}
+
+
+ }
+ />
+ );
+};
From 703307682cf14bdf8edea30b12af508af03bcddd Mon Sep 17 00:00:00 2001
From: Joe Reuter
Date: Mon, 22 Apr 2024 12:30:34 +0200
Subject: [PATCH 009/183] [Observability Onboarding] Add footer (#180720)
## Summary
Fixes https://github.com/elastic/kibana/issues/179793 by adding the real
links and so on to the footer of the landing page
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../public/application/footer/footer.tsx | 85 +++-
.../application/footer/integrations_icon.svg | 417 ------------------
.../application/footer/support_icon.svg | 377 ++++++++++++++++
.../observability_onboarding/public/index.ts | 4 +
.../observability_onboarding/tsconfig.json | 1 +
5 files changed, 449 insertions(+), 435 deletions(-)
delete mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/integrations_icon.svg
create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/support_icon.svg
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/footer.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/footer.tsx
index bdce8e98e198a..7cb5979ad0b4b 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/footer.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/footer.tsx
@@ -9,44 +9,94 @@ import { i18n } from '@kbn/i18n';
import React from 'react';
import type { FunctionComponent } from 'react';
import { EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiAvatar, EuiText, EuiLink } from '@elastic/eui';
-import integrationsIconUrl from './integrations_icon.svg';
+import { URL_DEMO_ENV } from '@kbn/home-sample-data-tab/src/constants';
+import { useKibana } from '@kbn/kibana-react-plugin/public';
+import useObservable from 'react-use/lib/useObservable';
+import supportIconUrl from './support_icon.svg';
import demoIconUrl from './demo_icon.svg';
import docsIconUrl from './docs_icon.svg';
import forumIconUrl from './forum_icon.svg';
+import { ObservabilityOnboardingAppServices } from '../..';
+
+const URL_FORUM = 'https://discuss.elastic.co/';
export const Footer: FunctionComponent = () => {
+ const {
+ services: { docLinks, chrome },
+ } = useKibana();
+ const helpSupportUrl = useObservable(chrome.getHelpSupportUrl$());
const sections = [
- {
- iconUrl: integrationsIconUrl,
- title: i18n.translate(
- 'xpack.observability_onboarding.experimentalOnboardingFlow.dataSourcesFlexItemLabel',
- { defaultMessage: 'Data sources' }
- ),
- description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod',
- },
{
iconUrl: demoIconUrl,
title: i18n.translate(
'xpack.observability_onboarding.experimentalOnboardingFlow.demoEnvironmentFlexItemLabel',
{ defaultMessage: 'Demo environment' }
),
- description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod',
+ description: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.demoEnvironmentFlexItemDescription',
+ {
+ defaultMessage: 'Explore our live demo environment',
+ }
+ ),
+ linkLabel: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.demoEnvironmentFlexItemLinkLabel',
+ { defaultMessage: 'Explore demo' }
+ ),
+ link: URL_DEMO_ENV,
},
{
- iconUrl: docsIconUrl,
+ iconUrl: forumIconUrl,
title: i18n.translate(
'xpack.observability_onboarding.experimentalOnboardingFlow.exploreForumFlexItemLabel',
{ defaultMessage: 'Explore forum' }
),
- description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod',
+ description: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.exploreForumFlexItemDescription',
+ {
+ defaultMessage: 'Exchange thoughts about Elastic',
+ }
+ ),
+ linkLabel: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.exploreForumFlexItemLinkLabel',
+ { defaultMessage: 'Discuss forum' }
+ ),
+ link: URL_FORUM,
},
{
- iconUrl: forumIconUrl,
+ iconUrl: docsIconUrl,
title: i18n.translate(
'xpack.observability_onboarding.experimentalOnboardingFlow.browseDocumentationFlexItemLabel',
{ defaultMessage: 'Browse documentation' }
),
- description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod',
+ description: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.browseDocumentationFlexItemDescription',
+ {
+ defaultMessage: 'In-depth guides on all Elastic features',
+ }
+ ),
+ linkLabel: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.browseDocumentationFlexItemLinkLabel',
+ { defaultMessage: 'Learn more' }
+ ),
+ link: docLinks.links.observability.guide,
+ },
+ {
+ iconUrl: supportIconUrl,
+ title: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.supportHubFlexItemLabel',
+ { defaultMessage: 'Support Hub' }
+ ),
+ description: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.supportHubFlexItemDescription',
+ {
+ defaultMessage: 'Get help by opening a case',
+ }
+ ),
+ linkLabel: i18n.translate(
+ 'xpack.observability_onboarding.experimentalOnboardingFlow.supportHubFlexItemLinkLabel',
+ { defaultMessage: 'Open Support Hub' }
+ ),
+ link: helpSupportUrl,
},
];
@@ -68,12 +118,11 @@ export const Footer: FunctionComponent = () => {
- {i18n.translate('xpack.observability_onboarding.footer.learnMoreLinkLabel', {
- defaultMessage: 'Learn more',
- })}
+ {section.linkLabel}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/integrations_icon.svg b/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/integrations_icon.svg
deleted file mode 100644
index a82974fdf0406..0000000000000
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/integrations_icon.svg
+++ /dev/null
@@ -1,417 +0,0 @@
-
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/support_icon.svg b/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/support_icon.svg
new file mode 100644
index 0000000000000..72eeed3ef432d
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/footer/support_icon.svg
@@ -0,0 +1,377 @@
+
\ No newline at end of file
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/index.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/index.ts
index fa510c2fa7347..98174497d6c3e 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/index.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/index.ts
@@ -7,6 +7,8 @@
import {
ApplicationStart,
+ ChromeStart,
+ DocLinksStart,
HttpStart,
PluginInitializer,
PluginInitializerContext,
@@ -30,6 +32,8 @@ export interface ObservabilityOnboardingAppServices {
application: ApplicationStart;
http: HttpStart;
config: ConfigSchema;
+ docLinks: DocLinksStart;
+ chrome: ChromeStart;
}
export const plugin: PluginInitializer<
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json
index 52bf9a32fd8e1..ff0fe8696ce81 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json
+++ b/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json
@@ -36,6 +36,7 @@
"@kbn/fleet-plugin",
"@kbn/shared-ux-link-redirect-app",
"@kbn/cloud-experiments-plugin",
+ "@kbn/home-sample-data-tab",
"@kbn/analytics-client"
],
"exclude": ["target/**/*"]
From 4ec1a7289731525aefe9b15b16b3cfed8b603a03 Mon Sep 17 00:00:00 2001
From: Maryam Saeidi
Date: Mon, 22 Apr 2024 12:33:15 +0200
Subject: [PATCH 010/183] [APM alert details page] Add transactionName as a
prop to the latency history chart (#180558)
Fixes #180448
Now, the history chart also includes the transaction name and works for
both with and without having transaction name in the group by fields:
(Related to this
[comment](https://github.com/elastic/kibana/pull/180188#issuecomment-2045567860))
![image](https://github.com/elastic/kibana/assets/12370520/892f62f5-b345-4780-bcf5-89fd84d1581b)
---
.../alert_details_app_section/index.tsx | 1 +
.../latency_alerts_history_chart.tsx | 21 ++++++++++++++++---
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx
index 8b46f9a2d8c3c..27e132f0e43eb 100644
--- a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx
+++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx
@@ -214,6 +214,7 @@ export function AlertDetailsAppSection({
start={historicalRange.start}
end={historicalRange.end}
transactionType={transactionType}
+ transactionName={transactionName}
latencyAggregationType={latencyAggregationType}
environment={environment}
timeZone={timeZone}
diff --git a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/latency_alerts_history_chart.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/latency_alerts_history_chart.tsx
index 7a8c383c16d8b..75a5a7dc0e4da 100644
--- a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/latency_alerts_history_chart.tsx
+++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/latency_alerts_history_chart.tsx
@@ -43,6 +43,7 @@ interface LatencyAlertsHistoryChartProps {
start: string;
end: string;
transactionType?: string;
+ transactionName?: string;
latencyAggregationType: LatencyAggregationType;
environment: string;
timeZone: string;
@@ -54,6 +55,7 @@ export function LatencyAlertsHistoryChart({
start,
end,
transactionType,
+ transactionName,
latencyAggregationType,
environment,
timeZone,
@@ -65,7 +67,11 @@ export function LatencyAlertsHistoryChart({
end,
kuery: '',
numBuckets: 100,
- type: ApmDocumentType.ServiceTransactionMetric,
+ // ServiceTransactionMetric does not have transactionName as a dimension, but it is faster than TransactionMetric
+ // We use TransactionMetric only when there is a transactionName
+ type: transactionName
+ ? ApmDocumentType.TransactionMetric
+ : ApmDocumentType.ServiceTransactionMetric,
});
const { http, notifications } = useKibana().services;
const { data, status } = useFetcher(
@@ -80,7 +86,7 @@ export function LatencyAlertsHistoryChart({
start,
end,
transactionType,
- transactionName: undefined,
+ transactionName,
latencyAggregationType,
bucketSizeInSeconds: preferred.bucketSizeInSeconds,
documentType: preferred.source.documentType,
@@ -93,7 +99,16 @@ export function LatencyAlertsHistoryChart({
});
}
},
- [end, environment, latencyAggregationType, serviceName, start, transactionType, preferred]
+ [
+ end,
+ environment,
+ latencyAggregationType,
+ serviceName,
+ start,
+ transactionName,
+ transactionType,
+ preferred,
+ ]
);
const memoizedData = useMemo(
() =>
From 63baf7c5bddc54a9b2a7ec60f48dd7e4bde6200c Mon Sep 17 00:00:00 2001
From: Marco Liberati
Date: Mon, 22 Apr 2024 12:35:02 +0200
Subject: [PATCH 011/183] [Lens] Fix formula popup initial section (#181053)
## Summary
Fixes #181052
---
.../operations/definitions/formula/editor/formula_help.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_help.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_help.tsx
index 4bb885024bcbf..abc43a03dc651 100644
--- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_help.tsx
+++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_help.tsx
@@ -154,7 +154,7 @@ export function getDocumentationSections({
const sections = {
groups: helpGroups,
- initialSection: {formulasSections.howTo},
+ initialSection: {formulasSections.howTo},
};
return sections;
From eadc173ba23e44ed30e3dcfdf8b3b01c683b9358 Mon Sep 17 00:00:00 2001
From: Marco Liberati
Date: Mon, 22 Apr 2024 12:35:29 +0200
Subject: [PATCH 012/183] [ES|QL] Fix autocomplete with incompatible args
(#180874)
## Summary
Fixes #180730
I've improved the autocomplete logic a bit here with the new features
from `main`:
* the `constantOnly` check has been pushed down rather than depend on an
empty string
* autosuggestion takes into account the previous argument types now to
propose the next one
### Checklist
- [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
---
.../src/autocomplete/autocomplete.test.ts | 4 +-
.../src/autocomplete/autocomplete.ts | 46 +++++++++++++++----
.../src/autocomplete/factories.ts | 21 ++++++---
3 files changed, 55 insertions(+), 16 deletions(-)
diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts
index 2e1f116736588..c119f87a577dd 100644
--- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts
@@ -261,6 +261,8 @@ describe('autocomplete', () => {
const suggestionInertTextSorted = suggestions
// simulate the editor behaviour for sorting suggestions
.sort((a, b) => (a.sortText || '').localeCompare(b.sortText || ''));
+
+ expect(suggestionInertTextSorted).toHaveLength(expected.length);
for (const [index, receivedSuggestion] of suggestionInertTextSorted.entries()) {
if (typeof expected[index] !== 'object') {
expect(receivedSuggestion.text).toEqual(expected[index]);
@@ -1078,7 +1080,7 @@ describe('autocomplete', () => {
if (i < signature.params.length) {
const canHaveMoreArgs =
i + 1 < (signature.minParams ?? 0) ||
- signature.params.filter(({ optional }, j) => !optional && j > i).length > i;
+ signature.params.filter(({ optional }, j) => !optional && j > i).length > 0;
const allPossibleParamTypes = Array.from(
new Set(fn.signatures.map((s) => s.params[i].type))
diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts
index eb40fcec7c54b..6c25afe41f848 100644
--- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts
@@ -595,8 +595,9 @@ async function getExpressionSuggestionsByType(
getFieldsByType,
{
functions: canHaveAssignments,
- fields: true,
+ fields: !argDef.constantOnly,
variables: anyVariables,
+ literals: argDef.constantOnly,
},
{
ignoreFields: isNewExpression
@@ -646,6 +647,7 @@ async function getExpressionSuggestionsByType(
functions: true,
fields: false,
variables: nodeArg ? undefined : anyVariables,
+ literals: argDef.constantOnly,
}
))
);
@@ -980,10 +982,12 @@ async function getFieldsOrFunctionsSuggestions(
functions,
fields,
variables,
+ literals = false,
}: {
functions: boolean;
fields: boolean;
variables?: Map;
+ literals?: boolean;
},
{
ignoreFn = [],
@@ -1033,7 +1037,7 @@ async function getFieldsOrFunctionsSuggestions(
variables
? pushItUpInTheList(buildVariablesDefinitions(filteredVariablesByType), functions)
: [],
- getCompatibleLiterals(commandName, types)
+ literals ? getCompatibleLiterals(commandName, types) : []
);
return suggestions;
@@ -1121,10 +1125,28 @@ async function getFunctionArgsSuggestions(
);
}
- const supportedFieldTypes = fnDefinition.signatures
+ const existingTypes = node.args
+ .map((nodeArg) =>
+ extractFinalTypeFromArg(nodeArg, {
+ fields: fieldsMap,
+ variables: variablesExcludingCurrentCommandOnes,
+ })
+ )
+ .filter(nonNullable);
+
+ const validSignatures = fnDefinition.signatures
+ // if existing arguments are preset already, use them to filter out incompatible signatures
+ .filter((signature) => {
+ if (existingTypes.length) {
+ return existingTypes.every((type, index) => signature.params[index].type === type);
+ }
+ return true;
+ });
+
+ const supportedFieldTypes = validSignatures
.flatMap((signature) => {
if (signature.params.length > argIndex) {
- return signature.params[argIndex].constantOnly ? '' : signature.params[argIndex].type;
+ return signature.params[argIndex].type;
}
if (signature.minParams) {
return signature.params[signature.params.length - 1].type;
@@ -1133,6 +1155,10 @@ async function getFunctionArgsSuggestions(
})
.filter(nonNullable);
+ const shouldBeConstant = validSignatures.some(
+ ({ params }) => params[argIndex]?.constantOnly || /_literal$/.test(params[argIndex]?.type)
+ );
+
// ... | EVAL fn( )
// ... | EVAL fn( field, )
suggestions.push(
@@ -1142,9 +1168,11 @@ async function getFunctionArgsSuggestions(
option?.name,
getFieldsByType,
{
- functions: true,
- fields: true,
+ // @TODO: improve this to inherit the constant flag from the outer function
+ functions: !shouldBeConstant,
+ fields: !shouldBeConstant,
variables: variablesExcludingCurrentCommandOnes,
+ literals: shouldBeConstant,
},
// do not repropose the same function as arg
// i.e. avoid cases like abs(abs(abs(...))) with suggestions
@@ -1156,8 +1184,9 @@ async function getFunctionArgsSuggestions(
}
const hasMoreMandatoryArgs =
- refSignature.params.filter(({ optional }, index) => !optional && index > argIndex).length >
- argIndex ||
+ (refSignature.params.length >= argIndex &&
+ refSignature.params.filter(({ optional }, index) => !optional && index > argIndex).length >
+ 0) ||
('minParams' in refSignature && refSignature.minParams
? refSignature.minParams - 1 > argIndex
: false);
@@ -1177,6 +1206,7 @@ async function getFunctionArgsSuggestions(
functions: false,
fields: false,
variables: variablesExcludingCurrentCommandOnes,
+ literals: true,
}
))
);
diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts
index 2818634c58188..cc81ea9a9ae53 100644
--- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts
@@ -165,13 +165,18 @@ export const buildConstantsDefinitions = (
sortText: 'A',
}));
-export const buildValueDefinitions = (values: string[]): SuggestionRawDefinition[] =>
+export const buildValueDefinitions = (
+ values: string[],
+ detail?: string
+): SuggestionRawDefinition[] =>
values.map((value) => ({
label: `"${value}"`,
text: `"${value}"`,
- detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.valueDefinition', {
- defaultMessage: 'Literal value',
- }),
+ detail:
+ detail ??
+ i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.valueDefinition', {
+ defaultMessage: 'Literal value',
+ }),
kind: 'Value',
}));
@@ -289,9 +294,11 @@ function getUnitDuration(unit: number = 1) {
export function getCompatibleLiterals(commandName: string, types: string[], names?: string[]) {
const suggestions: SuggestionRawDefinition[] = [];
- if (types.includes('number') && commandName === 'limit') {
- // suggest 10/50/100
- suggestions.push(...buildConstantsDefinitions(['10', '100', '1000'], ''));
+ if (types.includes('number')) {
+ if (commandName === 'limit') {
+ // suggest 10/100/1000 for limit
+ suggestions.push(...buildConstantsDefinitions(['10', '100', '1000'], ''));
+ }
}
if (types.includes('time_literal')) {
// filter plural for now and suggest only unit + singular
From 76931e472210c29354f2477e708fa90254480fec Mon Sep 17 00:00:00 2001
From: jennypavlova
Date: Mon, 22 Apr 2024 12:42:20 +0200
Subject: [PATCH 013/183] [Infra] Use asset details locators in the dashboards
tab (#180933)
Closes #180202
## Summary
This PR adds asset details locators in the dashboards tab.
## Testing
- Create 2 dashboards: the second one should link to the first one
(using links - the second one should open the Dashboard in a new tab)
Example:
- Go to the Dashboard tab inside the single host flyout
-
https://github.com/elastic/kibana/assets/14139027/bb668e7d-2751-4e22-a9b8-236b26313d72
- Go to the Dashboard tab inside the asset details full-page view:
-
https://github.com/elastic/kibana/assets/14139027/77f62e5d-45fc-4f4e-85b5-d4a1b03f76f4
- After navigating the correct dashboard should be shown and the time
range should be the same
---
.../tabs/dashboards/dashboards.tsx | 52 ++++++++++++++++++-
.../observability_shared/public/index.ts | 2 +
.../infra/asset_details_flyout_locator.ts | 2 +-
.../locators/infra/asset_details_locator.ts | 2 +-
4 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
index 5ca216a5734c9..51a4d9fe5976e 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx
@@ -4,7 +4,7 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import React, { useCallback, useEffect, useState } from 'react';
+import React, { useCallback, useEffect, useState, useMemo } from 'react';
import { i18n } from '@kbn/i18n';
import {
@@ -25,6 +25,14 @@ import {
} from '@kbn/dashboard-plugin/public';
import type { DashboardItem } from '@kbn/dashboard-plugin/common/content_management';
+import type { SerializableRecord } from '@kbn/utility-types';
+import {
+ ASSET_DETAILS_FLYOUT_LOCATOR_ID,
+ ASSET_DETAILS_LOCATOR_ID,
+} from '@kbn/observability-shared-plugin/public';
+import { useLocation } from 'react-router-dom';
+import { decode } from '@kbn/rison';
+import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana';
import { buildAssetIdFilter } from '../../../../utils/filters/build';
import type {
InfraSavedCustomDashboard,
@@ -45,7 +53,11 @@ import { FilterExplanationCallout } from './filter_explanation_callout';
export function Dashboards() {
const { dateRange } = useDatePickerContext();
- const { asset } = useAssetDetailsRenderPropsContext();
+ const { asset, renderMode } = useAssetDetailsRenderPropsContext();
+ const location = useLocation();
+ const {
+ services: { share },
+ } = useKibanaContextForPlugin();
const [dashboard, setDashboard] = useState();
const [customDashboards, setCustomDashboards] = useState([]);
const [currentDashboard, setCurrentDashboard] = useState();
@@ -120,6 +132,41 @@ export function Dashboards() {
asset.type,
]);
+ const getLocatorParams = useCallback(
+ (params, isFlyoutView) => {
+ const searchParams = new URLSearchParams(location.search);
+ const tableProperties = searchParams.get('tableProperties');
+ const flyoutParams =
+ isFlyoutView && tableProperties ? { tableProperties: decode(tableProperties) } : {};
+
+ return {
+ assetDetails: { ...urlState, dashboardId: params.dashboardId },
+ assetType: asset.type,
+ assetId: asset.id,
+ ...flyoutParams,
+ };
+ },
+ [asset.id, asset.type, location.search, urlState]
+ );
+
+ const locator = useMemo(() => {
+ const isFlyoutView = renderMode.mode === 'flyout';
+
+ const baseLocator = share.url.locators.get(
+ isFlyoutView ? ASSET_DETAILS_FLYOUT_LOCATOR_ID : ASSET_DETAILS_LOCATOR_ID
+ );
+
+ if (!baseLocator) return;
+
+ return {
+ ...baseLocator,
+ getRedirectUrl: (params: SerializableRecord) =>
+ baseLocator.getRedirectUrl(getLocatorParams(params, isFlyoutView)),
+ navigate: (params: SerializableRecord) =>
+ baseLocator.navigate(getLocatorParams(params, isFlyoutView)),
+ };
+ }, [renderMode.mode, share.url.locators, getLocatorParams]);
+
if (loading || status === FETCH_STATUS.LOADING) {
return (
@@ -198,6 +245,7 @@ export function Dashboards() {
savedObjectId={urlState?.dashboardId}
getCreationOptions={getCreationOptions}
ref={setDashboard}
+ locator={locator}
/>
)}
diff --git a/x-pack/plugins/observability_solution/observability_shared/public/index.ts b/x-pack/plugins/observability_solution/observability_shared/public/index.ts
index b1d8f97425e3f..15a977a6c236b 100644
--- a/x-pack/plugins/observability_solution/observability_shared/public/index.ts
+++ b/x-pack/plugins/observability_solution/observability_shared/public/index.ts
@@ -102,3 +102,5 @@ export {
} from './components/feature_feedback_button/feature_feedback_button';
export { BottomBarActions } from './components/bottom_bar_actions/bottom_bar_actions';
export { FieldValueSelection, FieldValueSuggestions } from './components';
+export { ASSET_DETAILS_FLYOUT_LOCATOR_ID } from './locators/infra/asset_details_flyout_locator';
+export { ASSET_DETAILS_LOCATOR_ID } from './locators/infra/asset_details_locator';
diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts
index e9c3b23537455..0bc499f6bf508 100644
--- a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts
+++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts
@@ -32,7 +32,7 @@ export interface AssetDetailsFlyoutLocatorParams extends SerializableRecord {
};
}
-const ASSET_DETAILS_FLYOUT_LOCATOR_ID = 'ASSET_DETAILS_FLYOUT_LOCATOR';
+export const ASSET_DETAILS_FLYOUT_LOCATOR_ID = 'ASSET_DETAILS_FLYOUT_LOCATOR';
export class AssetDetailsFlyoutLocatorDefinition
implements LocatorDefinition
diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts
index 7a0d727b8d4ee..b89c616bfb520 100644
--- a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts
+++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts
@@ -30,7 +30,7 @@ export interface AssetDetailsLocatorParams extends SerializableRecord {
};
}
-const ASSET_DETAILS_LOCATOR_ID = 'ASSET_DETAILS_LOCATOR';
+export const ASSET_DETAILS_LOCATOR_ID = 'ASSET_DETAILS_LOCATOR';
export class AssetDetailsLocatorDefinition implements LocatorDefinition {
public readonly id = ASSET_DETAILS_LOCATOR_ID;
From 94fe888c993d7ac6fc9cfae13d8a12aa5231f297 Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Mon, 22 Apr 2024 06:42:52 -0400
Subject: [PATCH 014/183] [Observability Onboarding] Include virtual cards in
searchable list (#180952)
## Summary
Resolves #180822.
Adds a new prop to the integrations list. When specified, the list will
join the provided custom cards with the integrations cards from the API,
so as the user is searching if a custom card matches their query they
will also see it in the list at the bottom of the onboarding flow.
## Testing
For each onboarding question that includes a Quickstart card, check that
you're able to search for it in the search list at the bottom of the
page.
---------
Co-authored-by: Joe Reuter
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../onboarding_flow_form.tsx | 2 +
.../application/packages_list/index.tsx | 8 +-
.../use_integration_card_list.ts | 89 +++++++++++++------
.../public/application/packages_list/utils.ts | 17 ++++
4 files changed, 88 insertions(+), 28 deletions(-)
create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
index 605532bcf8d5b..5a10e507a6851 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
@@ -164,6 +164,8 @@ export const OnboardingFlowForm: FunctionComponent = () => {
searchQuery={integrationSearch}
setSearchQuery={setIntegrationSearch}
ref={packageListSearchBarRef}
+ customCards={customCards?.filter(({ name, type }) => type === 'generated')}
+ joinCardLists
/>
>
)}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index 6fa0ba354a28a..7930d4e6a699c 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -32,6 +32,10 @@ interface Props {
searchBarRef?: React.Ref;
searchQuery?: string;
setSearchQuery?: React.Dispatch>;
+ /**
+ * When enabled, custom and integration cards are joined into a single list.
+ */
+ joinCardLists?: boolean;
}
type WrapperProps = Props & {
@@ -48,6 +52,7 @@ const PackageListGridWrapper = ({
searchQuery,
setSearchQuery,
customCards,
+ joinCardLists = false,
}: WrapperProps) => {
const [isInitialHidden, setIsInitialHidden] = useState(showSearchBar);
const customMargin = useCustomMargin();
@@ -58,7 +63,8 @@ const PackageListGridWrapper = ({
const list: IntegrationCardItem[] = useIntegrationCardList(
filteredCards,
selectedCategory,
- customCards
+ customCards,
+ joinCardLists
);
React.useEffect(() => {
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
index cf0ff8f005a50..8d5a275a4523b 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
@@ -8,13 +8,7 @@
import { useMemo } from 'react';
import { IntegrationCardItem } from '@kbn/fleet-plugin/public';
import { CustomCard } from './types';
-
-const QUICKSTART_FLOWS = ['kubernetes', 'nginx', 'system-logs-generated'];
-
-const toCustomCard = (card: IntegrationCardItem) => ({
- ...card,
- isQuickstart: QUICKSTART_FLOWS.includes(card.name),
-});
+import { toCustomCard } from './utils';
function extractFeaturedCards(filteredCards: IntegrationCardItem[], featuredCardNames?: string[]) {
const featuredCards: Record = {};
@@ -26,30 +20,71 @@ function extractFeaturedCards(filteredCards: IntegrationCardItem[], featuredCard
return featuredCards;
}
+function formatCustomCards(
+ customCards: CustomCard[],
+ featuredCards: Record
+) {
+ const cards: IntegrationCardItem[] = [];
+ for (const card of customCards) {
+ if (card.type === 'featured' && !!featuredCards[card.name]) {
+ cards.push(toCustomCard(featuredCards[card.name]!));
+ } else if (card.type === 'generated') {
+ cards.push(toCustomCard(card));
+ }
+ }
+ return cards;
+}
+
+function useFilteredCards(
+ integrationsList: IntegrationCardItem[],
+ selectedCategory: string,
+ customCards?: CustomCard[]
+) {
+ return useMemo(() => {
+ const integrationCards = integrationsList
+ .filter((card) => card.categories.includes(selectedCategory))
+ .map(toCustomCard);
+
+ if (!customCards) {
+ return { featuredCards: {}, integrationCards };
+ }
+
+ return {
+ featuredCards: extractFeaturedCards(
+ integrationsList,
+ customCards.filter((c) => c.type === 'featured').map((c) => c.name)
+ ),
+ integrationCards,
+ };
+ }, [integrationsList, customCards, selectedCategory]);
+}
+
+/**
+ * Formats the cards to display on the integration list.
+ * @param integrationsList the list of cards from the integrations API.
+ * @param selectedCategory the card category to filter by.
+ * @param customCards any virtual or featured cards.
+ * @param fullList when true all integration cards are included.
+ * @returns the list of cards to display.
+ */
export function useIntegrationCardList(
- filteredCards: IntegrationCardItem[],
+ integrationsList: IntegrationCardItem[],
selectedCategory = 'observability',
- customCards?: CustomCard[]
+ customCards?: CustomCard[],
+ fullList = false
): IntegrationCardItem[] {
- const featuredCards = useMemo(() => {
- if (!customCards) return {};
- return extractFeaturedCards(
- filteredCards,
- customCards.filter((c) => c.type === 'featured').map((c) => c.name)
- );
- }, [filteredCards, customCards]);
+ const { featuredCards, integrationCards } = useFilteredCards(
+ integrationsList,
+ selectedCategory,
+ customCards
+ );
if (customCards && customCards.length > 0) {
- return customCards
- .map((c) => {
- if (c.type === 'featured') {
- return !!featuredCards[c.name] ? toCustomCard(featuredCards[c.name]!) : null;
- }
- return toCustomCard(c);
- })
- .filter((c) => c) as IntegrationCardItem[];
+ const formattedCustomCards = formatCustomCards(customCards, featuredCards);
+ if (fullList) {
+ return [...formattedCustomCards, ...integrationCards] as IntegrationCardItem[];
+ }
+ return formattedCustomCards;
}
- return filteredCards
- .filter((card) => card.categories.includes(selectedCategory))
- .map(toCustomCard);
+ return integrationCards;
}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
new file mode 100644
index 0000000000000..014aa4314f104
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { IntegrationCardItem } from '@kbn/fleet-plugin/public';
+
+export const QUICKSTART_FLOWS = ['kubernetes', 'nginx', 'system-logs-generated'];
+
+export const toCustomCard = (card: IntegrationCardItem) => ({
+ ...card,
+ isQuickstart: QUICKSTART_FLOWS.includes(card.name),
+});
+
+export const isQuickstart = (cardName: string) => QUICKSTART_FLOWS.includes(cardName);
From 8a992997e9f942b39182a087df44604dc69957cf Mon Sep 17 00:00:00 2001
From: Christos Nasikas
Date: Mon, 22 Apr 2024 13:44:19 +0300
Subject: [PATCH 015/183] [Cases] Fix flaky functional tests (#181230)
## Summary
I ran the flaky test runner multiple times. I did not find any good
reason why some of the tests were flaky in the first place.
Flaky test runner:
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5720,
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5721,
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5727
Fixes: https://github.com/elastic/kibana/issues/179016,
https://github.com/elastic/kibana/issues/178991,
https://github.com/elastic/kibana/issues/176716,
https://github.com/elastic/kibana/issues/178690
### Checklist
Delete any items that are not applicable to this PR.
- [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] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../all_cases/multi_select_filter.tsx | 4 ++
x-pack/test/functional/services/cases/list.ts | 26 +++++------
.../apps/cases/group2/attachment_framework.ts | 44 ++++++++++---------
.../apps/cases/group2/list_view.ts | 9 ++--
4 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/x-pack/plugins/cases/public/components/all_cases/multi_select_filter.tsx b/x-pack/plugins/cases/public/components/all_cases/multi_select_filter.tsx
index 080fe6df352c7..c8cc85bde823e 100644
--- a/x-pack/plugins/cases/public/components/all_cases/multi_select_filter.tsx
+++ b/x-pack/plugins/cases/public/components/all_cases/multi_select_filter.tsx
@@ -155,6 +155,10 @@ export const MultiSelectFilter = ({
closePopover={() => setIsPopoverOpen(false)}
panelPaddingSize="none"
repositionOnScroll
+ panelProps={{
+ 'data-test-subj': `options-filter-popover-panel-${id}`,
+ }}
+ data-test-subj={`options-filter-popover-${id}`}
>
{isInvalid && (
<>
diff --git a/x-pack/test/functional/services/cases/list.ts b/x-pack/test/functional/services/cases/list.ts
index bce45cb13280b..b449b6f18438a 100644
--- a/x-pack/test/functional/services/cases/list.ts
+++ b/x-pack/test/functional/services/cases/list.ts
@@ -179,10 +179,6 @@ export function CasesTableServiceProvider(
await testSubjects.click(`options-filter-popover-item-${status}`);
// to close the popup
await testSubjects.click('options-filter-popover-button-status');
-
- await testSubjects.missingOrFail(`options-filter-popover-item-${status}`, {
- timeout: 5000,
- });
},
async filterBySeverity(severity: CaseSeverity) {
@@ -202,18 +198,22 @@ export function CasesTableServiceProvider(
await casesCommon.selectFirstRowInAssigneesPopover();
},
- async filterByOwner(
- owner: string,
- options: { popupAlreadyOpen: boolean } = { popupAlreadyOpen: false }
- ) {
- if (!options.popupAlreadyOpen) {
- await common.clickAndValidate(
- 'options-filter-popover-button-owner',
- `options-filter-popover-item-${owner}`
- );
+ async filterByOwner(owner: string) {
+ const isAlreadyOpen = await testSubjects.exists('options-filter-popover-panel-owner');
+
+ if (isAlreadyOpen) {
+ await testSubjects.click(`options-filter-popover-item-${owner}`);
+ await header.waitUntilLoadingHasFinished();
+ return;
}
+ await retry.waitFor(`filterByOwner popover opened`, async () => {
+ await testSubjects.click('options-filter-popover-button-owner');
+ return await testSubjects.exists('options-filter-popover-panel-owner');
+ });
+
await testSubjects.click(`options-filter-popover-item-${owner}`);
+ await header.waitUntilLoadingHasFinished();
},
async refreshTable() {
diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts
index 8909d8cea2ec5..c45df81316e81 100644
--- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts
+++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts
@@ -62,6 +62,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
const lens = getPageObject('lens');
const listingTable = getService('listingTable');
const toasts = getService('toasts');
+ const browser = getService('browser');
const createAttachmentAndNavigate = async (attachment: AttachmentRequest) => {
const caseData = await cases.api.createCase({
@@ -262,8 +263,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
});
});
- // FLAKY: https://github.com/elastic/kibana/issues/178690
- describe.skip('Modal', () => {
+ describe('Modal', () => {
const createdCases = new Map();
const openModal = async () => {
@@ -273,6 +273,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
const closeModal = async () => {
await find.clickByCssSelector('[data-test-subj="all-cases-modal"] > button');
+ await testSubjects.missingOrFail('all-cases-modal');
};
before(async () => {
@@ -282,6 +283,10 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
}
});
+ beforeEach(async () => {
+ await browser.refresh();
+ });
+
after(async () => {
await deleteAllCaseItems(es);
});
@@ -292,29 +297,22 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
await testSubjects.existOrFail('options-filter-popover-button-owner');
for (const [, currentCaseId] of createdCases.entries()) {
- await testSubjects.existOrFail(`cases-table-row-${currentCaseId}`);
+ await cases.casesTable.getCaseById(currentCaseId);
}
await closeModal();
});
- it('filters correctly', async () => {
+ it('filters correctly with owner cases', async () => {
for (const [owner, currentCaseId] of createdCases.entries()) {
await openModal();
-
await cases.casesTable.filterByOwner(owner);
- await cases.casesTable.waitForTableToFinishLoading();
- await testSubjects.existOrFail(`cases-table-row-${currentCaseId}`);
-
+ await cases.casesTable.getCaseById(currentCaseId);
/**
- * We ensure that the other cases are not shown
+ * The select button matched the query of the
+ * [data-test-subj*="cases-table-row-" query
*/
- for (const otherCaseId of createdCases.values()) {
- if (otherCaseId !== currentCaseId) {
- await testSubjects.missingOrFail(`cases-table-row-${otherCaseId}`);
- }
- }
-
+ await cases.casesTable.validateCasesTableHasNthRows(2);
await closeModal();
}
});
@@ -322,16 +320,22 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
it('filters with multiple selection', async () => {
await openModal();
- let popupAlreadyOpen = false;
for (const [owner] of createdCases.entries()) {
- await cases.casesTable.filterByOwner(owner, { popupAlreadyOpen });
- popupAlreadyOpen = true;
+ await cases.casesTable.filterByOwner(owner);
}
+
await cases.casesTable.waitForTableToFinishLoading();
+ /**
+ * The select button matched the query of the
+ * [data-test-subj*="cases-table-row-" query
+ */
+ await cases.casesTable.validateCasesTableHasNthRows(6);
+
for (const caseId of createdCases.values()) {
- await testSubjects.existOrFail(`cases-table-row-${caseId}`);
+ await cases.casesTable.getCaseById(caseId);
}
+
await closeModal();
});
@@ -340,7 +344,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
await openModal();
await cases.casesTable.waitForTableToFinishLoading();
- await testSubjects.existOrFail(`cases-table-row-${currentCaseId}`);
+ await cases.casesTable.getCaseById(currentCaseId);
await testSubjects.click(`cases-table-row-select-${currentCaseId}`);
await cases.common.expectToasterToContain('has been updated');
diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts
index c6704ea2d3466..f1b4e4ea8485a 100644
--- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts
+++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts
@@ -284,8 +284,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
});
});
- // FLAKY: https://github.com/elastic/kibana/issues/178991
- describe.skip('filtering', () => {
+ describe('filtering', () => {
const caseTitle = 'matchme';
let caseIds: string[] = [];
const profiles: UserProfile[] = [];
@@ -753,8 +752,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
expect(await testSubjects.exists('all-cases-clear-filters-link-icon')).to.be(false);
});
- // FLAKY: https://github.com/elastic/kibana/issues/176716
- describe.skip('assignees filtering', () => {
+ describe('assignees filtering', () => {
it('filters cases by the first cases all user assignee', async () => {
await cases.casesTable.filterByAssignee('all');
await cases.casesTable.validateCasesTableHasNthRows(1);
@@ -796,8 +794,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
});
});
- // FLAKY: https://github.com/elastic/kibana/issues/179016
- describe.skip('severity filtering', () => {
+ describe('severity filtering', () => {
before(async () => {
await cases.navigation.navigateToApp();
await cases.api.createCase({ severity: CaseSeverity.LOW });
From d7a2fe2c83d622f5f7dd52b146696b78712567e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?=
Date: Mon, 22 Apr 2024 12:46:15 +0200
Subject: [PATCH 016/183] [Search] Fix connectors guided onboarding (#181173)
## Summary
Fixes Guided onboarding add data step for connectors.
### Checklist
Delete any items that are not applicable to this PR.
- [ ] [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
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../components/connector_detail/connector_detail.tsx | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx
index 4c3b1deceff2b..be3f7964fb370 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx
@@ -58,9 +58,21 @@ export const ConnectorDetail: React.FC = () => {
}>();
const {
+ guidedOnboarding,
productFeatures: { hasDefaultIngestPipeline },
} = useValues(KibanaLogic);
+ useEffect(() => {
+ const subscription = guidedOnboarding?.guidedOnboardingApi
+ ?.isGuideStepActive$('databaseSearch', 'add_data')
+ .subscribe((isStepActive) => {
+ if (isStepActive && index?.count) {
+ guidedOnboarding.guidedOnboardingApi?.completeGuideStep('databaseSearch', 'add_data');
+ }
+ });
+ return () => subscription?.unsubscribe();
+ }, [guidedOnboarding, index?.count]);
+
const ALL_INDICES_TABS = [
{
content: ,
From 6299736dbcb25756a44aa1013a4d218c62507e5c Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Mon, 22 Apr 2024 06:47:28 -0400
Subject: [PATCH 017/183] [Observability Onboarding] Remove temporary
onboarding flow nav (#181069)
## Summary
Resolves #180823.
We had temporary nav in lieu of the integrations list being merged. We
no longer need the temp nav so this removes it.
Co-authored-by: Joe Reuter
---
.../experimental_onboarding_flow.tsx | 43 +------------------
1 file changed, 1 insertion(+), 42 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx
index 1e6c0b48061c4..265e1cf810476 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx
@@ -8,18 +8,9 @@
import { i18n } from '@kbn/i18n';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import React from 'react';
-import { useHistory } from 'react-router-dom';
import { Route, Routes } from '@kbn/shared-ux-router';
-import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public';
import { useNavigate, useLocation } from 'react-router-dom-v5-compat';
-import {
- EuiButton,
- EuiButtonEmpty,
- EuiFlexGroup,
- EuiFlexItem,
- EuiPageTemplate,
- EuiSpacer,
-} from '@elastic/eui';
+import { EuiButtonEmpty, EuiPageTemplate, EuiSpacer } from '@elastic/eui';
import { css } from '@emotion/react';
import backgroundImageUrl from './header/background.svg';
import { Footer } from './footer/footer';
@@ -31,40 +22,8 @@ import { CustomLogsPanel } from './quickstart_flows/custom_logs';
const queryClient = new QueryClient();
export function ExperimentalOnboardingFlow() {
- const history = useHistory();
- const location = useLocation();
-
return (
- {/* Test buttons to be removed once integrations selector has been implemented */}
-
-
-
-
- {i18n.translate(
- 'xpack.observability_onboarding.experimentalOnboardingFlow.systemLogsButtonLabel',
- { defaultMessage: 'System Logs' }
- )}
-
-
-
-
- {i18n.translate(
- 'xpack.observability_onboarding.experimentalOnboardingFlow.customLogsButtonLabel',
- { defaultMessage: 'Custom Logs' }
- )}
-
-
-
-
Date: Mon, 22 Apr 2024 13:39:47 +0200
Subject: [PATCH 018/183] fix otel service detection (#180574)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary
With newer versions of the Java agent (tested with 2.2.0 here), the
`agent.name` field now contains multiple parts and we should consider
the prefix and not the whole string to properly detect if it's an otel
agent or not.
Fixing this is also a prerequisite for
https://github.com/elastic/kibana/issues/174445 as the metric charts are
not properly displayed for otel agents (and the java one in particular).
Fixes https://github.com/elastic/kibana/issues/180444
#### Without the fix
![Screenshot from 2024-04-11
12-01-55](https://github.com/elastic/kibana/assets/763082/986a6728-1d84-48ed-ba7e-9236f258545b)
#### After fixing it
![image](https://github.com/elastic/kibana/assets/763082/4726427d-6d18-4f9b-a389-f860924f512c)
### Checklist
Delete any items that are not applicable to this PR.
I'm really not a typescript nor kibana expert, so I'm pretty sure there
are better and cleaner ways to implement this.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### Risk Matrix
Delete this section if it is not applicable to this PR.
Before closing this PR, invite QA, stakeholders, and other developers to
identify risks that should be tested prior to the change/feature
release.
When forming the risk matrix, consider some of the following examples
and how they may potentially impact the change:
| Risk | Probability | Severity | Mitigation/Notes |
|---------------------------|-------------|----------|-------------------------|
| Multiple Spaces—unexpected behavior in non-default Kibana Space.
| Low | High | Integration tests will verify that all features are still
supported in non-default Kibana Space and when user switches between
spaces. |
| Multiple nodes—Elasticsearch polling might have race conditions
when multiple Kibana nodes are polling for the same tasks. | High | Low
| Tasks are idempotent, so executing them multiple times will not result
in logical error, but will degrade performance. To test for this case we
add plenty of unit tests around this logic and document manual testing
procedure. |
| Code should gracefully handle cases when feature X or plugin Y are
disabled. | Medium | High | Unit tests will verify that any feature flag
or plugin combination still results in our service operational. |
| [See more potential risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) |
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com>
---
.../kbn-elastic-agent-utils/src/agent_guards.test.ts | 6 ++++++
packages/kbn-elastic-agent-utils/src/agent_guards.ts | 10 ++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts b/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts
index 0de2ea225ce81..aa55aa94b16ca 100644
--- a/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts
+++ b/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts
@@ -23,11 +23,17 @@ import {
describe('Agents guards', () => {
it('isOpenTelemetryAgentName should guard if the passed agent is an OpenTelemetry one.', () => {
expect(isOpenTelemetryAgentName('otlp')).toBe(true);
+ expect(isOpenTelemetryAgentName('opentelemetry/java')).toBe(true);
+ expect(isOpenTelemetryAgentName('opentelemetry/java/opentelemetry-java-instrumentation')).toBe(
+ true
+ );
expect(isOpenTelemetryAgentName('not-an-agent')).toBe(false);
});
it('isJavaAgentName should guard if the passed agent is an Java one.', () => {
expect(isJavaAgentName('java')).toBe(true);
+ expect(isJavaAgentName('opentelemetry/java')).toBe(true);
+ expect(isJavaAgentName('opentelemetry/java/opentelemetry-java-instrumentation')).toBe(true);
expect(isJavaAgentName('not-an-agent')).toBe(false);
});
diff --git a/packages/kbn-elastic-agent-utils/src/agent_guards.ts b/packages/kbn-elastic-agent-utils/src/agent_guards.ts
index 6997cbd81c42c..43cf4cce89f4a 100644
--- a/packages/kbn-elastic-agent-utils/src/agent_guards.ts
+++ b/packages/kbn-elastic-agent-utils/src/agent_guards.ts
@@ -16,11 +16,17 @@ import type {
} from './agent_names';
export function isOpenTelemetryAgentName(agentName: string): agentName is OpenTelemetryAgentName {
- return OPEN_TELEMETRY_AGENT_NAMES.includes(agentName as OpenTelemetryAgentName);
+ return (
+ agentName?.startsWith('opentelemetry/') ||
+ OPEN_TELEMETRY_AGENT_NAMES.includes(agentName as OpenTelemetryAgentName)
+ );
}
export function isJavaAgentName(agentName?: string): agentName is JavaAgentName {
- return JAVA_AGENT_NAMES.includes(agentName! as JavaAgentName);
+ return (
+ agentName?.startsWith('opentelemetry/java') ||
+ JAVA_AGENT_NAMES.includes(agentName! as JavaAgentName)
+ );
}
export function isRumAgentName(agentName?: string): agentName is RumAgentName {
From 753e8c7917105b1ae089fdffb99ae99c115fdeff Mon Sep 17 00:00:00 2001
From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com>
Date: Mon, 22 Apr 2024 13:44:28 +0200
Subject: [PATCH 019/183] Add "Give feedback" button (#180942)
## Summary
Closes https://github.com/elastic/kibana/issues/180825
![image](https://github.com/elastic/kibana/assets/82822460/12a5a362-28c3-4837-b7ca-d33640333ac7)
### Checklist
Delete any items that are not applicable to this PR.
- [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/packages/kbn-i18n/README.md)
- [x] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [x] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
x-pack/plugins/serverless/public/plugin.tsx | 24 +++++++++++++++++++++
x-pack/plugins/serverless/tsconfig.json | 1 +
2 files changed, 25 insertions(+)
diff --git a/x-pack/plugins/serverless/public/plugin.tsx b/x-pack/plugins/serverless/public/plugin.tsx
index 451752b28168c..ee2b32e4d97a5 100644
--- a/x-pack/plugins/serverless/public/plugin.tsx
+++ b/x-pack/plugins/serverless/public/plugin.tsx
@@ -5,8 +5,11 @@
* 2.0.
*/
+import { EuiButton } from '@elastic/eui';
import { InternalChromeStart } from '@kbn/core-chrome-browser-internal';
import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public';
+import { i18n } from '@kbn/i18n';
+import { toMountPoint } from '@kbn/react-kibana-mount';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
import { ProjectSwitcher, ProjectSwitcherKibanaProvider } from '@kbn/serverless-project-switcher';
import { ProjectType } from '@kbn/serverless-types';
@@ -77,6 +80,27 @@ export class ServerlessPlugin
const activeNavigationNodes$ = project.getActiveNavigationNodes$();
const navigationTreeUi$ = project.getNavigationTreeUi$();
+ core.chrome.navControls.registerRight({
+ order: 1,
+ mount: toMountPoint(
+
+
+ {i18n.translate('xpack.serverless.header.giveFeedbackBtn.label', {
+ defaultMessage: 'Give feedback',
+ })}
+
+ ,
+ { ...core }
+ ),
+ });
+
return {
setSideNavComponentDeprecated: (sideNavigationComponent) =>
project.setSideNavComponent(sideNavigationComponent),
diff --git a/x-pack/plugins/serverless/tsconfig.json b/x-pack/plugins/serverless/tsconfig.json
index 48931f2a37936..ce60d39bef0f0 100644
--- a/x-pack/plugins/serverless/tsconfig.json
+++ b/x-pack/plugins/serverless/tsconfig.json
@@ -26,6 +26,7 @@
"@kbn/shared-ux-chrome-navigation",
"@kbn/i18n",
"@kbn/management-cards-navigation",
+ "@kbn/react-kibana-mount",
"@kbn/react-kibana-context-render",
]
}
From e18d19fafcee86e8858ca3ec8023ba43418c31c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Yulia=20=C4=8Cech?=
<6585477+yuliacech@users.noreply.github.com>
Date: Mon, 22 Apr 2024 14:05:08 +0200
Subject: [PATCH 020/183] [Console] Implement documentation action button
(#181057)
## Summary
Closes https://github.com/elastic/kibana/issues/180209
This PR implements the "view documentation" button in the new Monaco
editor in Console. The code re-use the existing autocomplete
functionality and gets the documentation link for the current request
from autocomplete definitions. The current request is the 1st request of
the user selection in the editor. The link is opened in the new tab and
if no link is available or the request is unknown, then nothing happens
(existing functionality, we might want to hide the button in that case
in a [follow up work](https://github.com/elastic/kibana/issues/180911))
### Screen recording
https://github.com/elastic/kibana/assets/6585477/56ea016c-02b6-4134-97b7-914204557d61
### How to test
1. Add `console.dev.enableMonaco: true` to the `config/kibana.dev.yml`
file
2. Start Kibana and ES locally
3. Navigate to the Dev tools Console and try using the "view
documentation" button for various requests
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../editor/monaco/monaco_editor.tsx | 9 ++--
.../monaco_editor_actions_provider.test.ts | 46 +++++++++++++++++++
.../monaco/monaco_editor_actions_provider.ts | 30 ++++++++++++
.../containers/editor/monaco/utils.test.ts | 45 ++++++++++++++++++
.../containers/editor/monaco/utils.ts | 31 +++++++++++++
5 files changed, 158 insertions(+), 3 deletions(-)
diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx
index a929fa4148f54..c3b9b1c8dee1c 100644
--- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx
+++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx
@@ -37,6 +37,7 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => {
settings: settingsService,
autocompleteInfo,
},
+ docLinkVersion,
} = useServicesContext();
const { toasts } = notifications;
const { settings } = useEditorReadContext();
@@ -53,6 +54,10 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => {
return curl ?? '';
}, [esHostService]);
+ const getDocumenationLink = useCallback(async () => {
+ return actionsProvider.current!.getDocumentationLink(docLinkVersion);
+ }, [docLinkVersion]);
+
const sendRequestsCallback = useCallback(async () => {
await actionsProvider.current?.sendRequests(toasts, dispatch, trackUiMetric, http);
}, [dispatch, http, toasts, trackUiMetric]);
@@ -103,9 +108,7 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => {
{
- return Promise.resolve(null);
- }}
+ getDocumentation={getDocumenationLink}
autoIndent={() => {}}
notifications={notifications}
/>
diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts
index ee2be44ec812e..94f6f962e6f41 100644
--- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts
+++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts
@@ -10,6 +10,12 @@
* Mock kbn/monaco to provide the console parser code directly without a web worker
*/
const mockGetParsedRequests = jest.fn();
+
+/*
+ * Mock the function "populateContext" that accesses the autocomplete definitions
+ */
+const mockPopulateContext = jest.fn();
+
jest.mock('@kbn/monaco', () => {
const original = jest.requireActual('@kbn/monaco');
return {
@@ -33,6 +39,14 @@ jest.mock('../../../../services', () => {
};
});
+jest.mock('../../../../lib/autocomplete/engine', () => {
+ return {
+ populateContext: (...args: any) => {
+ mockPopulateContext(args);
+ },
+ };
+});
+
import { MonacoEditorActionsProvider } from './monaco_editor_actions_provider';
import { monaco } from '@kbn/monaco';
@@ -101,4 +115,36 @@ describe('Editor actions provider', () => {
expect(curl).toBe('curl -XGET "http://localhost/_search" -H "kbn-xsrf: reporting"');
});
});
+
+ describe('getDocumentationLink', () => {
+ const docLinkVersion = '8.13';
+ const docsLink = 'http://elastic.co/_search';
+ // mock the populateContext function that finds the correct autocomplete endpoint object and puts it into the context object
+ mockPopulateContext.mockImplementation((...args) => {
+ const context = args[0][1];
+ context.endpoint = {
+ documentation: docsLink,
+ };
+ });
+ it('returns null if no requests', async () => {
+ mockGetParsedRequests.mockResolvedValue([]);
+ const link = await editorActionsProvider.getDocumentationLink(docLinkVersion);
+ expect(link).toBe(null);
+ });
+
+ it('returns null if there is a request but not in the selection range', async () => {
+ editor.getSelection.mockReturnValue({
+ // the request is on line 1, the user selected line 2
+ startLineNumber: 2,
+ endLineNumber: 2,
+ } as unknown as monaco.Selection);
+ const link = await editorActionsProvider.getDocumentationLink(docLinkVersion);
+ expect(link).toBe(null);
+ });
+
+ it('returns the correct link if there is a request in the selection range', async () => {
+ const link = await editorActionsProvider.getDocumentationLink(docLinkVersion);
+ expect(link).toBe(docsLink);
+ });
+ });
});
diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts
index af87f7fb68d24..31fc969449e84 100644
--- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts
+++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts
@@ -17,8 +17,11 @@ import {
import { IToasts } from '@kbn/core-notifications-browser';
import { i18n } from '@kbn/i18n';
import type { HttpSetup } from '@kbn/core-http-browser';
+import { AutoCompleteContext } from '../../../../lib/autocomplete/types';
+import { populateContext } from '../../../../lib/autocomplete/engine';
import { DEFAULT_VARIABLES } from '../../../../../common/constants';
import { getStorage, StorageKeys } from '../../../../services';
+import { getTopLevelUrlCompleteComponents } from '../../../../lib/kb';
import { sendRequest } from '../../../hooks/use_send_current_request/send_request';
import { MetricsTracker } from '../../../../types';
import { Actions } from '../../../stores/request';
@@ -27,6 +30,8 @@ import {
replaceRequestVariables,
getCurlRequest,
trackSentRequests,
+ tokenizeRequestUrl,
+ getDocumentationLinkFromAutocompleteContext,
} from './utils';
const selectedRequestsClass = 'console__monaco_editor__selectedRequests';
@@ -235,4 +240,29 @@ export class MonacoEditorActionsProvider {
}
}
}
+
+ public async getDocumentationLink(docLinkVersion: string): Promise {
+ const requests = await this.getRequests();
+ if (requests.length < 1) {
+ return null;
+ }
+ const request = requests[0];
+
+ // get autocomplete components for the request method
+ const components = getTopLevelUrlCompleteComponents(request.method);
+ // get the url parts from the request url
+ const urlTokens = tokenizeRequestUrl(request.url);
+
+ // this object will contain the information later, it needs to be initialized with some data
+ // similar to the old ace editor context
+ const context: AutoCompleteContext = {
+ method: request.method,
+ urlTokenPath: urlTokens,
+ };
+
+ // this function uses the autocomplete info and the url tokens to find the correct endpoint
+ populateContext(urlTokens, context, undefined, true, components);
+
+ return getDocumentationLinkFromAutocompleteContext(context, docLinkVersion);
+ }
}
diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils.test.ts b/src/plugins/console/public/application/containers/editor/monaco/utils.test.ts
index e2aa1543d8b6f..5869ec4183df7 100644
--- a/src/plugins/console/public/application/containers/editor/monaco/utils.test.ts
+++ b/src/plugins/console/public/application/containers/editor/monaco/utils.test.ts
@@ -8,12 +8,15 @@
import {
getCurlRequest,
+ getDocumentationLinkFromAutocompleteContext,
removeTrailingWhitespaces,
replaceRequestVariables,
stringifyRequest,
+ tokenizeRequestUrl,
trackSentRequests,
} from './utils';
import { MetricsTracker } from '../../../../types';
+import { AutoCompleteContext } from '../../../../lib/autocomplete/types';
describe('monaco editor utils', () => {
const dataObjects = [
@@ -179,4 +182,46 @@ describe('monaco editor utils', () => {
expect(mockMetricsTracker.count).toHaveBeenNthCalledWith(2, 'POST__test');
});
});
+
+ describe('tokenizeRequestUrl', () => {
+ it('returns the url if it has only 1 part', () => {
+ const url = '_search';
+ const urlTokens = tokenizeRequestUrl(url);
+ expect(urlTokens).toEqual(['_search', '__url_path_end__']);
+ });
+
+ it('returns correct url tokens', () => {
+ const url = '_search/test';
+ const urlTokens = tokenizeRequestUrl(url);
+ expect(urlTokens).toEqual(['_search', 'test', '__url_path_end__']);
+ });
+ });
+
+ describe('getDocumentationLinkFromAutocompleteContext', () => {
+ const version = '8.13';
+ const expectedLink = 'http://elastic.co/8.13/_search';
+ it('correctly replaces {branch} with the version', () => {
+ const endpoint = {
+ documentation: 'http://elastic.co/{branch}/_search',
+ } as AutoCompleteContext['endpoint'];
+ const link = getDocumentationLinkFromAutocompleteContext({ endpoint }, version);
+ expect(link).toBe(expectedLink);
+ });
+
+ it('correctly replaces /master/ with the version', () => {
+ const endpoint = {
+ documentation: 'http://elastic.co/master/_search',
+ } as AutoCompleteContext['endpoint'];
+ const link = getDocumentationLinkFromAutocompleteContext({ endpoint }, version);
+ expect(link).toBe(expectedLink);
+ });
+
+ it('correctly replaces /current/ with the version', () => {
+ const endpoint = {
+ documentation: 'http://elastic.co/current/_search',
+ } as AutoCompleteContext['endpoint'];
+ const link = getDocumentationLinkFromAutocompleteContext({ endpoint }, version);
+ expect(link).toBe(expectedLink);
+ });
+ });
});
diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils.ts b/src/plugins/console/public/application/containers/editor/monaco/utils.ts
index f5725ad271fc6..3caa966547a1a 100644
--- a/src/plugins/console/public/application/containers/editor/monaco/utils.ts
+++ b/src/plugins/console/public/application/containers/editor/monaco/utils.ts
@@ -7,6 +7,7 @@
*/
import { ParsedRequest } from '@kbn/monaco';
+import { AutoCompleteContext } from '../../../../lib/autocomplete/types';
import { constructUrl } from '../../../../lib/es';
import type { DevToolsVariable } from '../../../components';
import { EditorRequest } from './monaco_editor_actions_provider';
@@ -74,3 +75,33 @@ export const trackSentRequests = (
trackUiMetric.count(eventName);
});
};
+
+/*
+ * This function takes a request url as a string and returns it parts,
+ * for example '_search/test' => ['_search', 'test']
+ */
+const urlPartsSeparatorRegex = /\//;
+const endOfUrlToken = '__url_path_end__';
+export const tokenizeRequestUrl = (url: string): string[] => {
+ const parts = url.split(urlPartsSeparatorRegex);
+ // this special token is used to mark the end of the url
+ parts.push(endOfUrlToken);
+ return parts;
+};
+
+/*
+ * This function returns a documentation link from the autocomplete endpoint object
+ * and replaces the branch in the url with the current version "docLinkVersion"
+ */
+export const getDocumentationLinkFromAutocompleteContext = (
+ { endpoint }: AutoCompleteContext,
+ docLinkVersion: string
+): string | null => {
+ if (endpoint && endpoint.documentation && endpoint.documentation.indexOf('http') !== -1) {
+ return endpoint.documentation
+ .replace('/master/', `/${docLinkVersion}/`)
+ .replace('/current/', `/${docLinkVersion}/`)
+ .replace('/{branch}/', `/${docLinkVersion}/`);
+ }
+ return null;
+};
From 078dd22c47d7ecea4e18b64fb302205a799febd9 Mon Sep 17 00:00:00 2001
From: Walter Rafelsberger
Date: Mon, 22 Apr 2024 14:06:59 +0200
Subject: [PATCH 021/183] [ML] AIOps: Fix missing field caps filters for log
rate analysis. (#181109)
## Summary
Part of #172981.
Field caps requests can be heavy calls in larger clusters. For all other
queries for log rate analysis we were applying filters based on the time
range selection. This was missing from the field caps call. The
following parameters were added to improve the call:
- `index_filter`: Adds a range filter to only get field caps from
indices spanning the deviation time range.
- `filters`: `-metadata` was added to not return fields like `_id` and
esp. `_tier`. We previously had a manually check for `_tier` which is
now unnecessary using this option.
- `types`: Previously we fetched all field types and then filtered out
the ones we don't support. This option allows us to pass in the
supported fields right away and not return unsupported ones in the first
place.
----
Here are examples that show how `index_filter` get applied correctly:
Here the deviation selection spans only 1 month and that is reflected in
the response from the field caps call:
```
{
indices: [ 'gallery-2021-11' ],
fields: {
...
}
}
```
Now the deviation selection covers more months:
```
{
indices: [
'gallery-2021-09',
'gallery-2021-10',
'gallery-2021-11',
'gallery-2021-12',
'gallery-2022-01'
],
fields: {
...
}
}
```
### Checklist
- [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---
.../queries/__mocks__/field_caps_ecommerce.ts | 210 ++------
.../__mocks__/field_caps_large_arrays.ts | 21 +-
.../queries/__mocks__/field_caps_pgbench.ts | 474 +++++++++++++++---
.../queries/fetch_index_info.test.ts | 100 ++++
.../queries/fetch_index_info.ts | 18 +-
5 files changed, 562 insertions(+), 261 deletions(-)
diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_ecommerce.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_ecommerce.ts
index 5de9ac8d2231a..d454ca1358d99 100644
--- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_ecommerce.ts
+++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_ecommerce.ts
@@ -6,228 +6,100 @@
*/
export const fieldCapsEcommerceMock = {
- indices: ['ft_ecommerce'],
+ indices: ['kibana_sample_data_ecommerce'],
fields: {
'products.manufacturer': {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
- 'products.discount_amount': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- 'products.base_unit_price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- type: {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'products.discount_percentage': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- 'products._id.keyword': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- day_of_week_i: {
- integer: { type: 'integer', metadata_field: false, searchable: true, aggregatable: true },
- },
- total_quantity: {
- integer: { type: 'integer', metadata_field: false, searchable: true, aggregatable: true },
- },
- total_unique_products: {
- integer: { type: 'integer', metadata_field: false, searchable: true, aggregatable: true },
- },
- taxless_total_price: {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- 'geoip.continent_name': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- sku: {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- _version: {
- _version: { type: '_version', metadata_field: true, searchable: false, aggregatable: true },
- },
- 'customer_full_name.keyword': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'category.keyword': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'products.taxless_price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- 'products.quantity': {
- integer: { type: 'integer', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'products.price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
- customer_first_name: {
- text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
- },
- customer_phone: {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'geoip.region_name': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- _tier: {
- keyword: { type: 'keyword', metadata_field: true, searchable: true, aggregatable: true },
- },
- _seq_no: {
- _seq_no: { type: '_seq_no', metadata_field: true, searchable: true, aggregatable: true },
- },
- customer_full_name: {
- text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
- },
- 'geoip.country_iso_code': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
- _source: {
- _source: { type: '_source', metadata_field: true, searchable: false, aggregatable: false },
- },
- _id: { _id: { type: '_id', metadata_field: true, searchable: true, aggregatable: false } },
- order_id: {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
'products._id': {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
'products.product_name.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- _index: {
- _index: { type: '_index', metadata_field: true, searchable: true, aggregatable: true },
- },
- 'products.product_id': {
- long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true },
- },
'products.category': {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
'products.manufacturer.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ type: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
manufacturer: {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
products: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- 'products.unit_discount_amount': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
customer_last_name: {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
- 'geoip.location': {
- geo_point: { type: 'geo_point', metadata_field: false, searchable: true, aggregatable: true },
- },
- 'products.tax_amount': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
+ 'products._id.keyword': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'products.product_name': {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
- 'products.min_price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
'manufacturer.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'products.taxful_price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
- },
currency: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'products.base_price': {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
+ 'geoip.continent_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ event: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ sku: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
email: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'customer_full_name.keyword': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
day_of_week: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'customer_last_name.keyword': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
'products.sku': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'customer_last_name.keyword': {
+ 'category.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
geoip: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
+ customer_first_name: {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
+ },
+ customer_phone: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
'products.category.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'geoip.city_name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- order_date: {
- date: { type: 'date', metadata_field: false, searchable: true, aggregatable: true },
+ 'geoip.region_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'customer_first_name.keyword': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'products.created_on': {
- date: { type: 'date', metadata_field: false, searchable: true, aggregatable: true },
+ customer_full_name: {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
+ },
+ 'geoip.country_iso_code': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
category: {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
@@ -238,16 +110,14 @@ export const fieldCapsEcommerceMock = {
user: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- customer_gender: {
+ order_id: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'event.dataset': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- taxful_total_price: {
- half_float: {
- type: 'half_float',
- metadata_field: false,
- searchable: true,
- aggregatable: true,
- },
+ customer_gender: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
},
};
diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_large_arrays.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_large_arrays.ts
index 93a7c230e23c5..05279b7116cc1 100644
--- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_large_arrays.ts
+++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_large_arrays.ts
@@ -6,27 +6,8 @@
*/
export const fieldCapsLargeArraysMock = {
- indices: ['large_arrays'],
+ indices: ['large_array'],
fields: {
- _tier: {
- keyword: { type: 'keyword', metadata_field: true, searchable: true, aggregatable: true },
- },
- _seq_no: {
- _seq_no: { type: '_seq_no', metadata_field: true, searchable: true, aggregatable: true },
- },
- '@timestamp': {
- date: { type: 'date', metadata_field: false, searchable: true, aggregatable: true },
- },
- _index: {
- _index: { type: '_index', metadata_field: true, searchable: true, aggregatable: true },
- },
- _source: {
- _source: { type: '_source', metadata_field: true, searchable: false, aggregatable: false },
- },
- _id: { _id: { type: '_id', metadata_field: true, searchable: true, aggregatable: false } },
- _version: {
- _version: { type: '_version', metadata_field: true, searchable: false, aggregatable: true },
- },
items: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_pgbench.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_pgbench.ts
index 93fd2ad505ad5..a4d85d8673971 100644
--- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_pgbench.ts
+++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/field_caps_pgbench.ts
@@ -6,37 +6,113 @@
*/
export const fieldCapsPgBenchMock = {
- indices: ['my-index'],
+ indices: ['.ds-filebeat-8.2.0-2022.06.07-000082'],
fields: {
- stack: {
+ 'kubernetes.node.uid': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- metadata: {
- flattened: { type: 'flattened', metadata_field: false, searchable: true, aggregatable: true },
+ stack: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'kubernetes.namespace_uid': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'host.os.name.text': {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
+ },
+ 'kubernetes.labels': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
'host.hostname': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'host.mac': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
'kubernetes.node.labels.kubernetes_io/os': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'container.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'service.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'transaction.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
hostname: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'host.os.version': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.labels.beta_kubernetes_io/os': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
_metadata: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- _version: {
- _version: { type: '_version', metadata_field: true, searchable: false, aggregatable: true },
+ 'kubernetes.node.labels.topology_kubernetes_io/region': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'host.os.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'fileset.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.account': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'span.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'agent.hostname': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'req.headers.x-real-ip': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- amount_f: {
- float: { type: 'float', metadata_field: false, searchable: true, aggregatable: true },
+ 'req.headers.connection': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ labels: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'cloud.service': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ '_metadata.message_template': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ input: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'log.origin.function': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'host.containerized': {
+ boolean: { type: 'boolean', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.labels.beta_kubernetes_io/instance-type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.labels.failure-domain_beta_kubernetes_io/region': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.hostname': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'elasticapm_labels.trace.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'host.ip': { ip: { type: 'ip', metadata_field: false, searchable: true, aggregatable: true } },
+ 'agent.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'process.executable.text': {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
'kubernetes.node.labels.addon_gke_io/node-local-dns-ds-ready': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
@@ -50,10 +126,10 @@ export const fieldCapsPgBenchMock = {
'_metadata.user_id': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'kubernetes.container.name': {
+ 'postgresql.log.database': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'postgresql.log.database': {
+ 'kubernetes.container.name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'container.labels.annotation_io_kubernetes_container_restartCount': {
@@ -68,24 +144,15 @@ export const fieldCapsPgBenchMock = {
'host.os.platform': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- _field_names: {
- _field_names: {
- type: '_field_names',
- metadata_field: true,
- searchable: true,
- aggregatable: false,
- },
- },
'cloud.account.id': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- v: { long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true } },
- 'error.message': {
- text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
- },
elasticapm_transaction_id: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'error.message': {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
+ },
'log.file.path': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
@@ -95,9 +162,6 @@ export const fieldCapsPgBenchMock = {
'container.labels.io_kubernetes_container_name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'user.name': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
'user.name.text': {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
@@ -116,6 +180,9 @@ export const fieldCapsPgBenchMock = {
'cloud.instance': {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
+ 'process.name.text': {
+ text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
+ },
'container.labels.io_kubernetes_pod_namespace': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
@@ -137,9 +204,6 @@ export const fieldCapsPgBenchMock = {
'host.os.name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'host.os.name.text': {
- text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
- },
'log.level': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
@@ -164,21 +228,15 @@ export const fieldCapsPgBenchMock = {
'_metadata.elastic_apm_trace_id': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'log.file': {
- object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
- },
- 'log.offset': {
- long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true },
- },
'client.ip': {
ip: { type: 'ip', metadata_field: false, searchable: true, aggregatable: true },
},
+ 'log.file': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
'process.name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'process.name.text': {
- text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
- },
name: {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
@@ -197,18 +255,18 @@ export const fieldCapsPgBenchMock = {
'req.headers.tracestate': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
+ '_metadata.metadata_event_dataset': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
'postgresql.log.timestamp': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- '_metadata.metadata_event_dataset': {
+ 'event.module': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
related: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- 'event.module': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
'req.headers': {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
@@ -218,21 +276,18 @@ export const fieldCapsPgBenchMock = {
'kubernetes.node.labels.cloud_google_com/gke-container-runtime': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'kubernetes.pod.name': {
- keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
- },
client: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
+ 'kubernetes.pod.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
'req.headers.cache-control': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
'event.timezone': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'log.origin.file.line': {
- long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true },
- },
'service.name': {
keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
@@ -242,45 +297,332 @@ export const fieldCapsPgBenchMock = {
message: {
text: { type: 'text', metadata_field: false, searchable: true, aggregatable: false },
},
- _source: {
- _source: { type: '_source', metadata_field: true, searchable: false, aggregatable: false },
+ 'kubernetes.node.labels.kubernetes_io/hostname': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.traceparent': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.namespace_labels': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ service: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'kubernetes.node.labels.node_type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ container: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'event.category': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'elasticapm_labels.trace': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'kubernetes.node.labels.topology_kubernetes_io/zone': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo.country_iso_code': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ type: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.method': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.image.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.labels.app': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'agent.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'log.original': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'process.thread.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.labels.io_kubernetes_pod_uid': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'kubernetes.node.labels.failure-domain_beta_kubernetes_io/zone': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'input.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'log.flags': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'related.user': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'host.architecture': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ elasticapm_labels: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'req.url': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.provider': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.machine.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'agent.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.machine': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'container.labels.io_kubernetes_sandbox_id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.pragma': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.labels.io_kubernetes_docker_type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ '_metadata.elastic_apm_transaction_id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.labels.cloud_google_com/gke-os-distribution': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
log: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
+ 'kubernetes.pod': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'container.labels.annotation_io_kubernetes_container_hash': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.remoteAddress': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'user.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'log.logger': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'postgresql.log.query_step': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.instance.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo.region_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ stream: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'log.origin.file': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'kubernetes.node.labels.cloud_google_com/gke-nodepool': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
event: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- 'event.duration': {
- long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true },
+ 'req.headers.host': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.content-type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.replicaset.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'host.os.codename': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.referer': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.cookie': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'elasticapm_labels.span': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'log.origin.file.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ data_stream: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'data_stream.dataset': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- 'event.ingested': {
- date: { type: 'date', metadata_field: false, searchable: true, aggregatable: true },
+ 'agent.ephemeral_id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- '@timestamp': {
- date: { type: 'date', metadata_field: false, searchable: true, aggregatable: true },
+ 'cloud.project': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'container.image': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
transaction: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
+ 'cloud.project.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
span: {
object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- '_metadata.sum': {
- long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true },
+ 'container.labels.annotation_io_kubernetes_container_terminationMessagePolicy': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- _tier: {
- keyword: { type: 'keyword', metadata_field: true, searchable: true, aggregatable: true },
+ 'elasticapm_labels.transaction': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- _seq_no: {
- _seq_no: { type: '_seq_no', metadata_field: true, searchable: true, aggregatable: true },
+ 'cloud.availability_zone': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
- code: { long: { type: 'long', metadata_field: false, searchable: true, aggregatable: true } },
- _index: {
- _index: { type: '_index', metadata_field: true, searchable: true, aggregatable: true },
+ cloud: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'container.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ ecs: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
},
- 'client.geo.location': {
- geo_point: { type: 'geo_point', metadata_field: false, searchable: true, aggregatable: true },
+ 'kubernetes.namespace': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ host: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'host.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.accept': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo.country_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'event.kind': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.replicaset': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'elasticapm_labels.transaction.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'data_stream.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.runtime': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'cloud.service.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'ecs.version': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.labels.io_kubernetes_pod_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'labels.userId': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.labels.annotation_io_kubernetes_container_terminationMessagePath': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.node.name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo.continent_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'postgresql.log': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'req.headers.user-agent': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.pod.uid': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ error: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'kubernetes.node.labels': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ trace: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'trace.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ postgresql: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'elasticapm_labels.span.id': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'kubernetes.container': {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ elasticapm_trace_id: {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'process.executable': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ process: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'client.geo.city_name': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'client.geo.region_iso_code': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'data_stream.namespace': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'req.headers.content-length': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'event.type': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ user: {
+ object: { type: 'object', metadata_field: false, searchable: false, aggregatable: false },
+ },
+ 'event.dataset': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
+ },
+ 'container.labels.io_kubernetes_container_logpath': {
+ keyword: { type: 'keyword', metadata_field: false, searchable: true, aggregatable: true },
},
},
};
diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.test.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.test.ts
index 780c4546259d3..a47b6d94db128 100644
--- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.test.ts
+++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.test.ts
@@ -80,55 +80,154 @@ describe('fetch_index_info', () => {
expect(fieldCandidates).toEqual([
'_metadata.elastic_apm_trace_id',
+ '_metadata.elastic_apm_transaction_id',
+ '_metadata.message_template',
'_metadata.metadata_event_dataset',
'_metadata.user_id',
+ 'agent.ephemeral_id',
+ 'agent.hostname',
+ 'agent.id',
+ 'agent.name',
+ 'agent.type',
'agent.version',
+ 'client.geo.city_name',
+ 'client.geo.continent_name',
+ 'client.geo.country_iso_code',
+ 'client.geo.country_name',
+ 'client.geo.region_iso_code',
+ 'client.geo.region_name',
'client.ip',
'cloud.account.id',
+ 'cloud.availability_zone',
+ 'cloud.instance.id',
'cloud.instance.name',
+ 'cloud.machine.type',
+ 'cloud.project.id',
+ 'cloud.provider',
+ 'cloud.service.name',
+ 'container.id',
+ 'container.image.name',
+ 'container.labels.annotation_io_kubernetes_container_hash',
'container.labels.annotation_io_kubernetes_container_restartCount',
+ 'container.labels.annotation_io_kubernetes_container_terminationMessagePath',
+ 'container.labels.annotation_io_kubernetes_container_terminationMessagePolicy',
'container.labels.annotation_io_kubernetes_pod_terminationGracePeriod',
+ 'container.labels.io_kubernetes_container_logpath',
'container.labels.io_kubernetes_container_name',
+ 'container.labels.io_kubernetes_docker_type',
+ 'container.labels.io_kubernetes_pod_name',
'container.labels.io_kubernetes_pod_namespace',
+ 'container.labels.io_kubernetes_pod_uid',
+ 'container.labels.io_kubernetes_sandbox_id',
+ 'container.name',
+ 'container.runtime',
+ 'data_stream.dataset',
+ 'data_stream.namespace',
+ 'data_stream.type',
'details',
+ 'ecs.version',
+ 'elasticapm_labels.span.id',
+ 'elasticapm_labels.trace.id',
+ 'elasticapm_labels.transaction.id',
'elasticapm_span_id',
+ 'elasticapm_trace_id',
'elasticapm_transaction_id',
+ 'event.category',
+ 'event.dataset',
+ 'event.kind',
'event.module',
'event.timezone',
+ 'event.type',
+ 'fileset.name',
+ 'host.architecture',
+ 'host.containerized',
'host.hostname',
+ 'host.ip',
+ 'host.mac',
+ 'host.name',
+ 'host.os.codename',
'host.os.family',
'host.os.kernel',
'host.os.name',
'host.os.platform',
+ 'host.os.type',
+ 'host.os.version',
'hostname',
+ 'input.type',
'kubernetes.container.name',
+ 'kubernetes.labels.app',
'kubernetes.labels.pod-template-hash',
+ 'kubernetes.namespace',
'kubernetes.namespace_labels.kubernetes_io/metadata_name',
'kubernetes.namespace_uid',
+ 'kubernetes.node.hostname',
'kubernetes.node.labels.addon_gke_io/node-local-dns-ds-ready',
'kubernetes.node.labels.beta_kubernetes_io/arch',
+ 'kubernetes.node.labels.beta_kubernetes_io/instance-type',
+ 'kubernetes.node.labels.beta_kubernetes_io/os',
'kubernetes.node.labels.cloud_google_com/gke-boot-disk',
'kubernetes.node.labels.cloud_google_com/gke-container-runtime',
+ 'kubernetes.node.labels.cloud_google_com/gke-nodepool',
+ 'kubernetes.node.labels.cloud_google_com/gke-os-distribution',
'kubernetes.node.labels.cloud_google_com/machine-family',
+ 'kubernetes.node.labels.failure-domain_beta_kubernetes_io/region',
+ 'kubernetes.node.labels.failure-domain_beta_kubernetes_io/zone',
'kubernetes.node.labels.kubernetes_io/arch',
+ 'kubernetes.node.labels.kubernetes_io/hostname',
'kubernetes.node.labels.kubernetes_io/os',
'kubernetes.node.labels.node_kubernetes_io/instance-type',
+ 'kubernetes.node.labels.node_type',
+ 'kubernetes.node.labels.topology_kubernetes_io/region',
+ 'kubernetes.node.labels.topology_kubernetes_io/zone',
+ 'kubernetes.node.name',
+ 'kubernetes.node.uid',
'kubernetes.pod.ip',
'kubernetes.pod.name',
+ 'kubernetes.pod.uid',
+ 'kubernetes.replicaset.name',
+ 'labels.userId',
'log.file.path',
+ 'log.flags',
'log.level',
+ 'log.logger',
+ 'log.origin.file.name',
+ 'log.origin.function',
+ 'log.original',
'name',
'postgresql.log.database',
'postgresql.log.query',
+ 'postgresql.log.query_step',
'postgresql.log.timestamp',
+ 'process.executable',
'process.name',
+ 'process.thread.name',
+ 'related.user',
+ 'req.headers.accept',
'req.headers.accept-encoding',
'req.headers.cache-control',
+ 'req.headers.connection',
+ 'req.headers.content-length',
+ 'req.headers.content-type',
+ 'req.headers.cookie',
+ 'req.headers.host',
'req.headers.origin',
+ 'req.headers.pragma',
+ 'req.headers.referer',
+ 'req.headers.traceparent',
'req.headers.tracestate',
+ 'req.headers.user-agent',
'req.headers.x-real-ip',
+ 'req.method',
+ 'req.remoteAddress',
+ 'req.url',
'service.name',
+ 'service.type',
+ 'span.id',
'stack',
+ 'stream',
+ 'trace.id',
+ 'transaction.id',
+ 'type',
'user.name',
]);
expect(textFieldCandidates).toEqual(['error.message', 'message']);
@@ -172,6 +271,7 @@ describe('fetch_index_info', () => {
'customer_phone',
'day_of_week',
'email',
+ 'event.dataset',
'geoip.city_name',
'geoip.continent_name',
'geoip.country_iso_code',
diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.ts
index c1acb2cad6f75..1bb5b701fdd17 100644
--- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.ts
+++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/fetch_index_info.ts
@@ -25,8 +25,6 @@ const SUPPORTED_ES_FIELD_TYPES = [
const SUPPORTED_ES_FIELD_TYPES_TEXT = [ES_FIELD_TYPES.TEXT, ES_FIELD_TYPES.MATCH_ONLY_TEXT];
-const IGNORE_FIELD_NAMES = ['_tier'];
-
interface IndexInfo {
fieldCandidates: string[];
textFieldCandidates: string[];
@@ -45,9 +43,19 @@ export const fetchIndexInfo = async (
// Get all supported fields
const respMapping = await esClient.fieldCaps(
{
- index,
fields: '*',
+ filters: '-metadata',
include_empty_fields: false,
+ index,
+ index_filter: {
+ range: {
+ [params.timeFieldName]: {
+ gte: params.deviationMin,
+ lte: params.deviationMax,
+ },
+ },
+ },
+ types: [...SUPPORTED_ES_FIELD_TYPES, ...SUPPORTED_ES_FIELD_TYPES_TEXT],
},
{ signal: abortSignal, maxRetries: 0 }
);
@@ -64,11 +72,11 @@ export const fetchIndexInfo = async (
const isTextField = fieldTypes.some((type) => SUPPORTED_ES_FIELD_TYPES_TEXT.includes(type));
// Check if fieldName is something we can aggregate on
- if (isSupportedType && isAggregatable && !IGNORE_FIELD_NAMES.includes(key)) {
+ if (isSupportedType && isAggregatable) {
acceptableFields.add(key);
}
- if (isTextField && !IGNORE_FIELD_NAMES.includes(key)) {
+ if (isTextField) {
acceptableTextFields.add(key);
}
From f10463a979052da1c473bbc81ec409723f23bfc3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Loix?=
Date: Mon, 22 Apr 2024 13:20:17 +0100
Subject: [PATCH 022/183] [Serverless nav] Limit number of recent items
(#181284)
---
.../__jest__/build_nav_tree.test.tsx | 32 ++++++++++---
.../ui/components/navigation_section_ui.tsx | 10 +----
.../src/ui/components/recently_accessed.tsx | 45 +++++++++++--------
3 files changed, 55 insertions(+), 32 deletions(-)
diff --git a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx
index 76336b10a300a..694f82bf9c079 100644
--- a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx
+++ b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx
@@ -129,11 +129,7 @@ describe('builds navigation tree', () => {
]);
const navTree: NavigationTreeDefinitionUI = {
- body: [
- {
- type: 'recentlyAccessed',
- },
- ],
+ body: [{ type: 'recentlyAccessed' }],
};
const { findByTestId } = renderNavigation({
@@ -146,4 +142,30 @@ describe('builds navigation tree', () => {
'RecentThis is an exampleAnother example'
);
});
+
+ test('should limit the number of recently accessed items to 5', async () => {
+ const recentlyAccessed$ = of([
+ { label: 'Item1', link: '/app/foo/1', id: '1' },
+ { label: 'Item2', link: '/app/foo/2', id: '2' },
+ { label: 'Item3', link: '/app/foo/3', id: '3' },
+ { label: 'Item4', link: '/app/foo/4', id: '4' },
+ { label: 'Item5', link: '/app/foo/5', id: '5' },
+ { label: 'Item6', link: '/app/foo/6', id: '6' },
+ { label: 'Item7', link: '/app/foo/7', id: '7' },
+ ]);
+
+ const navTree: NavigationTreeDefinitionUI = {
+ body: [{ type: 'recentlyAccessed' }],
+ };
+
+ const { queryAllByTestId } = renderNavigation({
+ navTreeDef: of(navTree),
+ services: { recentlyAccessed$ },
+ });
+
+ const items = await queryAllByTestId(/nav-recentlyAccessed-item/);
+ expect(items).toHaveLength(5);
+ const itemsText = items.map((item) => item.textContent);
+ expect(itemsText).toEqual(['Item1', 'Item2', 'Item3', 'Item4', 'Item5']);
+ });
});
diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx
index 2d39d704ce579..8ceb84fde5de3 100644
--- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx
+++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx
@@ -318,15 +318,9 @@ const nodeToEuiCollapsibleNavProps = (
return { items, isVisible };
};
-// Temporary solution to prevent showing the outline when the page load when the
-// accordion is auto-expanded if one of its children is active
-// Once https://github.com/elastic/eui/pull/7314 is released in Kibana we can
-// safely remove this CSS class.
const className = css`
- .euiAccordion__childWrapper,
- .euiAccordion__children,
- .euiCollapsibleNavAccordion__children {
- outline: none;
+ .euiAccordion__childWrapper {
+ transition: none; // Remove the transition as it does not play well with dynamic links added to the accordion
}
`;
diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/recently_accessed.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/recently_accessed.tsx
index 0a3af6522a6e6..e4eee48ce88ff 100644
--- a/packages/shared-ux/chrome/navigation/src/ui/components/recently_accessed.tsx
+++ b/packages/shared-ux/chrome/navigation/src/ui/components/recently_accessed.tsx
@@ -6,8 +6,8 @@
* Side Public License, v 1.
*/
-import React, { FC } from 'react';
-import { EuiCollapsibleNavItem } from '@elastic/eui';
+import React, { FC, useMemo } from 'react';
+import { EuiCollapsibleNavItem, type EuiCollapsibleNavItemProps } from '@elastic/eui';
import useObservable from 'react-use/lib/useObservable';
import type { ChromeRecentlyAccessedHistoryItem } from '@kbn/core-chrome-browser';
import type { Observable } from 'rxjs';
@@ -16,6 +16,8 @@ import { useNavigation as useServices } from '../../services';
import { getI18nStrings } from '../i18n_strings';
+const MAX_RECENTLY_ACCESS_ITEMS = 5;
+
export interface Props {
/**
* Optional observable for recently accessed items. If not provided, the
@@ -31,30 +33,35 @@ export interface Props {
export const RecentlyAccessed: FC = ({
recentlyAccessed$: recentlyAccessedProp$,
- defaultIsCollapsed = false,
+ defaultIsCollapsed = true,
}) => {
const strings = getI18nStrings();
const { recentlyAccessed$, basePath, navigateToUrl } = useServices();
const recentlyAccessed = useObservable(recentlyAccessedProp$ ?? recentlyAccessed$, []);
- if (recentlyAccessed.length === 0) {
- return null;
- }
+ const navItems = useMemo(
+ () =>
+ recentlyAccessed.slice(0, MAX_RECENTLY_ACCESS_ITEMS).map((recent) => {
+ const { id, label, link } = recent;
+ const href = basePath.prepend(link);
- const navItems = recentlyAccessed.map((recent) => {
- const { id, label, link } = recent;
- const href = basePath.prepend(link);
+ return {
+ id,
+ title: label,
+ href,
+ 'data-test-subj': `nav-recentlyAccessed-item nav-recentlyAccessed-item-${id}`,
+ onClick: (e: React.MouseEvent) => {
+ e.preventDefault();
+ navigateToUrl(href);
+ },
+ };
+ }),
+ [basePath, navigateToUrl, recentlyAccessed]
+ );
- return {
- id,
- title: label,
- href,
- onClick: (e: React.MouseEvent) => {
- e.preventDefault();
- navigateToUrl(href);
- },
- };
- });
+ if (navItems.length === 0) {
+ return null;
+ }
return (
Date: Mon, 22 Apr 2024 15:01:24 +0200
Subject: [PATCH 023/183] [Obs AI Assistant] move rule connector to
observability_ai_assistant_app (#180949)
## Summary
Resolves https://github.com/elastic/kibana/issues/180910
This change simply moves the rule_connector introduced in
https://github.com/elastic/kibana/pull/179980 to the
`observability_ai_assistant_app` plugin. There are not functional
changes.
Also added some unit tests
### Testing
See testing section in https://github.com/elastic/kibana/pull/179980
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../mocks/connector_types.ts | 2 +-
.../observability_ai_assistant/kibana.jsonc | 3 -
.../public/index.ts | 1 +
.../public/plugin.tsx | 5 -
.../server/plugin.ts | 59 +-----
.../observability_ai_assistant/tsconfig.json | 1 -
.../common/rule_connector.ts | 8 +
.../kibana.jsonc | 4 +-
.../public/plugin.tsx | 8 +-
.../public/rule_connector/ai_assistant.tsx | 8 +-
.../rule_connector/ai_assistant_params.tsx | 6 +-
.../public/rule_connector/index.ts | 0
.../public/rule_connector/translations.ts | 0
.../public/rule_connector/types.ts | 0
.../server/plugin.ts | 74 ++++++++
.../convert_schema_to_open_api.ts | 2 +-
.../server/rule_connector/index.test.ts | 168 ++++++++++++++++++
.../server/rule_connector/index.ts | 10 +-
.../server/types.ts | 42 +++++
.../tsconfig.json | 8 +-
20 files changed, 327 insertions(+), 82 deletions(-)
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/public/rule_connector/ai_assistant.tsx (93%)
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/public/rule_connector/ai_assistant_params.tsx (94%)
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/public/rule_connector/index.ts (100%)
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/public/rule_connector/translations.ts (100%)
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/public/rule_connector/types.ts (100%)
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/server/rule_connector/convert_schema_to_open_api.ts (93%)
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
rename x-pack/plugins/observability_solution/{observability_ai_assistant => observability_ai_assistant_app}/server/rule_connector/index.ts (95%)
diff --git a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts
index eec2762e3fd81..2886aa1babcef 100644
--- a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts
+++ b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts
@@ -29,6 +29,6 @@ export const connectorTypes: string[] = [
'.bedrock',
'.d3security',
'.sentinelone',
- '.observability-ai-assistant',
'.cases',
+ '.observability-ai-assistant',
];
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc
index 1968c772eccfb..39af4d91bc87b 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc
@@ -14,9 +14,6 @@
"security",
"taskManager",
"dataViews",
- "triggersActionsUi",
- "ruleRegistry",
- "alerting"
],
"requiredBundles": ["kibanaReact", "kibanaUtils"],
"optionalPlugins": ["cloud", "serverless"],
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
index 91f1c640141f9..d42c96715523e 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
@@ -31,6 +31,7 @@ export type {
export { AssistantAvatar } from './components/assistant_avatar';
export { ConnectorSelectorBase } from './components/connector_selector/connector_selector_base';
export { useAbortableAsync, type AbortableAsyncState } from './hooks/use_abortable_async';
+export { useGenAIConnectorsWithoutContext } from './hooks/use_genai_connectors';
export { createStorybookChatService, createStorybookService } from './storybook_mock';
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx
index ccd67edc58dd6..2b9ab400a08f8 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx
@@ -29,7 +29,6 @@ import type {
ObservabilityAIAssistantPublicStart,
ObservabilityAIAssistantService,
} from './types';
-import { getObsAIAssistantConnectorType } from './rule_connector';
export class ObservabilityAIAssistantPlugin
implements
@@ -88,10 +87,6 @@ export class ObservabilityAIAssistantPlugin
const isEnabled = service.isEnabled();
- pluginsStart.triggersActionsUi.actionTypeRegistry.register(
- getObsAIAssistantConnectorType(service)
- );
-
return {
service,
useGenAIConnectors: () => useGenAIConnectorsWithoutContext(service),
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts
index 77075da8d3195..4e3a0b8ecabd7 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts
@@ -8,7 +8,6 @@
import {
CoreSetup,
DEFAULT_APP_CATEGORIES,
- KibanaRequest,
Logger,
Plugin,
PluginInitializerContext,
@@ -24,10 +23,7 @@ import { firstValueFrom } from 'rxjs';
import { OBSERVABILITY_AI_ASSISTANT_FEATURE_ID } from '../common/feature';
import type { ObservabilityAIAssistantConfig } from './config';
import { registerServerRoutes } from './routes/register_routes';
-import {
- ObservabilityAIAssistantRequestHandlerContext,
- ObservabilityAIAssistantRouteHandlerResources,
-} from './routes/types';
+import { ObservabilityAIAssistantRouteHandlerResources } from './routes/types';
import { ObservabilityAIAssistantService } from './service';
import {
ObservabilityAIAssistantServerSetup,
@@ -38,10 +34,6 @@ import {
import { addLensDocsToKb } from './service/knowledge_base_service/kb_docs/lens';
import { registerFunctions } from './functions';
import { recallRankingEvent } from './analytics/recall_ranking';
-import {
- getObsAIAssistantConnectorType,
- getObsAIAssistantConnectorAdapter,
-} from './rule_connector';
export class ObservabilityAIAssistantPlugin
implements
@@ -162,55 +154,6 @@ export class ObservabilityAIAssistantPlugin
addLensDocsToKb({ service, logger: this.logger.get('kb').get('lens') });
- const initResources = async (
- request: KibanaRequest
- ): Promise => {
- const [coreStart, pluginsStart] = await core.getStartServices();
- const license = await firstValueFrom(pluginsStart.licensing.license$);
- const savedObjectsClient = coreStart.savedObjects.getScopedClient(request);
-
- const context: ObservabilityAIAssistantRequestHandlerContext = {
- rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => {
- return {
- getAlertsClient() {
- return startContract.getRacClientWithRequest(request);
- },
- };
- }),
- alerting: routeHandlerPlugins.alerting.start().then((startContract) => {
- return {
- getRulesClient() {
- return startContract.getRulesClientWithRequest(request);
- },
- };
- }),
- core: Promise.resolve({
- coreStart,
- elasticsearch: {
- client: coreStart.elasticsearch.client.asScoped(request),
- },
- uiSettings: {
- client: coreStart.uiSettings.asScopedToClient(savedObjectsClient),
- },
- savedObjects: {
- client: savedObjectsClient,
- },
- }),
- licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }),
- };
-
- return {
- request,
- service,
- context,
- logger: this.logger.get('connector'),
- plugins: routeHandlerPlugins,
- };
- };
-
- plugins.actions.registerType(getObsAIAssistantConnectorType(initResources));
- plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter());
-
registerServerRoutes({
core,
logger: this.logger,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json
index b6502b6ef5517..eee8ea0d56911 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json
@@ -48,7 +48,6 @@
"@kbn/cloud-plugin",
"@kbn/serverless",
"@kbn/triggers-actions-ui-plugin",
- "@kbn/stack-connectors-plugin",
],
"exclude": ["target/**/*"]
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts
new file mode 100644
index 0000000000000..84c7b1f3e8d64
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts
@@ -0,0 +1,8 @@
+/*
+ * 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.
+ */
+
+export const OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID = '.observability-ai-assistant';
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc
index f4aac7df8a389..b64d31e3f13b9 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc
@@ -21,7 +21,9 @@
"share",
"security",
"licensing",
- "ml"
+ "ml",
+ "alerting",
+ "features"
],
"requiredBundles": ["kibanaReact"],
"optionalPlugins": ["cloud"],
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx
index 1e226aa99c8a8..6e188043a6a31 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx
@@ -26,6 +26,7 @@ import type {
import { createAppService, ObservabilityAIAssistantAppService } from './service/create_app_service';
import { SharedProviders } from './utils/shared_providers';
import { LazyNavControl } from './components/nav_control/lazy_nav_control';
+import { getObsAIAssistantConnectorType } from './rule_connector';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ConfigSchema {}
@@ -124,12 +125,17 @@ export class ObservabilityAIAssistantAppPlugin
order: 1001,
});
- pluginsStart.observabilityAIAssistant.service.register(async ({ registerRenderFunction }) => {
+ const service = pluginsStart.observabilityAIAssistant.service;
+
+ service.register(async ({ registerRenderFunction }) => {
const { registerFunctions } = await import('./functions');
await registerFunctions({ pluginsStart, registerRenderFunction });
});
+ pluginsStart.triggersActionsUi.actionTypeRegistry.register(
+ getObsAIAssistantConnectorType(service)
+ );
return {};
}
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx
similarity index 93%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx
index beadd590ce2f5..bd024e9231ac0 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx
@@ -10,10 +10,12 @@ import type {
ActionTypeModel as ConnectorTypeModel,
GenericValidationResult,
} from '@kbn/triggers-actions-ui-plugin/public/types';
-import { ObsAIAssistantActionParams } from './types';
-import { ObservabilityAIAssistantService } from '../types';
-import { AssistantAvatar } from '../components/assistant_avatar';
+import {
+ AssistantAvatar,
+ ObservabilityAIAssistantService,
+} from '@kbn/observability-ai-assistant-plugin/public';
import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
+import { ObsAIAssistantActionParams } from './types';
import {
CONNECTOR_DESC,
CONNECTOR_REQUIRED,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx
similarity index 94%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx
index 95793f95a437d..4e3683625e819 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/ai_assistant_params.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx
@@ -9,9 +9,11 @@ import React, { useEffect } from 'react';
import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public';
import { i18n } from '@kbn/i18n';
import { EuiFormRow, EuiFlexItem, EuiSelect, EuiSpacer, EuiTextArea } from '@elastic/eui';
+import {
+ ObservabilityAIAssistantService,
+ useGenAIConnectorsWithoutContext,
+} from '@kbn/observability-ai-assistant-plugin/public';
import { ObsAIAssistantActionParams } from './types';
-import { ObservabilityAIAssistantService } from '../types';
-import { useGenAIConnectorsWithoutContext } from '../hooks/use_genai_connectors';
const ObsAIAssistantParamsFields: React.FunctionComponent<
ActionParamsProps & { service: ObservabilityAIAssistantService }
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts
similarity index 100%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/index.ts
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/translations.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts
similarity index 100%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/translations.ts
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts
similarity index 100%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/rule_connector/types.ts
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts
index 097c50bad0bd9..903c3c0c26826 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts
@@ -11,9 +11,21 @@ import {
Plugin,
type PluginInitializerContext,
type CoreStart,
+ KibanaRequest,
} from '@kbn/core/server';
+import {
+ ObservabilityAIAssistantRequestHandlerContext,
+ ObservabilityAIAssistantRouteHandlerResources,
+} from '@kbn/observability-ai-assistant-plugin/server/routes/types';
+import { ObservabilityAIAssistantPluginStartDependencies } from '@kbn/observability-ai-assistant-plugin/server/types';
+import { mapValues } from 'lodash';
+import { firstValueFrom } from 'rxjs';
import type { ObservabilityAIAssistantAppConfig } from './config';
import { registerFunctions } from './functions';
+import {
+ getObsAIAssistantConnectorAdapter,
+ getObsAIAssistantConnectorType,
+} from './rule_connector';
import type {
ObservabilityAIAssistantAppPluginSetupDependencies,
ObservabilityAIAssistantAppPluginStartDependencies,
@@ -42,6 +54,68 @@ export class ObservabilityAIAssistantAppPlugin
>,
plugins: ObservabilityAIAssistantAppPluginSetupDependencies
): ObservabilityAIAssistantAppServerSetup {
+ const routeHandlerPlugins = mapValues(plugins, (value, key) => {
+ return {
+ setup: value,
+ start: () =>
+ core.getStartServices().then((services) => {
+ const [, pluginsStartContracts] = services;
+ return pluginsStartContracts[
+ key as keyof ObservabilityAIAssistantPluginStartDependencies
+ ];
+ }),
+ };
+ }) as ObservabilityAIAssistantRouteHandlerResources['plugins'];
+
+ const initResources = async (
+ request: KibanaRequest
+ ): Promise => {
+ const [coreStart, pluginsStart] = await core.getStartServices();
+ const license = await firstValueFrom(pluginsStart.licensing.license$);
+ const savedObjectsClient = coreStart.savedObjects.getScopedClient(request);
+
+ const context: ObservabilityAIAssistantRequestHandlerContext = {
+ rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => {
+ return {
+ getAlertsClient() {
+ return startContract.getRacClientWithRequest(request);
+ },
+ };
+ }),
+ alerting: routeHandlerPlugins.alerting.start().then((startContract) => {
+ return {
+ getRulesClient() {
+ return startContract.getRulesClientWithRequest(request);
+ },
+ };
+ }),
+ core: Promise.resolve({
+ coreStart,
+ elasticsearch: {
+ client: coreStart.elasticsearch.client.asScoped(request),
+ },
+ uiSettings: {
+ client: coreStart.uiSettings.asScopedToClient(savedObjectsClient),
+ },
+ savedObjects: {
+ client: savedObjectsClient,
+ },
+ }),
+ licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }),
+ };
+
+ return {
+ request,
+ context,
+ service: plugins.observabilityAIAssistant.service,
+ logger: this.logger.get('connector'),
+ plugins: routeHandlerPlugins,
+ };
+ };
+
+ plugins.actions.registerType(getObsAIAssistantConnectorType(initResources));
+ plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter());
+
return {};
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts
similarity index 93%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts
index 44b3c80a9a33f..89a49e6081b5d 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/convert_schema_to_open_api.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts
@@ -8,7 +8,7 @@
import joiToJsonSchema from 'joi-to-json';
import type { Type } from '@kbn/config-schema';
import { castArray, isPlainObject, forEach, unset } from 'lodash';
-import type { CompatibleJSONSchema } from '../../common/functions/types';
+import type { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types';
function dropUnknownProperties(object: CompatibleJSONSchema) {
if (!isPlainObject(object)) {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
new file mode 100644
index 0000000000000..7990f353062da
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
@@ -0,0 +1,168 @@
+/*
+ * 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 { AlertHit } from '@kbn/alerting-plugin/server/types';
+import { ObservabilityAIAssistantRouteHandlerResources } from '@kbn/observability-ai-assistant-plugin/server/routes/types';
+import { getFakeKibanaRequest } from '@kbn/security-plugin/server/authentication/api_keys/fake_kibana_request';
+import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
+import {
+ getObsAIAssistantConnectorAdapter,
+ getObsAIAssistantConnectorType,
+ ObsAIAssistantConnectorTypeExecutorOptions,
+} from '.';
+import { Observable } from 'rxjs';
+import { MessageRole } from '@kbn/observability-ai-assistant-plugin/public';
+
+describe('observabilityAIAssistant rule_connector', () => {
+ describe('getObsAIAssistantConnectorAdapter', () => {
+ it('uses correct connector_id', () => {
+ const adapter = getObsAIAssistantConnectorAdapter();
+ expect(adapter.connectorTypeId).toEqual(OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID);
+ });
+
+ it('builds action params', () => {
+ const adapter = getObsAIAssistantConnectorAdapter();
+ const params = adapter.buildActionParams({
+ params: { connector: '.azure', message: 'hello' },
+ rule: { id: 'foo', name: 'bar', tags: [], consumer: '', producer: '' },
+ ruleUrl: 'http://myrule.com',
+ spaceId: 'default',
+ alerts: {
+ all: { count: 1, data: [] },
+ new: { count: 1, data: [{ _id: 'new_alert' } as AlertHit] },
+ ongoing: { count: 1, data: [] },
+ recovered: { count: 1, data: [{ _id: 'recovered_alert' } as AlertHit] },
+ },
+ });
+
+ expect(params).toEqual({
+ connector: '.azure',
+ message: 'hello',
+ rule: { id: 'foo', name: 'bar', tags: [], ruleUrl: 'http://myrule.com' },
+ alerts: {
+ new: [{ _id: 'new_alert' }],
+ recovered: [{ _id: 'recovered_alert' }],
+ },
+ });
+ });
+ });
+
+ describe('getObsAIAssistantConnectorType', () => {
+ it('is correctly configured', () => {
+ const initResources = jest
+ .fn()
+ .mockResolvedValue({} as ObservabilityAIAssistantRouteHandlerResources);
+ const connectorType = getObsAIAssistantConnectorType(initResources);
+ expect(connectorType.id).toEqual(OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID);
+ expect(connectorType.isSystemActionType).toEqual(true);
+ expect(connectorType.minimumLicenseRequired).toEqual('enterprise');
+ });
+
+ it('does not execute when no new or recovered alerts', async () => {
+ const initResources = jest
+ .fn()
+ .mockResolvedValue({} as ObservabilityAIAssistantRouteHandlerResources);
+ const connectorType = getObsAIAssistantConnectorType(initResources);
+ const result = await connectorType.executor({
+ actionId: 'observability-ai-assistant',
+ request: getFakeKibanaRequest({ id: 'foo', api_key: 'bar' }),
+ params: { alerts: { new: [], recovered: [] } },
+ } as unknown as ObsAIAssistantConnectorTypeExecutorOptions);
+ expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' });
+ expect(initResources).not.toHaveBeenCalled();
+ });
+
+ it('calls complete api', async () => {
+ const completeMock = jest.fn().mockReturnValue(new Observable());
+ const initResources = jest.fn().mockResolvedValue({
+ service: {
+ getClient: async () => ({ complete: completeMock }),
+ getFunctionClient: async () => ({
+ getContexts: () => [{ name: 'core', description: 'my_system_message' }],
+ }),
+ },
+ context: {
+ core: Promise.resolve({
+ coreStart: { http: { basePath: { publicBaseUrl: 'http://kibana.com' } } },
+ }),
+ },
+ plugins: {
+ actions: {
+ start: async () => {
+ return {
+ getActionsClientWithRequest: jest.fn().mockResolvedValue({
+ async getAll() {
+ return [{ id: 'connector_1' }];
+ },
+ }),
+ };
+ },
+ },
+ },
+ } as unknown as ObservabilityAIAssistantRouteHandlerResources);
+
+ const connectorType = getObsAIAssistantConnectorType(initResources);
+ const result = await connectorType.executor({
+ actionId: 'observability-ai-assistant',
+ request: getFakeKibanaRequest({ id: 'foo', api_key: 'bar' }),
+ params: {
+ message: 'hello',
+ connector: 'azure-open-ai',
+ alerts: { new: [{ _id: 'new_alert' }], recovered: [] },
+ },
+ } as unknown as ObsAIAssistantConnectorTypeExecutorOptions);
+
+ expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' });
+ expect(initResources).toHaveBeenCalledTimes(1);
+ expect(completeMock).toHaveBeenCalledTimes(1);
+ expect(completeMock).toHaveBeenCalledWith(
+ expect.objectContaining({
+ persist: true,
+ isPublic: true,
+ connectorId: 'azure-open-ai',
+ kibanaPublicUrl: 'http://kibana.com',
+ messages: [
+ {
+ '@timestamp': expect.any(String),
+ message: {
+ role: MessageRole.System,
+ content: 'my_system_message',
+ },
+ },
+ {
+ '@timestamp': expect.any(String),
+ message: {
+ role: MessageRole.User,
+ content: 'hello',
+ },
+ },
+ {
+ '@timestamp': expect.any(String),
+ message: {
+ role: MessageRole.Assistant,
+ content: '',
+ function_call: {
+ name: 'get_connectors',
+ arguments: JSON.stringify({}),
+ trigger: MessageRole.Assistant as const,
+ },
+ },
+ },
+ {
+ '@timestamp': expect.any(String),
+ message: {
+ role: MessageRole.User,
+ name: 'get_connectors',
+ content: JSON.stringify({ connectors: [{ id: 'connector_1' }] }),
+ },
+ },
+ ],
+ })
+ );
+ });
+ });
+});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
similarity index 95%
rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts
rename to x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
index ee3eac655fa84..567c326945ef8 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/rule_connector/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
@@ -24,16 +24,16 @@ import {
SlackParamsSchema,
WebhookParamsSchema,
} from '@kbn/stack-connectors-plugin/server';
-import { ObservabilityAIAssistantRouteHandlerResources } from '../routes/types';
+import { ObservabilityAIAssistantRouteHandlerResources } from '@kbn/observability-ai-assistant-plugin/server/routes/types';
import {
ChatCompletionChunkEvent,
MessageRole,
StreamingChatResponseEventType,
-} from '../../common';
-import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
-import { concatenateChatCompletionChunks } from '../../common/utils/concatenate_chat_completion_chunks';
+} from '@kbn/observability-ai-assistant-plugin/common';
+import { concatenateChatCompletionChunks } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks';
+import { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types';
import { convertSchemaToOpenApi } from './convert_schema_to_open_api';
-import { CompatibleJSONSchema } from '../../common/functions/types';
+import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
const CONNECTOR_PRIVILEGES = ['api:observabilityAIAssistant', 'app:observabilityAIAssistant'];
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts
index 996279329ab90..902774bacd800 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts
@@ -5,6 +5,23 @@
* 2.0.
*/
+import type {
+ PluginSetupContract as ActionsPluginSetup,
+ PluginStartContract as ActionsPluginStart,
+} from '@kbn/actions-plugin/server';
+import type {
+ PluginSetupContract as AlertingPluginSetup,
+ PluginStartContract as AlertingPluginStart,
+} from '@kbn/alerting-plugin/server';
+import type {
+ DataViewsServerPluginSetup,
+ DataViewsServerPluginStart,
+} from '@kbn/data-views-plugin/server';
+import type {
+ PluginStartContract as FeaturesPluginStart,
+ PluginSetupContract as FeaturesPluginSetup,
+} from '@kbn/features-plugin/server';
+import type { LicensingPluginSetup, LicensingPluginStart } from '@kbn/licensing-plugin/server';
import type {
ObservabilityAIAssistantServerSetup,
ObservabilityAIAssistantServerStart,
@@ -13,6 +30,13 @@ import type {
RuleRegistryPluginSetupContract,
RuleRegistryPluginStartContract,
} from '@kbn/rule-registry-plugin/server';
+import type { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/server';
+import type {
+ TaskManagerSetupContract,
+ TaskManagerStartContract,
+} from '@kbn/task-manager-plugin/server';
+import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/server';
+import type { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/server';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ObservabilityAIAssistantAppServerStart {}
@@ -22,9 +46,27 @@ export interface ObservabilityAIAssistantAppServerSetup {}
export interface ObservabilityAIAssistantAppPluginStartDependencies {
observabilityAIAssistant: ObservabilityAIAssistantServerStart;
ruleRegistry: RuleRegistryPluginStartContract;
+ alerting: AlertingPluginStart;
+ licensing: LicensingPluginStart;
+ actions: ActionsPluginStart;
+ security: SecurityPluginStart;
+ features: FeaturesPluginStart;
+ taskManager: TaskManagerStartContract;
+ dataViews: DataViewsServerPluginStart;
+ cloud?: CloudStart;
+ serverless?: ServerlessPluginStart;
}
export interface ObservabilityAIAssistantAppPluginSetupDependencies {
observabilityAIAssistant: ObservabilityAIAssistantServerSetup;
ruleRegistry: RuleRegistryPluginSetupContract;
+ alerting: AlertingPluginSetup;
+ licensing: LicensingPluginSetup;
+ actions: ActionsPluginSetup;
+ security: SecurityPluginSetup;
+ features: FeaturesPluginSetup;
+ taskManager: TaskManagerSetupContract;
+ dataViews: DataViewsServerPluginSetup;
+ cloud?: CloudSetup;
+ serverless?: ServerlessPluginSetup;
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json
index e35d24bc573ed..8c7224647ce24 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json
@@ -55,7 +55,13 @@
"@kbn/ai-assistant-management-plugin",
"@kbn/deeplinks-observability",
"@kbn/management-settings-ids",
- "@kbn/apm-utils"
+ "@kbn/apm-utils",
+ "@kbn/alerting-plugin",
+ "@kbn/stack-connectors-plugin",
+ "@kbn/features-plugin",
+ "@kbn/serverless",
+ "@kbn/task-manager-plugin",
+ "@kbn/cloud-plugin"
],
"exclude": ["target/**/*"]
}
From 2169c0f9fc6cd0738e94154ec2a0f75ac9c6106d Mon Sep 17 00:00:00 2001
From: Dmitrii Shevchenko
Date: Mon, 22 Apr 2024 15:20:46 +0200
Subject: [PATCH 024/183] [SecuritySolution] Migrate bulk enable/diable rules
to Alerting methods (#180796)
**Resolves: https://github.com/elastic/kibana/issues/171350**
**Resolves partially: https://github.com/elastic/kibana/issues/177634**
## Summary
This PR migrates the `/api/detection_engine/rules/_bulk_action` API
endpoint to use the `rulesClient.bulkEnableRules` and
`rulesClient.bulkDisableRules` methods under the hood. This change helps
mitigate Task Manager flooding when users enable many detection rules at
once. The alerting framework's bulk methods implement task staggering to
ensure that multiple tasks are not scheduled for execution
simultaneously. For more details, refer to [the
ticket](https://github.com/elastic/kibana/issues/171350).
---
.../rules_client/methods/bulk_enable.ts | 214 ++++++------
.../bulk_actions/bulk_actions_route.mock.ts | 2 +-
.../routes/__mocks__/request_responses.ts | 6 +-
.../bulk_actions/bulk_actions_response.ts | 145 ++++++++
.../bulk_actions/bulk_enable_disable_rules.ts | 105 ++++++
.../fetch_rules_by_query_or_ids.ts | 64 ++++
.../api/rules/bulk_actions/route.test.ts | 78 +++--
.../api/rules/bulk_actions/route.ts | 329 ++++--------------
.../logic/bulk_actions/validations.ts | 8 +-
.../perform_bulk_action_ess.ts | 279 ++++++++-------
10 files changed, 694 insertions(+), 536 deletions(-)
create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_actions_response.ts
create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_enable_disable_rules.ts
create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts
diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts
index 397d49a2751cf..7d029e211b580 100644
--- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts
+++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts
@@ -39,6 +39,12 @@ import type { RuleParams } from '../../application/rule/types';
import { ruleDomainSchema } from '../../application/rule/schemas';
import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects';
+/**
+ * Updating too many rules in parallel can cause the denial of service of the
+ * Elasticsearch cluster.
+ */
+const MAX_RULES_TO_UPDATE_IN_PARALLEL = 50;
+
const getShouldScheduleTask = async (
context: RulesClientContext,
scheduledTaskId: string | null | undefined
@@ -183,114 +189,120 @@ const bulkEnableRulesWithOCC = async (
});
}
- await pMap(rulesFinderRules, async (rule) => {
- try {
- if (scheduleValidationError) {
- throw Error(scheduleValidationError);
- }
- if (rule.attributes.actions.length) {
- try {
- await context.actionsAuthorization.ensureAuthorized({ operation: 'execute' });
- } catch (error) {
- throw Error(`Rule not authorized for bulk enable - ${error.message}`);
+ await pMap(
+ rulesFinderRules,
+ async (rule) => {
+ try {
+ if (scheduleValidationError) {
+ throw Error(scheduleValidationError);
+ }
+ if (rule.attributes.actions.length) {
+ try {
+ await context.actionsAuthorization.ensureAuthorized({ operation: 'execute' });
+ } catch (error) {
+ throw Error(`Rule not authorized for bulk enable - ${error.message}`);
+ }
+ }
+ if (rule.attributes.name) {
+ ruleNameToRuleIdMapping[rule.id] = rule.attributes.name;
}
- }
- if (rule.attributes.name) {
- ruleNameToRuleIdMapping[rule.id] = rule.attributes.name;
- }
- const migratedActions = await migrateLegacyActions(context, {
- ruleId: rule.id,
- actions: rule.attributes.actions,
- references: rule.references,
- attributes: rule.attributes,
- });
-
- const updatedAttributes = updateMeta(context, {
- ...rule.attributes,
- ...(!rule.attributes.apiKey &&
- (await createNewAPIKeySet(context, {
- id: rule.attributes.alertTypeId,
- ruleName: rule.attributes.name,
- username,
- shouldUpdateApiKey: true,
- }))),
- ...(migratedActions.hasLegacyActions
- ? {
- actions: migratedActions.resultedActions,
- throttle: undefined,
- notifyWhen: undefined,
- }
- : {}),
- enabled: true,
- updatedBy: username,
- updatedAt: new Date().toISOString(),
- executionStatus: {
- status: 'pending',
- lastDuration: 0,
- lastExecutionDate: new Date().toISOString(),
- error: null,
- warning: null,
- },
- scheduledTaskId: rule.id,
- });
-
- const shouldScheduleTask = await getShouldScheduleTask(
- context,
- rule.attributes.scheduledTaskId
- );
-
- if (shouldScheduleTask) {
- tasksToSchedule.push({
- id: rule.id,
- taskType: `alerting:${rule.attributes.alertTypeId}`,
- schedule: rule.attributes.schedule,
- params: {
- alertId: rule.id,
- spaceId: context.spaceId,
- consumer: rule.attributes.consumer,
+ const migratedActions = await migrateLegacyActions(context, {
+ ruleId: rule.id,
+ actions: rule.attributes.actions,
+ references: rule.references,
+ attributes: rule.attributes,
+ });
+
+ const updatedAttributes = updateMeta(context, {
+ ...rule.attributes,
+ ...(!rule.attributes.apiKey &&
+ (await createNewAPIKeySet(context, {
+ id: rule.attributes.alertTypeId,
+ ruleName: rule.attributes.name,
+ username,
+ shouldUpdateApiKey: true,
+ }))),
+ ...(migratedActions.hasLegacyActions
+ ? {
+ actions: migratedActions.resultedActions,
+ throttle: undefined,
+ notifyWhen: undefined,
+ }
+ : {}),
+ enabled: true,
+ updatedBy: username,
+ updatedAt: new Date().toISOString(),
+ executionStatus: {
+ status: 'pending',
+ lastDuration: 0,
+ lastExecutionDate: new Date().toISOString(),
+ error: null,
+ warning: null,
},
- state: {
- previousStartedAt: null,
- alertTypeState: {},
- alertInstances: {},
+ scheduledTaskId: rule.id,
+ });
+
+ const shouldScheduleTask = await getShouldScheduleTask(
+ context,
+ rule.attributes.scheduledTaskId
+ );
+
+ if (shouldScheduleTask) {
+ tasksToSchedule.push({
+ id: rule.id,
+ taskType: `alerting:${rule.attributes.alertTypeId}`,
+ schedule: rule.attributes.schedule,
+ params: {
+ alertId: rule.id,
+ spaceId: context.spaceId,
+ consumer: rule.attributes.consumer,
+ },
+ state: {
+ previousStartedAt: null,
+ alertTypeState: {},
+ alertInstances: {},
+ },
+ scope: ['alerting'],
+ enabled: false, // we create the task as disabled, taskManager.bulkEnable will enable them by randomising their schedule datetime
+ });
+ }
+
+ rulesToEnable.push({
+ ...rule,
+ attributes: updatedAttributes,
+ ...(migratedActions.hasLegacyActions
+ ? { references: migratedActions.resultedReferences }
+ : {}),
+ });
+
+ context.auditLogger?.log(
+ ruleAuditEvent({
+ action: RuleAuditAction.ENABLE,
+ outcome: 'unknown',
+ savedObject: { type: RULE_SAVED_OBJECT_TYPE, id: rule.id },
+ })
+ );
+ } catch (error) {
+ errors.push({
+ message: error.message,
+ rule: {
+ id: rule.id,
+ name: rule.attributes?.name,
},
- scope: ['alerting'],
- enabled: false, // we create the task as disabled, taskManager.bulkEnable will enable them by randomising their schedule datetime
});
+ context.auditLogger?.log(
+ ruleAuditEvent({
+ action: RuleAuditAction.ENABLE,
+ error,
+ })
+ );
}
-
- rulesToEnable.push({
- ...rule,
- attributes: updatedAttributes,
- ...(migratedActions.hasLegacyActions
- ? { references: migratedActions.resultedReferences }
- : {}),
- });
-
- context.auditLogger?.log(
- ruleAuditEvent({
- action: RuleAuditAction.ENABLE,
- outcome: 'unknown',
- savedObject: { type: RULE_SAVED_OBJECT_TYPE, id: rule.id },
- })
- );
- } catch (error) {
- errors.push({
- message: error.message,
- rule: {
- id: rule.id,
- name: rule.attributes?.name,
- },
- });
- context.auditLogger?.log(
- ruleAuditEvent({
- action: RuleAuditAction.ENABLE,
- error,
- })
- );
+ },
+ {
+ concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
}
- });
+ );
}
);
diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_actions/bulk_actions_route.mock.ts b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_actions/bulk_actions_route.mock.ts
index fa4fcefbcad1a..0a7cd906dc4bb 100644
--- a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_actions/bulk_actions_route.mock.ts
+++ b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_actions/bulk_actions_route.mock.ts
@@ -8,7 +8,7 @@
import type { PerformBulkActionRequestBody } from './bulk_actions_route.gen';
import { BulkActionEditTypeEnum, BulkActionTypeEnum } from './bulk_actions_route.gen';
-export const getPerformBulkActionSchemaMock = (): PerformBulkActionRequestBody => ({
+export const getBulkDisableRuleActionSchemaMock = (): PerformBulkActionRequestBody => ({
query: '',
ids: undefined,
action: BulkActionTypeEnum.disable,
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts
index aa3da4e614f14..82a40cbf71a41 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts
@@ -31,7 +31,7 @@ import {
PREBUILT_RULES_URL,
} from '../../../../../common/api/detection_engine/prebuilt_rules';
import {
- getPerformBulkActionSchemaMock,
+ getBulkDisableRuleActionSchemaMock,
getPerformBulkActionEditSchemaMock,
} from '../../../../../common/api/detection_engine/rule_management/mocks';
@@ -131,11 +131,11 @@ export const getPatchBulkRequest = () =>
body: [getCreateRulesSchemaMock()],
});
-export const getBulkActionRequest = () =>
+export const getBulkDisableRuleActionRequest = () =>
requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: getPerformBulkActionSchemaMock(),
+ body: getBulkDisableRuleActionSchemaMock(),
});
export const getBulkActionEditRequest = () =>
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_actions_response.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_actions_response.ts
new file mode 100644
index 0000000000000..5485c06cc4a27
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_actions_response.ts
@@ -0,0 +1,145 @@
+/*
+ * 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 { BulkActionSkipResult } from '@kbn/alerting-plugin/common';
+import type { BulkOperationError } from '@kbn/alerting-plugin/server';
+import type { IKibanaResponse, KibanaResponseFactory } from '@kbn/core/server';
+import { transformError } from '@kbn/securitysolution-es-utils';
+import { truncate } from 'lodash';
+import type {
+ BulkEditActionResults,
+ BulkEditActionSummary,
+ NormalizedRuleError,
+ RuleDetailsInError,
+} from '../../../../../../../common/api/detection_engine';
+import type { BulkEditActionResponse } from '../../../../../../../common/api/detection_engine/rule_management';
+import type { BulkActionsDryRunErrCode } from '../../../../../../../common/constants';
+import type { PromisePoolError } from '../../../../../../utils/promise_pool';
+import type { RuleAlertType } from '../../../../rule_schema';
+import type { DryRunError } from '../../../logic/bulk_actions/dry_run';
+import { internalRuleToAPIResponse } from '../../../normalization/rule_converters';
+
+const MAX_ERROR_MESSAGE_LENGTH = 1000;
+
+export type BulkActionError =
+ | PromisePoolError
+ | PromisePoolError
+ | BulkOperationError;
+
+export const buildBulkResponse = (
+ response: KibanaResponseFactory,
+ {
+ isDryRun = false,
+ errors = [],
+ updated = [],
+ created = [],
+ deleted = [],
+ skipped = [],
+ }: {
+ isDryRun?: boolean;
+ errors?: BulkActionError[];
+ updated?: RuleAlertType[];
+ created?: RuleAlertType[];
+ deleted?: RuleAlertType[];
+ skipped?: BulkActionSkipResult[];
+ }
+): IKibanaResponse => {
+ const numSucceeded = updated.length + created.length + deleted.length;
+ const numSkipped = skipped.length;
+ const numFailed = errors.length;
+
+ const summary: BulkEditActionSummary = {
+ failed: numFailed,
+ succeeded: numSucceeded,
+ skipped: numSkipped,
+ total: numSucceeded + numFailed + numSkipped,
+ };
+
+ // if response is for dry_run, empty lists of rules returned, as rules are not actually updated and stored within ES
+ // thus, it's impossible to return reliably updated/duplicated/deleted rules
+ const results: BulkEditActionResults = isDryRun
+ ? {
+ updated: [],
+ created: [],
+ deleted: [],
+ skipped: [],
+ }
+ : {
+ updated: updated.map((rule) => internalRuleToAPIResponse(rule)),
+ created: created.map((rule) => internalRuleToAPIResponse(rule)),
+ deleted: deleted.map((rule) => internalRuleToAPIResponse(rule)),
+ skipped,
+ };
+
+ if (numFailed > 0) {
+ return response.custom({
+ headers: { 'content-type': 'application/json' },
+ body: {
+ message: summary.succeeded > 0 ? 'Bulk edit partially failed' : 'Bulk edit failed',
+ status_code: 500,
+ attributes: {
+ errors: normalizeErrorResponse(errors),
+ results,
+ summary,
+ },
+ },
+ statusCode: 500,
+ });
+ }
+
+ const responseBody: BulkEditActionResponse = {
+ success: true,
+ rules_count: summary.total,
+ attributes: { results, summary },
+ };
+
+ return response.ok({ body: responseBody });
+};
+
+export const normalizeErrorResponse = (errors: BulkActionError[]): NormalizedRuleError[] => {
+ const errorsMap = new Map();
+
+ errors.forEach((errorObj) => {
+ let message: string;
+ let statusCode: number = 500;
+ let errorCode: BulkActionsDryRunErrCode | undefined;
+ let rule: RuleDetailsInError;
+ // transform different error types (PromisePoolError | PromisePoolError | BulkOperationError)
+ // to one common used in NormalizedRuleError
+ if ('rule' in errorObj) {
+ rule = errorObj.rule;
+ message = errorObj.message;
+ } else {
+ const { error, item } = errorObj;
+ const transformedError =
+ error instanceof Error
+ ? transformError(error)
+ : { message: String(error), statusCode: 500 };
+
+ errorCode = (error as DryRunError)?.errorCode;
+ message = transformedError.message;
+ statusCode = transformedError.statusCode;
+ // The promise pool item is either a rule ID string or a rule object. We have
+ // string IDs when we fail to fetch rules. Rule objects come from other
+ // situations when we found a rule but failed somewhere else.
+ rule = typeof item === 'string' ? { id: item } : { id: item.id, name: item.name };
+ }
+
+ if (errorsMap.has(message)) {
+ errorsMap.get(message)?.rules.push(rule);
+ } else {
+ errorsMap.set(message, {
+ message: truncate(message, { length: MAX_ERROR_MESSAGE_LENGTH }),
+ status_code: statusCode,
+ err_code: errorCode,
+ rules: [rule],
+ });
+ }
+ });
+
+ return Array.from(errorsMap, ([_, normalizedError]) => normalizedError);
+};
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_enable_disable_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_enable_disable_rules.ts
new file mode 100644
index 0000000000000..670e72d8663d4
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/bulk_enable_disable_rules.ts
@@ -0,0 +1,105 @@
+/*
+ * 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 { RulesClient } from '@kbn/alerting-plugin/server';
+import { invariant } from '../../../../../../../common/utils/invariant';
+import type { PromisePoolError } from '../../../../../../utils/promise_pool';
+import type { MlAuthz } from '../../../../../machine_learning/authz';
+import type { RuleAlertType } from '../../../../rule_schema';
+import { validateBulkEnableRule } from '../../../logic/bulk_actions/validations';
+
+interface BulkEnableDisableRulesArgs {
+ rules: RuleAlertType[];
+ action: 'enable' | 'disable';
+ isDryRun?: boolean;
+ rulesClient: RulesClient;
+ mlAuthz: MlAuthz;
+}
+
+interface BulkEnableDisableRulesOutcome {
+ updatedRules: RuleAlertType[];
+ errors: Array>;
+}
+
+export const bulkEnableDisableRules = async ({
+ rules,
+ isDryRun,
+ rulesClient,
+ action: operation,
+ mlAuthz,
+}: BulkEnableDisableRulesArgs): Promise => {
+ const errors: Array> = [];
+ const updatedRules: RuleAlertType[] = [];
+
+ // In the first step, we validate if the rules can be enabled
+ const validatedRules: RuleAlertType[] = [];
+ await Promise.all(
+ rules.map(async (rule) => {
+ try {
+ await validateBulkEnableRule({ mlAuthz, rule });
+ validatedRules.push(rule);
+ } catch (error) {
+ errors.push({ item: rule, error });
+ }
+ })
+ );
+
+ if (isDryRun || validatedRules.length === 0) {
+ return {
+ updatedRules: validatedRules,
+ errors,
+ };
+ }
+
+ // Then if it's not a dry run, we enable the rules that passed the validation
+ const ruleIds = validatedRules.map(({ id }) => id);
+
+ // Perform actual update using the rulesClient
+ const results =
+ operation === 'enable'
+ ? await rulesClient.bulkEnableRules({ ids: ruleIds })
+ : await rulesClient.bulkDisableRules({ ids: ruleIds });
+
+ const failedRuleIds = results.errors.map(({ rule: { id } }) => id);
+
+ // We need to go through the original rules array and update rules that were
+ // not returned as failed from the bulkEnableRules. We cannot rely on the
+ // results from the bulkEnableRules because the response is not consistent.
+ // Some rules might be missing in the response if they were skipped by
+ // Alerting Framework. See this issue for more details:
+ // https://github.com/elastic/kibana/issues/181050
+ updatedRules.push(
+ ...rules.flatMap((rule) => {
+ if (failedRuleIds.includes(rule.id)) {
+ return [];
+ }
+ return {
+ ...rule,
+ enabled: operation === 'enable',
+ };
+ })
+ );
+
+ // Rule objects returned from the bulkEnableRules are not
+ // compatible with the response type. So we need to map them to
+ // the original rules and update the enabled field
+ errors.push(
+ ...results.errors.map(({ rule: { id }, message }) => {
+ const rule = rules.find((r) => r.id === id);
+ invariant(rule != null, 'Unexpected rule id');
+ return {
+ item: rule,
+ error: new Error(message),
+ };
+ })
+ );
+
+ return {
+ updatedRules,
+ errors,
+ };
+};
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts
new file mode 100644
index 0000000000000..2a07ecc95509b
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts
@@ -0,0 +1,64 @@
+/*
+ * 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 { RulesClient } from '@kbn/alerting-plugin/server';
+import { BadRequestError } from '@kbn/securitysolution-es-utils';
+import { MAX_RULES_TO_UPDATE_IN_PARALLEL } from '../../../../../../../common/constants';
+import type { PromisePoolOutcome } from '../../../../../../utils/promise_pool';
+import { initPromisePool } from '../../../../../../utils/promise_pool';
+import type { RuleAlertType } from '../../../../rule_schema';
+import { readRules } from '../../../logic/crud/read_rules';
+import { findRules } from '../../../logic/search/find_rules';
+import { MAX_RULES_TO_PROCESS_TOTAL } from './route';
+
+export const fetchRulesByQueryOrIds = async ({
+ query,
+ ids,
+ rulesClient,
+ abortSignal,
+}: {
+ query: string | undefined;
+ ids: string[] | undefined;
+ rulesClient: RulesClient;
+ abortSignal: AbortSignal;
+}): Promise> => {
+ if (ids) {
+ return initPromisePool({
+ concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
+ items: ids,
+ executor: async (id: string) => {
+ const rule = await readRules({ id, rulesClient, ruleId: undefined });
+ if (rule == null) {
+ throw Error('Rule not found');
+ }
+ return rule;
+ },
+ abortSignal,
+ });
+ }
+
+ const { data, total } = await findRules({
+ rulesClient,
+ perPage: MAX_RULES_TO_PROCESS_TOTAL,
+ filter: query,
+ page: undefined,
+ sortField: undefined,
+ sortOrder: undefined,
+ fields: undefined,
+ });
+
+ if (total > MAX_RULES_TO_PROCESS_TOTAL) {
+ throw new BadRequestError(
+ `More than ${MAX_RULES_TO_PROCESS_TOTAL} rules matched the filter query. Try to narrow it down.`
+ );
+ }
+
+ return {
+ results: data.map((rule) => ({ item: rule.id, result: rule })),
+ errors: [],
+ };
+};
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts
index cd01a251a3c75..576ba1376ba3c 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts
@@ -13,7 +13,7 @@ import { mlServicesMock } from '../../../../../machine_learning/mocks';
import { buildMlAuthz } from '../../../../../machine_learning/authz';
import {
getEmptyFindResult,
- getBulkActionRequest,
+ getBulkDisableRuleActionRequest,
getBulkActionEditRequest,
getFindResultWithSingleHit,
getFindResultWithMultiHits,
@@ -22,7 +22,7 @@ import { requestContextMock, serverMock, requestMock } from '../../../../routes/
import { performBulkActionRoute } from './route';
import {
getPerformBulkActionEditSchemaMock,
- getPerformBulkActionSchemaMock,
+ getBulkDisableRuleActionSchemaMock,
} from '../../../../../../../common/api/detection_engine/rule_management/mocks';
import { loggingSystemMock } from '@kbn/core/server/mocks';
import { readRules } from '../../../logic/crud/read_rules';
@@ -45,13 +45,18 @@ describe('Perform bulk action route', () => {
ml = mlServicesMock.createSetupContract();
clients.rulesClient.find.mockResolvedValue(getFindResultWithSingleHit());
+ clients.rulesClient.bulkDisableRules.mockResolvedValue({
+ rules: [mockRule],
+ errors: [],
+ total: 1,
+ });
performBulkActionRoute(server.router, ml, logger);
});
describe('status codes', () => {
it('returns 200 when performing bulk action with all dependencies present', async () => {
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
expect(response.status).toEqual(200);
@@ -73,7 +78,7 @@ describe('Perform bulk action route', () => {
it("returns 200 when provided filter query doesn't match any rules", async () => {
clients.rulesClient.find.mockResolvedValue(getEmptyFindResult());
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
expect(response.status).toEqual(200);
@@ -97,7 +102,7 @@ describe('Perform bulk action route', () => {
getFindResultWithMultiHits({ data: [], total: Infinity })
);
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
expect(response.status).toEqual(400);
@@ -109,12 +114,22 @@ describe('Perform bulk action route', () => {
});
describe('rules execution failures', () => {
- it('returns error if disable rule throws error', async () => {
- clients.rulesClient.disable.mockImplementation(async () => {
- throw new Error('Test error');
+ it('returns an error when rulesClient.bulkDisableRules fails', async () => {
+ clients.rulesClient.bulkDisableRules.mockResolvedValue({
+ rules: [],
+ errors: [
+ {
+ message: 'Test error',
+ rule: {
+ id: mockRule.id,
+ name: mockRule.name,
+ },
+ },
+ ],
+ total: 1,
});
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
expect(response.status).toEqual(500);
@@ -152,7 +167,7 @@ describe('Perform bulk action route', () => {
.mockResolvedValue({ valid: false, message: 'mocked validation message' }),
});
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
@@ -192,7 +207,7 @@ describe('Perform bulk action route', () => {
.mockResolvedValue({ valid: false, message: 'mocked validation message' }),
});
const response = await server.inject(
- { ...getBulkActionRequest(), query: { dry_run: 'true' } },
+ { ...getBulkDisableRuleActionRequest(), query: { dry_run: 'true' } },
requestContextMock.convertContext(context)
);
@@ -294,11 +309,21 @@ describe('Perform bulk action route', () => {
});
it('return error message limited to length of 1000, to prevent large response size', async () => {
- clients.rulesClient.disable.mockImplementation(async () => {
- throw new Error('a'.repeat(1_300));
+ clients.rulesClient.bulkDisableRules.mockResolvedValue({
+ rules: [],
+ errors: [
+ {
+ message: 'a'.repeat(1_300),
+ rule: {
+ id: mockRule.id,
+ name: mockRule.name,
+ },
+ },
+ ],
+ total: 1,
});
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
expect(response.status).toEqual(500);
@@ -314,7 +339,7 @@ describe('Perform bulk action route', () => {
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
body: {
- ...getPerformBulkActionSchemaMock(),
+ ...getBulkDisableRuleActionSchemaMock(),
ids: [mockRule.id, 'failed-mock-id'],
query: undefined,
},
@@ -482,7 +507,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: { ...getPerformBulkActionSchemaMock(), action: undefined },
+ body: { ...getBulkDisableRuleActionSchemaMock(), action: undefined },
});
const result = server.validate(request);
expect(result.badRequest).toHaveBeenCalledWith(
@@ -494,7 +519,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: { ...getPerformBulkActionSchemaMock(), action: 'unknown' },
+ body: { ...getBulkDisableRuleActionSchemaMock(), action: 'unknown' },
});
const result = server.validate(request);
expect(result.badRequest).toHaveBeenCalledWith(
@@ -506,7 +531,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: { ...getPerformBulkActionSchemaMock(), query: undefined },
+ body: { ...getBulkDisableRuleActionSchemaMock(), query: undefined },
});
const result = server.validate(request);
@@ -517,7 +542,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: getPerformBulkActionSchemaMock(),
+ body: getBulkDisableRuleActionSchemaMock(),
});
const result = server.validate(request);
@@ -528,7 +553,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: { ...getPerformBulkActionSchemaMock(), ids: 'test fake' },
+ body: { ...getBulkDisableRuleActionSchemaMock(), ids: 'test fake' },
});
const result = server.validate(request);
expect(result.badRequest).toHaveBeenCalledWith(
@@ -541,7 +566,7 @@ describe('Perform bulk action route', () => {
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
body: {
- ...getPerformBulkActionSchemaMock(),
+ ...getBulkDisableRuleActionSchemaMock(),
query: undefined,
ids: Array.from({ length: 101 }).map(() => 'fake-id'),
},
@@ -558,7 +583,7 @@ describe('Perform bulk action route', () => {
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
body: {
- ...getPerformBulkActionSchemaMock(),
+ ...getBulkDisableRuleActionSchemaMock(),
query: '',
ids: ['fake-id'],
},
@@ -576,7 +601,7 @@ describe('Perform bulk action route', () => {
const request = requestMock.create({
method: 'patch',
path: DETECTION_ENGINE_RULES_BULK_ACTION,
- body: { ...getPerformBulkActionSchemaMock(), ids: [] },
+ body: { ...getBulkDisableRuleActionSchemaMock(), ids: [] },
});
const result = server.validate(request);
expect(result.badRequest).toHaveBeenCalledWith(
@@ -620,9 +645,14 @@ describe('Perform bulk action route', () => {
total: rulesNumber,
})
);
+ clients.rulesClient.bulkDisableRules.mockResolvedValue({
+ rules: Array.from({ length: rulesNumber }).map(() => mockRule),
+ errors: [],
+ total: rulesNumber,
+ });
const response = await server.inject(
- getBulkActionRequest(),
+ getBulkDisableRuleActionRequest(),
requestContextMock.convertContext(context)
);
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts
index ef06f8f004c98..8dc0a5ec651bb 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts
@@ -5,231 +5,46 @@
* 2.0.
*/
-import { truncate } from 'lodash';
-import { BadRequestError, transformError } from '@kbn/securitysolution-es-utils';
-import type { IKibanaResponse, KibanaResponseFactory, Logger } from '@kbn/core/server';
-
-import type { RulesClient, BulkOperationError } from '@kbn/alerting-plugin/server';
-import type { BulkActionSkipResult } from '@kbn/alerting-plugin/common';
+import type { IKibanaResponse, Logger } from '@kbn/core/server';
import { AbortError } from '@kbn/kibana-utils-plugin/common';
-import type { RuleAlertType } from '../../../../rule_schema';
-import type { BulkActionsDryRunErrCode } from '../../../../../../../common/constants';
-import {
- DETECTION_ENGINE_RULES_BULK_ACTION,
- MAX_RULES_TO_UPDATE_IN_PARALLEL,
- RULES_TABLE_MAX_PAGE_SIZE,
-} from '../../../../../../../common/constants';
-import type {
- BulkEditActionResponse,
- PerformBulkActionResponse,
-} from '../../../../../../../common/api/detection_engine/rule_management';
+import { transformError } from '@kbn/securitysolution-es-utils';
+import type { PerformBulkActionResponse } from '../../../../../../../common/api/detection_engine/rule_management';
import {
BulkActionTypeEnum,
PerformBulkActionRequestBody,
PerformBulkActionRequestQuery,
} from '../../../../../../../common/api/detection_engine/rule_management';
-import type {
- NormalizedRuleError,
- RuleDetailsInError,
- BulkEditActionResults,
- BulkEditActionSummary,
-} from '../../../../../../../common/api/detection_engine';
+import {
+ DETECTION_ENGINE_RULES_BULK_ACTION,
+ MAX_RULES_TO_UPDATE_IN_PARALLEL,
+ RULES_TABLE_MAX_PAGE_SIZE,
+} from '../../../../../../../common/constants';
import type { SetupPlugins } from '../../../../../../plugin';
import type { SecuritySolutionPluginRouter } from '../../../../../../types';
import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation';
-import { routeLimitedConcurrencyTag } from '../../../../../../utils/route_limited_concurrency_tag';
-import type { PromisePoolError, PromisePoolOutcome } from '../../../../../../utils/promise_pool';
import { initPromisePool } from '../../../../../../utils/promise_pool';
+import { routeLimitedConcurrencyTag } from '../../../../../../utils/route_limited_concurrency_tag';
import { buildMlAuthz } from '../../../../../machine_learning/authz';
-import { deleteRules } from '../../../logic/crud/delete_rules';
-import { duplicateRule } from '../../../logic/actions/duplicate_rule';
-import { duplicateExceptions } from '../../../logic/actions/duplicate_exceptions';
-import { findRules } from '../../../logic/search/find_rules';
-import { readRules } from '../../../logic/crud/read_rules';
-import { getExportByObjectIds } from '../../../logic/export/get_export_by_object_ids';
import { buildSiemResponse } from '../../../../routes/utils';
-import { internalRuleToAPIResponse } from '../../../normalization/rule_converters';
+import type { RuleAlertType } from '../../../../rule_schema';
+import { duplicateExceptions } from '../../../logic/actions/duplicate_exceptions';
+import { duplicateRule } from '../../../logic/actions/duplicate_rule';
import { bulkEditRules } from '../../../logic/bulk_actions/bulk_edit_rules';
-import type { DryRunError } from '../../../logic/bulk_actions/dry_run';
import {
- validateBulkEnableRule,
- validateBulkDisableRule,
- validateBulkDuplicateRule,
dryRunValidateBulkEditRule,
+ validateBulkDuplicateRule,
} from '../../../logic/bulk_actions/validations';
+import { deleteRules } from '../../../logic/crud/delete_rules';
+import { getExportByObjectIds } from '../../../logic/export/get_export_by_object_ids';
import { RULE_MANAGEMENT_BULK_ACTION_SOCKET_TIMEOUT_MS } from '../../timeouts';
+import type { BulkActionError } from './bulk_actions_response';
+import { buildBulkResponse } from './bulk_actions_response';
+import { bulkEnableDisableRules } from './bulk_enable_disable_rules';
+import { fetchRulesByQueryOrIds } from './fetch_rules_by_query_or_ids';
-const MAX_RULES_TO_PROCESS_TOTAL = 10000;
-const MAX_ERROR_MESSAGE_LENGTH = 1000;
+export const MAX_RULES_TO_PROCESS_TOTAL = 10000;
const MAX_ROUTE_CONCURRENCY = 5;
-export type BulkActionError =
- | PromisePoolError
- | PromisePoolError
- | BulkOperationError;
-
-const normalizeErrorResponse = (errors: BulkActionError[]): NormalizedRuleError[] => {
- const errorsMap = new Map();
-
- errors.forEach((errorObj) => {
- let message: string;
- let statusCode: number = 500;
- let errorCode: BulkActionsDryRunErrCode | undefined;
- let rule: RuleDetailsInError;
- // transform different error types (PromisePoolError | PromisePoolError | BulkOperationError)
- // to one common used in NormalizedRuleError
- if ('rule' in errorObj) {
- rule = errorObj.rule;
- message = errorObj.message;
- } else {
- const { error, item } = errorObj;
- const transformedError =
- error instanceof Error
- ? transformError(error)
- : { message: String(error), statusCode: 500 };
-
- errorCode = (error as DryRunError)?.errorCode;
- message = transformedError.message;
- statusCode = transformedError.statusCode;
- // The promise pool item is either a rule ID string or a rule object. We have
- // string IDs when we fail to fetch rules. Rule objects come from other
- // situations when we found a rule but failed somewhere else.
- rule = typeof item === 'string' ? { id: item } : { id: item.id, name: item.name };
- }
-
- if (errorsMap.has(message)) {
- errorsMap.get(message)?.rules.push(rule);
- } else {
- errorsMap.set(message, {
- message: truncate(message, { length: MAX_ERROR_MESSAGE_LENGTH }),
- status_code: statusCode,
- err_code: errorCode,
- rules: [rule],
- });
- }
- });
-
- return Array.from(errorsMap, ([_, normalizedError]) => normalizedError);
-};
-
-const buildBulkResponse = (
- response: KibanaResponseFactory,
- {
- isDryRun = false,
- errors = [],
- updated = [],
- created = [],
- deleted = [],
- skipped = [],
- }: {
- isDryRun?: boolean;
- errors?: BulkActionError[];
- updated?: RuleAlertType[];
- created?: RuleAlertType[];
- deleted?: RuleAlertType[];
- skipped?: BulkActionSkipResult[];
- }
-): IKibanaResponse => {
- const numSucceeded = updated.length + created.length + deleted.length;
- const numSkipped = skipped.length;
- const numFailed = errors.length;
-
- const summary: BulkEditActionSummary = {
- failed: numFailed,
- succeeded: numSucceeded,
- skipped: numSkipped,
- total: numSucceeded + numFailed + numSkipped,
- };
-
- // if response is for dry_run, empty lists of rules returned, as rules are not actually updated and stored within ES
- // thus, it's impossible to return reliably updated/duplicated/deleted rules
- const results: BulkEditActionResults = isDryRun
- ? {
- updated: [],
- created: [],
- deleted: [],
- skipped: [],
- }
- : {
- updated: updated.map((rule) => internalRuleToAPIResponse(rule)),
- created: created.map((rule) => internalRuleToAPIResponse(rule)),
- deleted: deleted.map((rule) => internalRuleToAPIResponse(rule)),
- skipped,
- };
-
- if (numFailed > 0) {
- return response.custom({
- headers: { 'content-type': 'application/json' },
- body: {
- message: summary.succeeded > 0 ? 'Bulk edit partially failed' : 'Bulk edit failed',
- status_code: 500,
- attributes: {
- errors: normalizeErrorResponse(errors),
- results,
- summary,
- },
- },
- statusCode: 500,
- });
- }
-
- const responseBody: BulkEditActionResponse = {
- success: true,
- rules_count: summary.total,
- attributes: { results, summary },
- };
-
- return response.ok({ body: responseBody });
-};
-
-const fetchRulesByQueryOrIds = async ({
- query,
- ids,
- rulesClient,
- abortSignal,
-}: {
- query: string | undefined;
- ids: string[] | undefined;
- rulesClient: RulesClient;
- abortSignal: AbortSignal;
-}): Promise> => {
- if (ids) {
- return initPromisePool({
- concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
- items: ids,
- executor: async (id: string) => {
- const rule = await readRules({ id, rulesClient, ruleId: undefined });
- if (rule == null) {
- throw Error('Rule not found');
- }
- return rule;
- },
- abortSignal,
- });
- }
-
- const { data, total } = await findRules({
- rulesClient,
- perPage: MAX_RULES_TO_PROCESS_TOTAL,
- filter: query,
- page: undefined,
- sortField: undefined,
- sortOrder: undefined,
- fields: undefined,
- });
-
- if (total > MAX_RULES_TO_PROCESS_TOTAL) {
- throw new BadRequestError(
- `More than ${MAX_RULES_TO_PROCESS_TOTAL} rules matched the filter query. Try to narrow it down.`
- );
- }
-
- return {
- results: data.map((rule) => ({ item: rule.id, result: rule })),
- errors: [],
- };
-};
-
export const performBulkActionRoute = (
router: SecuritySolutionPluginRouter,
ml: SetupPlugins['ml'],
@@ -256,6 +71,7 @@ export const performBulkActionRoute = (
},
},
},
+
async (context, request, response): Promise> => {
const { body } = request;
const siemResponse = buildSiemResponse(response);
@@ -302,9 +118,9 @@ export const performBulkActionRoute = (
const rulesClient = ctx.alerting.getRulesClient();
const exceptionsClient = ctx.lists?.getExceptionListClient();
const savedObjectsClient = ctx.core.savedObjects.client;
- const actionsClient = (await ctx.actions)?.getActionsClient();
+ const actionsClient = ctx.actions.getActionsClient();
- const { getExporter, getClient } = (await ctx.core).savedObjects;
+ const { getExporter, getClient } = ctx.core.savedObjects;
const client = getClient({ includedHiddenTypes: ['action'] });
const exporter = getExporter(client);
@@ -344,69 +160,38 @@ export const performBulkActionRoute = (
});
const rules = fetchRulesOutcome.results.map(({ result }) => result);
- let bulkActionOutcome: PromisePoolOutcome;
+ const errors: BulkActionError[] = [...fetchRulesOutcome.errors];
let updated: RuleAlertType[] = [];
let created: RuleAlertType[] = [];
let deleted: RuleAlertType[] = [];
switch (body.action) {
- case BulkActionTypeEnum.enable:
- bulkActionOutcome = await initPromisePool({
- concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
- items: rules,
- executor: async (rule) => {
- await validateBulkEnableRule({ mlAuthz, rule });
-
- // during dry run only validation is getting performed and rule is not saved in ES, thus return early
- if (isDryRun) {
- return rule;
- }
-
- if (!rule.enabled) {
- await rulesClient.enable({ id: rule.id });
- }
-
- return {
- ...rule,
- enabled: true,
- };
- },
- abortSignal: abortController.signal,
+ case BulkActionTypeEnum.enable: {
+ const { updatedRules, errors: bulkActionErrors } = await bulkEnableDisableRules({
+ rules,
+ isDryRun,
+ rulesClient,
+ action: 'enable',
+ mlAuthz,
});
- updated = bulkActionOutcome.results
- .map(({ result }) => result)
- .filter((rule): rule is RuleAlertType => rule !== null);
+ errors.push(...bulkActionErrors);
+ updated = updatedRules;
break;
- case BulkActionTypeEnum.disable:
- bulkActionOutcome = await initPromisePool({
- concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
- items: rules,
- executor: async (rule) => {
- await validateBulkDisableRule({ mlAuthz, rule });
-
- // during dry run only validation is getting performed and rule is not saved in ES, thus return early
- if (isDryRun) {
- return rule;
- }
-
- if (rule.enabled) {
- await rulesClient.disable({ id: rule.id });
- }
-
- return {
- ...rule,
- enabled: false,
- };
- },
- abortSignal: abortController.signal,
+ }
+ case BulkActionTypeEnum.disable: {
+ const { updatedRules, errors: bulkActionErrors } = await bulkEnableDisableRules({
+ rules,
+ isDryRun,
+ rulesClient,
+ action: 'disable',
+ mlAuthz,
});
- updated = bulkActionOutcome.results
- .map(({ result }) => result)
- .filter((rule): rule is RuleAlertType => rule !== null);
+ errors.push(...bulkActionErrors);
+ updated = updatedRules;
break;
-
- case BulkActionTypeEnum.delete:
- bulkActionOutcome = await initPromisePool({
+ }
+ case BulkActionTypeEnum.delete: {
+ const bulkActionOutcome = await initPromisePool({
concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
items: rules,
executor: async (rule) => {
@@ -424,13 +209,14 @@ export const performBulkActionRoute = (
},
abortSignal: abortController.signal,
});
+ errors.push(...bulkActionOutcome.errors);
deleted = bulkActionOutcome.results
.map(({ item }) => item)
.filter((rule): rule is RuleAlertType => rule !== null);
break;
-
- case BulkActionTypeEnum.duplicate:
- bulkActionOutcome = await initPromisePool({
+ }
+ case BulkActionTypeEnum.duplicate: {
+ const bulkActionOutcome = await initPromisePool({
concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
items: rules,
executor: async (rule) => {
@@ -483,12 +269,13 @@ export const performBulkActionRoute = (
},
abortSignal: abortController.signal,
});
+ errors.push(...bulkActionOutcome.errors);
created = bulkActionOutcome.results
.map(({ result }) => result)
.filter((rule): rule is RuleAlertType => rule !== null);
break;
-
- case BulkActionTypeEnum.export:
+ }
+ case BulkActionTypeEnum.export: {
const exported = await getExportByObjectIds(
rulesClient,
exceptionsClient,
@@ -507,11 +294,12 @@ export const performBulkActionRoute = (
},
body: responseBody,
});
+ }
// will be processed only when isDryRun === true
// during dry run only validation is getting performed and rule is not saved in ES
- case BulkActionTypeEnum.edit:
- bulkActionOutcome = await initPromisePool({
+ case BulkActionTypeEnum.edit: {
+ const bulkActionOutcome = await initPromisePool({
concurrency: MAX_RULES_TO_UPDATE_IN_PARALLEL,
items: rules,
executor: async (rule) => {
@@ -521,9 +309,12 @@ export const performBulkActionRoute = (
},
abortSignal: abortController.signal,
});
+ errors.push(...bulkActionOutcome.errors);
updated = bulkActionOutcome.results
.map(({ result }) => result)
.filter((rule): rule is RuleAlertType => rule !== null);
+ break;
+ }
}
if (abortController.signal.aborted === true) {
@@ -534,7 +325,7 @@ export const performBulkActionRoute = (
updated,
deleted,
created,
- errors: [...fetchRulesOutcome.errors, ...bulkActionOutcome.errors],
+ errors,
isDryRun,
});
} catch (err) {
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts
index 74fc6f91d37c4..806c90e41ac12 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts
@@ -55,9 +55,7 @@ const throwMlAuthError = (mlAuthz: MlAuthz, ruleType: RuleType) =>
* @param params - {@link BulkActionsValidationArgs}
*/
export const validateBulkEnableRule = async ({ rule, mlAuthz }: BulkActionsValidationArgs) => {
- if (!rule.enabled) {
- await throwMlAuthError(mlAuthz, rule.params.type);
- }
+ await throwMlAuthError(mlAuthz, rule.params.type);
};
/**
@@ -65,9 +63,7 @@ export const validateBulkEnableRule = async ({ rule, mlAuthz }: BulkActionsValid
* @param params - {@link BulkActionsValidationArgs}
*/
export const validateBulkDisableRule = async ({ rule, mlAuthz }: BulkActionsValidationArgs) => {
- if (rule.enabled) {
- await throwMlAuthError(mlAuthz, rule.params.type);
- }
+ await throwMlAuthError(mlAuthz, rule.params.type);
};
/**
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts
index 83a7db27fe3fe..a70df8eb58335 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts
@@ -6,57 +6,38 @@
*/
import { Rule } from '@kbn/alerting-plugin/common';
-import { BaseRuleParams } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_schema';
import expect from '@kbn/expect';
-import { getCreateEsqlRulesSchemaMock } from '@kbn/security-solution-plugin/common/api/detection_engine/model/rule_schema/mocks';
-import {
- DETECTION_ENGINE_RULES_BULK_ACTION,
- DETECTION_ENGINE_RULES_URL,
-} from '@kbn/security-solution-plugin/common/constants';
import type { RuleResponse } from '@kbn/security-solution-plugin/common/api/detection_engine';
+import { getCreateEsqlRulesSchemaMock } from '@kbn/security-solution-plugin/common/api/detection_engine/model/rule_schema/mocks';
import {
- BulkActionTypeEnum,
BulkActionEditTypeEnum,
+ BulkActionTypeEnum,
} from '@kbn/security-solution-plugin/common/api/detection_engine/rule_management';
+import { BaseRuleParams } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_schema';
+import {
+ createRule,
+ deleteAllRules,
+ waitForRuleSuccess,
+} from '../../../../../../common/utils/security_solution';
+import { FtrProviderContext } from '../../../../../ftr_provider_context';
import {
binaryToString,
+ checkInvestigationFieldSoValue,
createLegacyRuleAction,
- getLegacyActionSO,
- getSimpleRule,
- getWebHookAction,
createRuleThroughAlertingEndpoint,
+ getLegacyActionSO,
getRuleSavedObjectWithLegacyInvestigationFields,
getRuleSavedObjectWithLegacyInvestigationFieldsEmptyArray,
- checkInvestigationFieldSoValue,
getRuleSOById,
+ getSimpleRule,
+ getWebHookAction,
} from '../../../utils';
-import {
- createRule,
- createAlertsIndex,
- deleteAllRules,
- deleteAllAlerts,
- waitForRuleSuccess,
-} from '../../../../../../common/utils/security_solution';
-
-import { FtrProviderContext } from '../../../../../ftr_provider_context';
export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
+ const securitySolutionApi = getService('securitySolutionApi');
const es = getService('es');
const log = getService('log');
- const esArchiver = getService('esArchiver');
-
- const postBulkAction = () =>
- supertest
- .post(DETECTION_ENGINE_RULES_BULK_ACTION)
- .set('kbn-xsrf', 'true')
- .set('elastic-api-version', '2023-10-31');
-
- const fetchRule = (ruleId: string) =>
- supertest
- .get(`${DETECTION_ENGINE_RULES_URL}?rule_id=${ruleId}`)
- .set('kbn-xsrf', 'true')
- .set('elastic-api-version', '2023-10-31');
const createConnector = async (payload: Record) =>
(await supertest.post('/api/actions/action').set('kbn-xsrf', 'true').send(payload).expect(200))
@@ -67,14 +48,7 @@ export default ({ getService }: FtrProviderContext): void => {
// Failing: See https://github.com/elastic/kibana/issues/173804
describe('@ess perform_bulk_action - ESS specific logic', () => {
beforeEach(async () => {
- await createAlertsIndex(supertest, log);
- await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts');
- });
-
- afterEach(async () => {
- await deleteAllAlerts(supertest, log, es);
await deleteAllRules(supertest, log);
- await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts');
});
it('should delete rules and any associated legacy actions', async () => {
@@ -99,8 +73,11 @@ export default ({ getService }: FtrProviderContext): void => {
expect(sidecarActionsResults.hits.hits.length).to.eql(1);
expect(sidecarActionsResults.hits.hits[0]?._source?.references[0].id).to.eql(rule1.id);
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.delete })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.delete },
+ query: {},
+ })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 1, total: 1 });
@@ -113,7 +90,7 @@ export default ({ getService }: FtrProviderContext): void => {
expect(sidecarActionsPostResults.hits.hits.length).to.eql(0);
// Check that the updates have been persisted
- await fetchRule(ruleId).expect(404);
+ await securitySolutionApi.readRule({ query: { rule_id: ruleId } }).expect(404);
});
it('should enable rules and migrate actions', async () => {
@@ -138,8 +115,11 @@ export default ({ getService }: FtrProviderContext): void => {
expect(sidecarActionsResults.hits.hits.length).to.eql(1);
expect(sidecarActionsResults.hits.hits[0]?._source?.references[0].id).to.eql(rule1.id);
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.enable })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.enable },
+ query: {},
+ })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 1, total: 1 });
@@ -148,7 +128,9 @@ export default ({ getService }: FtrProviderContext): void => {
expect(body.attributes.results.updated[0].enabled).to.eql(true);
// Check that the updates have been persisted
- const { body: ruleBody } = await fetchRule(ruleId).expect(200);
+ const { body: ruleBody } = await securitySolutionApi
+ .readRule({ query: { rule_id: ruleId } })
+ .expect(200);
// legacy sidecar action should be gone
const sidecarActionsPostResults = await getLegacyActionSO(es);
@@ -193,8 +175,11 @@ export default ({ getService }: FtrProviderContext): void => {
expect(sidecarActionsResults.hits.hits.length).to.eql(1);
expect(sidecarActionsResults.hits.hits[0]?._source?.references[0].id).to.eql(rule1.id);
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.disable })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.disable },
+ query: {},
+ })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 1, total: 1 });
@@ -203,7 +188,9 @@ export default ({ getService }: FtrProviderContext): void => {
expect(body.attributes.results.updated[0].enabled).to.eql(false);
// Check that the updates have been persisted
- const { body: ruleBody } = await fetchRule(ruleId).expect(200);
+ const { body: ruleBody } = await securitySolutionApi
+ .readRule({ query: { rule_id: ruleId } })
+ .expect(200);
// legacy sidecar action should be gone
const sidecarActionsPostResults = await getLegacyActionSO(es);
@@ -248,11 +235,14 @@ export default ({ getService }: FtrProviderContext): void => {
ruleToDuplicate.id
);
- const { body } = await postBulkAction()
- .send({
- query: '',
- action: BulkActionTypeEnum.duplicate,
- duplicate: { include_exceptions: false, include_expired_exceptions: false },
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: {
+ query: '',
+ action: BulkActionTypeEnum.duplicate,
+ duplicate: { include_exceptions: false, include_expired_exceptions: false },
+ },
+ query: {},
})
.expect(200);
@@ -262,10 +252,8 @@ export default ({ getService }: FtrProviderContext): void => {
expect(body.attributes.results.created[0].name).to.eql(`${ruleToDuplicate.name} [Duplicate]`);
// Check that the updates have been persisted
- const { body: rulesResponse } = await supertest
- .get(`${DETECTION_ENGINE_RULES_URL}/_find`)
- .set('kbn-xsrf', 'true')
- .set('elastic-api-version', '2023-10-31')
+ const { body: rulesResponse } = await securitySolutionApi
+ .findRules({ query: {} })
.expect(200);
expect(rulesResponse.total).to.eql(2);
@@ -293,16 +281,19 @@ export default ({ getService }: FtrProviderContext): void => {
it('should return error if index patterns action is applied to ES|QL rule', async () => {
const esqlRule = await createRule(supertest, log, getCreateEsqlRulesSchemaMock());
- const { body } = await postBulkAction()
- .send({
- ids: [esqlRule.id],
- action: BulkActionTypeEnum.edit,
- [BulkActionTypeEnum.edit]: [
- {
- type: BulkActionEditTypeEnum.add_index_patterns,
- value: ['index-*'],
- },
- ],
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: {
+ ids: [esqlRule.id],
+ action: BulkActionTypeEnum.edit,
+ [BulkActionTypeEnum.edit]: [
+ {
+ type: BulkActionEditTypeEnum.add_index_patterns,
+ value: ['index-*'],
+ },
+ ],
+ },
+ query: {},
})
.expect(500);
@@ -345,15 +336,18 @@ export default ({ getService }: FtrProviderContext): void => {
ruleToDuplicate.id
);
- const { body: setTagsBody } = await postBulkAction().send({
- query: '',
- action: BulkActionTypeEnum.edit,
- [BulkActionTypeEnum.edit]: [
- {
- type: BulkActionEditTypeEnum.set_tags,
- value: ['reset-tag'],
- },
- ],
+ const { body: setTagsBody } = await securitySolutionApi.performBulkAction({
+ body: {
+ query: '',
+ action: BulkActionTypeEnum.edit,
+ [BulkActionTypeEnum.edit]: [
+ {
+ type: BulkActionEditTypeEnum.set_tags,
+ value: ['reset-tag'],
+ },
+ ],
+ },
+ query: {},
});
expect(setTagsBody.attributes.summary).to.eql({
failed: 0,
@@ -363,7 +357,9 @@ export default ({ getService }: FtrProviderContext): void => {
});
// Check that the updates have been persisted
- const { body: setTagsRule } = await fetchRule(ruleId).expect(200);
+ const { body: setTagsRule } = await securitySolutionApi
+ .readRule({ query: { rule_id: ruleId } })
+ .expect(200);
// Sidecar should be removed
const sidecarActionsPostResults = await getLegacyActionSO(es);
@@ -422,24 +418,27 @@ export default ({ getService }: FtrProviderContext): void => {
createdRule.id
);
- const { body } = await postBulkAction()
- .send({
- ids: [createdRule.id],
- action: BulkActionTypeEnum.edit,
- [BulkActionTypeEnum.edit]: [
- {
- type: BulkActionEditTypeEnum.set_rule_actions,
- value: {
- throttle: '1h',
- actions: [
- {
- ...webHookActionMock,
- id: webHookConnector.id,
- },
- ],
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: {
+ ids: [createdRule.id],
+ action: BulkActionTypeEnum.edit,
+ [BulkActionTypeEnum.edit]: [
+ {
+ type: BulkActionEditTypeEnum.set_rule_actions,
+ value: {
+ throttle: '1h',
+ actions: [
+ {
+ ...webHookActionMock,
+ id: webHookConnector.id,
+ },
+ ],
+ },
},
- },
- ],
+ ],
+ },
+ query: {},
})
.expect(200);
@@ -457,7 +456,9 @@ export default ({ getService }: FtrProviderContext): void => {
expect(body.attributes.results.updated[0].actions).to.eql(expectedRuleActions);
// Check that the updates have been persisted
- const { body: readRule } = await fetchRule(ruleId).expect(200);
+ const { body: readRule } = await securitySolutionApi
+ .readRule({ query: { rule_id: ruleId } })
+ .expect(200);
expect(readRule.actions).to.eql(expectedRuleActions);
@@ -475,9 +476,6 @@ export default ({ getService }: FtrProviderContext): void => {
let ruleWithIntendedInvestigationField: RuleResponse;
beforeEach(async () => {
- await deleteAllAlerts(supertest, log, es);
- await deleteAllRules(supertest, log);
- await createAlertsIndex(supertest, log);
ruleWithLegacyInvestigationField = await createRuleThroughAlertingEndpoint(
supertest,
getRuleSavedObjectWithLegacyInvestigationFields()
@@ -495,13 +493,12 @@ export default ({ getService }: FtrProviderContext): void => {
});
});
- afterEach(async () => {
- await deleteAllRules(supertest, log);
- });
-
it('should export rules with legacy investigation_fields and transform legacy field in response', async () => {
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.export })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.export },
+ query: {},
+ })
.expect(200)
.expect('Content-Type', 'application/ndjson')
.expect('Content-Disposition', 'attachment; filename="rules_export.ndjson"')
@@ -566,8 +563,11 @@ export default ({ getService }: FtrProviderContext): void => {
});
it('should delete rules with investigation fields and transform legacy field in response', async () => {
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.delete })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.delete },
+ query: {},
+ })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 3, total: 3 });
@@ -590,14 +590,25 @@ export default ({ getService }: FtrProviderContext): void => {
});
// Check that the updates have been persisted
- await fetchRule(ruleWithLegacyInvestigationField.params.ruleId).expect(404);
- await fetchRule(ruleWithLegacyInvestigationFieldEmptyArray.params.ruleId).expect(404);
- await fetchRule('rule-with-investigation-field').expect(404);
+ await securitySolutionApi
+ .readRule({ query: { rule_id: ruleWithLegacyInvestigationField.params.ruleId } })
+ .expect(404);
+ await securitySolutionApi
+ .readRule({
+ query: { rule_id: ruleWithLegacyInvestigationFieldEmptyArray.params.ruleId },
+ })
+ .expect(404);
+ await securitySolutionApi
+ .readRule({ query: { rule_id: 'rule-with-investigation-field' } })
+ .expect(404);
});
it('should enable rules with legacy investigation fields and transform legacy field in response', async () => {
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.enable })
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: { query: '', action: BulkActionTypeEnum.enable },
+ query: {},
+ })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 3, total: 3 });
@@ -664,8 +675,8 @@ export default ({ getService }: FtrProviderContext): void => {
});
it('should disable rules with legacy investigation fields and transform legacy field in response', async () => {
- const { body } = await postBulkAction()
- .send({ query: '', action: BulkActionTypeEnum.disable })
+ const { body } = await securitySolutionApi
+ .performBulkAction({ body: { query: '', action: BulkActionTypeEnum.disable }, query: {} })
.expect(200);
expect(body.attributes.summary).to.eql({ failed: 0, skipped: 0, succeeded: 3, total: 3 });
@@ -735,11 +746,14 @@ export default ({ getService }: FtrProviderContext): void => {
});
it('should duplicate rules with legacy investigation fields and transform field in response', async () => {
- const { body } = await postBulkAction()
- .send({
- query: '',
- action: BulkActionTypeEnum.duplicate,
- duplicate: { include_exceptions: false, include_expired_exceptions: false },
+ const { body } = await securitySolutionApi
+ .performBulkAction({
+ body: {
+ query: '',
+ action: BulkActionTypeEnum.duplicate,
+ duplicate: { include_exceptions: false, include_expired_exceptions: false },
+ },
+ query: {},
})
.expect(200);
@@ -754,10 +768,8 @@ export default ({ getService }: FtrProviderContext): void => {
expect(names.includes('Test investigation fields object [Duplicate]')).to.eql(true);
// Check that the updates have been persisted
- const { body: rulesResponse } = await supertest
- .get(`${DETECTION_ENGINE_RULES_URL}/_find`)
- .set('kbn-xsrf', 'true')
- .set('elastic-api-version', '2023-10-31')
+ const { body: rulesResponse } = await await securitySolutionApi
+ .findRules({ query: {} })
.expect(200);
expect(rulesResponse.total).to.eql(6);
@@ -854,15 +866,18 @@ export default ({ getService }: FtrProviderContext): void => {
});
it('should edit rules with legacy investigation fields', async () => {
- const { body } = await postBulkAction().send({
- query: '',
- action: BulkActionTypeEnum.edit,
- [BulkActionTypeEnum.edit]: [
- {
- type: BulkActionEditTypeEnum.set_tags,
- value: ['reset-tag'],
- },
- ],
+ const { body } = await securitySolutionApi.performBulkAction({
+ body: {
+ query: '',
+ action: BulkActionTypeEnum.edit,
+ [BulkActionTypeEnum.edit]: [
+ {
+ type: BulkActionEditTypeEnum.set_tags,
+ value: ['reset-tag'],
+ },
+ ],
+ },
+ query: {},
});
expect(body.attributes.summary).to.eql({
failed: 0,
From bcb876fbe977860d9d1b2ddfbc916f97735077f4 Mon Sep 17 00:00:00 2001
From: Cristina Amico
Date: Mon, 22 Apr 2024 15:56:16 +0200
Subject: [PATCH 025/183] [Fleet] Fix flattened inputs in config tab (#181155)
Fixes https://github.com/elastic/kibana/issues/180307
Fix the response format of
`api/fleet/epm/templates/${testPkgName}/${testPkgVersion}/inputs`
## Summary
The inputs streams returned in the configs tab where flattened at the
end and this was preventing the final config from working when used on a
standalone agent.
- Removed the `flatMap` from
[here](https://github.com/elastic/kibana/blob/ef5af172336d76cc553ae72cbcf289327c2ea428/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts#L115)
- Did a small refactor where I'm directly importing the merge utility
from `package_policies_to_agent_inputs` to reduce duplication, also
improved types and naming
See [this
comment](https://github.com/elastic/kibana/issues/180307#issuecomment-2063987477)
for the new format
### Checklist
- [ ] [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
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../package_policies_to_agent_inputs.ts | 51 +++--
.../epm/packages/get_template_inputs.ts | 48 ++---
.../epm/packages/get_templates_inputs.test.ts | 38 ++--
.../apis/epm/get_templates_inputs.ts | 187 +++++++++---------
4 files changed, 162 insertions(+), 162 deletions(-)
diff --git a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts
index 938677c7c8bb9..5cf94210724c1 100644
--- a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts
+++ b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts
@@ -12,6 +12,7 @@ import type {
FullAgentPolicyInput,
FullAgentPolicyInputStream,
PackageInfo,
+ PackagePolicyInput,
} from '../../types';
import { DEFAULT_OUTPUT } from '../../constants';
import { pkgToPkgKey } from '../epm/registry';
@@ -48,34 +49,18 @@ export const storedPackagePolicyToAgentInputs = (
: packagePolicy.id;
const fullInput: FullAgentPolicyInput = {
+ // @ts-ignore-next-line the following id is actually one level above the one in fullInputStream, but the linter thinks it gets overwritten
id: inputId,
revision: packagePolicy.revision,
name: packagePolicy.name,
type: input.type,
+ // @ts-ignore-next-line
data_stream: {
namespace: packagePolicy?.namespace || agentPolicyNamespace || 'default', // custom namespace has precedence on agent policy's one
},
use_output: outputId,
package_policy_id: packagePolicy.id,
- ...(input.compiled_input || {}),
- ...(input.streams.length
- ? {
- streams: input.streams
- .filter((stream) => stream.enabled)
- .map((stream) => {
- const fullStream: FullAgentPolicyInputStream = {
- id: stream.id,
- data_stream: stream.data_stream,
- ...stream.compiled_stream,
- ...Object.entries(stream.config || {}).reduce((acc, [key, { value }]) => {
- acc[key] = value;
- return acc;
- }, {} as { [k: string]: any }),
- };
- return fullStream;
- }),
- }
- : {}),
+ ...getFullInputStreams(input),
};
// deeply merge the input.config values with the full policy input
@@ -95,12 +80,38 @@ export const storedPackagePolicyToAgentInputs = (
},
};
}
-
fullInputs.push(fullInput);
});
return fullInputs;
};
+export const getFullInputStreams = (
+ input: PackagePolicyInput,
+ allStreamEnabled: boolean = false
+): FullAgentPolicyInputStream => {
+ return {
+ ...(input.compiled_input || {}),
+ ...(input.streams.length
+ ? {
+ streams: input.streams
+ .filter((stream) => stream.enabled || allStreamEnabled)
+ .map((stream) => {
+ const fullStream: FullAgentPolicyInputStream = {
+ id: stream.id,
+ data_stream: stream.data_stream,
+ ...stream.compiled_stream,
+ ...Object.entries(stream.config || {}).reduce((acc, [key, { value }]) => {
+ acc[key] = value;
+ return acc;
+ }, {} as { [k: string]: any }),
+ };
+ return fullStream;
+ }),
+ }
+ : {}),
+ };
+};
+
export const storedPackagePoliciesToAgentInputs = async (
packagePolicies: PackagePolicy[],
packageInfoCache: Map,
diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts
index a0a8f2cb64b7a..7cdac46f3defa 100644
--- a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts
+++ b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts
@@ -16,58 +16,44 @@ import type {
PackageInfo,
NewPackagePolicy,
PackagePolicyInput,
- FullAgentPolicyInput,
FullAgentPolicyInputStream,
} from '../../../../common/types';
import { _sortYamlKeys } from '../../../../common/services/full_agent_policy_to_yaml';
+import { getFullInputStreams } from '../../agent_policies/package_policies_to_agent_inputs';
+
import { getPackageInfo } from '.';
import { getPackageAssetsMap } from './get';
type Format = 'yml' | 'json';
// Function based off storedPackagePolicyToAgentInputs, it only creates the `streams` section instead of the FullAgentPolicyInput
-export const templatePackagePolicyToFullInputs = (
+export const templatePackagePolicyToFullInputStreams = (
packagePolicyInputs: PackagePolicyInput[]
-): FullAgentPolicyInput[] => {
- const fullInputs: FullAgentPolicyInput[] = [];
+): FullAgentPolicyInputStream[] => {
+ const fullInputsStreams: FullAgentPolicyInputStream[] = [];
- if (!packagePolicyInputs || packagePolicyInputs.length === 0) return fullInputs;
+ if (!packagePolicyInputs || packagePolicyInputs.length === 0) return fullInputsStreams;
packagePolicyInputs.forEach((input) => {
- const fullInput = {
- ...(input.compiled_input || {}),
- ...(input.streams.length
- ? {
- streams: input.streams.map((stream) => {
- const fullStream: FullAgentPolicyInputStream = {
- id: stream.id,
- type: input.type,
- data_stream: stream.data_stream,
- ...stream.compiled_stream,
- ...Object.entries(stream.config || {}).reduce((acc, [key, { value }]) => {
- acc[key] = value;
- return acc;
- }, {} as { [k: string]: any }),
- };
- return fullStream;
- }),
- }
- : {}),
+ const fullInputStream = {
+ // @ts-ignore-next-line the following id is actually one level above the one in fullInputStream, but the linter thinks it gets overwritten
+ id: input.policy_template ? `${input.type}-${input.policy_template}` : `${input.type}`,
+ ...getFullInputStreams(input, true),
};
- // deeply merge the input.config values with the full policy input
+ // deeply merge the input.config values with the full policy input stream
merge(
- fullInput,
+ fullInputStream,
Object.entries(input.config || {}).reduce((acc, [key, { value }]) => {
acc[key] = value;
return acc;
}, {} as Record)
);
- fullInputs.push(fullInput);
+ fullInputsStreams.push(fullInputStream);
});
- return fullInputs;
+ return fullInputsStreams;
};
export async function getTemplateInputs(
@@ -97,6 +83,7 @@ export async function getTemplateInputs(
packageInfo,
savedObjectsClient: soClient,
});
+
const compiledInputs = await _compilePackagePolicyInputs(
packageInfo,
emptyPackagePolicy.vars || {},
@@ -107,12 +94,9 @@ export async function getTemplateInputs(
...emptyPackagePolicy,
inputs: compiledInputs,
};
- const fullAgentPolicyInputs = templatePackagePolicyToFullInputs(
+ const inputs = templatePackagePolicyToFullInputStreams(
packagePolicyWithInputs.inputs as PackagePolicyInput[]
);
- // @ts-ignore-next-line The return type is any because in some case we can have compiled_input instead of input.streams
- // we don't know what it is. An example is integration APM
- const inputs: any = fullAgentPolicyInputs.flatMap((input) => input?.streams || input);
if (format === 'json') {
return { inputs };
diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get_templates_inputs.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/get_templates_inputs.test.ts
index e9912cc8d8bd2..339469495cd89 100644
--- a/x-pack/plugins/fleet/server/services/epm/packages/get_templates_inputs.test.ts
+++ b/x-pack/plugins/fleet/server/services/epm/packages/get_templates_inputs.test.ts
@@ -7,7 +7,7 @@
import type { PackagePolicyInput } from '../../../../common/types';
-import { templatePackagePolicyToFullInputs } from './get_template_inputs';
+import { templatePackagePolicyToFullInputStreams } from './get_template_inputs';
const packageInfoCache = new Map();
packageInfoCache.set('mock_package-0.0.0', {
@@ -29,7 +29,7 @@ packageInfoCache.set('limited_package-0.0.0', {
],
});
-describe('Fleet - templatePackagePolicyToFullInputs', () => {
+describe('Fleet - templatePackagePolicyToFullInputStreams', () => {
const mockInput: PackagePolicyInput = {
type: 'test-logs',
enabled: true,
@@ -112,12 +112,15 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
};
it('returns no inputs for package policy with no inputs', async () => {
- expect(await templatePackagePolicyToFullInputs([])).toEqual([]);
+ expect(await templatePackagePolicyToFullInputStreams([])).toEqual([]);
});
it('returns inputs even when inputs where disabled', async () => {
- expect(await templatePackagePolicyToFullInputs([{ ...mockInput, enabled: false }])).toEqual([
+ expect(
+ await templatePackagePolicyToFullInputStreams([{ ...mockInput, enabled: false }])
+ ).toEqual([
{
+ id: 'test-logs',
streams: [
{
data_stream: {
@@ -127,7 +130,6 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
id: 'test-logs-foo',
- type: 'test-logs',
},
{
data_stream: {
@@ -135,7 +137,6 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
type: 'logs',
},
id: 'test-logs-bar',
- type: 'test-logs',
},
],
},
@@ -143,20 +144,19 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
});
it('returns agent inputs with streams', async () => {
- expect(await templatePackagePolicyToFullInputs([mockInput])).toEqual([
+ expect(await templatePackagePolicyToFullInputStreams([mockInput])).toEqual([
{
+ id: 'test-logs',
streams: [
{
id: 'test-logs-foo',
data_stream: { dataset: 'foo', type: 'logs' },
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
- type: 'test-logs',
},
{
id: 'test-logs-bar',
data_stream: { dataset: 'bar', type: 'logs' },
- type: 'test-logs',
},
],
},
@@ -164,12 +164,12 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
});
it('returns unique agent inputs IDs, with policy template name if one exists for non-limited packages', async () => {
- expect(await templatePackagePolicyToFullInputs([mockInput])).toEqual([
+ expect(await templatePackagePolicyToFullInputStreams([mockInput])).toEqual([
{
+ id: 'test-logs',
streams: [
{
id: 'test-logs-foo',
- type: 'test-logs',
data_stream: { dataset: 'foo', type: 'logs' },
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
@@ -177,7 +177,6 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
{
id: 'test-logs-bar',
data_stream: { dataset: 'bar', type: 'logs' },
- type: 'test-logs',
},
],
},
@@ -185,8 +184,9 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
});
it('returns agent inputs without streams', async () => {
- expect(await templatePackagePolicyToFullInputs([mockInput2])).toEqual([
+ expect(await templatePackagePolicyToFullInputStreams([mockInput2])).toEqual([
{
+ id: 'test-metrics-some-template',
streams: [
{
data_stream: {
@@ -196,7 +196,6 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
id: 'test-metrics-foo',
- type: 'test-metrics',
},
],
},
@@ -205,7 +204,7 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
it('returns agent inputs without disabled streams', async () => {
expect(
- await templatePackagePolicyToFullInputs([
+ await templatePackagePolicyToFullInputStreams([
{
...mockInput,
streams: [{ ...mockInput.streams[0] }, { ...mockInput.streams[1], enabled: false }],
@@ -213,10 +212,10 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
])
).toEqual([
{
+ id: 'test-logs',
streams: [
{
id: 'test-logs-foo',
- type: 'test-logs',
data_stream: { dataset: 'foo', type: 'logs' },
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
@@ -227,7 +226,6 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
type: 'logs',
},
id: 'test-logs-bar',
- type: 'test-logs',
},
],
},
@@ -236,7 +234,7 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
it('returns agent inputs with deeply merged config values', async () => {
expect(
- await templatePackagePolicyToFullInputs([
+ await templatePackagePolicyToFullInputStreams([
{
...mockInput,
compiled_input: {
@@ -287,15 +285,15 @@ describe('Fleet - templatePackagePolicyToFullInputs', () => {
},
inputVar4: '',
},
+ id: 'test-logs',
streams: [
{
id: 'test-logs-foo',
data_stream: { dataset: 'foo', type: 'logs' },
fooKey: 'fooValue1',
fooKey2: ['fooValue2'],
- type: 'test-logs',
},
- { id: 'test-logs-bar', data_stream: { dataset: 'bar', type: 'logs' }, type: 'test-logs' },
+ { id: 'test-logs-bar', data_stream: { dataset: 'bar', type: 'logs' } },
],
},
]);
diff --git a/x-pack/test/fleet_api_integration/apis/epm/get_templates_inputs.ts b/x-pack/test/fleet_api_integration/apis/epm/get_templates_inputs.ts
index 1b7411c5a3169..08f0538f63644 100644
--- a/x-pack/test/fleet_api_integration/apis/epm/get_templates_inputs.ts
+++ b/x-pack/test/fleet_api_integration/apis/epm/get_templates_inputs.ts
@@ -51,110 +51,118 @@ export default function (providerContext: FtrProviderContext) {
await uninstallPackage(testPkgName, testPkgVersion);
});
const expectedYml = `inputs:
- - id: logfile-apache.access
- type: logfile
- data_stream:
- dataset: apache.access
- type: logs
- paths:
- - /var/log/apache2/access.log*
- - /var/log/apache2/other_vhosts_access.log*
- - /var/log/httpd/access_log*
- exclude_files:
- - .gz$
- processors:
- - add_fields:
- target: ''
- fields:
- ecs.version: 1.5.0
- - id: logfile-apache.error
- type: logfile
- data_stream:
- dataset: apache.error
- type: logs
- paths:
- - /var/log/apache2/error.log*
- - /var/log/httpd/error_log*
- exclude_files:
- - .gz$
- processors:
- - add_locale: null
- - add_fields:
- target: ''
- fields:
- ecs.version: 1.5.0
- - id: apache/metrics-apache.status
- type: apache/metrics
- data_stream:
- dataset: apache.status
- type: metrics
- metricsets:
- - status
- hosts:
- - 'http://127.0.0.1'
- period: 10s
- server_status_path: /server-status
+ - id: logfile-apache
+ streams:
+ - id: logfile-apache.access
+ data_stream:
+ dataset: apache.access
+ type: logs
+ paths:
+ - /var/log/apache2/access.log*
+ - /var/log/apache2/other_vhosts_access.log*
+ - /var/log/httpd/access_log*
+ exclude_files:
+ - .gz$
+ processors:
+ - add_fields:
+ target: ''
+ fields:
+ ecs.version: 1.5.0
+ - id: logfile-apache.error
+ data_stream:
+ dataset: apache.error
+ type: logs
+ paths:
+ - /var/log/apache2/error.log*
+ - /var/log/httpd/error_log*
+ exclude_files:
+ - .gz$
+ processors:
+ - add_locale: null
+ - add_fields:
+ target: ''
+ fields:
+ ecs.version: 1.5.0
+ - id: apache/metrics-apache
+ streams:
+ - id: apache/metrics-apache.status
+ data_stream:
+ dataset: apache.status
+ type: metrics
+ metricsets:
+ - status
+ hosts:
+ - 'http://127.0.0.1'
+ period: 10s
+ server_status_path: /server-status
`;
const expectedJson = [
{
- id: 'logfile-apache.access',
- type: 'logfile',
- data_stream: {
- type: 'logs',
- dataset: 'apache.access',
- },
- paths: [
- '/var/log/apache2/access.log*',
- '/var/log/apache2/other_vhosts_access.log*',
- '/var/log/httpd/access_log*',
- ],
- exclude_files: ['.gz$'],
- processors: [
+ id: 'logfile-apache',
+ streams: [
{
- add_fields: {
- target: '',
- fields: {
- 'ecs.version': '1.5.0',
+ id: 'logfile-apache.access',
+ data_stream: {
+ dataset: 'apache.access',
+ type: 'logs',
+ },
+ paths: [
+ '/var/log/apache2/access.log*',
+ '/var/log/apache2/other_vhosts_access.log*',
+ '/var/log/httpd/access_log*',
+ ],
+ exclude_files: ['.gz$'],
+ processors: [
+ {
+ add_fields: {
+ fields: {
+ 'ecs.version': '1.5.0',
+ },
+ target: '',
+ },
},
+ ],
+ },
+ {
+ id: 'logfile-apache.error',
+ data_stream: {
+ dataset: 'apache.error',
+ type: 'logs',
},
+ paths: ['/var/log/apache2/error.log*', '/var/log/httpd/error_log*'],
+ exclude_files: ['.gz$'],
+ processors: [
+ {
+ add_locale: null,
+ },
+ {
+ add_fields: {
+ fields: {
+ 'ecs.version': '1.5.0',
+ },
+ target: '',
+ },
+ },
+ ],
},
],
},
{
- id: 'logfile-apache.error',
- type: 'logfile',
- data_stream: {
- type: 'logs',
- dataset: 'apache.error',
- },
- paths: ['/var/log/apache2/error.log*', '/var/log/httpd/error_log*'],
- exclude_files: ['.gz$'],
- processors: [
+ id: 'apache/metrics-apache',
+ streams: [
{
- add_locale: null,
- },
- {
- add_fields: {
- target: '',
- fields: {
- 'ecs.version': '1.5.0',
- },
+ data_stream: {
+ dataset: 'apache.status',
+ type: 'metrics',
},
+ hosts: ['http://127.0.0.1'],
+ id: 'apache/metrics-apache.status',
+ metricsets: ['status'],
+ period: '10s',
+ server_status_path: '/server-status',
},
],
},
- {
- id: 'apache/metrics-apache.status',
- type: 'apache/metrics',
- data_stream: {
- type: 'metrics',
- dataset: 'apache.status',
- },
- metricsets: ['status'],
- hosts: ['http://127.0.0.1'],
- period: '10s',
- server_status_path: '/server-status',
- },
];
it('returns inputs template in json format', async function () {
@@ -162,7 +170,6 @@ export default function (providerContext: FtrProviderContext) {
.get(`/api/fleet/epm/templates/${testPkgName}/${testPkgVersion}/inputs?format=json`)
.expect(200);
const inputs = res.body.inputs;
-
expect(inputs).to.eql(expectedJson);
});
From c66c019f25ff242f7b390580a3d30af1ca423b14 Mon Sep 17 00:00:00 2001
From: Tiago Costa
Date: Mon, 22 Apr 2024 15:08:57 +0100
Subject: [PATCH 026/183] skip flaky suite (#181296)
---
.../tests/alerting/group4/alerts_as_data/install_resources.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/install_resources.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/install_resources.ts
index e80a8f94d93b6..e2746257931bc 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/install_resources.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/install_resources.ts
@@ -17,7 +17,8 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F
const legacyAlertMappings = mappingFromFieldMap(legacyAlertFieldMap, 'strict');
const ecsMappings = mappingFromFieldMap(ecsFieldMap, 'strict');
- describe('install alerts as data resources', () => {
+ // FLAKY: https://github.com/elastic/kibana/issues/181296
+ describe.skip('install alerts as data resources', () => {
it('should install common alerts as data resources on startup', async () => {
const ilmPolicyName = '.alerts-ilm-policy';
const frameworkComponentTemplateName = '.alerts-framework-mappings';
From 0170f5eba5e05d8bdd37dd02d080a4e088ffbbbc Mon Sep 17 00:00:00 2001
From: Katerina
Date: Mon, 22 Apr 2024 17:13:52 +0300
Subject: [PATCH 027/183] [Infra] Add alert links in hosts alert tab (#181039)
## Summary
close #180507
- Move the alert links to a shared folder
- Refactor `LinkToAlertsPage` to accept abstract `kuery`
- Display the `Create rule` and `Show all` links in the alert tab in the
hosts view page
## After
https://github.com/elastic/kibana/assets/3369346/2abb2327-a0d1-4ffa-804f-7ceee85ac42d
## Notes
Passing the kuery `kuery={`${ALERT_RULE_PRODUCER}:
${INFRA_ALERT_FEATURE_ID}`}` to the alertPage in order to show all
alerts produced by infrastructure. However, the total count may differ
from the Alert tab, as we only show alerts for visible hosts in the
table.
---
.../components/alerts_tooltip_content.tsx | 4 +-
.../asset_details/hooks/use_page_header.tsx | 7 +-
.../components/asset_details/links/index.ts | 1 -
.../tabs/overview/alerts/alerts.tsx | 15 +++-
.../link_to_alerts_page.test.tsx.snap | 55 +++++++++++++
.../links/create_alert_rule_button.tsx} | 10 ++-
.../alerts/links/link_to_alerts_page.test.tsx | 78 +++++++++++++++++++
.../alerts}/links/link_to_alerts_page.tsx | 28 +++----
.../tabs/alerts/alerts_tab_content.tsx | 34 +++++++-
.../translations/translations/fr-FR.json | 2 -
.../translations/translations/ja-JP.json | 2 -
.../translations/translations/zh-CN.json | 2 -
12 files changed, 205 insertions(+), 33 deletions(-)
create mode 100644 x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/__snapshots__/link_to_alerts_page.test.tsx.snap
rename x-pack/plugins/observability_solution/infra/public/components/{asset_details/links/link_to_alerts.tsx => shared/alerts/links/create_alert_rule_button.tsx} (74%)
create mode 100644 x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.test.tsx
rename x-pack/plugins/observability_solution/infra/public/components/{asset_details => shared/alerts}/links/link_to_alerts_page.tsx (69%)
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/alerts_tooltip_content.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/alerts_tooltip_content.tsx
index abc9ae31e8f35..3d4fbdc2a7994 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/alerts_tooltip_content.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/alerts_tooltip_content.tsx
@@ -8,8 +8,8 @@
import React from 'react';
import { EuiText, EuiLink } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
-import { LinkToAlertsHomePage } from '../links/link_to_alerts_page';
import { ALERTS_DOC_HREF } from '../../shared/alerts/constants';
+import { LinkToAlertsHomePage } from '../../shared/alerts/links/link_to_alerts_page';
export const AlertsTooltipContent = React.memo(() => {
const onClick = (e: React.MouseEvent) => {
@@ -23,7 +23,7 @@ export const AlertsTooltipContent = React.memo(() => {
id="xpack.infra.assetDetails.alerts.tooltip.alertsLabel"
defaultMessage="Showing alerts for this host. You can create and manage alerts in {alerts}"
values={{
- alerts: ,
+ alerts: ,
}}
/>
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_page_header.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_page_header.tsx
index c13bffae7ac9f..29c048c540a04 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_page_header.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_page_header.tsx
@@ -21,8 +21,9 @@ import { useHistory, useLocation } from 'react-router-dom';
import { usePluginConfig } from '../../../containers/plugin_config_context';
import { useKibanaContextForPlugin } from '../../../hooks/use_kibana';
import { useProfilingIntegrationSetting } from '../../../hooks/use_profiling_integration_setting';
+import { CreateAlertRuleButton } from '../../shared/alerts/links/create_alert_rule_button';
import { APM_HOST_FILTER_FIELD } from '../constants';
-import { LinkToAlertsRule, LinkToNodeDetails } from '../links';
+import { LinkToNodeDetails } from '../links';
import { ContentTabIds, type LinkOptions, type RouteState, type Tab, type TabIds } from '../types';
import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props';
import { useTabSwitcherContext } from './use_tab_switcher';
@@ -97,7 +98,9 @@ const useRightSideItems = (links?: LinkOptions[]) => {
nodeDetails: (
),
- alertRule: ,
+ alertRule: (
+
+ ),
}),
[asset.id, asset.name, asset.type]
);
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/index.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/index.ts
index 6dd74f7b5178a..f362132a10043 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/index.ts
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/index.ts
@@ -6,5 +6,4 @@
*/
export { LinkToApmServices } from './link_to_apm_services';
-export { LinkToAlertsRule } from './link_to_alerts';
export { LinkToNodeDetails } from './link_to_node_details';
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/alerts/alerts.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/alerts/alerts.tsx
index 60f09b1d73b91..ca6155039da31 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/alerts/alerts.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/alerts/alerts.tsx
@@ -11,8 +11,6 @@ import type { TimeRange } from '@kbn/es-query';
import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common';
import { findInventoryFields } from '@kbn/metrics-data-access-plugin/common';
import { usePluginConfig } from '../../../../../containers/plugin_config_context';
-import { LinkToAlertsRule } from '../../../links/link_to_alerts';
-import { LinkToAlertsPage } from '../../../links/link_to_alerts_page';
import { AlertFlyout } from '../../../../../alerting/inventory/components/alert_flyout';
import { useBoolean } from '../../../../../hooks/use_boolean';
import { AlertsSectionTitle } from '../section_titles';
@@ -21,6 +19,8 @@ import { Section } from '../../../components/section';
import { AlertsClosedContent } from './alerts_closed_content';
import { type AlertsCount } from '../../../../../hooks/use_alerts_count';
import { AlertsOverview } from '../../../../shared/alerts/alerts_overview';
+import { CreateAlertRuleButton } from '../../../../shared/alerts/links/create_alert_rule_button';
+import { LinkToAlertsPage } from '../../../../shared/alerts/links/link_to_alerts_page';
export const AlertsSummaryContent = ({
assetId,
@@ -61,11 +61,18 @@ export const AlertsSummaryContent = ({
{featureFlags.inventoryThresholdAlertRuleEnabled && (
-
+
)}
-
+
}
diff --git a/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/__snapshots__/link_to_alerts_page.test.tsx.snap b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/__snapshots__/link_to_alerts_page.test.tsx.snap
new file mode 100644
index 0000000000000..8a2d3f54cb773
--- /dev/null
+++ b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/__snapshots__/link_to_alerts_page.test.tsx.snap
@@ -0,0 +1,55 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`LinkToAlertsPage component renders correctly with default props 1`] = `
+
+`;
+
+exports[`LinkToAlertsPage component renders correctly with optional props 1`] = `
+
+`;
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts.tsx b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/create_alert_rule_button.tsx
similarity index 74%
rename from x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts.tsx
rename to x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/create_alert_rule_button.tsx
index e5a5cc6340abe..7873694dce95a 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/create_alert_rule_button.tsx
@@ -10,12 +10,16 @@ import { EuiButtonEmpty } from '@elastic/eui';
export interface LinkToAlertsRuleProps {
onClick?: () => void;
+ ['data-test-subj']: string;
}
-export const LinkToAlertsRule = ({ onClick }: LinkToAlertsRuleProps) => {
+export const CreateAlertRuleButton = ({
+ onClick,
+ ['data-test-subj']: dataTestSubj,
+}: LinkToAlertsRuleProps) => {
return (
{
iconType="bell"
>
diff --git a/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.test.tsx b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.test.tsx
new file mode 100644
index 0000000000000..c2fed1888c6d2
--- /dev/null
+++ b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.test.tsx
@@ -0,0 +1,78 @@
+/*
+ * 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 React from 'react';
+import { render, screen } from '@testing-library/react';
+import { LinkToAlertsPage, LinkToAlertsPageProps } from './link_to_alerts_page';
+import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana';
+import { coreMock } from '@kbn/core/public/mocks';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
+
+const useKibanaContextForPluginMock = useKibanaContextForPlugin as jest.MockedFunction<
+ typeof useKibanaContextForPlugin
+>;
+jest.mock('../../../../hooks/use_kibana');
+
+describe('LinkToAlertsPage component', () => {
+ const mockUseKibana = () => {
+ useKibanaContextForPluginMock.mockReturnValue({
+ services: {
+ ...coreMock.createStart(),
+ },
+ } as unknown as ReturnType);
+ };
+
+ beforeEach(() => {
+ mockUseKibana();
+ });
+
+ it('renders correctly with default props', () => {
+ const props: LinkToAlertsPageProps = {
+ dateRange: { from: '2024-04-01', to: '2024-04-15' },
+ ['data-test-subj']: 'test-link',
+ };
+ const { container } = render(
+
+
+
+ );
+ expect(container).toMatchSnapshot();
+ });
+
+ it('renders correctly with optional props', () => {
+ const props: LinkToAlertsPageProps = {
+ dateRange: { from: '2024-04-01', to: '2024-04-15' },
+ kuery: 'foo:bar',
+ ['data-test-subj']: 'test-link',
+ };
+ const { container } = render(
+
+
+
+ );
+ const link = screen.getByTestId('test-link');
+ expect(link).toBeInTheDocument();
+ expect(container).toMatchSnapshot();
+ });
+
+ it('generates correct link', () => {
+ const props: LinkToAlertsPageProps = {
+ dateRange: { from: '2024-04-01', to: '2024-04-15' },
+ kuery: 'foo:bar',
+ ['data-test-subj']: 'test-link',
+ };
+ render(
+
+
+
+ );
+ const href = screen.getByRole('link', { name: 'Show all' }).getAttribute('href');
+ expect(href).toContain(
+ "/app/observability/alerts?_a=(kuery:'foo:bar',rangeFrom:'2024-04-01',rangeTo:'2024-04-15',status:all)"
+ );
+ });
+});
diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts_page.tsx b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.tsx
similarity index 69%
rename from x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts_page.tsx
rename to x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.tsx
index 2b5f80043590e..04e39ec1261bc 100644
--- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/links/link_to_alerts_page.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/components/shared/alerts/links/link_to_alerts_page.tsx
@@ -9,46 +9,46 @@ import { encode } from '@kbn/rison';
import { FormattedMessage } from '@kbn/i18n-react';
import { EuiButtonEmpty, EuiLink } from '@elastic/eui';
import type { TimeRange } from '@kbn/es-query';
-import { useKibanaContextForPlugin } from '../../../hooks/use_kibana';
-import { ALERTS_PATH } from '../../shared/alerts/constants';
+import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana';
+import { ALERTS_PATH } from '../constants';
export interface LinkToAlertsPageProps {
- assetId: string;
dateRange: TimeRange;
- queryField: string;
+ kuery?: string;
+ ['data-test-subj']: string;
}
-export const LinkToAlertsPage = ({ assetId, queryField, dateRange }: LinkToAlertsPageProps) => {
+export const LinkToAlertsPage = ({
+ kuery,
+ dateRange,
+ ['data-test-subj']: dataTestSubj,
+}: LinkToAlertsPageProps) => {
const { services } = useKibanaContextForPlugin();
const { http } = services;
const linkToAlertsPage = http.basePath.prepend(
`${ALERTS_PATH}?_a=${encode({
- kuery: `${queryField}:"${assetId}"`,
+ kuery,
rangeFrom: dateRange.from,
rangeTo: dateRange.to,
status: 'all',
})}`
);
-
return (
-
+
);
};
-export const LinkToAlertsHomePage = () => {
+export const LinkToAlertsHomePage = ({ dataTestSubj }: { dataTestSubj?: string }) => {
const { services } = useKibanaContextForPlugin();
const { http } = services;
@@ -57,7 +57,7 @@ export const LinkToAlertsHomePage = () => {
return (
{
const { services } = useKibanaContextForPlugin();
+ const { featureFlags } = usePluginConfig();
const { alertStatus, setAlertStatus, alertsEsQueryByStatus } = useAlertsQuery();
+ const [isAlertFlyoutVisible, { toggle: toggleAlertFlyout }] = useBoolean(false);
const { onSubmit, searchCriteria } = useUnifiedSearchContext();
@@ -41,6 +49,23 @@ export const AlertsTabContent = () => {
+
+ {featureFlags.inventoryThresholdAlertRuleEnabled && (
+
+
+
+ )}
+
+
+
+
{
)}
+ {featureFlags.inventoryThresholdAlertRuleEnabled && (
+
+ )}
);
};
diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json
index a1de4943f1374..d466b6de05150 100644
--- a/x-pack/plugins/translations/translations/fr-FR.json
+++ b/x-pack/plugins/translations/translations/fr-FR.json
@@ -21271,7 +21271,6 @@
"xpack.infra.assetDetails.datePicker.commonlyUsedRanges.last7Days": "7 derniers jours",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh": "Les données chargent continuellement ?",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh.troubleshoot": "Essayez d'augmenter l'intervalle d'actualisation, de raccourcir la plage de dates ou de désactiver l'actualisation automatique.",
- "xpack.infra.assetDetails.flyout.AlertsPageLinkLabel": "Afficher tout",
"xpack.infra.assetDetails.header.return": "Renvoyer",
"xpack.infra.assetDetails.metadata.tooltip.documentationLink": "host.name",
"xpack.infra.assetDetails.metadata.tooltip.metadata": "Métadonnées",
@@ -21412,7 +21411,6 @@
"xpack.infra.hostsViewPage.tabs.metricsCharts.title": "Indicateurs",
"xpack.infra.hostsViewPage.tooltip.whatAreTheseMetricsLink": "Que sont ces indicateurs ?",
"xpack.infra.hostsViewPage.tooltip.whyAmISeeingDottedLines": "Pourquoi des lignes pointillées apparaissent-elles ?",
- "xpack.infra.infra.assetDetails.alerts.createAlertLink": "Créer une règle",
"xpack.infra.infra.nodeDetails.openAsPage": "Ouvrir en tant que page",
"xpack.infra.inventory.alerting.groupActionVariableDescription": "Nom des données de reporting du groupe",
"xpack.infra.inventoryId.host.ipCodeLabel": "host.ip",
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index a24031e182be0..a2b7a4293ffc7 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -21234,7 +21234,6 @@
"xpack.infra.assetDetails.datePicker.commonlyUsedRanges.last7Days": "過去 7 日間",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh": "データの読み込みが継続的に行われていますか?",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh.troubleshoot": "更新間隔を長くするか、日付範囲を短くするか、自動更新をオフにしてみてください。",
- "xpack.infra.assetDetails.flyout.AlertsPageLinkLabel": "すべて表示",
"xpack.infra.assetDetails.header.return": "戻る",
"xpack.infra.assetDetails.metadata.tooltip.documentationLink": "host.name",
"xpack.infra.assetDetails.metadata.tooltip.metadata": "メタデータ",
@@ -21386,7 +21385,6 @@
"xpack.infra.hostsViewPage.tabs.metricsCharts.title": "メトリック",
"xpack.infra.hostsViewPage.tooltip.whatAreTheseMetricsLink": "これらのメトリックは何か。",
"xpack.infra.hostsViewPage.tooltip.whyAmISeeingDottedLines": "点線が表示されている理由",
- "xpack.infra.infra.assetDetails.alerts.createAlertLink": "ルールを作成",
"xpack.infra.infra.nodeDetails.openAsPage": "ページとして開く",
"xpack.infra.inventory.alerting.groupActionVariableDescription": "データを報告するグループの名前",
"xpack.infra.inventoryId.host.ipCodeLabel": "host.ip",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index 33a8d29847d58..80c2ea8e3fe6c 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -21277,7 +21277,6 @@
"xpack.infra.assetDetails.datePicker.commonlyUsedRanges.last7Days": "过去 7 天",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh": "持续出现加载数据问题?",
"xpack.infra.assetDetails.datePicker.tooltip.autoRefresh.troubleshoot": "请尝试增加刷新时间间隔,缩短日期范围或关闭自动刷新。",
- "xpack.infra.assetDetails.flyout.AlertsPageLinkLabel": "全部显示",
"xpack.infra.assetDetails.header.return": "返回",
"xpack.infra.assetDetails.metadata.tooltip.documentationLink": "host.name",
"xpack.infra.assetDetails.metadata.tooltip.metadata": "元数据",
@@ -21418,7 +21417,6 @@
"xpack.infra.hostsViewPage.tabs.metricsCharts.title": "指标",
"xpack.infra.hostsViewPage.tooltip.whatAreTheseMetricsLink": "这些指标是什么?",
"xpack.infra.hostsViewPage.tooltip.whyAmISeeingDottedLines": "为什么我看到的是虚线?",
- "xpack.infra.infra.assetDetails.alerts.createAlertLink": "创建规则",
"xpack.infra.infra.nodeDetails.openAsPage": "以页面形式打开",
"xpack.infra.inventory.alerting.groupActionVariableDescription": "报告数据的组名称",
"xpack.infra.inventoryId.host.ipCodeLabel": "host.ip",
From fa936db23be141a2c69952dfe4e6b201d4a4a980 Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Mon, 22 Apr 2024 10:14:37 -0400
Subject: [PATCH 028/183] [Observability Onboarding] Scroll to Package List on
collection click (#180961)
## Summary
Resolves #180814.
When the user clicks a collection, we are presently focusing the search
bar and scrolling to it.
This patch will change the behavior to _not_ change the focus
programmatically, and smooth scroll the package list into view.
### Note
I am open to suggestions on how to make
[this](https://github.com/elastic/kibana/pull/180961/files#diff-23a1716beb9bc5c1c0ef8b6f30f0f805fb7f148770f3dc82a035fcd4bbdb1658R94)
less of a hack, but it make the experience better because we give the
component time to render before doing the scroll. Here's a before/after:
#### Before
On initial click of the Azure collection, we only see two rows from the
scroll.
![20240416120336](https://github.com/elastic/kibana/assets/18429259/665e99ed-861d-4ba1-acc4-8cf5422973e9)
#### After
With the delay, we see the full row.
![20240416122920](https://github.com/elastic/kibana/assets/18429259/2fd9f7c4-c81a-45a8-876f-eb2b1d94db73)
---------
Co-authored-by: Joe Reuter
---
.../onboarding_flow_form.tsx | 18 ++++++++++--------
.../public/application/packages_list/index.tsx | 13 +++++--------
2 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
index 5a10e507a6851..6a1a062e5a7e1 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
@@ -81,18 +81,20 @@ export const OnboardingFlowForm: FunctionComponent = () => {
const radioGroupId = useGeneratedHtmlId({ prefix: 'onboardingCategory' });
const [searchParams, setSearchParams] = useSearchParams();
- const packageListSearchBarRef = React.useRef(null);
+ const packageListRef = React.useRef(null);
const [integrationSearch, setIntegrationSearch] = useState('');
const createCollectionCardHandler = useCallback(
(query: string) => () => {
setIntegrationSearch(query);
- if (packageListSearchBarRef.current) {
- packageListSearchBarRef.current.focus();
- packageListSearchBarRef.current.scrollIntoView({
- behavior: 'auto',
- block: 'center',
- });
+ if (packageListRef.current) {
+ // adding a slight delay causes the search bar to be rendered
+ new Promise((r) => setTimeout(r, 10)).then(() =>
+ packageListRef.current?.scrollIntoView({
+ behavior: 'smooth',
+ block: 'center',
+ })
+ );
}
},
[setIntegrationSearch]
@@ -163,7 +165,7 @@ export const OnboardingFlowForm: FunctionComponent = () => {
showSearchBar={true}
searchQuery={integrationSearch}
setSearchQuery={setIntegrationSearch}
- ref={packageListSearchBarRef}
+ ref={packageListRef}
customCards={customCards?.filter(({ name, type }) => type === 'generated')}
joinCardLists
/>
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index 7930d4e6a699c..77d38e1159608 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -29,7 +29,7 @@ interface Props {
*/
selectedCategory?: string;
showSearchBar?: boolean;
- searchBarRef?: React.Ref;
+ packageListRef?: React.Ref;
searchQuery?: string;
setSearchQuery?: React.Dispatch>;
/**
@@ -48,7 +48,7 @@ const PackageListGridWrapper = ({
selectedCategory = 'observability',
useAvailablePackages,
showSearchBar = false,
- searchBarRef,
+ packageListRef,
searchQuery,
setSearchQuery,
customCards,
@@ -79,7 +79,7 @@ const PackageListGridWrapper = ({
return (
}>
-
+
{showSearchBar && (
{
- (searchBarRef as React.MutableRefObject
).current = ref;
- },
}}
onChange={(arg) => {
if (setSearchQuery) {
@@ -125,7 +122,7 @@ const PackageListGridWrapper = ({
};
const WithAvailablePackages = React.forwardRef(
- (props: Props, searchBarRef?: React.Ref) => {
+ (props: Props, packageListRef?: React.Ref) => {
const ref = useRef(null);
const {
@@ -173,7 +170,7 @@ const WithAvailablePackages = React.forwardRef(
);
}
From a41177f32cc1d02a425f70979694d8c160195649 Mon Sep 17 00:00:00 2001
From: Hannah Mudge
Date: Mon, 22 Apr 2024 08:52:46 -0600
Subject: [PATCH 029/183] [Dashboard] Default to saved object description when
panel description is not provided (#181177)
Closes https://github.com/elastic/kibana/issues/181172
## Summary
This PR fixes a bug where panels were not showing descriptions from
library items - this is because (1) we weren't providing the
`defaultPanelDescription` as part of the default embeddable API and (2)
the panel header was not defaulting to the `defaultPanelDescription`
when a panel description was not provided.
Because of (1), the panel settings flyout showed a blank description
**despite** having the correct logic for defaulting to the default panel
description - that is why the tests in `customize_panel_editor.test.tsx`
passed but it didn't work in production.
### Checklist
- [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
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---
.../compatibility/legacy_embeddable_to_api.ts | 2 +
.../public/lib/embeddables/embeddable.tsx | 2 +
.../presentation_panel_internal.test.tsx | 37 ++++++++++++++++++-
.../presentation_panel_internal.tsx | 4 +-
.../functional/page_objects/dashboard_page.ts | 4 +-
5 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts
index 957cee6353d0e..8253fabe9a8f3 100644
--- a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts
+++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts
@@ -153,6 +153,7 @@ export const legacyEmbeddableToApi = (
const panelDescription = inputKeyToSubject('description');
const defaultPanelTitle = outputKeyToSubject('defaultTitle');
+ const defaultPanelDescription = outputKeyToSubject('defaultDescription');
const disabledActionIds = inputKeyToSubject('disabledActions');
function getSavedObjectId(input: { savedObjectId?: string }, output: { savedObjectId?: string }) {
@@ -275,6 +276,7 @@ export const legacyEmbeddableToApi = (
setPanelDescription,
panelDescription,
+ defaultPanelDescription,
canLinkToLibrary: () => canLinkLegacyEmbeddable(embeddable),
linkToLibrary: () => linkLegacyEmbeddable(embeddable),
diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx
index 2dfa06d8db9d2..07c52f6cbeed1 100644
--- a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx
+++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx
@@ -134,6 +134,7 @@ export abstract class Embeddable<
timeRange$: this.timeRange$,
isEditingEnabled: this.isEditingEnabled,
panelDescription: this.panelDescription,
+ defaultPanelDescription: this.defaultPanelDescription,
canLinkToLibrary: this.canLinkToLibrary,
disabledActionIds: this.disabledActionIds,
unlinkFromLibrary: this.unlinkFromLibrary,
@@ -176,6 +177,7 @@ export abstract class Embeddable<
public isEditingEnabled: LegacyEmbeddableAPI['isEditingEnabled'];
public canLinkToLibrary: LegacyEmbeddableAPI['canLinkToLibrary'];
public panelDescription: LegacyEmbeddableAPI['panelDescription'];
+ public defaultPanelDescription: LegacyEmbeddableAPI['defaultPanelDescription'];
public disabledActionIds: LegacyEmbeddableAPI['disabledActionIds'];
public unlinkFromLibrary: LegacyEmbeddableAPI['unlinkFromLibrary'];
public setTimeRange: LegacyEmbeddableAPI['setTimeRange'];
diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.test.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.test.tsx
index 8386535a7ebeb..a671212e94ed2 100644
--- a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.test.tsx
+++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.test.tsx
@@ -157,10 +157,11 @@ describe('Presentation panel', () => {
});
describe('titles', () => {
- it('renders the panel title from the api', async () => {
+ it('renders the panel title from the api and not the default title', async () => {
const api: DefaultPresentationPanelApi = {
uuid: 'test',
panelTitle: new BehaviorSubject('SUPER TITLE'),
+ defaultPanelTitle: new BehaviorSubject('SO Title'),
};
await renderPresentationPanel({ api });
await waitFor(() => {
@@ -168,6 +169,28 @@ describe('Presentation panel', () => {
});
});
+ it('renders the default title from the api when a panel title is not provided', async () => {
+ const api: DefaultPresentationPanelApi = {
+ uuid: 'test',
+ defaultPanelTitle: new BehaviorSubject('SO Title'),
+ };
+ await renderPresentationPanel({ api });
+ await waitFor(() => {
+ expect(screen.getByTestId('embeddablePanelTitleInner')).toHaveTextContent('SO Title');
+ });
+ });
+
+ it("does not render an info icon when the api doesn't provide a panel description or default description", async () => {
+ const api: DefaultPresentationPanelApi = {
+ uuid: 'test',
+ panelTitle: new BehaviorSubject('SUPER TITLE'),
+ };
+ await renderPresentationPanel({ api });
+ await waitFor(() => {
+ expect(screen.queryByTestId('embeddablePanelTitleDescriptionIcon')).toBe(null);
+ });
+ });
+
it('renders an info icon when the api provides a panel description', async () => {
const api: DefaultPresentationPanelApi = {
uuid: 'test',
@@ -180,6 +203,18 @@ describe('Presentation panel', () => {
});
});
+ it('renders an info icon when the api provides a default description', async () => {
+ const api: DefaultPresentationPanelApi = {
+ uuid: 'test',
+ panelTitle: new BehaviorSubject('SUPER TITLE'),
+ defaultPanelDescription: new BehaviorSubject('SO Description'),
+ };
+ await renderPresentationPanel({ api });
+ await waitFor(() => {
+ expect(screen.getByTestId('embeddablePanelTitleDescriptionIcon')).toBeInTheDocument();
+ });
+ });
+
it('does not render a title when in view mode when the provided title is blank', async () => {
const api: DefaultPresentationPanelApi & PublishesViewMode = {
uuid: 'test',
diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx
index da74df952b7e7..2d46bca73d3b8 100644
--- a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx
+++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx
@@ -55,6 +55,7 @@ export const PresentationPanelInternal = <
hidePanelTitle,
panelDescription,
defaultPanelTitle,
+ defaultPanelDescription,
rawViewMode,
parentHidePanelTitle,
] = useBatchedOptionalPublishingSubjects(
@@ -64,6 +65,7 @@ export const PresentationPanelInternal = <
api?.hidePanelTitle,
api?.panelDescription,
api?.defaultPanelTitle,
+ api?.defaultPanelDescription,
viewModeSubject,
api?.parentApi?.hidePanelTitle
);
@@ -124,9 +126,9 @@ export const PresentationPanelInternal = <
showBadges={showBadges}
getActions={getActions}
actionPredicate={actionPredicate}
- panelDescription={panelDescription}
showNotifications={showNotifications}
panelTitle={panelTitle ?? defaultPanelTitle}
+ panelDescription={panelDescription ?? defaultPanelDescription}
/>
)}
{blockingError && api && (
diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts
index 2b98eedbb62f1..665c5f824390c 100644
--- a/test/functional/page_objects/dashboard_page.ts
+++ b/test/functional/page_objects/dashboard_page.ts
@@ -588,7 +588,9 @@ export class DashboardPageObject extends FtrService {
public async getPanelTitles() {
this.log.debug('in getPanelTitles');
- const titleObjects = await this.find.allByCssSelector('span.embPanel__titleInner');
+ const titleObjects = await this.find.allByCssSelector(
+ '[data-test-subj=embeddablePanelTitleInner] .embPanel__titleText'
+ );
return await Promise.all(titleObjects.map(async (title) => await title.getVisibleText()));
}
From 019dd790965ac86a3bb3f49619e41430aaa89b4e Mon Sep 17 00:00:00 2001
From: Joe McElroy
Date: Mon, 22 Apr 2024 16:07:35 +0100
Subject: [PATCH 030/183] [Search] [Playground] SideNav: move playground to
build (#181087)
Update Search nav to build and move playground from content to build
![image](https://github.com/elastic/kibana/assets/49480/8393a3e1-0d42-48c7-aa41-a9cc17ef48fa)
update the kibana side nav to feature Playground. This routes from
application to playground.
![image](https://github.com/elastic/kibana/assets/49480/22fe95df-e277-4c0b-8e65-edba8ba940cf)
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
packages/deeplinks/search/deep_links.ts | 4 +--
packages/kbn-doc-links/src/get_doc_links.ts | 1 +
packages/kbn-doc-links/src/types.ts | 1 +
packages/solution-nav/es/definition.ts | 2 +-
.../enterprise_search/common/constants.ts | 2 +-
.../components/layout/page_template.tsx | 13 ++++++--
.../playground/header_docs_action.tsx | 31 +++++++++++++++++++
.../components/playground/playground.tsx | 7 +++--
.../components/playground/types.ts | 0
.../applications/applications/index.tsx | 8 +++--
.../applications/applications/routes.ts | 2 ++
.../components/layout/page_template.tsx | 2 --
.../search_playground_popover.tsx | 3 +-
.../enterprise_search_content/index.tsx | 5 ---
.../enterprise_search_content/routes.ts | 1 -
.../shared/doc_links/doc_links.ts | 3 ++
.../applications/shared/layout/nav.test.tsx | 30 +++++++++---------
.../public/applications/shared/layout/nav.tsx | 31 ++++++++++---------
.../enterprise_search/public/plugin.ts | 12 ++++---
.../apps/group3/enterprise_search.ts | 16 +++++++++-
20 files changed, 118 insertions(+), 56 deletions(-)
create mode 100644 x-pack/plugins/enterprise_search/public/applications/applications/components/playground/header_docs_action.tsx
rename x-pack/plugins/enterprise_search/public/applications/{enterprise_search_content => applications}/components/playground/playground.tsx (88%)
rename x-pack/plugins/enterprise_search/public/applications/{enterprise_search_content => applications}/components/playground/types.ts (100%)
diff --git a/packages/deeplinks/search/deep_links.ts b/packages/deeplinks/search/deep_links.ts
index 39e0604d53170..fbd8e363948cd 100644
--- a/packages/deeplinks/search/deep_links.ts
+++ b/packages/deeplinks/search/deep_links.ts
@@ -26,9 +26,9 @@ export type EnterpriseSearchWorkplaceSearchApp = typeof ENTERPRISE_SEARCH_WORKPL
export type ServerlessSearchApp = typeof SERVERLESS_ES_APP_ID;
export type ConnectorsId = typeof SERVERLESS_ES_CONNECTORS_ID;
-export type ContentLinkId = 'searchIndices' | 'connectors' | 'webCrawlers' | 'playground';
+export type ContentLinkId = 'searchIndices' | 'connectors' | 'webCrawlers';
-export type ApplicationsLinkId = 'searchApplications';
+export type ApplicationsLinkId = 'searchApplications' | 'playground';
export type AppsearchLinkId = 'engines';
diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts
index 502343ee0a51b..a4c2fd500539f 100644
--- a/packages/kbn-doc-links/src/get_doc_links.ts
+++ b/packages/kbn-doc-links/src/get_doc_links.ts
@@ -206,6 +206,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D
licenseManagement: `${ENTERPRISE_SEARCH_DOCS}license-management.html`,
machineLearningStart: `${ELASTICSEARCH_DOCS}nlp-example.html`,
mailService: `${ENTERPRISE_SEARCH_DOCS}mailer-configuration.html`,
+ playground: `${KIBANA_DOCS}playground.html`,
mlDocumentEnrichment: `${ELASTICSEARCH_DOCS}ingest-pipeline-search-inference.html`,
searchApplicationsTemplates: `${ELASTICSEARCH_DOCS}search-application-api.html`,
searchApplicationsSearchApi: `${ELASTICSEARCH_DOCS}search-application-security.html`,
diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts
index 30f063b195d7a..ed6b805d5fcb2 100644
--- a/packages/kbn-doc-links/src/types.ts
+++ b/packages/kbn-doc-links/src/types.ts
@@ -170,6 +170,7 @@ export interface DocLinks {
readonly languageClients: string;
readonly licenseManagement: string;
readonly machineLearningStart: string;
+ readonly playground: string;
readonly mailService: string;
readonly mlDocumentEnrichment: string;
readonly searchApplicationsTemplates: string;
diff --git a/packages/solution-nav/es/definition.ts b/packages/solution-nav/es/definition.ts
index f141a4995bcb1..aea5a0e214e97 100644
--- a/packages/solution-nav/es/definition.ts
+++ b/packages/solution-nav/es/definition.ts
@@ -123,7 +123,7 @@ const navTree: NavigationTreeDefinition = {
}),
children: [
{
- link: 'enterpriseSearchContent:playground',
+ link: 'enterpriseSearchApplications:playground',
},
{
title: i18n.translate('navigation.searchNav.build.searchApplications', {
diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts
index c50c66db48f3c..b0b2b83326f2f 100644
--- a/x-pack/plugins/enterprise_search/common/constants.ts
+++ b/x-pack/plugins/enterprise_search/common/constants.ts
@@ -153,7 +153,7 @@ export const APPLICATIONS_PLUGIN = {
defaultMessage: 'Applications',
}),
NAV_TITLE: i18n.translate('xpack.enterpriseSearch.applications.navTitle', {
- defaultMessage: 'Search Applications',
+ defaultMessage: 'Build',
}),
SUPPORT_URL: 'https://discuss.elastic.co/c/enterprise-search/',
URL: '/app/enterprise_search/applications',
diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx
index 550acf7fa9359..5a36b58733e3c 100644
--- a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx
@@ -15,13 +15,16 @@ import { SetEnterpriseSearchApplicationsChrome } from '../../../shared/kibana_ch
import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout';
import { useEnterpriseSearchApplicationNav } from '../../../shared/layout';
import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry';
+import { PlaygroundHeaderDocsAction } from '../playground/header_docs_action';
import { SearchApplicationHeaderDocsAction } from '../search_application/header_docs_action';
export type EnterpriseSearchApplicationsPageTemplateProps = Omit<
PageTemplateProps,
'useEndpointHeaderActions'
> & {
+ docLink?: 'search_application' | 'playground';
hasSchemaConflicts?: boolean;
+ restrictWidth?: boolean;
searchApplicationName?: string;
};
@@ -33,6 +36,8 @@ export const EnterpriseSearchApplicationsPageTemplate: React.FC<
pageViewTelemetry,
searchApplicationName,
hasSchemaConflicts,
+ restrictWidth = true,
+ docLink = 'search_application',
...pageTemplateProps
}) => {
const navItems = useEnterpriseSearchApplicationNav(
@@ -42,7 +47,11 @@ export const EnterpriseSearchApplicationsPageTemplate: React.FC<
);
const { renderHeaderActions } = useValues(KibanaLogic);
useLayoutEffect(() => {
- renderHeaderActions(SearchApplicationHeaderDocsAction);
+ const docAction = {
+ playground: PlaygroundHeaderDocsAction,
+ search_application: SearchApplicationHeaderDocsAction,
+ }[docLink];
+ renderHeaderActions(docAction);
return () => {
renderHeaderActions();
@@ -55,7 +64,7 @@ export const EnterpriseSearchApplicationsPageTemplate: React.FC<
items: navItems,
name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME,
}}
- restrictWidth
+ restrictWidth={restrictWidth}
setPageChrome={pageChrome && }
useEndpointHeaderActions={false}
>
diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/header_docs_action.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/header_docs_action.tsx
new file mode 100644
index 0000000000000..8fc53b3abcc57
--- /dev/null
+++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/header_docs_action.tsx
@@ -0,0 +1,31 @@
+/*
+ * 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 React from 'react';
+
+import { EuiButtonEmpty } from '@elastic/eui';
+
+import { i18n } from '@kbn/i18n';
+
+import { docLinks } from '../../../shared/doc_links';
+import { EndpointsHeaderAction } from '../../../shared/layout/endpoints_header_action';
+
+export const PlaygroundHeaderDocsAction: React.FC = () => (
+
+
+ {i18n.translate('xpack.enterpriseSearch.content.playground.header.docLink', {
+ defaultMessage: 'Playground Docs',
+ })}
+
+
+);
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/playground/playground.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx
similarity index 88%
rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/playground/playground.tsx
rename to x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx
index ac2626d556229..a286f865c6a1c 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/playground/playground.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx
@@ -14,7 +14,7 @@ import { useValues } from 'kea';
import { i18n } from '@kbn/i18n';
import { KibanaLogic } from '../../../shared/kibana';
-import { EnterpriseSearchContentPageTemplate } from '../layout/page_template';
+import { EnterpriseSearchApplicationsPageTemplate } from '../layout/page_template';
export const Playground: React.FC = () => {
const [searchParams] = useSearchParams();
@@ -32,7 +32,7 @@ export const Playground: React.FC = () => {
indices: index ? [index] : [],
}}
>
- {
restrictWidth={false}
customPageSections
bottomBorder="extended"
+ docLink="playground"
>
-
+
);
};
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/playground/types.ts b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/types.ts
similarity index 100%
rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/playground/types.ts
rename to x-pack/plugins/enterprise_search/public/applications/applications/components/playground/types.ts
diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/index.tsx
index a09a4c98765ac..c9676137e70f2 100644
--- a/x-pack/plugins/enterprise_search/public/applications/applications/index.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/applications/index.tsx
@@ -11,16 +11,20 @@ import { Redirect } from 'react-router-dom';
import { Routes, Route } from '@kbn/shared-ux-router';
import { NotFound } from './components/not_found';
+import { Playground } from './components/playground/playground';
import { SearchApplicationsRouter } from './components/search_applications/search_applications_router';
-import { ROOT_PATH, SEARCH_APPLICATIONS_PATH } from './routes';
+import { PLAYGROUND_PATH, ROOT_PATH, SEARCH_APPLICATIONS_PATH } from './routes';
export const Applications = () => {
return (
-
+
+
+
+
diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/routes.ts b/x-pack/plugins/enterprise_search/public/applications/applications/routes.ts
index e919de033b3fa..5779f544c3f34 100644
--- a/x-pack/plugins/enterprise_search/public/applications/applications/routes.ts
+++ b/x-pack/plugins/enterprise_search/public/applications/applications/routes.ts
@@ -17,6 +17,8 @@ export enum SearchApplicationViewTabs {
export const SEARCH_APPLICATION_CREATION_PATH = `${SEARCH_APPLICATIONS_PATH}/new`;
export const SEARCH_APPLICATION_PATH = `${SEARCH_APPLICATIONS_PATH}/:searchApplicationName`;
export const SEARCH_APPLICATION_TAB_PATH = `${SEARCH_APPLICATION_PATH}/:tabId`;
+export const PLAYGROUND_PATH = `${ROOT_PATH}playground`;
+
export const SEARCH_APPLICATION_CONNECT_PATH = `${SEARCH_APPLICATION_PATH}/${SearchApplicationViewTabs.CONNECT}/:connectTabId`;
export enum SearchApplicationConnectTabs {
SEARCHAPI = 'search_api',
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx
index a4d514e0ec1d8..0ff30a31ebd34 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx
@@ -17,7 +17,6 @@ export const EnterpriseSearchContentPageTemplate: React.FC =
children,
pageChrome,
pageViewTelemetry,
- restrictWidth = true,
...pageTemplateProps
}) => {
return (
@@ -27,7 +26,6 @@ export const EnterpriseSearchContentPageTemplate: React.FC =
items: useEnterpriseSearchNav(),
name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME,
}}
- restrictWidth={restrictWidth}
setPageChrome={pageChrome && }
>
{pageViewTelemetry && (
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/search_playground_popover.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/search_playground_popover.tsx
index 01a6e901af3f9..a0e83929d41fb 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/search_playground_popover.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/search_playground_popover.tsx
@@ -11,10 +11,9 @@ import { EuiButton } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
+import { PLAYGROUND_PATH } from '../../../../../applications/routes';
import { KibanaLogic } from '../../../../../shared/kibana';
-import { PLAYGROUND_PATH } from '../../../../routes';
-
export interface SearchPlaygroundPopoverProps {
indexName: string;
ingestionMethod: string;
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx
index ea219fe9fa6eb..2ec701aa9847b 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx
@@ -23,7 +23,6 @@ import { VersionMismatchPage } from '../shared/version_mismatch';
import { ConnectorsRouter } from './components/connectors/connectors_router';
import { CrawlersRouter } from './components/connectors/crawlers_router';
import { NotFound } from './components/not_found';
-import { Playground } from './components/playground/playground';
import { SearchIndicesRouter } from './components/search_indices';
import {
CONNECTORS_PATH,
@@ -32,7 +31,6 @@ import {
ROOT_PATH,
SEARCH_INDICES_PATH,
SETUP_GUIDE_PATH,
- PLAYGROUND_PATH,
} from './routes';
export const EnterpriseSearchContent: React.FC = (props) => {
@@ -84,9 +82,6 @@ export const EnterpriseSearchContentConfigured: React.FC
-
-
-
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts
index 9ce2d02db36d6..6be30af4e986b 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts
@@ -13,7 +13,6 @@ export const ERROR_STATE_PATH = '/error_state';
export const SEARCH_INDICES_PATH = `${ROOT_PATH}search_indices`;
export const CONNECTORS_PATH = `${ROOT_PATH}connectors`;
export const CRAWLERS_PATH = `${ROOT_PATH}crawlers`;
-export const PLAYGROUND_PATH = `${ROOT_PATH}playground`;
export const SETTINGS_PATH = `${ROOT_PATH}settings`;
export const NEW_INDEX_PATH = `${SEARCH_INDICES_PATH}/new_index`;
diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts
index 228321ef120c1..408d131289d7a 100644
--- a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts
+++ b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts
@@ -124,6 +124,7 @@ class DocLinks {
public licenseManagement: string;
public machineLearningStart: string;
public mlDocumentEnrichment: string;
+ public playground: string;
public pluginsIngestAttachment: string;
public queryDsl: string;
public restApis: string;
@@ -301,6 +302,7 @@ class DocLinks {
this.licenseManagement = '';
this.machineLearningStart = '';
this.mlDocumentEnrichment = '';
+ this.playground = '';
this.pluginsIngestAttachment = '';
this.queryDsl = '';
this.restApis = '';
@@ -480,6 +482,7 @@ class DocLinks {
this.licenseManagement = docLinks.links.enterpriseSearch.licenseManagement;
this.machineLearningStart = docLinks.links.enterpriseSearch.machineLearningStart;
this.mlDocumentEnrichment = docLinks.links.enterpriseSearch.mlDocumentEnrichment;
+ this.playground = docLinks.links.enterpriseSearch.playground;
this.pluginsIngestAttachment = docLinks.links.plugins.ingestAttachment;
this.queryDsl = docLinks.links.query.queryDsl;
this.restApis = docLinks.links.apis.restApis;
diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx
index b24f5251af259..7ffb68ef228fa 100644
--- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx
@@ -57,18 +57,18 @@ const baseNavItems = [
items: undefined,
name: 'Web crawlers',
},
- {
- href: '/app/enterprise_search/content/playground',
- id: 'playground',
- items: undefined,
- name: 'Playground',
- },
],
name: 'Content',
},
{
- id: 'applications',
+ id: 'build',
items: [
+ {
+ href: '/app/enterprise_search/applications/playground',
+ id: 'playground',
+ items: undefined,
+ name: 'Playground',
+ },
{
href: '/app/enterprise_search/applications/search_applications',
id: 'searchApplications',
@@ -82,7 +82,7 @@ const baseNavItems = [
name: 'Behavioral Analytics',
},
],
- name: 'Applications',
+ name: 'Build',
},
{
id: 'es_getting_started',
@@ -243,11 +243,11 @@ describe('useEnterpriseSearchApplicationNav', () => {
expect(navItems![0].id).toEqual('home');
expect(navItems?.slice(1).map((ni) => ni.name)).toEqual([
'Content',
- 'Applications',
+ 'Build',
'Getting started',
'Enterprise Search',
]);
- const searchItem = navItems?.find((ni) => ni.id === 'applications');
+ const searchItem = navItems?.find((ni) => ni.id === 'build');
expect(searchItem).not.toBeUndefined();
expect(searchItem!.items).not.toBeUndefined();
// @ts-ignore
@@ -300,11 +300,11 @@ describe('useEnterpriseSearchApplicationNav', () => {
expect(navItems![0].id).toEqual('home');
expect(navItems?.slice(1).map((ni) => ni.name)).toEqual([
'Content',
- 'Applications',
+ 'Build',
'Getting started',
'Enterprise Search',
]);
- const searchItem = navItems?.find((ni) => ni.id === 'applications');
+ const searchItem = navItems?.find((ni) => ni.id === 'build');
expect(searchItem).not.toBeUndefined();
expect(searchItem!.items).not.toBeUndefined();
// @ts-ignore
@@ -330,7 +330,7 @@ describe('useEnterpriseSearchApplicationNav', () => {
// @ts-ignore
const engineItem = navItems
- .find((ni: EuiSideNavItemType) => ni.id === 'applications')
+ .find((ni: EuiSideNavItemType) => ni.id === 'build')
.items.find((ni: EuiSideNavItemType) => ni.id === 'searchApplications')
.items[0].items.find(
(ni: EuiSideNavItemType) => ni.id === 'enterpriseSearchApplicationsContent'
@@ -398,9 +398,9 @@ describe('useEnterpriseSearchAnalyticsNav', () => {
integration: '/integration-path',
overview: '/overview-path',
});
- const applicationsNav = navItems?.find((item) => item.id === 'applications');
+ const applicationsNav = navItems?.find((item) => item.id === 'build');
expect(applicationsNav).not.toBeUndefined();
- const analyticsNav = applicationsNav?.items?.[1];
+ const analyticsNav = applicationsNav?.items?.[2];
expect(analyticsNav).not.toBeUndefined();
expect(analyticsNav).toEqual({
href: '/app/enterprise_search/analytics',
diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx
index 4a3cb6dc197fc..ced35c94d6853 100644
--- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx
@@ -23,10 +23,13 @@ import {
VECTOR_SEARCH_PLUGIN,
WORKPLACE_SEARCH_PLUGIN,
} from '../../../../common/constants';
-import { SEARCH_APPLICATIONS_PATH, SearchApplicationViewTabs } from '../../applications/routes';
-import { useIndicesNav } from '../../enterprise_search_content/components/search_index/indices/indices_nav';
import {
+ SEARCH_APPLICATIONS_PATH,
+ SearchApplicationViewTabs,
PLAYGROUND_PATH,
+} from '../../applications/routes';
+import { useIndicesNav } from '../../enterprise_search_content/components/search_index/indices/indices_nav';
+import {
CONNECTORS_PATH,
CRAWLERS_PATH,
SEARCH_INDICES_PATH,
@@ -93,6 +96,14 @@ export const useEnterpriseSearchNav = () => {
to: ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL + CRAWLERS_PATH,
}),
},
+ ],
+ name: i18n.translate('xpack.enterpriseSearch.nav.contentTitle', {
+ defaultMessage: 'Content',
+ }),
+ },
+ {
+ id: 'build',
+ items: [
{
id: 'playground',
name: i18n.translate('xpack.enterpriseSearch.nav.PlaygroundTitle', {
@@ -101,17 +112,9 @@ export const useEnterpriseSearchNav = () => {
...generateNavLink({
shouldNotCreateHref: true,
shouldShowActiveForSubroutes: true,
- to: ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL + PLAYGROUND_PATH,
+ to: APPLICATIONS_PLUGIN.URL + PLAYGROUND_PATH,
}),
},
- ],
- name: i18n.translate('xpack.enterpriseSearch.nav.contentTitle', {
- defaultMessage: 'Content',
- }),
- },
- {
- id: 'applications',
- items: [
{
id: 'searchApplications',
name: i18n.translate('xpack.enterpriseSearch.nav.searchApplicationsTitle', {
@@ -134,7 +137,7 @@ export const useEnterpriseSearchNav = () => {
},
],
name: i18n.translate('xpack.enterpriseSearch.nav.applicationsTitle', {
- defaultMessage: 'Applications',
+ defaultMessage: 'Build',
}),
},
{
@@ -226,7 +229,7 @@ export const useEnterpriseSearchApplicationNav = (
const navItems = useEnterpriseSearchNav();
if (!navItems) return undefined;
if (!searchApplicationName) return navItems;
- const applicationsItem = navItems.find((item) => item.id === 'applications');
+ const applicationsItem = navItems.find((item) => item.id === 'build');
if (!applicationsItem || !applicationsItem.items) return navItems;
const searchApplicationsItem = applicationsItem.items?.find(
(item) => item.id === 'searchApplications'
@@ -320,7 +323,7 @@ export const useEnterpriseSearchAnalyticsNav = (
if (!navItems) return undefined;
- const applicationsNav = navItems.find((item) => item.id === 'applications');
+ const applicationsNav = navItems.find((item) => item.id === 'build');
const analyticsNav = applicationsNav?.items?.find((item) => item.id === 'analyticsCollections');
if (!name || !paths || !analyticsNav) return navItems;
diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts
index c46e888cb7168..60134aafd8534 100644
--- a/x-pack/plugins/enterprise_search/public/plugin.ts
+++ b/x-pack/plugins/enterprise_search/public/plugin.ts
@@ -55,12 +55,11 @@ import {
import { ClientConfigType, InitialAppData } from '../common/types';
import { ENGINES_PATH } from './applications/app_search/routes';
-import { SEARCH_APPLICATIONS_PATH } from './applications/applications/routes';
+import { SEARCH_APPLICATIONS_PATH, PLAYGROUND_PATH } from './applications/applications/routes';
import {
CONNECTORS_PATH,
SEARCH_INDICES_PATH,
CRAWLERS_PATH,
- PLAYGROUND_PATH,
} from './applications/enterprise_search_content/routes';
import { docLinks } from './applications/shared/doc_links';
@@ -122,16 +121,17 @@ const contentLinks: AppDeepLink[] = [
defaultMessage: 'Web crawlers',
}),
},
+];
+
+const applicationsLinks: AppDeepLink[] = [
{
id: 'playground',
path: `/${PLAYGROUND_PATH}`,
title: i18n.translate('xpack.enterpriseSearch.navigation.contentPlaygroundLinkLabel', {
defaultMessage: 'Playground',
}),
+ visibleIn: ['sideNav', 'globalSearch'],
},
-];
-
-const applicationsLinks: AppDeepLink[] = [
{
id: 'searchApplications',
path: `/${SEARCH_APPLICATIONS_PATH}`,
@@ -141,6 +141,7 @@ const applicationsLinks: AppDeepLink[] = [
defaultMessage: 'Search Applications',
}
),
+ visibleIn: ['globalSearch'],
},
];
@@ -359,6 +360,7 @@ export class EnterpriseSearchPlugin implements Plugin {
return renderApp(Applications, kibanaDeps, pluginData);
},
title: APPLICATIONS_PLUGIN.NAV_TITLE,
+ visibleIn: [],
});
core.application.register({
diff --git a/x-pack/test/accessibility/apps/group3/enterprise_search.ts b/x-pack/test/accessibility/apps/group3/enterprise_search.ts
index a7b7724e43181..3ef1c02c7b8a8 100644
--- a/x-pack/test/accessibility/apps/group3/enterprise_search.ts
+++ b/x-pack/test/accessibility/apps/group3/enterprise_search.ts
@@ -113,11 +113,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
});
});
- describe('Search Applications', () => {
+ describe('Playground', () => {
before(async () => {
await common.navigateToApp('enterprise_search/applications');
});
+ it('loads playground', async function () {
+ await retry.waitFor(
+ 'playground docs link',
+ async () => await testSubjects.exists('playground-documentation-link')
+ );
+ await a11y.testAppSnapshot();
+ });
+ });
+
+ describe('Search Applications', () => {
+ before(async () => {
+ await common.navigateToApp('enterprise_search/applications/search_applications');
+ });
+
it('loads search applications list', async function () {
await retry.waitFor(
'search apps docs link',
From add4c519e656e8a7d1e5be11eb95ede2e746a5b5 Mon Sep 17 00:00:00 2001
From: Nicolas Chaulet
Date: Mon, 22 Apr 2024 22:17:57 +0700
Subject: [PATCH 031/183] [Fleet] Add proxy_id to fleet_server_hosts openAPI
(#181316)
---
.../plugins/fleet/common/openapi/bundled.json | 26 ++-
.../plugins/fleet/common/openapi/bundled.yaml | 158 +++++-------------
.../components/schemas/fleet_server_host.yaml | 2 +
.../openapi/paths/fleet_server_hosts.yaml | 3 +
.../paths/fleet_server_hosts@{item_id}.yaml | 4 +
5 files changed, 74 insertions(+), 119 deletions(-)
diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json
index d10af2053ef4e..9a5c0b19f4d93 100644
--- a/x-pack/plugins/fleet/common/openapi/bundled.json
+++ b/x-pack/plugins/fleet/common/openapi/bundled.json
@@ -1,6 +1,5 @@
{
"openapi": "3.0.0",
- "tags": [],
"info": {
"title": "Fleet",
"description": "OpenAPI schema for Fleet API endpoints",
@@ -18,6 +17,12 @@
"url": "http://KIBANA_HOST:5601/api/fleet"
}
],
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "tags": [],
"paths": {
"/health_check": {
"post": {
@@ -5228,6 +5233,10 @@
"is_internal": {
"type": "boolean"
},
+ "proxy_id": {
+ "description": "The ID of the proxy to use for this fleet server host. See the proxies API for more information.",
+ "type": "string"
+ },
"host_urls": {
"type": "array",
"items": {
@@ -5343,6 +5352,11 @@
"is_internal": {
"type": "boolean"
},
+ "proxy_id": {
+ "description": "The ID of the proxy to use for this fleet server host. See the proxies API for more information.",
+ "type": "string",
+ "nullable": true
+ },
"host_urls": {
"type": "array",
"items": {
@@ -9121,6 +9135,9 @@
"is_preconfigured": {
"type": "boolean"
},
+ "proxy_id": {
+ "type": "string"
+ },
"host_urls": {
"type": "array",
"items": {
@@ -9168,10 +9185,5 @@
]
}
}
- },
- "security": [
- {
- "basicAuth": []
- }
- ]
+ }
}
\ No newline at end of file
diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml
index 25850c8c6d811..30b4706e5628b 100644
--- a/x-pack/plugins/fleet/common/openapi/bundled.yaml
+++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml
@@ -1,5 +1,4 @@
openapi: 3.0.0
-tags: []
info:
title: Fleet
description: OpenAPI schema for Fleet API endpoints
@@ -11,6 +10,9 @@ info:
url: https://www.elastic.co/licensing/elastic-license
servers:
- url: http://KIBANA_HOST:5601/api/fleet
+security:
+ - basicAuth: []
+tags: []
paths:
/health_check:
post:
@@ -179,9 +181,7 @@ paths:
id:
type: string
nullable: true
- description: >-
- the key ID of the GPG key used to verify package
- signatures
+ description: the key ID of the GPG key used to verify package signatures
statusCode:
type: number
headers:
@@ -244,9 +244,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- Whether to include prerelease packages in categories count (e.g. beta,
- rc, preview)
+ description: Whether to include prerelease packages in categories count (e.g. beta, rc, preview)
- in: query
name: experimental
deprecated: true
@@ -300,20 +298,13 @@ paths:
schema:
type: boolean
default: false
- description: >-
- Whether to exclude the install status of each package. Enabling this
- option will opt in to caching for the response via `cache-control`
- headers. If you don't need up-to-date installation info for a
- package, and are querying for a list of available packages,
- providing this flag can improve performance substantially.
+ description: Whether to exclude the install status of each package. Enabling this option will opt in to caching for the response via `cache-control` headers. If you don't need up-to-date installation info for a package, and are querying for a list of available packages, providing this flag can improve performance substantially.
- in: query
name: prerelease
schema:
type: boolean
default: false
- description: >-
- Whether to return prerelease versions of packages (e.g. beta, rc,
- preview)
+ description: Whether to return prerelease versions of packages (e.g. beta, rc, preview)
- in: query
name: experimental
deprecated: true
@@ -378,9 +369,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- skip data stream rollover during index template mapping or settings
- update
+ description: skip data stream rollover during index template mapping or settings update
requestBody:
content:
application/zip:
@@ -412,9 +401,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- Whether to return prerelease versions of packages (e.g. beta, rc,
- preview)
+ description: Whether to return prerelease versions of packages (e.g. beta, rc, preview)
requestBody:
content:
application/json:
@@ -486,9 +473,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- Whether to return prerelease versions of packages (e.g. beta, rc,
- preview)
+ description: Whether to return prerelease versions of packages (e.g. beta, rc, preview)
deprecated: true
post:
summary: Install package
@@ -540,9 +525,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- skip data stream rollover during index template mapping or settings
- update
+ description: skip data stream rollover during index template mapping or settings update
requestBody:
content:
application/json:
@@ -661,18 +644,14 @@ paths:
- schema:
type: boolean
name: full
- description: >-
- Return all fields from the package manifest, not just those supported
- by the Elastic Package Registry
+ description: Return all fields from the package manifest, not just those supported by the Elastic Package Registry
in: query
- in: query
name: prerelease
schema:
type: boolean
default: false
- description: >-
- Whether to return prerelease versions of packages (e.g. beta, rc,
- preview)
+ description: Whether to return prerelease versions of packages (e.g. beta, rc, preview)
post:
summary: Install package
tags:
@@ -727,9 +706,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- skip data stream rollover during index template mapping or settings
- update
+ description: skip data stream rollover during index template mapping or settings update
requestBody:
content:
application/json:
@@ -877,9 +854,7 @@ paths:
schema:
type: boolean
default: false
- description: >-
- Whether to include prerelease packages in categories count (e.g.
- beta, rc, preview)
+ description: Whether to include prerelease packages in categories count (e.g. beta, rc, preview)
requestBody:
content:
application/json:
@@ -1368,9 +1343,7 @@ paths:
description: creation time of action
latestErrors:
type: array
- description: >-
- latest errors that happened when the agents executed
- the action
+ description: latest errors that happened when the agents executed the action
items:
type: object
properties:
@@ -1838,9 +1811,7 @@ paths:
description: Unenrolls hosted agents too
includeInactive:
type: boolean
- description: >-
- When passing agents by KQL query, unenrolls inactive agents
- too
+ description: When passing agents by KQL query, unenrolls inactive agents too
required:
- agents
example:
@@ -2043,18 +2014,12 @@ paths:
type: boolean
in: query
name: full
- description: >-
- When set to true, retrieve the related package policies for each
- agent policy.
+ description: When set to true, retrieve the related package policies for each agent policy.
- schema:
type: boolean
in: query
name: noAgentCount
- description: >-
- When set to true, do not count how many agents are in the agent
- policy, this can improve performance if you are searching over a
- large number of agent policies. The "agents" property will always be
- 0 if set to true.
+ description: When set to true, do not count how many agents are in the agent policy, this can improve performance if you are searching over a large number of agent policies. The "agents" property will always be 0 if set to true.
description: ''
post:
summary: Create agent policy
@@ -2634,9 +2599,7 @@ paths:
'409':
$ref: '#/components/responses/error'
requestBody:
- description: >-
- You should use inputs as an object and not use the deprecated inputs
- array.
+ description: You should use inputs as an object and not use the deprecated inputs array.
content:
application/json:
schema:
@@ -3260,6 +3223,9 @@ paths:
type: boolean
is_internal:
type: boolean
+ proxy_id:
+ description: The ID of the proxy to use for this fleet server host. See the proxies API for more information.
+ type: string
host_urls:
type: array
items:
@@ -3332,6 +3298,10 @@ paths:
type: boolean
is_internal:
type: boolean
+ proxy_id:
+ description: The ID of the proxy to use for this fleet server host. See the proxies API for more information.
+ type: string
+ nullable: true
host_urls:
type: array
items:
@@ -4122,9 +4092,7 @@ components:
release:
type: string
deprecated: true
- description: >-
- release label is deprecated, derive from the version instead
- (packages follow semver)
+ description: release label is deprecated, derive from the version instead (packages follow semver)
enum:
- experimental
- beta
@@ -4403,9 +4371,7 @@ components:
properties:
cpu_avg:
type: number
- description: >-
- Average agent CPU usage during the last 5 minutes, number
- between 0-1
+ description: Average agent CPU usage during the last 5 minutes, number between 0-1
memory_size_byte_avg:
type: number
description: Average agent memory consumption during the last 5 minutes
@@ -4672,9 +4638,7 @@ components:
- metrics
- logs
keep_monitoring_alive:
- description: >-
- When set to true, monitoring will be enabled but logs/metrics
- collection will be disabled
+ description: When set to true, monitoring will be enabled but logs/metrics collection will be disabled
type: boolean
nullable: true
data_output_id:
@@ -4694,10 +4658,7 @@ components:
inactivity_timeout:
type: integer
package_policies:
- description: >-
- This field is present only when retrieving a single agent policy, or
- when retrieving a list of agent policies with the ?full=true
- parameter
+ description: This field is present only when retrieving a single agent policy, or when retrieving a list of agent policies with the ?full=true parameter
type: array
items:
$ref: '#/components/schemas/package_policy'
@@ -4723,22 +4684,15 @@ components:
- name
- enabled
is_protected:
- description: >-
- Indicates whether the agent policy has tamper protection enabled.
- Default false.
+ description: Indicates whether the agent policy has tamper protection enabled. Default false.
type: boolean
overrides:
type: object
- description: >-
- Override settings that are defined in the agent policy. Input
- settings cannot be overridden. The override option should be used
- only in unusual circumstances and not as a routine procedure.
+ description: Override settings that are defined in the agent policy. Input settings cannot be overridden. The override option should be used only in unusual circumstances and not as a routine procedure.
nullable: true
advanced_settings:
type: object
- description: >-
- Advanced settings stored in the agent policy, e.g.
- agent_limits_go_max_procs
+ description: Advanced settings stored in the agent policy, e.g. agent_limits_go_max_procs
nullable: true
required:
- id
@@ -5063,9 +5017,7 @@ components:
example: my description
namespace:
type: string
- description: >-
- The package policy namespace. Leave blank to inherit the agent
- policy's namespace.
+ description: The package policy namespace. Leave blank to inherit the agent policy's namespace.
example: customnamespace
policy_id:
type: string
@@ -5087,14 +5039,10 @@ components:
- version
vars:
type: object
- description: >-
- Package root level variable (see integration documentation for more
- information)
+ description: Package root level variable (see integration documentation for more information)
inputs:
type: object
- description: >-
- Package policy inputs (see integration documentation to know what
- inputs are available)
+ description: Package policy inputs (see integration documentation to know what inputs are available)
example:
nginx-logfile:
enabled: true
@@ -5116,14 +5064,10 @@ components:
description: enable or disable that input, (default to true)
vars:
type: object
- description: >-
- Input level variable (see integration documentation for more
- information)
+ description: Input level variable (see integration documentation for more information)
streams:
type: object
- description: >-
- Input streams (see integration documentation to know what
- streams are available)
+ description: Input streams (see integration documentation to know what streams are available)
additionalProperties:
type: object
properties:
@@ -5132,14 +5076,10 @@ components:
description: enable or disable that stream, (default to true)
vars:
type: object
- description: >-
- Stream level variable (see integration documentation for
- more information)
+ description: Stream level variable (see integration documentation for more information)
force:
type: boolean
- description: >-
- Force package policy creation even if package is not verified, or if
- the agent policy is managed.
+ description: Force package policy creation even if package is not verified, or if the agent policy is managed.
required:
- name
- policy_id
@@ -5430,9 +5370,7 @@ components:
type: string
when:
deprecated: true
- description: >-
- Deprecated, kafka output do not support conditionnal topics
- anymore.
+ description: Deprecated, kafka output do not support conditionnal topics anymore.
type: object
properties:
type:
@@ -5777,9 +5715,7 @@ components:
type: string
when:
deprecated: true
- description: >-
- Deprecated, kafka output do not support conditionnal topics
- anymore.
+ description: Deprecated, kafka output do not support conditionnal topics anymore.
type: object
properties:
type:
@@ -5890,9 +5826,7 @@ components:
host:
type: string
proxy_id:
- description: >-
- The ID of the proxy to use for this download source. See the proxies
- API for more information.
+ description: The ID of the proxy to use for this download source. See the proxies API for more information.
type: string
nullable: true
required:
@@ -5913,6 +5847,8 @@ components:
type: boolean
is_preconfigured:
type: boolean
+ proxy_id:
+ type: string
host_urls:
type: array
items:
@@ -5944,5 +5880,3 @@ components:
required:
- name
- url
-security:
- - basicAuth: []
diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_server_host.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_server_host.yaml
index 2bb08f3acc2a3..4bc977ec47706 100644
--- a/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_server_host.yaml
+++ b/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_server_host.yaml
@@ -11,6 +11,8 @@ properties:
type: boolean
is_preconfigured:
type: boolean
+ proxy_id:
+ type: string
host_urls:
type: array
items:
diff --git a/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts.yaml b/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts.yaml
index 987f61cd7619b..907e7468751a3 100644
--- a/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts.yaml
+++ b/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts.yaml
@@ -53,6 +53,9 @@ post:
type: boolean
is_internal:
type: boolean
+ proxy_id:
+ description: The ID of the proxy to use for this fleet server host. See the proxies API for more information.
+ type: string
host_urls:
type: array
items:
diff --git a/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts@{item_id}.yaml b/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts@{item_id}.yaml
index 21d5342d18a5e..69c3635b87277 100644
--- a/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts@{item_id}.yaml
+++ b/x-pack/plugins/fleet/common/openapi/paths/fleet_server_hosts@{item_id}.yaml
@@ -61,6 +61,10 @@ put:
type: boolean
is_internal:
type: boolean
+ proxy_id:
+ description: The ID of the proxy to use for this fleet server host. See the proxies API for more information.
+ type: string
+ nullable: true
host_urls:
type: array
items:
From d8c41c89347cffc29232e116bb8ebdf31ac49987 Mon Sep 17 00:00:00 2001
From: Tiago Costa
Date: Mon, 22 Apr 2024 16:25:42 +0100
Subject: [PATCH 032/183] skip flaky suite (#170371)
---
.../response_actions/response_console/process_operations.cy.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
index f7c70ebf8c7e9..8529c68a2186d 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
@@ -31,7 +31,8 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
login();
});
- describe('Processes operations:', () => {
+ // FLAKY: https://github.com/elastic/kibana/issues/170371
+ describe.skip('Processes operations:', () => {
let indexedPolicy: IndexedFleetEndpointPolicyResponse;
let policy: PolicyData;
let createdHost: CreateAndEnrollEndpointHostResponse;
From ebeea05efd66d5943160db58a1816c42d07c1298 Mon Sep 17 00:00:00 2001
From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Date: Mon, 22 Apr 2024 11:27:01 -0400
Subject: [PATCH 033/183] skip failing test suite (#170371)
---
.../response_actions/response_console/process_operations.cy.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
index 8529c68a2186d..d127be35f7a31 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
@@ -26,7 +26,8 @@ import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_
const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat';
-describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
+// Failing: See https://github.com/elastic/kibana/issues/170371
+describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
});
From 0643f63d77aa0fd43c8bc380f72f4d9e53874768 Mon Sep 17 00:00:00 2001
From: Stratoula Kalafateli
Date: Mon, 22 Apr 2024 17:09:09 +0100
Subject: [PATCH 034/183] [Obs AI assistant] Relax validation on missing
fallbacks (#181324)
## Summary
Relaxes the validation which means that we can't quick fix the quotes
problem but we are still fixing other syntax errors such as functions
misspell etc.
---
.../query/correct_query_with_actions.test.ts | 46 ++++---------------
.../query/correct_query_with_actions.ts | 4 +-
2 files changed, 12 insertions(+), 38 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts
index c2cf207a6925d..818f4854e038d 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts
@@ -33,42 +33,14 @@ describe('correctQueryWithActions', () => {
expect(fixedQuery).toBe('from logstash-* | stats var0 = max(bytes) | eval abs(var0) | limit 1');
});
- it(`fixes errors correctly for a query with missing quotes`, async () => {
- const fixedQuery = await correctQueryWithActions('from logstash-* | keep field-1');
- expect(fixedQuery).toBe('from logstash-* | keep `field-1`');
- });
-
- it(`fixes errors correctly for a query with missing quotes in multiple commands`, async () => {
- const fixedQuery = await correctQueryWithActions(
- 'from logstash-* | stats avg(field-1) | eval abs(field-2)'
- );
- expect(fixedQuery).toBe('from logstash-* | stats avg(`field-1`) | eval abs(`field-2`)');
- });
-
- it(`fixes errors correctly for a query with missing quotes and keep with multiple fields`, async () => {
- const fixedQuery = await correctQueryWithActions('from logstash-* | keep field-1, field-2');
- expect(fixedQuery).toBe('from logstash-* | keep `field-1`, `field-2`');
- });
-
- it(`fixes errors correctly for a query with missing quotes with variable assignment`, async () => {
- const fixedQuery = await correctQueryWithActions('from logstash-* | stats var1 = avg(field-1)');
- expect(fixedQuery).toBe('from logstash-* | stats var1 = avg(`field-1`)');
- });
-
- it(`fixes errors correctly for a query with missing quotes in an aggregation`, async () => {
- const fixedQuery = await correctQueryWithActions('from logstash-* | stats avg(field-1)');
- expect(fixedQuery).toBe('from logstash-* | stats avg(`field-1`)');
- });
-
- it(`fixes errors correctly for a query with typo on stats and wrong quotes`, async () => {
- const fixedQuery = await correctQueryWithActions('from logstash-* | stats aveg(field-1)');
- expect(fixedQuery).toBe('from logstash-* | stats avg(`field-1`)');
- });
-
- it(`fixes errors correctly for a query with missing quotes on stats and keep`, async () => {
- const fixedQuery = await correctQueryWithActions(
- 'from logstash-* | stats avg(field-1) | keep field-2'
- );
- expect(fixedQuery).toBe('from logstash-* | stats avg(`field-1`) | keep `field-2`');
+ it(`doesnt complain for @timestamp column`, async () => {
+ const queryWithTimestamp = `FROM logstash-*
+ | WHERE @timestamp >= NOW() - 15 minutes
+ | EVAL bucket = DATE_TRUNC(1 minute, @timestamp)
+ | STATS avg_cpu = AVG(system.cpu.total.norm.pct) BY service.name, bucket
+ | SORT avg_cpu DESC
+ | LIMIT 10`;
+ const fixedQuery = await correctQueryWithActions(queryWithTimestamp);
+ expect(fixedQuery).toBe(queryWithTimestamp);
});
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
index bc684d13841eb..213b7e967970a 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
@@ -8,7 +8,9 @@ import { validateQuery, getActions } from '@kbn/esql-validation-autocomplete';
import { getAstAndSyntaxErrors } from '@kbn/esql-ast';
const fixedQueryByOneAction = async (queryString: string) => {
- const { errors } = await validateQuery(queryString, getAstAndSyntaxErrors);
+ const { errors } = await validateQuery(queryString, getAstAndSyntaxErrors, {
+ ignoreOnMissingCallbacks: true,
+ });
const actions = await getActions(queryString, errors, getAstAndSyntaxErrors, {
relaxOnMissingCallbacks: true,
From 2bbbed6fa1b48f1e98fe80b8e24c66c01ee0261a Mon Sep 17 00:00:00 2001
From: "Joey F. Poon"
Date: Mon, 22 Apr 2024 09:18:46 -0700
Subject: [PATCH 035/183] [Security Solution] update endpoint cypress tests to
use applied policy data (#180540)
## Summary
Endpoint cypress e2e tests were previously set to check against
configured instead of applied policy data. It appears that the issues
that were causing policy to occasionally not get applied has been
resolved upstream as it is no longer flaky:
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5666
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5690
This PR updates the tests to check against applied policy data again.
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---
.../management/cypress/e2e/endpoint_list/endpoints.cy.ts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts
index 1e68dae07971c..4396937e57228 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts
@@ -80,12 +80,13 @@ describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => {
loadPage(APP_ENDPOINTS_PATH);
const agentIdPath = 'response.body.data[0].metadata.agent.id';
- // ideally we should use applied policy instead: https://github.com/elastic/security-team/issues/8837
- const policyVersionPath = 'response.body.data[0].policy_info.endpoint.revision';
+ const policyVersionPath =
+ 'response.body.data[0].metadata.Endpoint.policy.applied.endpoint_policy_version';
cy.wait('@metadataRequest', { timeout: 30000 });
cy.get('@metadataRequest').its(agentIdPath).should('be.a', 'string').as('endpointId');
cy.get('@metadataRequest')
.its(policyVersionPath)
+ .then((version) => parseInt(version, 10))
.should('be.a', 'number')
.as('originalPolicyRevision');
cy.get('@endpointId')
@@ -195,8 +196,7 @@ describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => {
.and('be.enabled');
cy.getByTestSubj(FLEET_REASSIGN_POLICY_MODAL_CONFIRM_BUTTON).click();
- // ideally we should use applied policy instead: https://github.com/elastic/security-team/issues/8837
- const policyIdPath = 'response.body.data[0].policy_info.agent.configured.id';
+ const policyIdPath = 'response.body.data[0].policy_info.agent.applied.id';
// relies on multiple transforms so might take some extra time
cy.get('@metadataRequest', { timeout: 120000 })
.its(policyIdPath)
From 72e13c257eda6b23a1e73b9d7521b094513e3a18 Mon Sep 17 00:00:00 2001
From: Karen Grigoryan
Date: Mon, 22 Apr 2024 18:19:58 +0200
Subject: [PATCH 036/183] [Security Solution] add error handling for
buildEsQuery calls (#178848)
This PR addresses issue #155419 by adding missing error handling to
`buildEsQuery()` calls within investigation/explore domains.
This PR underwent numerous iterations and remained in draft status for
an extended period before reaching it's final shape. Initially, many
changes were made to the `useInvalidFilterQuery()` hook, which manages
the notification toasts in various locations under an assumption that
some error toasts are not invoked when calling `buildEsQuery()`. During
iteration the hook was corrected, and tests were written to better
comprehend its behavior.
After eventual realization that error toasts are invoked in most of the
cases and subsequent cancellation of most of the work related to
`useInvalidFilterQuery()` calls, it was decided to retain the tests and
refactoring that occurred during the process as part of this PR anyways.
Scope:
The only file affected after numerous scope cuts is this
`x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_alert_actions.tsx`
---
.../common/components/top_n/index.test.tsx | 4 +-
.../public/common/components/top_n/index.tsx | 4 +-
.../common/components/top_n/top_n.test.tsx | 4 +-
.../public/common/components/top_n/top_n.tsx | 6 +-
.../hooks/use_invalid_filter_query.test.tsx | 286 ++++++++++++++++++
.../common/hooks/use_invalid_filter_query.tsx | 35 ++-
.../common/lib/kibana/kibana_react.mock.ts | 10 +-
.../public/common/mock/test_providers.tsx | 9 +-
.../alerts_histogram_panel/helpers.tsx | 6 +-
.../use_alert_actions.tsx | 28 +-
.../components/events_by_dataset/index.tsx | 10 +-
11 files changed, 352 insertions(+), 50 deletions(-)
create mode 100644 x-pack/plugins/security_solution/public/common/hooks/use_invalid_filter_query.test.tsx
diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx
index 5a8c5f3166ae7..217e0e2942d78 100644
--- a/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx
@@ -221,7 +221,7 @@ describe('StatefulTopN', () => {
test('it has undefined combinedQueries when rendering in a global context', () => {
const props = wrapper.find('[data-test-subj="top-n"]').first().props() as Props;
- expect(props.combinedQueries).toBeUndefined();
+ expect(props.filterQuery).toBeUndefined();
});
test(`defaults to the 'Raw events' view when rendering in a global context`, () => {
@@ -298,7 +298,7 @@ describe('StatefulTopN', () => {
test('it has a combinedQueries value from Redux state composed of the timeline [data providers + kql + filter-bar-filters] when rendering in a timeline context', () => {
const props = wrapper.find('[data-test-subj="top-n"]').first().props() as Props;
- expect(props.combinedQueries).toEqual(
+ expect(props.filterQuery).toEqual(
'{"bool":{"must":[],"filter":[{"bool":{"filter":[{"bool":{"should":[{"match_phrase":{"network.transport":"tcp"}}],"minimum_should_match":1}},{"bool":{"should":[{"exists":{"field":"host.name"}}],"minimum_should_match":1}}]}},{"match_phrase":{"source.port":{"query":"30045"}}}],"should":[],"must_not":[]}}'
);
});
diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx
index d845f2604c69b..b96110363a9c3 100644
--- a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx
@@ -126,7 +126,7 @@ const StatefulTopNComponent: React.FC = ({
language: 'kuery',
query: activeTimelineKqlQueryExpression ?? '',
},
- })?.filterQuery
+ })
: undefined,
[
scopeId,
@@ -147,7 +147,7 @@ const StatefulTopNComponent: React.FC = ({
return (
{
});
const field = 'host.name';
-const combinedQueries = {
+const filterQuery = {
bool: {
must: [],
filter: [
@@ -200,7 +200,7 @@ describe('TopN', () => {
};
wrapper = mount(
-
+
);
});
diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx
index 42ee8b8ed32f6..3b0547507e43f 100644
--- a/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx
@@ -45,7 +45,7 @@ const TopNContent = styled.div`
`;
export interface Props extends Pick {
- combinedQueries?: string;
+ filterQuery?: string;
defaultView: TimelineEventsType;
field: AlertsStackByField;
filters: Filter[];
@@ -61,7 +61,7 @@ export interface Props extends Pick = ({
- combinedQueries,
+ filterQuery,
defaultView,
deleteQuery,
filters,
@@ -115,7 +115,7 @@ const TopNComponent: React.FC = ({
{view === 'raw' || view === 'all' ? (
+ createMockStore(
+ {
+ ...mockGlobalState,
+ app: {
+ ...mockGlobalState.app,
+ errors: [],
+ },
+ },
+ undefined,
+ kibanaMock
+ );
+
+const getProps = () => ({
+ id: 'test-id',
+ kqlError: new Error('boom'),
+ query: { query: ': :', language: 'kuery' },
+ startDate: '2017-01-01T00:00:00.000Z',
+ endDate: '2018-01-02T00:00:00.000Z',
+});
+
+const getWrapper = (store: Store): React.FC => {
+ // eslint-disable-next-line react/display-name
+ return ({ children }) => (
+
+ {children}
+
+ );
+};
+
+describe('useInvalidFilterQuery', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('invokes error toast with error title and error instance without original stack', () => {
+ const store = getStore();
+ const props = getProps();
+
+ renderHook(useInvalidFilterQuery, { initialProps: props, wrapper: getWrapper(store) });
+
+ expect(store.getState().app.errors).toEqual([
+ {
+ displayError: true,
+ id: props.id,
+ hash: genHash(props.kqlError.message),
+ message: [props.kqlError.message],
+ title: props.kqlError.name,
+ },
+ ]);
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(props.kqlError, {
+ title: props.kqlError.name,
+ });
+ expect(props.kqlError.stack).toBeUndefined();
+ });
+
+ it('does not invoke error toast, when kqlError is missing', () => {
+ const store = getStore();
+ const props = getProps();
+
+ renderHook(useInvalidFilterQuery, {
+ initialProps: {
+ id: props.id,
+ query: props.query,
+ startDate: props.startDate,
+ endDate: props.endDate,
+ },
+ wrapper: getWrapper(store),
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).not.toHaveBeenCalled();
+ });
+
+ it('does not invoke error toast, when kqlError misses name property', () => {
+ const store = getStore();
+ const props = getProps();
+
+ // @ts-expect-error
+ props.kqlError.name = null;
+ renderHook(useInvalidFilterQuery, { initialProps: props, wrapper: getWrapper(store) });
+
+ expect(kibanaMock.notifications.toasts.addError).not.toHaveBeenCalled();
+ });
+
+ it('does not invoke error toast, when kqlError misses message property', () => {
+ const store = getStore();
+ const props = getProps();
+
+ // @ts-expect-error
+ props.kqlError.message = null;
+ renderHook(useInvalidFilterQuery, { initialProps: props, wrapper: getWrapper(store) });
+
+ expect(kibanaMock.notifications.toasts.addError).not.toHaveBeenCalled();
+ });
+
+ it('does not invoke error toast, when filterQuery is present', () => {
+ const store = getStore();
+ const props = getProps();
+
+ renderHook(useInvalidFilterQuery, {
+ initialProps: { ...props, filterQuery: 'filterQuery' },
+ wrapper: getWrapper(store),
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).not.toHaveBeenCalled();
+ });
+
+ // POTENTIAL BUG:
+ //
+ // id should ensure that only one toast is shown
+ // when you have different errors with the same id,
+ // but this test shows that it will currently show multiple toasts
+ // so we need to double check if this is the intended behavior and fix otherwise
+ it('invokes toast for each error, when called multiple times with same id and different errors, during a single render', async () => {
+ const store = getStore();
+ const props = getProps();
+
+ const kqlError2 = new Error('boom2');
+ const InvalidFilterComponent = () => {
+ useInvalidFilterQuery(props);
+ useInvalidFilterQuery({
+ ...props,
+ kqlError: kqlError2,
+ });
+ return null;
+ };
+ render(
+
+
+
+ );
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(2);
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(props.kqlError, {
+ title: props.kqlError.name,
+ });
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(kqlError2, {
+ title: kqlError2.name,
+ });
+ });
+
+ // BUG:
+ //
+ // additional +1 toast invocation when called multiple times with same id and different errors
+ // should not happen, error invocation count should equal the number of unique errors
+
+ it('invokes toast for each error +1, when called multiple times with same id and different errors, during multiple rerenders', async () => {
+ const store = getStore();
+ const props = getProps();
+
+ const kqlError2 = new Error('boom2');
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender({ ...props, kqlError: kqlError2 });
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(3);
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(props.kqlError, {
+ title: props.kqlError.name,
+ });
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(kqlError2, {
+ title: kqlError2.name,
+ });
+ });
+
+ // BUG:
+ //
+ // when invoked multiple times with same id and and error it should invoke the toast exactly once
+ it('does not invoke any toast, when called multiple times with same id and same error, during a single render', () => {
+ const store = getStore();
+ const props = getProps();
+ const InvalidFilterComponent = () => {
+ useInvalidFilterQuery(props);
+ useInvalidFilterQuery(props);
+ return null;
+ };
+ render(
+
+
+
+ );
+ expect(kibanaMock.notifications.toasts.addError).not.toHaveBeenCalled();
+ });
+
+ it('invokes toast once, when called multiple times with same id and same error, during multiple rerenders', () => {
+ const store = getStore();
+ const props = getProps();
+
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender();
+ rerender();
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ });
+
+ it('invokes error toast with only the first error, when called multiple times with different id and same error', () => {
+ const store = getStore();
+ const props = getProps();
+
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender({
+ ...props,
+ id: 'test-id2',
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledWith(props.kqlError, {
+ title: props.kqlError.name,
+ });
+ });
+
+ it('does not invoke error toast, when query prop is changed', () => {
+ const store = getStore();
+ const props = getProps();
+
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender({
+ ...props,
+ query: { query: ': :::', language: 'kuery' },
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ });
+
+ it('does not invoke error toast, when startDate prop is changed', () => {
+ const store = getStore();
+ const props = getProps();
+
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender({
+ ...props,
+ startDate: '2015-01-01T00:00:00.000Z',
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ });
+
+ it('does not invoke error toast, when endDate prop is changed', () => {
+ const store = getStore();
+ const props = getProps();
+
+ const { rerender } = renderHook(useInvalidFilterQuery, {
+ initialProps: props,
+ wrapper: getWrapper(store),
+ });
+ rerender({
+ ...props,
+ endDate: '2019-01-02T00:00:00.000Z',
+ });
+
+ expect(kibanaMock.notifications.toasts.addError).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_invalid_filter_query.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_invalid_filter_query.tsx
index 04165a66154e0..2c950acb11c81 100644
--- a/x-pack/plugins/security_solution/public/common/hooks/use_invalid_filter_query.tsx
+++ b/x-pack/plugins/security_solution/public/common/hooks/use_invalid_filter_query.tsx
@@ -13,6 +13,22 @@ import { appActions } from '../store/app';
import { useAppToasts } from './use_app_toasts';
import { useDeepEqualSelector } from './use_selector';
+export const genHash = (message: string) =>
+ message
+ .split('')
+ // eslint-disable-next-line no-bitwise
+ .reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0)
+ .toString();
+
+interface UseInvalidFilterQueryProps {
+ id: string;
+ filterQuery?: string;
+ kqlError?: Error;
+ query?: Query;
+ startDate?: string;
+ endDate?: string;
+}
+
/**
* Adds a toast error message whenever invalid KQL is submitted through the search bar
*/
@@ -20,17 +36,12 @@ export const useInvalidFilterQuery = ({
id,
filterQuery,
kqlError,
+ // TODO: Review and remove these (query, startDate, endDate) props.
+ // Change of any of these props will not trigger new error toast.
query,
startDate,
endDate,
-}: {
- id: string;
- filterQuery?: string;
- kqlError?: Error;
- query: Query;
- startDate: string;
- endDate: string;
-}) => {
+}: UseInvalidFilterQueryProps): void => {
const { addError } = useAppToasts();
const dispatch = useDispatch();
const getErrorsSelector = useMemo(() => appSelectors.errorsSelector(), []);
@@ -41,16 +52,10 @@ export const useInvalidFilterQuery = ({
useEffect(() => {
if (!filterQuery && message && name) {
- // Local util for creating an replicatable error hash
- const hashCode = message
- .split('')
- // eslint-disable-next-line no-bitwise
- .reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0)
- .toString();
dispatch(
appActions.addErrorHash({
id,
- hash: hashCode,
+ hash: genHash(message),
title: name,
message: [message],
})
diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts
index f950d53d1212f..e0e484ea1e017 100644
--- a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts
+++ b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts
@@ -266,10 +266,16 @@ export const createKibanaContextProviderMock = () => {
const services = createStartServicesMock();
// eslint-disable-next-line react/display-name
- return ({ children }: { children: React.ReactNode }) =>
+ return ({
+ children,
+ startServices: startServicesMock,
+ }: {
+ children: React.ReactNode;
+ startServices?: StartServices;
+ }) =>
React.createElement(
KibanaContextProvider,
- { services },
+ { services: startServicesMock || services },
React.createElement(NavigationProvider, { core: services }, children)
);
};
diff --git a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx
index 3d97f62767837..1a0689b53b229 100644
--- a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx
+++ b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx
@@ -34,11 +34,14 @@ import { ASSISTANT_FEATURE_ID, CASES_FEATURE_ID } from '../../../common/constant
import { UserPrivilegesProvider } from '../components/user_privileges/user_privileges_context';
import { MockDiscoverInTimelineContext } from '../components/discover_in_timeline/mocks/discover_in_timeline_provider';
import { createMockStore } from './create_store';
+import type { StartServices } from '../../types';
+
interface Props {
children?: React.ReactNode;
store?: Store;
onDragEnd?: (result: DropResult, provided: ResponderProvided) => void;
cellActions?: Action[];
+ startServices?: StartServices;
}
export const kibanaMock = createStartServicesMock();
@@ -53,6 +56,7 @@ const MockKibanaContextProvider = createKibanaContextProviderMock();
export const TestProvidersComponent: React.FC = ({
children,
store = createMockStore(),
+ startServices,
onDragEnd = jest.fn(),
cellActions = [],
}) => {
@@ -71,7 +75,7 @@ export const TestProvidersComponent: React.FC = ({
return (
-
+
({ eui: euiDarkVars, darkMode: true })}>
@@ -112,6 +116,7 @@ const TestProvidersWithPrivilegesComponent: React.FC = ({
children,
store = createMockStore(),
onDragEnd = jest.fn(),
+ startServices,
cellActions = [],
}) => {
const queryClient = new QueryClient({
@@ -123,7 +128,7 @@ const TestProvidersWithPrivilegesComponent: React.FC = ({
});
return (
-
+
({ eui: euiDarkVars, darkMode: true })}>
diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx
index 8eacaafde7750..cbeb7e9c3d0a5 100644
--- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx
@@ -108,7 +108,7 @@ export const showInitialLoadingSpinner = ({
isLoadingAlerts: boolean;
}): boolean => isInitialLoading && isLoadingAlerts;
-export const parseCombinedQueries = (query?: string) => {
+export const parseFilterQuery = (query?: string) => {
try {
return query != null && !isEmpty(query) ? JSON.parse(query) : {};
} catch {
@@ -116,9 +116,9 @@ export const parseCombinedQueries = (query?: string) => {
}
};
-export const buildCombinedQueries = (query?: string) => {
+export const buildFilterQuery = (query?: string) => {
try {
- return isEmpty(query) ? [] : [parseCombinedQueries(query)];
+ return isEmpty(query) ? [] : [parseFilterQuery(query)];
} catch {
return [];
}
diff --git a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_alert_actions.tsx b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_alert_actions.tsx
index 8a45dfb45db74..f4d211713b0f7 100644
--- a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_alert_actions.tsx
+++ b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_alert_actions.tsx
@@ -100,21 +100,21 @@ export const useBulkAlertActionItems = ({
clearSelection,
refresh
) => {
- let ids: string[] | undefined = items.map((item) => item._id);
- let query: Record | undefined;
-
- if (isSelectAllChecked) {
- const timeFilter = buildTimeRangeFilter(from, to);
- query = buildEsQuery(undefined, [], [...timeFilter, ...filters], undefined);
- ids = undefined;
- startTransaction({ name: APM_USER_INTERACTIONS.BULK_QUERY_STATUS_UPDATE });
- } else if (items.length > 1) {
- startTransaction({ name: APM_USER_INTERACTIONS.BULK_STATUS_UPDATE });
- } else {
- startTransaction({ name: APM_USER_INTERACTIONS.STATUS_UPDATE });
- }
-
try {
+ let ids: string[] | undefined = items.map((item) => item._id);
+ let query: Record | undefined;
+
+ if (isSelectAllChecked) {
+ const timeFilter = buildTimeRangeFilter(from, to);
+ query = buildEsQuery(undefined, [], [...timeFilter, ...filters], undefined);
+ ids = undefined;
+ startTransaction({ name: APM_USER_INTERACTIONS.BULK_QUERY_STATUS_UPDATE });
+ } else if (items.length > 1) {
+ startTransaction({ name: APM_USER_INTERACTIONS.BULK_STATUS_UPDATE });
+ } else {
+ startTransaction({ name: APM_USER_INTERACTIONS.STATUS_UPDATE });
+ }
+
setAlertLoading(true);
const response = await updateAlertStatus({
status,
diff --git a/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx b/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
index 5d673674225fd..3f7e72b15163b 100644
--- a/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
+++ b/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx
@@ -44,7 +44,7 @@ const ID = 'eventsByDatasetOverview';
const CHART_HEIGHT = 160;
interface Props extends Pick {
- combinedQueries?: string;
+ filterQuery?: string;
filters: Filter[];
headerChildren?: React.ReactNode;
indexPattern: DataViewBase;
@@ -77,7 +77,7 @@ const StyledLinkButton = styled(EuiButton)`
`;
const EventsByDatasetComponent: React.FC = ({
- combinedQueries,
+ filterQuery: filterQueryFromProps,
deleteQuery,
filters,
from,
@@ -138,7 +138,7 @@ const EventsByDatasetComponent: React.FC = ({
);
const [filterQuery, kqlError] = useMemo(() => {
- if (combinedQueries == null) {
+ if (filterQueryFromProps == null) {
return convertToBuildEsQuery({
config: getEsQueryConfig(kibana.services.uiSettings),
indexPattern,
@@ -146,8 +146,8 @@ const EventsByDatasetComponent: React.FC = ({
filters,
});
}
- return [combinedQueries];
- }, [combinedQueries, kibana, indexPattern, query, filters]);
+ return [filterQueryFromProps];
+ }, [filterQueryFromProps, kibana, indexPattern, query, filters]);
useInvalidFilterQuery({
id: uniqueQueryId,
From 737a72c1ff5838d4c96ce906f5585928c5c95c5d Mon Sep 17 00:00:00 2001
From: Maxim Kholod
Date: Mon, 22 Apr 2024 18:46:50 +0200
Subject: [PATCH 037/183] [Cloud Security] filter in only billable assets for
cloud security metering task (#180884)
## Summary
Count only billable assets in Cloud Security metering task for
serverless, based on the list created in
https://github.com/elastic/security-team/issues/8970
Closes:
- https://github.com/elastic/security-team/issues/9146
### Checklist
Delete any items that are not applicable to this PR.
- [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
### How to test locally
1. Update TASK_INTERVAL to a smaller value to make the metering task to
run more often
2. Run Kibana with `--verbose` flag to see DEBUG logs and ES and ingest
some CSPM data
3. Look for `received usage records:` log line and compare its output
with the output of
```
POST /logs-cloud_security_posture.findings_latest-default/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"gte": "now-24h"
}
}
},
{
"term": {
"rule.benchmark.posture_type": {
"value": "cspm"
}
}
},
{
"terms": {
"resource.sub_type": [
"aws-ebs",
"aws-ec2",
"aws-s3",
"aws-rds",
"azure-disk",
"azure-document-db-database-account",
"azure-flexible-mysql-server-db",
"azure-flexible-postgresql-server-db",
"azure-mysql-server-db",
"azure-postgresql-server-db",
"azure-sql-server",
"azure-vm",
"gcp-bigquery-dataset",
"gcp-bigquery-table",
"gcp-compute-disk",
"gcp-compute-instance",
"gcp-logging-log-bucket",
"gcp-sqladmin-instance",
"gcp-storage-bucket"
]
}
}
]
}
},
"aggs": {
"unique_assets": {
"cardinality": {
"field": "resource.id",
"precision_threshold": 40000
}
},
"min_timestamp": {
"min": {
"field": "@timestamp"
}
}
}
}
```
The reported `unique_assets` should be the same
---
.../cloud_security_metering_task.test.ts | 126 +++++++++++++++++-
.../cloud_security_metering_task.ts | 10 ++
.../server/cloud_security/constants.ts | 31 +++++
3 files changed, 166 insertions(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts
index 9b5e2281b09e9..d306b85938f9d 100644
--- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts
+++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts
@@ -8,7 +8,10 @@ import Chance from 'chance';
import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks';
import { getCloudProductTier } from './cloud_security_metering';
-import { getCloudSecurityUsageRecord } from './cloud_security_metering_task';
+import {
+ getCloudSecurityUsageRecord,
+ getSearchQueryByCloudSecuritySolution,
+} from './cloud_security_metering_task';
import type { ServerlessSecurityConfig } from '../config';
import type { CloudSecuritySolutions } from './types';
@@ -156,6 +159,127 @@ describe('getCloudSecurityUsageRecord', () => {
});
});
+describe('getSearchQueryByCloudSecuritySolution', () => {
+ it('should return the correct search query for CLOUD_DEFEND', () => {
+ const searchFrom = new Date('2023-07-30T15:11:41.738Z');
+
+ const result = getSearchQueryByCloudSecuritySolution('cloud_defend', searchFrom);
+
+ expect(result).toEqual({
+ bool: {
+ must: [
+ {
+ range: {
+ '@timestamp': {
+ gt: '2023-07-30T15:11:41.738Z',
+ },
+ },
+ },
+ ],
+ },
+ });
+ });
+
+ it('should return the correct search query for CSPM', () => {
+ const searchFrom = new Date('2023-07-30T15:11:41.738Z');
+
+ const result = getSearchQueryByCloudSecuritySolution('cspm', searchFrom);
+
+ expect(result).toEqual({
+ bool: {
+ must: [
+ {
+ range: {
+ '@timestamp': {
+ gte: 'now-24h',
+ },
+ },
+ },
+ {
+ term: {
+ 'rule.benchmark.posture_type': 'cspm',
+ },
+ },
+ {
+ terms: {
+ 'resource.sub_type': [
+ 'aws-ebs',
+ 'aws-ec2',
+ 'aws-s3',
+ 'aws-rds',
+ 'azure-disk',
+ 'azure-document-db-database-account',
+ 'azure-flexible-mysql-server-db',
+ 'azure-flexible-postgresql-server-db',
+ 'azure-mysql-server-db',
+ 'azure-postgresql-server-db',
+ 'azure-sql-server',
+ 'azure-vm',
+ 'gcp-bigquery-dataset',
+ 'gcp-bigquery-table',
+ 'gcp-compute-disk',
+ 'gcp-compute-instance',
+ 'gcp-sqladmin-instance',
+ 'gcp-storage-bucket',
+ ],
+ },
+ },
+ ],
+ },
+ });
+ });
+
+ it('should return the correct search query for KSPM', () => {
+ const searchFrom = new Date('2023-07-30T15:11:41.738Z');
+
+ const result = getSearchQueryByCloudSecuritySolution('kspm', searchFrom);
+
+ expect(result).toEqual({
+ bool: {
+ must: [
+ {
+ range: {
+ '@timestamp': {
+ gte: 'now-24h',
+ },
+ },
+ },
+ {
+ term: {
+ 'rule.benchmark.posture_type': 'kspm',
+ },
+ },
+ {
+ terms: {
+ 'resource.sub_type': ['Node', 'node'],
+ },
+ },
+ ],
+ },
+ });
+ });
+
+ it('should return the correct search query for CNVM', () => {
+ const searchFrom = new Date('2023-07-30T15:11:41.738Z');
+
+ const result = getSearchQueryByCloudSecuritySolution(CNVM, searchFrom);
+
+ expect(result).toEqual({
+ bool: {
+ must: [
+ {
+ range: {
+ '@timestamp': {
+ gte: 'now-24h',
+ },
+ },
+ },
+ ],
+ },
+ });
+ });
+});
+
describe('should return the relevant product tier', () => {
it('should return the relevant product tier for cloud product line', async () => {
const serverlessSecurityConfig = {
diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts
index ab7d559d13eca..714ee177212c1 100644
--- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts
+++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts
@@ -17,6 +17,7 @@ import {
KSPM,
METERING_CONFIGS,
THRESHOLD_MINUTES,
+ BILLABLE_ASSETS_CONFIG,
} from './constants';
import type { Tier, UsageRecord } from '../types';
import type {
@@ -148,11 +149,20 @@ export const getSearchQueryByCloudSecuritySolution = (
}
if (cloudSecuritySolution === CSPM || cloudSecuritySolution === KSPM) {
+ const billableAssetsConfig = BILLABLE_ASSETS_CONFIG[cloudSecuritySolution];
+
mustFilters.push({
term: {
'rule.benchmark.posture_type': cloudSecuritySolution,
},
});
+
+ // filter in only billable assets
+ mustFilters.push({
+ terms: {
+ [billableAssetsConfig.filter_attribute]: billableAssetsConfig.values,
+ },
+ });
}
return {
diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts
index 43cf1f06c47f8..66f4a1c0d1f0d 100644
--- a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts
+++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts
@@ -43,3 +43,34 @@ export const METERING_CONFIGS = {
assets_identifier: 'agent.id',
},
};
+
+// see https://github.com/elastic/security-team/issues/8970 for billable asset definition
+export const BILLABLE_ASSETS_CONFIG = {
+ [CSPM]: {
+ filter_attribute: 'resource.sub_type',
+ values: [
+ 'aws-ebs',
+ 'aws-ec2',
+ 'aws-s3',
+ 'aws-rds',
+ 'azure-disk',
+ 'azure-document-db-database-account',
+ 'azure-flexible-mysql-server-db',
+ 'azure-flexible-postgresql-server-db',
+ 'azure-mysql-server-db',
+ 'azure-postgresql-server-db',
+ 'azure-sql-server',
+ 'azure-vm',
+ 'gcp-bigquery-dataset',
+ 'gcp-bigquery-table',
+ 'gcp-compute-disk',
+ 'gcp-compute-instance',
+ 'gcp-sqladmin-instance',
+ 'gcp-storage-bucket',
+ ],
+ },
+ [KSPM]: {
+ filter_attribute: 'resource.sub_type',
+ values: ['Node', 'node'],
+ },
+};
From 8aa7606a21e25741eb131b648733c3da67a56487 Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Mon, 22 Apr 2024 12:56:15 -0400
Subject: [PATCH 038/183] [Observability Onboarding] Hide integrations grid
when search term is cleared (#180979)
## Summary
Resolves #180821.
Resolves #180813.
Resolves [#180811](https://github.com/elastic/kibana/issues/180811).
As noted in the linked issue, we want to clear the integrations list
whenever the search bar's query is empty.
### Testing
You should see the list disappear whenever the search query is empty.
Collection selection and user-entered queries should continue to operate
normally.
### Note
A possible area of improvement is the janky behavior when clearing a
large list, or as the user is entering a query. This is captured a bit
in the attached GIF. I played with using the `visibility` property of
the list's container but this has the opposite negative side effect of
causing the page to stay very large when the list is hidden.
![20240416162832](https://github.com/elastic/kibana/assets/18429259/d8f01ec5-5cfa-42c3-9e30-a7c1dcf0dd37)
---------
Co-authored-by: Joe Reuter
---
.../use_custom_cards_for_category.ts | 4 ++--
.../application/packages_list/index.tsx | 20 +++++--------------
.../public/application/packages_list/utils.ts | 2 +-
3 files changed, 8 insertions(+), 18 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
index f6031ce97f159..a9cc265b753af 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
@@ -132,11 +132,11 @@ export function useCustomCardsForCategory(
integration: '',
},
{
- id: 'logs-logs',
+ id: 'custom-logs',
type: 'generated',
title: 'Stream log files',
description: 'Stream any logs into Elastic in a simple way and explore their data',
- name: 'logs-logs-generated',
+ name: 'custom-logs-generated',
categories: ['observability'],
icons: [
{
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index 77d38e1159608..85627f9411bf3 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { EuiButton, EuiCallOut, EuiSearchBar, EuiSkeletonText } from '@elastic/eui';
import { css } from '@emotion/react';
-import React, { useRef, Suspense, useState } from 'react';
+import React, { useRef, Suspense } from 'react';
import useAsyncRetry from 'react-use/lib/useAsyncRetry';
import { PackageList, fetchAvailablePackagesHook } from './lazy';
import { useIntegrationCardList } from './use_integration_card_list';
@@ -54,7 +54,6 @@ const PackageListGridWrapper = ({
customCards,
joinCardLists = false,
}: WrapperProps) => {
- const [isInitialHidden, setIsInitialHidden] = useState(showSearchBar);
const customMargin = useCustomMargin();
const { filteredCards, isLoading } = useAvailablePackages({
prereleaseIntegrationsEnabled: false,
@@ -67,15 +66,9 @@ const PackageListGridWrapper = ({
joinCardLists
);
- React.useEffect(() => {
- if (isInitialHidden && searchQuery) {
- setIsInitialHidden(false);
- }
- }, [searchQuery, isInitialHidden]);
+ if (isLoading) return ;
- if (!isInitialHidden && isLoading) return ;
-
- const showPackageList = (showSearchBar && !isInitialHidden) || showSearchBar === false;
+ const showPackageList = (showSearchBar && !!searchQuery) || showSearchBar === false;
return (
}>
@@ -91,12 +84,9 @@ const PackageListGridWrapper = ({
incremental: true,
}}
onChange={(arg) => {
- if (setSearchQuery) {
- setSearchQuery(arg.queryText);
- }
- setIsInitialHidden(false);
+ setSearchQuery?.(arg.queryText);
}}
- query={searchQuery}
+ query={searchQuery ?? ''}
/>
)}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
index 014aa4314f104..22552f9df44fa 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
@@ -7,7 +7,7 @@
import { IntegrationCardItem } from '@kbn/fleet-plugin/public';
-export const QUICKSTART_FLOWS = ['kubernetes', 'nginx', 'system-logs-generated'];
+export const QUICKSTART_FLOWS = ['system-logs-generated', 'custom-logs-generated'];
export const toCustomCard = (card: IntegrationCardItem) => ({
...card,
From 98c596a5e135ec1a55078d92b2482c6ee7c7be8e Mon Sep 17 00:00:00 2001
From: Angela Chuang <6295984+angorayc@users.noreply.github.com>
Date: Mon, 22 Apr 2024 18:39:31 +0100
Subject: [PATCH 039/183] [SecuritySolution] Reveal data quality entry on the
side-nav in serverless (#180816)
## Summary
Test env
serverless:
https://p.elstc.co/paste/4JjGBmXv#Yogkkphe2hFyBRWIhsAZ3ivsvAve4TJkS2BzOqPQp3w
~ESS:
https://p.elstc.co/paste/EsCQBV7V#P18h4HGLZkrPm66+KB2WVH6srVwDwXqVsciQDtI8vbc~
https://github.com/elastic/kibana/assets/6295984/5776c9c2-2957-480e-8a2c-fdd687cdebc5
We can merge this PR once all the dependencies are merged.
dependencies:
1. https://github.com/elastic/kibana/pull/179666
2. https://github.com/elastic/elasticsearch-serverless/pull/1482
3. ~https://github.com/elastic/elasticsearch-serverless/pull/1705~
4. https://github.com/elastic/elasticsearch-serverless/pull/1753
Steps to verify:
0. Enable Docker
1. Start serverless ES with the commit where the stats api was merged:
```
yarn es serverless --projectType security --tag git-2eb724699bc0
```
start Kibana
```
yarn serverless-security --no-base-path
```
2. ~Endable the settings~ This step in no longer needed.
```
curl -u {YOUR_ELASTIC_USERNAME}:{ELASTIC_PASSWORD} -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"persistent" : {
"metering.index-info-task.enabled" : true
}
}
```
3. In Kibana dev tool, add some testing data:
```
PUT my-test-index
PUT my-test-index/_mapping
{
"properties": {
"@timestamp": {
"type": "date"
},
"agent.type": {
"type": "constant_keyword"
},
"event.category": {
"type": "constant_keyword"
}
}
}
POST my-test-index/_doc
{
"@timestamp": "2024-04-22T09:41:49.668Z",
"host": {
"name": "foo"
},
"event": {
"category": "an_invalid_category"
},
"some.field": "this",
"source": {
"port": 90210,
"ip": "10.1.2.3"
}
}
POST my-test-index/_doc
{
"@timestamp": "2024-04-22T09:42:22.123Z",
"host": {
"name": "bar"
},
"event": {
"category": "an_invalid_category"
},
"some.field": "space",
"source": {
"port": 867,
"ip": "10.9.8.7"
}
}
```
5. Go to
/app/management/kibana/dataViews/dataView/security-solution-default ,
and add `my-test-*` to default index pattern
6. Go to `/app/security/data_quality` and verify that there's no doc
size in the dashboard. Dashboard and treemap render correctly.
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Sergi Massaneda
---
.../index_properties/index.tsx | 2 +-
.../summary_table/helpers.test.tsx | 20 ++++++++
.../summary_table/helpers.tsx | 47 +++++++++----------
.../impl/data_quality/types.ts | 2 +-
.../data_quality/use_results_rollup/index.tsx | 4 +-
.../lib/data_stream/results_field_map.ts | 4 +-
.../server/schemas/result.ts | 4 +-
.../solution_navigation/links/app_links.ts | 8 +---
.../telemetry/events/data_quality/types.ts | 2 +-
9 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/index_properties/index.tsx b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/index_properties/index.tsx
index 0f2fc4b2d44b2..9a00f588a15d7 100644
--- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/index_properties/index.tsx
+++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/index_properties/index.tsx
@@ -270,7 +270,7 @@ const IndexPropertiesComponent: React.FC = ({
};
updatePatternRollup(updatedRollup);
- if (indexId && requestTime != null && requestTime > 0 && partitionedFieldMetadata) {
+ if (indexName && requestTime != null && requestTime > 0 && partitionedFieldMetadata) {
const report = {
batchId: uuidv4(),
ecsVersion: EcsVersion,
diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.test.tsx b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.test.tsx
index 673a74e357b66..f79c64ab0387c 100644
--- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.test.tsx
+++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.test.tsx
@@ -22,6 +22,7 @@ import {
getShowPagination,
getSummaryTableColumns,
getSummaryTableILMPhaseColumn,
+ getSummaryTableSizeInBytesColumn,
getToggleButtonId,
IndexSummaryTableItem,
} from './helpers';
@@ -468,6 +469,25 @@ describe('helpers', () => {
});
});
+ describe('getSummaryTableSizeInBytesColumn', () => {
+ test('it returns the expected column configuration when `isILMAvailable` is true', () => {
+ const column = getSummaryTableSizeInBytesColumn({
+ isILMAvailable: true,
+ formatBytes: jest.fn(),
+ });
+ expect(column.length).toEqual(1);
+ expect(column[0].name).toEqual('Size');
+ });
+
+ test('it returns an emptry array when `isILMAvailable` is false', () => {
+ const column = getSummaryTableSizeInBytesColumn({
+ isILMAvailable: false,
+ formatBytes: jest.fn(),
+ });
+ expect(column.length).toEqual(0);
+ });
+ });
+
describe('ilmPhase column render()', () => {
test('it renders the expected ilmPhase badge content', () => {
const columns = getSummaryTableColumns({
diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.tsx b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.tsx
index 6d135477b9af3..07c4335c0cd17 100644
--- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.tsx
+++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/data_quality_panel/summary_table/helpers.tsx
@@ -121,23 +121,29 @@ export const getSummaryTableILMPhaseColumn = (
: [];
export const getSummaryTableSizeInBytesColumn = ({
+ isILMAvailable,
formatBytes,
}: {
+ isILMAvailable: boolean;
formatBytes: (value: number | undefined) => string;
-}): Array> => [
- {
- field: 'sizeInBytes',
- name: i18n.SIZE,
- render: (_, { sizeInBytes }) =>
- Number.isInteger(sizeInBytes) ? (
-
- {formatBytes(sizeInBytes)}
-
- ) : null,
- sortable: true,
- truncateText: false,
- },
-];
+}): Array> =>
+ isILMAvailable
+ ? [
+ {
+ field: 'sizeInBytes',
+ name: i18n.SIZE,
+ render: (_, { sizeInBytes }) =>
+ Number.isInteger(sizeInBytes) ? (
+
+ {formatBytes(sizeInBytes)}
+
+ ) : null,
+ sortable: true,
+ truncateText: false,
+ },
+ ]
+ : [];
+
export const getSummaryTableColumns = ({
formatBytes,
formatNumber,
@@ -247,18 +253,7 @@ export const getSummaryTableColumns = ({
truncateText: false,
},
...getSummaryTableILMPhaseColumn(isILMAvailable),
- {
- field: 'sizeInBytes',
- name: i18n.SIZE,
- render: (_, { sizeInBytes }) =>
- Number.isInteger(sizeInBytes) ? (
-
- {formatBytes(sizeInBytes)}
-
- ) : null,
- sortable: true,
- truncateText: false,
- },
+ ...getSummaryTableSizeInBytesColumn({ isILMAvailable, formatBytes }),
{
field: 'checkedAt',
name: i18n.LAST_CHECK,
diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/types.ts b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/types.ts
index 8ebb273a2b4b8..bd551d80f531b 100644
--- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/types.ts
+++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/types.ts
@@ -199,7 +199,7 @@ export interface MeteringIndicesStatsResponse {
export type DataQualityIndexCheckedParams = DataQualityCheckAllCompletedParams & {
errorCount?: number;
ilmPhase?: string;
- indexId?: string;
+ indexId?: string | null;
indexName: string;
sameFamilyFields?: string[];
unallowedMappingFields?: string[];
diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/use_results_rollup/index.tsx b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/use_results_rollup/index.tsx
index 8a96e3b975cd6..7a53eedc3c562 100644
--- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/use_results_rollup/index.tsx
+++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/use_results_rollup/index.tsx
@@ -185,10 +185,8 @@ export const useResultsRollup = ({ ilmPhases, patterns }: Props): UseResultsRoll
const indexId = getIndexId({ indexName, stats });
if (
- indexId != null &&
stats &&
results &&
- ilmExplain &&
requestTime != null &&
requestTime > 0 &&
partitionedFieldMetadata
@@ -197,7 +195,7 @@ export const useResultsRollup = ({ ilmPhases, patterns }: Props): UseResultsRoll
batchId,
ecsVersion: EcsVersion,
errorCount: error ? 1 : 0,
- ilmPhase: getIlmPhase(ilmExplain[indexName], isILMAvailable),
+ ilmPhase: getIlmPhase(ilmExplain?.[indexName], isILMAvailable),
indexId,
indexName,
isCheckAll: true,
diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts
index 7a472b0a96502..a8d4fadb72ca1 100644
--- a/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts
+++ b/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts
@@ -24,9 +24,9 @@ export const resultsFieldMap: FieldMap = {
unallowedMappingFields: { type: 'keyword', required: true, array: true },
unallowedValueFields: { type: 'keyword', required: true, array: true },
sizeInBytes: { type: 'long', required: true },
- ilmPhase: { type: 'keyword', required: true },
+ ilmPhase: { type: 'keyword', required: false },
markdownComments: { type: 'text', required: true, array: true },
ecsVersion: { type: 'keyword', required: true },
- indexId: { type: 'keyword', required: true },
+ indexId: { type: 'keyword', required: false },
error: { type: 'text', required: false },
};
diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts
index 590147fbcf89e..9e8b7540bf2e5 100644
--- a/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts
+++ b/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts
@@ -22,16 +22,16 @@ const ResultDocumentInterface = t.interface({
unallowedMappingFields: t.array(t.string),
unallowedValueFields: t.array(t.string),
sizeInBytes: t.number,
- ilmPhase: t.string,
markdownComments: t.array(t.string),
ecsVersion: t.string,
- indexId: t.string,
error: t.union([t.string, t.null]),
});
const ResultDocumentOptional = t.partial({
indexPattern: t.string,
checkedBy: t.string,
+ indexId: t.string,
+ ilmPhase: t.string,
});
export const ResultDocument = t.intersection([ResultDocumentInterface, ResultDocumentOptional]);
diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts
index f7ed8cbc6036f..3107bb93de269 100644
--- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts
+++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts
@@ -6,7 +6,7 @@
*/
import { SecurityPageName } from '@kbn/security-solution-navigation';
-import { cloneDeep, find, remove } from 'lodash';
+import { cloneDeep, remove } from 'lodash';
import type { AppLinkItems, LinkItem } from '../../../common/links/types';
import { createInvestigationsLinkFromTimeline } from './sections/investigations_links';
import { mlAppLink } from './sections/ml_links';
@@ -26,12 +26,6 @@ export const solutionAppLinksSwitcher = (appLinks: AppLinkItems): AppLinkItems =
solutionAppLinks.push(createInvestigationsLinkFromTimeline(timelineLinkItem));
}
- // Remove data quality dashboard link
- const dashboardLinkItem = find(solutionAppLinks, { id: SecurityPageName.dashboards });
- if (dashboardLinkItem && dashboardLinkItem.links) {
- remove(dashboardLinkItem.links, { id: SecurityPageName.dataQuality });
- }
-
// Remove manage link
const [manageLinkItem] = remove(solutionAppLinks, { id: SecurityPageName.administration });
diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/data_quality/types.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/data_quality/types.ts
index 8e24420aa0499..2b31e6cefea4f 100644
--- a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/data_quality/types.ts
+++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/data_quality/types.ts
@@ -11,7 +11,7 @@ import type { TelemetryEventTypes } from '../../constants';
export type ReportDataQualityIndexCheckedParams = ReportDataQualityCheckAllCompletedParams & {
errorCount?: number;
ilmPhase?: string;
- indexId?: string;
+ indexId?: string | null;
indexName: string;
sameFamilyFields?: string[];
unallowedMappingFields?: string[];
From 9ea94d10b6588c93fea9cd08bfbc73f017b0c76c Mon Sep 17 00:00:00 2001
From: christineweng <18648970+christineweng@users.noreply.github.com>
Date: Mon, 22 Apr 2024 13:29:03 -0500
Subject: [PATCH 040/183] [Security Solution][Alert Details] Fix alert flyout
reseting to overview tab (#181202)
## Summary
This PR fixes a bug introduced by
https://github.com/elastic/kibana/pull/180318.
If user has not completed the flyout tour and click exit. Upon refresh,
the tabs in alerts flyout always reset to overview. This is because the
tour step is stuck in step 1 and it will keep calling `goToOverview` tab
to start the tour. This PR adds additional guard to check the tour is
active before navigating.
---
.../flyout/document_details/shared/components/flyout_tour.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/flyout_tour.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/flyout_tour.tsx
index 05e6813802642..c5ee76ca558a9 100644
--- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/flyout_tour.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/flyout_tour.tsx
@@ -68,7 +68,7 @@ export const FlyoutTour: FC = ({
useEffect(() => {
storage.set(NEW_FEATURES_TOUR_STORAGE_KEYS.FLYOUT, tourState);
- if (tourState.currentTourStep === 1 && goToOverviewTab) {
+ if (tourState.isTourActive && tourState.currentTourStep === 1 && goToOverviewTab) {
goToOverviewTab();
}
}, [storage, tourState, goToOverviewTab]);
From 6b0e38ad4e98e37646f311f80fa1a9273d475790 Mon Sep 17 00:00:00 2001
From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com>
Date: Mon, 22 Apr 2024 14:33:53 -0400
Subject: [PATCH 041/183] [Security Solution][Endpoint] SentinelOne API support
for `get-file` response action (#180856)
## Summary
With this PR:
- Adds API support for `get-file` for SentinelOne agent types
- New feature flag to gate this functionality -
`responseActionsSentinelOneGetFileEnabled`
---
.../is_response_action_supported.ts | 12 +-
.../service/response_actions/sentinel_one.ts | 6 +
.../common/endpoint/types/sentinel_one.ts | 10 +
.../common/experimental_features.ts | 3 +
.../actions/clients/sentinelone/mocks.ts | 63 ++++-
.../sentinel_one_actions_client.test.ts | 241 ++++++++++++++++--
.../sentinel_one_actions_client.ts | 206 ++++++++++++---
7 files changed, 479 insertions(+), 62 deletions(-)
diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts
index 106b48706fac2..31dd195f00e03 100644
--- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts
@@ -92,7 +92,7 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = {
},
unisolate: {
automated: {
- endpoint: true,
+ endpoint: false,
sentinel_one: false,
},
manual: {
@@ -102,7 +102,7 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = {
},
upload: {
automated: {
- endpoint: true,
+ endpoint: false,
sentinel_one: false,
},
manual: {
@@ -112,12 +112,12 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = {
},
'get-file': {
automated: {
- endpoint: true,
+ endpoint: false,
sentinel_one: false,
},
manual: {
endpoint: true,
- sentinel_one: false,
+ sentinel_one: true,
},
},
'kill-process': {
@@ -132,7 +132,7 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = {
},
execute: {
automated: {
- endpoint: true,
+ endpoint: false,
sentinel_one: false,
},
manual: {
@@ -152,7 +152,7 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = {
},
'running-processes': {
automated: {
- endpoint: true,
+ endpoint: false,
sentinel_one: false,
},
manual: {
diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/sentinel_one.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/sentinel_one.ts
index 761e1de67cd28..55892e16392ca 100644
--- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/sentinel_one.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/sentinel_one.ts
@@ -9,3 +9,9 @@
* Index name where the SentinelOne activity log is written to by the SentinelOne integration
*/
export const SENTINEL_ONE_ACTIVITY_INDEX = 'logs-sentinel_one.activity-default';
+
+/**
+ * The passcode to be used when initiating actions in SentinelOne that require a passcode to be
+ * set for the resulting zip file
+ */
+export const SENTINEL_ONE_ZIP_PASSCODE = 'Elastic@123';
diff --git a/x-pack/plugins/security_solution/common/endpoint/types/sentinel_one.ts b/x-pack/plugins/security_solution/common/endpoint/types/sentinel_one.ts
index 447fc6d037a2b..c7e0b1d9a4581 100644
--- a/x-pack/plugins/security_solution/common/endpoint/types/sentinel_one.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/types/sentinel_one.ts
@@ -53,3 +53,13 @@ export interface SentinelOneIsolationResponseMeta {
/** The SentinelOne activity log primary description */
activityLogEntryDescription: string;
}
+
+export interface SentinelOneGetFileRequestMeta extends SentinelOneActionRequestCommonMeta {
+ /** The SentinelOne activity log entry id for the Get File request */
+ activityId: string;
+ /**
+ * The command batch UUID is a value that appears in both the Request and the Response, thus it
+ * is stored in the request to facilitate locating the response later by the background task
+ */
+ commandBatchUuid: string;
+}
diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts
index 7bd1834513e30..6004c15b222c5 100644
--- a/x-pack/plugins/security_solution/common/experimental_features.ts
+++ b/x-pack/plugins/security_solution/common/experimental_features.ts
@@ -85,6 +85,9 @@ export const allowedExperimentalValues = Object.freeze({
*/
responseActionsSentinelOneV2Enabled: false,
+ /** Enables the `get-file` response action for SentinelOne */
+ responseActionsSentinelOneGetFileEnabled: false,
+
/**
* 8.15
* Enables use of agent status service to get agent status information
diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts
index bb51ebe917c6d..0971ed7045655 100644
--- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts
+++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts
@@ -5,7 +5,10 @@
* 2.0.
*/
-import type { SentinelOneGetAgentsResponse } from '@kbn/stack-connectors-plugin/common/sentinelone/types';
+import type {
+ SentinelOneGetAgentsResponse,
+ SentinelOneGetActivitiesResponse,
+} from '@kbn/stack-connectors-plugin/common/sentinelone/types';
import {
SENTINELONE_CONNECTOR_ID,
SUB_ACTION,
@@ -127,6 +130,58 @@ const createSentinelOneAgentDetailsMock = (
);
};
+const createSentinelOneGetActivitiesApiResponseMock = (): SentinelOneGetActivitiesResponse => {
+ return {
+ errors: undefined,
+ pagination: {
+ nextCursor: null,
+ totalItems: 1,
+ },
+ data: [
+ {
+ accountId: '1392053568574369781',
+ accountName: 'Elastic',
+ activityType: 81,
+ activityUuid: 'ee9227f5-8f59-4f6d-bd46-3b74f93fd939',
+ agentId: '1913920934584665209',
+ agentUpdatedVersion: null,
+ comments: null,
+ createdAt: '2024-04-16T19:21:08.492444Z',
+ data: {
+ accountName: 'Elastic',
+ commandBatchUuid: '7011777f-77e7-4a01-a674-e5f767808895',
+ computerName: 'ptavares-sentinelone-1371',
+ externalIp: '108.77.84.191',
+ fullScopeDetails: 'Group Default Group in Site Default site of Account Elastic',
+ fullScopeDetailsPath: 'Global / Elastic / Default site / Default Group',
+ groupName: 'Default Group',
+ groupType: 'Manual',
+ ipAddress: '108.77.84.191',
+ scopeLevel: 'Group',
+ scopeName: 'Default Group',
+ siteName: 'Default site',
+ username: 'Defend Workflows Automation',
+ uuid: 'c06d63d9-9fa2-046d-e91e-dc94cf6695d8',
+ },
+ description: null,
+ groupId: '1392053568591146999',
+ groupName: 'Default Group',
+ hash: null,
+ id: '1929937418124016884',
+ osFamily: null,
+ primaryDescription:
+ 'The management user Defend Workflows Automation initiated a fetch file command to the agent ptavares-sentinelone-1371 (108.77.84.191).',
+ secondaryDescription: 'IP address: 108.77.84.191',
+ siteId: '1392053568582758390',
+ siteName: 'Default site',
+ threatId: null,
+ updatedAt: '2024-04-16T19:21:08.492450Z',
+ userId: '1796254913836217560',
+ },
+ ],
+ };
+};
+
const createSentinelOneGetAgentsApiResponseMock = (
data: SentinelOneGetAgentsResponse['data'] = [createSentinelOneAgentDetailsMock()]
): SentinelOneGetAgentsResponse => {
@@ -165,6 +220,11 @@ const createConnectorActionsClientMock = (): ActionsClientMock => {
data: createSentinelOneGetAgentsApiResponseMock(),
});
+ case SUB_ACTION.GET_ACTIVITIES:
+ return responseActionsClientMock.createConnectorActionExecuteResponse({
+ data: createSentinelOneGetActivitiesApiResponseMock(),
+ });
+
default:
return responseActionsClientMock.createConnectorActionExecuteResponse();
}
@@ -188,4 +248,5 @@ export const sentinelOneMock = {
createSentinelOneAgentDetails: createSentinelOneAgentDetailsMock,
createConnectorActionsClient: createConnectorActionsClientMock,
createConstructorOptions: createConstructorOptionsMock,
+ createSentinelOneActivitiesApiResponse: createSentinelOneGetActivitiesApiResponseMock,
};
diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts
index 9d96ca462c53d..00a84b5495464 100644
--- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts
+++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts
@@ -29,6 +29,9 @@ import type {
SentinelOneIsolationRequestMeta,
} from '../../../../../../common/endpoint/types';
import type { SearchHit } from '@elastic/elasticsearch/lib/api/types';
+import type { ResponseActionGetFileRequestBody } from '../../../../../../common/api/endpoint';
+import { SENTINEL_ONE_ZIP_PASSCODE } from '../../../../../../common/endpoint/service/response_actions/sentinel_one';
+import { SUB_ACTION } from '@kbn/stack-connectors-plugin/common/sentinelone/constants';
jest.mock('../../action_details_by_id', () => {
const originalMod = jest.requireActual('../../action_details_by_id');
@@ -59,22 +62,14 @@ describe('SentinelOneActionsClient class', () => {
s1ActionsClient = new SentinelOneActionsClient(classConstructorOptions);
});
- it.each([
- 'killProcess',
- 'suspendProcess',
- 'runningProcesses',
- 'getFile',
- 'execute',
- 'upload',
- ] as Array)(
- 'should throw an un-supported error for %s',
- async (methodName) => {
- // @ts-expect-error Purposely passing in empty object for options
- await expect(s1ActionsClient[methodName]({})).rejects.toBeInstanceOf(
- ResponseActionsNotSupportedError
- );
- }
- );
+ it.each(['killProcess', 'suspendProcess', 'runningProcesses', 'execute', 'upload'] as Array<
+ keyof ResponseActionsClient
+ >)('should throw an un-supported error for %s', async (methodName) => {
+ // @ts-expect-error Purposely passing in empty object for options
+ await expect(s1ActionsClient[methodName]({})).rejects.toBeInstanceOf(
+ ResponseActionsNotSupportedError
+ );
+ });
it('should error if multiple agent ids are received', async () => {
const payload = createS1IsolationOptions();
@@ -560,4 +555,218 @@ describe('SentinelOneActionsClient class', () => {
});
});
});
+
+ describe('#getFile()', () => {
+ let getFileReqOptions: ResponseActionGetFileRequestBody;
+
+ beforeEach(() => {
+ // @ts-expect-error readonly prop assignment
+ classConstructorOptions.endpointService.experimentalFeatures.responseActionsSentinelOneGetFileEnabled =
+ true;
+
+ getFileReqOptions = responseActionsClientMock.createGetFileOptions();
+ });
+
+ it('should error if feature flag is not enabled', async () => {
+ // @ts-expect-error readonly prop assignment
+ classConstructorOptions.endpointService.experimentalFeatures.responseActionsSentinelOneGetFileEnabled =
+ false;
+
+ await expect(s1ActionsClient.getFile(getFileReqOptions)).rejects.toHaveProperty(
+ 'message',
+ 'get-file not supported for sentinel_one agent type. Feature disabled'
+ );
+ });
+
+ it('should call the fetch agent files connector method with expected params', async () => {
+ await s1ActionsClient.getFile(getFileReqOptions);
+
+ expect(connectorActionsMock.execute).toHaveBeenCalledWith({
+ params: {
+ subAction: SUB_ACTION.FETCH_AGENT_FILES,
+ subActionParams: {
+ agentUUID: '1-2-3',
+ files: [getFileReqOptions.parameters.path],
+ zipPassCode: SENTINEL_ONE_ZIP_PASSCODE,
+ },
+ },
+ });
+ });
+
+ it('should throw if sentinelone api generated an error (manual mode)', async () => {
+ const executeMockFn = (connectorActionsMock.execute as jest.Mock).getMockImplementation();
+ const err = new Error('oh oh');
+ (connectorActionsMock.execute as jest.Mock).mockImplementation(async (options) => {
+ if (options.params.subAction === SUB_ACTION.FETCH_AGENT_FILES) {
+ throw err;
+ }
+ return executeMockFn!(options);
+ });
+
+ await expect(s1ActionsClient.getFile(getFileReqOptions)).rejects.toEqual(err);
+ await expect(connectorActionsMock.execute).not.toHaveBeenCalledWith({
+ params: expect.objectContaining({
+ subAction: SUB_ACTION.GET_ACTIVITIES,
+ }),
+ });
+ });
+
+ it('should create failed response action when calling sentinelone api generated an error (automated mode)', async () => {
+ const subActionsClient = sentinelOneMock.createConnectorActionsClient();
+ classConstructorOptions = sentinelOneMock.createConstructorOptions();
+ classConstructorOptions.isAutomated = true;
+ classConstructorOptions.connectorActions =
+ responseActionsClientMock.createNormalizedExternalConnectorClient(subActionsClient);
+ connectorActionsMock = classConstructorOptions.connectorActions;
+ // @ts-expect-error readonly prop assignment
+ classConstructorOptions.endpointService.experimentalFeatures.responseActionsSentinelOneGetFileEnabled =
+ true;
+ s1ActionsClient = new SentinelOneActionsClient(classConstructorOptions);
+
+ const executeMockFn = (subActionsClient.execute as jest.Mock).getMockImplementation();
+ const err = new Error('oh oh');
+ (subActionsClient.execute as jest.Mock).mockImplementation(async (options) => {
+ if (options.params.subAction === SUB_ACTION.FETCH_AGENT_FILES) {
+ throw err;
+ }
+ return executeMockFn!.call(SentinelOneActionsClient.prototype, options);
+ });
+
+ await expect(s1ActionsClient.getFile(getFileReqOptions)).resolves.toBeTruthy();
+ expect(classConstructorOptions.esClient.index).toHaveBeenCalledWith(
+ {
+ document: {
+ '@timestamp': expect.any(String),
+ EndpointActions: {
+ action_id: expect.any(String),
+ data: {
+ command: 'get-file',
+ comment: 'test comment',
+ parameters: {
+ path: '/some/file',
+ },
+ hosts: {
+ '1-2-3': {
+ name: 'sentinelone-1460',
+ },
+ },
+ },
+ expiration: expect.any(String),
+ input_type: 'sentinel_one',
+ type: 'INPUT_ACTION',
+ },
+ agent: { id: ['1-2-3'] },
+ user: { id: 'foo' },
+ error: {
+ // The error message here is "not supported" because `get-file` is not currently supported
+ // for automated response actions. if that changes in the future the message below should
+ // be changed to `err.message` (`err` is defined and used in the mock setup above)
+ message: 'Action [get-file] not supported',
+ },
+ meta: {
+ agentId: '1845174760470303882',
+ agentUUID: '1-2-3',
+ hostName: 'sentinelone-1460',
+ },
+ },
+ index: ENDPOINT_ACTIONS_INDEX,
+ refresh: 'wait_for',
+ },
+ { meta: true }
+ );
+ });
+
+ it('should query for the activity log entry record after successful submit of action', async () => {
+ await s1ActionsClient.getFile(getFileReqOptions);
+
+ expect(connectorActionsMock.execute).toHaveBeenNthCalledWith(3, {
+ params: {
+ subAction: SUB_ACTION.GET_ACTIVITIES,
+ subActionParams: {
+ activityTypes: '81',
+ limit: 1,
+ sortBy: 'createdAt',
+ sortOrder: 'asc',
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ createdAt__gte: expect.any(String),
+ agentIds: '1845174760470303882',
+ },
+ },
+ });
+ });
+
+ it('should create action request ES document with expected meta content', async () => {
+ await s1ActionsClient.getFile(getFileReqOptions);
+
+ expect(classConstructorOptions.esClient.index).toHaveBeenCalledWith(
+ {
+ document: {
+ '@timestamp': expect.any(String),
+ EndpointActions: {
+ action_id: expect.any(String),
+ data: {
+ command: 'get-file',
+ comment: 'test comment',
+ parameters: {
+ path: '/some/file',
+ },
+ hosts: {
+ '1-2-3': {
+ name: 'sentinelone-1460',
+ },
+ },
+ },
+ expiration: expect.any(String),
+ input_type: 'sentinel_one',
+ type: 'INPUT_ACTION',
+ },
+ agent: { id: ['1-2-3'] },
+ user: { id: 'foo' },
+ meta: {
+ agentId: '1845174760470303882',
+ agentUUID: '1-2-3',
+ hostName: 'sentinelone-1460',
+ activityId: '1929937418124016884',
+ commandBatchUuid: '7011777f-77e7-4a01-a674-e5f767808895',
+ },
+ },
+ index: ENDPOINT_ACTIONS_INDEX,
+ refresh: 'wait_for',
+ },
+ { meta: true }
+ );
+ });
+
+ it('should return action details', async () => {
+ await expect(s1ActionsClient.getFile(getFileReqOptions)).resolves.toEqual(
+ // Only validating that a ActionDetails is returned. The data is mocked,
+ // so it does not make sense to validate the property values
+ {
+ action: expect.any(String),
+ agentState: expect.any(Object),
+ agentType: expect.any(String),
+ agents: expect.any(Array),
+ command: expect.any(String),
+ comment: expect.any(String),
+ createdBy: expect.any(String),
+ hosts: expect.any(Object),
+ id: expect.any(String),
+ isCompleted: expect.any(Boolean),
+ isExpired: expect.any(Boolean),
+ outputs: expect.any(Object),
+ startedAt: expect.any(String),
+ status: expect.any(String),
+ wasSuccessful: expect.any(Boolean),
+ }
+ );
+ });
+
+ it('should update cases', async () => {
+ await s1ActionsClient.getFile(
+ responseActionsClientMock.createGetFileOptions({ case_ids: ['case-1'] })
+ );
+
+ expect(classConstructorOptions.casesClient?.attachments.bulkCreate).toHaveBeenCalled();
+ });
+ });
});
diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts
index f70305e4bac07..bf2c04940a549 100644
--- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts
+++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts
@@ -14,15 +14,18 @@ import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common';
import type {
SentinelOneGetAgentsParams,
SentinelOneGetAgentsResponse,
+ SentinelOneGetActivitiesParams,
+ SentinelOneGetActivitiesResponse,
} from '@kbn/stack-connectors-plugin/common/sentinelone/types';
import type {
QueryDslQueryContainer,
SearchHit,
SearchRequest,
} from '@elastic/elasticsearch/lib/api/types';
+import { SENTINEL_ONE_ZIP_PASSCODE } from '../../../../../../common/endpoint/service/response_actions/sentinel_one';
import type {
- NormalizedExternalConnectorClientExecuteOptions,
NormalizedExternalConnectorClient,
+ NormalizedExternalConnectorClientExecuteOptions,
} from '../lib/normalized_external_connector_client';
import { SENTINEL_ONE_ACTIVITY_INDEX } from '../../../../../../common';
import { catchAndWrapError } from '../../../../utils';
@@ -42,12 +45,18 @@ import type {
EndpointActionResponseDataOutput,
LogsEndpointAction,
LogsEndpointActionResponse,
+ ResponseActionGetFileOutputContent,
+ ResponseActionGetFileParameters,
SentinelOneActionRequestCommonMeta,
SentinelOneActivityEsDoc,
+ SentinelOneGetFileRequestMeta,
SentinelOneIsolationRequestMeta,
SentinelOneIsolationResponseMeta,
} from '../../../../../../common/endpoint/types';
-import type { IsolationRouteRequestBody } from '../../../../../../common/api/endpoint';
+import type {
+ IsolationRouteRequestBody,
+ ResponseActionGetFileRequestBody,
+} from '../../../../../../common/api/endpoint';
import type {
ResponseActionsClientOptions,
ResponseActionsClientValidateRequestResponse,
@@ -69,6 +78,48 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
connectorActions.setup(SENTINELONE_CONNECTOR_ID);
}
+ private async handleResponseActionCreation<
+ TParameters extends EndpointActionDataParameterTypes = EndpointActionDataParameterTypes,
+ TOutputContent extends EndpointActionResponseDataOutput = EndpointActionResponseDataOutput,
+ TMeta extends {} = {}
+ >(
+ reqIndexOptions: ResponseActionsClientWriteActionRequestToEndpointIndexOptions<
+ TParameters,
+ TOutputContent,
+ Partial
+ >
+ ): Promise<{
+ actionEsDoc: LogsEndpointAction;
+ actionDetails: ActionDetails;
+ }> {
+ const actionRequestDoc = await this.writeActionRequestToEndpointIndex<
+ TParameters,
+ TOutputContent,
+ TMeta
+ >(reqIndexOptions);
+
+ await this.updateCases({
+ command: reqIndexOptions.command,
+ caseIds: reqIndexOptions.case_ids,
+ alertIds: reqIndexOptions.alert_ids,
+ actionId: actionRequestDoc.EndpointActions.action_id,
+ hosts: reqIndexOptions.endpoint_ids.map((agentId) => {
+ return {
+ hostId: agentId,
+ hostname: actionRequestDoc.EndpointActions.data.hosts?.[agentId].name ?? '',
+ };
+ }),
+ comment: reqIndexOptions.comment,
+ });
+
+ return {
+ actionEsDoc: actionRequestDoc,
+ actionDetails: await this.fetchActionDetails>(
+ actionRequestDoc.EndpointActions.action_id
+ ),
+ };
+ }
+
protected async writeActionRequestToEndpointIndex<
TParameters extends EndpointActionDataParameterTypes = EndpointActionDataParameterTypes,
TOutputContent extends EndpointActionResponseDataOutput = EndpointActionResponseDataOutput,
@@ -77,7 +128,7 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
actionRequest: ResponseActionsClientWriteActionRequestToEndpointIndexOptions<
TParameters,
TOutputContent,
- TMeta
+ Partial // Partial<> because the common Meta properties are actually set in this method for all requests
>
): Promise<
LogsEndpointAction
@@ -110,10 +161,10 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
* Sends actions to SentinelOne directly (via Connector)
* @private
*/
- private async sendAction(
+ private async sendAction(
actionType: SUB_ACTION,
actionParams: object
- ): Promise> {
+ ): Promise> {
const executeOptions: Parameters[0] = {
params: {
subAction: actionType,
@@ -141,7 +192,7 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
this.log.debug(`Response:\n${stringify(actionSendResponse)}`);
- return actionSendResponse;
+ return actionSendResponse as ActionTypeExecutorResult;
}
/** Gets agent details directly from SentinelOne */
@@ -174,7 +225,7 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
s1ApiResponse = response.data;
} catch (err) {
throw new ResponseActionsClientError(
- `Error while attempting to retrieve SentinelOne host with agent id [${agentUUID}]`,
+ `Error while attempting to retrieve SentinelOne host with agent id [${agentUUID}]: ${err.message}`,
500,
err
);
@@ -236,21 +287,8 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
}
}
- const actionRequestDoc = await this.writeActionRequestToEndpointIndex(reqIndexOptions);
-
- await this.updateCases({
- command: reqIndexOptions.command,
- caseIds: reqIndexOptions.case_ids,
- alertIds: reqIndexOptions.alert_ids,
- actionId: actionRequestDoc.EndpointActions.action_id,
- hosts: actionRequest.endpoint_ids.map((agentId) => {
- return {
- hostId: agentId,
- hostname: actionRequestDoc.EndpointActions.data.hosts?.[agentId].name ?? '',
- };
- }),
- comment: reqIndexOptions.comment,
- });
+ const { actionDetails, actionEsDoc: actionRequestDoc } =
+ await this.handleResponseActionCreation(reqIndexOptions);
if (
!actionRequestDoc.error &&
@@ -263,9 +301,11 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
command: actionRequestDoc.EndpointActions.data.command,
},
});
+
+ return this.fetchActionDetails(actionRequestDoc.EndpointActions.action_id);
}
- return this.fetchActionDetails(actionRequestDoc.EndpointActions.action_id);
+ return actionDetails;
}
async release(
@@ -300,21 +340,8 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
}
}
- const actionRequestDoc = await this.writeActionRequestToEndpointIndex(reqIndexOptions);
-
- await this.updateCases({
- command: reqIndexOptions.command,
- caseIds: reqIndexOptions.case_ids,
- alertIds: reqIndexOptions.alert_ids,
- actionId: actionRequestDoc.EndpointActions.action_id,
- hosts: actionRequest.endpoint_ids.map((agentId) => {
- return {
- hostId: agentId,
- hostname: actionRequestDoc.EndpointActions.data.hosts?.[agentId].name ?? '',
- };
- }),
- comment: reqIndexOptions.comment,
- });
+ const { actionDetails, actionEsDoc: actionRequestDoc } =
+ await this.handleResponseActionCreation(reqIndexOptions);
if (
!actionRequestDoc.error &&
@@ -327,9 +354,110 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl {
command: actionRequestDoc.EndpointActions.data.command,
},
});
+
+ return this.fetchActionDetails(actionRequestDoc.EndpointActions.action_id);
+ }
+
+ return actionDetails;
+ }
+
+ async getFile(
+ actionRequest: ResponseActionGetFileRequestBody,
+ options?: CommonResponseActionMethodOptions
+ ): Promise> {
+ if (
+ !this.options.endpointService.experimentalFeatures.responseActionsSentinelOneGetFileEnabled
+ ) {
+ throw new ResponseActionsClientError(
+ `get-file not supported for ${this.agentType} agent type. Feature disabled`,
+ 400
+ );
+ }
+
+ const reqIndexOptions: ResponseActionsClientWriteActionRequestToEndpointIndexOptions<
+ ResponseActionGetFileParameters,
+ ResponseActionGetFileOutputContent,
+ Partial
+ > = {
+ ...actionRequest,
+ ...this.getMethodOptions(options),
+ command: 'get-file',
+ };
+
+ if (!reqIndexOptions.error) {
+ let error = (await this.validateRequest(reqIndexOptions)).error;
+ const timestamp = new Date().toISOString();
+
+ if (!error) {
+ try {
+ await this.sendAction(SUB_ACTION.FETCH_AGENT_FILES, {
+ agentUUID: actionRequest.endpoint_ids[0],
+ files: [actionRequest.parameters.path],
+ zipPassCode: SENTINEL_ONE_ZIP_PASSCODE,
+ });
+ } catch (err) {
+ error = err;
+ }
+ }
+
+ reqIndexOptions.error = error?.message;
+
+ if (!this.options.isAutomated && error) {
+ throw error;
+ }
+
+ if (!error) {
+ const { id: agentId } = await this.getAgentDetails(actionRequest.endpoint_ids[0]);
+
+ const activitySearchCriteria: SentinelOneGetActivitiesParams = {
+ // Activity type for fetching a file from a host machine in SentinelOne:
+ // {
+ // "id": 81
+ // "action": "User Requested Fetch Files",
+ // "descriptionTemplate": "The management user {{ username }} initiated a fetch file command to the agent {{ computer_name }} ({{ external_ip }}).",
+ // },
+ activityTypes: '81',
+ limit: 1,
+ sortBy: 'createdAt',
+ sortOrder: 'asc',
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ createdAt__gte: timestamp,
+ agentIds: agentId,
+ };
+
+ // Fetch the Activity log entry for this get-file request and store needed data
+ const activityLogSearchResponse = await this.sendAction<
+ SentinelOneGetActivitiesResponse<{ commandBatchUuid: string }>
+ >(SUB_ACTION.GET_ACTIVITIES, activitySearchCriteria);
+
+ this.log.debug(
+ `Search of activity log with:\n${stringify(
+ activitySearchCriteria
+ )}\n returned:\n${stringify(activityLogSearchResponse.data)}`
+ );
+
+ if (activityLogSearchResponse.data?.data.length) {
+ const activityLogItem = activityLogSearchResponse.data?.data[0];
+
+ reqIndexOptions.meta = {
+ commandBatchUuid: activityLogItem?.data.commandBatchUuid,
+ activityId: activityLogItem?.id,
+ };
+ } else {
+ this.log.warn(
+ `Unable to find a fetch file command entry in SentinelOne activity log. May be unable to complete response action`
+ );
+ }
+ }
}
- return this.fetchActionDetails(actionRequestDoc.EndpointActions.action_id);
+ return (
+ await this.handleResponseActionCreation<
+ ResponseActionGetFileParameters,
+ ResponseActionGetFileOutputContent,
+ SentinelOneGetFileRequestMeta
+ >(reqIndexOptions)
+ ).actionDetails;
}
async processPendingActions({
From 1e79cfc47d1d989f97b813d8ad91594a892aec75 Mon Sep 17 00:00:00 2001
From: Rodney Norris
Date: Mon, 22 Apr 2024 13:46:55 -0500
Subject: [PATCH 042/183] [Console] show persistent console on pipelines list
page (#180422)
---
x-pack/plugins/ingest_pipelines/kibana.jsonc | 3 +-
.../public/application/index.tsx | 2 +
.../application/mount_management_section.ts | 1 +
.../pipelines_create/pipelines_create.tsx | 3 ++
.../pipelines_create_from_csv/main.tsx | 3 ++
.../pipelines_edit/pipelines_edit.tsx | 3 ++
.../sections/pipelines_list/main.tsx | 3 ++
.../plugins/ingest_pipelines/public/types.ts | 2 +
x-pack/plugins/ingest_pipelines/tsconfig.json | 1 +
.../apps/dev_tools/embedded_console.ts | 19 ++++++++
.../ingest_pipelines_security.ts | 17 ++++++-
.../page_objects/embedded_console.ts | 47 +++++++++++++++++++
x-pack/test/functional/page_objects/index.ts | 2 +
.../functional/page_objects/index.ts | 2 +
.../page_objects/svl_ingest_pipelines.ts | 11 +++++
.../functional/test_suites/search/index.ts | 1 +
.../test_suites/search/pipelines.ts | 33 +++++++++++++
17 files changed, 151 insertions(+), 2 deletions(-)
create mode 100644 x-pack/test/functional/apps/dev_tools/embedded_console.ts
create mode 100644 x-pack/test/functional/page_objects/embedded_console.ts
create mode 100644 x-pack/test_serverless/functional/page_objects/svl_ingest_pipelines.ts
create mode 100644 x-pack/test_serverless/functional/test_suites/search/pipelines.ts
diff --git a/x-pack/plugins/ingest_pipelines/kibana.jsonc b/x-pack/plugins/ingest_pipelines/kibana.jsonc
index 86185e7d772d2..55fa46c61b377 100644
--- a/x-pack/plugins/ingest_pipelines/kibana.jsonc
+++ b/x-pack/plugins/ingest_pipelines/kibana.jsonc
@@ -19,7 +19,8 @@
],
"optionalPlugins": [
"security",
- "usageCollection"
+ "usageCollection",
+ "console"
],
"requiredBundles": [
"esUiShared",
diff --git a/x-pack/plugins/ingest_pipelines/public/application/index.tsx b/x-pack/plugins/ingest_pipelines/public/application/index.tsx
index 8f0adf677677e..982fc487957d1 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/index.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/index.tsx
@@ -12,6 +12,7 @@ import { render, unmountComponentAtNode } from 'react-dom';
import { ApplicationStart } from '@kbn/core/public';
import { NotificationsSetup, IUiSettingsClient } from '@kbn/core/public';
import { ManagementAppMountParams } from '@kbn/management-plugin/public';
+import type { ConsolePluginStart } from '@kbn/console-plugin/public';
import type { SharePluginStart } from '@kbn/share-plugin/public';
import type { FileUploadPluginStart } from '@kbn/file-upload-plugin/public';
import type { SettingsStart } from '@kbn/core-ui-settings-browser';
@@ -46,6 +47,7 @@ export interface AppServices {
fileUpload: FileUploadPluginStart;
application: ApplicationStart;
license: ILicense | null;
+ consolePlugin?: ConsolePluginStart;
}
type StartServices = Pick;
diff --git a/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts b/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts
index b2978d4b18fc6..ea6a229cfb73c 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts
+++ b/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts
@@ -48,6 +48,7 @@ export async function mountManagementSection(
application,
executionContext,
license,
+ consolePlugin: depsStart.console,
};
return renderApp(element, services, { ...coreStart, http });
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
index 763751b2fabc9..06f3b5a7bc0d2 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx
@@ -130,6 +130,9 @@ export const PipelinesCreate: React.FunctionComponent
+ {services.consolePlugin?.EmbeddableConsole ? (
+
+ ) : null}
>
);
};
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create_from_csv/main.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create_from_csv/main.tsx
index 259950919c06f..4a61011fb05aa 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create_from_csv/main.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create_from_csv/main.tsx
@@ -213,6 +213,9 @@ export const PipelinesCreateFromCsv: React.FunctionComponent
)}
+ {services.consolePlugin?.EmbeddableConsole ? (
+
+ ) : null}
>
);
};
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
index fbac7f1106bea..bfc08e1d09985 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx
@@ -201,6 +201,9 @@ export const PipelinesEdit: React.FunctionComponent
+ {services.consolePlugin?.EmbeddableConsole ? (
+
+ ) : null}
>
);
};
diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
index cf972abe5db59..901b8c78a4eee 100644
--- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
+++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx
@@ -264,6 +264,9 @@ export const PipelinesList: React.FunctionComponent = ({
pipelinesToDelete={pipelinesToDelete}
/>
) : null}
+ {services.consolePlugin?.EmbeddableConsole ? (
+
+ ) : null}
>
);
};
diff --git a/x-pack/plugins/ingest_pipelines/public/types.ts b/x-pack/plugins/ingest_pipelines/public/types.ts
index d6c249c0b0410..bfa1ac4300b3a 100644
--- a/x-pack/plugins/ingest_pipelines/public/types.ts
+++ b/x-pack/plugins/ingest_pipelines/public/types.ts
@@ -9,6 +9,7 @@ import { ManagementSetup } from '@kbn/management-plugin/public';
import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public';
import { SharePluginStart, SharePluginSetup } from '@kbn/share-plugin/public';
import type { FileUploadPluginStart } from '@kbn/file-upload-plugin/public';
+import type { ConsolePluginStart } from '@kbn/console-plugin/public';
import { LicensingPluginStart } from '@kbn/licensing-plugin/public';
export type { LicenseType, ILicense } from '@kbn/licensing-plugin/public';
@@ -22,4 +23,5 @@ export interface StartDependencies {
share: SharePluginStart;
fileUpload: FileUploadPluginStart;
licensing?: LicensingPluginStart;
+ console?: ConsolePluginStart;
}
diff --git a/x-pack/plugins/ingest_pipelines/tsconfig.json b/x-pack/plugins/ingest_pipelines/tsconfig.json
index b77ba94996751..71f0cb792a92c 100644
--- a/x-pack/plugins/ingest_pipelines/tsconfig.json
+++ b/x-pack/plugins/ingest_pipelines/tsconfig.json
@@ -32,6 +32,7 @@
"@kbn/core-ui-settings-browser",
"@kbn/code-editor",
"@kbn/react-kibana-context-render",
+ "@kbn/console-plugin"
],
"exclude": [
"target/**/*",
diff --git a/x-pack/test/functional/apps/dev_tools/embedded_console.ts b/x-pack/test/functional/apps/dev_tools/embedded_console.ts
new file mode 100644
index 0000000000000..8b663ea4aa5a7
--- /dev/null
+++ b/x-pack/test/functional/apps/dev_tools/embedded_console.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 { FtrProviderContext } from '../../ftr_provider_context';
+
+type PageObjects = Pick, 'embeddedConsole'>;
+
+export async function testEmbeddedConsole(pageObjects: PageObjects) {
+ await pageObjects.embeddedConsole.expectEmbeddedConsoleControlBarExists();
+ await pageObjects.embeddedConsole.expectEmbeddedConsoleToBeClosed();
+ await pageObjects.embeddedConsole.clickEmbeddedConsoleControlBar();
+ await pageObjects.embeddedConsole.expectEmbeddedConsoleToBeOpen();
+ await pageObjects.embeddedConsole.clickEmbeddedConsoleControlBar();
+ await pageObjects.embeddedConsole.expectEmbeddedConsoleToBeClosed();
+}
diff --git a/x-pack/test/functional/apps/ingest_pipelines/feature_controls/ingest_pipelines_security.ts b/x-pack/test/functional/apps/ingest_pipelines/feature_controls/ingest_pipelines_security.ts
index 350170160c71d..ee984ecc0a557 100644
--- a/x-pack/test/functional/apps/ingest_pipelines/feature_controls/ingest_pipelines_security.ts
+++ b/x-pack/test/functional/apps/ingest_pipelines/feature_controls/ingest_pipelines_security.ts
@@ -7,11 +7,12 @@
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../../ftr_provider_context';
+import { testEmbeddedConsole } from '../../dev_tools/embedded_console';
export default function ({ getPageObjects, getService }: FtrProviderContext) {
const kibanaServer = getService('kibanaServer');
const security = getService('security');
- const PageObjects = getPageObjects(['common', 'settings', 'security']);
+ const PageObjects = getPageObjects(['common', 'settings', 'security', 'embeddedConsole']);
const appsMenu = getService('appsMenu');
const managementMenu = getService('managementMenu');
@@ -69,5 +70,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
});
});
});
+
+ describe('ingest user with dev tools', () => {
+ before(async () => {
+ await security.testUser.setRoles(['global_devtools_read', 'ingest_pipelines_user']);
+ });
+ after(async () => {
+ await security.testUser.restoreDefaults();
+ });
+
+ it('should have the embedded console', async () => {
+ await PageObjects.common.navigateToApp('ingestPipelines');
+ await testEmbeddedConsole(PageObjects);
+ });
+ });
});
}
diff --git a/x-pack/test/functional/page_objects/embedded_console.ts b/x-pack/test/functional/page_objects/embedded_console.ts
new file mode 100644
index 0000000000000..b6b54365f7031
--- /dev/null
+++ b/x-pack/test/functional/page_objects/embedded_console.ts
@@ -0,0 +1,47 @@
+/*
+ * 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 { FtrProviderContext } from '../ftr_provider_context';
+
+export function EmbeddedConsoleProvider({ getService }: FtrProviderContext) {
+ const testSubjects = getService('testSubjects');
+
+ return {
+ async expectEmbeddedConsoleControlBarExists() {
+ await testSubjects.existOrFail('consoleEmbeddedSection');
+ },
+ async expectEmbeddedConsoleToBeOpen() {
+ await testSubjects.existOrFail('consoleEmbeddedBody');
+ },
+ async expectEmbeddedConsoleToBeClosed() {
+ await testSubjects.missingOrFail('consoleEmbeddedBody');
+ },
+ async clickEmbeddedConsoleControlBar() {
+ await testSubjects.click('consoleEmbeddedControlBar');
+ },
+ async expectEmbeddedConsoleNotebooksButtonExists() {
+ await testSubjects.existOrFail('consoleEmbeddedNotebooksButton');
+ },
+ async clickEmbeddedConsoleNotebooksButton() {
+ await testSubjects.click('consoleEmbeddedNotebooksButton');
+ },
+ async expectEmbeddedConsoleNotebooksToBeOpen() {
+ await testSubjects.existOrFail('consoleEmbeddedNotebooksContainer');
+ },
+ async expectEmbeddedConsoleNotebooksToBeClosed() {
+ await testSubjects.missingOrFail('consoleEmbeddedNotebooksContainer');
+ },
+ async expectEmbeddedConsoleNotebookListItemToBeAvailable(id: string) {
+ await testSubjects.existOrFail(`console-embedded-notebook-select-btn-${id}`);
+ },
+ async clickEmbeddedConsoleNotebook(id: string) {
+ await testSubjects.click(`console-embedded-notebook-select-btn-${id}`);
+ },
+ async expectEmbeddedConsoleNotebookToBeAvailable(id: string) {
+ await testSubjects.click(`console-embedded-notebook-select-btn-${id}`);
+ },
+ };
+}
diff --git a/x-pack/test/functional/page_objects/index.ts b/x-pack/test/functional/page_objects/index.ts
index 80b7b74095ab9..7a459ad74f980 100644
--- a/x-pack/test/functional/page_objects/index.ts
+++ b/x-pack/test/functional/page_objects/index.ts
@@ -15,6 +15,7 @@ import { CanvasPageProvider } from './canvas_page';
import { CopySavedObjectsToSpacePageProvider } from './copy_saved_objects_to_space_page';
import { CrossClusterReplicationPageProvider } from './cross_cluster_replication_page';
import { DetectionsPageObject } from '../../security_solution_ftr/page_objects/detections';
+import { EmbeddedConsoleProvider } from './embedded_console';
import { GeoFileUploadPageObject } from './geo_file_upload';
import { GisPageObject } from './gis_page';
import { GraphPageObject } from './graph_page';
@@ -65,6 +66,7 @@ export const pageObjects = {
copySavedObjectsToSpace: CopySavedObjectsToSpacePageProvider,
crossClusterReplication: CrossClusterReplicationPageProvider,
detections: DetectionsPageObject,
+ embeddedConsole: EmbeddedConsoleProvider,
geoFileUpload: GeoFileUploadPageObject,
graph: GraphPageObject,
grokDebugger: GrokDebuggerPageObject,
diff --git a/x-pack/test_serverless/functional/page_objects/index.ts b/x-pack/test_serverless/functional/page_objects/index.ts
index 0fcc12cd25bb4..f1604d48508e2 100644
--- a/x-pack/test_serverless/functional/page_objects/index.ts
+++ b/x-pack/test_serverless/functional/page_objects/index.ts
@@ -20,6 +20,7 @@ import { SvlTriggersActionsPageProvider } from './svl_triggers_actions_ui_page';
import { SvlRuleDetailsPageProvider } from './svl_rule_details_ui_page';
import { SvlSearchConnectorsPageProvider } from './svl_search_connectors_page';
import { SvlManagementPageProvider } from './svl_management_page';
+import { SvlIngestPipelines } from './svl_ingest_pipelines';
export const pageObjects = {
...xpackFunctionalPageObjects,
@@ -36,4 +37,5 @@ export const pageObjects = {
svlTriggersActionsUI: SvlTriggersActionsPageProvider,
svlRuleDetailsUI: SvlRuleDetailsPageProvider,
svlManagementPage: SvlManagementPageProvider,
+ svlIngestPipelines: SvlIngestPipelines,
};
diff --git a/x-pack/test_serverless/functional/page_objects/svl_ingest_pipelines.ts b/x-pack/test_serverless/functional/page_objects/svl_ingest_pipelines.ts
new file mode 100644
index 0000000000000..dbc083e578596
--- /dev/null
+++ b/x-pack/test_serverless/functional/page_objects/svl_ingest_pipelines.ts
@@ -0,0 +1,11 @@
+/*
+ * 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 { FtrProviderContext } from '../ftr_provider_context';
+export function SvlIngestPipelines({}: FtrProviderContext) {
+ return {};
+}
diff --git a/x-pack/test_serverless/functional/test_suites/search/index.ts b/x-pack/test_serverless/functional/test_suites/search/index.ts
index f9c8e67594ec8..2e62cf4fbee38 100644
--- a/x-pack/test_serverless/functional/test_suites/search/index.ts
+++ b/x-pack/test_serverless/functional/test_suites/search/index.ts
@@ -13,6 +13,7 @@ export default function ({ loadTestFile }: FtrProviderContext) {
loadTestFile(require.resolve('./connectors/connectors_overview'));
loadTestFile(require.resolve('./default_dataview'));
loadTestFile(require.resolve('./navigation'));
+ loadTestFile(require.resolve('./pipelines'));
loadTestFile(require.resolve('./cases/attachment_framework'));
loadTestFile(require.resolve('./dashboards/build_dashboard'));
loadTestFile(require.resolve('./dashboards/import_dashboard'));
diff --git a/x-pack/test_serverless/functional/test_suites/search/pipelines.ts b/x-pack/test_serverless/functional/test_suites/search/pipelines.ts
new file mode 100644
index 0000000000000..4ad1b685edf2a
--- /dev/null
+++ b/x-pack/test_serverless/functional/test_suites/search/pipelines.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { FtrProviderContext } from '../../ftr_provider_context';
+import { testHasEmbeddedConsole } from './embedded_console';
+
+export default function ({ getPageObjects }: FtrProviderContext) {
+ const pageObjects = getPageObjects([
+ 'svlCommonPage',
+ 'svlCommonNavigation',
+ 'common',
+ 'svlIngestPipelines',
+ ]);
+ describe('ingest pipelines', function () {
+ before(async () => {
+ await pageObjects.svlCommonPage.login();
+ await pageObjects.svlCommonNavigation.sidenav.clickLink({
+ deepLinkId: 'management:ingest_pipelines',
+ });
+ });
+
+ after(async () => {
+ await pageObjects.svlCommonPage.forceLogout();
+ });
+
+ it('has embedded console', async () => {
+ await testHasEmbeddedConsole(pageObjects);
+ });
+ });
+}
From 585ec64e6d558fe65116a9d830602f6371ec80f9 Mon Sep 17 00:00:00 2001
From: Lukas Olson
Date: Mon, 22 Apr 2024 23:09:30 +0200
Subject: [PATCH 043/183] Display results instead of errors after search
timeout (#179679)
## Summary
Replaces https://github.com/elastic/kibana/pull/176026.
Resolves https://github.com/elastic/kibana/issues/172263.
An advanced setting, `search:timeout` determines how long we let search
requests continue before actively cancelling them. The default is 10
minutes. Prior to this PR, after waiting on screen for that 10 minutes,
if the user didn't send to background, the request would cancel and an
error would be shown. This PR changes the behavior to not just show an
error, but to actually retrieve the latest results from the search
request and display them (along with a warning).
Before this PR:
![before](https://github.com/elastic/kibana/assets/1178348/d1752287-e6c5-4a6e-b79d-e8e61b6a156a)
After this PR:
![after](https://github.com/elastic/kibana/assets/1178348/5c8f284f-666f-4365-9021-b93d995a2576)
### Checklist
Delete any items that are not applicable to this PR.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### Risk Matrix
Delete this section if it is not applicable to this PR.
Before closing this PR, invite QA, stakeholders, and other developers to
identify risks that should be tested prior to the change/feature
release.
When forming the risk matrix, consider some of the following examples
and how they may potentially impact the change:
| Risk | Probability | Severity | Mitigation/Notes |
|---------------------------|-------------|----------|-------------------------|
| Multiple Spaces—unexpected behavior in non-default Kibana Space.
| Low | High | Integration tests will verify that all features are still
supported in non-default Kibana Space and when user switches between
spaces. |
| Multiple nodes—Elasticsearch polling might have race conditions
when multiple Kibana nodes are polling for the same tasks. | High | Low
| Tasks are idempotent, so executing them multiple times will not result
in logical error, but will degrade performance. To test for this case we
add plenty of unit tests around this logic and document manual testing
procedure. |
| Code should gracefully handle cases when feature X or plugin Y are
disabled. | Medium | High | Unit tests will verify that any feature flag
or plugin combination still results in our service operational. |
| [See more potential risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) |
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
### Release notes
When a long-running search times out, instead of showing an error, any
results that are available will be shown (along with a warning that the
results are incomplete).
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Matthew Kime
Co-authored-by: Julia Rechkunova
---
.../view_details_popover.tsx | 21 +-
src/plugins/data/common/search/types.ts | 8 +
.../search_interceptor.test.ts | 61 +++++-
.../search_interceptor/search_interceptor.ts | 14 ++
.../to_partial_response.test.ts | 204 ++++++++++++++++++
.../search_interceptor/to_partial_response.ts | 67 ++++++
.../ese_search/ese_search_strategy.ts | 8 +-
.../__snapshots__/cluster_view.test.tsx.snap | 5 +
.../clusters_table/cluster_view.tsx | 2 +-
.../clusters_table/clusters_table.tsx | 1 +
.../ccs_compatibility/_timeout_results.ts | 155 +++++++++++++
.../apps/discover/ccs_compatibility/index.ts | 3 +
.../dashboard/async_search/async_search.ts | 5 +-
13 files changed, 537 insertions(+), 17 deletions(-)
create mode 100644 src/plugins/data/public/search/search_interceptor/to_partial_response.test.ts
create mode 100644 src/plugins/data/public/search/search_interceptor/to_partial_response.ts
create mode 100644 test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
diff --git a/packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx b/packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx
index 98c5a08f9b2d8..6bf614412f3b6 100644
--- a/packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx
+++ b/packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx
@@ -32,11 +32,19 @@ export const ViewDetailsPopover = (props: Props) => {
if (props.warnings.length === 1) {
return props.displayAsLink ? (
-
+
{viewDetailsLabel}
) : (
-
+
{viewDetailsLabel}
);
@@ -69,7 +77,11 @@ export const ViewDetailsPopover = (props: Props) => {
id="ViewDetailsPopover"
button={
props.displayAsLink ? (
- setIsPopoverOpen(!isPopoverOpen)}>
+ setIsPopoverOpen(!isPopoverOpen)}
+ data-test-subj="searchResponseWarningsViewDetails"
+ >
<>
{viewDetailsLabel}
>
@@ -80,6 +92,7 @@ export const ViewDetailsPopover = (props: Props) => {
onClick={() => setIsPopoverOpen(!isPopoverOpen)}
iconSide="right"
iconType="arrowRight"
+ data-test-subj="searchResponseWarningsViewDetails"
>
{viewDetailsLabel}
@@ -90,7 +103,7 @@ export const ViewDetailsPopover = (props: Props) => {
panelPaddingSize="none"
anchorPosition="downCenter"
>
-
+
);
};
diff --git a/src/plugins/data/common/search/types.ts b/src/plugins/data/common/search/types.ts
index 7187ac7b9748d..51c56541366f0 100644
--- a/src/plugins/data/common/search/types.ts
+++ b/src/plugins/data/common/search/types.ts
@@ -153,6 +153,13 @@ export interface ISearchOptions {
*/
isRestore?: boolean;
+ /**
+ * By default, when polling, we don't retrieve the results of the search request (until it is complete). (For async
+ * search, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to
+ * `true` will request the search results, regardless of whether or not the search is complete.
+ */
+ retrieveResults?: boolean;
+
/**
* Represents a meta-information about a Kibana entity intitating a saerch request.
*/
@@ -182,5 +189,6 @@ export type ISearchOptionsSerializable = Pick<
| 'isStored'
| 'isSearchStored'
| 'isRestore'
+ | 'retrieveResults'
| 'executionContext'
>;
diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts
index 4a2b6f27e9e9b..8c01ea615fd37 100644
--- a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts
+++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts
@@ -358,8 +358,6 @@ describe('SearchInterceptor', () => {
await timeTravel(1000);
- expect(error).toHaveBeenCalled();
- expect(error.mock.calls[0][0]).toBeInstanceOf(SearchTimeoutError);
expect(fetchMock).toHaveBeenCalled();
expect(mockCoreSetup.http.delete).not.toHaveBeenCalled();
});
@@ -400,12 +398,65 @@ describe('SearchInterceptor', () => {
// Long enough to reach the timeout but not long enough to reach the next response
await timeTravel(1000);
- expect(error).toHaveBeenCalled();
- expect(error.mock.calls[0][0]).toBeInstanceOf(SearchTimeoutError);
- expect(fetchMock).toHaveBeenCalledTimes(2);
+ // Expect 3 calls to fetch - the two polls and a final request for the results before deleting
+ expect(fetchMock).toHaveBeenCalledTimes(3);
expect(mockCoreSetup.http.delete).toHaveBeenCalledTimes(1);
});
+ test('should return the last response on async timeout', async () => {
+ const responses = [
+ {
+ time: 10,
+ value: {
+ isPartial: true,
+ isRunning: true,
+ rawResponse: {},
+ id: 1,
+ },
+ },
+ {
+ time: 2000,
+ value: {
+ isPartial: false,
+ isRunning: false,
+ rawResponse: {},
+ id: 1,
+ },
+ },
+ ];
+ mockFetchImplementation(responses);
+
+ const response = searchInterceptor.search({}, { pollInterval: 0 });
+ response.subscribe({ next, error });
+
+ await timeTravel(10);
+
+ expect(next).toHaveBeenCalled();
+ expect(error).not.toHaveBeenCalled();
+ expect(fetchMock).toHaveBeenCalled();
+ expect(mockCoreSetup.http.delete).not.toHaveBeenCalled();
+
+ // Long enough to reach the timeout but not long enough to reach the next response
+ await timeTravel(1000);
+
+ expect(next).toHaveBeenCalledTimes(2);
+ expect(next.mock.calls[1]).toMatchInlineSnapshot(`
+ Array [
+ Object {
+ "id": 1,
+ "isPartial": true,
+ "isRunning": false,
+ "meta": Object {
+ "size": 10,
+ },
+ "rawResponse": Object {
+ "timed_out": true,
+ },
+ },
+ ]
+ `);
+ });
+
test('should DELETE a running async search on async timeout on error from fetch', async () => {
const responses = [
{
diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts
index e08faa03c6c69..5da9d4c2f7120 100644
--- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts
+++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts
@@ -66,6 +66,7 @@ import {
import { SearchUsageCollector } from '../collectors';
import { SearchTimeoutError, TimeoutErrorMode } from './timeout_error';
import { SearchSessionIncompleteWarning } from './search_session_incomplete_warning';
+import { toPartialResponseAfterTimeout } from './to_partial_response';
import { ISessionService, SearchSessionState } from '../session';
import { SearchResponseCache } from './search_response_cache';
import { SearchAbortController } from './search_abort_controller';
@@ -257,6 +258,8 @@ export class SearchInterceptor {
if (combined.sessionId !== undefined) serializableOptions.sessionId = combined.sessionId;
if (combined.isRestore !== undefined) serializableOptions.isRestore = combined.isRestore;
+ if (combined.retrieveResults !== undefined)
+ serializableOptions.retrieveResults = combined.retrieveResults;
if (combined.legacyHitsTotal !== undefined)
serializableOptions.legacyHitsTotal = combined.legacyHitsTotal;
if (combined.strategy !== undefined) serializableOptions.strategy = combined.strategy;
@@ -509,6 +512,17 @@ export class SearchInterceptor {
return response$.pipe(
takeUntil(aborted$),
catchError((e) => {
+ // If we aborted (search:timeout advanced setting) and there was a partial response, return it instead of just erroring out
+ if (searchAbortController.isTimeout()) {
+ return from(
+ this.runSearch(request, { ...searchOptions, retrieveResults: true })
+ ).pipe(
+ tap(() =>
+ this.handleSearchError(e, request?.params?.body ?? {}, searchOptions, true)
+ ),
+ map(toPartialResponseAfterTimeout)
+ );
+ }
return throwError(
this.handleSearchError(
e,
diff --git a/src/plugins/data/public/search/search_interceptor/to_partial_response.test.ts b/src/plugins/data/public/search/search_interceptor/to_partial_response.test.ts
new file mode 100644
index 0000000000000..dacdade55f41a
--- /dev/null
+++ b/src/plugins/data/public/search/search_interceptor/to_partial_response.test.ts
@@ -0,0 +1,204 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { toPartialResponseAfterTimeout } from './to_partial_response';
+import { IEsSearchResponse } from '../../../common';
+
+describe('toPartialResponseAfterTimeout', () => {
+ it('should transform a non-CCS response', () => {
+ const response = {
+ id: 'FnRKOG10dG5OUXItUTNGUE5HNW9iU1Eed3l6LUVycTVTVGl1LWtDSVdta2VkQToxODQ5NzQ3',
+ rawResponse: {
+ took: 4498,
+ timed_out: false,
+ terminated_early: false,
+ num_reduce_phases: 0,
+ _shards: {
+ total: 15,
+ successful: 0,
+ skipped: 10,
+ failed: 0,
+ },
+ hits: {
+ total: 0,
+ max_score: null,
+ hits: [],
+ },
+ },
+ isPartial: true,
+ isRunning: true,
+ total: 15,
+ loaded: 0,
+ isRestored: true,
+ requestParams: {
+ method: 'POST',
+ path: '/kibana_sample_data_logs/_async_search',
+ querystring:
+ 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=true&keep_alive=60000ms&ignore_unavailable=true&expand_wildcards=all&preference=1706739464897',
+ },
+ };
+
+ const expected = {
+ id: 'FnRKOG10dG5OUXItUTNGUE5HNW9iU1Eed3l6LUVycTVTVGl1LWtDSVdta2VkQToxODQ5NzQ3',
+ rawResponse: {
+ took: 4498,
+ timed_out: true,
+ terminated_early: false,
+ num_reduce_phases: 0,
+ _shards: {
+ total: 15,
+ successful: 0,
+ skipped: 10,
+ failed: 0,
+ },
+ hits: {
+ total: 0,
+ max_score: null,
+ hits: [],
+ },
+ },
+ isPartial: true,
+ isRunning: false,
+ total: 15,
+ loaded: 0,
+ isRestored: true,
+ requestParams: {
+ method: 'POST',
+ path: '/kibana_sample_data_logs/_async_search',
+ querystring:
+ 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=true&keep_alive=60000ms&ignore_unavailable=true&expand_wildcards=all&preference=1706739464897',
+ },
+ };
+
+ const actual = toPartialResponseAfterTimeout(response);
+ expect(actual).toEqual(expected);
+ });
+
+ it('should transform a CCS response', () => {
+ const response: IEsSearchResponse = {
+ id: 'FmZBc2NuYlhsU1JxSk5LZXNRczVxdEEed3l6LUVycTVTVGl1LWtDSVdta2VkQToxODUzODUx',
+ rawResponse: {
+ took: 4414,
+ timed_out: false,
+ terminated_early: false,
+ num_reduce_phases: 2,
+ _shards: {
+ total: 22,
+ successful: 8,
+ skipped: 11,
+ failed: 0,
+ },
+ _clusters: {
+ total: 2,
+ successful: 1,
+ skipped: 0,
+ running: 1,
+ partial: 0,
+ failed: 0,
+ details: {
+ '(local)': {
+ status: 'running',
+ indices:
+ 'qbserve-2024-01-22,qbserve-2024-01-23,qbserve-2024-01-31,qbserve-2024-01-30,qbserve-2024-01-19,qbserve-2024-01-17,qbserve-2024-01-18,qbserve-2024-01-29,qbserve-2024-01-15,qbserve-2024-01-26,qbserve-2024-01-16,qbserve-2024-01-27,qbserve-2024-01-24,qbserve-2024-01-25',
+ timed_out: false,
+ },
+ remote1: {
+ status: 'successful',
+ indices: 'kibana_sample_data_logs',
+ took: 13,
+ timed_out: false,
+ _shards: {
+ total: 8,
+ successful: 8,
+ skipped: 2,
+ failed: 0,
+ },
+ },
+ },
+ },
+ hits: {
+ max_score: null,
+ hits: [],
+ },
+ },
+ isPartial: true,
+ isRunning: true,
+ total: 22,
+ loaded: 8,
+ isRestored: true,
+ requestParams: {
+ method: 'POST',
+ path: '/kibana_sample_data_logs%2C*%3Akibana_sample_data_logs/_async_search',
+ querystring:
+ 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=true&keep_alive=60000ms&ignore_unavailable=true&preference=1706739464897',
+ },
+ };
+
+ const expected = {
+ id: 'FmZBc2NuYlhsU1JxSk5LZXNRczVxdEEed3l6LUVycTVTVGl1LWtDSVdta2VkQToxODUzODUx',
+ rawResponse: {
+ took: 4414,
+ timed_out: false,
+ terminated_early: false,
+ num_reduce_phases: 2,
+ _shards: {
+ total: 22,
+ successful: 8,
+ skipped: 11,
+ failed: 0,
+ },
+ _clusters: {
+ total: 2,
+ successful: 1,
+ skipped: 0,
+ running: 1,
+ partial: 0,
+ failed: 0,
+ details: {
+ '(local)': {
+ status: 'partial',
+ indices:
+ 'qbserve-2024-01-22,qbserve-2024-01-23,qbserve-2024-01-31,qbserve-2024-01-30,qbserve-2024-01-19,qbserve-2024-01-17,qbserve-2024-01-18,qbserve-2024-01-29,qbserve-2024-01-15,qbserve-2024-01-26,qbserve-2024-01-16,qbserve-2024-01-27,qbserve-2024-01-24,qbserve-2024-01-25',
+ timed_out: true,
+ },
+ remote1: {
+ status: 'successful',
+ indices: 'kibana_sample_data_logs',
+ took: 13,
+ timed_out: false,
+ _shards: {
+ total: 8,
+ successful: 8,
+ skipped: 2,
+ failed: 0,
+ },
+ },
+ },
+ },
+ hits: {
+ max_score: null,
+ hits: [],
+ },
+ },
+ isPartial: true,
+ isRunning: false,
+ total: 22,
+ loaded: 8,
+ isRestored: true,
+ requestParams: {
+ method: 'POST',
+ path: '/kibana_sample_data_logs%2C*%3Akibana_sample_data_logs/_async_search',
+ querystring:
+ 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=true&keep_alive=60000ms&ignore_unavailable=true&preference=1706739464897',
+ },
+ };
+
+ const actual = toPartialResponseAfterTimeout(response);
+ expect(actual).toEqual(expected);
+ });
+});
diff --git a/src/plugins/data/public/search/search_interceptor/to_partial_response.ts b/src/plugins/data/public/search/search_interceptor/to_partial_response.ts
new file mode 100644
index 0000000000000..8c6af82bb31e4
--- /dev/null
+++ b/src/plugins/data/public/search/search_interceptor/to_partial_response.ts
@@ -0,0 +1,67 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import {
+ ClusterDetails,
+ ClusterStatistics,
+ SearchResponse,
+} from '@elastic/elasticsearch/lib/api/types';
+import { IEsSearchResponse } from '../../../common';
+
+/**
+ * When we hit the advanced setting `search:timeout`, we cancel in-progress search requests. This method takes the
+ * active raw response from ES (status: "running") and returns a request in the format expected by our helper utilities
+ * (status: "partial") that display cluster info, warnings, & errors.
+ * @param response The raw ES response
+ */
+export function toPartialResponseAfterTimeout(response: IEsSearchResponse): IEsSearchResponse {
+ const { rawResponse } = response;
+ const { _clusters: clusters } = rawResponse as SearchResponse & {
+ _clusters: ClusterStatistics & {
+ details: Record;
+ };
+ };
+ if (clusters) {
+ // CCS response
+ const details = Object.fromEntries(
+ Object.keys(clusters.details).map((key) => {
+ return [
+ key,
+ clusters.details[key].status !== 'running'
+ ? clusters.details[key]
+ : {
+ ...clusters.details[key],
+ status: 'partial',
+ timed_out: true,
+ },
+ ];
+ })
+ );
+ return {
+ ...response,
+ isRunning: false,
+ rawResponse: {
+ ...rawResponse,
+ _clusters: {
+ ...clusters,
+ details,
+ },
+ },
+ } as IEsSearchResponse;
+ } else {
+ // Non-CCS response
+ return {
+ ...response,
+ isRunning: false,
+ rawResponse: {
+ ...rawResponse,
+ timed_out: true,
+ },
+ };
+ }
+}
diff --git a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts
index 94276ba639d7f..2bf9775cd5288 100644
--- a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts
+++ b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts
@@ -73,9 +73,11 @@ export const enhancedEsSearchStrategyProvider = (
options: IAsyncSearchOptions,
{ esClient }: SearchStrategyDependencies
) {
- // First, request the status of the async search, and return the status if incomplete
- const status = await asyncSearchStatus({ id, ...request }, options, { esClient });
- if (isRunningResponse(status)) return status;
+ if (!options.retrieveResults) {
+ // First, request the status of the async search, and return the status if incomplete
+ const status = await asyncSearchStatus({ id, ...request }, options, { esClient });
+ if (isRunningResponse(status)) return status;
+ }
// Then, if the search is complete, request & return the final results
const client = useInternalUser ? esClient.asInternalUser : esClient.asCurrentUser;
diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap
index 66f1352ce8aab..e063ccea48cc2 100644
--- a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap
+++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap
@@ -2,6 +2,7 @@
exports[`render partial should display callout when request timed out 1`] = `
+
{clusterDetails.timed_out ? (
toggleDetails(name)}
aria-label={
name in expandedRows
diff --git a/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts b/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
new file mode 100644
index 0000000000000..f8f81a44bdf8c
--- /dev/null
+++ b/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
@@ -0,0 +1,155 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import expect from '@kbn/expect';
+import { FtrProviderContext } from '../ftr_provider_context';
+
+export default function ({ getService, getPageObjects }: FtrProviderContext) {
+ const filterBar = getService('filterBar');
+ const kibanaServer = getService('kibanaServer');
+ const retry = getService('retry');
+ const testSubjects = getService('testSubjects');
+ const toasts = getService('toasts');
+ const PageObjects = getPageObjects(['common', 'discover', 'header', 'timePicker']);
+ const dataViews = getService('dataViews');
+
+ const esArchiver = getService('esArchiver');
+ const remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver');
+
+ describe('discover search CCS timeout', () => {
+ before(async () => {
+ await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional');
+ await remoteEsArchiver.loadIfNeeded(
+ 'test/functional/fixtures/es_archiver/logstash_functional'
+ );
+ await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover.json');
+ await kibanaServer.uiSettings.update({ 'search:timeout': 3000 });
+ });
+
+ after(async () => {
+ await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional');
+ await remoteEsArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional');
+ await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover.json');
+ await kibanaServer.uiSettings.unset('search:timeout');
+ });
+
+ describe('bfetch enabled', async () => {
+ it('timeout on single shard shows warning and results with bfetch enabled', async () => {
+ await PageObjects.common.navigateToApp('discover');
+ await dataViews.createFromSearchBar({
+ name: 'ftr-remote:logstash-*,logstash-*',
+ hasTimeField: false,
+ adHoc: true,
+ });
+
+ // Add a stall time to the remote indices
+ await filterBar.addDslFilter(
+ `
+ {
+ "query": {
+ "error_query": {
+ "indices": [
+ {
+ "name": "*:*",
+ "error_type": "exception",
+ "message": "'Watch out!'",
+ "stall_time_seconds": 5
+ }
+ ]
+ }
+ }
+ }`,
+ true
+ );
+
+ // Warning callout is shown
+ await testSubjects.exists('searchResponseWarningsCallout');
+
+ // Timed out error notification is shown
+ const { title } = await toasts.getErrorByIndex(1, true);
+ expect(title).to.be('Timed out');
+
+ // View cluster details shows timed out
+ await testSubjects.click('searchResponseWarningsViewDetails');
+ await testSubjects.click('viewDetailsContextMenu');
+ await testSubjects.click('inspectorRequestToggleClusterDetailsftr-remote');
+ const txt = await testSubjects.getVisibleText('inspectorRequestClustersDetails');
+ expect(txt).to.be(
+ 'Request timed out before completion. Results may be incomplete or empty.'
+ );
+
+ // Ensure documents are still returned for the successful shards
+ await retry.try(async function tryingForTime() {
+ const hitCount = await PageObjects.discover.getHitCount();
+ expect(hitCount).to.be('14,004');
+ });
+ });
+ });
+
+ describe('bfetch disabled', async () => {
+ before(async () => {
+ await kibanaServer.uiSettings.update({ 'bfetch:disable': true });
+ });
+
+ after(async () => {
+ await kibanaServer.uiSettings.unset('bfetch:disabled');
+ });
+
+ it('timeout on single shard shows warning and results', async () => {
+ await PageObjects.common.navigateToApp('discover');
+ await dataViews.createFromSearchBar({
+ name: 'ftr-remote:logstash-*,logstash-*',
+ hasTimeField: false,
+ adHoc: true,
+ });
+
+ // Add a stall time to the remote indices
+ await filterBar.addDslFilter(
+ `
+ {
+ "query": {
+ "error_query": {
+ "indices": [
+ {
+ "name": "*:*",
+ "error_type": "exception",
+ "message": "'Watch out!'",
+ "stall_time_seconds": 5
+ }
+ ]
+ }
+ }
+ }`,
+ true
+ );
+
+ // Warning callout is shown
+ await testSubjects.exists('searchResponseWarningsCallout');
+
+ // Timed out error notification is shown
+ const { title } = await toasts.getErrorByIndex(1, true);
+ expect(title).to.be('Timed out');
+
+ // View cluster details shows timed out
+ await testSubjects.click('searchResponseWarningsViewDetails');
+ await testSubjects.click('viewDetailsContextMenu');
+ await testSubjects.click('inspectorRequestToggleClusterDetailsftr-remote');
+ const txt = await testSubjects.getVisibleText('inspectorRequestClustersDetails');
+ expect(txt).to.be(
+ 'Request timed out before completion. Results may be incomplete or empty.'
+ );
+
+ // Ensure documents are still returned for the successful shards
+ await retry.try(async function tryingForTime() {
+ const hitCount = await PageObjects.discover.getHitCount();
+ expect(hitCount).to.be('14,004');
+ });
+ });
+ });
+ });
+}
diff --git a/test/functional/apps/discover/ccs_compatibility/index.ts b/test/functional/apps/discover/ccs_compatibility/index.ts
index 4f932c3993831..b4a4932f7317c 100644
--- a/test/functional/apps/discover/ccs_compatibility/index.ts
+++ b/test/functional/apps/discover/ccs_compatibility/index.ts
@@ -10,6 +10,8 @@ import { FtrProviderContext } from '../ftr_provider_context';
export default function ({ getService, loadTestFile }: FtrProviderContext) {
const esArchiver = getService('esArchiver');
const browser = getService('browser');
+ const config = getService('config');
+ const isCcsTest = config.get('esTestCluster.ccs');
describe('discover/ccs_compatible', function () {
before(async function () {
@@ -23,5 +25,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) {
loadTestFile(require.resolve('./_data_view_editor'));
loadTestFile(require.resolve('./_saved_queries'));
loadTestFile(require.resolve('./_search_errors'));
+ if (isCcsTest) loadTestFile(require.resolve('./_timeout_results'));
});
}
diff --git a/x-pack/test/search_sessions_integration/tests/apps/dashboard/async_search/async_search.ts b/x-pack/test/search_sessions_integration/tests/apps/dashboard/async_search/async_search.ts
index 465681a1a210f..eabb15dd1cd4c 100644
--- a/x-pack/test/search_sessions_integration/tests/apps/dashboard/async_search/async_search.ts
+++ b/x-pack/test/search_sessions_integration/tests/apps/dashboard/async_search/async_search.ts
@@ -58,7 +58,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.loadSavedDashboard('Delayed 15s');
await PageObjects.header.waitUntilLoadingHasFinished();
- await testSubjects.existOrFail('embeddableError');
await testSubjects.existOrFail('searchTimeoutError');
});
@@ -66,9 +65,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.loadSavedDashboard('Multiple delayed');
await PageObjects.header.waitUntilLoadingHasFinished();
- await testSubjects.existOrFail('embeddableError');
- // there should be two failed panels
- expect((await testSubjects.findAll('embeddableError')).length).to.be(2);
+
// but only single error toast because searches are grouped
expect((await testSubjects.findAll('searchTimeoutError')).length).to.be(1);
From 298802a313dbf92351493e0df8370aca89246028 Mon Sep 17 00:00:00 2001
From: Steph Milovic
Date: Mon, 22 Apr 2024 19:42:13 -0500
Subject: [PATCH 044/183] [Security solution] LangChain ESQL tool fix,
renaming, and LangSmith tracing fix (#181088)
---
.../chat_openai.ts} | 21 +++++++++++---
.../impl/language_models/constants.ts | 21 ++++++++++++++
.../{llm => language_models}/helpers.test.ts | 0
.../impl/{llm => language_models}/helpers.ts | 0
.../impl/{llm => language_models}/index.ts | 4 +--
.../llm.test.ts} | 2 +-
.../llm.ts} | 8 ++----
.../impl/{llm => language_models}/types.ts | 0
.../execute_custom_llm_chain/index.test.ts | 9 ++++--
.../execute_custom_llm_chain/index.ts | 11 +++++++-
.../executors/openai_functions_executor.ts | 2 +-
.../server/routes/evaluate/post_evaluate.ts | 2 +-
.../server/routes/insights/alerts/helpers.ts | 2 +-
.../insights/alerts/post_alerts_insights.ts | 2 +-
.../plugins/elastic_assistant/server/types.ts | 5 +++-
.../server/utils/get_chat_params.test.ts | 7 +++--
.../server/utils/get_chat_params.ts | 5 +++-
.../esql_language_knowledge_base_tool.ts | 28 +++++++++++++------
.../server/connector_types/bedrock/bedrock.ts | 1 -
19 files changed, 96 insertions(+), 34 deletions(-)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm/openai.ts => language_models/chat_openai.ts} (88%)
create mode 100644 x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm => language_models}/helpers.test.ts (100%)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm => language_models}/helpers.ts (100%)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm => language_models}/index.ts (69%)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm/actions_client_llm.test.ts => language_models/llm.test.ts} (98%)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm/actions_client_llm.ts => language_models/llm.ts} (92%)
rename x-pack/packages/kbn-elastic-assistant-common/impl/{llm => language_models}/types.ts (100%)
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/openai.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
similarity index 88%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/openai.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
index 0e81cd1af155e..fb00873a0b0bb 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/openai.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
@@ -18,6 +18,7 @@ import {
ChatCompletionCreateParamsStreaming,
ChatCompletionCreateParamsNonStreaming,
} from 'openai/resources/chat/completions';
+import { DEFAULT_OPEN_AI_MODEL } from './constants';
import { InvokeAIActionParamsSchema } from './types';
const LLM_TYPE = 'ActionsClientChatOpenAI';
@@ -32,6 +33,7 @@ interface ActionsClientChatOpenAIParams {
traceId?: string;
maxRetries?: number;
model?: string;
+ temperature?: number;
signal?: AbortSignal;
}
@@ -53,6 +55,7 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
azureOpenAIApiKey = '';
openAIApiKey = '';
model?: string;
+ #temperature?: number;
// Kibana variables
#actions: ActionsPluginStart;
@@ -72,10 +75,13 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
maxRetries,
model,
signal,
+ temperature,
}: ActionsClientChatOpenAIParams) {
super({
maxRetries,
streaming: true,
+ // matters only for the LangSmith logs (Metadata > Invocation Params), which are misleading if this is not set
+ modelName: model ?? DEFAULT_OPEN_AI_MODEL,
// these have to be initialized, but are not actually used since we override the openai client with the actions client
azureOpenAIApiKey: 'nothing',
azureOpenAIApiDeploymentName: 'nothing',
@@ -94,6 +100,11 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
this.streaming = true;
this.#signal = signal;
this.model = model;
+ // to be passed to the actions client
+ this.#temperature = temperature;
+ // matters only for LangSmith logs (Metadata > Invocation Params)
+ // the connector can be passed an undefined temperature through #temperature
+ this.temperature = temperature ?? this.temperature;
}
getActionResultData(): string {
@@ -172,13 +183,15 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
// langchain expects stream to be of type AsyncIterator
subAction: 'invokeAsyncIterator',
subActionParams: {
+ temperature: this.#temperature,
+ // possible client model override
+ // security sends this from connectors, it is only missing from preconfigured connectors
+ // this should be undefined otherwise so the connector handles the model (stack_connector has access to preconfigured connector model values)
+ model: this.model,
+ // ensure we take the messages from the completion request, not the client request
n: completionRequest.n,
stop: completionRequest.stop,
- temperature: completionRequest.temperature,
functions: completionRequest.functions,
- // possible client model override
- model: this.model ?? completionRequest.model,
- // ensure we take the messages from the completion request, not the client request
messages: completionRequest.messages.map((message) => ({
role: message.role,
content: message.content ?? '',
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
new file mode 100644
index 0000000000000..11e8369b01dcf
--- /dev/null
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+export const getDefaultArguments = (llmType?: string, temperature?: number, stop?: string[]) =>
+ llmType === 'bedrock'
+ ? {
+ temperature: temperature ?? DEFAULT_BEDROCK_TEMPERATURE,
+ stopSequences: stop ?? DEFAULT_BEDROCK_STOP_SEQUENCES,
+ }
+ : { n: 1, stop: stop ?? null, temperature: temperature ?? DEFAULT_OPEN_AI_TEMPERATURE };
+
+export const DEFAULT_OPEN_AI_TEMPERATURE = 0.2;
+// this is a fallback for logging, connector will default to the connector model
+// x-pack/plugins/stack_connectors/common/openai/constants.ts
+export const DEFAULT_OPEN_AI_MODEL = 'gpt-4';
+const DEFAULT_BEDROCK_TEMPERATURE = 0;
+const DEFAULT_BEDROCK_STOP_SEQUENCES = ['\n\nHuman:', '\nObservation:'];
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/helpers.test.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/helpers.test.ts
similarity index 100%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/helpers.test.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/helpers.test.ts
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/helpers.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/helpers.ts
similarity index 100%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/helpers.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/helpers.ts
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/index.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/index.ts
similarity index 69%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/index.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/index.ts
index 07015185eb5bb..791ba33b18a18 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/index.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/index.ts
@@ -5,5 +5,5 @@
* 2.0.
*/
-export { ActionsClientChatOpenAI } from './openai';
-export { ActionsClientLlm } from './actions_client_llm';
+export { ActionsClientChatOpenAI } from './chat_openai';
+export { ActionsClientLlm } from './llm';
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.test.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.test.ts
similarity index 98%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.test.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.test.ts
index 9a0b98c02586e..7ef6d4a15db28 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.test.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.test.ts
@@ -9,7 +9,7 @@ import { KibanaRequest } from '@kbn/core/server';
import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server';
import { loggerMock } from '@kbn/logging-mocks';
-import { ActionsClientLlm } from './actions_client_llm';
+import { ActionsClientLlm } from './llm';
import { mockActionResponse } from '../mock/mock_action_response';
const connectorId = 'mock-connector-id';
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
similarity index 92%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
index 8df4c60817c6c..b67c617b84b14 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/actions_client_llm.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
@@ -10,15 +10,13 @@ import { KibanaRequest, Logger } from '@kbn/core/server';
import { LLM } from '@langchain/core/language_models/llms';
import { get } from 'lodash/fp';
import { v4 as uuidv4 } from 'uuid';
+import { getDefaultArguments } from './constants';
import { getMessageContentAndRole } from './helpers';
import { TraceOptions } from './types';
const LLM_TYPE = 'ActionsClientLlm';
-const DEFAULT_OPEN_AI_TEMPERATURE = 0.2;
-const DEFAULT_TEMPERATURE = 0;
-
interface ActionsClientLlmParams {
actions: ActionsPluginStart;
connectorId: string;
@@ -98,9 +96,7 @@ export class ActionsClientLlm extends LLM {
subActionParams: {
model: this.model,
messages: [assistantMessage], // the assistant message
- ...(this.llmType === 'openai'
- ? { n: 1, stop: null, temperature: this.temperature ?? DEFAULT_OPEN_AI_TEMPERATURE }
- : { temperature: this.temperature ?? DEFAULT_TEMPERATURE, stopSequences: [] }),
+ ...getDefaultArguments(this.llmType, this.temperature),
},
},
};
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/llm/types.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts
similarity index 100%
rename from x-pack/packages/kbn-elastic-assistant-common/impl/llm/types.ts
rename to x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts
diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.test.ts
index eebadb6488a19..103c0932f86c3 100644
--- a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.test.ts
+++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.test.ts
@@ -17,9 +17,12 @@ import { langChainMessages } from '../../../__mocks__/lang_chain_messages';
import { ESQL_RESOURCE } from '../../../routes/knowledge_base/constants';
import { callAgentExecutor } from '.';
import { PassThrough, Stream } from 'stream';
-import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import {
+ ActionsClientChatOpenAI,
+ ActionsClientLlm,
+} from '@kbn/elastic-assistant-common/impl/language_models';
-jest.mock('@kbn/elastic-assistant-common/impl/llm', () => ({
+jest.mock('@kbn/elastic-assistant-common/impl/language_models', () => ({
ActionsClientChatOpenAI: jest.fn(),
ActionsClientLlm: jest.fn(),
}));
@@ -141,6 +144,7 @@ describe('callAgentExecutor', () => {
maxRetries: 0,
request: mockRequest,
streaming: false,
+ temperature: 0.2,
llmType: 'openai',
});
});
@@ -179,6 +183,7 @@ describe('callAgentExecutor', () => {
maxRetries: 0,
request: mockRequest,
streaming: true,
+ temperature: 0.2,
llmType: 'openai',
});
});
diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts
index e1ad0c241a15b..e6863fa5550fe 100644
--- a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts
+++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts
@@ -12,7 +12,11 @@ import { ToolInterface } from '@langchain/core/tools';
import { streamFactory } from '@kbn/ml-response-stream/server';
import { transformError } from '@kbn/securitysolution-es-utils';
import { RetrievalQAChain } from 'langchain/chains';
-import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import {
+ ActionsClientChatOpenAI,
+ ActionsClientLlm,
+} from '@kbn/elastic-assistant-common/impl/language_models';
+import { getDefaultArguments } from '@kbn/elastic-assistant-common/impl/language_models/constants';
import { ElasticsearchStore } from '../elasticsearch_store/elasticsearch_store';
import { KNOWLEDGE_BASE_INDEX_PATTERN } from '../../../routes/knowledge_base/constants';
import { AgentExecutor } from '../executors/types';
@@ -59,7 +63,12 @@ export const callAgentExecutor: AgentExecutor = async ({
request,
llmType,
logger,
+ // possible client model override,
+ // let this be undefined otherwise so the connector handles the model
model: request.body.model,
+ // ensure this is defined because we default to it in the language_models
+ // This is where the LangSmith logs (Metadata > Invocation Params) are set
+ temperature: getDefaultArguments(llmType).temperature,
signal: abortSignal,
streaming: isStream,
// prevents the agent from retrying on failure
diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts
index 989e2935c82ef..2b3d07708e2e1 100644
--- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts
+++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts
@@ -10,7 +10,7 @@ import { RetrievalQAChain } from 'langchain/chains';
import { BufferMemory, ChatMessageHistory } from 'langchain/memory';
import { ChainTool } from 'langchain/tools/chain';
-import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/language_models';
import { ElasticsearchStore } from '../elasticsearch_store/elasticsearch_store';
import { KNOWLEDGE_BASE_INDEX_PATTERN } from '../../../routes/knowledge_base/constants';
import { AgentExecutor } from './types';
diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts
index 6b3cc92da1936..cde838afa8c28 100644
--- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts
+++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts
@@ -17,7 +17,7 @@ import {
PostEvaluateResponse,
ExecuteConnectorRequestBody,
} from '@kbn/elastic-assistant-common';
-import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/language_models';
import { buildRouteValidationWithZod } from '@kbn/elastic-assistant-common/impl/schemas/common';
import { ESQL_RESOURCE } from '../knowledge_base/constants';
import { buildResponse } from '../../lib/build_response';
diff --git a/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/helpers.ts b/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/helpers.ts
index 85b22e4c428fe..97167ea76bd4a 100644
--- a/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/helpers.ts
+++ b/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/helpers.ts
@@ -12,7 +12,7 @@ import {
ExecuteConnectorRequestBody,
Replacements,
} from '@kbn/elastic-assistant-common';
-import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/language_models';
import { AnonymizationFieldResponse } from '@kbn/elastic-assistant-common/impl/schemas/anonymization_fields/bulk_crud_anonymization_fields_route.gen';
import { v4 as uuidv4 } from 'uuid';
diff --git a/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/post_alerts_insights.ts b/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/post_alerts_insights.ts
index e58e4cd0f8e20..248e366646a8e 100644
--- a/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/post_alerts_insights.ts
+++ b/x-pack/plugins/elastic_assistant/server/routes/insights/alerts/post_alerts_insights.ts
@@ -6,7 +6,7 @@
*/
import { buildRouteValidationWithZod } from '@kbn/elastic-assistant-common/impl/schemas/common';
-import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/language_models';
import { type IKibanaResponse, IRouter, Logger } from '@kbn/core/server';
import {
AlertsInsightsPostRequestBody,
diff --git a/x-pack/plugins/elastic_assistant/server/types.ts b/x-pack/plugins/elastic_assistant/server/types.ts
index 7f3ef14fba08b..9fe2be7ae1fc6 100755
--- a/x-pack/plugins/elastic_assistant/server/types.ts
+++ b/x-pack/plugins/elastic_assistant/server/types.ts
@@ -34,7 +34,10 @@ import {
} from '@kbn/elastic-assistant-common';
import { AnonymizationFieldResponse } from '@kbn/elastic-assistant-common/impl/schemas/anonymization_fields/bulk_crud_anonymization_fields_route.gen';
import { LicensingApiRequestHandlerContext } from '@kbn/licensing-plugin/server';
-import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import {
+ ActionsClientChatOpenAI,
+ ActionsClientLlm,
+} from '@kbn/elastic-assistant-common/impl/language_models';
import { AIAssistantConversationsDataClient } from './ai_assistant_data_clients/conversations';
import type { GetRegisteredFeatures, GetRegisteredTools } from './services/app_context';
diff --git a/x-pack/plugins/search_playground/server/utils/get_chat_params.test.ts b/x-pack/plugins/search_playground/server/utils/get_chat_params.test.ts
index 579f4c9454b18..cb409461d0a48 100644
--- a/x-pack/plugins/search_playground/server/utils/get_chat_params.test.ts
+++ b/x-pack/plugins/search_playground/server/utils/get_chat_params.test.ts
@@ -6,7 +6,10 @@
*/
import { getChatParams } from './get_chat_params';
-import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import {
+ ActionsClientChatOpenAI,
+ ActionsClientLlm,
+} from '@kbn/elastic-assistant-common/impl/language_models';
import {
OPENAI_CONNECTOR_ID,
BEDROCK_CONNECTOR_ID,
@@ -15,7 +18,7 @@ import { Prompt } from '../../common/prompt';
import { KibanaRequest, Logger } from '@kbn/core/server';
import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server';
-jest.mock('@kbn/elastic-assistant-common/impl/llm', () => ({
+jest.mock('@kbn/elastic-assistant-common/impl/language_models', () => ({
ActionsClientChatOpenAI: jest.fn(),
ActionsClientLlm: jest.fn(),
}));
diff --git a/x-pack/plugins/search_playground/server/utils/get_chat_params.ts b/x-pack/plugins/search_playground/server/utils/get_chat_params.ts
index 56a379eaf1777..324870430b819 100644
--- a/x-pack/plugins/search_playground/server/utils/get_chat_params.ts
+++ b/x-pack/plugins/search_playground/server/utils/get_chat_params.ts
@@ -6,7 +6,10 @@
*/
import { OPENAI_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/openai/constants';
-import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/llm';
+import {
+ ActionsClientChatOpenAI,
+ ActionsClientLlm,
+} from '@kbn/elastic-assistant-common/impl/language_models';
import { v4 as uuidv4 } from 'uuid';
import { BEDROCK_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/bedrock/constants';
import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server';
diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts
index 5decc3ab0fc4b..567182d042339 100644
--- a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts
+++ b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts
@@ -5,17 +5,20 @@
* 2.0.
*/
-import { ChainTool } from 'langchain/tools/chain';
+import { DynamicTool } from '@langchain/core/tools';
import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server';
import { APP_UI_ID } from '../../../../common';
export type EsqlKnowledgeBaseToolParams = AssistantToolParams;
-export const ESQL_KNOWLEDGE_BASE_TOOL: AssistantTool = {
+const toolDetails = {
+ description:
+ 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language. Input must always be the query on a single line, with no other text. Only output valid ES|QL queries as described above. Do not add any additional text to describe your output.',
id: 'esql-knowledge-base-tool',
name: 'ESQLKnowledgeBaseTool',
- description:
- 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language.',
+};
+export const ESQL_KNOWLEDGE_BASE_TOOL: AssistantTool = {
+ ...toolDetails,
sourceRegister: APP_UI_ID,
isSupported: (params: AssistantToolParams): params is EsqlKnowledgeBaseToolParams => {
const { chain, isEnabledKnowledgeBase, modelExists } = params;
@@ -27,11 +30,18 @@ export const ESQL_KNOWLEDGE_BASE_TOOL: AssistantTool = {
const { chain } = params as EsqlKnowledgeBaseToolParams;
if (chain == null) return null;
- return new ChainTool({
- name: 'ESQLKnowledgeBaseTool',
- description:
- 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language.',
- chain,
+ return new DynamicTool({
+ name: toolDetails.name,
+ description: toolDetails.description,
+ func: async (input, _, cbManager) => {
+ const result = await chain.invoke(
+ {
+ query: input,
+ },
+ cbManager
+ );
+ return result.text;
+ },
tags: ['esql', 'query-generation', 'knowledge-base'],
});
},
diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
index bca91289d7daa..c652d5fd55f53 100644
--- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
+++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
@@ -328,7 +328,6 @@ const formatBedrockBody = ({
/**
* Ensures that the messages are in the correct format for the Bedrock API
- * Bedrock only accepts assistant and user roles.
* If 2 user or 2 assistant messages are sent in a row, Bedrock throws an error
* We combine the messages into a single message to avoid this error
* @param messages
From 5c39f1b55219876ef50af3b9969238bd90971ad2 Mon Sep 17 00:00:00 2001
From: Steph Milovic
Date: Mon, 22 Apr 2024 21:00:27 -0500
Subject: [PATCH 045/183] [GenAI Connectors] Add optional timeout parameter to
GenAI connectors (#181207)
---
.../impl/language_models/chat_openai.ts | 9 +-
.../impl/language_models/constants.ts | 1 +
.../impl/language_models/llm.ts | 8 +-
.../impl/language_models/types.ts | 1 +
.../connector_types.test.ts.snap | 52 +++++++++
.../common/bedrock/constants.ts | 1 +
.../stack_connectors/common/bedrock/schema.ts | 2 +
.../common/openai/constants.ts | 2 +
.../stack_connectors/common/openai/schema.ts | 3 +
.../connector_types/bedrock/bedrock.test.ts | 26 +++--
.../server/connector_types/bedrock/bedrock.ts | 15 ++-
.../connector_types/openai/openai.test.ts | 104 ++++++++++++------
.../server/connector_types/openai/openai.ts | 23 ++--
13 files changed, 190 insertions(+), 57 deletions(-)
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
index fb00873a0b0bb..b334ae3a0928a 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/chat_openai.ts
@@ -18,7 +18,7 @@ import {
ChatCompletionCreateParamsStreaming,
ChatCompletionCreateParamsNonStreaming,
} from 'openai/resources/chat/completions';
-import { DEFAULT_OPEN_AI_MODEL } from './constants';
+import { DEFAULT_OPEN_AI_MODEL, DEFAULT_TIMEOUT } from './constants';
import { InvokeAIActionParamsSchema } from './types';
const LLM_TYPE = 'ActionsClientChatOpenAI';
@@ -35,6 +35,7 @@ interface ActionsClientChatOpenAIParams {
model?: string;
temperature?: number;
signal?: AbortSignal;
+ timeout?: number;
}
/**
@@ -65,6 +66,8 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
#actionResultData: string;
#traceId: string;
#signal?: AbortSignal;
+ #timeout?: number;
+
constructor({
actions,
connectorId,
@@ -76,6 +79,7 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
model,
signal,
temperature,
+ timeout,
}: ActionsClientChatOpenAIParams) {
super({
maxRetries,
@@ -96,6 +100,7 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
this.llmType = llmType ?? LLM_TYPE;
this.#logger = logger;
this.#request = request;
+ this.#timeout = timeout;
this.#actionResultData = '';
this.streaming = true;
this.#signal = signal;
@@ -201,6 +206,8 @@ export class ActionsClientChatOpenAI extends ChatOpenAI {
...('tool_call_id' in message ? { tool_call_id: message?.tool_call_id } : {}),
})),
signal: this.#signal,
+ // This timeout is large because LangChain prompts can be complicated and take a long time
+ timeout: this.#timeout ?? DEFAULT_TIMEOUT,
},
},
signal: this.#signal,
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
index 11e8369b01dcf..d4d38d172f975 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/constants.ts
@@ -19,3 +19,4 @@ export const DEFAULT_OPEN_AI_TEMPERATURE = 0.2;
export const DEFAULT_OPEN_AI_MODEL = 'gpt-4';
const DEFAULT_BEDROCK_TEMPERATURE = 0;
const DEFAULT_BEDROCK_STOP_SEQUENCES = ['\n\nHuman:', '\nObservation:'];
+export const DEFAULT_TIMEOUT = 180000;
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
index b67c617b84b14..9708a8d3a5d7f 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/llm.ts
@@ -10,7 +10,7 @@ import { KibanaRequest, Logger } from '@kbn/core/server';
import { LLM } from '@langchain/core/language_models/llms';
import { get } from 'lodash/fp';
import { v4 as uuidv4 } from 'uuid';
-import { getDefaultArguments } from './constants';
+import { DEFAULT_TIMEOUT, getDefaultArguments } from './constants';
import { getMessageContentAndRole } from './helpers';
import { TraceOptions } from './types';
@@ -25,6 +25,7 @@ interface ActionsClientLlmParams {
request: KibanaRequest;
model?: string;
temperature?: number;
+ timeout?: number;
traceId?: string;
traceOptions?: TraceOptions;
}
@@ -35,6 +36,7 @@ export class ActionsClientLlm extends LLM {
#logger: Logger;
#request: KibanaRequest;
#traceId: string;
+ #timeout?: number;
// Local `llmType` as it can change and needs to be accessed by abstract `_llmType()` method
// Not using getter as `this._llmType()` is called in the constructor via `super({})`
@@ -52,6 +54,7 @@ export class ActionsClientLlm extends LLM {
model,
request,
temperature,
+ timeout,
traceOptions,
}: ActionsClientLlmParams) {
super({
@@ -64,6 +67,7 @@ export class ActionsClientLlm extends LLM {
this.llmType = llmType ?? LLM_TYPE;
this.#logger = logger;
this.#request = request;
+ this.#timeout = timeout;
this.model = model;
this.temperature = temperature;
}
@@ -97,6 +101,8 @@ export class ActionsClientLlm extends LLM {
model: this.model,
messages: [assistantMessage], // the assistant message
...getDefaultArguments(this.llmType, this.temperature),
+ // This timeout is large because LangChain prompts can be complicated and take a long time
+ timeout: this.#timeout ?? DEFAULT_TIMEOUT,
},
},
};
diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts
index 5fd08e6ee4e2d..e4d582f02495d 100644
--- a/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts
+++ b/x-pack/packages/kbn-elastic-assistant-common/impl/language_models/types.ts
@@ -38,6 +38,7 @@ export interface InvokeAIActionParamsSchema {
temperature?: ChatCompletionCreateParamsNonStreaming['temperature'];
functions?: ChatCompletionCreateParamsNonStreaming['functions'];
signal?: AbortSignal;
+ timeout?: number;
}
export interface TraceOptions {
diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap
index 77ee286e4b70f..ffe337fdcde4d 100644
--- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap
+++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap
@@ -58,6 +58,19 @@ Object {
],
"type": "any",
},
+ "timeout": Object {
+ "flags": Object {
+ "default": [Function],
+ "error": [Function],
+ "presence": "optional",
+ },
+ "metas": Array [
+ Object {
+ "x-oas-optional": true,
+ },
+ ],
+ "type": "number",
+ },
},
"preferences": Object {
"stripUnknown": Object {
@@ -160,6 +173,19 @@ Object {
],
"type": "any",
},
+ "timeout": Object {
+ "flags": Object {
+ "default": [Function],
+ "error": [Function],
+ "presence": "optional",
+ },
+ "metas": Array [
+ Object {
+ "x-oas-optional": true,
+ },
+ ],
+ "type": "number",
+ },
},
"preferences": Object {
"stripUnknown": Object {
@@ -331,6 +357,19 @@ Object {
],
"type": "number",
},
+ "timeout": Object {
+ "flags": Object {
+ "default": [Function],
+ "error": [Function],
+ "presence": "optional",
+ },
+ "metas": Array [
+ Object {
+ "x-oas-optional": true,
+ },
+ ],
+ "type": "number",
+ },
},
"preferences": Object {
"stripUnknown": Object {
@@ -502,6 +541,19 @@ Object {
],
"type": "number",
},
+ "timeout": Object {
+ "flags": Object {
+ "default": [Function],
+ "error": [Function],
+ "presence": "optional",
+ },
+ "metas": Array [
+ Object {
+ "x-oas-optional": true,
+ },
+ ],
+ "type": "number",
+ },
},
"preferences": Object {
"stripUnknown": Object {
diff --git a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts
index f17e4f8005c68..053ca82e0e274 100644
--- a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts
+++ b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts
@@ -22,6 +22,7 @@ export enum SUB_ACTION {
TEST = 'test',
}
+export const DEFAULT_TIMEOUT_MS = 120000;
export const DEFAULT_TOKEN_LIMIT = 8191;
export const DEFAULT_BEDROCK_MODEL = 'anthropic.claude-3-sonnet-20240229-v1:0';
diff --git a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts
index fced4b4d9c818..2fade1be5fc40 100644
--- a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts
+++ b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts
@@ -24,6 +24,7 @@ export const RunActionParamsSchema = schema.object({
model: schema.maybe(schema.string()),
// abort signal from client
signal: schema.maybe(schema.any()),
+ timeout: schema.maybe(schema.number()),
});
export const InvokeAIActionParamsSchema = schema.object({
@@ -39,6 +40,7 @@ export const InvokeAIActionParamsSchema = schema.object({
system: schema.maybe(schema.string()),
// abort signal from client
signal: schema.maybe(schema.any()),
+ timeout: schema.maybe(schema.number()),
});
export const InvokeAIActionResponseSchema = schema.object({
diff --git a/x-pack/plugins/stack_connectors/common/openai/constants.ts b/x-pack/plugins/stack_connectors/common/openai/constants.ts
index 09f791796d234..8614d5ce43780 100644
--- a/x-pack/plugins/stack_connectors/common/openai/constants.ts
+++ b/x-pack/plugins/stack_connectors/common/openai/constants.ts
@@ -29,6 +29,8 @@ export enum OpenAiProviderType {
AzureAi = 'Azure OpenAI',
}
+export const DEFAULT_TIMEOUT_MS = 120000;
+
export const DEFAULT_OPENAI_MODEL = 'gpt-4';
export const OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions' as const;
diff --git a/x-pack/plugins/stack_connectors/common/openai/schema.ts b/x-pack/plugins/stack_connectors/common/openai/schema.ts
index 4608eade318eb..a9e5b0e722dbd 100644
--- a/x-pack/plugins/stack_connectors/common/openai/schema.ts
+++ b/x-pack/plugins/stack_connectors/common/openai/schema.ts
@@ -30,6 +30,7 @@ export const RunActionParamsSchema = schema.object({
body: schema.string(),
// abort signal from client
signal: schema.maybe(schema.any()),
+ timeout: schema.maybe(schema.number()),
});
const AIMessage = schema.object({
@@ -98,6 +99,7 @@ export const InvokeAIActionParamsSchema = schema.object({
temperature: schema.maybe(schema.number()),
// abort signal from client
signal: schema.maybe(schema.any()),
+ timeout: schema.maybe(schema.number()),
});
export const InvokeAIActionResponseSchema = schema.object({
@@ -118,6 +120,7 @@ export const StreamActionParamsSchema = schema.object({
stream: schema.boolean({ defaultValue: false }),
// abort signal from client
signal: schema.maybe(schema.any()),
+ timeout: schema.maybe(schema.number()),
});
export const StreamingResponseSchema = schema.any();
diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts
index 49291bd789bc0..24564488ddf57 100644
--- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts
+++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts
@@ -20,6 +20,7 @@ import {
DEFAULT_BEDROCK_MODEL,
DEFAULT_BEDROCK_URL,
DEFAULT_TOKEN_LIMIT,
+ DEFAULT_TIMEOUT_MS,
} from '../../../common/bedrock/constants';
import { DEFAULT_BODY } from '../../../public/connector_types/bedrock/constants';
import { initDashboard } from '../lib/gen_ai/create_gen_ai_dashboard';
@@ -104,7 +105,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -131,7 +132,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunActionResponseSchema,
@@ -200,9 +201,10 @@ describe('BedrockConnector', () => {
});
});
- it('signal is properly passed to streamApi', async () => {
+ it('signal and timeout is properly passed to streamApi', async () => {
const signal = jest.fn();
- await connector.invokeStream({ ...aiAssistantBody, signal });
+ const timeout = 180000;
+ await connector.invokeStream({ ...aiAssistantBody, timeout, signal });
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
@@ -211,6 +213,7 @@ describe('BedrockConnector', () => {
responseSchema: StreamingResponseSchema,
responseType: 'stream',
data: JSON.stringify({ ...JSON.parse(DEFAULT_BODY), temperature: 0 }),
+ timeout,
signal,
});
});
@@ -377,7 +380,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -415,7 +418,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -455,7 +458,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -499,7 +502,7 @@ describe('BedrockConnector', () => {
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
+ timeout: DEFAULT_TIMEOUT_MS,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -517,13 +520,13 @@ describe('BedrockConnector', () => {
});
expect(response.message).toEqual(mockResponseString);
});
- it('signal is properly passed to runApi', async () => {
+ it('signal and timeout is properly passed to runApi', async () => {
const signal = jest.fn();
- await connector.invokeAI({ ...aiAssistantBody, signal });
+ const timeout = 180000;
+ await connector.invokeAI({ ...aiAssistantBody, timeout, signal });
expect(mockRequest).toHaveBeenCalledWith({
signed: true,
- timeout: 120000,
url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke`,
method: 'post',
responseSchema: RunApiLatestResponseSchema,
@@ -533,6 +536,7 @@ describe('BedrockConnector', () => {
max_tokens: DEFAULT_TOKEN_LIMIT,
temperature: 0,
}),
+ timeout,
signal,
});
});
diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
index c652d5fd55f53..1a4b6aad6653e 100644
--- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
+++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts
@@ -28,7 +28,11 @@ import {
InvokeAIActionResponse,
RunApiLatestResponse,
} from '../../../common/bedrock/types';
-import { SUB_ACTION, DEFAULT_TOKEN_LIMIT } from '../../../common/bedrock/constants';
+import {
+ SUB_ACTION,
+ DEFAULT_TOKEN_LIMIT,
+ DEFAULT_TIMEOUT_MS,
+} from '../../../common/bedrock/constants';
import {
DashboardActionParams,
DashboardActionResponse,
@@ -207,6 +211,7 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
body,
model: reqModel,
signal,
+ timeout,
}: RunActionParams): Promise {
// set model on per request basis
const currentModel = reqModel ?? this.model;
@@ -219,7 +224,7 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
data: body,
signal,
// give up to 2 minutes for response
- timeout: 120000,
+ timeout: timeout ?? DEFAULT_TIMEOUT_MS,
};
// possible api received deprecated arguments, which will still work with the deprecated Claude 2 models
if (usesDeprecatedArguments(body)) {
@@ -240,6 +245,7 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
body,
model: reqModel,
signal,
+ timeout,
}: RunActionParams): Promise {
// set model on per request basis
const path = `/model/${reqModel ?? this.model}/invoke-with-response-stream`;
@@ -253,6 +259,7 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
data: body,
responseType: 'stream',
signal,
+ timeout,
});
return response.data.pipe(new PassThrough());
@@ -273,11 +280,13 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
system,
temperature,
signal,
+ timeout,
}: InvokeAIActionParams): Promise {
const res = (await this.streamApi({
body: JSON.stringify(formatBedrockBody({ messages, stopSequences, system, temperature })),
model,
signal,
+ timeout,
})) as unknown as IncomingMessage;
return res;
}
@@ -297,11 +306,13 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B
system,
temperature,
signal,
+ timeout,
}: InvokeAIActionParams): Promise {
const res = await this.runApi({
body: JSON.stringify(formatBedrockBody({ messages, stopSequences, system, temperature })),
model,
signal,
+ timeout,
});
return { message: res.completion.trim() };
}
diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts
index fdd0cba601b64..6f0974fe1796d 100644
--- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts
+++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts
@@ -10,6 +10,7 @@ import { OpenAIConnector } from './openai';
import { actionsConfigMock } from '@kbn/actions-plugin/server/actions_config.mock';
import {
DEFAULT_OPENAI_MODEL,
+ DEFAULT_TIMEOUT_MS,
OPENAI_CONNECTOR_ID,
OpenAiProviderType,
} from '../../../common/openai/constants';
@@ -24,7 +25,12 @@ const mockTee = jest.fn();
const mockCreate = jest.fn().mockImplementation(() => ({
tee: mockTee.mockReturnValue([jest.fn(), jest.fn()]),
}));
-
+const mockDefaults = {
+ timeout: DEFAULT_TIMEOUT_MS,
+ url: 'https://api.openai.com/v1/chat/completions',
+ method: 'post',
+ responseSchema: RunActionResponseSchema,
+};
jest.mock('openai', () => ({
__esModule: true,
default: jest.fn().mockImplementation(() => ({
@@ -110,10 +116,7 @@ describe('OpenAIConnector', () => {
const response = await connector.runApi({ body: JSON.stringify(sampleOpenAiBody) });
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
headers: {
Authorization: 'Bearer 123',
@@ -129,10 +132,7 @@ describe('OpenAIConnector', () => {
const response = await connector.runApi({ body: JSON.stringify(requestBody) });
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...requestBody, stream: false }),
headers: {
Authorization: 'Bearer 123',
@@ -147,10 +147,7 @@ describe('OpenAIConnector', () => {
const response = await connector.runApi({ body: JSON.stringify(sampleOpenAiBody) });
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
headers: {
Authorization: 'Bearer 123',
@@ -179,10 +176,7 @@ describe('OpenAIConnector', () => {
});
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({
...body,
stream: false,
@@ -355,6 +349,25 @@ describe('OpenAIConnector', () => {
});
});
+ it('timeout is properly passed to streamApi', async () => {
+ const timeout = 180000;
+ await connector.invokeStream({ ...sampleOpenAiBody, timeout });
+
+ expect(mockRequest).toHaveBeenCalledWith({
+ url: 'https://api.openai.com/v1/chat/completions',
+ method: 'post',
+ responseSchema: StreamingResponseSchema,
+ responseType: 'stream',
+ data: JSON.stringify({ ...sampleOpenAiBody, stream: true, model: DEFAULT_OPENAI_MODEL }),
+ headers: {
+ Authorization: 'Bearer 123',
+ 'X-My-Custom-Header': 'foo',
+ 'content-type': 'application/json',
+ },
+ timeout,
+ });
+ });
+
it('errors during API calls are properly handled', async () => {
// @ts-ignore
connector.request = mockError;
@@ -375,10 +388,7 @@ describe('OpenAIConnector', () => {
const response = await connector.invokeAI(sampleOpenAiBody);
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
headers: {
Authorization: 'Bearer 123',
@@ -395,10 +405,7 @@ describe('OpenAIConnector', () => {
await connector.invokeAI({ ...sampleOpenAiBody, signal });
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
headers: {
Authorization: 'Bearer 123',
@@ -409,6 +416,22 @@ describe('OpenAIConnector', () => {
});
});
+ it('timeout is properly passed to runApi', async () => {
+ const timeout = 180000;
+ await connector.invokeAI({ ...sampleOpenAiBody, timeout });
+
+ expect(mockRequest).toHaveBeenCalledWith({
+ ...mockDefaults,
+ data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
+ headers: {
+ Authorization: 'Bearer 123',
+ 'X-My-Custom-Header': 'foo',
+ 'content-type': 'application/json',
+ },
+ timeout,
+ });
+ });
+
it('errors during API calls are properly handled', async () => {
// @ts-ignore
connector.request = mockError;
@@ -431,6 +454,24 @@ describe('OpenAIConnector', () => {
);
expect(mockTee).toBeCalledTimes(1);
});
+ it('signal and timeout is properly passed', async () => {
+ const timeout = 180000;
+ const signal = jest.fn();
+ await connector.invokeAsyncIterator({ ...sampleOpenAiBody, signal, timeout });
+ expect(mockRequest).toBeCalledTimes(0);
+ expect(mockCreate).toHaveBeenCalledWith(
+ {
+ ...sampleOpenAiBody,
+ stream: true,
+ model: DEFAULT_OPENAI_MODEL,
+ },
+ {
+ signal,
+ timeout,
+ }
+ );
+ expect(mockTee).toBeCalledTimes(1);
+ });
it('errors during API calls are properly handled', async () => {
mockCreate.mockImplementationOnce(() => {
@@ -530,10 +571,7 @@ describe('OpenAIConnector', () => {
const response = await connector.runApi({ body: JSON.stringify(sampleOpenAiBody) });
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
- url: 'https://api.openai.com/v1/chat/completions',
- method: 'post',
- responseSchema: RunActionResponseSchema,
+ ...mockDefaults,
data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }),
headers: {
Authorization: 'Bearer 123',
@@ -579,10 +617,8 @@ describe('OpenAIConnector', () => {
const response = await connector.runApi({ body: JSON.stringify(sampleAzureAiBody) });
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
+ ...mockDefaults,
url: 'https://My-test-resource-123.openai.azure.com/openai/deployments/NEW-DEPLOYMENT-321/chat/completions?api-version=2023-05-15',
- method: 'post',
- responseSchema: RunActionResponseSchema,
data: JSON.stringify({ ...sampleAzureAiBody, stream: false }),
headers: {
'api-key': '123',
@@ -606,10 +642,8 @@ describe('OpenAIConnector', () => {
});
expect(mockRequest).toBeCalledTimes(1);
expect(mockRequest).toHaveBeenCalledWith({
- timeout: 120000,
+ ...mockDefaults,
url: 'https://My-test-resource-123.openai.azure.com/openai/deployments/NEW-DEPLOYMENT-321/chat/completions?api-version=2023-05-15',
- method: 'post',
- responseSchema: RunActionResponseSchema,
data: JSON.stringify({ ...sampleAzureAiBody, stream: false }),
headers: {
'api-key': '123',
diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts
index 2f119159a74ef..bab615cbf7e58 100644
--- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts
+++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts
@@ -34,6 +34,7 @@ import type {
} from '../../../common/openai/types';
import {
DEFAULT_OPENAI_MODEL,
+ DEFAULT_TIMEOUT_MS,
OpenAiProviderType,
SUB_ACTION,
} from '../../../common/openai/constants';
@@ -155,7 +156,7 @@ export class OpenAIConnector extends SubActionConnector {
* responsible for making a POST request to the external API endpoint and returning the response data
* @param body The stringified request body to be sent in the POST request.
*/
- public async runApi({ body, signal }: RunActionParams): Promise {
+ public async runApi({ body, signal, timeout }: RunActionParams): Promise {
const sanitizedBody = sanitizeRequest(
this.provider,
this.url,
@@ -170,7 +171,7 @@ export class OpenAIConnector extends SubActionConnector {
data: sanitizedBody,
signal,
// give up to 2 minutes for response
- timeout: 120000,
+ timeout: timeout ?? DEFAULT_TIMEOUT_MS,
...axiosOptions,
headers: {
...this.config.headers,
@@ -188,7 +189,12 @@ export class OpenAIConnector extends SubActionConnector {
* @param body request body for the API request
* @param stream flag indicating whether it is a streaming request or not
*/
- public async streamApi({ body, stream, signal }: StreamActionParams): Promise {
+ public async streamApi({
+ body,
+ stream,
+ signal,
+ timeout,
+ }: StreamActionParams): Promise {
const executeBody = getRequestWithStreamOption(
this.provider,
this.url,
@@ -210,6 +216,7 @@ export class OpenAIConnector extends SubActionConnector {
...this.config.headers,
...axiosOptions.headers,
},
+ timeout,
});
return stream ? pipeStreamingResponse(response) : response.data;
}
@@ -258,12 +265,13 @@ export class OpenAIConnector extends SubActionConnector {
* @param body - the OpenAI Invoke request body
*/
public async invokeStream(body: InvokeAIActionParams): Promise {
- const { signal, ...rest } = body;
+ const { signal, timeout, ...rest } = body;
const res = (await this.streamApi({
body: JSON.stringify(rest),
stream: true,
signal,
+ timeout, // do not default if not provided
})) as unknown as IncomingMessage;
return res.pipe(new PassThrough());
@@ -283,7 +291,7 @@ export class OpenAIConnector extends SubActionConnector {
tokenCountStream: Stream;
}> {
try {
- const { signal, ...rest } = body;
+ const { signal, timeout, ...rest } = body;
const messages = rest.messages as unknown as ChatCompletionMessageParam[];
const requestBody: ChatCompletionCreateParamsStreaming = {
...rest,
@@ -295,6 +303,7 @@ export class OpenAIConnector extends SubActionConnector {
};
const stream = await this.openAI.chat.completions.create(requestBody, {
signal,
+ timeout, // do not default if not provided
});
// splits the stream in two, teed[0] is used for the UI and teed[1] for token tracking
const teed = stream.tee();
@@ -314,8 +323,8 @@ export class OpenAIConnector extends SubActionConnector {
* @returns an object with the response string and the usage object
*/
public async invokeAI(body: InvokeAIActionParams): Promise {
- const { signal, ...rest } = body;
- const res = await this.runApi({ body: JSON.stringify(rest), signal });
+ const { signal, timeout, ...rest } = body;
+ const res = await this.runApi({ body: JSON.stringify(rest), signal, timeout });
if (res.choices && res.choices.length > 0 && res.choices[0].message?.content) {
const result = res.choices[0].message.content.trim();
From 7e47578aea86e9a1ef1255afa92aae304dfe5b27 Mon Sep 17 00:00:00 2001
From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Date: Tue, 23 Apr 2024 01:10:33 -0400
Subject: [PATCH 046/183] [api-docs] 2024-04-23 Daily api_docs build (#181370)
Generated by
https://buildkite.com/elastic/kibana-api-docs-daily/builds/682
---
api_docs/actions.mdx | 2 +-
api_docs/advanced_settings.mdx | 2 +-
.../ai_assistant_management_selection.mdx | 2 +-
api_docs/aiops.mdx | 2 +-
api_docs/alerting.mdx | 2 +-
api_docs/apm.mdx | 2 +-
api_docs/apm_data_access.mdx | 2 +-
api_docs/asset_manager.mdx | 2 +-
api_docs/banners.mdx | 2 +-
api_docs/bfetch.mdx | 2 +-
api_docs/canvas.mdx | 2 +-
api_docs/cases.mdx | 2 +-
api_docs/charts.mdx | 2 +-
api_docs/cloud.mdx | 2 +-
api_docs/cloud_data_migration.mdx | 2 +-
api_docs/cloud_defend.mdx | 2 +-
api_docs/cloud_experiments.mdx | 2 +-
api_docs/cloud_security_posture.mdx | 2 +-
api_docs/console.mdx | 2 +-
api_docs/content_management.mdx | 2 +-
api_docs/controls.mdx | 2 +-
api_docs/custom_integrations.mdx | 2 +-
api_docs/dashboard.mdx | 2 +-
api_docs/dashboard_enhanced.mdx | 2 +-
api_docs/data.devdocs.json | 32 +++++
api_docs/data.mdx | 4 +-
api_docs/data_query.mdx | 4 +-
api_docs/data_search.devdocs.json | 18 ++-
api_docs/data_search.mdx | 4 +-
api_docs/data_view_editor.mdx | 2 +-
api_docs/data_view_field_editor.mdx | 2 +-
api_docs/data_view_management.mdx | 2 +-
api_docs/data_views.mdx | 2 +-
api_docs/data_visualizer.mdx | 2 +-
api_docs/dataset_quality.mdx | 2 +-
api_docs/deprecations_by_api.mdx | 2 +-
api_docs/deprecations_by_plugin.mdx | 2 +-
api_docs/deprecations_by_team.mdx | 2 +-
api_docs/dev_tools.mdx | 2 +-
api_docs/discover.mdx | 2 +-
api_docs/discover_enhanced.mdx | 2 +-
api_docs/ecs_data_quality_dashboard.mdx | 2 +-
api_docs/elastic_assistant.mdx | 2 +-
api_docs/embeddable.devdocs.json | 21 ++++
api_docs/embeddable.mdx | 4 +-
api_docs/embeddable_enhanced.mdx | 2 +-
api_docs/encrypted_saved_objects.mdx | 2 +-
api_docs/enterprise_search.mdx | 2 +-
api_docs/es_ui_shared.mdx | 2 +-
api_docs/event_annotation.mdx | 2 +-
api_docs/event_annotation_listing.mdx | 2 +-
api_docs/event_log.mdx | 2 +-
api_docs/exploratory_view.mdx | 2 +-
api_docs/expression_error.mdx | 2 +-
api_docs/expression_gauge.mdx | 2 +-
api_docs/expression_heatmap.mdx | 2 +-
api_docs/expression_image.mdx | 2 +-
api_docs/expression_legacy_metric_vis.mdx | 2 +-
api_docs/expression_metric.mdx | 2 +-
api_docs/expression_metric_vis.mdx | 2 +-
api_docs/expression_partition_vis.mdx | 2 +-
api_docs/expression_repeat_image.mdx | 2 +-
api_docs/expression_reveal_image.mdx | 2 +-
api_docs/expression_shape.mdx | 2 +-
api_docs/expression_tagcloud.mdx | 2 +-
api_docs/expression_x_y.mdx | 2 +-
api_docs/expressions.mdx | 2 +-
api_docs/features.mdx | 2 +-
api_docs/field_formats.mdx | 2 +-
api_docs/file_upload.mdx | 2 +-
api_docs/files.mdx | 2 +-
api_docs/files_management.mdx | 2 +-
api_docs/fleet.mdx | 2 +-
api_docs/global_search.mdx | 2 +-
api_docs/guided_onboarding.mdx | 2 +-
api_docs/home.mdx | 2 +-
api_docs/image_embeddable.mdx | 2 +-
api_docs/index_lifecycle_management.mdx | 2 +-
api_docs/index_management.mdx | 2 +-
api_docs/infra.mdx | 2 +-
api_docs/ingest_pipelines.mdx | 2 +-
api_docs/inspector.mdx | 2 +-
api_docs/interactive_setup.mdx | 2 +-
api_docs/kbn_ace.mdx | 2 +-
api_docs/kbn_actions_types.mdx | 2 +-
api_docs/kbn_aiops_components.mdx | 2 +-
api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +-
api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +-
.../kbn_alerting_api_integration_helpers.mdx | 2 +-
api_docs/kbn_alerting_state_types.mdx | 2 +-
api_docs/kbn_alerting_types.mdx | 2 +-
api_docs/kbn_alerts_as_data_utils.mdx | 2 +-
api_docs/kbn_alerts_ui_shared.mdx | 2 +-
api_docs/kbn_analytics.mdx | 2 +-
api_docs/kbn_analytics_client.mdx | 2 +-
api_docs/kbn_analytics_collection_utils.mdx | 2 +-
..._analytics_shippers_elastic_v3_browser.mdx | 2 +-
...n_analytics_shippers_elastic_v3_common.mdx | 2 +-
...n_analytics_shippers_elastic_v3_server.mdx | 2 +-
api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +-
api_docs/kbn_apm_config_loader.mdx | 2 +-
api_docs/kbn_apm_data_view.mdx | 2 +-
api_docs/kbn_apm_synthtrace.mdx | 2 +-
api_docs/kbn_apm_synthtrace_client.mdx | 2 +-
api_docs/kbn_apm_utils.mdx | 2 +-
api_docs/kbn_axe_config.mdx | 2 +-
api_docs/kbn_bfetch_error.mdx | 2 +-
api_docs/kbn_calculate_auto.mdx | 2 +-
.../kbn_calculate_width_from_char_count.mdx | 2 +-
api_docs/kbn_cases_components.mdx | 2 +-
api_docs/kbn_cell_actions.mdx | 2 +-
api_docs/kbn_chart_expressions_common.mdx | 2 +-
api_docs/kbn_chart_icons.mdx | 2 +-
api_docs/kbn_ci_stats_core.mdx | 2 +-
api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +-
api_docs/kbn_ci_stats_reporter.mdx | 2 +-
api_docs/kbn_cli_dev_mode.mdx | 2 +-
api_docs/kbn_code_editor.mdx | 2 +-
api_docs/kbn_code_editor_mock.mdx | 2 +-
api_docs/kbn_code_owners.mdx | 2 +-
api_docs/kbn_coloring.mdx | 2 +-
api_docs/kbn_config.mdx | 2 +-
api_docs/kbn_config_mocks.mdx | 2 +-
api_docs/kbn_config_schema.mdx | 2 +-
.../kbn_content_management_content_editor.mdx | 2 +-
...tent_management_tabbed_table_list_view.mdx | 2 +-
...kbn_content_management_table_list_view.mdx | 2 +-
...tent_management_table_list_view_common.mdx | 2 +-
...ntent_management_table_list_view_table.mdx | 2 +-
api_docs/kbn_content_management_utils.mdx | 2 +-
api_docs/kbn_core_analytics_browser.mdx | 2 +-
.../kbn_core_analytics_browser_internal.mdx | 2 +-
api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +-
api_docs/kbn_core_analytics_server.mdx | 2 +-
.../kbn_core_analytics_server_internal.mdx | 2 +-
api_docs/kbn_core_analytics_server_mocks.mdx | 2 +-
api_docs/kbn_core_application_browser.mdx | 2 +-
.../kbn_core_application_browser_internal.mdx | 2 +-
.../kbn_core_application_browser_mocks.mdx | 2 +-
api_docs/kbn_core_application_common.mdx | 2 +-
api_docs/kbn_core_apps_browser_internal.mdx | 2 +-
api_docs/kbn_core_apps_browser_mocks.mdx | 2 +-
api_docs/kbn_core_apps_server_internal.mdx | 2 +-
api_docs/kbn_core_base_browser_mocks.mdx | 2 +-
api_docs/kbn_core_base_common.mdx | 2 +-
api_docs/kbn_core_base_server_internal.mdx | 2 +-
api_docs/kbn_core_base_server_mocks.mdx | 2 +-
.../kbn_core_capabilities_browser_mocks.mdx | 2 +-
api_docs/kbn_core_capabilities_common.mdx | 2 +-
api_docs/kbn_core_capabilities_server.mdx | 2 +-
.../kbn_core_capabilities_server_mocks.mdx | 2 +-
api_docs/kbn_core_chrome_browser.devdocs.json | 2 +-
api_docs/kbn_core_chrome_browser.mdx | 2 +-
api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +-
api_docs/kbn_core_config_server_internal.mdx | 2 +-
api_docs/kbn_core_custom_branding_browser.mdx | 2 +-
..._core_custom_branding_browser_internal.mdx | 2 +-
...kbn_core_custom_branding_browser_mocks.mdx | 2 +-
api_docs/kbn_core_custom_branding_common.mdx | 2 +-
api_docs/kbn_core_custom_branding_server.mdx | 2 +-
...n_core_custom_branding_server_internal.mdx | 2 +-
.../kbn_core_custom_branding_server_mocks.mdx | 2 +-
api_docs/kbn_core_deprecations_browser.mdx | 2 +-
...kbn_core_deprecations_browser_internal.mdx | 2 +-
.../kbn_core_deprecations_browser_mocks.mdx | 2 +-
api_docs/kbn_core_deprecations_common.mdx | 2 +-
api_docs/kbn_core_deprecations_server.mdx | 2 +-
.../kbn_core_deprecations_server_internal.mdx | 2 +-
.../kbn_core_deprecations_server_mocks.mdx | 2 +-
api_docs/kbn_core_doc_links_browser.mdx | 2 +-
api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +-
api_docs/kbn_core_doc_links_server.mdx | 2 +-
api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +-
...e_elasticsearch_client_server_internal.mdx | 2 +-
...core_elasticsearch_client_server_mocks.mdx | 2 +-
api_docs/kbn_core_elasticsearch_server.mdx | 2 +-
...kbn_core_elasticsearch_server_internal.mdx | 2 +-
.../kbn_core_elasticsearch_server_mocks.mdx | 2 +-
.../kbn_core_environment_server_internal.mdx | 2 +-
.../kbn_core_environment_server_mocks.mdx | 2 +-
.../kbn_core_execution_context_browser.mdx | 2 +-
...ore_execution_context_browser_internal.mdx | 2 +-
...n_core_execution_context_browser_mocks.mdx | 2 +-
.../kbn_core_execution_context_common.mdx | 2 +-
.../kbn_core_execution_context_server.mdx | 2 +-
...core_execution_context_server_internal.mdx | 2 +-
...bn_core_execution_context_server_mocks.mdx | 2 +-
api_docs/kbn_core_fatal_errors_browser.mdx | 2 +-
.../kbn_core_fatal_errors_browser_mocks.mdx | 2 +-
api_docs/kbn_core_http_browser.mdx | 2 +-
api_docs/kbn_core_http_browser_internal.mdx | 2 +-
api_docs/kbn_core_http_browser_mocks.mdx | 2 +-
api_docs/kbn_core_http_common.mdx | 2 +-
.../kbn_core_http_context_server_mocks.mdx | 2 +-
...re_http_request_handler_context_server.mdx | 2 +-
api_docs/kbn_core_http_resources_server.mdx | 2 +-
...bn_core_http_resources_server_internal.mdx | 2 +-
.../kbn_core_http_resources_server_mocks.mdx | 2 +-
.../kbn_core_http_router_server_internal.mdx | 2 +-
.../kbn_core_http_router_server_mocks.mdx | 2 +-
api_docs/kbn_core_http_server.devdocs.json | 16 +--
api_docs/kbn_core_http_server.mdx | 2 +-
api_docs/kbn_core_http_server_internal.mdx | 2 +-
api_docs/kbn_core_http_server_mocks.mdx | 2 +-
api_docs/kbn_core_i18n_browser.mdx | 2 +-
api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +-
api_docs/kbn_core_i18n_server.mdx | 2 +-
api_docs/kbn_core_i18n_server_internal.mdx | 2 +-
api_docs/kbn_core_i18n_server_mocks.mdx | 2 +-
...n_core_injected_metadata_browser_mocks.mdx | 2 +-
...kbn_core_integrations_browser_internal.mdx | 2 +-
.../kbn_core_integrations_browser_mocks.mdx | 2 +-
api_docs/kbn_core_lifecycle_browser.mdx | 2 +-
api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +-
api_docs/kbn_core_lifecycle_server.mdx | 2 +-
api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +-
api_docs/kbn_core_logging_browser_mocks.mdx | 2 +-
api_docs/kbn_core_logging_common_internal.mdx | 2 +-
api_docs/kbn_core_logging_server.mdx | 2 +-
api_docs/kbn_core_logging_server_internal.mdx | 2 +-
api_docs/kbn_core_logging_server_mocks.mdx | 2 +-
...ore_metrics_collectors_server_internal.mdx | 2 +-
...n_core_metrics_collectors_server_mocks.mdx | 2 +-
api_docs/kbn_core_metrics_server.mdx | 2 +-
api_docs/kbn_core_metrics_server_internal.mdx | 2 +-
api_docs/kbn_core_metrics_server_mocks.mdx | 2 +-
api_docs/kbn_core_mount_utils_browser.mdx | 2 +-
api_docs/kbn_core_node_server.mdx | 2 +-
api_docs/kbn_core_node_server_internal.mdx | 2 +-
api_docs/kbn_core_node_server_mocks.mdx | 2 +-
api_docs/kbn_core_notifications_browser.mdx | 2 +-
...bn_core_notifications_browser_internal.mdx | 2 +-
.../kbn_core_notifications_browser_mocks.mdx | 2 +-
api_docs/kbn_core_overlays_browser.mdx | 2 +-
.../kbn_core_overlays_browser_internal.mdx | 2 +-
api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +-
api_docs/kbn_core_plugins_browser.mdx | 2 +-
api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +-
.../kbn_core_plugins_contracts_browser.mdx | 2 +-
.../kbn_core_plugins_contracts_server.mdx | 2 +-
api_docs/kbn_core_plugins_server.mdx | 2 +-
api_docs/kbn_core_plugins_server_mocks.mdx | 2 +-
api_docs/kbn_core_preboot_server.mdx | 2 +-
api_docs/kbn_core_preboot_server_mocks.mdx | 2 +-
api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +-
.../kbn_core_rendering_server_internal.mdx | 2 +-
api_docs/kbn_core_rendering_server_mocks.mdx | 2 +-
api_docs/kbn_core_root_server_internal.mdx | 2 +-
.../kbn_core_saved_objects_api_browser.mdx | 2 +-
.../kbn_core_saved_objects_api_server.mdx | 2 +-
...bn_core_saved_objects_api_server_mocks.mdx | 2 +-
...ore_saved_objects_base_server_internal.mdx | 2 +-
...n_core_saved_objects_base_server_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_browser.mdx | 2 +-
...bn_core_saved_objects_browser_internal.mdx | 2 +-
.../kbn_core_saved_objects_browser_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_common.mdx | 2 +-
..._objects_import_export_server_internal.mdx | 2 +-
...ved_objects_import_export_server_mocks.mdx | 2 +-
...aved_objects_migration_server_internal.mdx | 2 +-
...e_saved_objects_migration_server_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_server.mdx | 2 +-
...kbn_core_saved_objects_server_internal.mdx | 2 +-
.../kbn_core_saved_objects_server_mocks.mdx | 2 +-
.../kbn_core_saved_objects_utils_server.mdx | 2 +-
api_docs/kbn_core_security_browser.mdx | 2 +-
.../kbn_core_security_browser_internal.mdx | 2 +-
api_docs/kbn_core_security_browser_mocks.mdx | 2 +-
api_docs/kbn_core_security_common.mdx | 2 +-
api_docs/kbn_core_security_server.mdx | 2 +-
.../kbn_core_security_server_internal.mdx | 2 +-
api_docs/kbn_core_security_server_mocks.mdx | 2 +-
api_docs/kbn_core_status_common.mdx | 2 +-
api_docs/kbn_core_status_common_internal.mdx | 2 +-
api_docs/kbn_core_status_server.mdx | 2 +-
api_docs/kbn_core_status_server_internal.mdx | 2 +-
api_docs/kbn_core_status_server_mocks.mdx | 2 +-
...core_test_helpers_deprecations_getters.mdx | 2 +-
...n_core_test_helpers_http_setup_browser.mdx | 2 +-
api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +-
.../kbn_core_test_helpers_model_versions.mdx | 2 +-
...n_core_test_helpers_so_type_serializer.mdx | 2 +-
api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +-
api_docs/kbn_core_theme_browser.mdx | 2 +-
api_docs/kbn_core_theme_browser_mocks.mdx | 2 +-
api_docs/kbn_core_ui_settings_browser.mdx | 2 +-
.../kbn_core_ui_settings_browser_internal.mdx | 2 +-
.../kbn_core_ui_settings_browser_mocks.mdx | 2 +-
api_docs/kbn_core_ui_settings_common.mdx | 2 +-
api_docs/kbn_core_ui_settings_server.mdx | 2 +-
.../kbn_core_ui_settings_server_internal.mdx | 2 +-
.../kbn_core_ui_settings_server_mocks.mdx | 2 +-
api_docs/kbn_core_usage_data_server.mdx | 2 +-
.../kbn_core_usage_data_server_internal.mdx | 2 +-
api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +-
api_docs/kbn_core_user_settings_server.mdx | 2 +-
...kbn_core_user_settings_server_internal.mdx | 2 +-
.../kbn_core_user_settings_server_mocks.mdx | 2 +-
api_docs/kbn_crypto.mdx | 2 +-
api_docs/kbn_crypto_browser.mdx | 2 +-
api_docs/kbn_custom_icons.mdx | 2 +-
api_docs/kbn_custom_integrations.mdx | 2 +-
api_docs/kbn_cypress_config.mdx | 2 +-
api_docs/kbn_data_forge.mdx | 2 +-
api_docs/kbn_data_service.mdx | 2 +-
api_docs/kbn_data_stream_adapter.mdx | 2 +-
api_docs/kbn_data_view_utils.mdx | 2 +-
api_docs/kbn_datemath.mdx | 2 +-
api_docs/kbn_deeplinks_analytics.mdx | 2 +-
api_docs/kbn_deeplinks_devtools.mdx | 2 +-
api_docs/kbn_deeplinks_fleet.mdx | 2 +-
api_docs/kbn_deeplinks_management.mdx | 2 +-
api_docs/kbn_deeplinks_ml.mdx | 2 +-
api_docs/kbn_deeplinks_observability.mdx | 2 +-
api_docs/kbn_deeplinks_search.devdocs.json | 2 +-
api_docs/kbn_deeplinks_search.mdx | 2 +-
api_docs/kbn_deeplinks_security.mdx | 2 +-
api_docs/kbn_deeplinks_shared.mdx | 2 +-
api_docs/kbn_default_nav_analytics.mdx | 2 +-
api_docs/kbn_default_nav_devtools.mdx | 2 +-
api_docs/kbn_default_nav_management.mdx | 2 +-
api_docs/kbn_default_nav_ml.mdx | 2 +-
api_docs/kbn_dev_cli_errors.mdx | 2 +-
api_docs/kbn_dev_cli_runner.mdx | 2 +-
api_docs/kbn_dev_proc_runner.mdx | 2 +-
api_docs/kbn_dev_utils.mdx | 2 +-
api_docs/kbn_discover_utils.mdx | 2 +-
api_docs/kbn_doc_links.devdocs.json | 2 +-
api_docs/kbn_doc_links.mdx | 2 +-
api_docs/kbn_docs_utils.mdx | 2 +-
api_docs/kbn_dom_drag_drop.mdx | 2 +-
api_docs/kbn_ebt_tools.mdx | 2 +-
api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +-
api_docs/kbn_elastic_agent_utils.mdx | 2 +-
api_docs/kbn_elastic_assistant.mdx | 2 +-
api_docs/kbn_elastic_assistant_common.mdx | 2 +-
api_docs/kbn_es.mdx | 2 +-
api_docs/kbn_es_archiver.mdx | 2 +-
api_docs/kbn_es_errors.mdx | 2 +-
api_docs/kbn_es_query.mdx | 2 +-
api_docs/kbn_es_types.mdx | 2 +-
api_docs/kbn_eslint_plugin_imports.mdx | 2 +-
api_docs/kbn_esql_ast.mdx | 2 +-
api_docs/kbn_esql_utils.mdx | 2 +-
api_docs/kbn_esql_validation_autocomplete.mdx | 2 +-
api_docs/kbn_event_annotation_common.mdx | 2 +-
api_docs/kbn_event_annotation_components.mdx | 2 +-
api_docs/kbn_expandable_flyout.mdx | 2 +-
api_docs/kbn_field_types.mdx | 2 +-
api_docs/kbn_field_utils.mdx | 2 +-
api_docs/kbn_find_used_node_modules.mdx | 2 +-
api_docs/kbn_formatters.mdx | 2 +-
.../kbn_ftr_common_functional_services.mdx | 2 +-
.../kbn_ftr_common_functional_ui_services.mdx | 2 +-
api_docs/kbn_generate.mdx | 2 +-
api_docs/kbn_generate_console_definitions.mdx | 2 +-
api_docs/kbn_generate_csv.mdx | 2 +-
api_docs/kbn_guided_onboarding.mdx | 2 +-
api_docs/kbn_handlebars.mdx | 2 +-
api_docs/kbn_hapi_mocks.mdx | 2 +-
api_docs/kbn_health_gateway_server.mdx | 2 +-
api_docs/kbn_home_sample_data_card.mdx | 2 +-
api_docs/kbn_home_sample_data_tab.mdx | 2 +-
api_docs/kbn_i18n.mdx | 2 +-
api_docs/kbn_i18n_react.mdx | 2 +-
api_docs/kbn_import_resolver.mdx | 2 +-
api_docs/kbn_index_management.mdx | 2 +-
api_docs/kbn_inference_integration_flyout.mdx | 2 +-
api_docs/kbn_infra_forge.mdx | 2 +-
api_docs/kbn_interpreter.mdx | 2 +-
api_docs/kbn_io_ts_utils.mdx | 2 +-
api_docs/kbn_ipynb.mdx | 2 +-
api_docs/kbn_jest_serializers.mdx | 2 +-
api_docs/kbn_journeys.mdx | 2 +-
api_docs/kbn_json_ast.mdx | 2 +-
api_docs/kbn_kibana_manifest_schema.mdx | 2 +-
.../kbn_language_documentation_popover.mdx | 2 +-
api_docs/kbn_lens_embeddable_utils.mdx | 2 +-
api_docs/kbn_lens_formula_docs.mdx | 2 +-
api_docs/kbn_logging.mdx | 2 +-
api_docs/kbn_logging_mocks.mdx | 2 +-
api_docs/kbn_managed_content_badge.mdx | 2 +-
api_docs/kbn_managed_vscode_config.mdx | 2 +-
api_docs/kbn_management_cards_navigation.mdx | 2 +-
.../kbn_management_settings_application.mdx | 2 +-
...ent_settings_components_field_category.mdx | 2 +-
...gement_settings_components_field_input.mdx | 2 +-
...nagement_settings_components_field_row.mdx | 2 +-
...bn_management_settings_components_form.mdx | 2 +-
...n_management_settings_field_definition.mdx | 2 +-
api_docs/kbn_management_settings_ids.mdx | 2 +-
...n_management_settings_section_registry.mdx | 2 +-
api_docs/kbn_management_settings_types.mdx | 2 +-
.../kbn_management_settings_utilities.mdx | 2 +-
api_docs/kbn_management_storybook_config.mdx | 2 +-
api_docs/kbn_mapbox_gl.mdx | 2 +-
api_docs/kbn_maps_vector_tile_utils.mdx | 2 +-
api_docs/kbn_ml_agg_utils.mdx | 2 +-
api_docs/kbn_ml_anomaly_utils.mdx | 2 +-
api_docs/kbn_ml_cancellable_search.mdx | 2 +-
api_docs/kbn_ml_category_validator.mdx | 2 +-
api_docs/kbn_ml_chi2test.mdx | 2 +-
.../kbn_ml_data_frame_analytics_utils.mdx | 2 +-
api_docs/kbn_ml_data_grid.mdx | 2 +-
api_docs/kbn_ml_date_picker.mdx | 2 +-
api_docs/kbn_ml_date_utils.mdx | 2 +-
api_docs/kbn_ml_error_utils.mdx | 2 +-
api_docs/kbn_ml_in_memory_table.mdx | 2 +-
api_docs/kbn_ml_is_defined.mdx | 2 +-
api_docs/kbn_ml_is_populated_object.mdx | 2 +-
api_docs/kbn_ml_kibana_theme.mdx | 2 +-
api_docs/kbn_ml_local_storage.mdx | 2 +-
api_docs/kbn_ml_nested_property.mdx | 2 +-
api_docs/kbn_ml_number_utils.mdx | 2 +-
api_docs/kbn_ml_query_utils.mdx | 2 +-
api_docs/kbn_ml_random_sampler_utils.mdx | 2 +-
api_docs/kbn_ml_route_utils.mdx | 2 +-
api_docs/kbn_ml_runtime_field_utils.mdx | 2 +-
api_docs/kbn_ml_string_hash.mdx | 2 +-
api_docs/kbn_ml_time_buckets.mdx | 2 +-
api_docs/kbn_ml_trained_models_utils.mdx | 2 +-
api_docs/kbn_ml_ui_actions.mdx | 2 +-
api_docs/kbn_ml_url_state.mdx | 2 +-
api_docs/kbn_mock_idp_utils.mdx | 2 +-
api_docs/kbn_monaco.mdx | 2 +-
api_docs/kbn_object_versioning.mdx | 2 +-
api_docs/kbn_observability_alert_details.mdx | 2 +-
.../kbn_observability_alerting_test_data.mdx | 2 +-
...ility_get_padded_alert_time_range_util.mdx | 2 +-
api_docs/kbn_openapi_bundler.mdx | 2 +-
api_docs/kbn_openapi_generator.mdx | 2 +-
api_docs/kbn_optimizer.mdx | 2 +-
api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +-
api_docs/kbn_osquery_io_ts_types.mdx | 2 +-
api_docs/kbn_panel_loader.mdx | 2 +-
..._performance_testing_dataset_extractor.mdx | 2 +-
api_docs/kbn_plugin_check.mdx | 2 +-
api_docs/kbn_plugin_generator.mdx | 2 +-
api_docs/kbn_plugin_helpers.mdx | 2 +-
api_docs/kbn_presentation_containers.mdx | 2 +-
api_docs/kbn_presentation_publishing.mdx | 2 +-
api_docs/kbn_profiling_utils.mdx | 2 +-
api_docs/kbn_random_sampling.mdx | 2 +-
api_docs/kbn_react_field.mdx | 2 +-
api_docs/kbn_react_kibana_context_common.mdx | 2 +-
api_docs/kbn_react_kibana_context_render.mdx | 2 +-
api_docs/kbn_react_kibana_context_root.mdx | 2 +-
api_docs/kbn_react_kibana_context_styled.mdx | 2 +-
api_docs/kbn_react_kibana_context_theme.mdx | 2 +-
api_docs/kbn_react_kibana_mount.mdx | 2 +-
api_docs/kbn_repo_file_maps.mdx | 2 +-
api_docs/kbn_repo_linter.mdx | 2 +-
api_docs/kbn_repo_path.mdx | 2 +-
api_docs/kbn_repo_source_classifier.mdx | 2 +-
api_docs/kbn_reporting_common.mdx | 2 +-
api_docs/kbn_reporting_csv_share_panel.mdx | 2 +-
api_docs/kbn_reporting_export_types_csv.mdx | 2 +-
.../kbn_reporting_export_types_csv_common.mdx | 2 +-
api_docs/kbn_reporting_export_types_pdf.mdx | 2 +-
.../kbn_reporting_export_types_pdf_common.mdx | 2 +-
api_docs/kbn_reporting_export_types_png.mdx | 2 +-
.../kbn_reporting_export_types_png_common.mdx | 2 +-
api_docs/kbn_reporting_mocks_server.mdx | 2 +-
api_docs/kbn_reporting_public.mdx | 2 +-
api_docs/kbn_reporting_server.mdx | 2 +-
api_docs/kbn_resizable_layout.mdx | 2 +-
api_docs/kbn_rison.mdx | 2 +-
api_docs/kbn_router_to_openapispec.mdx | 2 +-
api_docs/kbn_router_utils.mdx | 2 +-
api_docs/kbn_rrule.mdx | 2 +-
api_docs/kbn_rule_data_utils.mdx | 2 +-
api_docs/kbn_saved_objects_settings.mdx | 2 +-
api_docs/kbn_search_api_panels.mdx | 2 +-
api_docs/kbn_search_connectors.mdx | 2 +-
api_docs/kbn_search_errors.mdx | 2 +-
api_docs/kbn_search_index_documents.mdx | 2 +-
api_docs/kbn_search_response_warnings.mdx | 2 +-
api_docs/kbn_security_hardening.mdx | 2 +-
api_docs/kbn_security_plugin_types_common.mdx | 2 +-
api_docs/kbn_security_plugin_types_public.mdx | 2 +-
api_docs/kbn_security_plugin_types_server.mdx | 2 +-
api_docs/kbn_security_solution_features.mdx | 2 +-
api_docs/kbn_security_solution_navigation.mdx | 2 +-
api_docs/kbn_security_solution_side_nav.mdx | 2 +-
...kbn_security_solution_storybook_config.mdx | 2 +-
.../kbn_securitysolution_autocomplete.mdx | 2 +-
api_docs/kbn_securitysolution_data_table.mdx | 2 +-
api_docs/kbn_securitysolution_ecs.mdx | 2 +-
api_docs/kbn_securitysolution_es_utils.mdx | 2 +-
...ritysolution_exception_list_components.mdx | 2 +-
api_docs/kbn_securitysolution_grouping.mdx | 2 +-
api_docs/kbn_securitysolution_hook_utils.mdx | 2 +-
..._securitysolution_io_ts_alerting_types.mdx | 2 +-
.../kbn_securitysolution_io_ts_list_types.mdx | 2 +-
api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +-
api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +-
api_docs/kbn_securitysolution_list_api.mdx | 2 +-
.../kbn_securitysolution_list_constants.mdx | 2 +-
api_docs/kbn_securitysolution_list_hooks.mdx | 2 +-
api_docs/kbn_securitysolution_list_utils.mdx | 2 +-
api_docs/kbn_securitysolution_rules.mdx | 2 +-
api_docs/kbn_securitysolution_t_grid.mdx | 2 +-
api_docs/kbn_securitysolution_utils.mdx | 2 +-
api_docs/kbn_server_http_tools.mdx | 2 +-
api_docs/kbn_server_route_repository.mdx | 2 +-
api_docs/kbn_serverless_common_settings.mdx | 2 +-
.../kbn_serverless_observability_settings.mdx | 2 +-
api_docs/kbn_serverless_project_switcher.mdx | 2 +-
api_docs/kbn_serverless_search_settings.mdx | 2 +-
api_docs/kbn_serverless_security_settings.mdx | 2 +-
api_docs/kbn_serverless_storybook_config.mdx | 2 +-
api_docs/kbn_shared_svg.mdx | 2 +-
api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +-
.../kbn_shared_ux_button_exit_full_screen.mdx | 2 +-
api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +-
api_docs/kbn_shared_ux_card_no_data.mdx | 2 +-
api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +-
api_docs/kbn_shared_ux_error_boundary.mdx | 2 +-
api_docs/kbn_shared_ux_file_context.mdx | 2 +-
api_docs/kbn_shared_ux_file_image.mdx | 2 +-
api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_file_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_file_picker.mdx | 2 +-
api_docs/kbn_shared_ux_file_types.mdx | 2 +-
api_docs/kbn_shared_ux_file_upload.mdx | 2 +-
api_docs/kbn_shared_ux_file_util.mdx | 2 +-
api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +-
.../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_markdown.mdx | 2 +-
api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +-
.../kbn_shared_ux_page_analytics_no_data.mdx | 2 +-
...shared_ux_page_analytics_no_data_mocks.mdx | 2 +-
.../kbn_shared_ux_page_kibana_no_data.mdx | 2 +-
...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +-
.../kbn_shared_ux_page_kibana_template.mdx | 2 +-
...n_shared_ux_page_kibana_template_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_no_data.mdx | 2 +-
.../kbn_shared_ux_page_no_data_config.mdx | 2 +-
...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +-
.../kbn_shared_ux_prompt_no_data_views.mdx | 2 +-
...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +-
api_docs/kbn_shared_ux_router.mdx | 2 +-
api_docs/kbn_shared_ux_router_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_storybook_config.mdx | 2 +-
api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +-
api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +-
api_docs/kbn_shared_ux_utility.mdx | 2 +-
api_docs/kbn_slo_schema.mdx | 2 +-
api_docs/kbn_solution_nav_es.mdx | 2 +-
api_docs/kbn_solution_nav_oblt.mdx | 2 +-
api_docs/kbn_some_dev_log.mdx | 2 +-
api_docs/kbn_sort_predicates.mdx | 2 +-
api_docs/kbn_std.devdocs.json | 115 ++++++++++++++++++
api_docs/kbn_std.mdx | 4 +-
api_docs/kbn_stdio_dev_helpers.mdx | 2 +-
api_docs/kbn_storybook.mdx | 2 +-
api_docs/kbn_telemetry_tools.mdx | 2 +-
api_docs/kbn_test.mdx | 2 +-
api_docs/kbn_test_eui_helpers.mdx | 2 +-
api_docs/kbn_test_jest_helpers.mdx | 2 +-
api_docs/kbn_test_subj_selector.mdx | 2 +-
api_docs/kbn_text_based_editor.mdx | 2 +-
api_docs/kbn_timerange.mdx | 2 +-
api_docs/kbn_tooling_log.mdx | 2 +-
api_docs/kbn_triggers_actions_ui_types.mdx | 2 +-
api_docs/kbn_ts_projects.mdx | 2 +-
api_docs/kbn_typed_react_router_config.mdx | 2 +-
api_docs/kbn_ui_actions_browser.mdx | 2 +-
api_docs/kbn_ui_shared_deps_src.mdx | 2 +-
api_docs/kbn_ui_theme.mdx | 2 +-
api_docs/kbn_unified_data_table.mdx | 2 +-
api_docs/kbn_unified_doc_viewer.mdx | 2 +-
api_docs/kbn_unified_field_list.mdx | 2 +-
api_docs/kbn_unsaved_changes_badge.mdx | 2 +-
api_docs/kbn_use_tracked_promise.mdx | 2 +-
api_docs/kbn_user_profile_components.mdx | 2 +-
api_docs/kbn_utility_types.mdx | 2 +-
api_docs/kbn_utility_types_jest.mdx | 2 +-
api_docs/kbn_utils.mdx | 2 +-
api_docs/kbn_visualization_ui_components.mdx | 2 +-
api_docs/kbn_visualization_utils.mdx | 2 +-
api_docs/kbn_xstate_utils.mdx | 2 +-
api_docs/kbn_yarn_lock_validator.mdx | 2 +-
api_docs/kbn_zod_helpers.mdx | 2 +-
api_docs/kibana_overview.mdx | 2 +-
api_docs/kibana_react.mdx | 2 +-
api_docs/kibana_utils.mdx | 2 +-
api_docs/kubernetes_security.mdx | 2 +-
api_docs/lens.mdx | 2 +-
api_docs/license_api_guard.mdx | 2 +-
api_docs/license_management.mdx | 2 +-
api_docs/licensing.mdx | 2 +-
api_docs/links.mdx | 2 +-
api_docs/lists.mdx | 2 +-
api_docs/logs_explorer.mdx | 2 +-
api_docs/logs_shared.mdx | 2 +-
api_docs/management.mdx | 2 +-
api_docs/maps.mdx | 2 +-
api_docs/maps_ems.mdx | 2 +-
api_docs/metrics_data_access.mdx | 2 +-
api_docs/ml.mdx | 2 +-
api_docs/mock_idp_plugin.mdx | 2 +-
api_docs/monitoring.mdx | 2 +-
api_docs/monitoring_collection.mdx | 2 +-
api_docs/navigation.mdx | 2 +-
api_docs/newsfeed.mdx | 2 +-
api_docs/no_data_page.mdx | 2 +-
api_docs/notifications.mdx | 2 +-
api_docs/observability.mdx | 2 +-
.../observability_a_i_assistant.devdocs.json | 48 ++++++++
api_docs/observability_a_i_assistant.mdx | 4 +-
api_docs/observability_a_i_assistant_app.mdx | 2 +-
.../observability_ai_assistant_management.mdx | 2 +-
api_docs/observability_logs_explorer.mdx | 2 +-
.../observability_onboarding.devdocs.json | 40 ++++++
api_docs/observability_onboarding.mdx | 4 +-
api_docs/observability_shared.devdocs.json | 30 +++++
api_docs/observability_shared.mdx | 4 +-
api_docs/osquery.mdx | 2 +-
api_docs/painless_lab.mdx | 2 +-
api_docs/plugin_directory.mdx | 16 +--
api_docs/presentation_panel.mdx | 2 +-
api_docs/presentation_util.mdx | 2 +-
api_docs/profiling.mdx | 2 +-
api_docs/profiling_data_access.mdx | 2 +-
api_docs/remote_clusters.mdx | 2 +-
api_docs/reporting.mdx | 2 +-
api_docs/rollup.mdx | 2 +-
api_docs/rule_registry.mdx | 2 +-
api_docs/runtime_fields.mdx | 2 +-
api_docs/saved_objects.mdx | 2 +-
api_docs/saved_objects_finder.mdx | 2 +-
api_docs/saved_objects_management.mdx | 2 +-
api_docs/saved_objects_tagging.mdx | 2 +-
api_docs/saved_objects_tagging_oss.mdx | 2 +-
api_docs/saved_search.mdx | 2 +-
api_docs/screenshot_mode.mdx | 2 +-
api_docs/screenshotting.mdx | 2 +-
api_docs/search_connectors.mdx | 2 +-
api_docs/search_notebooks.mdx | 2 +-
api_docs/search_playground.mdx | 2 +-
api_docs/security.mdx | 2 +-
api_docs/security_solution.devdocs.json | 12 +-
api_docs/security_solution.mdx | 2 +-
api_docs/security_solution_ess.mdx | 2 +-
api_docs/security_solution_serverless.mdx | 2 +-
api_docs/serverless.mdx | 2 +-
api_docs/serverless_observability.mdx | 2 +-
api_docs/serverless_search.mdx | 2 +-
api_docs/session_view.mdx | 2 +-
api_docs/share.mdx | 2 +-
api_docs/slo.mdx | 2 +-
api_docs/snapshot_restore.mdx | 2 +-
api_docs/spaces.mdx | 2 +-
api_docs/stack_alerts.mdx | 2 +-
api_docs/stack_connectors.mdx | 2 +-
api_docs/task_manager.mdx | 2 +-
api_docs/telemetry.mdx | 2 +-
api_docs/telemetry_collection_manager.mdx | 2 +-
api_docs/telemetry_collection_xpack.mdx | 2 +-
api_docs/telemetry_management_section.mdx | 2 +-
api_docs/text_based_languages.mdx | 2 +-
api_docs/threat_intelligence.mdx | 2 +-
api_docs/timelines.mdx | 2 +-
api_docs/transform.mdx | 2 +-
api_docs/triggers_actions_ui.mdx | 2 +-
api_docs/ui_actions.mdx | 2 +-
api_docs/ui_actions_enhanced.mdx | 2 +-
api_docs/unified_doc_viewer.mdx | 2 +-
api_docs/unified_histogram.mdx | 2 +-
api_docs/unified_search.mdx | 2 +-
api_docs/unified_search_autocomplete.mdx | 2 +-
api_docs/uptime.mdx | 2 +-
api_docs/url_forwarding.mdx | 2 +-
api_docs/usage_collection.mdx | 2 +-
api_docs/ux.mdx | 2 +-
api_docs/vis_default_editor.mdx | 2 +-
api_docs/vis_type_gauge.mdx | 2 +-
api_docs/vis_type_heatmap.mdx | 2 +-
api_docs/vis_type_pie.mdx | 2 +-
api_docs/vis_type_table.mdx | 2 +-
api_docs/vis_type_timelion.mdx | 2 +-
api_docs/vis_type_timeseries.mdx | 2 +-
api_docs/vis_type_vega.mdx | 2 +-
api_docs/vis_type_vislib.mdx | 2 +-
api_docs/vis_type_xy.mdx | 2 +-
api_docs/visualizations.devdocs.json | 10 +-
api_docs/visualizations.mdx | 2 +-
692 files changed, 1023 insertions(+), 713 deletions(-)
diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx
index bd0016a9a5059..1fd7347b53a07 100644
--- a/api_docs/actions.mdx
+++ b/api_docs/actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions
title: "actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the actions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions']
---
import actionsObj from './actions.devdocs.json';
diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx
index fcce9870f47c9..4ad58dc5c0285 100644
--- a/api_docs/advanced_settings.mdx
+++ b/api_docs/advanced_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings
title: "advancedSettings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the advancedSettings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings']
---
import advancedSettingsObj from './advanced_settings.devdocs.json';
diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx
index 2ba654fd9b930..044214e705094 100644
--- a/api_docs/ai_assistant_management_selection.mdx
+++ b/api_docs/ai_assistant_management_selection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection
title: "aiAssistantManagementSelection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the aiAssistantManagementSelection plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection']
---
import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json';
diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx
index c8e1a20805fc7..bd5c1d94c367a 100644
--- a/api_docs/aiops.mdx
+++ b/api_docs/aiops.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops
title: "aiops"
image: https://source.unsplash.com/400x175/?github
description: API docs for the aiops plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops']
---
import aiopsObj from './aiops.devdocs.json';
diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx
index 251090d81dfd6..80b5ab08b9fc2 100644
--- a/api_docs/alerting.mdx
+++ b/api_docs/alerting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting
title: "alerting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the alerting plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting']
---
import alertingObj from './alerting.devdocs.json';
diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx
index 5195b82264ef5..8665ca630783d 100644
--- a/api_docs/apm.mdx
+++ b/api_docs/apm.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm
title: "apm"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apm plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm']
---
import apmObj from './apm.devdocs.json';
diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx
index 7544780dca76a..2e7f9cfde4693 100644
--- a/api_docs/apm_data_access.mdx
+++ b/api_docs/apm_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess
title: "apmDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apmDataAccess plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess']
---
import apmDataAccessObj from './apm_data_access.devdocs.json';
diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx
index cc48de54bbb9b..43aa7b6842f2e 100644
--- a/api_docs/asset_manager.mdx
+++ b/api_docs/asset_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager
title: "assetManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the assetManager plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager']
---
import assetManagerObj from './asset_manager.devdocs.json';
diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx
index c4ae83fc93f83..e0cb6d6fbf276 100644
--- a/api_docs/banners.mdx
+++ b/api_docs/banners.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners
title: "banners"
image: https://source.unsplash.com/400x175/?github
description: API docs for the banners plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners']
---
import bannersObj from './banners.devdocs.json';
diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx
index aeb491fa781a6..cf8b9671663fa 100644
--- a/api_docs/bfetch.mdx
+++ b/api_docs/bfetch.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch
title: "bfetch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the bfetch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch']
---
import bfetchObj from './bfetch.devdocs.json';
diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx
index 234bf1f5fd7ce..87fa606df1ed1 100644
--- a/api_docs/canvas.mdx
+++ b/api_docs/canvas.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas
title: "canvas"
image: https://source.unsplash.com/400x175/?github
description: API docs for the canvas plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas']
---
import canvasObj from './canvas.devdocs.json';
diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx
index 90e8ca2897140..2d2970efadfd4 100644
--- a/api_docs/cases.mdx
+++ b/api_docs/cases.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases
title: "cases"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cases plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases']
---
import casesObj from './cases.devdocs.json';
diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx
index 63d5d5e2539cd..07f13bff0c33e 100644
--- a/api_docs/charts.mdx
+++ b/api_docs/charts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts
title: "charts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the charts plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts']
---
import chartsObj from './charts.devdocs.json';
diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx
index 40071d9a2111d..3b886a5aa17d6 100644
--- a/api_docs/cloud.mdx
+++ b/api_docs/cloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud
title: "cloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloud plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud']
---
import cloudObj from './cloud.devdocs.json';
diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx
index 0594b4bcd8345..27a738e5f29de 100644
--- a/api_docs/cloud_data_migration.mdx
+++ b/api_docs/cloud_data_migration.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration
title: "cloudDataMigration"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDataMigration plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration']
---
import cloudDataMigrationObj from './cloud_data_migration.devdocs.json';
diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx
index c492802d85215..16dd20cda1b19 100644
--- a/api_docs/cloud_defend.mdx
+++ b/api_docs/cloud_defend.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend
title: "cloudDefend"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDefend plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend']
---
import cloudDefendObj from './cloud_defend.devdocs.json';
diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx
index e424473edc710..00132de728bcd 100644
--- a/api_docs/cloud_experiments.mdx
+++ b/api_docs/cloud_experiments.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments
title: "cloudExperiments"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudExperiments plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments']
---
import cloudExperimentsObj from './cloud_experiments.devdocs.json';
diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx
index e64415ef1791e..c876a57c2f8b5 100644
--- a/api_docs/cloud_security_posture.mdx
+++ b/api_docs/cloud_security_posture.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture
title: "cloudSecurityPosture"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudSecurityPosture plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture']
---
import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json';
diff --git a/api_docs/console.mdx b/api_docs/console.mdx
index cec66b4286429..84efeaa26e25f 100644
--- a/api_docs/console.mdx
+++ b/api_docs/console.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console
title: "console"
image: https://source.unsplash.com/400x175/?github
description: API docs for the console plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console']
---
import consoleObj from './console.devdocs.json';
diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx
index 6497ef2953442..d2a23746cbd28 100644
--- a/api_docs/content_management.mdx
+++ b/api_docs/content_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement
title: "contentManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the contentManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement']
---
import contentManagementObj from './content_management.devdocs.json';
diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx
index 7ccedc7a0c04d..306313aaa4df3 100644
--- a/api_docs/controls.mdx
+++ b/api_docs/controls.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls
title: "controls"
image: https://source.unsplash.com/400x175/?github
description: API docs for the controls plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls']
---
import controlsObj from './controls.devdocs.json';
diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx
index 8102322ee1242..6b629b09fd8be 100644
--- a/api_docs/custom_integrations.mdx
+++ b/api_docs/custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations
title: "customIntegrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the customIntegrations plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations']
---
import customIntegrationsObj from './custom_integrations.devdocs.json';
diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx
index a53fa71bc6085..ac078e4337b98 100644
--- a/api_docs/dashboard.mdx
+++ b/api_docs/dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard
title: "dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboard plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard']
---
import dashboardObj from './dashboard.devdocs.json';
diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx
index 1ea206d5e15df..e294ac4462ae3 100644
--- a/api_docs/dashboard_enhanced.mdx
+++ b/api_docs/dashboard_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced
title: "dashboardEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboardEnhanced plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced']
---
import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json';
diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json
index 2ce80d50cff9b..3b4efee0c14f6 100644
--- a/api_docs/data.devdocs.json
+++ b/api_docs/data.devdocs.json
@@ -7979,6 +7979,22 @@
"deprecated": false,
"trackAdoption": false
},
+ {
+ "parentPluginId": "data",
+ "id": "def-public.ISearchOptions.retrieveResults",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "retrieveResults",
+ "description": [
+ "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete."
+ ],
+ "signature": [
+ "boolean | undefined"
+ ],
+ "path": "src/plugins/data/common/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
{
"parentPluginId": "data",
"id": "def-public.ISearchOptions.executionContext",
@@ -17970,6 +17986,22 @@
"deprecated": false,
"trackAdoption": false
},
+ {
+ "parentPluginId": "data",
+ "id": "def-server.ISearchOptions.retrieveResults",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "retrieveResults",
+ "description": [
+ "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete."
+ ],
+ "signature": [
+ "boolean | undefined"
+ ],
+ "path": "src/plugins/data/common/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
{
"parentPluginId": "data",
"id": "def-server.ISearchOptions.executionContext",
diff --git a/api_docs/data.mdx b/api_docs/data.mdx
index 51d11c982ef0e..54ae2d29b90cd 100644
--- a/api_docs/data.mdx
+++ b/api_docs/data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data
title: "data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data']
---
import dataObj from './data.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 3287 | 31 | 2621 | 23 |
+| 3290 | 31 | 2621 | 23 |
## Client
diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx
index d1d3b6b3b8f66..670b749777582 100644
--- a/api_docs/data_query.mdx
+++ b/api_docs/data_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query
title: "data.query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data.query plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query']
---
import dataQueryObj from './data_query.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 3287 | 31 | 2621 | 23 |
+| 3290 | 31 | 2621 | 23 |
## Client
diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json
index c2fc6938cbd49..c30de7972840c 100644
--- a/api_docs/data_search.devdocs.json
+++ b/api_docs/data_search.devdocs.json
@@ -28311,6 +28311,22 @@
"deprecated": false,
"trackAdoption": false
},
+ {
+ "parentPluginId": "data",
+ "id": "def-common.ISearchOptions.retrieveResults",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "retrieveResults",
+ "description": [
+ "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete."
+ ],
+ "signature": [
+ "boolean | undefined"
+ ],
+ "path": "src/plugins/data/common/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
{
"parentPluginId": "data",
"id": "def-common.ISearchOptions.executionContext",
@@ -34035,7 +34051,7 @@
"section": "def-common.KibanaExecutionContext",
"text": "KibanaExecutionContext"
},
- " | undefined; isStored?: boolean | undefined; isRestore?: boolean | undefined; sessionId?: string | undefined; strategy?: string | undefined; legacyHitsTotal?: boolean | undefined; isSearchStored?: boolean | undefined; }"
+ " | undefined; isStored?: boolean | undefined; isRestore?: boolean | undefined; sessionId?: string | undefined; strategy?: string | undefined; legacyHitsTotal?: boolean | undefined; isSearchStored?: boolean | undefined; retrieveResults?: boolean | undefined; }"
],
"path": "src/plugins/data/common/search/types.ts",
"deprecated": false,
diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx
index 367a17e01ce8e..1aff16458a1aa 100644
--- a/api_docs/data_search.mdx
+++ b/api_docs/data_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search
title: "data.search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data.search plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search']
---
import dataSearchObj from './data_search.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 3287 | 31 | 2621 | 23 |
+| 3290 | 31 | 2621 | 23 |
## Client
diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx
index fc02e2954b9a1..1db1f5fb214f9 100644
--- a/api_docs/data_view_editor.mdx
+++ b/api_docs/data_view_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor
title: "dataViewEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewEditor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor']
---
import dataViewEditorObj from './data_view_editor.devdocs.json';
diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx
index bb27ed4b5336b..1ade689c92649 100644
--- a/api_docs/data_view_field_editor.mdx
+++ b/api_docs/data_view_field_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor
title: "dataViewFieldEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewFieldEditor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor']
---
import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json';
diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx
index cbd9a09056574..4b25306777b9b 100644
--- a/api_docs/data_view_management.mdx
+++ b/api_docs/data_view_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement
title: "dataViewManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement']
---
import dataViewManagementObj from './data_view_management.devdocs.json';
diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx
index 1863d726b2d97..dc4c2899f3aba 100644
--- a/api_docs/data_views.mdx
+++ b/api_docs/data_views.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews
title: "dataViews"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViews plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews']
---
import dataViewsObj from './data_views.devdocs.json';
diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx
index ea5cc0641a881..5dd35e53aaad1 100644
--- a/api_docs/data_visualizer.mdx
+++ b/api_docs/data_visualizer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer
title: "dataVisualizer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataVisualizer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer']
---
import dataVisualizerObj from './data_visualizer.devdocs.json';
diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx
index e898d7171c260..039d4d01f504b 100644
--- a/api_docs/dataset_quality.mdx
+++ b/api_docs/dataset_quality.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality
title: "datasetQuality"
image: https://source.unsplash.com/400x175/?github
description: API docs for the datasetQuality plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality']
---
import datasetQualityObj from './dataset_quality.devdocs.json';
diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx
index b5eeeb69f887d..33b126ad89297 100644
--- a/api_docs/deprecations_by_api.mdx
+++ b/api_docs/deprecations_by_api.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi
slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api
title: Deprecated API usage by API
description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by.
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx
index 4cddd4f200bb8..f676745d3a966 100644
--- a/api_docs/deprecations_by_plugin.mdx
+++ b/api_docs/deprecations_by_plugin.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin
slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin
title: Deprecated API usage by plugin
description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by.
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx
index e3d994d9d52e3..f2ee962027da4 100644
--- a/api_docs/deprecations_by_team.mdx
+++ b/api_docs/deprecations_by_team.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam
slug: /kibana-dev-docs/api-meta/deprecations-due-by-team
title: Deprecated APIs due to be removed, by team
description: Lists the teams that are referencing deprecated APIs with a remove by date.
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx
index eb1b8016b1878..9f0a585fe296c 100644
--- a/api_docs/dev_tools.mdx
+++ b/api_docs/dev_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools
title: "devTools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the devTools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools']
---
import devToolsObj from './dev_tools.devdocs.json';
diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx
index bb30fdda3c861..df156033e596b 100644
--- a/api_docs/discover.mdx
+++ b/api_docs/discover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover
title: "discover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discover plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover']
---
import discoverObj from './discover.devdocs.json';
diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx
index 43cbff6a96881..cfb5492155604 100644
--- a/api_docs/discover_enhanced.mdx
+++ b/api_docs/discover_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced
title: "discoverEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discoverEnhanced plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced']
---
import discoverEnhancedObj from './discover_enhanced.devdocs.json';
diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx
index 860bcea7b4383..2bca37f7d9e54 100644
--- a/api_docs/ecs_data_quality_dashboard.mdx
+++ b/api_docs/ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard
title: "ecsDataQualityDashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ecsDataQualityDashboard plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard']
---
import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json';
diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx
index 9dd9bf74d761d..c612bd39cc10c 100644
--- a/api_docs/elastic_assistant.mdx
+++ b/api_docs/elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant
title: "elasticAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the elasticAssistant plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant']
---
import elasticAssistantObj from './elastic_assistant.devdocs.json';
diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json
index 25e63699429f4..a150cb0eb1c35 100644
--- a/api_docs/embeddable.devdocs.json
+++ b/api_docs/embeddable.devdocs.json
@@ -5520,6 +5520,27 @@
"deprecated": false,
"trackAdoption": false
},
+ {
+ "parentPluginId": "embeddable",
+ "id": "def-public.Embeddable.defaultPanelDescription",
+ "type": "Object",
+ "tags": [],
+ "label": "defaultPanelDescription",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "@kbn/presentation-publishing",
+ "scope": "common",
+ "docId": "kibKbnPresentationPublishingPluginApi",
+ "section": "def-common.PublishingSubject",
+ "text": "PublishingSubject"
+ },
+ " | undefined"
+ ],
+ "path": "src/plugins/embeddable/public/lib/embeddables/embeddable.tsx",
+ "deprecated": false,
+ "trackAdoption": false
+ },
{
"parentPluginId": "embeddable",
"id": "def-public.Embeddable.disabledActionIds",
diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx
index 7de047b72dc3c..a2a627bc03350 100644
--- a/api_docs/embeddable.mdx
+++ b/api_docs/embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable
title: "embeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddable plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable']
---
import embeddableObj from './embeddable.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 559 | 1 | 453 | 8 |
+| 560 | 1 | 454 | 8 |
## Client
diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx
index 4b73575bbf35a..ea9a2c39ad002 100644
--- a/api_docs/embeddable_enhanced.mdx
+++ b/api_docs/embeddable_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced
title: "embeddableEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddableEnhanced plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced']
---
import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json';
diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx
index b43e81f2ee69d..50bccd787a9f0 100644
--- a/api_docs/encrypted_saved_objects.mdx
+++ b/api_docs/encrypted_saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects
title: "encryptedSavedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the encryptedSavedObjects plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects']
---
import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json';
diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx
index a1d13c6da6ab5..7fc9120d309ea 100644
--- a/api_docs/enterprise_search.mdx
+++ b/api_docs/enterprise_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch
title: "enterpriseSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the enterpriseSearch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch']
---
import enterpriseSearchObj from './enterprise_search.devdocs.json';
diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx
index 44030729cd778..06c02cfa9b605 100644
--- a/api_docs/es_ui_shared.mdx
+++ b/api_docs/es_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared
title: "esUiShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the esUiShared plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared']
---
import esUiSharedObj from './es_ui_shared.devdocs.json';
diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx
index 86b41cd2e3813..65e4893f9104e 100644
--- a/api_docs/event_annotation.mdx
+++ b/api_docs/event_annotation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation
title: "eventAnnotation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventAnnotation plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation']
---
import eventAnnotationObj from './event_annotation.devdocs.json';
diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx
index 7530e4dbd519b..96fde09a46d67 100644
--- a/api_docs/event_annotation_listing.mdx
+++ b/api_docs/event_annotation_listing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing
title: "eventAnnotationListing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventAnnotationListing plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing']
---
import eventAnnotationListingObj from './event_annotation_listing.devdocs.json';
diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx
index ad9cad86d3a9a..f1a4fa3b57020 100644
--- a/api_docs/event_log.mdx
+++ b/api_docs/event_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog
title: "eventLog"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventLog plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog']
---
import eventLogObj from './event_log.devdocs.json';
diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx
index 8b457211f90e3..2f46e78554732 100644
--- a/api_docs/exploratory_view.mdx
+++ b/api_docs/exploratory_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView
title: "exploratoryView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the exploratoryView plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView']
---
import exploratoryViewObj from './exploratory_view.devdocs.json';
diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx
index 31be944ba847e..0b7095a0352c3 100644
--- a/api_docs/expression_error.mdx
+++ b/api_docs/expression_error.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError
title: "expressionError"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionError plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError']
---
import expressionErrorObj from './expression_error.devdocs.json';
diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx
index 43c1cbf007812..39ff778c6684e 100644
--- a/api_docs/expression_gauge.mdx
+++ b/api_docs/expression_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge
title: "expressionGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionGauge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge']
---
import expressionGaugeObj from './expression_gauge.devdocs.json';
diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx
index e70d0c1c32255..4460faf1bbfd4 100644
--- a/api_docs/expression_heatmap.mdx
+++ b/api_docs/expression_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap
title: "expressionHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionHeatmap plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap']
---
import expressionHeatmapObj from './expression_heatmap.devdocs.json';
diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx
index 8ecd138b63264..0b8e2ee9ecb29 100644
--- a/api_docs/expression_image.mdx
+++ b/api_docs/expression_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage
title: "expressionImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionImage plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage']
---
import expressionImageObj from './expression_image.devdocs.json';
diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx
index ff2f85f9b7535..90d4f7c8a13a1 100644
--- a/api_docs/expression_legacy_metric_vis.mdx
+++ b/api_docs/expression_legacy_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis
title: "expressionLegacyMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionLegacyMetricVis plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis']
---
import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json';
diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx
index cf06adb9ccfb5..83b96e2c972ee 100644
--- a/api_docs/expression_metric.mdx
+++ b/api_docs/expression_metric.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric
title: "expressionMetric"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetric plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric']
---
import expressionMetricObj from './expression_metric.devdocs.json';
diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx
index 360dd58b663ee..b24f93a95b7c9 100644
--- a/api_docs/expression_metric_vis.mdx
+++ b/api_docs/expression_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis
title: "expressionMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetricVis plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis']
---
import expressionMetricVisObj from './expression_metric_vis.devdocs.json';
diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx
index 28a4dc9631c0e..e07a4ca0512eb 100644
--- a/api_docs/expression_partition_vis.mdx
+++ b/api_docs/expression_partition_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis
title: "expressionPartitionVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionPartitionVis plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis']
---
import expressionPartitionVisObj from './expression_partition_vis.devdocs.json';
diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx
index 49d9c335f30a5..c528fefbb987e 100644
--- a/api_docs/expression_repeat_image.mdx
+++ b/api_docs/expression_repeat_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage
title: "expressionRepeatImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRepeatImage plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage']
---
import expressionRepeatImageObj from './expression_repeat_image.devdocs.json';
diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx
index 1e7a0eea70533..69945a6d00f79 100644
--- a/api_docs/expression_reveal_image.mdx
+++ b/api_docs/expression_reveal_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage
title: "expressionRevealImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRevealImage plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage']
---
import expressionRevealImageObj from './expression_reveal_image.devdocs.json';
diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx
index e21118b6632ae..252ed72ef9892 100644
--- a/api_docs/expression_shape.mdx
+++ b/api_docs/expression_shape.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape
title: "expressionShape"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionShape plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape']
---
import expressionShapeObj from './expression_shape.devdocs.json';
diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx
index bb066bc9de6cf..98280252f47c7 100644
--- a/api_docs/expression_tagcloud.mdx
+++ b/api_docs/expression_tagcloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud
title: "expressionTagcloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionTagcloud plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud']
---
import expressionTagcloudObj from './expression_tagcloud.devdocs.json';
diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx
index a05caa3d4daa3..0a98bf0d7f600 100644
--- a/api_docs/expression_x_y.mdx
+++ b/api_docs/expression_x_y.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY
title: "expressionXY"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionXY plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY']
---
import expressionXYObj from './expression_x_y.devdocs.json';
diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx
index 0da463425d588..5c6585756dc31 100644
--- a/api_docs/expressions.mdx
+++ b/api_docs/expressions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions
title: "expressions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions']
---
import expressionsObj from './expressions.devdocs.json';
diff --git a/api_docs/features.mdx b/api_docs/features.mdx
index 0982bf4fcf469..7c42d35af4235 100644
--- a/api_docs/features.mdx
+++ b/api_docs/features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features
title: "features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the features plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features']
---
import featuresObj from './features.devdocs.json';
diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx
index f4eb3ff168891..79699821c1e1d 100644
--- a/api_docs/field_formats.mdx
+++ b/api_docs/field_formats.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats
title: "fieldFormats"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fieldFormats plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats']
---
import fieldFormatsObj from './field_formats.devdocs.json';
diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx
index 32eabcf14c034..17e725046c2f0 100644
--- a/api_docs/file_upload.mdx
+++ b/api_docs/file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload
title: "fileUpload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fileUpload plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload']
---
import fileUploadObj from './file_upload.devdocs.json';
diff --git a/api_docs/files.mdx b/api_docs/files.mdx
index 916d6c68ee6ec..7bb001c6b9c4e 100644
--- a/api_docs/files.mdx
+++ b/api_docs/files.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files
title: "files"
image: https://source.unsplash.com/400x175/?github
description: API docs for the files plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files']
---
import filesObj from './files.devdocs.json';
diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx
index d4f5f04c8e1bc..3c3e2fc6d9bb8 100644
--- a/api_docs/files_management.mdx
+++ b/api_docs/files_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement
title: "filesManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the filesManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement']
---
import filesManagementObj from './files_management.devdocs.json';
diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx
index cbea78b7bd778..b6e54e1ea3baf 100644
--- a/api_docs/fleet.mdx
+++ b/api_docs/fleet.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet
title: "fleet"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fleet plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet']
---
import fleetObj from './fleet.devdocs.json';
diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx
index 8afdcd9096d36..cff29d529056f 100644
--- a/api_docs/global_search.mdx
+++ b/api_docs/global_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch
title: "globalSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the globalSearch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch']
---
import globalSearchObj from './global_search.devdocs.json';
diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx
index b0e07517c3a20..f5e75e7882467 100644
--- a/api_docs/guided_onboarding.mdx
+++ b/api_docs/guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding
title: "guidedOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the guidedOnboarding plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding']
---
import guidedOnboardingObj from './guided_onboarding.devdocs.json';
diff --git a/api_docs/home.mdx b/api_docs/home.mdx
index dcd522070cbf5..8e59ba4db41bb 100644
--- a/api_docs/home.mdx
+++ b/api_docs/home.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home
title: "home"
image: https://source.unsplash.com/400x175/?github
description: API docs for the home plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home']
---
import homeObj from './home.devdocs.json';
diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx
index 3b010b95ed516..f174c67ed4b5f 100644
--- a/api_docs/image_embeddable.mdx
+++ b/api_docs/image_embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable
title: "imageEmbeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the imageEmbeddable plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable']
---
import imageEmbeddableObj from './image_embeddable.devdocs.json';
diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx
index 37040e1d757ba..8928a207d60e4 100644
--- a/api_docs/index_lifecycle_management.mdx
+++ b/api_docs/index_lifecycle_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement
title: "indexLifecycleManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexLifecycleManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement']
---
import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json';
diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx
index e2ca79431020b..da50e6d4f7d80 100644
--- a/api_docs/index_management.mdx
+++ b/api_docs/index_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement
title: "indexManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement']
---
import indexManagementObj from './index_management.devdocs.json';
diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx
index 717062b1c53a4..0223f47e6b2a1 100644
--- a/api_docs/infra.mdx
+++ b/api_docs/infra.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra
title: "infra"
image: https://source.unsplash.com/400x175/?github
description: API docs for the infra plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra']
---
import infraObj from './infra.devdocs.json';
diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx
index 55b6c499f334f..0f6265cbc160d 100644
--- a/api_docs/ingest_pipelines.mdx
+++ b/api_docs/ingest_pipelines.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines
title: "ingestPipelines"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ingestPipelines plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines']
---
import ingestPipelinesObj from './ingest_pipelines.devdocs.json';
diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx
index 10f4c0f195c29..b80e101155e7e 100644
--- a/api_docs/inspector.mdx
+++ b/api_docs/inspector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector
title: "inspector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the inspector plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector']
---
import inspectorObj from './inspector.devdocs.json';
diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx
index d3ee2c96642f5..e0d0af4c47fb6 100644
--- a/api_docs/interactive_setup.mdx
+++ b/api_docs/interactive_setup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup
title: "interactiveSetup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the interactiveSetup plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup']
---
import interactiveSetupObj from './interactive_setup.devdocs.json';
diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx
index 72258ac9c762b..df9f795e16fcd 100644
--- a/api_docs/kbn_ace.mdx
+++ b/api_docs/kbn_ace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace
title: "@kbn/ace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ace plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace']
---
import kbnAceObj from './kbn_ace.devdocs.json';
diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx
index 20e26868917ba..f791c73ed0c4e 100644
--- a/api_docs/kbn_actions_types.mdx
+++ b/api_docs/kbn_actions_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types
title: "@kbn/actions-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/actions-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types']
---
import kbnActionsTypesObj from './kbn_actions_types.devdocs.json';
diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx
index 5a27adfe30b65..8f46edf664cbf 100644
--- a/api_docs/kbn_aiops_components.mdx
+++ b/api_docs/kbn_aiops_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components
title: "@kbn/aiops-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components']
---
import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json';
diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx
index 8a1a6288d55e0..9fc50aee2f196 100644
--- a/api_docs/kbn_aiops_log_pattern_analysis.mdx
+++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis
title: "@kbn/aiops-log-pattern-analysis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-log-pattern-analysis plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis']
---
import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json';
diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx
index 6a6a4edfe92d9..9add71133906e 100644
--- a/api_docs/kbn_aiops_log_rate_analysis.mdx
+++ b/api_docs/kbn_aiops_log_rate_analysis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis
title: "@kbn/aiops-log-rate-analysis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-log-rate-analysis plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis']
---
import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json';
diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx
index 064f3aa8ab137..072bd4fe4fe0b 100644
--- a/api_docs/kbn_alerting_api_integration_helpers.mdx
+++ b/api_docs/kbn_alerting_api_integration_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers
title: "@kbn/alerting-api-integration-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-api-integration-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers']
---
import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json';
diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx
index 49fbc982b5f0e..bf6fca7f67d51 100644
--- a/api_docs/kbn_alerting_state_types.mdx
+++ b/api_docs/kbn_alerting_state_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types
title: "@kbn/alerting-state-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-state-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types']
---
import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json';
diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx
index 3b4e356db8ff6..002efeb7a350f 100644
--- a/api_docs/kbn_alerting_types.mdx
+++ b/api_docs/kbn_alerting_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types
title: "@kbn/alerting-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types']
---
import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json';
diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx
index 1c85fbe74958c..394ff33e48ab0 100644
--- a/api_docs/kbn_alerts_as_data_utils.mdx
+++ b/api_docs/kbn_alerts_as_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils
title: "@kbn/alerts-as-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-as-data-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils']
---
import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json';
diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx
index a11c85f24e3c1..a2bbfa67c9810 100644
--- a/api_docs/kbn_alerts_ui_shared.mdx
+++ b/api_docs/kbn_alerts_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared
title: "@kbn/alerts-ui-shared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-ui-shared plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared']
---
import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json';
diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx
index 183865e66f7ba..0266206c37a26 100644
--- a/api_docs/kbn_analytics.mdx
+++ b/api_docs/kbn_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics
title: "@kbn/analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics']
---
import kbnAnalyticsObj from './kbn_analytics.devdocs.json';
diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx
index 9e2655ddf3276..ef07914f8fa36 100644
--- a/api_docs/kbn_analytics_client.mdx
+++ b/api_docs/kbn_analytics_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client
title: "@kbn/analytics-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-client plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client']
---
import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json';
diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx
index 2934bdd3df4d5..20fbda8215e16 100644
--- a/api_docs/kbn_analytics_collection_utils.mdx
+++ b/api_docs/kbn_analytics_collection_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils
title: "@kbn/analytics-collection-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-collection-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils']
---
import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
index 2d952060c331c..27d4d95554922 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser
title: "@kbn/analytics-shippers-elastic-v3-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser']
---
import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
index 101545553865a..bee0e2c709105 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common
title: "@kbn/analytics-shippers-elastic-v3-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common']
---
import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
index 0a654fa1c7e6f..d14361538bf59 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server
title: "@kbn/analytics-shippers-elastic-v3-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server']
---
import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx
index 37a298493acfa..68b35b803efac 100644
--- a/api_docs/kbn_analytics_shippers_fullstory.mdx
+++ b/api_docs/kbn_analytics_shippers_fullstory.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory
title: "@kbn/analytics-shippers-fullstory"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-fullstory plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory']
---
import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json';
diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx
index a5daa8c1b6090..9024a0fdb276a 100644
--- a/api_docs/kbn_apm_config_loader.mdx
+++ b/api_docs/kbn_apm_config_loader.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader
title: "@kbn/apm-config-loader"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-config-loader plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader']
---
import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json';
diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx
index 64a1594f97404..a84d07d07ee11 100644
--- a/api_docs/kbn_apm_data_view.mdx
+++ b/api_docs/kbn_apm_data_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view
title: "@kbn/apm-data-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-data-view plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view']
---
import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json';
diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx
index 1e862cd965d5c..e8298efdf1a43 100644
--- a/api_docs/kbn_apm_synthtrace.mdx
+++ b/api_docs/kbn_apm_synthtrace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace
title: "@kbn/apm-synthtrace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace']
---
import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json';
diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx
index bb20ffe6ce865..35805e4c80791 100644
--- a/api_docs/kbn_apm_synthtrace_client.mdx
+++ b/api_docs/kbn_apm_synthtrace_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client
title: "@kbn/apm-synthtrace-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace-client plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client']
---
import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json';
diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx
index f11a9cf669b19..e85d293453fa7 100644
--- a/api_docs/kbn_apm_utils.mdx
+++ b/api_docs/kbn_apm_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils
title: "@kbn/apm-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils']
---
import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json';
diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx
index 4162ceca706f6..4ceb8c139a34c 100644
--- a/api_docs/kbn_axe_config.mdx
+++ b/api_docs/kbn_axe_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config
title: "@kbn/axe-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/axe-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config']
---
import kbnAxeConfigObj from './kbn_axe_config.devdocs.json';
diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx
index 790de0ecdad48..b0232819f2275 100644
--- a/api_docs/kbn_bfetch_error.mdx
+++ b/api_docs/kbn_bfetch_error.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error
title: "@kbn/bfetch-error"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/bfetch-error plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error']
---
import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json';
diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx
index bab0fbfdc85f4..4d3a1d37fd775 100644
--- a/api_docs/kbn_calculate_auto.mdx
+++ b/api_docs/kbn_calculate_auto.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto
title: "@kbn/calculate-auto"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/calculate-auto plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto']
---
import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json';
diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx
index aaed2aa170cab..5dfe19dd3d140 100644
--- a/api_docs/kbn_calculate_width_from_char_count.mdx
+++ b/api_docs/kbn_calculate_width_from_char_count.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count
title: "@kbn/calculate-width-from-char-count"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/calculate-width-from-char-count plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count']
---
import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json';
diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx
index f1be51668d5f6..78cf30bb57b53 100644
--- a/api_docs/kbn_cases_components.mdx
+++ b/api_docs/kbn_cases_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components
title: "@kbn/cases-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cases-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components']
---
import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json';
diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx
index f726a91cf05df..5aa84dc9322e1 100644
--- a/api_docs/kbn_cell_actions.mdx
+++ b/api_docs/kbn_cell_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions
title: "@kbn/cell-actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cell-actions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions']
---
import kbnCellActionsObj from './kbn_cell_actions.devdocs.json';
diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx
index 68331633fcfbc..c00de26cb7fdf 100644
--- a/api_docs/kbn_chart_expressions_common.mdx
+++ b/api_docs/kbn_chart_expressions_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common
title: "@kbn/chart-expressions-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-expressions-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common']
---
import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json';
diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx
index 1c11febe428ca..db52651adecbd 100644
--- a/api_docs/kbn_chart_icons.mdx
+++ b/api_docs/kbn_chart_icons.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons
title: "@kbn/chart-icons"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-icons plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons']
---
import kbnChartIconsObj from './kbn_chart_icons.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx
index e3c735dd3f234..1a3cda9a55bdc 100644
--- a/api_docs/kbn_ci_stats_core.mdx
+++ b/api_docs/kbn_ci_stats_core.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core
title: "@kbn/ci-stats-core"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-core plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core']
---
import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx
index 39c87ff928cd2..0c9f0f96093bb 100644
--- a/api_docs/kbn_ci_stats_performance_metrics.mdx
+++ b/api_docs/kbn_ci_stats_performance_metrics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics
title: "@kbn/ci-stats-performance-metrics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-performance-metrics plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics']
---
import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx
index a481582c8974d..96121f4540681 100644
--- a/api_docs/kbn_ci_stats_reporter.mdx
+++ b/api_docs/kbn_ci_stats_reporter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter
title: "@kbn/ci-stats-reporter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-reporter plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter']
---
import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json';
diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx
index d965fbc055357..4d6b5be2fedad 100644
--- a/api_docs/kbn_cli_dev_mode.mdx
+++ b/api_docs/kbn_cli_dev_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode
title: "@kbn/cli-dev-mode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cli-dev-mode plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode']
---
import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json';
diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx
index 2dd7484f2e487..9506c654076e4 100644
--- a/api_docs/kbn_code_editor.mdx
+++ b/api_docs/kbn_code_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor
title: "@kbn/code-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor']
---
import kbnCodeEditorObj from './kbn_code_editor.devdocs.json';
diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx
index 9813ae46c6b7a..866c865b3b593 100644
--- a/api_docs/kbn_code_editor_mock.mdx
+++ b/api_docs/kbn_code_editor_mock.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock
title: "@kbn/code-editor-mock"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor-mock plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock']
---
import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json';
diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx
index d8ad0fef941f8..6b529bb6e9c8b 100644
--- a/api_docs/kbn_code_owners.mdx
+++ b/api_docs/kbn_code_owners.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners
title: "@kbn/code-owners"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-owners plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners']
---
import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json';
diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx
index cf36fc73270d2..6ef0056b50d5f 100644
--- a/api_docs/kbn_coloring.mdx
+++ b/api_docs/kbn_coloring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring
title: "@kbn/coloring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/coloring plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring']
---
import kbnColoringObj from './kbn_coloring.devdocs.json';
diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx
index 23c5c1fe68690..8f7e0e8a1815a 100644
--- a/api_docs/kbn_config.mdx
+++ b/api_docs/kbn_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config
title: "@kbn/config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config']
---
import kbnConfigObj from './kbn_config.devdocs.json';
diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx
index fec7adc098a98..fe1bc5a0c7f35 100644
--- a/api_docs/kbn_config_mocks.mdx
+++ b/api_docs/kbn_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks
title: "@kbn/config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks']
---
import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json';
diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx
index 49e16caca9062..e08798fbb9c7f 100644
--- a/api_docs/kbn_config_schema.mdx
+++ b/api_docs/kbn_config_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema
title: "@kbn/config-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-schema plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema']
---
import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json';
diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx
index 521cd317bca98..7d8151d799226 100644
--- a/api_docs/kbn_content_management_content_editor.mdx
+++ b/api_docs/kbn_content_management_content_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor
title: "@kbn/content-management-content-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-content-editor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor']
---
import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json';
diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
index fb1ca6ace0f40..e09776bd510a6 100644
--- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx
+++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view
title: "@kbn/content-management-tabbed-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-tabbed-table-list-view plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view']
---
import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx
index 110fa05cc21f8..d2e80260a6ca4 100644
--- a/api_docs/kbn_content_management_table_list_view.mdx
+++ b/api_docs/kbn_content_management_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view
title: "@kbn/content-management-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view']
---
import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx
index 2ff6791f2ee7b..5c1a03d59984a 100644
--- a/api_docs/kbn_content_management_table_list_view_common.mdx
+++ b/api_docs/kbn_content_management_table_list_view_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common
title: "@kbn/content-management-table-list-view-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common']
---
import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx
index 63e14f96f9c32..63ac806e2ecd0 100644
--- a/api_docs/kbn_content_management_table_list_view_table.mdx
+++ b/api_docs/kbn_content_management_table_list_view_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table
title: "@kbn/content-management-table-list-view-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view-table plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table']
---
import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json';
diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx
index 965774f4db835..240948d3e4a28 100644
--- a/api_docs/kbn_content_management_utils.mdx
+++ b/api_docs/kbn_content_management_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils
title: "@kbn/content-management-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils']
---
import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx
index 3237fba671646..7ff3adf888e4d 100644
--- a/api_docs/kbn_core_analytics_browser.mdx
+++ b/api_docs/kbn_core_analytics_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser
title: "@kbn/core-analytics-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser']
---
import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx
index cda0b6273cc73..7b177db5f7b11 100644
--- a/api_docs/kbn_core_analytics_browser_internal.mdx
+++ b/api_docs/kbn_core_analytics_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal
title: "@kbn/core-analytics-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal']
---
import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx
index ff585370cf34a..c9047b1e5258c 100644
--- a/api_docs/kbn_core_analytics_browser_mocks.mdx
+++ b/api_docs/kbn_core_analytics_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks
title: "@kbn/core-analytics-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks']
---
import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx
index 9520c0badf379..26c0fddb3db62 100644
--- a/api_docs/kbn_core_analytics_server.mdx
+++ b/api_docs/kbn_core_analytics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server
title: "@kbn/core-analytics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server']
---
import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx
index d0bae87f7988a..f075d189f26db 100644
--- a/api_docs/kbn_core_analytics_server_internal.mdx
+++ b/api_docs/kbn_core_analytics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal
title: "@kbn/core-analytics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal']
---
import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx
index cb31a8935a802..c6886bd2fdd16 100644
--- a/api_docs/kbn_core_analytics_server_mocks.mdx
+++ b/api_docs/kbn_core_analytics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks
title: "@kbn/core-analytics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks']
---
import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx
index 18edc0d90ad87..f17ec400266c2 100644
--- a/api_docs/kbn_core_application_browser.mdx
+++ b/api_docs/kbn_core_application_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser
title: "@kbn/core-application-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser']
---
import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx
index 0e23932ddc4a1..2f12a8ef907c7 100644
--- a/api_docs/kbn_core_application_browser_internal.mdx
+++ b/api_docs/kbn_core_application_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal
title: "@kbn/core-application-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal']
---
import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx
index 4352f554ded8f..f9b12f3c4734c 100644
--- a/api_docs/kbn_core_application_browser_mocks.mdx
+++ b/api_docs/kbn_core_application_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks
title: "@kbn/core-application-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks']
---
import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx
index ab7a3358c615f..ddc8e6544832e 100644
--- a/api_docs/kbn_core_application_common.mdx
+++ b/api_docs/kbn_core_application_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common
title: "@kbn/core-application-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common']
---
import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json';
diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx
index bb8140d735242..fb055e600fa8c 100644
--- a/api_docs/kbn_core_apps_browser_internal.mdx
+++ b/api_docs/kbn_core_apps_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal
title: "@kbn/core-apps-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal']
---
import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx
index 3b51f691a74d5..dea53c00dee8f 100644
--- a/api_docs/kbn_core_apps_browser_mocks.mdx
+++ b/api_docs/kbn_core_apps_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks
title: "@kbn/core-apps-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks']
---
import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx
index 4326da4cd8849..876268518a70d 100644
--- a/api_docs/kbn_core_apps_server_internal.mdx
+++ b/api_docs/kbn_core_apps_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal
title: "@kbn/core-apps-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal']
---
import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx
index e699b31008d38..cdaa56f8a455b 100644
--- a/api_docs/kbn_core_base_browser_mocks.mdx
+++ b/api_docs/kbn_core_base_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks
title: "@kbn/core-base-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks']
---
import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx
index 0e2db136b6659..ef7b5be3c5b80 100644
--- a/api_docs/kbn_core_base_common.mdx
+++ b/api_docs/kbn_core_base_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common
title: "@kbn/core-base-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common']
---
import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json';
diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx
index b715b36a4628a..a46e85e500416 100644
--- a/api_docs/kbn_core_base_server_internal.mdx
+++ b/api_docs/kbn_core_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal
title: "@kbn/core-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal']
---
import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx
index 0ff44c62c368f..eb220edb9a6e6 100644
--- a/api_docs/kbn_core_base_server_mocks.mdx
+++ b/api_docs/kbn_core_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks
title: "@kbn/core-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks']
---
import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx
index 873a8a0f164b4..39401285becb6 100644
--- a/api_docs/kbn_core_capabilities_browser_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks
title: "@kbn/core-capabilities-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks']
---
import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx
index 5f73c9019dd64..578ff065b5836 100644
--- a/api_docs/kbn_core_capabilities_common.mdx
+++ b/api_docs/kbn_core_capabilities_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common
title: "@kbn/core-capabilities-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common']
---
import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx
index 78fda93e37293..55adfd0793fbd 100644
--- a/api_docs/kbn_core_capabilities_server.mdx
+++ b/api_docs/kbn_core_capabilities_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server
title: "@kbn/core-capabilities-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server']
---
import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx
index 1dc52d384064c..7d3075c45d248 100644
--- a/api_docs/kbn_core_capabilities_server_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks
title: "@kbn/core-capabilities-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks']
---
import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json
index 92ad8564a486c..42263bcb126c1 100644
--- a/api_docs/kbn_core_chrome_browser.devdocs.json
+++ b/api_docs/kbn_core_chrome_browser.devdocs.json
@@ -3696,7 +3696,7 @@
"label": "AppDeepLinkId",
"description": [],
"signature": [
- "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchContent:playground\" | \"enterpriseSearchApplications:searchApplications\" | \"appSearch:engines\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:rules\" | \"observability-overview:alerts\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:ai_insights\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\""
+ "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:rules\" | \"observability-overview:alerts\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:ai_insights\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\""
],
"path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts",
"deprecated": false,
diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx
index be343740a9de4..dbcb1bb67321f 100644
--- a/api_docs/kbn_core_chrome_browser.mdx
+++ b/api_docs/kbn_core_chrome_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser
title: "@kbn/core-chrome-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser']
---
import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json';
diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx
index f20b67700d86c..3f25cf3801fe1 100644
--- a/api_docs/kbn_core_chrome_browser_mocks.mdx
+++ b/api_docs/kbn_core_chrome_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks
title: "@kbn/core-chrome-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks']
---
import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx
index 8927528abc095..3877f1998ee0a 100644
--- a/api_docs/kbn_core_config_server_internal.mdx
+++ b/api_docs/kbn_core_config_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal
title: "@kbn/core-config-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-config-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal']
---
import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx
index 502862b5a35d3..dbbbd5aec530a 100644
--- a/api_docs/kbn_core_custom_branding_browser.mdx
+++ b/api_docs/kbn_core_custom_branding_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser
title: "@kbn/core-custom-branding-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser']
---
import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx
index c6e3938b5129d..2590374afdea3 100644
--- a/api_docs/kbn_core_custom_branding_browser_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal
title: "@kbn/core-custom-branding-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal']
---
import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx
index 05c94768dce91..e2e8051d3e569 100644
--- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks
title: "@kbn/core-custom-branding-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks']
---
import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx
index 0e70ce4b2dda3..eb53060cdef80 100644
--- a/api_docs/kbn_core_custom_branding_common.mdx
+++ b/api_docs/kbn_core_custom_branding_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common
title: "@kbn/core-custom-branding-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common']
---
import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx
index 31f8c18a79397..f5206bb2ea733 100644
--- a/api_docs/kbn_core_custom_branding_server.mdx
+++ b/api_docs/kbn_core_custom_branding_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server
title: "@kbn/core-custom-branding-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server']
---
import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx
index 6f33bb2c25a33..c1e2058bbde3d 100644
--- a/api_docs/kbn_core_custom_branding_server_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal
title: "@kbn/core-custom-branding-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal']
---
import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx
index e70103399a092..59162f3d7e46a 100644
--- a/api_docs/kbn_core_custom_branding_server_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks
title: "@kbn/core-custom-branding-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks']
---
import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx
index 5ecacaef9cfcb..5afc3310f73bb 100644
--- a/api_docs/kbn_core_deprecations_browser.mdx
+++ b/api_docs/kbn_core_deprecations_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser
title: "@kbn/core-deprecations-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser']
---
import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx
index 32e117430dc8a..4009621a5ee0f 100644
--- a/api_docs/kbn_core_deprecations_browser_internal.mdx
+++ b/api_docs/kbn_core_deprecations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal
title: "@kbn/core-deprecations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal']
---
import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx
index d41008396e6f1..a7503e761648b 100644
--- a/api_docs/kbn_core_deprecations_browser_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks
title: "@kbn/core-deprecations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks']
---
import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx
index 568d199a1c485..b1fde4c717cf2 100644
--- a/api_docs/kbn_core_deprecations_common.mdx
+++ b/api_docs/kbn_core_deprecations_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common
title: "@kbn/core-deprecations-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common']
---
import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx
index 61f298cd7a898..c769b7cdedb26 100644
--- a/api_docs/kbn_core_deprecations_server.mdx
+++ b/api_docs/kbn_core_deprecations_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server
title: "@kbn/core-deprecations-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server']
---
import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx
index 77be7789756c9..eb89b1f92fd8b 100644
--- a/api_docs/kbn_core_deprecations_server_internal.mdx
+++ b/api_docs/kbn_core_deprecations_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal
title: "@kbn/core-deprecations-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal']
---
import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx
index 78c7423e9be2a..c5a0dadf2efaf 100644
--- a/api_docs/kbn_core_deprecations_server_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks
title: "@kbn/core-deprecations-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks']
---
import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx
index 3cfec8dde7442..0662f814f57c4 100644
--- a/api_docs/kbn_core_doc_links_browser.mdx
+++ b/api_docs/kbn_core_doc_links_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser
title: "@kbn/core-doc-links-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser']
---
import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx
index 6d95fa7f36014..cd70bfa6c489c 100644
--- a/api_docs/kbn_core_doc_links_browser_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks
title: "@kbn/core-doc-links-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks']
---
import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx
index 43461f6df50eb..1a0593c6fd866 100644
--- a/api_docs/kbn_core_doc_links_server.mdx
+++ b/api_docs/kbn_core_doc_links_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server
title: "@kbn/core-doc-links-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server']
---
import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx
index fb0615ca1b900..fbf7f888383a9 100644
--- a/api_docs/kbn_core_doc_links_server_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks
title: "@kbn/core-doc-links-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks']
---
import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
index 4a24bdb28c145..9469f4a30e821 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal
title: "@kbn/core-elasticsearch-client-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal']
---
import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
index 800dc3bbe2d5e..deebb231252ab 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks
title: "@kbn/core-elasticsearch-client-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks']
---
import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx
index 52ccc5416f797..cec76e7d6b57d 100644
--- a/api_docs/kbn_core_elasticsearch_server.mdx
+++ b/api_docs/kbn_core_elasticsearch_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server
title: "@kbn/core-elasticsearch-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server']
---
import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx
index a699b65f9ebda..4d2e8bf270196 100644
--- a/api_docs/kbn_core_elasticsearch_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal
title: "@kbn/core-elasticsearch-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal']
---
import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx
index 291fb9cdada54..65dd63ea828f2 100644
--- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks
title: "@kbn/core-elasticsearch-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks']
---
import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx
index 622c7ecf278c5..627cc2520da4b 100644
--- a/api_docs/kbn_core_environment_server_internal.mdx
+++ b/api_docs/kbn_core_environment_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal
title: "@kbn/core-environment-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal']
---
import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx
index ca8aa9486e0c5..640cc365b6f0d 100644
--- a/api_docs/kbn_core_environment_server_mocks.mdx
+++ b/api_docs/kbn_core_environment_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks
title: "@kbn/core-environment-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks']
---
import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx
index a5711b1740613..51a716da07273 100644
--- a/api_docs/kbn_core_execution_context_browser.mdx
+++ b/api_docs/kbn_core_execution_context_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser
title: "@kbn/core-execution-context-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser']
---
import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx
index 35861fc5b9c7e..218f3ee46e35b 100644
--- a/api_docs/kbn_core_execution_context_browser_internal.mdx
+++ b/api_docs/kbn_core_execution_context_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal
title: "@kbn/core-execution-context-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal']
---
import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx
index ee4f78fd9bb4c..832ebdc4f505e 100644
--- a/api_docs/kbn_core_execution_context_browser_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks
title: "@kbn/core-execution-context-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks']
---
import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx
index 74c29cb4263b2..cdde287062066 100644
--- a/api_docs/kbn_core_execution_context_common.mdx
+++ b/api_docs/kbn_core_execution_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common
title: "@kbn/core-execution-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common']
---
import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx
index 66d215d06521c..65bad55967eea 100644
--- a/api_docs/kbn_core_execution_context_server.mdx
+++ b/api_docs/kbn_core_execution_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server
title: "@kbn/core-execution-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server']
---
import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx
index 0a62dbbda8e9e..081f510bab1f9 100644
--- a/api_docs/kbn_core_execution_context_server_internal.mdx
+++ b/api_docs/kbn_core_execution_context_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal
title: "@kbn/core-execution-context-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal']
---
import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx
index de090a0d4870c..95926f50176a7 100644
--- a/api_docs/kbn_core_execution_context_server_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks
title: "@kbn/core-execution-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks']
---
import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx
index bfc5b5106b3a4..c48495224d547 100644
--- a/api_docs/kbn_core_fatal_errors_browser.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser
title: "@kbn/core-fatal-errors-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser']
---
import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json';
diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
index c827c7038d448..f8877417e36a8 100644
--- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks
title: "@kbn/core-fatal-errors-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks']
---
import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx
index 141e4a7f6d3e4..b558c9312f63f 100644
--- a/api_docs/kbn_core_http_browser.mdx
+++ b/api_docs/kbn_core_http_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser
title: "@kbn/core-http-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser']
---
import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx
index 7ef1a13679857..3d17c5fb6e74f 100644
--- a/api_docs/kbn_core_http_browser_internal.mdx
+++ b/api_docs/kbn_core_http_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal
title: "@kbn/core-http-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal']
---
import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx
index 38c9dc3bdb79e..326239d33ecc9 100644
--- a/api_docs/kbn_core_http_browser_mocks.mdx
+++ b/api_docs/kbn_core_http_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks
title: "@kbn/core-http-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks']
---
import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx
index 3c7a76bee2fb8..2e48f5da6a139 100644
--- a/api_docs/kbn_core_http_common.mdx
+++ b/api_docs/kbn_core_http_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common
title: "@kbn/core-http-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common']
---
import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json';
diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx
index c7c65afa9019f..978788c30a0b7 100644
--- a/api_docs/kbn_core_http_context_server_mocks.mdx
+++ b/api_docs/kbn_core_http_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks
title: "@kbn/core-http-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-context-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks']
---
import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx
index 2cd6cc1c921a9..2f2cd02edc94e 100644
--- a/api_docs/kbn_core_http_request_handler_context_server.mdx
+++ b/api_docs/kbn_core_http_request_handler_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server
title: "@kbn/core-http-request-handler-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-request-handler-context-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server']
---
import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx
index 781c6383ecc59..f2cc29f33a559 100644
--- a/api_docs/kbn_core_http_resources_server.mdx
+++ b/api_docs/kbn_core_http_resources_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server
title: "@kbn/core-http-resources-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server']
---
import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx
index e6a96a659ee44..e552deeee03d9 100644
--- a/api_docs/kbn_core_http_resources_server_internal.mdx
+++ b/api_docs/kbn_core_http_resources_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal
title: "@kbn/core-http-resources-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal']
---
import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx
index 03c3ce2e92f2f..103d963185953 100644
--- a/api_docs/kbn_core_http_resources_server_mocks.mdx
+++ b/api_docs/kbn_core_http_resources_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks
title: "@kbn/core-http-resources-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks']
---
import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx
index 3b67aa7841fb8..c0e51954b659b 100644
--- a/api_docs/kbn_core_http_router_server_internal.mdx
+++ b/api_docs/kbn_core_http_router_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal
title: "@kbn/core-http-router-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal']
---
import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx
index a71ef7ea0f577..1e863f5557bdb 100644
--- a/api_docs/kbn_core_http_router_server_mocks.mdx
+++ b/api_docs/kbn_core_http_router_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks
title: "@kbn/core-http-router-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks']
---
import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json
index 68157bfed74fd..137d22704c4e5 100644
--- a/api_docs/kbn_core_http_server.devdocs.json
+++ b/api_docs/kbn_core_http_server.devdocs.json
@@ -3865,10 +3865,6 @@
"plugin": "banners",
"path": "x-pack/plugins/banners/server/routes/info.ts"
},
- {
- "plugin": "stackConnectors",
- "path": "x-pack/plugins/stack_connectors/server/routes/get_well_known_email_service.ts"
- },
{
"plugin": "savedObjectsTagging",
"path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/get_all_tags.ts"
@@ -4609,6 +4605,10 @@
"plugin": "snapshotRestore",
"path": "x-pack/plugins/snapshot_restore/server/routes/api/policy.ts"
},
+ {
+ "plugin": "stackConnectors",
+ "path": "x-pack/plugins/stack_connectors/server/routes/get_well_known_email_service.ts"
+ },
{
"plugin": "upgradeAssistant",
"path": "x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts"
@@ -6455,10 +6455,6 @@
"plugin": "assetManager",
"path": "x-pack/plugins/asset_manager/server/routes/sample_assets.ts"
},
- {
- "plugin": "stackConnectors",
- "path": "x-pack/plugins/stack_connectors/server/routes/valid_slack_api_channels.ts"
- },
{
"plugin": "savedObjectsTagging",
"path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/create_tag.ts"
@@ -7107,6 +7103,10 @@
"plugin": "snapshotRestore",
"path": "x-pack/plugins/snapshot_restore/server/routes/api/policy.ts"
},
+ {
+ "plugin": "stackConnectors",
+ "path": "x-pack/plugins/stack_connectors/server/routes/valid_slack_api_channels.ts"
+ },
{
"plugin": "upgradeAssistant",
"path": "x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts"
diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx
index 09ea835cc0681..1593bd2c338c6 100644
--- a/api_docs/kbn_core_http_server.mdx
+++ b/api_docs/kbn_core_http_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server
title: "@kbn/core-http-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server']
---
import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx
index 1ae31802f8dda..0fd75d7030f42 100644
--- a/api_docs/kbn_core_http_server_internal.mdx
+++ b/api_docs/kbn_core_http_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal
title: "@kbn/core-http-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal']
---
import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx
index b42329bbe3e8e..feba59ea87527 100644
--- a/api_docs/kbn_core_http_server_mocks.mdx
+++ b/api_docs/kbn_core_http_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks
title: "@kbn/core-http-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks']
---
import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx
index bbca6bb8438aa..c6acf55d57c15 100644
--- a/api_docs/kbn_core_i18n_browser.mdx
+++ b/api_docs/kbn_core_i18n_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser
title: "@kbn/core-i18n-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser']
---
import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx
index 295f9211933be..db72b53d5ac95 100644
--- a/api_docs/kbn_core_i18n_browser_mocks.mdx
+++ b/api_docs/kbn_core_i18n_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks
title: "@kbn/core-i18n-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks']
---
import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx
index dcb6d133f74d1..f5819e791ba57 100644
--- a/api_docs/kbn_core_i18n_server.mdx
+++ b/api_docs/kbn_core_i18n_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server
title: "@kbn/core-i18n-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server']
---
import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx
index 112a774056847..6a30c8c9f31ae 100644
--- a/api_docs/kbn_core_i18n_server_internal.mdx
+++ b/api_docs/kbn_core_i18n_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal
title: "@kbn/core-i18n-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal']
---
import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx
index db54dec07bb90..2df1befcfc750 100644
--- a/api_docs/kbn_core_i18n_server_mocks.mdx
+++ b/api_docs/kbn_core_i18n_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks
title: "@kbn/core-i18n-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks']
---
import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
index 43fb6d2841c99..6206e6dde14a4 100644
--- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
+++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks
title: "@kbn/core-injected-metadata-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks']
---
import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx
index 764bf0898dd0f..03dfea619fb28 100644
--- a/api_docs/kbn_core_integrations_browser_internal.mdx
+++ b/api_docs/kbn_core_integrations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal
title: "@kbn/core-integrations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal']
---
import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx
index f351cbc80bcf6..dfe6e16942527 100644
--- a/api_docs/kbn_core_integrations_browser_mocks.mdx
+++ b/api_docs/kbn_core_integrations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks
title: "@kbn/core-integrations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks']
---
import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx
index 33bfa22c35129..6c0478473d5eb 100644
--- a/api_docs/kbn_core_lifecycle_browser.mdx
+++ b/api_docs/kbn_core_lifecycle_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser
title: "@kbn/core-lifecycle-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser']
---
import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx
index dde3f98abe7f1..32635a2fd2399 100644
--- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks
title: "@kbn/core-lifecycle-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks']
---
import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx
index 74b2e2150c31f..3bbc63bf01679 100644
--- a/api_docs/kbn_core_lifecycle_server.mdx
+++ b/api_docs/kbn_core_lifecycle_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server
title: "@kbn/core-lifecycle-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server']
---
import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx
index a84b815761f38..90241b2897625 100644
--- a/api_docs/kbn_core_lifecycle_server_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks
title: "@kbn/core-lifecycle-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks']
---
import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx
index 494bf6552b974..a3ec7cab2ccb0 100644
--- a/api_docs/kbn_core_logging_browser_mocks.mdx
+++ b/api_docs/kbn_core_logging_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks
title: "@kbn/core-logging-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks']
---
import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx
index 160fa5e8ce197..6113d2b60d61f 100644
--- a/api_docs/kbn_core_logging_common_internal.mdx
+++ b/api_docs/kbn_core_logging_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal
title: "@kbn/core-logging-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-common-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal']
---
import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx
index 32eee8313507b..6d5b8e09b765d 100644
--- a/api_docs/kbn_core_logging_server.mdx
+++ b/api_docs/kbn_core_logging_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server
title: "@kbn/core-logging-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server']
---
import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx
index 355328818a0d3..096b85dbfdb88 100644
--- a/api_docs/kbn_core_logging_server_internal.mdx
+++ b/api_docs/kbn_core_logging_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal
title: "@kbn/core-logging-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal']
---
import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx
index ac68173812d9c..5262603d6478e 100644
--- a/api_docs/kbn_core_logging_server_mocks.mdx
+++ b/api_docs/kbn_core_logging_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks
title: "@kbn/core-logging-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks']
---
import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx
index 6fc7c14d0fa5f..aa867cb1b93b7 100644
--- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal
title: "@kbn/core-metrics-collectors-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal']
---
import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
index 4d011c8912ffa..e4e4c8eb2c3cb 100644
--- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks
title: "@kbn/core-metrics-collectors-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks']
---
import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx
index 2e465b065e032..677f15700444a 100644
--- a/api_docs/kbn_core_metrics_server.mdx
+++ b/api_docs/kbn_core_metrics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server
title: "@kbn/core-metrics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server']
---
import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx
index 1b33ca02e3ad5..845e74808475f 100644
--- a/api_docs/kbn_core_metrics_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal
title: "@kbn/core-metrics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal']
---
import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx
index b166bc111d35f..ff6cfbdca6eb5 100644
--- a/api_docs/kbn_core_metrics_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks
title: "@kbn/core-metrics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks']
---
import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx
index 36237b9afc729..b89bcebfede68 100644
--- a/api_docs/kbn_core_mount_utils_browser.mdx
+++ b/api_docs/kbn_core_mount_utils_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser
title: "@kbn/core-mount-utils-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-mount-utils-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser']
---
import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json';
diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx
index 59557d8c881f6..33a79164503f9 100644
--- a/api_docs/kbn_core_node_server.mdx
+++ b/api_docs/kbn_core_node_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server
title: "@kbn/core-node-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server']
---
import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json';
diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx
index 9347e32b4d1b0..aea0fdf9701a0 100644
--- a/api_docs/kbn_core_node_server_internal.mdx
+++ b/api_docs/kbn_core_node_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal
title: "@kbn/core-node-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal']
---
import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx
index eb71022960eb7..d806418afd319 100644
--- a/api_docs/kbn_core_node_server_mocks.mdx
+++ b/api_docs/kbn_core_node_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks
title: "@kbn/core-node-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks']
---
import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx
index 5ceba06396ce1..b607a07221395 100644
--- a/api_docs/kbn_core_notifications_browser.mdx
+++ b/api_docs/kbn_core_notifications_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser
title: "@kbn/core-notifications-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser']
---
import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx
index b5fc0b684c077..419278892e801 100644
--- a/api_docs/kbn_core_notifications_browser_internal.mdx
+++ b/api_docs/kbn_core_notifications_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal
title: "@kbn/core-notifications-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal']
---
import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx
index 5e34e8574f6ac..b44d18fec7aee 100644
--- a/api_docs/kbn_core_notifications_browser_mocks.mdx
+++ b/api_docs/kbn_core_notifications_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks
title: "@kbn/core-notifications-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks']
---
import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx
index a65d96f36ec62..9547089954f6e 100644
--- a/api_docs/kbn_core_overlays_browser.mdx
+++ b/api_docs/kbn_core_overlays_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser
title: "@kbn/core-overlays-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser']
---
import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx
index 32e5f881173b1..81c9332bee482 100644
--- a/api_docs/kbn_core_overlays_browser_internal.mdx
+++ b/api_docs/kbn_core_overlays_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal
title: "@kbn/core-overlays-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal']
---
import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx
index 50c66718f1934..19f7e95299fc3 100644
--- a/api_docs/kbn_core_overlays_browser_mocks.mdx
+++ b/api_docs/kbn_core_overlays_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks
title: "@kbn/core-overlays-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks']
---
import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx
index 23cf9e3e1ca3f..b0a98007ac6a3 100644
--- a/api_docs/kbn_core_plugins_browser.mdx
+++ b/api_docs/kbn_core_plugins_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser
title: "@kbn/core-plugins-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser']
---
import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx
index c185a5944fd5b..33cf5715a414e 100644
--- a/api_docs/kbn_core_plugins_browser_mocks.mdx
+++ b/api_docs/kbn_core_plugins_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks
title: "@kbn/core-plugins-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks']
---
import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx
index 92fb9a3a98a05..6a25757aa525f 100644
--- a/api_docs/kbn_core_plugins_contracts_browser.mdx
+++ b/api_docs/kbn_core_plugins_contracts_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser
title: "@kbn/core-plugins-contracts-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-contracts-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser']
---
import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx
index 2c20ef3502edb..325d27316909e 100644
--- a/api_docs/kbn_core_plugins_contracts_server.mdx
+++ b/api_docs/kbn_core_plugins_contracts_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server
title: "@kbn/core-plugins-contracts-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-contracts-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server']
---
import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx
index 3615e23967927..5a91383572762 100644
--- a/api_docs/kbn_core_plugins_server.mdx
+++ b/api_docs/kbn_core_plugins_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server
title: "@kbn/core-plugins-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server']
---
import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx
index cbfa2cf1ed356..8468f3196415a 100644
--- a/api_docs/kbn_core_plugins_server_mocks.mdx
+++ b/api_docs/kbn_core_plugins_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks
title: "@kbn/core-plugins-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks']
---
import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx
index b15d8ce84ccdc..c73e535065fbe 100644
--- a/api_docs/kbn_core_preboot_server.mdx
+++ b/api_docs/kbn_core_preboot_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server
title: "@kbn/core-preboot-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server']
---
import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json';
diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx
index 4b6c05d4c63de..ea93e9e4ad41c 100644
--- a/api_docs/kbn_core_preboot_server_mocks.mdx
+++ b/api_docs/kbn_core_preboot_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks
title: "@kbn/core-preboot-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks']
---
import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx
index caf6cd33a8464..45c38f78a76f9 100644
--- a/api_docs/kbn_core_rendering_browser_mocks.mdx
+++ b/api_docs/kbn_core_rendering_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks
title: "@kbn/core-rendering-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks']
---
import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx
index d076119d3b36f..4dbe0929624e9 100644
--- a/api_docs/kbn_core_rendering_server_internal.mdx
+++ b/api_docs/kbn_core_rendering_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal
title: "@kbn/core-rendering-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal']
---
import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx
index 49d62ef68be3e..b687493b1908d 100644
--- a/api_docs/kbn_core_rendering_server_mocks.mdx
+++ b/api_docs/kbn_core_rendering_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks
title: "@kbn/core-rendering-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks']
---
import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx
index f72ff31d83488..2003684fe2fa5 100644
--- a/api_docs/kbn_core_root_server_internal.mdx
+++ b/api_docs/kbn_core_root_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal
title: "@kbn/core-root-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-root-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal']
---
import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx
index ad31c50249b0d..520b00bc4683a 100644
--- a/api_docs/kbn_core_saved_objects_api_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_api_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser
title: "@kbn/core-saved-objects-api-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser']
---
import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx
index c23d74f47a9fd..0440e77befc47 100644
--- a/api_docs/kbn_core_saved_objects_api_server.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server
title: "@kbn/core-saved-objects-api-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server']
---
import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
index ea7e364270278..cba98a2c44d91 100644
--- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks
title: "@kbn/core-saved-objects-api-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks']
---
import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx
index 37a7e30be9415..56b3f3fcae640 100644
--- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal
title: "@kbn/core-saved-objects-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal']
---
import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
index 9f0090c0a5791..0b5ec1725fc57 100644
--- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks
title: "@kbn/core-saved-objects-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks']
---
import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx
index 1a42726d9fbfc..175d3615df9b1 100644
--- a/api_docs/kbn_core_saved_objects_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser
title: "@kbn/core-saved-objects-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser']
---
import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx
index 05b08badb327e..b8f8509b3d085 100644
--- a/api_docs/kbn_core_saved_objects_browser_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal
title: "@kbn/core-saved-objects-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal']
---
import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx
index e2418c8214f78..c0ec7684588bf 100644
--- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks
title: "@kbn/core-saved-objects-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks']
---
import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx
index f980f3f848ed0..d9f54d516e95d 100644
--- a/api_docs/kbn_core_saved_objects_common.mdx
+++ b/api_docs/kbn_core_saved_objects_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common
title: "@kbn/core-saved-objects-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common']
---
import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
index c8c50f0fdc2fa..b3ddc7108b63a 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal
title: "@kbn/core-saved-objects-import-export-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal']
---
import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
index 14ed74f6a5f40..554388073c9ac 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks
title: "@kbn/core-saved-objects-import-export-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks']
---
import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
index a10e7d0334c80..055ff99eecc81 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal
title: "@kbn/core-saved-objects-migration-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal']
---
import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
index 0f82c01dbb8d4..4457a55cd0b04 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks
title: "@kbn/core-saved-objects-migration-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks']
---
import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx
index caaf27d4ad56d..19d9d6d98a3d6 100644
--- a/api_docs/kbn_core_saved_objects_server.mdx
+++ b/api_docs/kbn_core_saved_objects_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server
title: "@kbn/core-saved-objects-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server']
---
import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx
index 4576b4cf0c817..1e142b66d2856 100644
--- a/api_docs/kbn_core_saved_objects_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal
title: "@kbn/core-saved-objects-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal']
---
import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx
index 7cbbf87c8ae33..09099196954c3 100644
--- a/api_docs/kbn_core_saved_objects_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks
title: "@kbn/core-saved-objects-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks']
---
import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx
index 712e2f01285bd..4ae6b60a55606 100644
--- a/api_docs/kbn_core_saved_objects_utils_server.mdx
+++ b/api_docs/kbn_core_saved_objects_utils_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server
title: "@kbn/core-saved-objects-utils-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-utils-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server']
---
import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx
index 5ab82570d5212..12a74fb1f4223 100644
--- a/api_docs/kbn_core_security_browser.mdx
+++ b/api_docs/kbn_core_security_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser
title: "@kbn/core-security-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser']
---
import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx
index 0af65e743004f..1f872d6745c24 100644
--- a/api_docs/kbn_core_security_browser_internal.mdx
+++ b/api_docs/kbn_core_security_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal
title: "@kbn/core-security-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal']
---
import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx
index 2ba210cab6f2e..e119f75f43bdc 100644
--- a/api_docs/kbn_core_security_browser_mocks.mdx
+++ b/api_docs/kbn_core_security_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks
title: "@kbn/core-security-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks']
---
import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx
index 3a7aa0433c93a..32d21af09688e 100644
--- a/api_docs/kbn_core_security_common.mdx
+++ b/api_docs/kbn_core_security_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common
title: "@kbn/core-security-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common']
---
import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json';
diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx
index 583ebfbd80db9..91fb4150abc18 100644
--- a/api_docs/kbn_core_security_server.mdx
+++ b/api_docs/kbn_core_security_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server
title: "@kbn/core-security-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server']
---
import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json';
diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx
index 9feb13ee325cc..01266ac8bf68d 100644
--- a/api_docs/kbn_core_security_server_internal.mdx
+++ b/api_docs/kbn_core_security_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal
title: "@kbn/core-security-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal']
---
import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx
index f24476e944d18..cbe0ee9b0c136 100644
--- a/api_docs/kbn_core_security_server_mocks.mdx
+++ b/api_docs/kbn_core_security_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks
title: "@kbn/core-security-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks']
---
import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx
index 6411650d9514e..a571d3881a413 100644
--- a/api_docs/kbn_core_status_common.mdx
+++ b/api_docs/kbn_core_status_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common
title: "@kbn/core-status-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common']
---
import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json';
diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx
index 1d76c8f13940f..65138cfd3613e 100644
--- a/api_docs/kbn_core_status_common_internal.mdx
+++ b/api_docs/kbn_core_status_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal
title: "@kbn/core-status-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal']
---
import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json';
diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx
index 192a785cce7fe..1b01a8a6000ac 100644
--- a/api_docs/kbn_core_status_server.mdx
+++ b/api_docs/kbn_core_status_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server
title: "@kbn/core-status-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server']
---
import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json';
diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx
index c474f045c3377..87a7fc61321ad 100644
--- a/api_docs/kbn_core_status_server_internal.mdx
+++ b/api_docs/kbn_core_status_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal
title: "@kbn/core-status-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal']
---
import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx
index cca79232a28be..ae4adf1296bb2 100644
--- a/api_docs/kbn_core_status_server_mocks.mdx
+++ b/api_docs/kbn_core_status_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks
title: "@kbn/core-status-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks']
---
import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
index 953e33c0ea634..0eef0d401957f 100644
--- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
+++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters
title: "@kbn/core-test-helpers-deprecations-getters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters']
---
import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
index 0545872105ddd..7cb6ea6631a6b 100644
--- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
+++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser
title: "@kbn/core-test-helpers-http-setup-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser']
---
import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx
index aa2224c7ca2cd..72068a5586c23 100644
--- a/api_docs/kbn_core_test_helpers_kbn_server.mdx
+++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server
title: "@kbn/core-test-helpers-kbn-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-kbn-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server']
---
import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx
index e344e354929fa..aa582a4c54e24 100644
--- a/api_docs/kbn_core_test_helpers_model_versions.mdx
+++ b/api_docs/kbn_core_test_helpers_model_versions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions
title: "@kbn/core-test-helpers-model-versions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-model-versions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions']
---
import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
index e240489f4c92a..2a024ac64fa92 100644
--- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
+++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer
title: "@kbn/core-test-helpers-so-type-serializer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer']
---
import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx
index 781d9368d8cbe..0f7c487a7b131 100644
--- a/api_docs/kbn_core_test_helpers_test_utils.mdx
+++ b/api_docs/kbn_core_test_helpers_test_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils
title: "@kbn/core-test-helpers-test-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-test-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils']
---
import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json';
diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx
index 4d52b1346dbe2..8fdc9f9bf0e44 100644
--- a/api_docs/kbn_core_theme_browser.mdx
+++ b/api_docs/kbn_core_theme_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser
title: "@kbn/core-theme-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser']
---
import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json';
diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx
index 23f92ce292821..a11ae8572b3fa 100644
--- a/api_docs/kbn_core_theme_browser_mocks.mdx
+++ b/api_docs/kbn_core_theme_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks
title: "@kbn/core-theme-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks']
---
import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx
index bb9facb718ca6..1abcef2cef0b1 100644
--- a/api_docs/kbn_core_ui_settings_browser.mdx
+++ b/api_docs/kbn_core_ui_settings_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser
title: "@kbn/core-ui-settings-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser']
---
import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx
index af6be9f92ba58..86e92a754753c 100644
--- a/api_docs/kbn_core_ui_settings_browser_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal
title: "@kbn/core-ui-settings-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal']
---
import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx
index fe21b40c8a852..dcfc5302cdecd 100644
--- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks
title: "@kbn/core-ui-settings-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks']
---
import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx
index 75437fbcb0919..5b655735d154f 100644
--- a/api_docs/kbn_core_ui_settings_common.mdx
+++ b/api_docs/kbn_core_ui_settings_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common
title: "@kbn/core-ui-settings-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common']
---
import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx
index 8c2c37ae6f4dd..86710ab969d19 100644
--- a/api_docs/kbn_core_ui_settings_server.mdx
+++ b/api_docs/kbn_core_ui_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server
title: "@kbn/core-ui-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server']
---
import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx
index 39d5f1e711b90..717f7c673b00e 100644
--- a/api_docs/kbn_core_ui_settings_server_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal
title: "@kbn/core-ui-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal']
---
import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx
index 92ecd4a7fb1cb..74ee9688828f9 100644
--- a/api_docs/kbn_core_ui_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks
title: "@kbn/core-ui-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks']
---
import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx
index 54a7d391db378..7ce60ee6c70ac 100644
--- a/api_docs/kbn_core_usage_data_server.mdx
+++ b/api_docs/kbn_core_usage_data_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server
title: "@kbn/core-usage-data-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server']
---
import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx
index 7e3cfd5549a82..3e88ed0884024 100644
--- a/api_docs/kbn_core_usage_data_server_internal.mdx
+++ b/api_docs/kbn_core_usage_data_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal
title: "@kbn/core-usage-data-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal']
---
import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx
index b619cf558b11b..57631e9c886a4 100644
--- a/api_docs/kbn_core_usage_data_server_mocks.mdx
+++ b/api_docs/kbn_core_usage_data_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks
title: "@kbn/core-usage-data-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks']
---
import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx
index c3a486e61a482..6c8b57057b43a 100644
--- a/api_docs/kbn_core_user_settings_server.mdx
+++ b/api_docs/kbn_core_user_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server
title: "@kbn/core-user-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server']
---
import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx
index d90f0372dc2ff..de3eb5db57c0b 100644
--- a/api_docs/kbn_core_user_settings_server_internal.mdx
+++ b/api_docs/kbn_core_user_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal
title: "@kbn/core-user-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-internal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal']
---
import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx
index 9544284c35cbf..275c0194b27a7 100644
--- a/api_docs/kbn_core_user_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_user_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks
title: "@kbn/core-user-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks']
---
import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx
index 593cf9050d972..aa13d65f380ff 100644
--- a/api_docs/kbn_crypto.mdx
+++ b/api_docs/kbn_crypto.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto
title: "@kbn/crypto"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto']
---
import kbnCryptoObj from './kbn_crypto.devdocs.json';
diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx
index 0f57ee34c339b..1d97580b4a95d 100644
--- a/api_docs/kbn_crypto_browser.mdx
+++ b/api_docs/kbn_crypto_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser
title: "@kbn/crypto-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser']
---
import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json';
diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx
index 3ca4934609fa3..295836997ef55 100644
--- a/api_docs/kbn_custom_icons.mdx
+++ b/api_docs/kbn_custom_icons.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons
title: "@kbn/custom-icons"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/custom-icons plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons']
---
import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json';
diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx
index 5bd550ec663ca..d18725804a080 100644
--- a/api_docs/kbn_custom_integrations.mdx
+++ b/api_docs/kbn_custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations
title: "@kbn/custom-integrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/custom-integrations plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations']
---
import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json';
diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx
index 7e690479a4605..3a2b0b82b2f8d 100644
--- a/api_docs/kbn_cypress_config.mdx
+++ b/api_docs/kbn_cypress_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config
title: "@kbn/cypress-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cypress-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config']
---
import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json';
diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx
index 943ec171cee15..f0bac9ac900f5 100644
--- a/api_docs/kbn_data_forge.mdx
+++ b/api_docs/kbn_data_forge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge
title: "@kbn/data-forge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-forge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge']
---
import kbnDataForgeObj from './kbn_data_forge.devdocs.json';
diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx
index 0e3fdb4d2c3d9..f2df9d5740657 100644
--- a/api_docs/kbn_data_service.mdx
+++ b/api_docs/kbn_data_service.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service
title: "@kbn/data-service"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-service plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service']
---
import kbnDataServiceObj from './kbn_data_service.devdocs.json';
diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx
index d56e38e56e76f..d245d7a25459f 100644
--- a/api_docs/kbn_data_stream_adapter.mdx
+++ b/api_docs/kbn_data_stream_adapter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter
title: "@kbn/data-stream-adapter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-stream-adapter plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter']
---
import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json';
diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx
index 1fe34a86f041b..8607aee930157 100644
--- a/api_docs/kbn_data_view_utils.mdx
+++ b/api_docs/kbn_data_view_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils
title: "@kbn/data-view-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-view-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils']
---
import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json';
diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx
index fcf10607a9dc9..ce7d9c940c420 100644
--- a/api_docs/kbn_datemath.mdx
+++ b/api_docs/kbn_datemath.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath
title: "@kbn/datemath"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/datemath plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath']
---
import kbnDatemathObj from './kbn_datemath.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx
index d7e2d36d167bb..309b5f8707d1e 100644
--- a/api_docs/kbn_deeplinks_analytics.mdx
+++ b/api_docs/kbn_deeplinks_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics
title: "@kbn/deeplinks-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-analytics plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics']
---
import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx
index 4f064c776dcaa..61c6ade944808 100644
--- a/api_docs/kbn_deeplinks_devtools.mdx
+++ b/api_docs/kbn_deeplinks_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools
title: "@kbn/deeplinks-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-devtools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools']
---
import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx
index 16aae555b0c19..3c3ed137f2004 100644
--- a/api_docs/kbn_deeplinks_fleet.mdx
+++ b/api_docs/kbn_deeplinks_fleet.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet
title: "@kbn/deeplinks-fleet"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-fleet plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet']
---
import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx
index e075a832c5e97..bb0e586571fb6 100644
--- a/api_docs/kbn_deeplinks_management.mdx
+++ b/api_docs/kbn_deeplinks_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management
title: "@kbn/deeplinks-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-management plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management']
---
import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx
index 17a6a66ea019b..8f4d63c40747a 100644
--- a/api_docs/kbn_deeplinks_ml.mdx
+++ b/api_docs/kbn_deeplinks_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml
title: "@kbn/deeplinks-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-ml plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml']
---
import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx
index db48020e29112..1f076393b34ca 100644
--- a/api_docs/kbn_deeplinks_observability.mdx
+++ b/api_docs/kbn_deeplinks_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability
title: "@kbn/deeplinks-observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-observability plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability']
---
import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_search.devdocs.json b/api_docs/kbn_deeplinks_search.devdocs.json
index f6dd2950f9b0e..b63710ed4d427 100644
--- a/api_docs/kbn_deeplinks_search.devdocs.json
+++ b/api_docs/kbn_deeplinks_search.devdocs.json
@@ -30,7 +30,7 @@
"label": "DeepLinkId",
"description": [],
"signature": [
- "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchContent:playground\" | \"enterpriseSearchApplications:searchApplications\" | \"appSearch:engines\""
+ "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\""
],
"path": "packages/deeplinks/search/deep_links.ts",
"deprecated": false,
diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx
index 386c5ab617469..1c02f87a11674 100644
--- a/api_docs/kbn_deeplinks_search.mdx
+++ b/api_docs/kbn_deeplinks_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search
title: "@kbn/deeplinks-search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-search plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search']
---
import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx
index 74c4b21da82b4..0916d8645b244 100644
--- a/api_docs/kbn_deeplinks_security.mdx
+++ b/api_docs/kbn_deeplinks_security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security
title: "@kbn/deeplinks-security"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-security plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security']
---
import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx
index 7a516c36cdcea..e6eda43dc1d9d 100644
--- a/api_docs/kbn_deeplinks_shared.mdx
+++ b/api_docs/kbn_deeplinks_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared
title: "@kbn/deeplinks-shared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-shared plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared']
---
import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json';
diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx
index edac257c81595..9ec9cc34c98b7 100644
--- a/api_docs/kbn_default_nav_analytics.mdx
+++ b/api_docs/kbn_default_nav_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics
title: "@kbn/default-nav-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-analytics plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics']
---
import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json';
diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx
index 448cdfb6090cf..3d49804a57e0e 100644
--- a/api_docs/kbn_default_nav_devtools.mdx
+++ b/api_docs/kbn_default_nav_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools
title: "@kbn/default-nav-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-devtools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools']
---
import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json';
diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx
index eff8a1253ca9e..392fb09b15433 100644
--- a/api_docs/kbn_default_nav_management.mdx
+++ b/api_docs/kbn_default_nav_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management
title: "@kbn/default-nav-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-management plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management']
---
import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json';
diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx
index 89f32381c0162..8892b12474a4c 100644
--- a/api_docs/kbn_default_nav_ml.mdx
+++ b/api_docs/kbn_default_nav_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml
title: "@kbn/default-nav-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-ml plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml']
---
import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json';
diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx
index b454f4b823495..c6eef0acabbba 100644
--- a/api_docs/kbn_dev_cli_errors.mdx
+++ b/api_docs/kbn_dev_cli_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors
title: "@kbn/dev-cli-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-errors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors']
---
import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json';
diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx
index d701a3bc91445..d93a907e6f9bb 100644
--- a/api_docs/kbn_dev_cli_runner.mdx
+++ b/api_docs/kbn_dev_cli_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner
title: "@kbn/dev-cli-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-runner plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner']
---
import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json';
diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx
index 8cfc84a58182d..1986c32f1b154 100644
--- a/api_docs/kbn_dev_proc_runner.mdx
+++ b/api_docs/kbn_dev_proc_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner
title: "@kbn/dev-proc-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-proc-runner plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner']
---
import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json';
diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx
index ff24bb0a7a731..ae20b67a11f1f 100644
--- a/api_docs/kbn_dev_utils.mdx
+++ b/api_docs/kbn_dev_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils
title: "@kbn/dev-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils']
---
import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json';
diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx
index 397fff043500f..cce6fe3b155e7 100644
--- a/api_docs/kbn_discover_utils.mdx
+++ b/api_docs/kbn_discover_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils
title: "@kbn/discover-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/discover-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils']
---
import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json';
diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json
index 9d0610eb9d6c7..d4f83ac589687 100644
--- a/api_docs/kbn_doc_links.devdocs.json
+++ b/api_docs/kbn_doc_links.devdocs.json
@@ -300,7 +300,7 @@
"label": "enterpriseSearch",
"description": [],
"signature": [
- "{ readonly aiSearchDoc: string; readonly aiSearchHelp: string; readonly apiKeys: string; readonly behavioralAnalytics: string; readonly behavioralAnalyticsCORS: string; readonly behavioralAnalyticsEvents: string; readonly buildConnector: string; readonly bulkApi: string; readonly configuration: string; readonly connectors: string; readonly connectorsClientDeploy: string; readonly connectorsMappings: string; readonly connectorsAzureBlobStorage: string; readonly connectorsBox: string; readonly connectorsClients: string; readonly connectorsConfluence: string; readonly connectorsContentExtraction: string; readonly connectorsDropbox: string; readonly connectorsGithub: string; readonly connectorsGoogleCloudStorage: string; readonly connectorsGoogleDrive: string; readonly connectorsGmail: string; readonly connectorsJira: string; readonly connectorsMicrosoftSQL: string; readonly connectorsMongoDB: string; readonly connectorsMySQL: string; readonly connectorsNative: string; readonly connectorsNetworkDrive: string; readonly connectorsNotion: string; readonly connectorsOneDrive: string; readonly connectorsOracle: string; readonly connectorsOutlook: string; readonly connectorsPostgreSQL: string; readonly connectorsRedis: string; readonly connectorsS3: string; readonly connectorsSalesforce: string; readonly connectorsServiceNow: string; readonly connectorsSharepoint: string; readonly connectorsSharepointOnline: string; readonly connectorsTeams: string; readonly connectorsSlack: string; readonly connectorsZoom: string; readonly crawlerExtractionRules: string; readonly crawlerManaging: string; readonly crawlerOverview: string; readonly deployTrainedModels: string; readonly documentLevelSecurity: string; readonly elser: string; readonly engines: string; readonly indexApi: string; readonly ingestionApis: string; readonly ingestPipelines: string; readonly knnSearch: string; readonly knnSearchCombine: string; readonly languageAnalyzers: string; readonly languageClients: string; readonly licenseManagement: string; readonly machineLearningStart: string; readonly mailService: string; readonly mlDocumentEnrichment: string; readonly searchApplicationsTemplates: string; readonly searchApplicationsSearchApi: string; readonly searchApplications: string; readonly searchApplicationsSearch: string; readonly searchLabs: string; readonly searchLabsRepo: string; readonly searchTemplates: string; readonly start: string; readonly supportedNlpModels: string; readonly syncRules: string; readonly syncRulesAdvanced: string; readonly trainedModels: string; readonly textEmbedding: string; readonly troubleshootSetup: string; readonly usersAccess: string; }"
+ "{ readonly aiSearchDoc: string; readonly aiSearchHelp: string; readonly apiKeys: string; readonly behavioralAnalytics: string; readonly behavioralAnalyticsCORS: string; readonly behavioralAnalyticsEvents: string; readonly buildConnector: string; readonly bulkApi: string; readonly configuration: string; readonly connectors: string; readonly connectorsClientDeploy: string; readonly connectorsMappings: string; readonly connectorsAzureBlobStorage: string; readonly connectorsBox: string; readonly connectorsClients: string; readonly connectorsConfluence: string; readonly connectorsContentExtraction: string; readonly connectorsDropbox: string; readonly connectorsGithub: string; readonly connectorsGoogleCloudStorage: string; readonly connectorsGoogleDrive: string; readonly connectorsGmail: string; readonly connectorsJira: string; readonly connectorsMicrosoftSQL: string; readonly connectorsMongoDB: string; readonly connectorsMySQL: string; readonly connectorsNative: string; readonly connectorsNetworkDrive: string; readonly connectorsNotion: string; readonly connectorsOneDrive: string; readonly connectorsOracle: string; readonly connectorsOutlook: string; readonly connectorsPostgreSQL: string; readonly connectorsRedis: string; readonly connectorsS3: string; readonly connectorsSalesforce: string; readonly connectorsServiceNow: string; readonly connectorsSharepoint: string; readonly connectorsSharepointOnline: string; readonly connectorsTeams: string; readonly connectorsSlack: string; readonly connectorsZoom: string; readonly crawlerExtractionRules: string; readonly crawlerManaging: string; readonly crawlerOverview: string; readonly deployTrainedModels: string; readonly documentLevelSecurity: string; readonly elser: string; readonly engines: string; readonly indexApi: string; readonly ingestionApis: string; readonly ingestPipelines: string; readonly knnSearch: string; readonly knnSearchCombine: string; readonly languageAnalyzers: string; readonly languageClients: string; readonly licenseManagement: string; readonly machineLearningStart: string; readonly playground: string; readonly mailService: string; readonly mlDocumentEnrichment: string; readonly searchApplicationsTemplates: string; readonly searchApplicationsSearchApi: string; readonly searchApplications: string; readonly searchApplicationsSearch: string; readonly searchLabs: string; readonly searchLabsRepo: string; readonly searchTemplates: string; readonly start: string; readonly supportedNlpModels: string; readonly syncRules: string; readonly syncRulesAdvanced: string; readonly trainedModels: string; readonly textEmbedding: string; readonly troubleshootSetup: string; readonly usersAccess: string; }"
],
"path": "packages/kbn-doc-links/src/types.ts",
"deprecated": false,
diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx
index 56f92937bdbaa..aa00fc60b8bbf 100644
--- a/api_docs/kbn_doc_links.mdx
+++ b/api_docs/kbn_doc_links.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links
title: "@kbn/doc-links"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/doc-links plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links']
---
import kbnDocLinksObj from './kbn_doc_links.devdocs.json';
diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx
index eded8dc2dbf00..8e99112b0087a 100644
--- a/api_docs/kbn_docs_utils.mdx
+++ b/api_docs/kbn_docs_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils
title: "@kbn/docs-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/docs-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils']
---
import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json';
diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx
index ba35e84525a6a..e3695ef29c5ff 100644
--- a/api_docs/kbn_dom_drag_drop.mdx
+++ b/api_docs/kbn_dom_drag_drop.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop
title: "@kbn/dom-drag-drop"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dom-drag-drop plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop']
---
import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json';
diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx
index 34782198e6a64..0cd988a69ad42 100644
--- a/api_docs/kbn_ebt_tools.mdx
+++ b/api_docs/kbn_ebt_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools
title: "@kbn/ebt-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ebt-tools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools']
---
import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json';
diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx
index 3ce06696c4218..bbb0367472860 100644
--- a/api_docs/kbn_ecs_data_quality_dashboard.mdx
+++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard
title: "@kbn/ecs-data-quality-dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ecs-data-quality-dashboard plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard']
---
import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json';
diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx
index e58bcace8fdcd..9cea7141133ad 100644
--- a/api_docs/kbn_elastic_agent_utils.mdx
+++ b/api_docs/kbn_elastic_agent_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils
title: "@kbn/elastic-agent-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-agent-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils']
---
import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json';
diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx
index c864662806436..cd7f0f6d71b09 100644
--- a/api_docs/kbn_elastic_assistant.mdx
+++ b/api_docs/kbn_elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant
title: "@kbn/elastic-assistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-assistant plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant']
---
import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json';
diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx
index c598f80d79455..ba486cabf38f2 100644
--- a/api_docs/kbn_elastic_assistant_common.mdx
+++ b/api_docs/kbn_elastic_assistant_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common
title: "@kbn/elastic-assistant-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-assistant-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common']
---
import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json';
diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx
index 830f9e0a2c825..e5323e9cd85e9 100644
--- a/api_docs/kbn_es.mdx
+++ b/api_docs/kbn_es.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es
title: "@kbn/es"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es']
---
import kbnEsObj from './kbn_es.devdocs.json';
diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx
index ba775a7d95348..0adec688d527e 100644
--- a/api_docs/kbn_es_archiver.mdx
+++ b/api_docs/kbn_es_archiver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver
title: "@kbn/es-archiver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-archiver plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver']
---
import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json';
diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx
index 00ae5e2439961..b0c266a62093b 100644
--- a/api_docs/kbn_es_errors.mdx
+++ b/api_docs/kbn_es_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors
title: "@kbn/es-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-errors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors']
---
import kbnEsErrorsObj from './kbn_es_errors.devdocs.json';
diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx
index c55cebe65f6fa..37595d6249acd 100644
--- a/api_docs/kbn_es_query.mdx
+++ b/api_docs/kbn_es_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query
title: "@kbn/es-query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-query plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query']
---
import kbnEsQueryObj from './kbn_es_query.devdocs.json';
diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx
index 17a156f3cd26f..9cef5c76ea35d 100644
--- a/api_docs/kbn_es_types.mdx
+++ b/api_docs/kbn_es_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types
title: "@kbn/es-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types']
---
import kbnEsTypesObj from './kbn_es_types.devdocs.json';
diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx
index ecdcc8d888d11..6214dd18df301 100644
--- a/api_docs/kbn_eslint_plugin_imports.mdx
+++ b/api_docs/kbn_eslint_plugin_imports.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports
title: "@kbn/eslint-plugin-imports"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/eslint-plugin-imports plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports']
---
import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json';
diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx
index a9aaaf74b93b3..a7c73595a52a9 100644
--- a/api_docs/kbn_esql_ast.mdx
+++ b/api_docs/kbn_esql_ast.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast
title: "@kbn/esql-ast"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-ast plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast']
---
import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json';
diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx
index 18fc0cfa8de0e..ffde42542170b 100644
--- a/api_docs/kbn_esql_utils.mdx
+++ b/api_docs/kbn_esql_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils
title: "@kbn/esql-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils']
---
import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json';
diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx
index 8dc27cb036144..56b136a54efee 100644
--- a/api_docs/kbn_esql_validation_autocomplete.mdx
+++ b/api_docs/kbn_esql_validation_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete
title: "@kbn/esql-validation-autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-validation-autocomplete plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete']
---
import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json';
diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx
index 16684a50a767f..221f2c30cf6fb 100644
--- a/api_docs/kbn_event_annotation_common.mdx
+++ b/api_docs/kbn_event_annotation_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common
title: "@kbn/event-annotation-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common']
---
import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json';
diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx
index 52324e1a996f0..bf27153c4e7c3 100644
--- a/api_docs/kbn_event_annotation_components.mdx
+++ b/api_docs/kbn_event_annotation_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components
title: "@kbn/event-annotation-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components']
---
import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json';
diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx
index 157c6b64383cc..4269967973d1a 100644
--- a/api_docs/kbn_expandable_flyout.mdx
+++ b/api_docs/kbn_expandable_flyout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout
title: "@kbn/expandable-flyout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/expandable-flyout plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout']
---
import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json';
diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx
index 41fa205d2d1da..17b46004bf0a9 100644
--- a/api_docs/kbn_field_types.mdx
+++ b/api_docs/kbn_field_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types
title: "@kbn/field-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/field-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types']
---
import kbnFieldTypesObj from './kbn_field_types.devdocs.json';
diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx
index aa4256a5784de..a03df66b77475 100644
--- a/api_docs/kbn_field_utils.mdx
+++ b/api_docs/kbn_field_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils
title: "@kbn/field-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/field-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils']
---
import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json';
diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx
index 0c97db0cb317b..f92ab3a34c730 100644
--- a/api_docs/kbn_find_used_node_modules.mdx
+++ b/api_docs/kbn_find_used_node_modules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules
title: "@kbn/find-used-node-modules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/find-used-node-modules plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules']
---
import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json';
diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx
index 1da588f8aac3b..c8ba408daf619 100644
--- a/api_docs/kbn_formatters.mdx
+++ b/api_docs/kbn_formatters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters
title: "@kbn/formatters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/formatters plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters']
---
import kbnFormattersObj from './kbn_formatters.devdocs.json';
diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx
index d4439ac32d846..feb8604fb3646 100644
--- a/api_docs/kbn_ftr_common_functional_services.mdx
+++ b/api_docs/kbn_ftr_common_functional_services.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services
title: "@kbn/ftr-common-functional-services"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ftr-common-functional-services plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services']
---
import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json';
diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx
index b3fa16b309ee2..491f6523e9529 100644
--- a/api_docs/kbn_ftr_common_functional_ui_services.mdx
+++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services
title: "@kbn/ftr-common-functional-ui-services"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ftr-common-functional-ui-services plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services']
---
import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json';
diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx
index 92026dff7d8b7..b12baf073d776 100644
--- a/api_docs/kbn_generate.mdx
+++ b/api_docs/kbn_generate.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate
title: "@kbn/generate"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate']
---
import kbnGenerateObj from './kbn_generate.devdocs.json';
diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx
index f3a47754a579c..2c790f3da81c3 100644
--- a/api_docs/kbn_generate_console_definitions.mdx
+++ b/api_docs/kbn_generate_console_definitions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions
title: "@kbn/generate-console-definitions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-console-definitions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions']
---
import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json';
diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx
index 69e89cffca504..f82a92b094589 100644
--- a/api_docs/kbn_generate_csv.mdx
+++ b/api_docs/kbn_generate_csv.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv
title: "@kbn/generate-csv"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-csv plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv']
---
import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json';
diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx
index b802f26c598d4..b9af074b2623b 100644
--- a/api_docs/kbn_guided_onboarding.mdx
+++ b/api_docs/kbn_guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding
title: "@kbn/guided-onboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/guided-onboarding plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding']
---
import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json';
diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx
index d561e59a7d9df..0c906fb75ec19 100644
--- a/api_docs/kbn_handlebars.mdx
+++ b/api_docs/kbn_handlebars.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars
title: "@kbn/handlebars"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/handlebars plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars']
---
import kbnHandlebarsObj from './kbn_handlebars.devdocs.json';
diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx
index aa3d2e3d7ad94..618d47ecfc65b 100644
--- a/api_docs/kbn_hapi_mocks.mdx
+++ b/api_docs/kbn_hapi_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks
title: "@kbn/hapi-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/hapi-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks']
---
import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json';
diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx
index be34ef2475e0b..422683b953552 100644
--- a/api_docs/kbn_health_gateway_server.mdx
+++ b/api_docs/kbn_health_gateway_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server
title: "@kbn/health-gateway-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/health-gateway-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server']
---
import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json';
diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx
index 00f901d9ed76a..cd5168e84cf8a 100644
--- a/api_docs/kbn_home_sample_data_card.mdx
+++ b/api_docs/kbn_home_sample_data_card.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card
title: "@kbn/home-sample-data-card"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-card plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card']
---
import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json';
diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx
index 34630d59b21df..dc6a117c90263 100644
--- a/api_docs/kbn_home_sample_data_tab.mdx
+++ b/api_docs/kbn_home_sample_data_tab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab
title: "@kbn/home-sample-data-tab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-tab plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab']
---
import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json';
diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx
index 659c504405d82..58510a059dbd6 100644
--- a/api_docs/kbn_i18n.mdx
+++ b/api_docs/kbn_i18n.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n
title: "@kbn/i18n"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n']
---
import kbnI18nObj from './kbn_i18n.devdocs.json';
diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx
index 2e572c3694a88..e03a3a95c2af1 100644
--- a/api_docs/kbn_i18n_react.mdx
+++ b/api_docs/kbn_i18n_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react
title: "@kbn/i18n-react"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n-react plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react']
---
import kbnI18nReactObj from './kbn_i18n_react.devdocs.json';
diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx
index 6af5cac260535..586ac233fcddd 100644
--- a/api_docs/kbn_import_resolver.mdx
+++ b/api_docs/kbn_import_resolver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver
title: "@kbn/import-resolver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/import-resolver plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver']
---
import kbnImportResolverObj from './kbn_import_resolver.devdocs.json';
diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx
index df5cd888d197e..335feb03d8ce3 100644
--- a/api_docs/kbn_index_management.mdx
+++ b/api_docs/kbn_index_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management
title: "@kbn/index-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/index-management plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management']
---
import kbnIndexManagementObj from './kbn_index_management.devdocs.json';
diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx
index d2d9af639ee12..2c2fa671e64b8 100644
--- a/api_docs/kbn_inference_integration_flyout.mdx
+++ b/api_docs/kbn_inference_integration_flyout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout
title: "@kbn/inference_integration_flyout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/inference_integration_flyout plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout']
---
import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json';
diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx
index 7f68061da792f..be091dc5f9592 100644
--- a/api_docs/kbn_infra_forge.mdx
+++ b/api_docs/kbn_infra_forge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge
title: "@kbn/infra-forge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/infra-forge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge']
---
import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json';
diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx
index 5e08def8a30a8..4bbb15fbab069 100644
--- a/api_docs/kbn_interpreter.mdx
+++ b/api_docs/kbn_interpreter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter
title: "@kbn/interpreter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/interpreter plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter']
---
import kbnInterpreterObj from './kbn_interpreter.devdocs.json';
diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx
index 23c058b227d70..63aadc04cedef 100644
--- a/api_docs/kbn_io_ts_utils.mdx
+++ b/api_docs/kbn_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils
title: "@kbn/io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/io-ts-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils']
---
import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json';
diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx
index 76a3d0efd0e92..8ee70f160a430 100644
--- a/api_docs/kbn_ipynb.mdx
+++ b/api_docs/kbn_ipynb.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb
title: "@kbn/ipynb"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ipynb plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb']
---
import kbnIpynbObj from './kbn_ipynb.devdocs.json';
diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx
index 2c2825b3fefbe..9fda234b233b1 100644
--- a/api_docs/kbn_jest_serializers.mdx
+++ b/api_docs/kbn_jest_serializers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers
title: "@kbn/jest-serializers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/jest-serializers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers']
---
import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json';
diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx
index 91b60022c45ad..87757e0894797 100644
--- a/api_docs/kbn_journeys.mdx
+++ b/api_docs/kbn_journeys.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys
title: "@kbn/journeys"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/journeys plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys']
---
import kbnJourneysObj from './kbn_journeys.devdocs.json';
diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx
index 8fcbda9d0e98c..d224f04cee432 100644
--- a/api_docs/kbn_json_ast.mdx
+++ b/api_docs/kbn_json_ast.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast
title: "@kbn/json-ast"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/json-ast plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast']
---
import kbnJsonAstObj from './kbn_json_ast.devdocs.json';
diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx
index 72b0bfb24c21c..dbb2f32684b5a 100644
--- a/api_docs/kbn_kibana_manifest_schema.mdx
+++ b/api_docs/kbn_kibana_manifest_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema
title: "@kbn/kibana-manifest-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/kibana-manifest-schema plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema']
---
import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json';
diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx
index 621190c0a0899..cbc138f89632a 100644
--- a/api_docs/kbn_language_documentation_popover.mdx
+++ b/api_docs/kbn_language_documentation_popover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover
title: "@kbn/language-documentation-popover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/language-documentation-popover plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover']
---
import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json';
diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx
index 1e222ce4ae08e..9e674b89458f5 100644
--- a/api_docs/kbn_lens_embeddable_utils.mdx
+++ b/api_docs/kbn_lens_embeddable_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils
title: "@kbn/lens-embeddable-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/lens-embeddable-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils']
---
import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json';
diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx
index 35981cd1b57be..5d8d9f7b87355 100644
--- a/api_docs/kbn_lens_formula_docs.mdx
+++ b/api_docs/kbn_lens_formula_docs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs
title: "@kbn/lens-formula-docs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/lens-formula-docs plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs']
---
import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json';
diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx
index 967301c3f398b..f5ccfb3a64916 100644
--- a/api_docs/kbn_logging.mdx
+++ b/api_docs/kbn_logging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging
title: "@kbn/logging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging']
---
import kbnLoggingObj from './kbn_logging.devdocs.json';
diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx
index 101f96d3569f6..943b10511f5f2 100644
--- a/api_docs/kbn_logging_mocks.mdx
+++ b/api_docs/kbn_logging_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks
title: "@kbn/logging-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks']
---
import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json';
diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx
index b7bcfd7b29b3e..d7d3b9f8acd5f 100644
--- a/api_docs/kbn_managed_content_badge.mdx
+++ b/api_docs/kbn_managed_content_badge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge
title: "@kbn/managed-content-badge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/managed-content-badge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge']
---
import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json';
diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx
index f1db6ad2c0333..aed24d67d0dd7 100644
--- a/api_docs/kbn_managed_vscode_config.mdx
+++ b/api_docs/kbn_managed_vscode_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config
title: "@kbn/managed-vscode-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/managed-vscode-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config']
---
import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json';
diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx
index 5edf8f887fc28..96bc1a86f86f4 100644
--- a/api_docs/kbn_management_cards_navigation.mdx
+++ b/api_docs/kbn_management_cards_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation
title: "@kbn/management-cards-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-cards-navigation plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation']
---
import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json';
diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx
index c982c5d9ce061..d04838e4938f2 100644
--- a/api_docs/kbn_management_settings_application.mdx
+++ b/api_docs/kbn_management_settings_application.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application
title: "@kbn/management-settings-application"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-application plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application']
---
import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx
index e58b4a5bf902c..1b87bebc08071 100644
--- a/api_docs/kbn_management_settings_components_field_category.mdx
+++ b/api_docs/kbn_management_settings_components_field_category.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category
title: "@kbn/management-settings-components-field-category"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-category plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category']
---
import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx
index 64e31d89da16a..4feefc373b08a 100644
--- a/api_docs/kbn_management_settings_components_field_input.mdx
+++ b/api_docs/kbn_management_settings_components_field_input.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input
title: "@kbn/management-settings-components-field-input"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-input plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input']
---
import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx
index 8a8d7a529bb3c..3c96ca74a3677 100644
--- a/api_docs/kbn_management_settings_components_field_row.mdx
+++ b/api_docs/kbn_management_settings_components_field_row.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row
title: "@kbn/management-settings-components-field-row"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-row plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row']
---
import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx
index ade3c378503c7..8761d42f06fb1 100644
--- a/api_docs/kbn_management_settings_components_form.mdx
+++ b/api_docs/kbn_management_settings_components_form.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form
title: "@kbn/management-settings-components-form"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-form plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form']
---
import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json';
diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx
index 3b7be2bdc48dd..09be3f7fd6aa2 100644
--- a/api_docs/kbn_management_settings_field_definition.mdx
+++ b/api_docs/kbn_management_settings_field_definition.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition
title: "@kbn/management-settings-field-definition"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-field-definition plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition']
---
import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json';
diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx
index 4d0c91ac31406..b444474169642 100644
--- a/api_docs/kbn_management_settings_ids.mdx
+++ b/api_docs/kbn_management_settings_ids.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids
title: "@kbn/management-settings-ids"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-ids plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids']
---
import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json';
diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx
index 03fa36775e70b..73454f0d95f92 100644
--- a/api_docs/kbn_management_settings_section_registry.mdx
+++ b/api_docs/kbn_management_settings_section_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry
title: "@kbn/management-settings-section-registry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-section-registry plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry']
---
import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json';
diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx
index dd45829c38ab7..212bbd53d98f0 100644
--- a/api_docs/kbn_management_settings_types.mdx
+++ b/api_docs/kbn_management_settings_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types
title: "@kbn/management-settings-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types']
---
import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json';
diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx
index 0e04e1480d4b1..e7407446f348e 100644
--- a/api_docs/kbn_management_settings_utilities.mdx
+++ b/api_docs/kbn_management_settings_utilities.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities
title: "@kbn/management-settings-utilities"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-utilities plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities']
---
import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json';
diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx
index 2198345472c4b..416b78095c297 100644
--- a/api_docs/kbn_management_storybook_config.mdx
+++ b/api_docs/kbn_management_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config
title: "@kbn/management-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-storybook-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config']
---
import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx
index 07e296b86e9de..3257f7b33a841 100644
--- a/api_docs/kbn_mapbox_gl.mdx
+++ b/api_docs/kbn_mapbox_gl.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl
title: "@kbn/mapbox-gl"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/mapbox-gl plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl']
---
import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json';
diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx
index 7c38534e2b476..d153e5180f408 100644
--- a/api_docs/kbn_maps_vector_tile_utils.mdx
+++ b/api_docs/kbn_maps_vector_tile_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils
title: "@kbn/maps-vector-tile-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/maps-vector-tile-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils']
---
import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx
index 7eba069013be2..d79b2b25cf817 100644
--- a/api_docs/kbn_ml_agg_utils.mdx
+++ b/api_docs/kbn_ml_agg_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils
title: "@kbn/ml-agg-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-agg-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils']
---
import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx
index 4a19d09c3efca..afdea3fb155b5 100644
--- a/api_docs/kbn_ml_anomaly_utils.mdx
+++ b/api_docs/kbn_ml_anomaly_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils
title: "@kbn/ml-anomaly-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-anomaly-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils']
---
import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx
index c0c5f9ac53c88..3544adf2fd455 100644
--- a/api_docs/kbn_ml_cancellable_search.mdx
+++ b/api_docs/kbn_ml_cancellable_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search
title: "@kbn/ml-cancellable-search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-cancellable-search plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search']
---
import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json';
diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx
index f3c466d5d6d2c..a90ce9462477d 100644
--- a/api_docs/kbn_ml_category_validator.mdx
+++ b/api_docs/kbn_ml_category_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator
title: "@kbn/ml-category-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-category-validator plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator']
---
import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json';
diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx
index d907a7e6fe692..f110682ad006c 100644
--- a/api_docs/kbn_ml_chi2test.mdx
+++ b/api_docs/kbn_ml_chi2test.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test
title: "@kbn/ml-chi2test"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-chi2test plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test']
---
import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json';
diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
index 36b2638a87bf2..2fe73be5d159a 100644
--- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx
+++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils
title: "@kbn/ml-data-frame-analytics-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-frame-analytics-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils']
---
import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx
index 9d995f1c03e9f..4f942927bbef3 100644
--- a/api_docs/kbn_ml_data_grid.mdx
+++ b/api_docs/kbn_ml_data_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid
title: "@kbn/ml-data-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-grid plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid']
---
import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json';
diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx
index fa1a2a4b7cde2..961d114abd911 100644
--- a/api_docs/kbn_ml_date_picker.mdx
+++ b/api_docs/kbn_ml_date_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker
title: "@kbn/ml-date-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-picker plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker']
---
import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json';
diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx
index 83df316c4f5bb..33e0bc1be1e9b 100644
--- a/api_docs/kbn_ml_date_utils.mdx
+++ b/api_docs/kbn_ml_date_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils
title: "@kbn/ml-date-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils']
---
import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx
index 3b67e26891a27..d0a9aaaad49ca 100644
--- a/api_docs/kbn_ml_error_utils.mdx
+++ b/api_docs/kbn_ml_error_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils
title: "@kbn/ml-error-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-error-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils']
---
import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx
index ae4820e64aaf4..6ce5cfc9d18e4 100644
--- a/api_docs/kbn_ml_in_memory_table.mdx
+++ b/api_docs/kbn_ml_in_memory_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table
title: "@kbn/ml-in-memory-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-in-memory-table plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table']
---
import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json';
diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx
index 0be1fd3a86799..55324c9a47279 100644
--- a/api_docs/kbn_ml_is_defined.mdx
+++ b/api_docs/kbn_ml_is_defined.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined
title: "@kbn/ml-is-defined"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-defined plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined']
---
import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json';
diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx
index caaee52ecbe5e..3ccdafee6cd1b 100644
--- a/api_docs/kbn_ml_is_populated_object.mdx
+++ b/api_docs/kbn_ml_is_populated_object.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object
title: "@kbn/ml-is-populated-object"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-populated-object plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object']
---
import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json';
diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx
index 610e4cfe322f7..b57b0e60c258d 100644
--- a/api_docs/kbn_ml_kibana_theme.mdx
+++ b/api_docs/kbn_ml_kibana_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme
title: "@kbn/ml-kibana-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-kibana-theme plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme']
---
import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json';
diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx
index 70fefcf97ea3d..ea5d63ace1ad0 100644
--- a/api_docs/kbn_ml_local_storage.mdx
+++ b/api_docs/kbn_ml_local_storage.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage
title: "@kbn/ml-local-storage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-local-storage plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage']
---
import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json';
diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx
index f1c48211d33db..ceb4129264fb9 100644
--- a/api_docs/kbn_ml_nested_property.mdx
+++ b/api_docs/kbn_ml_nested_property.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property
title: "@kbn/ml-nested-property"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-nested-property plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property']
---
import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json';
diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx
index a6576a39a5201..f85437c7b9603 100644
--- a/api_docs/kbn_ml_number_utils.mdx
+++ b/api_docs/kbn_ml_number_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils
title: "@kbn/ml-number-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-number-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils']
---
import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx
index 8bf32d294ce64..802f8771d0eca 100644
--- a/api_docs/kbn_ml_query_utils.mdx
+++ b/api_docs/kbn_ml_query_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils
title: "@kbn/ml-query-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-query-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils']
---
import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx
index 4bc6e1997bf5a..3cedb6813fc24 100644
--- a/api_docs/kbn_ml_random_sampler_utils.mdx
+++ b/api_docs/kbn_ml_random_sampler_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils
title: "@kbn/ml-random-sampler-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-random-sampler-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils']
---
import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx
index 2e551653edd48..88d561303257c 100644
--- a/api_docs/kbn_ml_route_utils.mdx
+++ b/api_docs/kbn_ml_route_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils
title: "@kbn/ml-route-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-route-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils']
---
import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx
index d35edfb945af5..0ad1e1c9bc595 100644
--- a/api_docs/kbn_ml_runtime_field_utils.mdx
+++ b/api_docs/kbn_ml_runtime_field_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils
title: "@kbn/ml-runtime-field-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-runtime-field-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils']
---
import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx
index c8aec49e6e075..1841f3cbd924d 100644
--- a/api_docs/kbn_ml_string_hash.mdx
+++ b/api_docs/kbn_ml_string_hash.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash
title: "@kbn/ml-string-hash"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-string-hash plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash']
---
import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json';
diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx
index 640889e5735c4..d41cf9a3754d2 100644
--- a/api_docs/kbn_ml_time_buckets.mdx
+++ b/api_docs/kbn_ml_time_buckets.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets
title: "@kbn/ml-time-buckets"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-time-buckets plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets']
---
import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json';
diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx
index a4fb8b2229ed4..b2190a02d6998 100644
--- a/api_docs/kbn_ml_trained_models_utils.mdx
+++ b/api_docs/kbn_ml_trained_models_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils
title: "@kbn/ml-trained-models-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-trained-models-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils']
---
import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx
index 01772aa46a07c..cd8a27e6a13fa 100644
--- a/api_docs/kbn_ml_ui_actions.mdx
+++ b/api_docs/kbn_ml_ui_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions
title: "@kbn/ml-ui-actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-ui-actions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions']
---
import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json';
diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx
index 5021c91ee4bf1..53daec43d0de5 100644
--- a/api_docs/kbn_ml_url_state.mdx
+++ b/api_docs/kbn_ml_url_state.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state
title: "@kbn/ml-url-state"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-url-state plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state']
---
import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json';
diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx
index f71ca87a7a4ae..3ac8724212c4d 100644
--- a/api_docs/kbn_mock_idp_utils.mdx
+++ b/api_docs/kbn_mock_idp_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils
title: "@kbn/mock-idp-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/mock-idp-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils']
---
import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json';
diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx
index 5f6a285c3e3fa..dc526a833aa84 100644
--- a/api_docs/kbn_monaco.mdx
+++ b/api_docs/kbn_monaco.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco
title: "@kbn/monaco"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/monaco plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco']
---
import kbnMonacoObj from './kbn_monaco.devdocs.json';
diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx
index 7df08a843f52d..170ac463081ef 100644
--- a/api_docs/kbn_object_versioning.mdx
+++ b/api_docs/kbn_object_versioning.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning
title: "@kbn/object-versioning"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/object-versioning plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning']
---
import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json';
diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx
index 24fdd4abbbfd9..2252db0c70069 100644
--- a/api_docs/kbn_observability_alert_details.mdx
+++ b/api_docs/kbn_observability_alert_details.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details
title: "@kbn/observability-alert-details"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-alert-details plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details']
---
import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json';
diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx
index e3ae4c5318f7f..62787b05194fe 100644
--- a/api_docs/kbn_observability_alerting_test_data.mdx
+++ b/api_docs/kbn_observability_alerting_test_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data
title: "@kbn/observability-alerting-test-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-alerting-test-data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data']
---
import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json';
diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
index fa5d08d135c0e..50aad51ed4c49 100644
--- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
+++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util
title: "@kbn/observability-get-padded-alert-time-range-util"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util']
---
import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json';
diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx
index a5eac2acc3884..09b41b8b85d85 100644
--- a/api_docs/kbn_openapi_bundler.mdx
+++ b/api_docs/kbn_openapi_bundler.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler
title: "@kbn/openapi-bundler"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/openapi-bundler plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler']
---
import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json';
diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx
index f6bea9f83ca8e..d50914bb09e8d 100644
--- a/api_docs/kbn_openapi_generator.mdx
+++ b/api_docs/kbn_openapi_generator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator
title: "@kbn/openapi-generator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/openapi-generator plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator']
---
import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json';
diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx
index 704979afc4a71..ad16f66198712 100644
--- a/api_docs/kbn_optimizer.mdx
+++ b/api_docs/kbn_optimizer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer
title: "@kbn/optimizer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer']
---
import kbnOptimizerObj from './kbn_optimizer.devdocs.json';
diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx
index 120250aac9a0b..b63f19fc83981 100644
--- a/api_docs/kbn_optimizer_webpack_helpers.mdx
+++ b/api_docs/kbn_optimizer_webpack_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers
title: "@kbn/optimizer-webpack-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer-webpack-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers']
---
import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json';
diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx
index 46c09b2a4b5a2..a2d3d1a3c4895 100644
--- a/api_docs/kbn_osquery_io_ts_types.mdx
+++ b/api_docs/kbn_osquery_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types
title: "@kbn/osquery-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/osquery-io-ts-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types']
---
import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json';
diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx
index 53588de2a14a7..22bdea0d5b08f 100644
--- a/api_docs/kbn_panel_loader.mdx
+++ b/api_docs/kbn_panel_loader.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader
title: "@kbn/panel-loader"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/panel-loader plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader']
---
import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json';
diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx
index 67379a7ed72b0..a40273499006c 100644
--- a/api_docs/kbn_performance_testing_dataset_extractor.mdx
+++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor
title: "@kbn/performance-testing-dataset-extractor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/performance-testing-dataset-extractor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor']
---
import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json';
diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx
index acea3780d532c..7418d6b3bdecf 100644
--- a/api_docs/kbn_plugin_check.mdx
+++ b/api_docs/kbn_plugin_check.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check
title: "@kbn/plugin-check"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-check plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check']
---
import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json';
diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx
index ca55595a840a1..b2ee69a7bec27 100644
--- a/api_docs/kbn_plugin_generator.mdx
+++ b/api_docs/kbn_plugin_generator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator
title: "@kbn/plugin-generator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-generator plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator']
---
import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json';
diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx
index 8972f7de27055..3514d0f1556ce 100644
--- a/api_docs/kbn_plugin_helpers.mdx
+++ b/api_docs/kbn_plugin_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers
title: "@kbn/plugin-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers']
---
import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json';
diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx
index 27f6c03869dd4..661b5dcff51e2 100644
--- a/api_docs/kbn_presentation_containers.mdx
+++ b/api_docs/kbn_presentation_containers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers
title: "@kbn/presentation-containers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/presentation-containers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers']
---
import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json';
diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx
index 2e6071bac78e9..4f4d4dbc1782f 100644
--- a/api_docs/kbn_presentation_publishing.mdx
+++ b/api_docs/kbn_presentation_publishing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing
title: "@kbn/presentation-publishing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/presentation-publishing plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing']
---
import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json';
diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx
index 7026ead4b7c8c..e790fc39705fb 100644
--- a/api_docs/kbn_profiling_utils.mdx
+++ b/api_docs/kbn_profiling_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils
title: "@kbn/profiling-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/profiling-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils']
---
import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json';
diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx
index 0363a385cf7b1..7e0d2c0b0c592 100644
--- a/api_docs/kbn_random_sampling.mdx
+++ b/api_docs/kbn_random_sampling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling
title: "@kbn/random-sampling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/random-sampling plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling']
---
import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json';
diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx
index a99dad3cda390..85130fa423398 100644
--- a/api_docs/kbn_react_field.mdx
+++ b/api_docs/kbn_react_field.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field
title: "@kbn/react-field"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-field plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field']
---
import kbnReactFieldObj from './kbn_react_field.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx
index 05f498fae1e58..bbc78e668fc61 100644
--- a/api_docs/kbn_react_kibana_context_common.mdx
+++ b/api_docs/kbn_react_kibana_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common
title: "@kbn/react-kibana-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common']
---
import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx
index 2fcc8b2fa5737..6718701b33c9e 100644
--- a/api_docs/kbn_react_kibana_context_render.mdx
+++ b/api_docs/kbn_react_kibana_context_render.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render
title: "@kbn/react-kibana-context-render"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-render plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render']
---
import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx
index 9ce7dc7b7d85d..f398ec9013544 100644
--- a/api_docs/kbn_react_kibana_context_root.mdx
+++ b/api_docs/kbn_react_kibana_context_root.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root
title: "@kbn/react-kibana-context-root"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-root plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root']
---
import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx
index 477fce4a8f6d0..31649d75be30b 100644
--- a/api_docs/kbn_react_kibana_context_styled.mdx
+++ b/api_docs/kbn_react_kibana_context_styled.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled
title: "@kbn/react-kibana-context-styled"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-styled plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled']
---
import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx
index 574df4c77cb79..04b9664fa445c 100644
--- a/api_docs/kbn_react_kibana_context_theme.mdx
+++ b/api_docs/kbn_react_kibana_context_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme
title: "@kbn/react-kibana-context-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-theme plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme']
---
import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx
index 49416d988ecca..24416d7474f13 100644
--- a/api_docs/kbn_react_kibana_mount.mdx
+++ b/api_docs/kbn_react_kibana_mount.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount
title: "@kbn/react-kibana-mount"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-mount plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount']
---
import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json';
diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx
index 5b5f6ecbae873..ebd71ace440bf 100644
--- a/api_docs/kbn_repo_file_maps.mdx
+++ b/api_docs/kbn_repo_file_maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps
title: "@kbn/repo-file-maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-file-maps plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps']
---
import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json';
diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx
index 91767bfaf5b0e..8284e418530d5 100644
--- a/api_docs/kbn_repo_linter.mdx
+++ b/api_docs/kbn_repo_linter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter
title: "@kbn/repo-linter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-linter plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter']
---
import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json';
diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx
index 2187d7bf0d58d..d91c7ba39bff9 100644
--- a/api_docs/kbn_repo_path.mdx
+++ b/api_docs/kbn_repo_path.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path
title: "@kbn/repo-path"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-path plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path']
---
import kbnRepoPathObj from './kbn_repo_path.devdocs.json';
diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx
index 05906308ccb12..e52f522aa4955 100644
--- a/api_docs/kbn_repo_source_classifier.mdx
+++ b/api_docs/kbn_repo_source_classifier.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier
title: "@kbn/repo-source-classifier"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-source-classifier plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier']
---
import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json';
diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx
index 44dfcd3bccac2..21350a2f4ec50 100644
--- a/api_docs/kbn_reporting_common.mdx
+++ b/api_docs/kbn_reporting_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common
title: "@kbn/reporting-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common']
---
import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx
index 00d6700c162f6..db334115dd640 100644
--- a/api_docs/kbn_reporting_csv_share_panel.mdx
+++ b/api_docs/kbn_reporting_csv_share_panel.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel
title: "@kbn/reporting-csv-share-panel"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-csv-share-panel plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel']
---
import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx
index a493b26d847f0..f646136f3d493 100644
--- a/api_docs/kbn_reporting_export_types_csv.mdx
+++ b/api_docs/kbn_reporting_export_types_csv.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv
title: "@kbn/reporting-export-types-csv"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-csv plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv']
---
import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx
index 934bde7da0d82..6d2b54679edea 100644
--- a/api_docs/kbn_reporting_export_types_csv_common.mdx
+++ b/api_docs/kbn_reporting_export_types_csv_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common
title: "@kbn/reporting-export-types-csv-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-csv-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common']
---
import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx
index 34e2fc33bc059..280e16ce27497 100644
--- a/api_docs/kbn_reporting_export_types_pdf.mdx
+++ b/api_docs/kbn_reporting_export_types_pdf.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf
title: "@kbn/reporting-export-types-pdf"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-pdf plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf']
---
import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx
index 37a7a05b963d1..c0dc57141f65e 100644
--- a/api_docs/kbn_reporting_export_types_pdf_common.mdx
+++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common
title: "@kbn/reporting-export-types-pdf-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-pdf-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common']
---
import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx
index 9abfeaf8f94c4..b349c8be19966 100644
--- a/api_docs/kbn_reporting_export_types_png.mdx
+++ b/api_docs/kbn_reporting_export_types_png.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png
title: "@kbn/reporting-export-types-png"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-png plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png']
---
import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx
index ee085779e6fd5..8fa06e7ca4177 100644
--- a/api_docs/kbn_reporting_export_types_png_common.mdx
+++ b/api_docs/kbn_reporting_export_types_png_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common
title: "@kbn/reporting-export-types-png-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-png-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common']
---
import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx
index 1dce4e400fb3f..5d1f5cf9bbd29 100644
--- a/api_docs/kbn_reporting_mocks_server.mdx
+++ b/api_docs/kbn_reporting_mocks_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server
title: "@kbn/reporting-mocks-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-mocks-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server']
---
import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json';
diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx
index b522c0dd349e1..614c8c02953be 100644
--- a/api_docs/kbn_reporting_public.mdx
+++ b/api_docs/kbn_reporting_public.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public
title: "@kbn/reporting-public"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-public plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public']
---
import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json';
diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx
index 9f15f082f3b3e..6b8173fcfdc6f 100644
--- a/api_docs/kbn_reporting_server.mdx
+++ b/api_docs/kbn_reporting_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server
title: "@kbn/reporting-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server']
---
import kbnReportingServerObj from './kbn_reporting_server.devdocs.json';
diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx
index 58f055d237c67..e6745d785eb15 100644
--- a/api_docs/kbn_resizable_layout.mdx
+++ b/api_docs/kbn_resizable_layout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout
title: "@kbn/resizable-layout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/resizable-layout plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout']
---
import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json';
diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx
index 5a4723b26c30e..f8b1fb95a236a 100644
--- a/api_docs/kbn_rison.mdx
+++ b/api_docs/kbn_rison.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison
title: "@kbn/rison"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rison plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison']
---
import kbnRisonObj from './kbn_rison.devdocs.json';
diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx
index 39f466d6d1bad..1ac34e2206da1 100644
--- a/api_docs/kbn_router_to_openapispec.mdx
+++ b/api_docs/kbn_router_to_openapispec.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec
title: "@kbn/router-to-openapispec"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/router-to-openapispec plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec']
---
import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json';
diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx
index d308921e35a79..a2dd584c4bfaf 100644
--- a/api_docs/kbn_router_utils.mdx
+++ b/api_docs/kbn_router_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils
title: "@kbn/router-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/router-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils']
---
import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json';
diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx
index b8affccb78323..9d781d3881290 100644
--- a/api_docs/kbn_rrule.mdx
+++ b/api_docs/kbn_rrule.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule
title: "@kbn/rrule"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rrule plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule']
---
import kbnRruleObj from './kbn_rrule.devdocs.json';
diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx
index 2f4722b7c53d2..3d0a282f6369c 100644
--- a/api_docs/kbn_rule_data_utils.mdx
+++ b/api_docs/kbn_rule_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils
title: "@kbn/rule-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rule-data-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils']
---
import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json';
diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx
index 0da4142fce3ba..b48c1ea97dbb9 100644
--- a/api_docs/kbn_saved_objects_settings.mdx
+++ b/api_docs/kbn_saved_objects_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings
title: "@kbn/saved-objects-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/saved-objects-settings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings']
---
import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json';
diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx
index 610be06e525d2..bdfd4c0518376 100644
--- a/api_docs/kbn_search_api_panels.mdx
+++ b/api_docs/kbn_search_api_panels.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels
title: "@kbn/search-api-panels"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-api-panels plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels']
---
import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json';
diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx
index 10f24af23aa94..2bd098cc95d0c 100644
--- a/api_docs/kbn_search_connectors.mdx
+++ b/api_docs/kbn_search_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors
title: "@kbn/search-connectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-connectors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors']
---
import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json';
diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx
index 6e2fe30c50db9..203faba8a4f66 100644
--- a/api_docs/kbn_search_errors.mdx
+++ b/api_docs/kbn_search_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors
title: "@kbn/search-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-errors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors']
---
import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json';
diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx
index fdbf74e35f801..36070f154c148 100644
--- a/api_docs/kbn_search_index_documents.mdx
+++ b/api_docs/kbn_search_index_documents.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents
title: "@kbn/search-index-documents"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-index-documents plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents']
---
import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json';
diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx
index b297c9363607e..f3d95afeea1f9 100644
--- a/api_docs/kbn_search_response_warnings.mdx
+++ b/api_docs/kbn_search_response_warnings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings
title: "@kbn/search-response-warnings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-response-warnings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings']
---
import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json';
diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx
index cb15e584cccc7..15ec4e90fd12c 100644
--- a/api_docs/kbn_security_hardening.mdx
+++ b/api_docs/kbn_security_hardening.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening
title: "@kbn/security-hardening"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-hardening plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening']
---
import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx
index d560a5a72c214..388ba057ac16b 100644
--- a/api_docs/kbn_security_plugin_types_common.mdx
+++ b/api_docs/kbn_security_plugin_types_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common
title: "@kbn/security-plugin-types-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-common plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common']
---
import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx
index 3902690ecee79..0e7a4ed615c94 100644
--- a/api_docs/kbn_security_plugin_types_public.mdx
+++ b/api_docs/kbn_security_plugin_types_public.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public
title: "@kbn/security-plugin-types-public"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-public plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public']
---
import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx
index 015db0d76cf77..0f4a4baa9e5c3 100644
--- a/api_docs/kbn_security_plugin_types_server.mdx
+++ b/api_docs/kbn_security_plugin_types_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server
title: "@kbn/security-plugin-types-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-server plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server']
---
import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json';
diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx
index f12e9b6201a82..826f884424a36 100644
--- a/api_docs/kbn_security_solution_features.mdx
+++ b/api_docs/kbn_security_solution_features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features
title: "@kbn/security-solution-features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-features plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features']
---
import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json';
diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx
index 1934efbf8b922..ca62f797cc067 100644
--- a/api_docs/kbn_security_solution_navigation.mdx
+++ b/api_docs/kbn_security_solution_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation
title: "@kbn/security-solution-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-navigation plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation']
---
import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json';
diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx
index e5d1e1bc01aa8..8c363ca19171e 100644
--- a/api_docs/kbn_security_solution_side_nav.mdx
+++ b/api_docs/kbn_security_solution_side_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav
title: "@kbn/security-solution-side-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-side-nav plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav']
---
import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json';
diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx
index c1c9536cd085a..a0bc3eef0123f 100644
--- a/api_docs/kbn_security_solution_storybook_config.mdx
+++ b/api_docs/kbn_security_solution_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config
title: "@kbn/security-solution-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-storybook-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config']
---
import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx
index f0e9d19742ee0..8690f820548b0 100644
--- a/api_docs/kbn_securitysolution_autocomplete.mdx
+++ b/api_docs/kbn_securitysolution_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete
title: "@kbn/securitysolution-autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-autocomplete plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete']
---
import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx
index 9789427b1fa13..05be1ac6b4431 100644
--- a/api_docs/kbn_securitysolution_data_table.mdx
+++ b/api_docs/kbn_securitysolution_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table
title: "@kbn/securitysolution-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-data-table plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table']
---
import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx
index be82e2fcf849f..a66b1e398fc4e 100644
--- a/api_docs/kbn_securitysolution_ecs.mdx
+++ b/api_docs/kbn_securitysolution_ecs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs
title: "@kbn/securitysolution-ecs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-ecs plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs']
---
import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx
index d2fa8c47fb108..b9ce0c7cfb874 100644
--- a/api_docs/kbn_securitysolution_es_utils.mdx
+++ b/api_docs/kbn_securitysolution_es_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils
title: "@kbn/securitysolution-es-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-es-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils']
---
import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx
index e70deaee8bd2f..568f8aa841d36 100644
--- a/api_docs/kbn_securitysolution_exception_list_components.mdx
+++ b/api_docs/kbn_securitysolution_exception_list_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components
title: "@kbn/securitysolution-exception-list-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-exception-list-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components']
---
import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx
index 619bf18ba6c91..54d8ce79da466 100644
--- a/api_docs/kbn_securitysolution_grouping.mdx
+++ b/api_docs/kbn_securitysolution_grouping.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping
title: "@kbn/securitysolution-grouping"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-grouping plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping']
---
import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx
index 042bc7346f77f..6ba9ad3d78d96 100644
--- a/api_docs/kbn_securitysolution_hook_utils.mdx
+++ b/api_docs/kbn_securitysolution_hook_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils
title: "@kbn/securitysolution-hook-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-hook-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils']
---
import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
index e3e8197f00bdf..5b4ea9e66cfd3 100644
--- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types
title: "@kbn/securitysolution-io-ts-alerting-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types']
---
import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx
index adf6979899b83..fa788c120c1d2 100644
--- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types
title: "@kbn/securitysolution-io-ts-list-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-list-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types']
---
import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx
index 51f1a13b2e208..e50f718991799 100644
--- a/api_docs/kbn_securitysolution_io_ts_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types
title: "@kbn/securitysolution-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types']
---
import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx
index 9255ff74f00c7..5dc6a8ca5ad6c 100644
--- a/api_docs/kbn_securitysolution_io_ts_utils.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils
title: "@kbn/securitysolution-io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils']
---
import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx
index a319386b18fc8..f4bbaaca6deb7 100644
--- a/api_docs/kbn_securitysolution_list_api.mdx
+++ b/api_docs/kbn_securitysolution_list_api.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api
title: "@kbn/securitysolution-list-api"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-api plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api']
---
import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx
index 498cebabac5ab..03d33ea6c0576 100644
--- a/api_docs/kbn_securitysolution_list_constants.mdx
+++ b/api_docs/kbn_securitysolution_list_constants.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants
title: "@kbn/securitysolution-list-constants"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-constants plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants']
---
import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx
index d092a903a5f88..8b741b452ad6a 100644
--- a/api_docs/kbn_securitysolution_list_hooks.mdx
+++ b/api_docs/kbn_securitysolution_list_hooks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks
title: "@kbn/securitysolution-list-hooks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-hooks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks']
---
import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx
index fe7989a71f56c..e114208a3cf68 100644
--- a/api_docs/kbn_securitysolution_list_utils.mdx
+++ b/api_docs/kbn_securitysolution_list_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils
title: "@kbn/securitysolution-list-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils']
---
import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx
index a2dfb8db6b81f..9dd927b8e2c55 100644
--- a/api_docs/kbn_securitysolution_rules.mdx
+++ b/api_docs/kbn_securitysolution_rules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules
title: "@kbn/securitysolution-rules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-rules plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules']
---
import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx
index a286558d1ecf7..a6a6311baac5d 100644
--- a/api_docs/kbn_securitysolution_t_grid.mdx
+++ b/api_docs/kbn_securitysolution_t_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid
title: "@kbn/securitysolution-t-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-t-grid plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid']
---
import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx
index 1b7adda85adc3..646fc85dcc516 100644
--- a/api_docs/kbn_securitysolution_utils.mdx
+++ b/api_docs/kbn_securitysolution_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils
title: "@kbn/securitysolution-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils']
---
import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json';
diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx
index 0f089b83cd549..7de2e8d0bf5d6 100644
--- a/api_docs/kbn_server_http_tools.mdx
+++ b/api_docs/kbn_server_http_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools
title: "@kbn/server-http-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-http-tools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools']
---
import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json';
diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx
index 3f2d3d273b8b7..f21bec0400267 100644
--- a/api_docs/kbn_server_route_repository.mdx
+++ b/api_docs/kbn_server_route_repository.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository
title: "@kbn/server-route-repository"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-route-repository plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository']
---
import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json';
diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx
index a93fc36b133ac..df6867453dfd2 100644
--- a/api_docs/kbn_serverless_common_settings.mdx
+++ b/api_docs/kbn_serverless_common_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings
title: "@kbn/serverless-common-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-common-settings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings']
---
import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx
index 21a711a48a4fd..c52f5d08f5d22 100644
--- a/api_docs/kbn_serverless_observability_settings.mdx
+++ b/api_docs/kbn_serverless_observability_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings
title: "@kbn/serverless-observability-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-observability-settings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings']
---
import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx
index 9d4c1be6afabc..f6165ecf7b45e 100644
--- a/api_docs/kbn_serverless_project_switcher.mdx
+++ b/api_docs/kbn_serverless_project_switcher.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher
title: "@kbn/serverless-project-switcher"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-project-switcher plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher']
---
import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json';
diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx
index d48f4578bc9dc..92c144e10f0eb 100644
--- a/api_docs/kbn_serverless_search_settings.mdx
+++ b/api_docs/kbn_serverless_search_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings
title: "@kbn/serverless-search-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-search-settings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings']
---
import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx
index 6eab7a77525f0..a6efc395eab0b 100644
--- a/api_docs/kbn_serverless_security_settings.mdx
+++ b/api_docs/kbn_serverless_security_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings
title: "@kbn/serverless-security-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-security-settings plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings']
---
import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx
index 2f1713c2b52d6..0f80d4c7777f6 100644
--- a/api_docs/kbn_serverless_storybook_config.mdx
+++ b/api_docs/kbn_serverless_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config
title: "@kbn/serverless-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-storybook-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config']
---
import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx
index d481dc532bcbc..30eceaf6319fa 100644
--- a/api_docs/kbn_shared_svg.mdx
+++ b/api_docs/kbn_shared_svg.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg
title: "@kbn/shared-svg"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-svg plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg']
---
import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx
index 2dc9cf7cb8fa0..980da6c5b7640 100644
--- a/api_docs/kbn_shared_ux_avatar_solution.mdx
+++ b/api_docs/kbn_shared_ux_avatar_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution
title: "@kbn/shared-ux-avatar-solution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-avatar-solution plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution']
---
import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
index eeb8477238ea0..200ffc30a4f8c 100644
--- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
+++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen
title: "@kbn/shared-ux-button-exit-full-screen"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen']
---
import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx
index 0a424efd61d8a..5b25f0ae1f668 100644
--- a/api_docs/kbn_shared_ux_button_toolbar.mdx
+++ b/api_docs/kbn_shared_ux_button_toolbar.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar
title: "@kbn/shared-ux-button-toolbar"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-toolbar plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar']
---
import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx
index 0abb26d7e00ca..d5f7bfc4c0665 100644
--- a/api_docs/kbn_shared_ux_card_no_data.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data
title: "@kbn/shared-ux-card-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data']
---
import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
index 2e772ecba2d68..4856c9984b94b 100644
--- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks
title: "@kbn/shared-ux-card-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks']
---
import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx
index 41ea86a8f0094..1d322fe65e72f 100644
--- a/api_docs/kbn_shared_ux_chrome_navigation.mdx
+++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation
title: "@kbn/shared-ux-chrome-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-chrome-navigation plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation']
---
import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx
index ec243de7e47b9..995525179de5d 100644
--- a/api_docs/kbn_shared_ux_error_boundary.mdx
+++ b/api_docs/kbn_shared_ux_error_boundary.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary
title: "@kbn/shared-ux-error-boundary"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-error-boundary plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary']
---
import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx
index 92b8a2a3600da..80ba71f574725 100644
--- a/api_docs/kbn_shared_ux_file_context.mdx
+++ b/api_docs/kbn_shared_ux_file_context.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context
title: "@kbn/shared-ux-file-context"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-context plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context']
---
import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx
index 31107113b8ba4..1c61558053801 100644
--- a/api_docs/kbn_shared_ux_file_image.mdx
+++ b/api_docs/kbn_shared_ux_file_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image
title: "@kbn/shared-ux-file-image"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image']
---
import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx
index b5c2b857db2e6..187d49dbf558f 100644
--- a/api_docs/kbn_shared_ux_file_image_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks
title: "@kbn/shared-ux-file-image-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks']
---
import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx
index fadefd7703b9e..97ae9f724bcb1 100644
--- a/api_docs/kbn_shared_ux_file_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks
title: "@kbn/shared-ux-file-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks']
---
import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx
index 8d5b208e2953b..a13cb87ed598e 100644
--- a/api_docs/kbn_shared_ux_file_picker.mdx
+++ b/api_docs/kbn_shared_ux_file_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker
title: "@kbn/shared-ux-file-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-picker plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker']
---
import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx
index 093b46648d30d..368eecd6285e8 100644
--- a/api_docs/kbn_shared_ux_file_types.mdx
+++ b/api_docs/kbn_shared_ux_file_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types
title: "@kbn/shared-ux-file-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types']
---
import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx
index 4a0988334c25d..e60c59f3ad72c 100644
--- a/api_docs/kbn_shared_ux_file_upload.mdx
+++ b/api_docs/kbn_shared_ux_file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload
title: "@kbn/shared-ux-file-upload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-upload plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload']
---
import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx
index a1d54e659240f..519b67c25e4c3 100644
--- a/api_docs/kbn_shared_ux_file_util.mdx
+++ b/api_docs/kbn_shared_ux_file_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util
title: "@kbn/shared-ux-file-util"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-util plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util']
---
import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx
index 53c138a5c29aa..e083e00adfa74 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app
title: "@kbn/shared-ux-link-redirect-app"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app']
---
import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
index 6bc6b7502c5e5..12847b693ed15 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks
title: "@kbn/shared-ux-link-redirect-app-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks']
---
import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx
index 19c5726115850..d4fa3b798924f 100644
--- a/api_docs/kbn_shared_ux_markdown.mdx
+++ b/api_docs/kbn_shared_ux_markdown.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown
title: "@kbn/shared-ux-markdown"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown']
---
import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx
index 61d4c4c56fe25..cb5b61f759cd3 100644
--- a/api_docs/kbn_shared_ux_markdown_mocks.mdx
+++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks
title: "@kbn/shared-ux-markdown-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks']
---
import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
index f439d4def7389..0bb46278a69be 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data
title: "@kbn/shared-ux-page-analytics-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data']
---
import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
index e669350239e56..85a943301b7ec 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks
title: "@kbn/shared-ux-page-analytics-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks']
---
import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
index 0df296db05512..1d9fab180d78f 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data
title: "@kbn/shared-ux-page-kibana-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data']
---
import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
index bdb66a1ac2a3d..f5145d8702291 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks
title: "@kbn/shared-ux-page-kibana-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks']
---
import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx
index 574be1d628f26..8d2e8b6f4e2c4 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template
title: "@kbn/shared-ux-page-kibana-template"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template']
---
import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
index e3dde582db15d..db0472879de68 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks
title: "@kbn/shared-ux-page-kibana-template-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks']
---
import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx
index 9f5f6afdee546..35c2111fc3a93 100644
--- a/api_docs/kbn_shared_ux_page_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data
title: "@kbn/shared-ux-page-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data']
---
import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx
index 2b6a00cb60cbe..773ab1f17ba30 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config
title: "@kbn/shared-ux-page-no-data-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config']
---
import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
index 7aec7a4789802..1e82b53a37c4b 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks
title: "@kbn/shared-ux-page-no-data-config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks']
---
import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
index dade6f6378804..4d999f4026ad3 100644
--- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks
title: "@kbn/shared-ux-page-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks']
---
import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx
index 50f0cabc21839..997d23cb52f3d 100644
--- a/api_docs/kbn_shared_ux_page_solution_nav.mdx
+++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav
title: "@kbn/shared-ux-page-solution-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-solution-nav plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav']
---
import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
index 41491dd310e16..53510078c841d 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views
title: "@kbn/shared-ux-prompt-no-data-views"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views']
---
import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
index d3ad855385093..70b028078d06f 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks
title: "@kbn/shared-ux-prompt-no-data-views-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks']
---
import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx
index c17f96045a05c..84fa04865477a 100644
--- a/api_docs/kbn_shared_ux_prompt_not_found.mdx
+++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found
title: "@kbn/shared-ux-prompt-not-found"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-not-found plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found']
---
import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx
index 03245ec404011..3217ebd50b66c 100644
--- a/api_docs/kbn_shared_ux_router.mdx
+++ b/api_docs/kbn_shared_ux_router.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router
title: "@kbn/shared-ux-router"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router']
---
import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx
index bb7121dc2e800..fef28daed9e7e 100644
--- a/api_docs/kbn_shared_ux_router_mocks.mdx
+++ b/api_docs/kbn_shared_ux_router_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks
title: "@kbn/shared-ux-router-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router-mocks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks']
---
import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx
index db97930270f67..1c85c7df350d1 100644
--- a/api_docs/kbn_shared_ux_storybook_config.mdx
+++ b/api_docs/kbn_shared_ux_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config
title: "@kbn/shared-ux-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config']
---
import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx
index b02a6ae171e91..07aaf3d1c0aaa 100644
--- a/api_docs/kbn_shared_ux_storybook_mock.mdx
+++ b/api_docs/kbn_shared_ux_storybook_mock.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock
title: "@kbn/shared-ux-storybook-mock"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-mock plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock']
---
import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx
index 7583549741a62..acc62ad844f10 100644
--- a/api_docs/kbn_shared_ux_tabbed_modal.mdx
+++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal
title: "@kbn/shared-ux-tabbed-modal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-tabbed-modal plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal']
---
import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx
index 98916b33d1e30..e07d03a05a6a2 100644
--- a/api_docs/kbn_shared_ux_utility.mdx
+++ b/api_docs/kbn_shared_ux_utility.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility
title: "@kbn/shared-ux-utility"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-utility plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility']
---
import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json';
diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx
index 7494c29634d1b..db9d8f9c28e6d 100644
--- a/api_docs/kbn_slo_schema.mdx
+++ b/api_docs/kbn_slo_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema
title: "@kbn/slo-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/slo-schema plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema']
---
import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json';
diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx
index d28ab17401e0c..7a328f5d4362e 100644
--- a/api_docs/kbn_solution_nav_es.mdx
+++ b/api_docs/kbn_solution_nav_es.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es
title: "@kbn/solution-nav-es"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/solution-nav-es plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es']
---
import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json';
diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx
index 1dbcba988e50c..4a849649ca053 100644
--- a/api_docs/kbn_solution_nav_oblt.mdx
+++ b/api_docs/kbn_solution_nav_oblt.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt
title: "@kbn/solution-nav-oblt"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/solution-nav-oblt plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt']
---
import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json';
diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx
index d06bd688e0c46..3aa7659f95db4 100644
--- a/api_docs/kbn_some_dev_log.mdx
+++ b/api_docs/kbn_some_dev_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log
title: "@kbn/some-dev-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/some-dev-log plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log']
---
import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json';
diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx
index 05586426c07b1..97039b49e6f21 100644
--- a/api_docs/kbn_sort_predicates.mdx
+++ b/api_docs/kbn_sort_predicates.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates
title: "@kbn/sort-predicates"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/sort-predicates plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates']
---
import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json';
diff --git a/api_docs/kbn_std.devdocs.json b/api_docs/kbn_std.devdocs.json
index 36202fda05a52..b92d1a21b2c29 100644
--- a/api_docs/kbn_std.devdocs.json
+++ b/api_docs/kbn_std.devdocs.json
@@ -934,6 +934,56 @@
"returnComment": [],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.isInternalURL",
+ "type": "Function",
+ "tags": [],
+ "label": "isInternalURL",
+ "description": [
+ "\nDetermine if url is outside of this Kibana install."
+ ],
+ "signature": [
+ "(url: string, basePath: string) => boolean | undefined"
+ ],
+ "path": "packages/kbn-std/src/is_internal_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.isInternalURL.$1",
+ "type": "string",
+ "tags": [],
+ "label": "url",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-std/src/is_internal_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ },
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.isInternalURL.$2",
+ "type": "string",
+ "tags": [],
+ "label": "basePath",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-std/src/is_internal_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": [],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/std",
"id": "def-common.isPromise",
@@ -1488,6 +1538,71 @@
],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.parseNextURL",
+ "type": "Function",
+ "tags": [],
+ "label": "parseNextURL",
+ "description": [
+ "\nParse the url value from query param. By default\n\nBy default query param is set to next."
+ ],
+ "signature": [
+ "(href: string, basePath: string, nextUrlQueryParam: string) => string"
+ ],
+ "path": "packages/kbn-std/src/parse_next_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.parseNextURL.$1",
+ "type": "string",
+ "tags": [],
+ "label": "href",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-std/src/parse_next_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ },
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.parseNextURL.$2",
+ "type": "string",
+ "tags": [],
+ "label": "basePath",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-std/src/parse_next_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ },
+ {
+ "parentPluginId": "@kbn/std",
+ "id": "def-common.parseNextURL.$3",
+ "type": "string",
+ "tags": [],
+ "label": "nextUrlQueryParam",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-std/src/parse_next_url.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": [],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/std",
"id": "def-common.pick",
diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx
index 278c2f4214ffa..0150a14b493fb 100644
--- a/api_docs/kbn_std.mdx
+++ b/api_docs/kbn_std.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std
title: "@kbn/std"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/std plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std']
---
import kbnStdObj from './kbn_std.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 104 | 2 | 67 | 1 |
+| 111 | 2 | 72 | 1 |
## Common
diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx
index 22704896e76f5..b392c95f0e0b5 100644
--- a/api_docs/kbn_stdio_dev_helpers.mdx
+++ b/api_docs/kbn_stdio_dev_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers
title: "@kbn/stdio-dev-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/stdio-dev-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers']
---
import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json';
diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx
index a878c659803db..e4172673c1429 100644
--- a/api_docs/kbn_storybook.mdx
+++ b/api_docs/kbn_storybook.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook
title: "@kbn/storybook"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/storybook plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook']
---
import kbnStorybookObj from './kbn_storybook.devdocs.json';
diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx
index 0b0595eb4e69c..a30b07b4aaae4 100644
--- a/api_docs/kbn_telemetry_tools.mdx
+++ b/api_docs/kbn_telemetry_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools
title: "@kbn/telemetry-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/telemetry-tools plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools']
---
import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json';
diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx
index 23a915044145b..2628adfd4f610 100644
--- a/api_docs/kbn_test.mdx
+++ b/api_docs/kbn_test.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test
title: "@kbn/test"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test']
---
import kbnTestObj from './kbn_test.devdocs.json';
diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx
index 7363703ff865a..ed347b9acf915 100644
--- a/api_docs/kbn_test_eui_helpers.mdx
+++ b/api_docs/kbn_test_eui_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers
title: "@kbn/test-eui-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-eui-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers']
---
import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json';
diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx
index 5bf78ac1cd341..2e8943ef227cb 100644
--- a/api_docs/kbn_test_jest_helpers.mdx
+++ b/api_docs/kbn_test_jest_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers
title: "@kbn/test-jest-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-jest-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers']
---
import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json';
diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx
index c7b47c42d0982..54d47c38a2be2 100644
--- a/api_docs/kbn_test_subj_selector.mdx
+++ b/api_docs/kbn_test_subj_selector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector
title: "@kbn/test-subj-selector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-subj-selector plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector']
---
import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json';
diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx
index b9d4bc060a018..ce8a421b147fb 100644
--- a/api_docs/kbn_text_based_editor.mdx
+++ b/api_docs/kbn_text_based_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor
title: "@kbn/text-based-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/text-based-editor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor']
---
import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json';
diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx
index 47ca67a882061..16c07b2ef8f54 100644
--- a/api_docs/kbn_timerange.mdx
+++ b/api_docs/kbn_timerange.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange
title: "@kbn/timerange"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/timerange plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange']
---
import kbnTimerangeObj from './kbn_timerange.devdocs.json';
diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx
index 16873a2da41bc..3f97f465b4de5 100644
--- a/api_docs/kbn_tooling_log.mdx
+++ b/api_docs/kbn_tooling_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log
title: "@kbn/tooling-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/tooling-log plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log']
---
import kbnToolingLogObj from './kbn_tooling_log.devdocs.json';
diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx
index 6ba884470e629..f7acef4bfb9c3 100644
--- a/api_docs/kbn_triggers_actions_ui_types.mdx
+++ b/api_docs/kbn_triggers_actions_ui_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types
title: "@kbn/triggers-actions-ui-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/triggers-actions-ui-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types']
---
import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json';
diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx
index 8303046f5c52d..2aef99077f008 100644
--- a/api_docs/kbn_ts_projects.mdx
+++ b/api_docs/kbn_ts_projects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects
title: "@kbn/ts-projects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ts-projects plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects']
---
import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json';
diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx
index e846e99c3d13c..815d2bfa36b62 100644
--- a/api_docs/kbn_typed_react_router_config.mdx
+++ b/api_docs/kbn_typed_react_router_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config
title: "@kbn/typed-react-router-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/typed-react-router-config plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config']
---
import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json';
diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx
index dfef32b93ec6f..bdde3ed98110a 100644
--- a/api_docs/kbn_ui_actions_browser.mdx
+++ b/api_docs/kbn_ui_actions_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser
title: "@kbn/ui-actions-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-actions-browser plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser']
---
import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json';
diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx
index f5c6d3e68d431..826e79e66fd25 100644
--- a/api_docs/kbn_ui_shared_deps_src.mdx
+++ b/api_docs/kbn_ui_shared_deps_src.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src
title: "@kbn/ui-shared-deps-src"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-shared-deps-src plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src']
---
import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json';
diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx
index b576daedba5f6..50d01084281f5 100644
--- a/api_docs/kbn_ui_theme.mdx
+++ b/api_docs/kbn_ui_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme
title: "@kbn/ui-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-theme plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme']
---
import kbnUiThemeObj from './kbn_ui_theme.devdocs.json';
diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx
index 2c5aafe995949..33160bce799d9 100644
--- a/api_docs/kbn_unified_data_table.mdx
+++ b/api_docs/kbn_unified_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table
title: "@kbn/unified-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-data-table plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table']
---
import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json';
diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx
index e0c2184d27d3c..e5d08401e8fea 100644
--- a/api_docs/kbn_unified_doc_viewer.mdx
+++ b/api_docs/kbn_unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer
title: "@kbn/unified-doc-viewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-doc-viewer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer']
---
import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json';
diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx
index 54a407485f2d2..5fcf1bfbb7db3 100644
--- a/api_docs/kbn_unified_field_list.mdx
+++ b/api_docs/kbn_unified_field_list.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list
title: "@kbn/unified-field-list"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-field-list plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list']
---
import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json';
diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx
index d43ff40d40728..e7c537ad9d76d 100644
--- a/api_docs/kbn_unsaved_changes_badge.mdx
+++ b/api_docs/kbn_unsaved_changes_badge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge
title: "@kbn/unsaved-changes-badge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unsaved-changes-badge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge']
---
import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json';
diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx
index 49821cd9d2721..0840d75eefc96 100644
--- a/api_docs/kbn_use_tracked_promise.mdx
+++ b/api_docs/kbn_use_tracked_promise.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise
title: "@kbn/use-tracked-promise"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/use-tracked-promise plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise']
---
import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json';
diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx
index b5d37df583564..ef07b749d9635 100644
--- a/api_docs/kbn_user_profile_components.mdx
+++ b/api_docs/kbn_user_profile_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components
title: "@kbn/user-profile-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/user-profile-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components']
---
import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json';
diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx
index e5fe640374e9f..ec53c936d3a26 100644
--- a/api_docs/kbn_utility_types.mdx
+++ b/api_docs/kbn_utility_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types
title: "@kbn/utility-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types']
---
import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json';
diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx
index 455ad7dde0094..bb0a2dd42b0a0 100644
--- a/api_docs/kbn_utility_types_jest.mdx
+++ b/api_docs/kbn_utility_types_jest.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest
title: "@kbn/utility-types-jest"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types-jest plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest']
---
import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json';
diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx
index 09b2ad7a21843..854d3ad9a45cf 100644
--- a/api_docs/kbn_utils.mdx
+++ b/api_docs/kbn_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils
title: "@kbn/utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils']
---
import kbnUtilsObj from './kbn_utils.devdocs.json';
diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx
index 78c9d31c96994..3bdf77b3414a8 100644
--- a/api_docs/kbn_visualization_ui_components.mdx
+++ b/api_docs/kbn_visualization_ui_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components
title: "@kbn/visualization-ui-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/visualization-ui-components plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components']
---
import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json';
diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx
index b37f0a3fd183f..6c996d9f087ed 100644
--- a/api_docs/kbn_visualization_utils.mdx
+++ b/api_docs/kbn_visualization_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils
title: "@kbn/visualization-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/visualization-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils']
---
import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json';
diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx
index 4192ef3e46450..1269823bde005 100644
--- a/api_docs/kbn_xstate_utils.mdx
+++ b/api_docs/kbn_xstate_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils
title: "@kbn/xstate-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/xstate-utils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils']
---
import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json';
diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx
index 52efc37489cc3..e69c51ef125a9 100644
--- a/api_docs/kbn_yarn_lock_validator.mdx
+++ b/api_docs/kbn_yarn_lock_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator
title: "@kbn/yarn-lock-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/yarn-lock-validator plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator']
---
import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json';
diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx
index 3508662be4ea5..2c8d6a7499eb1 100644
--- a/api_docs/kbn_zod_helpers.mdx
+++ b/api_docs/kbn_zod_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers
title: "@kbn/zod-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/zod-helpers plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers']
---
import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json';
diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx
index c4755dbb1014f..bad93d4b2797e 100644
--- a/api_docs/kibana_overview.mdx
+++ b/api_docs/kibana_overview.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview
title: "kibanaOverview"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaOverview plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview']
---
import kibanaOverviewObj from './kibana_overview.devdocs.json';
diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx
index 29b6ffc269b64..eeb69d3e1a96a 100644
--- a/api_docs/kibana_react.mdx
+++ b/api_docs/kibana_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact
title: "kibanaReact"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaReact plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact']
---
import kibanaReactObj from './kibana_react.devdocs.json';
diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx
index 1c3054ed62d5d..14cb41ffe26ab 100644
--- a/api_docs/kibana_utils.mdx
+++ b/api_docs/kibana_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils
title: "kibanaUtils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaUtils plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils']
---
import kibanaUtilsObj from './kibana_utils.devdocs.json';
diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx
index d0e8c30efbb0f..ea4f6a9d05610 100644
--- a/api_docs/kubernetes_security.mdx
+++ b/api_docs/kubernetes_security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity
title: "kubernetesSecurity"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kubernetesSecurity plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity']
---
import kubernetesSecurityObj from './kubernetes_security.devdocs.json';
diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx
index 4570b4f18977a..83b1038ed65dc 100644
--- a/api_docs/lens.mdx
+++ b/api_docs/lens.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens
title: "lens"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lens plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens']
---
import lensObj from './lens.devdocs.json';
diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx
index 37642441c1884..c18d704388da8 100644
--- a/api_docs/license_api_guard.mdx
+++ b/api_docs/license_api_guard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard
title: "licenseApiGuard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseApiGuard plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard']
---
import licenseApiGuardObj from './license_api_guard.devdocs.json';
diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx
index 6387b12d545f4..2b7f2b915bc68 100644
--- a/api_docs/license_management.mdx
+++ b/api_docs/license_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement
title: "licenseManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement']
---
import licenseManagementObj from './license_management.devdocs.json';
diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx
index 5f8e5b5f547e6..0a1d9c1c2b15b 100644
--- a/api_docs/licensing.mdx
+++ b/api_docs/licensing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing
title: "licensing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licensing plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing']
---
import licensingObj from './licensing.devdocs.json';
diff --git a/api_docs/links.mdx b/api_docs/links.mdx
index 1782a56a4e6ff..7941d098593c8 100644
--- a/api_docs/links.mdx
+++ b/api_docs/links.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links
title: "links"
image: https://source.unsplash.com/400x175/?github
description: API docs for the links plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links']
---
import linksObj from './links.devdocs.json';
diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx
index b2cee3b4fcc25..ce609a9e6646e 100644
--- a/api_docs/lists.mdx
+++ b/api_docs/lists.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists
title: "lists"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lists plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists']
---
import listsObj from './lists.devdocs.json';
diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx
index 89d1dd18649d5..6fee5aa2ad7ad 100644
--- a/api_docs/logs_explorer.mdx
+++ b/api_docs/logs_explorer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer
title: "logsExplorer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logsExplorer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer']
---
import logsExplorerObj from './logs_explorer.devdocs.json';
diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx
index 175a93382c2b3..91a0bb3550bea 100644
--- a/api_docs/logs_shared.mdx
+++ b/api_docs/logs_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared
title: "logsShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logsShared plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared']
---
import logsSharedObj from './logs_shared.devdocs.json';
diff --git a/api_docs/management.mdx b/api_docs/management.mdx
index fa5a2043989fe..bd9c15dc16cda 100644
--- a/api_docs/management.mdx
+++ b/api_docs/management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management
title: "management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the management plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management']
---
import managementObj from './management.devdocs.json';
diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx
index 961c90b160a97..66e31ee61b2ba 100644
--- a/api_docs/maps.mdx
+++ b/api_docs/maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps
title: "maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the maps plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps']
---
import mapsObj from './maps.devdocs.json';
diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx
index 07ed7950dc9d0..b911a0689fa00 100644
--- a/api_docs/maps_ems.mdx
+++ b/api_docs/maps_ems.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms
title: "mapsEms"
image: https://source.unsplash.com/400x175/?github
description: API docs for the mapsEms plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms']
---
import mapsEmsObj from './maps_ems.devdocs.json';
diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx
index be14928a14478..727cca5d62fce 100644
--- a/api_docs/metrics_data_access.mdx
+++ b/api_docs/metrics_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess
title: "metricsDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the metricsDataAccess plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess']
---
import metricsDataAccessObj from './metrics_data_access.devdocs.json';
diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx
index d6d69644627c7..2930e5921f8c6 100644
--- a/api_docs/ml.mdx
+++ b/api_docs/ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml
title: "ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ml plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml']
---
import mlObj from './ml.devdocs.json';
diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx
index bc86517cdde94..0b07a10ab6dc3 100644
--- a/api_docs/mock_idp_plugin.mdx
+++ b/api_docs/mock_idp_plugin.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin
title: "mockIdpPlugin"
image: https://source.unsplash.com/400x175/?github
description: API docs for the mockIdpPlugin plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin']
---
import mockIdpPluginObj from './mock_idp_plugin.devdocs.json';
diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx
index f3d38d23153c1..c3278a566916e 100644
--- a/api_docs/monitoring.mdx
+++ b/api_docs/monitoring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring
title: "monitoring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoring plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring']
---
import monitoringObj from './monitoring.devdocs.json';
diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx
index e8b2da792a585..07c354d1e062b 100644
--- a/api_docs/monitoring_collection.mdx
+++ b/api_docs/monitoring_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection
title: "monitoringCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoringCollection plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection']
---
import monitoringCollectionObj from './monitoring_collection.devdocs.json';
diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx
index cdca20b896059..fcdb03dbc3cd2 100644
--- a/api_docs/navigation.mdx
+++ b/api_docs/navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation
title: "navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the navigation plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation']
---
import navigationObj from './navigation.devdocs.json';
diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx
index a01ca727e82a6..c43b991193244 100644
--- a/api_docs/newsfeed.mdx
+++ b/api_docs/newsfeed.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed
title: "newsfeed"
image: https://source.unsplash.com/400x175/?github
description: API docs for the newsfeed plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed']
---
import newsfeedObj from './newsfeed.devdocs.json';
diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx
index be563763fe2ac..da6607b897c9f 100644
--- a/api_docs/no_data_page.mdx
+++ b/api_docs/no_data_page.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage
title: "noDataPage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the noDataPage plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage']
---
import noDataPageObj from './no_data_page.devdocs.json';
diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx
index 427e06596b7a9..647c5189da88e 100644
--- a/api_docs/notifications.mdx
+++ b/api_docs/notifications.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications
title: "notifications"
image: https://source.unsplash.com/400x175/?github
description: API docs for the notifications plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications']
---
import notificationsObj from './notifications.devdocs.json';
diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx
index ba26d3e716dcb..e5afa252618a5 100644
--- a/api_docs/observability.mdx
+++ b/api_docs/observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability
title: "observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observability plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability']
---
import observabilityObj from './observability.devdocs.json';
diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json
index 9d02c4d1d2cc5..4b837e5a53bbb 100644
--- a/api_docs/observability_a_i_assistant.devdocs.json
+++ b/api_docs/observability_a_i_assistant.devdocs.json
@@ -747,6 +747,54 @@
],
"returnComment": [],
"initialIsOpen": false
+ },
+ {
+ "parentPluginId": "observabilityAIAssistant",
+ "id": "def-public.useGenAIConnectorsWithoutContext",
+ "type": "Function",
+ "tags": [],
+ "label": "useGenAIConnectorsWithoutContext",
+ "description": [],
+ "signature": [
+ "(assistant: ",
+ {
+ "pluginId": "observabilityAIAssistant",
+ "scope": "public",
+ "docId": "kibObservabilityAIAssistantPluginApi",
+ "section": "def-public.ObservabilityAIAssistantService",
+ "text": "ObservabilityAIAssistantService"
+ },
+ ") => ",
+ "UseGenAIConnectorsResult"
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "observabilityAIAssistant",
+ "id": "def-public.useGenAIConnectorsWithoutContext.$1",
+ "type": "Object",
+ "tags": [],
+ "label": "assistant",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "observabilityAIAssistant",
+ "scope": "public",
+ "docId": "kibObservabilityAIAssistantPluginApi",
+ "section": "def-public.ObservabilityAIAssistantService",
+ "text": "ObservabilityAIAssistantService"
+ }
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": [],
+ "initialIsOpen": false
}
],
"interfaces": [
diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx
index ee20a72fe7767..cfe2dc7c24064 100644
--- a/api_docs/observability_a_i_assistant.mdx
+++ b/api_docs/observability_a_i_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant
title: "observabilityAIAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAIAssistant plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant']
---
import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 251 | 1 | 249 | 25 |
+| 253 | 1 | 251 | 25 |
## Client
diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx
index f2d8d299f0f16..7462476d32e3c 100644
--- a/api_docs/observability_a_i_assistant_app.mdx
+++ b/api_docs/observability_a_i_assistant_app.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp
title: "observabilityAIAssistantApp"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAIAssistantApp plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp']
---
import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json';
diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx
index 507a3ba8bee8c..4496d3df5cf76 100644
--- a/api_docs/observability_ai_assistant_management.mdx
+++ b/api_docs/observability_ai_assistant_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement
title: "observabilityAiAssistantManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAiAssistantManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement']
---
import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json';
diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx
index 4c2d25da3a41e..b6377b0711794 100644
--- a/api_docs/observability_logs_explorer.mdx
+++ b/api_docs/observability_logs_explorer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer
title: "observabilityLogsExplorer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityLogsExplorer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer']
---
import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json';
diff --git a/api_docs/observability_onboarding.devdocs.json b/api_docs/observability_onboarding.devdocs.json
index b6c82b480f5a8..b5d8d41f255cf 100644
--- a/api_docs/observability_onboarding.devdocs.json
+++ b/api_docs/observability_onboarding.devdocs.json
@@ -116,6 +116,46 @@
"path": "x-pack/plugins/observability_solution/observability_onboarding/public/index.ts",
"deprecated": false,
"trackAdoption": false
+ },
+ {
+ "parentPluginId": "observabilityOnboarding",
+ "id": "def-public.ObservabilityOnboardingAppServices.docLinks",
+ "type": "Object",
+ "tags": [],
+ "label": "docLinks",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "@kbn/core-doc-links-browser",
+ "scope": "common",
+ "docId": "kibKbnCoreDocLinksBrowserPluginApi",
+ "section": "def-common.DocLinksStart",
+ "text": "DocLinksStart"
+ }
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_onboarding/public/index.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "observabilityOnboarding",
+ "id": "def-public.ObservabilityOnboardingAppServices.chrome",
+ "type": "Object",
+ "tags": [],
+ "label": "chrome",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "@kbn/core-chrome-browser",
+ "scope": "common",
+ "docId": "kibKbnCoreChromeBrowserPluginApi",
+ "section": "def-common.ChromeStart",
+ "text": "ChromeStart"
+ }
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_onboarding/public/index.ts",
+ "deprecated": false,
+ "trackAdoption": false
}
],
"initialIsOpen": false
diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx
index 55b469ceef61c..5f9e528f77bb2 100644
--- a/api_docs/observability_onboarding.mdx
+++ b/api_docs/observability_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding
title: "observabilityOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityOnboarding plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding']
---
import observabilityOnboardingObj from './observability_onboarding.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 14 | 0 | 14 | 0 |
+| 16 | 0 | 16 | 0 |
## Client
diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json
index 732405642f4b5..b5d906a244926 100644
--- a/api_docs/observability_shared.devdocs.json
+++ b/api_docs/observability_shared.devdocs.json
@@ -3273,6 +3273,36 @@
],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "observabilityShared",
+ "id": "def-public.ASSET_DETAILS_FLYOUT_LOCATOR_ID",
+ "type": "string",
+ "tags": [],
+ "label": "ASSET_DETAILS_FLYOUT_LOCATOR_ID",
+ "description": [],
+ "signature": [
+ "\"ASSET_DETAILS_FLYOUT_LOCATOR\""
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "initialIsOpen": false
+ },
+ {
+ "parentPluginId": "observabilityShared",
+ "id": "def-public.ASSET_DETAILS_LOCATOR_ID",
+ "type": "string",
+ "tags": [],
+ "label": "ASSET_DETAILS_LOCATOR_ID",
+ "description": [],
+ "signature": [
+ "\"ASSET_DETAILS_LOCATOR\""
+ ],
+ "path": "x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "initialIsOpen": false
+ },
{
"parentPluginId": "observabilityShared",
"id": "def-public.casesFeatureId",
diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx
index 9c8b479a11b16..cc118c353a48d 100644
--- a/api_docs/observability_shared.mdx
+++ b/api_docs/observability_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared
title: "observabilityShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityShared plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared']
---
import observabilitySharedObj from './observability_shared.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 346 | 1 | 341 | 22 |
+| 348 | 1 | 343 | 22 |
## Client
diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx
index de86cdab505e8..c8d5db8dd0fd5 100644
--- a/api_docs/osquery.mdx
+++ b/api_docs/osquery.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery
title: "osquery"
image: https://source.unsplash.com/400x175/?github
description: API docs for the osquery plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery']
---
import osqueryObj from './osquery.devdocs.json';
diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx
index fdc80246bdcfb..a916a8d0b3c72 100644
--- a/api_docs/painless_lab.mdx
+++ b/api_docs/painless_lab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab
title: "painlessLab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the painlessLab plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab']
---
import painlessLabObj from './painless_lab.devdocs.json';
diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx
index b2e1754b67af8..41ca99cb5c9fb 100644
--- a/api_docs/plugin_directory.mdx
+++ b/api_docs/plugin_directory.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory
slug: /kibana-dev-docs/api-meta/plugin-api-directory
title: Directory
description: Directory of public APIs available through plugins or packages.
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
@@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| API Count | Any Count | Missing comments | Missing exports |
|--------------|----------|-----------------|--------|
-| 47411 | 240 | 36072 | 1851 |
+| 47428 | 240 | 36084 | 1851 |
## Plugin Directory
@@ -56,7 +56,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 108 | 0 | 105 | 12 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 |
-| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3287 | 31 | 2621 | 23 |
+| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3290 | 31 | 2621 | 23 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 |
@@ -68,7 +68,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 2 |
| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 |
| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 45 | 0 | 31 | 0 |
-| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 559 | 1 | 453 | 8 |
+| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 560 | 1 | 454 | 8 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 |
| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 |
| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 |
@@ -140,12 +140,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 |
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 |
| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 678 | 2 | 669 | 13 |
-| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 251 | 1 | 249 | 25 |
+| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 253 | 1 | 251 | 25 |
| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 |
| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 |
| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 21 | 0 | 21 | 1 |
-| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 |
-| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 346 | 1 | 341 | 22 |
+| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 16 | 0 | 16 | 0 |
+| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 348 | 1 | 343 | 22 |
| | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 |
| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 |
@@ -695,7 +695,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 |
-| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 104 | 2 | 67 | 1 |
+| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 111 | 2 | 72 | 1 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 |
| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 |
diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx
index 4e5e7b04e3c76..e1c347247dc08 100644
--- a/api_docs/presentation_panel.mdx
+++ b/api_docs/presentation_panel.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel
title: "presentationPanel"
image: https://source.unsplash.com/400x175/?github
description: API docs for the presentationPanel plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel']
---
import presentationPanelObj from './presentation_panel.devdocs.json';
diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx
index 384d80f43c82e..5ba47ca3f8b39 100644
--- a/api_docs/presentation_util.mdx
+++ b/api_docs/presentation_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil
title: "presentationUtil"
image: https://source.unsplash.com/400x175/?github
description: API docs for the presentationUtil plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil']
---
import presentationUtilObj from './presentation_util.devdocs.json';
diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx
index 71f28edc9e429..30223b9b8b386 100644
--- a/api_docs/profiling.mdx
+++ b/api_docs/profiling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling
title: "profiling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profiling plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling']
---
import profilingObj from './profiling.devdocs.json';
diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx
index ddf3bda4f3f13..8a7059447a774 100644
--- a/api_docs/profiling_data_access.mdx
+++ b/api_docs/profiling_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess
title: "profilingDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profilingDataAccess plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess']
---
import profilingDataAccessObj from './profiling_data_access.devdocs.json';
diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx
index e303079a3cc7d..f33bc9526e01c 100644
--- a/api_docs/remote_clusters.mdx
+++ b/api_docs/remote_clusters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters
title: "remoteClusters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the remoteClusters plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters']
---
import remoteClustersObj from './remote_clusters.devdocs.json';
diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx
index cf0eb6dd94151..3bfffcff0a671 100644
--- a/api_docs/reporting.mdx
+++ b/api_docs/reporting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting
title: "reporting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the reporting plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting']
---
import reportingObj from './reporting.devdocs.json';
diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx
index 7c194f1d4a86f..51359229cd989 100644
--- a/api_docs/rollup.mdx
+++ b/api_docs/rollup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup
title: "rollup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the rollup plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup']
---
import rollupObj from './rollup.devdocs.json';
diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx
index 3143ea1112e92..147d1ff4b17e7 100644
--- a/api_docs/rule_registry.mdx
+++ b/api_docs/rule_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry
title: "ruleRegistry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ruleRegistry plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry']
---
import ruleRegistryObj from './rule_registry.devdocs.json';
diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx
index 43e98bb1f8515..eeebd13eb952a 100644
--- a/api_docs/runtime_fields.mdx
+++ b/api_docs/runtime_fields.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields
title: "runtimeFields"
image: https://source.unsplash.com/400x175/?github
description: API docs for the runtimeFields plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields']
---
import runtimeFieldsObj from './runtime_fields.devdocs.json';
diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx
index 0712153e09f06..2493f231c4e9e 100644
--- a/api_docs/saved_objects.mdx
+++ b/api_docs/saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects
title: "savedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjects plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects']
---
import savedObjectsObj from './saved_objects.devdocs.json';
diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx
index ea7fcd35f8205..0ac3b88491fd5 100644
--- a/api_docs/saved_objects_finder.mdx
+++ b/api_docs/saved_objects_finder.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder
title: "savedObjectsFinder"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsFinder plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder']
---
import savedObjectsFinderObj from './saved_objects_finder.devdocs.json';
diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx
index fac22a46fe98f..88bd0f315fc72 100644
--- a/api_docs/saved_objects_management.mdx
+++ b/api_docs/saved_objects_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement
title: "savedObjectsManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsManagement plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement']
---
import savedObjectsManagementObj from './saved_objects_management.devdocs.json';
diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx
index f48fd57127cb4..8335c5523c4be 100644
--- a/api_docs/saved_objects_tagging.mdx
+++ b/api_docs/saved_objects_tagging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging
title: "savedObjectsTagging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTagging plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging']
---
import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json';
diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx
index 915363cd8f6bf..1dbd2bdd9a822 100644
--- a/api_docs/saved_objects_tagging_oss.mdx
+++ b/api_docs/saved_objects_tagging_oss.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss
title: "savedObjectsTaggingOss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTaggingOss plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss']
---
import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json';
diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx
index 9b858df0d1ab5..0a399d7726750 100644
--- a/api_docs/saved_search.mdx
+++ b/api_docs/saved_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch
title: "savedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedSearch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch']
---
import savedSearchObj from './saved_search.devdocs.json';
diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx
index 7bb0060dd133b..d9d93cf289cbf 100644
--- a/api_docs/screenshot_mode.mdx
+++ b/api_docs/screenshot_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode
title: "screenshotMode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotMode plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode']
---
import screenshotModeObj from './screenshot_mode.devdocs.json';
diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx
index 9139c6996acec..63a05fadbbc22 100644
--- a/api_docs/screenshotting.mdx
+++ b/api_docs/screenshotting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting
title: "screenshotting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotting plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting']
---
import screenshottingObj from './screenshotting.devdocs.json';
diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx
index 8fd2a888ea33a..50234bd0158ad 100644
--- a/api_docs/search_connectors.mdx
+++ b/api_docs/search_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors
title: "searchConnectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchConnectors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors']
---
import searchConnectorsObj from './search_connectors.devdocs.json';
diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx
index cfba252425311..8bd1c9928ef70 100644
--- a/api_docs/search_notebooks.mdx
+++ b/api_docs/search_notebooks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks
title: "searchNotebooks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchNotebooks plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks']
---
import searchNotebooksObj from './search_notebooks.devdocs.json';
diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx
index 474e9aa2d4cb9..0734255c6dc3c 100644
--- a/api_docs/search_playground.mdx
+++ b/api_docs/search_playground.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground
title: "searchPlayground"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchPlayground plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground']
---
import searchPlaygroundObj from './search_playground.devdocs.json';
diff --git a/api_docs/security.mdx b/api_docs/security.mdx
index e8a4efee4b987..bc5281fe1c98b 100644
--- a/api_docs/security.mdx
+++ b/api_docs/security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security
title: "security"
image: https://source.unsplash.com/400x175/?github
description: API docs for the security plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security']
---
import securityObj from './security.devdocs.json';
diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json
index eb49639aa8d75..37fb9b4540fe2 100644
--- a/api_docs/security_solution.devdocs.json
+++ b/api_docs/security_solution.devdocs.json
@@ -485,7 +485,7 @@
"\nExperimental flag needed to enable the link"
],
"signature": [
- "\"assistantAlertsInsights\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"agentStatusClientEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForNewTermsRuleEnabled\" | \"alertSuppressionForNonSequenceEqlRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | undefined"
+ "\"assistantAlertsInsights\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForNewTermsRuleEnabled\" | \"alertSuppressionForNonSequenceEqlRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | undefined"
],
"path": "x-pack/plugins/security_solution/public/common/links/types.ts",
"deprecated": false,
@@ -565,7 +565,7 @@
"\nExperimental flag needed to disable the link. Opposite of experimentalKey"
],
"signature": [
- "\"assistantAlertsInsights\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"agentStatusClientEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForNewTermsRuleEnabled\" | \"alertSuppressionForNonSequenceEqlRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | undefined"
+ "\"assistantAlertsInsights\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForNewTermsRuleEnabled\" | \"alertSuppressionForNonSequenceEqlRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | undefined"
],
"path": "x-pack/plugins/security_solution/public/common/links/types.ts",
"deprecated": false,
@@ -1964,7 +1964,7 @@
"label": "experimentalFeatures",
"description": [],
"signature": [
- "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
+ "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
],
"path": "x-pack/plugins/security_solution/public/types.ts",
"deprecated": false,
@@ -3030,7 +3030,7 @@
"\nThe security solution generic experimental features"
],
"signature": [
- "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
+ "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
],
"path": "x-pack/plugins/security_solution/server/plugin_contract.ts",
"deprecated": false,
@@ -3206,7 +3206,7 @@
"label": "ExperimentalFeatures",
"description": [],
"signature": [
- "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
+ "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantAlertsInsights: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForNewTermsRuleEnabled: boolean; readonly alertSuppressionForNonSequenceEqlRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; }"
],
"path": "x-pack/plugins/security_solution/common/experimental_features.ts",
"deprecated": false,
@@ -3272,7 +3272,7 @@
"\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered."
],
"signature": [
- "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: false; readonly agentStatusClientEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: false; readonly expandableTimelineFlyoutEnabled: false; readonly alertsPageFiltersEnabled: true; readonly assistantAlertsInsights: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForNewTermsRuleEnabled: false; readonly alertSuppressionForNonSequenceEqlRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: false; readonly aiAssistantFlyoutMode: false; readonly valueListItemsModalEnabled: false; }"
+ "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: false; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: false; readonly expandableTimelineFlyoutEnabled: false; readonly alertsPageFiltersEnabled: true; readonly assistantAlertsInsights: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForNewTermsRuleEnabled: false; readonly alertSuppressionForNonSequenceEqlRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: false; readonly aiAssistantFlyoutMode: false; readonly valueListItemsModalEnabled: false; }"
],
"path": "x-pack/plugins/security_solution/common/experimental_features.ts",
"deprecated": false,
diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx
index 1cfc592de431f..3a780bb2b743f 100644
--- a/api_docs/security_solution.mdx
+++ b/api_docs/security_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution
title: "securitySolution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolution plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution']
---
import securitySolutionObj from './security_solution.devdocs.json';
diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx
index 457d194ad0b57..d876284999c3e 100644
--- a/api_docs/security_solution_ess.mdx
+++ b/api_docs/security_solution_ess.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss
title: "securitySolutionEss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionEss plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss']
---
import securitySolutionEssObj from './security_solution_ess.devdocs.json';
diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx
index dec14b98c890c..7f8cd1e9e3c59 100644
--- a/api_docs/security_solution_serverless.mdx
+++ b/api_docs/security_solution_serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless
title: "securitySolutionServerless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionServerless plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless']
---
import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json';
diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx
index 7176016c690e8..858f52ec2679a 100644
--- a/api_docs/serverless.mdx
+++ b/api_docs/serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless
title: "serverless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverless plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless']
---
import serverlessObj from './serverless.devdocs.json';
diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx
index 6b3b45aef01e4..9560568496a68 100644
--- a/api_docs/serverless_observability.mdx
+++ b/api_docs/serverless_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability
title: "serverlessObservability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessObservability plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability']
---
import serverlessObservabilityObj from './serverless_observability.devdocs.json';
diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx
index 49452d9a42fbc..8b22f7abaca63 100644
--- a/api_docs/serverless_search.mdx
+++ b/api_docs/serverless_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch
title: "serverlessSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessSearch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch']
---
import serverlessSearchObj from './serverless_search.devdocs.json';
diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx
index 8dea3d115b5e7..7b9f51a9f0f01 100644
--- a/api_docs/session_view.mdx
+++ b/api_docs/session_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView
title: "sessionView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the sessionView plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView']
---
import sessionViewObj from './session_view.devdocs.json';
diff --git a/api_docs/share.mdx b/api_docs/share.mdx
index b751d2f24d96f..b26f1c2a4d8e1 100644
--- a/api_docs/share.mdx
+++ b/api_docs/share.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share
title: "share"
image: https://source.unsplash.com/400x175/?github
description: API docs for the share plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share']
---
import shareObj from './share.devdocs.json';
diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx
index 8569572644da4..d06e6c8de46c0 100644
--- a/api_docs/slo.mdx
+++ b/api_docs/slo.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo
title: "slo"
image: https://source.unsplash.com/400x175/?github
description: API docs for the slo plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo']
---
import sloObj from './slo.devdocs.json';
diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx
index 6f7d7327395b1..aec1404302652 100644
--- a/api_docs/snapshot_restore.mdx
+++ b/api_docs/snapshot_restore.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore
title: "snapshotRestore"
image: https://source.unsplash.com/400x175/?github
description: API docs for the snapshotRestore plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore']
---
import snapshotRestoreObj from './snapshot_restore.devdocs.json';
diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx
index 94ae40556f4cb..8b3d044d92bec 100644
--- a/api_docs/spaces.mdx
+++ b/api_docs/spaces.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces
title: "spaces"
image: https://source.unsplash.com/400x175/?github
description: API docs for the spaces plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces']
---
import spacesObj from './spaces.devdocs.json';
diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx
index 6249f96728d94..aa46073968f11 100644
--- a/api_docs/stack_alerts.mdx
+++ b/api_docs/stack_alerts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts
title: "stackAlerts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackAlerts plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts']
---
import stackAlertsObj from './stack_alerts.devdocs.json';
diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx
index 922d463f2ff73..033811a9c1e54 100644
--- a/api_docs/stack_connectors.mdx
+++ b/api_docs/stack_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors
title: "stackConnectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackConnectors plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors']
---
import stackConnectorsObj from './stack_connectors.devdocs.json';
diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx
index a490742b358c1..d9211312777e2 100644
--- a/api_docs/task_manager.mdx
+++ b/api_docs/task_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager
title: "taskManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the taskManager plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager']
---
import taskManagerObj from './task_manager.devdocs.json';
diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx
index a609ae19976c5..53bf5eeac8d6f 100644
--- a/api_docs/telemetry.mdx
+++ b/api_docs/telemetry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry
title: "telemetry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetry plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry']
---
import telemetryObj from './telemetry.devdocs.json';
diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx
index 2e3b5245d368f..a50a79e1ab6ce 100644
--- a/api_docs/telemetry_collection_manager.mdx
+++ b/api_docs/telemetry_collection_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager
title: "telemetryCollectionManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionManager plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager']
---
import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json';
diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx
index 87e2e4954a0f4..df68620da05f8 100644
--- a/api_docs/telemetry_collection_xpack.mdx
+++ b/api_docs/telemetry_collection_xpack.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack
title: "telemetryCollectionXpack"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionXpack plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack']
---
import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json';
diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx
index c1d4978fbee45..6696916cc1c14 100644
--- a/api_docs/telemetry_management_section.mdx
+++ b/api_docs/telemetry_management_section.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection
title: "telemetryManagementSection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryManagementSection plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection']
---
import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json';
diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx
index 7c6d63831db20..cbeeecf23e6fd 100644
--- a/api_docs/text_based_languages.mdx
+++ b/api_docs/text_based_languages.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages
title: "textBasedLanguages"
image: https://source.unsplash.com/400x175/?github
description: API docs for the textBasedLanguages plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages']
---
import textBasedLanguagesObj from './text_based_languages.devdocs.json';
diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx
index c88d77085fe24..bdc10f2952f26 100644
--- a/api_docs/threat_intelligence.mdx
+++ b/api_docs/threat_intelligence.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence
title: "threatIntelligence"
image: https://source.unsplash.com/400x175/?github
description: API docs for the threatIntelligence plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence']
---
import threatIntelligenceObj from './threat_intelligence.devdocs.json';
diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx
index 952af2b1313f2..a3ee52d900b0f 100644
--- a/api_docs/timelines.mdx
+++ b/api_docs/timelines.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines
title: "timelines"
image: https://source.unsplash.com/400x175/?github
description: API docs for the timelines plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines']
---
import timelinesObj from './timelines.devdocs.json';
diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx
index 3d7158d258dda..5b251f7a1792c 100644
--- a/api_docs/transform.mdx
+++ b/api_docs/transform.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform
title: "transform"
image: https://source.unsplash.com/400x175/?github
description: API docs for the transform plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform']
---
import transformObj from './transform.devdocs.json';
diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx
index fb1d973d38972..933de564fa363 100644
--- a/api_docs/triggers_actions_ui.mdx
+++ b/api_docs/triggers_actions_ui.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi
title: "triggersActionsUi"
image: https://source.unsplash.com/400x175/?github
description: API docs for the triggersActionsUi plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi']
---
import triggersActionsUiObj from './triggers_actions_ui.devdocs.json';
diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx
index eece7d0b5044d..310432e2fdad5 100644
--- a/api_docs/ui_actions.mdx
+++ b/api_docs/ui_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions
title: "uiActions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActions plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions']
---
import uiActionsObj from './ui_actions.devdocs.json';
diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx
index 5b64256b770ce..41759f84631df 100644
--- a/api_docs/ui_actions_enhanced.mdx
+++ b/api_docs/ui_actions_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced
title: "uiActionsEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActionsEnhanced plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced']
---
import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json';
diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx
index 89afaaa69a4dd..ffdfbbbd4206d 100644
--- a/api_docs/unified_doc_viewer.mdx
+++ b/api_docs/unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer
title: "unifiedDocViewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedDocViewer plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer']
---
import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json';
diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx
index 8c776770ad3fe..bf3896d5649cf 100644
--- a/api_docs/unified_histogram.mdx
+++ b/api_docs/unified_histogram.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram
title: "unifiedHistogram"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedHistogram plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram']
---
import unifiedHistogramObj from './unified_histogram.devdocs.json';
diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx
index e44ee3f7c5075..556a490b2b1fd 100644
--- a/api_docs/unified_search.mdx
+++ b/api_docs/unified_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch
title: "unifiedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch']
---
import unifiedSearchObj from './unified_search.devdocs.json';
diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx
index 0b23a1ae32862..b594e4434d351 100644
--- a/api_docs/unified_search_autocomplete.mdx
+++ b/api_docs/unified_search_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete
title: "unifiedSearch.autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch.autocomplete plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete']
---
import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json';
diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx
index 6e2e24361e183..cdd78c505f3a7 100644
--- a/api_docs/uptime.mdx
+++ b/api_docs/uptime.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime
title: "uptime"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uptime plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime']
---
import uptimeObj from './uptime.devdocs.json';
diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx
index fdfd6a9f761c2..1e0957f9243a3 100644
--- a/api_docs/url_forwarding.mdx
+++ b/api_docs/url_forwarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding
title: "urlForwarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the urlForwarding plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding']
---
import urlForwardingObj from './url_forwarding.devdocs.json';
diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx
index dd341eb1cd820..64cf7a3cd8a17 100644
--- a/api_docs/usage_collection.mdx
+++ b/api_docs/usage_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection
title: "usageCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the usageCollection plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection']
---
import usageCollectionObj from './usage_collection.devdocs.json';
diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx
index 18a57050fd0d5..85aa37d1de037 100644
--- a/api_docs/ux.mdx
+++ b/api_docs/ux.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux
title: "ux"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ux plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux']
---
import uxObj from './ux.devdocs.json';
diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx
index 8bca77cd5b679..5911fcbb7e217 100644
--- a/api_docs/vis_default_editor.mdx
+++ b/api_docs/vis_default_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor
title: "visDefaultEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visDefaultEditor plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor']
---
import visDefaultEditorObj from './vis_default_editor.devdocs.json';
diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx
index 827143b871488..0d3d23a280aa1 100644
--- a/api_docs/vis_type_gauge.mdx
+++ b/api_docs/vis_type_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge
title: "visTypeGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeGauge plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge']
---
import visTypeGaugeObj from './vis_type_gauge.devdocs.json';
diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx
index eed495383b769..21f384e2eaa06 100644
--- a/api_docs/vis_type_heatmap.mdx
+++ b/api_docs/vis_type_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap
title: "visTypeHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeHeatmap plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap']
---
import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json';
diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx
index 845e21cbbce5d..648776cb3efc1 100644
--- a/api_docs/vis_type_pie.mdx
+++ b/api_docs/vis_type_pie.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie
title: "visTypePie"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypePie plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie']
---
import visTypePieObj from './vis_type_pie.devdocs.json';
diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx
index 6dd2020f2ac1c..0e017df6a7007 100644
--- a/api_docs/vis_type_table.mdx
+++ b/api_docs/vis_type_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable
title: "visTypeTable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTable plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable']
---
import visTypeTableObj from './vis_type_table.devdocs.json';
diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx
index 6c2a8fa2947e9..ea0f1acc95e5b 100644
--- a/api_docs/vis_type_timelion.mdx
+++ b/api_docs/vis_type_timelion.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion
title: "visTypeTimelion"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimelion plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion']
---
import visTypeTimelionObj from './vis_type_timelion.devdocs.json';
diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx
index 22c6db6d8d777..8ac3c85233644 100644
--- a/api_docs/vis_type_timeseries.mdx
+++ b/api_docs/vis_type_timeseries.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries
title: "visTypeTimeseries"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimeseries plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries']
---
import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json';
diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx
index f579396e7a764..efd0efbe79b91 100644
--- a/api_docs/vis_type_vega.mdx
+++ b/api_docs/vis_type_vega.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega
title: "visTypeVega"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVega plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega']
---
import visTypeVegaObj from './vis_type_vega.devdocs.json';
diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx
index 9c054c3b9f3c7..cde653d3b7478 100644
--- a/api_docs/vis_type_vislib.mdx
+++ b/api_docs/vis_type_vislib.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib
title: "visTypeVislib"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVislib plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib']
---
import visTypeVislibObj from './vis_type_vislib.devdocs.json';
diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx
index af9204a7c262d..f430bda90ad99 100644
--- a/api_docs/vis_type_xy.mdx
+++ b/api_docs/vis_type_xy.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy
title: "visTypeXy"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeXy plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy']
---
import visTypeXyObj from './vis_type_xy.devdocs.json';
diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json
index e17f4e3b4af45..ccfb9c976f202 100644
--- a/api_docs/visualizations.devdocs.json
+++ b/api_docs/visualizations.devdocs.json
@@ -6872,7 +6872,15 @@
"section": "def-common.PublishingSubject",
"text": "PublishingSubject"
},
- "; disabledActionIds: ",
+ "; defaultPanelDescription: ",
+ {
+ "pluginId": "@kbn/presentation-publishing",
+ "scope": "common",
+ "docId": "kibKbnPresentationPublishingPluginApi",
+ "section": "def-common.PublishingSubject",
+ "text": "PublishingSubject"
+ },
+ " | undefined; disabledActionIds: ",
{
"pluginId": "@kbn/presentation-publishing",
"scope": "common",
diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx
index ce4d9feecde38..046872d18271d 100644
--- a/api_docs/visualizations.mdx
+++ b/api_docs/visualizations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations
title: "visualizations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visualizations plugin
-date: 2024-04-22
+date: 2024-04-23
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations']
---
import visualizationsObj from './visualizations.devdocs.json';
From 8a6e6d89155161005b1bb9400b436b0f277af207 Mon Sep 17 00:00:00 2001
From: Marco Liberati
Date: Tue, 23 Apr 2024 08:20:59 +0200
Subject: [PATCH 047/183] [Lens] Fix datatable actions when first row is empty
(#181344)
## Summary
This PR fixes a bug that affects cell actions when the first column row
is empty in a Lens datatable.
The check for the action was checking only the first row, while now it
tries to find the first row with some values.
This shouldn't have any particular performance impact, but it's worth
testing to be sure about it.
### Checklist
- [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
---
.../datatable/expression.test.tsx | 55 ++++++++++++++++++-
.../visualizations/datatable/expression.tsx | 12 +++-
2 files changed, 62 insertions(+), 5 deletions(-)
diff --git a/x-pack/plugins/lens/public/visualizations/datatable/expression.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/expression.test.tsx
index 1078aaa6da2da..e8d450fdb6b59 100644
--- a/x-pack/plugins/lens/public/visualizations/datatable/expression.test.tsx
+++ b/x-pack/plugins/lens/public/visualizations/datatable/expression.test.tsx
@@ -8,8 +8,8 @@ import { createMockExecutionContext } from '@kbn/expressions-plugin/common/mocks
import type { DatatableProps } from '../../../common/expressions';
import type { FormatFactory } from '../../../common/types';
import { getDatatable } from '../../../common/expressions';
-import { getColumnCellValueActions } from './expression';
-import type { Datatable } from '@kbn/expressions-plugin/common';
+import { getColumnCellValueActions, getColumnsFilterable } from './expression';
+import type { Datatable, IInterpreterRenderHandlers } from '@kbn/expressions-plugin/common';
import { LensCellValueAction } from '../../types';
const cellValueAction: LensCellValueAction = {
@@ -122,4 +122,55 @@ describe('datatable_expression', () => {
expect(result).toEqual([]);
});
});
+
+ describe('getColumnsFilterable', () => {
+ it('should return no data if an empty table is passed', async () => {
+ const { data } = sampleArgs();
+ data.rows = [];
+ const hasCompatibleActions = jest.fn();
+ expect(
+ await getColumnsFilterable(data, {
+ hasCompatibleActions,
+ } as unknown as IInterpreterRenderHandlers)
+ ).toBeUndefined();
+ expect(hasCompatibleActions).not.toHaveBeenCalled();
+ });
+
+ it('should call the handler for each column', async () => {
+ const { data } = sampleArgs();
+ const hasCompatibleActions = jest.fn().mockResolvedValue(true);
+ expect(
+ await getColumnsFilterable(data, {
+ hasCompatibleActions,
+ } as unknown as IInterpreterRenderHandlers)
+ ).toEqual([true, true, true]);
+ expect(hasCompatibleActions).toHaveBeenCalledTimes(data.columns.length);
+ });
+
+ it('should call the handler for each column with table coords of data values', async () => {
+ const { data } = sampleArgs();
+ data.rows = [
+ { a: null, b: null, c: null },
+ { a: 'shoes', b: 1588024800000, c: 3 },
+ ];
+ const hasCompatibleActions = jest.fn().mockResolvedValue(true);
+ expect(
+ await getColumnsFilterable(data, {
+ hasCompatibleActions,
+ } as unknown as IInterpreterRenderHandlers)
+ ).toEqual([true, true, true]);
+ expect(hasCompatibleActions).toHaveBeenCalledTimes(data.columns.length);
+ for (const id of data.columns.map((_, i) => i + 1)) {
+ expect(hasCompatibleActions).toHaveBeenNthCalledWith(
+ id,
+ expect.objectContaining({
+ name: 'filter',
+ data: expect.objectContaining({
+ data: [expect.objectContaining({ row: 1 })],
+ }),
+ })
+ );
+ }
+ });
+ });
});
diff --git a/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx b/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx
index eae35c5a925dc..157cc6d980b31 100644
--- a/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx
+++ b/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx
@@ -30,12 +30,18 @@ import type {
import type { FormatFactory } from '../../../common/types';
import type { DatatableProps } from '../../../common/expressions';
-async function getColumnsFilterable(table: Datatable, handlers: IInterpreterRenderHandlers) {
+export async function getColumnsFilterable(table: Datatable, handlers: IInterpreterRenderHandlers) {
if (!table.rows.length) {
return;
}
+
+ // to avoid false negatives, find the first index of the row with data for each column
+ const rowsWithDataForEachColumn = table.columns.map((column, colIndex) => {
+ const rowIndex = table.rows.findIndex((row) => row[column.id] != null);
+ return [rowIndex > -1 ? rowIndex : 0, colIndex];
+ });
return Promise.all(
- table.columns.map(async (column, colIndex) => {
+ rowsWithDataForEachColumn.map(async ([rowIndex, colIndex]) => {
return Boolean(
await handlers.hasCompatibleActions?.({
name: 'filter',
@@ -44,7 +50,7 @@ async function getColumnsFilterable(table: Datatable, handlers: IInterpreterRend
{
table,
column: colIndex,
- row: 0,
+ row: rowIndex,
},
],
},
From 32cb4d32d1c0b379b8dbc75f11847568551c0c9f Mon Sep 17 00:00:00 2001
From: Stratoula Kalafateli
Date: Tue, 23 Apr 2024 08:32:00 +0200
Subject: [PATCH 048/183] [ES|QL] Fixes comments bugs in Discover and Data
Visualizer (#181283)
## Summary
Closes https://github.com/elastic/kibana/issues/181276
Fixes the histogram and the field statistics problem when the user adds
a comment at the end of the query. The fix is simple, starting the code
we are adding on a new line.
---
packages/kbn-esql-utils/index.ts | 1 +
packages/kbn-esql-utils/src/index.ts | 1 +
.../src/utils/append_to_query.test.ts | 25 ++++++++++++++++
.../src/utils/append_to_query.ts | 13 ++++++++
.../utils/get_esql_with_safe_limit.test.ts | 8 ++---
.../src/utils/get_esql_with_safe_limit.ts | 2 +-
.../field_stats_utils_text_based.test.ts | 6 ++--
.../field_stats_utils_text_based.ts | 30 +++++++++++--------
.../lens_vis_service.attributes.test.ts | 3 +-
.../lens_vis_service.suggestions.test.ts | 6 ++--
.../public/services/lens_vis_service.ts | 7 +++--
.../hooks/esql/use_esql_overall_stats_data.ts | 17 ++++++-----
.../esql_requests/get_boolean_field_stats.ts | 15 ++++++----
.../get_count_and_cardinality.ts | 8 +++--
.../esql_requests/get_date_field_stats.ts | 5 ++--
.../esql_requests/get_keyword_fields.ts | 13 ++++----
.../esql_requests/get_numeric_field_stats.ts | 5 ++--
17 files changed, 112 insertions(+), 53 deletions(-)
create mode 100644 packages/kbn-esql-utils/src/utils/append_to_query.test.ts
create mode 100644 packages/kbn-esql-utils/src/utils/append_to_query.ts
diff --git a/packages/kbn-esql-utils/index.ts b/packages/kbn-esql-utils/index.ts
index 885c491986582..0d04f40b85612 100644
--- a/packages/kbn-esql-utils/index.ts
+++ b/packages/kbn-esql-utils/index.ts
@@ -15,6 +15,7 @@ export {
getIndexForESQLQuery,
getInitialESQLQuery,
getESQLWithSafeLimit,
+ appendToESQLQuery,
TextBasedLanguages,
} from './src';
diff --git a/packages/kbn-esql-utils/src/index.ts b/packages/kbn-esql-utils/src/index.ts
index 58e241c1ebc6e..92a39a4a6f793 100644
--- a/packages/kbn-esql-utils/src/index.ts
+++ b/packages/kbn-esql-utils/src/index.ts
@@ -16,3 +16,4 @@ export {
getLimitFromESQLQuery,
removeDropCommandsFromESQLQuery,
} from './utils/query_parsing_helpers';
+export { appendToESQLQuery } from './utils/append_to_query';
diff --git a/packages/kbn-esql-utils/src/utils/append_to_query.test.ts b/packages/kbn-esql-utils/src/utils/append_to_query.test.ts
new file mode 100644
index 0000000000000..414b9729af03b
--- /dev/null
+++ b/packages/kbn-esql-utils/src/utils/append_to_query.test.ts
@@ -0,0 +1,25 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+import { appendToESQLQuery } from './append_to_query';
+
+describe('appendToESQLQuery', () => {
+ it('append the text on a new line after the query', () => {
+ expect(appendToESQLQuery('from logstash-* // meow', '| stats var = avg(woof)')).toBe(
+ `from logstash-* // meow
+| stats var = avg(woof)`
+ );
+ });
+
+ it('append the text on a new line after the query for text with variables', () => {
+ const limit = 10;
+ expect(appendToESQLQuery('from logstash-*', `| limit ${limit}`)).toBe(
+ `from logstash-*
+| limit 10`
+ );
+ });
+});
diff --git a/packages/kbn-esql-utils/src/utils/append_to_query.ts b/packages/kbn-esql-utils/src/utils/append_to_query.ts
new file mode 100644
index 0000000000000..efb43951bd082
--- /dev/null
+++ b/packages/kbn-esql-utils/src/utils/append_to_query.ts
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+// Append in a new line the appended text to take care of the case where the user adds a comment at the end of the query
+// in these cases a base query such as "from index // comment" will result in errors or wrong data if we don't append in a new line
+export function appendToESQLQuery(baseESQLQuery: string, appendedText: string): string {
+ return `${baseESQLQuery}\n${appendedText}`;
+}
diff --git a/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.test.ts b/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.test.ts
index a78dd9f9c0647..e452127506b26 100644
--- a/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.test.ts
+++ b/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.test.ts
@@ -17,15 +17,15 @@ describe('getESQLWithSafeLimit()', () => {
});
it('should add the limit', () => {
- expect(getESQLWithSafeLimit(' from logs', LIMIT)).toBe('from logs | LIMIT 10000');
+ expect(getESQLWithSafeLimit(' from logs', LIMIT)).toBe('from logs \n| LIMIT 10000');
expect(getESQLWithSafeLimit('FROM logs* | LIMIT 5', LIMIT)).toBe(
- 'FROM logs* | LIMIT 10000| LIMIT 5'
+ 'FROM logs* \n| LIMIT 10000| LIMIT 5'
);
expect(getESQLWithSafeLimit('FROM logs* | SORT @timestamp | LIMIT 5', LIMIT)).toBe(
- 'FROM logs* |SORT @timestamp | LIMIT 10000| LIMIT 5'
+ 'FROM logs* |SORT @timestamp \n| LIMIT 10000| LIMIT 5'
);
expect(getESQLWithSafeLimit('from logs* | STATS MIN(a) BY b', LIMIT)).toBe(
- 'from logs* | LIMIT 10000| STATS MIN(a) BY b'
+ 'from logs* \n| LIMIT 10000| STATS MIN(a) BY b'
);
});
});
diff --git a/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.ts b/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.ts
index e8b63b21dd1d4..793292909c68f 100644
--- a/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.ts
+++ b/packages/kbn-esql-utils/src/utils/get_esql_with_safe_limit.ts
@@ -26,7 +26,7 @@ export function getESQLWithSafeLimit(esql: string, limit: number): string {
return parts
.map((part, i) => {
if (i === index) {
- return `${part.trim()} | LIMIT ${limit}`;
+ return `${part.trim()} \n| LIMIT ${limit}`;
}
return part;
})
diff --git a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.test.ts b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.test.ts
index 8ebd9640302a2..eace3352a2267 100644
--- a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.test.ts
+++ b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.test.ts
@@ -5,7 +5,6 @@
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
-
import type { DataViewField } from '@kbn/data-views-plugin/common';
import { buildSearchFilter, fetchAndCalculateFieldStats } from './field_stats_utils_text_based';
@@ -74,11 +73,10 @@ describe('fieldStatsUtilsTextBased', function () {
"totalDocuments": 4,
}
`);
-
expect(searchHandler).toHaveBeenCalledWith(
expect.objectContaining({
query:
- 'from logs* | limit 1000| WHERE `message` IS NOT NULL\n | STATS `message_terms` = count(`message`) BY `message`\n | SORT `message_terms` DESC\n | LIMIT 10',
+ 'from logs* | limit 1000\n| WHERE `message` IS NOT NULL\n | STATS `message_terms` = count(`message`) BY `message`\n | SORT `message_terms` DESC\n | LIMIT 10',
})
);
});
@@ -121,7 +119,7 @@ describe('fieldStatsUtilsTextBased', function () {
expect(searchHandler).toHaveBeenCalledWith(
expect.objectContaining({
query:
- 'from logs* | limit 1000| WHERE `message` IS NOT NULL\n | KEEP `message`\n | LIMIT 100',
+ 'from logs* | limit 1000\n| WHERE `message` IS NOT NULL\n | KEEP `message`\n | LIMIT 100',
})
);
});
diff --git a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts
index a5f41853d6e33..4a194b9c4978f 100644
--- a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts
+++ b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts
@@ -7,6 +7,7 @@
*/
import type { ESQLSearchReponse } from '@kbn/es-types';
+import { appendToESQLQuery } from '@kbn/esql-utils';
import type { DataViewField } from '@kbn/data-views-plugin/common';
import type { FieldStatsResponse } from '../../types';
import {
@@ -74,14 +75,15 @@ export async function getStringTopValues(
size = DEFAULT_TOP_VALUES_SIZE
): Promise> {
const { searchHandler, field, esqlBaseQuery } = params;
- const esqlQuery =
- esqlBaseQuery +
- `| WHERE ${getSafeESQLFieldName(field.name)} IS NOT NULL
- | STATS ${getSafeESQLFieldName(`${field.name}_terms`)} = count(${getSafeESQLFieldName(
- field.name
- )}) BY ${getSafeESQLFieldName(field.name)}
- | SORT ${getSafeESQLFieldName(`${field.name}_terms`)} DESC
- | LIMIT ${size}`;
+ const safeEsqlFieldName = getSafeESQLFieldName(field.name);
+ const safeEsqlFieldNameTerms = getSafeESQLFieldName(`${field.name}_terms`);
+ const esqlQuery = appendToESQLQuery(
+ esqlBaseQuery,
+ `| WHERE ${safeEsqlFieldName} IS NOT NULL
+ | STATS ${safeEsqlFieldNameTerms} = count(${safeEsqlFieldName}) BY ${safeEsqlFieldName}
+ | SORT ${safeEsqlFieldNameTerms} DESC
+ | LIMIT ${size}`
+ );
const result = await searchHandler({ query: esqlQuery });
const values = result?.values as Array<[number, string]>;
@@ -111,11 +113,13 @@ export async function getSimpleTextExamples(
params: FetchAndCalculateFieldStatsParams
): Promise> {
const { searchHandler, field, esqlBaseQuery } = params;
- const esqlQuery =
- esqlBaseQuery +
- `| WHERE ${getSafeESQLFieldName(field.name)} IS NOT NULL
- | KEEP ${getSafeESQLFieldName(field.name)}
- | LIMIT ${SIMPLE_EXAMPLES_FETCH_SIZE}`;
+ const safeEsqlFieldName = getSafeESQLFieldName(field.name);
+ const esqlQuery = appendToESQLQuery(
+ esqlBaseQuery,
+ `| WHERE ${safeEsqlFieldName} IS NOT NULL
+ | KEEP ${safeEsqlFieldName}
+ | LIMIT ${SIMPLE_EXAMPLES_FETCH_SIZE}`
+ );
const result = await searchHandler({ query: esqlQuery });
const values = ((result?.values as Array<[string | string[]]>) || []).map((value) =>
diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
index 780069747a64a..3703439b32fca 100644
--- a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
+++ b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
@@ -763,7 +763,8 @@ describe('LensVisService attributes', () => {
it('should use the correct histogram query when no suggestion passed', async () => {
const histogramQuery = {
- esql: 'from logstash-* | limit 10 | EVAL timestamp=DATE_TRUNC(10 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as `@timestamp every 10 minute`',
+ esql: `from logstash-* | limit 10
+| EVAL timestamp=DATE_TRUNC(10 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as \`@timestamp every 10 minute\``,
};
const lensVis = await getLensVisMock({
filters,
diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts
index 7993f933a8054..5623ab17c4036 100644
--- a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts
+++ b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts
@@ -120,7 +120,8 @@ describe('LensVisService suggestions', () => {
expect(lensVis.currentSuggestionContext?.suggestion).toBeDefined();
const histogramQuery = {
- esql: 'from the-data-view | limit 100 | EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as `@timestamp every 30 minute`',
+ esql: `from the-data-view | limit 100
+| EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as \`@timestamp every 30 minute\``,
};
expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery);
@@ -157,7 +158,8 @@ describe('LensVisService suggestions', () => {
expect(lensVis.currentSuggestionContext?.suggestion).toBeDefined();
const histogramQuery = {
- esql: 'from the-data-view | limit 100 | EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as `@timestamp every 30 minute`',
+ esql: `from the-data-view | limit 100
+| EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp | rename timestamp as \`@timestamp every 30 minute\``,
};
expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery);
diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.ts
index e9844e13a337e..a78d3859da441 100644
--- a/src/plugins/unified_histogram/public/services/lens_vis_service.ts
+++ b/src/plugins/unified_histogram/public/services/lens_vis_service.ts
@@ -8,7 +8,7 @@
import { BehaviorSubject, distinctUntilChanged, map, Observable } from 'rxjs';
import { isEqual } from 'lodash';
-import { removeDropCommandsFromESQLQuery } from '@kbn/esql-utils';
+import { removeDropCommandsFromESQLQuery, appendToESQLQuery } from '@kbn/esql-utils';
import type { DataView, DataViewField } from '@kbn/data-views-plugin/common';
import type {
CountIndexPatternColumn,
@@ -513,7 +513,10 @@ export class LensVisService {
const queryInterval = interval ?? computeInterval(timeRange, this.services.data);
const language = getAggregateQueryMode(query);
const safeQuery = removeDropCommandsFromESQLQuery(query[language]);
- return `${safeQuery} | EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\``;
+ return appendToESQLQuery(
+ safeQuery,
+ `| EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\``
+ );
};
private getAllSuggestions = ({ queryParams }: { queryParams: QueryParams }): Suggestion[] => {
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts
index 76d990236562a..165e00624489b 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts
@@ -14,7 +14,7 @@ import { type UseCancellableSearch, useCancellableSearch } from '@kbn/ml-cancell
import type { estypes } from '@elastic/elasticsearch';
import type { ISearchOptions } from '@kbn/data-plugin/common';
import type { TimeBucketsInterval } from '@kbn/ml-time-buckets';
-import { getESQLWithSafeLimit, ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { getESQLWithSafeLimit, ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import { isDefined } from '@kbn/ml-is-defined';
import { OMIT_FIELDS } from '../../../../../common/constants';
import type {
@@ -82,14 +82,17 @@ const getESQLDocumentCountStats = async (
let latestMs = -Infinity;
if (timeFieldName) {
- const aggQuery = ` | EVAL _timestamp_= TO_DOUBLE(DATE_TRUNC(${intervalMs} millisecond, ${getSafeESQLName(
- timeFieldName
- )}))
- | stats rows = count(*) by _timestamp_`;
+ const aggQuery = appendToESQLQuery(
+ esqlBaseQuery,
+ ` | EVAL _timestamp_= TO_DOUBLE(DATE_TRUNC(${intervalMs} millisecond, ${getSafeESQLName(
+ timeFieldName
+ )}))
+ | stats rows = count(*) by _timestamp_`
+ );
const request = {
params: {
- query: esqlBaseQuery + aggQuery,
+ query: aggQuery,
...(filter ? { filter } : {}),
version: ESQL_LATEST_VERSION,
},
@@ -135,7 +138,7 @@ const getESQLDocumentCountStats = async (
// If not time field, get the total count
const request = {
params: {
- query: esqlBaseQuery + ' | STATS _count_ = COUNT(*) | LIMIT 1',
+ query: appendToESQLQuery(esqlBaseQuery, ' | STATS _count_ = COUNT(*) | LIMIT 1'),
...(filter ? { filter } : {}),
version: ESQL_LATEST_VERSION,
},
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts
index 6cba632d4b7f7..69e40a00dc9f4 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts
@@ -9,7 +9,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search';
import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types';
import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common';
import pLimit from 'p-limit';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import type { Column } from '../../hooks/esql/use_esql_overall_stats_data';
import { getSafeESQLName } from '../requests/esql_utils';
import { isFulfilled, isRejected } from '../../../common/util/promise_all_settled_utils';
@@ -35,16 +35,19 @@ export const getESQLBooleanFieldStats = async ({
const booleanFields = columns
.filter((f) => f.secondaryType === 'boolean')
.map((field) => {
- const query = `| STATS ${getSafeESQLName(`${field.name}_terms`)} = count(${getSafeESQLName(
- field.name
- )}) BY ${getSafeESQLName(field.name)}
- | LIMIT 3`;
+ const query = appendToESQLQuery(
+ esqlBaseQuery,
+ `| STATS ${getSafeESQLName(`${field.name}_terms`)} = count(${getSafeESQLName(
+ field.name
+ )}) BY ${getSafeESQLName(field.name)}
+ | LIMIT 3`
+ );
return {
field,
request: {
params: {
- query: esqlBaseQuery + query,
+ query,
...(filter ? { filter } : {}),
version: ESQL_LATEST_VERSION,
},
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts
index 50986ffbfdab7..d68696abb3826 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts
@@ -9,7 +9,7 @@ import pLimit from 'p-limit';
import { chunk } from 'lodash';
import { isDefined } from '@kbn/ml-is-defined';
import type { ESQLSearchReponse } from '@kbn/es-types';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import type { UseCancellableSearch } from '@kbn/ml-cancellable-search';
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { i18n } from '@kbn/i18n';
@@ -100,8 +100,10 @@ const getESQLOverallStatsInChunk = async ({
let countQuery = fieldsToFetch.length > 0 ? '| STATS ' : '';
countQuery += fieldsToFetch.map((field) => field.query).join(',');
-
- const query = esqlBaseQueryWithLimit + (evalQuery ? ' | EVAL ' + evalQuery : '') + countQuery;
+ const query = appendToESQLQuery(
+ esqlBaseQueryWithLimit,
+ (evalQuery ? ' | EVAL ' + evalQuery : '') + countQuery
+ );
const request = {
params: {
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts
index 846aadf7e17ad..5366a2266af66 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts
@@ -8,7 +8,7 @@
import type { UseCancellableSearch } from '@kbn/ml-cancellable-search';
import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types';
import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import type { Column } from '../../hooks/esql/use_esql_overall_stats_data';
import { getSafeESQLName } from '../requests/esql_utils';
import type { DateFieldStats, FieldStatsError } from '../../../../../common/types/field_stats';
@@ -37,9 +37,10 @@ export const getESQLDateFieldStats = async ({
if (dateFields.length > 0) {
const dateStatsQuery = ' | STATS ' + dateFields.map(({ query }) => query).join(',');
+ const query = appendToESQLQuery(esqlBaseQuery, dateStatsQuery);
const request = {
params: {
- query: esqlBaseQuery + dateStatsQuery,
+ query,
...(filter ? { filter } : {}),
version: ESQL_LATEST_VERSION,
},
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts
index 42f079c9b1676..a6eed452c1a48 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts
@@ -9,7 +9,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search';
import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types';
import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common';
import pLimit from 'p-limit';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import type { Column } from '../../hooks/esql/use_esql_overall_stats_data';
import { getSafeESQLName } from '../requests/esql_utils';
import { isFulfilled, isRejected } from '../../../common/util/promise_all_settled_utils';
@@ -32,14 +32,15 @@ export const getESQLKeywordFieldStats = async ({
const limiter = pLimit(MAX_CONCURRENT_REQUESTS);
const keywordFields = columns.map((field) => {
- const query =
- esqlBaseQuery +
+ const query = appendToESQLQuery(
+ esqlBaseQuery,
`| STATS ${getSafeESQLName(`${field.name}_in_records`)} = count(MV_MIN(${getSafeESQLName(
field.name
)})), ${getSafeESQLName(`${field.name}_in_values`)} = count(${getSafeESQLName(field.name)})
- BY ${getSafeESQLName(field.name)}
- | SORT ${getSafeESQLName(`${field.name}_in_records`)} DESC
- | LIMIT 10`;
+ BY ${getSafeESQLName(field.name)}
+ | SORT ${getSafeESQLName(`${field.name}_in_records`)} DESC
+ | LIMIT 10`
+ );
return {
field,
request: {
diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts
index 615d07abc4066..f9ee1d2c65007 100644
--- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts
+++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts
@@ -8,7 +8,7 @@
import type { UseCancellableSearch } from '@kbn/ml-cancellable-search';
import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types';
import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils';
import { chunk } from 'lodash';
import pLimit from 'p-limit';
import type { Column } from '../../hooks/esql/use_esql_overall_stats_data';
@@ -66,9 +66,10 @@ const getESQLNumericFieldStatsInChunk = async ({
if (numericFields.length > 0) {
const numericStatsQuery = '| STATS ' + numericFields.map(({ query }) => query).join(',');
+ const query = appendToESQLQuery(esqlBaseQuery, numericStatsQuery);
const request = {
params: {
- query: esqlBaseQuery + numericStatsQuery,
+ query,
...(filter ? { filter } : {}),
version: ESQL_LATEST_VERSION,
},
From a902bac9a5582d8b1f514ebf774d7a5e9edfaa59 Mon Sep 17 00:00:00 2001
From: Alex Szabo
Date: Tue, 23 Apr 2024 08:42:26 +0200
Subject: [PATCH 049/183] [BK] Add purge hourly schedule (#181374)
## Summary
This was left out during the initial migration.
https://github.com/elastic/kibana-buildkite/blob/ddd478c70bc0b27631e9220f2505633ecbf7c357/pipelines/kibana-purge-cloud-deployments.tf#L35
---
.../kibana-purge-cloud-deployments.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml
index a8e6b46f7d3ca..575f895d77980 100644
--- a/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml
+++ b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml
@@ -34,6 +34,11 @@ spec:
build_tags: false
prefix_pull_request_fork_branch_names: false
skip_pull_request_builds_for_existing_commits: true
+ schedules:
+ Purge cloud deployments (hourly):
+ cronline: 0 * * * * America/New_York
+ branch: main
+ message: 'Purge cloud deployments'
teams:
kibana-operations:
access_level: MANAGE_BUILD_AND_READ
From 6cdb0ea62b5ddd869260f31ee7aa38fbfa964677 Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Tue, 23 Apr 2024 02:50:17 -0400
Subject: [PATCH 050/183] [Observability Onboarding] Add link back to
onboarding from integrations (#181195)
# Summary
Resolves #180824.
## Fleet Changes
It was noted that, when linking to the Integrations page from
Onboarding, the `Back to integrations` link will navigate the user to
the main Integrations search page within the Fleet UI. In cases where we
direct the user to an integration's page from Observability Onboarding,
this completely breaks the flow. The goal of this PR is to introduce, as
transparently as possible, some special functionality to pick up a link
as a query param and replace the standard back link with the custom one
when it is present. This also includes a copy change, per the linked
issue.
### Card CSS change
As a side note, this adds some custom CSS to the `PackageCard`
component. This is because we added this notion of `Collections` to the
cards, but the `footer` prop is not available when the cards are in
`horizontal` mode.
I spoke to EUI about this and it is possible this will become a standard
convention in the future. My original intent was to include this custom
CSS conditionally, but because ReactWindow is somewhat rigid with
conditionally-applied styles it seemed to only work when the CSS was
applied to all items.
#### Looks ok when card content is uniform
#### Only looks like this when the custom CSS is applied
## Onboarding Changes
There's a new query param, `search`, that will update with the changes
the user makes to the search query for the complete integrations list.
This and the `category` param are included in the link when they're
defined, so when the user navigates to the integration's page, if they
click the link back the original state of the page will repopulate.
## Testing
The original functionality of using integrations from the Fleet UI
should remain completely unchanged. Things to check:
1. Integration cards render in the exact same way as they did before, or
with acceptable differences WRT the flex usage. In my testing, I didn't
notice any perceptible difference, but I likely did not cover all cases
of card rendering
1. Links back to the integrations UI continue to work the same as before
1. Links from Onboarding to Integrations will preserve state and cause
the back link to say "Back to selection" instead of "Back to
integrations"
## Demo GIFs
### Onboarding Flow
![20240418135239](https://github.com/elastic/kibana/assets/18429259/4e8a37c8-b5d4-43d0-8602-751658de71a7)
### Integrations Flow
![20240418135536](https://github.com/elastic/kibana/assets/18429259/0dac4cc3-6c5f-435d-83d3-4111763ee075)
---------
Co-authored-by: Joe Reuter
---
.../sections/epm/components/package_card.tsx | 13 ++++
.../detail/components/back_link.test.tsx | 44 +++++++++++++
.../screens/detail/components/back_link.tsx | 45 +++++++++++++
.../epm/screens/detail/components/index.tsx | 1 +
.../sections/epm/screens/detail/index.tsx | 11 +---
.../onboarding_flow_form.tsx | 33 ++++++++--
.../application/packages_list/index.tsx | 6 ++
.../use_integration_card_list.test.ts | 65 +++++++++++++++++++
.../use_integration_card_list.ts | 56 ++++++++++++++--
.../observability_onboarding/public/common.ts | 8 +++
.../observability_onboarding/public/plugin.ts | 3 +-
11 files changed, 267 insertions(+), 18 deletions(-)
create mode 100644 x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/back_link.test.tsx
create mode 100644 x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/back_link.tsx
create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.test.ts
create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/common.ts
diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx
index bf03648f442c9..474ffe2e4db70 100644
--- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx
+++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx
@@ -16,6 +16,7 @@ import {
EuiSpacer,
EuiToolTip,
} from '@elastic/eui';
+import { css } from '@emotion/react';
import { TrackApplicationView } from '@kbn/usage-collection-plugin/public';
@@ -175,6 +176,18 @@ export function PackageCard({
>
{
+ it('renders back to selection link', () => {
+ const expectedUrl = '/app/experimental-onboarding';
+ const queryParams = new URLSearchParams();
+ queryParams.set('observabilityOnboardingLink', expectedUrl);
+ const { getByText, getByRole } = render(
+
+ );
+ expect(getByText('Back to selection')).toBeInTheDocument();
+ expect(getByRole('link').getAttribute('href')).toBe(expectedUrl);
+ });
+
+ it('renders back to selection link with params', () => {
+ const expectedUrl = '/app/experimental-onboarding&search=aws&category=infra';
+ const queryParams = new URLSearchParams();
+ queryParams.set('observabilityOnboardingLink', expectedUrl);
+ const { getByText, getByRole } = render(
+
+ );
+ expect(getByText('Back to selection')).toBeInTheDocument();
+ expect(getByRole('link').getAttribute('href')).toBe(expectedUrl);
+ });
+
+ it('renders back to integrations link', () => {
+ const queryParams = new URLSearchParams();
+ const { getByText, getByRole } = render(
+
+ );
+ expect(getByText('Back to integrations')).toBeInTheDocument();
+ expect(getByRole('link').getAttribute('href')).toBe('/app/integrations');
+ });
+});
diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/back_link.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/back_link.tsx
new file mode 100644
index 0000000000000..081b78de8ec51
--- /dev/null
+++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/back_link.tsx
@@ -0,0 +1,45 @@
+/*
+ * 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 { EuiButtonEmpty } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
+import React, { useMemo } from 'react';
+
+interface Props {
+ queryParams: URLSearchParams;
+ href: string;
+}
+
+export function BackLink({ queryParams, href: integrationsHref }: Props) {
+ const { onboardingLink } = useMemo(() => {
+ return {
+ onboardingLink: queryParams.get('observabilityOnboardingLink'),
+ };
+ }, [queryParams]);
+ const href = onboardingLink ?? integrationsHref;
+ const message = onboardingLink ? BACK_TO_SELECTION : BACK_TO_INTEGRATIONS;
+
+ return (
+
+ {message}
+
+ );
+}
+
+const BACK_TO_INTEGRATIONS = (
+
+);
+
+const BACK_TO_SELECTION = (
+
+);
diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/index.tsx
index c0438bf6dfe8d..4aa1a543897c9 100644
--- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/index.tsx
+++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/components/index.tsx
@@ -4,6 +4,7 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
+export { BackLink } from './back_link';
export { AddIntegrationButton } from './add_integration_button';
export { UpdateIcon } from './update_icon';
export { IntegrationAgentPolicyCount } from './integration_agent_policy_count';
diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx
index 54ca058865fdf..0a2fc69a69366 100644
--- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx
+++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx
@@ -12,7 +12,6 @@ import { Routes, Route } from '@kbn/shared-ux-router';
import styled from 'styled-components';
import {
EuiBadge,
- EuiButtonEmpty,
EuiCallOut,
EuiDescriptionList,
EuiDescriptionListDescription,
@@ -71,6 +70,7 @@ import { DeferredAssetsWarning } from './assets/deferred_assets_warning';
import { useIsFirstTimeAgentUserQuery } from './hooks';
import { getInstallPkgRouteOptions } from './utils';
import {
+ BackLink,
IntegrationAgentPolicyCount,
UpdateIcon,
IconPanel,
@@ -314,12 +314,7 @@ export function Detail() {
{/* Allows button to break out of full width */}
-
-
-
+
@@ -366,7 +361,7 @@ export function Detail() {
),
- [integrationInfo, isLoading, packageInfo, href]
+ [integrationInfo, isLoading, packageInfo, href, queryParams]
);
const handleAddIntegrationPolicyClick = useCallback(
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
index 6a1a062e5a7e1..e5977ff0172c7 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
@@ -6,7 +6,7 @@
*/
import { i18n } from '@kbn/i18n';
-import React, { useCallback, useState } from 'react';
+import React, { useCallback, useEffect, useState } from 'react';
import { FormattedMessage } from '@kbn/i18n-react';
import type { FunctionComponent } from 'react';
import {
@@ -81,8 +81,21 @@ export const OnboardingFlowForm: FunctionComponent = () => {
const radioGroupId = useGeneratedHtmlId({ prefix: 'onboardingCategory' });
const [searchParams, setSearchParams] = useSearchParams();
+
const packageListRef = React.useRef(null);
- const [integrationSearch, setIntegrationSearch] = useState('');
+ const [integrationSearch, setIntegrationSearch] = useState(searchParams.get('search') ?? '');
+
+ useEffect(() => {
+ const searchParam = searchParams.get('search') ?? '';
+ if (integrationSearch === searchParam) return;
+ const entries: Record = Object.fromEntries(searchParams.entries());
+ if (integrationSearch) {
+ entries.search = integrationSearch;
+ } else {
+ delete entries.search;
+ }
+ setSearchParams(entries, { replace: true });
+ }, [integrationSearch, searchParams, setSearchParams]);
const createCollectionCardHandler = useCallback(
(query: string) => () => {
@@ -97,7 +110,7 @@ export const OnboardingFlowForm: FunctionComponent = () => {
);
}
},
- [setIntegrationSearch]
+ []
);
const customCards = useCustomCardsForCategory(
@@ -153,7 +166,13 @@ export const OnboardingFlowForm: FunctionComponent = () => {
/>
- {Array.isArray(customCards) && }
+ {Array.isArray(customCards) && (
+
+ )}
{
type === 'generated')}
+ customCards={customCards?.filter(
+ (card) => card.type === 'generated' && !card.isCollectionCard
+ )}
joinCardLists
/>
>
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index 85627f9411bf3..135e4650ccc09 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -32,6 +32,8 @@ interface Props {
packageListRef?: React.Ref;
searchQuery?: string;
setSearchQuery?: React.Dispatch>;
+ flowCategory?: string | null;
+ flowSearch?: string;
/**
* When enabled, custom and integration cards are joined into a single list.
*/
@@ -52,6 +54,8 @@ const PackageListGridWrapper = ({
searchQuery,
setSearchQuery,
customCards,
+ flowCategory,
+ flowSearch,
joinCardLists = false,
}: WrapperProps) => {
const customMargin = useCustomMargin();
@@ -63,6 +67,8 @@ const PackageListGridWrapper = ({
filteredCards,
selectedCategory,
customCards,
+ flowCategory,
+ flowSearch,
joinCardLists
);
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.test.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.test.ts
new file mode 100644
index 0000000000000..076f4585e2667
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.test.ts
@@ -0,0 +1,65 @@
+/*
+ * 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 { addPathParamToUrl, toOnboardingPath } from './use_integration_card_list';
+
+describe('useIntegratrionCardList', () => {
+ describe('toOnboardingPath', () => {
+ it('returns null if no `basePath` is defined', () => {
+ expect(toOnboardingPath({})).toBeNull();
+ });
+ it('returns just the `basePath` if no category or search is defined', () => {
+ expect(toOnboardingPath({ basePath: '' })).toBe('/app/experimental-onboarding');
+ expect(toOnboardingPath({ basePath: '/s/custom_space_name' })).toBe(
+ '/s/custom_space_name/app/experimental-onboarding'
+ );
+ });
+ it('includes category in the URL', () => {
+ expect(toOnboardingPath({ basePath: '/s/custom_space_name', category: 'logs' })).toBe(
+ '/s/custom_space_name/app/experimental-onboarding?category=logs'
+ );
+ expect(toOnboardingPath({ basePath: '', category: 'infra' })).toBe(
+ '/app/experimental-onboarding?category=infra'
+ );
+ });
+ it('includes search in the URL', () => {
+ expect(toOnboardingPath({ basePath: '/s/custom_space_name', search: 'search' })).toBe(
+ '/s/custom_space_name/app/experimental-onboarding?search=search'
+ );
+ });
+ it('includes category and search in the URL', () => {
+ expect(
+ toOnboardingPath({ basePath: '/s/custom_space_name', category: 'logs', search: 'search' })
+ ).toBe('/s/custom_space_name/app/experimental-onboarding?category=logs&search=search');
+ expect(toOnboardingPath({ basePath: '', category: 'infra', search: 'search' })).toBe(
+ '/app/experimental-onboarding?category=infra&search=search'
+ );
+ });
+ });
+ describe('addPathParamToUrl', () => {
+ it('adds the onboarding link to url with existing params', () => {
+ expect(
+ addPathParamToUrl(
+ '/app/integrations?query-1',
+ '/app/experimental-onboarding?search=aws&category=infra'
+ )
+ ).toBe(
+ '/app/integrations?query-1&observabilityOnboardingLink=%2Fapp%2Fexperimental-onboarding%3Fsearch%3Daws%26category%3Dinfra'
+ );
+ });
+ it('adds the onboarding link to url without existing params', () => {
+ expect(
+ addPathParamToUrl(
+ '/app/integrations',
+ '/app/experimental-onboarding?search=aws&category=infra'
+ )
+ ).toBe(
+ '/app/integrations?observabilityOnboardingLink=%2Fapp%2Fexperimental-onboarding%3Fsearch%3Daws%26category%3Dinfra'
+ );
+ });
+ });
+});
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
index 8d5a275a4523b..4d52856ce5551 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
@@ -7,9 +7,50 @@
import { useMemo } from 'react';
import { IntegrationCardItem } from '@kbn/fleet-plugin/public';
+import { useKibana } from '@kbn/kibana-react-plugin/public';
import { CustomCard } from './types';
+import { EXPERIMENTAL_ONBOARDING_APP_ROUTE } from '../../common';
import { toCustomCard } from './utils';
+export function toOnboardingPath({
+ basePath,
+ category,
+ search,
+}: {
+ basePath?: string;
+ category?: string | null;
+ search?: string;
+}): string | null {
+ if (typeof basePath !== 'string' && !basePath) return null;
+ const path = `${basePath}${EXPERIMENTAL_ONBOARDING_APP_ROUTE}`;
+ if (!category && !search) return path;
+ const params = new URLSearchParams();
+ if (category) params.append('category', category);
+ if (search) params.append('search', search);
+ return `${path}?${params.toString()}`;
+}
+
+export function addPathParamToUrl(url: string, onboardingLink: string) {
+ const encoded = encodeURIComponent(onboardingLink);
+ if (url.indexOf('?') >= 0) {
+ return `${url}&observabilityOnboardingLink=${encoded}`;
+ }
+ return `${url}?observabilityOnboardingLink=${encoded}`;
+}
+
+function useCardUrlRewrite(props: { category?: string | null; search?: string }) {
+ const kibana = useKibana();
+ const basePath = kibana.services.http?.basePath.get();
+ const onboardingLink = useMemo(() => toOnboardingPath({ basePath, ...props }), [basePath, props]);
+ return (card: IntegrationCardItem) => ({
+ ...card,
+ url:
+ card.url.indexOf('/app/integrations') >= 0 && onboardingLink
+ ? addPathParamToUrl(card.url, onboardingLink)
+ : card.url,
+ });
+}
+
function extractFeaturedCards(filteredCards: IntegrationCardItem[], featuredCardNames?: string[]) {
const featuredCards: Record = {};
filteredCards.forEach((card) => {
@@ -21,21 +62,23 @@ function extractFeaturedCards(filteredCards: IntegrationCardItem[], featuredCard
}
function formatCustomCards(
+ rewriteUrl: (card: IntegrationCardItem) => IntegrationCardItem,
customCards: CustomCard[],
featuredCards: Record
) {
const cards: IntegrationCardItem[] = [];
for (const card of customCards) {
if (card.type === 'featured' && !!featuredCards[card.name]) {
- cards.push(toCustomCard(featuredCards[card.name]!));
+ cards.push(toCustomCard(rewriteUrl(featuredCards[card.name]!)));
} else if (card.type === 'generated') {
- cards.push(toCustomCard(card));
+ cards.push(toCustomCard(rewriteUrl(card)));
}
}
return cards;
}
function useFilteredCards(
+ rewriteUrl: (card: IntegrationCardItem) => IntegrationCardItem,
integrationsList: IntegrationCardItem[],
selectedCategory: string,
customCards?: CustomCard[]
@@ -43,6 +86,7 @@ function useFilteredCards(
return useMemo(() => {
const integrationCards = integrationsList
.filter((card) => card.categories.includes(selectedCategory))
+ .map(rewriteUrl)
.map(toCustomCard);
if (!customCards) {
@@ -56,7 +100,7 @@ function useFilteredCards(
),
integrationCards,
};
- }, [integrationsList, customCards, selectedCategory]);
+ }, [integrationsList, customCards, selectedCategory, rewriteUrl]);
}
/**
@@ -71,16 +115,20 @@ export function useIntegrationCardList(
integrationsList: IntegrationCardItem[],
selectedCategory = 'observability',
customCards?: CustomCard[],
+ flowCategory?: string | null,
+ flowSearch?: string,
fullList = false
): IntegrationCardItem[] {
+ const rewriteUrl = useCardUrlRewrite({ category: flowCategory, search: flowSearch });
const { featuredCards, integrationCards } = useFilteredCards(
+ rewriteUrl,
integrationsList,
selectedCategory,
customCards
);
if (customCards && customCards.length > 0) {
- const formattedCustomCards = formatCustomCards(customCards, featuredCards);
+ const formattedCustomCards = formatCustomCards(rewriteUrl, customCards, featuredCards);
if (fullList) {
return [...formattedCustomCards, ...integrationCards] as IntegrationCardItem[];
}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/common.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/common.ts
new file mode 100644
index 0000000000000..110aeeebcd1c6
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/common.ts
@@ -0,0 +1,8 @@
+/*
+ * 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.
+ */
+
+export const EXPERIMENTAL_ONBOARDING_APP_ROUTE = '/app/experimental-onboarding';
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts
index c83c26e3bf486..fd17f18085331 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts
@@ -27,6 +27,7 @@ import { ObservabilityOnboardingLocatorDefinition } from './locators/onboarding_
import { ObservabilityOnboardingPluginLocators } from './locators';
import { ConfigSchema } from '.';
import { OBSERVABILITY_ONBOARDING_TELEMETRY_EVENT } from '../common/telemetry_events';
+import { EXPERIMENTAL_ONBOARDING_APP_ROUTE } from './common';
export type ObservabilityOnboardingPluginSetup = void;
export type ObservabilityOnboardingPluginStart = void;
@@ -115,7 +116,7 @@ export class ObservabilityOnboardingPlugin
core.application.register({
id: `${PLUGIN_ID}_EXPERIMENTAL`,
title: 'Observability Onboarding (Beta)',
- appRoute: '/app/experimental-onboarding',
+ appRoute: EXPERIMENTAL_ONBOARDING_APP_ROUTE,
order: 8500,
euiIconType: 'logoObservability',
category: DEFAULT_APP_CATEGORIES.observability,
From 89057406e0aaf4015ffc511b69a7b6186448e777 Mon Sep 17 00:00:00 2001
From: Shahzad
Date: Tue, 23 Apr 2024 09:32:06 +0200
Subject: [PATCH 051/183] [SLOs] Remove tech preview from burn rate (#181342)
## Summary
Remove tech preview from burn rate !!
---
.../components/slo/burn_rate/burn_rates.tsx | 24 +++++++------------
1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/burn_rate/burn_rates.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/burn_rate/burn_rates.tsx
index d836ebc931631..b6c828f9a4df6 100644
--- a/x-pack/plugins/observability_solution/slo/public/components/slo/burn_rate/burn_rates.tsx
+++ b/x-pack/plugins/observability_solution/slo/public/components/slo/burn_rate/burn_rates.tsx
@@ -13,7 +13,6 @@ import React, { useEffect, useState } from 'react';
import { useFetchSloBurnRates } from '../../../hooks/use_fetch_slo_burn_rates';
import { ErrorRateChart } from '../error_rate_chart';
import { BurnRate } from './burn_rate';
-import { TechnicalPreviewBadge } from '../../technical_preview_badge';
interface Props {
slo: SLOWithSummaryResponse;
@@ -66,20 +65,15 @@ export function BurnRates({ slo, isAutoRefreshing, burnRateOptions }: Props) {
-
-
-
-
- {i18n.translate('xpack.slo.burnRate.title', {
- defaultMessage: 'Burn rate',
- })}
-
-
-
-
-
-
-
+
+
+
+ {i18n.translate('xpack.slo.burnRate.title', {
+ defaultMessage: 'Burn rate',
+ })}
+
+
+
Date: Tue, 23 Apr 2024 10:35:56 +0200
Subject: [PATCH 052/183] [Serverless] Use new `monitoring` config (#181336)
---
config/serverless.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/serverless.yml b/config/serverless.yml
index a87d7a2913bfe..7e18b184468ef 100644
--- a/config/serverless.yml
+++ b/config/serverless.yml
@@ -151,8 +151,8 @@ xpack.reporting.statefulSettings.enabled: false
# Disabled Observability plugins
xpack.ux.enabled: false
-xpack.monitoring.enabled: false
xpack.legacy_uptime.enabled: false
+monitoring.enabled: false
monitoring.ui.enabled: false
## Enable uiSettings validations
From 9ce171cbe876c2e3f3a45fdfa741e142e88ec376 Mon Sep 17 00:00:00 2001
From: Walter Rafelsberger
Date: Tue, 23 Apr 2024 10:42:27 +0200
Subject: [PATCH 053/183] [ML] Replaces jQuery's `$el.width()` with
`element.clientWidth`. (#180523)
## Summary
Gets rid of leftover usage of jQuery. Replaces jQuery `$el.width()` with
`element.clientWidth` that was used in the Anomaly Explorer chart for
rare detectors.
I updated the jest test for the component to return timestamps that
result in a reasonable amount of ticks. A jest `spy` was added to mock
`clientWidth` which is not available via `jsdom` because it lacks a
layout engine.
### Checklist
- [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] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---
.../__mocks__/mock_chart_data_rare.js | 10 +++++-----
.../__mocks__/mock_series_config_rare.json | 8 ++++----
.../explorer_chart_distribution.js | 5 +----
.../explorer_chart_distribution.test.js | 20 ++++++++-----------
.../explorer_chart_single_metric.js | 5 +----
.../explorer_chart_single_metric.test.js | 4 ++--
6 files changed, 21 insertions(+), 31 deletions(-)
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_chart_data_rare.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_chart_data_rare.js
index ff42c97c6c2ca..9b48441733215 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_chart_data_rare.js
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_chart_data_rare.js
@@ -7,27 +7,27 @@
export const chartData = [
{
- date: 1487899800000,
+ date: 1709262000000,
entity: '200',
value: 1741.5652200000002,
},
{
- date: 1487899800000,
+ date: 1709262000000,
entity: '404',
value: 494.30564000000004,
},
{
- date: 1487899800000,
+ date: 1709262000000,
entity: '304',
value: 160.93672,
},
{
- date: 1487899800000,
+ date: 1709262000000,
entity: '301',
value: 57.4774,
},
{
- date: 1487837700000,
+ date: 1708668000000,
value: 42,
entity: '303',
anomalyScore: 84.08759,
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_series_config_rare.json b/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_series_config_rare.json
index bf93979f745bb..0988bfe1297d1 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_series_config_rare.json
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/__mocks__/mock_series_config_rare.json
@@ -44,10 +44,10 @@
]
},
"loading": false,
- "plotEarliest": 1487774250000,
- "plotLatest": 1487900250000,
- "selectedEarliest": 1487836800000,
- "selectedLatest": 1487837699999,
+ "plotEarliest": 1708171200000,
+ "plotLatest": 1709294400000,
+ "selectedEarliest": 1708646400000,
+ "selectedLatest": 1708819200000,
"chartLimits": {
"max": 9294.095580000001,
"min": 5.74774
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js
index 54c079c745cd2..f1794e812cc7e 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js
@@ -14,7 +14,6 @@ import PropTypes from 'prop-types';
import React from 'react';
import d3 from 'd3';
-import $ from 'jquery';
import moment from 'moment';
import { i18n } from '@kbn/i18n';
@@ -117,14 +116,12 @@ export class ExplorerChartDistribution extends React.Component {
drawRareChart(filteredChartData);
function init({ chartData, functionDescription }) {
- const $el = $('.ml-explorer-chart');
-
// Clear any existing elements from the visualization,
// then build the svg elements for the chart.
const chartElement = d3.select(element).select('.content-wrapper');
chartElement.select('svg').remove();
- const svgWidth = $el.width();
+ const svgWidth = element.clientWidth;
const svgHeight = chartHeight + margin.top + margin.bottom;
const svg = chartElement
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js
index 123c377506d4a..ee0c2c41074e0 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js
@@ -25,14 +25,6 @@ const utilityProps = {
},
};
-const servicesMock = {
- mlServices: {
- mlFieldFormatService: {
- getFieldFormat: jest.fn(),
- },
- },
-};
-
describe('ExplorerChart', () => {
const mlSelectSeverityServiceMock = {
state: {
@@ -54,10 +46,11 @@ describe('ExplorerChart', () => {
};
const wrapper = mountWithIntl(
-
+
@@ -81,11 +74,12 @@ describe('ExplorerChart', () => {
};
const wrapper = mountWithIntl(
-
+
@@ -106,6 +100,7 @@ describe('ExplorerChart', () => {
const config = {
...seriesConfig,
chartData,
+ chartLimits: { min: 201039318, max: 625736376 },
};
const mockTooltipService = {
@@ -115,12 +110,13 @@ describe('ExplorerChart', () => {
// We create the element including a wrapper which sets the width:
return mountWithIntl(
-
+
@@ -156,7 +152,7 @@ describe('ExplorerChart', () => {
expect(+selectedInterval.getAttribute('height')).toBe(166);
const xAxisTicks = wrapper.getDOMNode().querySelector('.x').querySelectorAll('.tick');
- expect([...xAxisTicks]).toHaveLength(1);
+ expect([...xAxisTicks]).toHaveLength(6);
const yAxisTicks = wrapper.getDOMNode().querySelector('.y').querySelectorAll('.tick');
expect([...yAxisTicks]).toHaveLength(5);
const emphasizedAxisLabel = wrapper
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js
index 82c7fb4eb4daf..3291307710cb2 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js
@@ -14,7 +14,6 @@ import PropTypes from 'prop-types';
import React from 'react';
import d3 from 'd3';
-import $ from 'jquery';
import moment from 'moment';
import { i18n } from '@kbn/i18n';
@@ -107,14 +106,12 @@ export class ExplorerChartSingleMetric extends React.Component {
drawLineChart(config.chartData);
function init(chartLimits) {
- const $el = $('.ml-explorer-chart');
-
// Clear any existing elements from the visualization,
// then build the svg elements for the chart.
const chartElement = d3.select(element).select(`.${CONTENT_WRAPPER_CLASS}`);
chartElement.select('svg').remove();
- const svgWidth = $el.width();
+ const svgWidth = element.clientWidth;
const svgHeight = chartHeight + margin.top + margin.bottom;
const svg = chartElement
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js
index baaca53324a72..063762972e268 100644
--- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js
+++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js
@@ -152,7 +152,7 @@ describe('ExplorerChart', () => {
expect(+selectedInterval.getAttribute('height')).toBe(166);
const xAxisTicks = wrapper.getDOMNode().querySelector('.x').querySelectorAll('.tick');
- expect([...xAxisTicks]).toHaveLength(1);
+ expect([...xAxisTicks]).toHaveLength(8);
const yAxisTicks = wrapper.getDOMNode().querySelector('.y').querySelectorAll('.tick');
expect([...yAxisTicks]).toHaveLength(10);
@@ -161,7 +161,7 @@ describe('ExplorerChart', () => {
expect(paths[1].getAttribute('class')).toBe('domain');
expect(paths[2].getAttribute('class')).toBe('values-line');
expect(paths[2].getAttribute('d')).toBe(
- 'MNaN,159.33024504444444ZMNaN,9.166257955555556LNaN,169.60736875555557'
+ 'M-19.090909090909093,159.33024504444444ZM-20,9.166257955555556L-20.22727272727273,169.60736875555557'
);
const dots = wrapper.getDOMNode().querySelector('.values-dots').querySelectorAll('circle');
From 78da1e1b49ea1131069ee668aa3885222a02ad96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?=
Date: Tue, 23 Apr 2024 10:49:06 +0200
Subject: [PATCH 054/183] [EDR Workflow] Fix policy details FTRs (#181321)
## Summary
This PR unskips some skipped Policy Details functional tests. They were
not flaky, they failed due to changed behaviour: no confirmation modal
is shown to the user when leaving Policy Details editor, if no changes
were made. (I think this is the related PR:
https://github.com/elastic/kibana/pull/147470)
---
.../apps/integrations/policy_details.ts | 48 +++++++------------
1 file changed, 16 insertions(+), 32 deletions(-)
diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts
index b48c64b5e9dd4..a86ba58556060 100644
--- a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts
+++ b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts
@@ -375,38 +375,22 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
);
});
- // Failing: See https://github.com/elastic/kibana/issues/138776
- it.skip('should show trusted apps card and link should go back to policy', async () => {
- await testSubjects.existOrFail('trustedApps-fleet-integration-card');
- await (await testSubjects.find('trustedApps-link-to-exceptions')).click();
- await (await testSubjects.find('confirmModalConfirmButton')).click(); // Fleet show a confirm modal on unsaved changes
- await testSubjects.existOrFail('policyDetailsPage');
- await (await testSubjects.find('policyDetailsBackLink')).click();
- await testSubjects.existOrFail('endpointIntegrationPolicyForm');
- });
- it.skip('should show event filters card and link should go back to policy', async () => {
- await testSubjects.existOrFail('eventFilters-fleet-integration-card');
- const eventFiltersCard = await testSubjects.find('eventFilters-fleet-integration-card');
- await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow(eventFiltersCard);
- await (await testSubjects.find('eventFilters-link-to-exceptions')).click();
- await (await testSubjects.find('confirmModalConfirmButton')).click(); // Fleet show a confirm modal on unsaved changes
- await testSubjects.existOrFail('policyDetailsPage');
- await (await testSubjects.find('policyDetailsBackLink')).click();
- await testSubjects.existOrFail('endpointIntegrationPolicyForm');
- });
- it.skip('should show blocklists card and link should go back to policy', async () => {
- await testSubjects.existOrFail('blocklists-fleet-integration-card');
- const blocklistsCard = await testSubjects.find('blocklists-fleet-integration-card');
- await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow(blocklistsCard);
- await (await testSubjects.find('blocklists-link-to-exceptions')).click();
- await (await testSubjects.find('confirmModalConfirmButton')).click(); // Fleet show a confirm modal on unsaved changes
- await testSubjects.existOrFail('policyDetailsPage');
- await (await testSubjects.find('policyDetailsBackLink')).click();
- await testSubjects.existOrFail('endpointIntegrationPolicyForm');
- });
- it.skip('should not show host isolation exceptions card because no entries', async () => {
- await testSubjects.missingOrFail('hostIsolationExceptions-fleet-integration-card');
- });
+ ['trustedApps', 'eventFilters', 'blocklists', 'hostIsolationExceptions'].forEach(
+ (cardName) => {
+ it(`should show ${cardName} card and link should go back to policy`, async () => {
+ await testSubjects.existOrFail(`${cardName}-fleet-integration-card`);
+
+ const card = await testSubjects.find(`${cardName}-fleet-integration-card`);
+ await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow(card);
+ await (await testSubjects.find(`${cardName}-link-to-exceptions`)).click();
+
+ await testSubjects.existOrFail('policyDetailsPage');
+
+ await (await testSubjects.find('policyDetailsBackLink')).click();
+ await testSubjects.existOrFail('endpointIntegrationPolicyForm');
+ });
+ }
+ );
});
});
}
From eccfdb7c093b999f57a82b1cee66f48dac3632da Mon Sep 17 00:00:00 2001
From: Tomasz Ciecierski
Date: Tue, 23 Apr 2024 11:09:42 +0200
Subject: [PATCH 055/183] [EDR Workflows] Revert skipped tests (#181372)
---
.../response_console/process_operations.cy.ts | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
index d127be35f7a31..f7c70ebf8c7e9 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts
@@ -26,14 +26,12 @@ import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_
const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat';
-// Failing: See https://github.com/elastic/kibana/issues/170371
-describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => {
+describe('Response console', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
});
- // FLAKY: https://github.com/elastic/kibana/issues/170371
- describe.skip('Processes operations:', () => {
+ describe('Processes operations:', () => {
let indexedPolicy: IndexedFleetEndpointPolicyResponse;
let policy: PolicyData;
let createdHost: CreateAndEnrollEndpointHostResponse;
From b67d45b3d2485485fa111f814f8c80934ba1df30 Mon Sep 17 00:00:00 2001
From: Alexey Antonov
Date: Tue, 23 Apr 2024 12:19:13 +0300
Subject: [PATCH 056/183] fix: [SCREEN READER]: flyouts must announce itself on
render and manage focus (#180888)
Part of: https://github.com/elastic/security-team/issues/8657
## Summary
This PR is a component of
https://github.com/elastic/security-team/issues/8657 and addresses a
part of the issue where the flyout must announce itself upon render.
This issue was found to be valid for almost all flyouts in the Security
Solution's code, and this PR rectifies these cases.
## What was done?
1. In accordance with [EUI doc](https://eui.elastic.co/#/layout/flyout)
we should `Use aria-labelledby={headingId} to announce the flyout to
screen readers.`
## Screens:
### `a11y` tree
#### Before:
#### After:
---
.../components/add_exception_flyout/index.tsx | 10 +++++++++-
.../components/edit_exception_flyout/index.tsx | 16 ++++++++++++++--
.../rule_details/rule_details_flyout.tsx | 8 +++++++-
.../components/osquery/osquery_flyout.tsx | 17 ++++++++++++++---
.../value_lists_management_flyout/flyout.tsx | 9 +++++++--
.../create_shared_exception_list/index.tsx | 13 ++++++++++++-
.../import_exceptions_list_flyout/index.tsx | 14 ++++++++++++--
.../components/artifact_flyout.tsx | 16 ++++++++++++++--
.../components/action_log_button.tsx | 10 +++++++++-
.../view/components/event_filters_flyout.tsx | 8 +++++++-
.../flyout/policy_artifacts_flyout.tsx | 13 +++++++++++--
11 files changed, 116 insertions(+), 18 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/add_exception_flyout/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/add_exception_flyout/index.tsx
index 7ed3566c3059f..2a6b5c9523cfe 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/add_exception_flyout/index.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/add_exception_flyout/index.tsx
@@ -24,6 +24,7 @@ import {
EuiCallOut,
EuiText,
useEuiTheme,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import { ENDPOINT_LIST_ID } from '@kbn/securitysolution-list-constants';
@@ -494,17 +495,24 @@ export const AddExceptionFlyout = memo(function AddExceptionFlyout({
: i18n.CREATE_RULE_EXCEPTION;
}, [listType]);
+ const exceptionFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'exceptionFlyoutTitle',
+ });
+
return (
- {addExceptionMessage}
+
+ {addExceptionMessage}
+
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/edit_exception_flyout/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/edit_exception_flyout/index.tsx
index 8c27b5da22450..6470db5c9b4a0 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/edit_exception_flyout/index.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/edit_exception_flyout/index.tsx
@@ -20,6 +20,7 @@ import {
EuiFlyout,
EuiFlyoutFooter,
EuiSkeletonText,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import type {
@@ -362,11 +363,22 @@ const EditExceptionFlyoutComponent: React.FC = ({
]
);
+ const exceptionFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'exceptionFlyoutTitle',
+ });
+
return (
-
+
- {editExceptionMessage}
+
+ {editExceptionMessage}
+
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
index d6507115bcd48..0a0661fd89e0a 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
@@ -20,6 +20,7 @@ import {
EuiSpacer,
EuiFlexGroup,
EuiFlexItem,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import type { EuiTabbedContentTab, EuiTabbedContentProps, EuiFlyoutProps } from '@elastic/eui';
@@ -181,6 +182,10 @@ export const RuleDetailsFlyout = ({
setSelectedTabId(tab.id);
};
+ const prebuiltRulesFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'prebuiltRulesFlyoutTitle',
+ });
+
return (
- {rule.name}
+ {rule.name}
diff --git a/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx b/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx
index 3dc2f948536cd..b4758bf79616d 100644
--- a/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx
@@ -7,7 +7,14 @@
import React, { useCallback } from 'react';
import styled from 'styled-components';
-import { EuiFlyout, EuiFlyoutFooter, EuiFlyoutBody, EuiFlyoutHeader, EuiTitle } from '@elastic/eui';
+import {
+ EuiFlyout,
+ EuiFlyoutFooter,
+ EuiFlyoutBody,
+ EuiFlyoutHeader,
+ EuiTitle,
+ useGeneratedHtmlId,
+} from '@elastic/eui';
import { useQueryClient } from '@tanstack/react-query';
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import { useKibana } from '../../../common/lib/kibana';
@@ -50,12 +57,16 @@ const OsqueryFlyoutComponent: React.FC = ({
});
}, [defaultValues?.alertIds, queryClient]);
+ const osqueryFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'osqueryFlyoutTitle',
+ });
+
if (osquery?.OsqueryAction) {
return (
-
+
- {ACTION_OSQUERY}
+ {ACTION_OSQUERY}
diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/flyout.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/flyout.tsx
index 785dbcbaaff7a..51924ffb5ee58 100644
--- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/flyout.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/flyout.tsx
@@ -17,6 +17,7 @@ import {
EuiTitle,
EuiSpacer,
EuiText,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import type { ListSchema } from '@kbn/securitysolution-io-ts-list-types';
@@ -199,6 +200,10 @@ export const ValueListsFlyoutComponent: React.FC = ({
});
}, []);
+ const valueListsFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'valueListsFlyoutTitle',
+ });
+
if (!showFlyout) {
return null;
}
@@ -219,10 +224,10 @@ export const ValueListsFlyoutComponent: React.FC = ({
return (
<>
-
+
- {i18n.VALUE_LISTS_FLYOUT_TITLE}
+ {i18n.VALUE_LISTS_FLYOUT_TITLE}
diff --git a/x-pack/plugins/security_solution/public/exceptions/components/create_shared_exception_list/index.tsx b/x-pack/plugins/security_solution/public/exceptions/components/create_shared_exception_list/index.tsx
index a6c1a270d6b02..9c465b202b8ca 100644
--- a/x-pack/plugins/security_solution/public/exceptions/components/create_shared_exception_list/index.tsx
+++ b/x-pack/plugins/security_solution/public/exceptions/components/create_shared_exception_list/index.tsx
@@ -21,6 +21,7 @@ import {
EuiButtonEmpty,
EuiButton,
EuiFlexItem,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import type { HttpSetup } from '@kbn/core-http-browser';
import type { ErrorToastOptions, Toast, ToastInput } from '@kbn/core-notifications-browser';
@@ -153,16 +154,26 @@ export const CreateSharedListFlyout = memo(
handleCreateSuccess,
]);
+ const createSharedExceptionListFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'createSharedExceptionListFlyout',
+ });
+
return (
- {CREATE_SHARED_LIST_TITLE}
+
+ {CREATE_SHARED_LIST_TITLE}
+
diff --git a/x-pack/plugins/security_solution/public/exceptions/components/import_exceptions_list_flyout/index.tsx b/x-pack/plugins/security_solution/public/exceptions/components/import_exceptions_list_flyout/index.tsx
index 38619519f0c28..ec9a01f280d0e 100644
--- a/x-pack/plugins/security_solution/public/exceptions/components/import_exceptions_list_flyout/index.tsx
+++ b/x-pack/plugins/security_solution/public/exceptions/components/import_exceptions_list_flyout/index.tsx
@@ -146,11 +146,21 @@ export const ImportExceptionListFlyout = React.memo(
const handleFileChange = useCallback((inputFiles: FileList | null) => {
setFiles(inputFiles ?? null);
}, []);
+
+ const importExceptionListFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'importExceptionListFlyoutTitle',
+ });
+
return (
- setDisplayImportListFlyout(false)}>
+ setDisplayImportListFlyout(false)}
+ aria-labelledby={importExceptionListFlyoutTitleId}
+ >
- {i18n.IMPORT_EXCEPTION_LIST_HEADER}
+ {i18n.IMPORT_EXCEPTION_LIST_HEADER}
diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx
index 06c43626955c4..3fe20be2cbd64 100644
--- a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx
+++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx
@@ -20,6 +20,7 @@ import {
EuiFlyoutFooter,
EuiFlyoutHeader,
EuiTitle,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import type { EuiFlyoutSize } from '@elastic/eui/src/components/flyout/flyout';
@@ -387,15 +388,26 @@ export const ArtifactFlyout = memo(
}
}, [error, isEditFlow, labels, setUrlParams, toasts, urlParams.itemId]);
+ const artifactFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'artifactFlyoutTitle',
+ });
+
if (!isFlyoutOpened || error) {
return null;
}
return (
-
+
- {isEditFlow ? labels.flyoutEditTitle : labels.flyoutCreateTitle}
+
+ {isEditFlow ? labels.flyoutEditTitle : labels.flyoutCreateTitle}
+
{!isInitializing && showExpiredLicenseBanner && (
diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/action_log_button.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/action_log_button.tsx
index f3c5d165d7b72..f9960ecbdfe82 100644
--- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/action_log_button.tsx
+++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/action_log_button.tsx
@@ -13,6 +13,7 @@ import {
EuiFlyoutHeader,
EuiTitle,
useEuiTheme,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import type { EndpointResponderExtensionComponentProps } from '../types';
@@ -28,6 +29,10 @@ export const ActionLogButton = memo((p
});
}, []);
+ const responderActionLogFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'responderActionLogFlyoutTitle',
+ });
+
return (
<>
((p
onClose={toggleActionLog}
size="m"
paddingSize="l"
+ aria-labelledby={responderActionLogFlyoutTitleId}
data-test-subj="responderActionLogFlyout"
// EUI TODO: This z-index override of EuiOverlayMask is a workaround, and ideally should be resolved with a cleaner UI/UX flow long-term
maskProps={{ style: `z-index: ${(euiTheme.levels.flyout as number) + 3}` }} // we need this flyout to be above the timeline flyout (which has a z-index of 1002)
>
- {UX_MESSAGES.flyoutTitle(props.meta.hostName)}
+
+ {UX_MESSAGES.flyoutTitle(props.meta.hostName)}
+
diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filters_flyout.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filters_flyout.tsx
index 1ffc9c52b7f7b..298d5208a0ce5 100644
--- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filters_flyout.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filters_flyout.tsx
@@ -19,6 +19,7 @@ import {
EuiFlexGroup,
EuiFlexItem,
EuiTextColor,
+ useGeneratedHtmlId,
} from '@elastic/eui';
import { lastValueFrom } from 'rxjs';
@@ -184,6 +185,10 @@ export const EventFiltersFlyout: React.FC = memo(
setConfirmModalLabels(formState.confirmModalLabels);
}, []);
+ const eventFiltersCreateFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'eventFiltersCreateFlyoutTitle',
+ });
+
const confirmModal = useMemo(() => {
if (confirmModalLabels) {
const { title, body, confirmButton, cancelButton } = confirmModalLabels;
@@ -206,11 +211,12 @@ export const EventFiltersFlyout: React.FC = memo(
size="l"
onClose={handleOnClose}
data-test-subj="eventFiltersCreateFlyout"
+ aria-labelledby={eventFiltersCreateFlyoutTitleId}
{...flyoutProps}
>
-
+
{data ? (
(
labels.flyoutNoSearchResultsMessage,
]);
+ const artifactsAssignFlyoutTitleId = useGeneratedHtmlId({
+ prefix: 'artifactsAssignFlyoutTitle',
+ });
+
return (
-
+
- {labels.flyoutTitle}
+ {labels.flyoutTitle}
{labels.flyoutSubtitle(policyItem.name)}
From dbe4a3708cbf6ee6c44f2a1c8919b7f52558d0c6 Mon Sep 17 00:00:00 2001
From: Faisal Kanout
Date: Tue, 23 Apr 2024 11:26:21 +0200
Subject: [PATCH 057/183] [OBS-UX-MNGMT][ALERTING]Tweak wording for data source
warning (#181139)
## Summary
It fixes #181074 by updating the warning wording to
> Alerting rules use this data source setting.
One or more alerting rules rely on this data source setting. Changing
this setting will change which data is used to generate alerts.
![Screenshot 2024-04-18 at 13 27
13](https://github.com/elastic/kibana/assets/6838659/99930e4c-874b-4515-9790-84ddd94dec28)
---
.../pages/logs/settings/indices_configuration_panel.tsx | 4 ++--
.../pages/metrics/settings/indices_configuration_panel.tsx | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/indices_configuration_panel.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/indices_configuration_panel.tsx
index 4202b4babe728..bcde2cf84bb4a 100644
--- a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/indices_configuration_panel.tsx
+++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/indices_configuration_panel.tsx
@@ -168,14 +168,14 @@ export const IndicesConfigurationPanel = React.memo<{
data-test-subj="infraIndicesPanelSettingsWarningCallout"
size="m"
title={i18n.translate('xpack.infra.sourceConfiguration.logsIndicesUsedByRulesTitle', {
- defaultMessage: 'Rules utilize this data source.',
+ defaultMessage: 'Alerting rules use this data source setting',
})}
color="warning"
iconType="warning"
>
Date: Tue, 23 Apr 2024 11:32:00 +0200
Subject: [PATCH 058/183] Hide Starter Prompts when no Connectors are available
(#181135)
## Summary
Hide Starter Prompts when no Connectors are available
---
.../public/components/chat/starter_prompts.tsx | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/starter_prompts.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/starter_prompts.tsx
index 50ad3e730d5c0..1f5402978d41d 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/starter_prompts.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/starter_prompts.tsx
@@ -17,6 +17,7 @@ import {
import { css } from '@emotion/css';
import { uniq } from 'lodash';
import { useObservabilityAIAssistantAppService } from '../../hooks/use_observability_ai_assistant_app_service';
+import { useGenAIConnectors } from '../../hooks/use_genai_connectors';
import { nonNullable } from '../../utils/non_nullable';
const starterPromptClassName = css`
@@ -31,6 +32,12 @@ const starterPromptInnerClassName = css`
export function StarterPrompts({ onSelectPrompt }: { onSelectPrompt: (prompt: string) => void }) {
const service = useObservabilityAIAssistantAppService();
+ const { connectors } = useGenAIConnectors();
+
+ if (!connectors || connectors.length === 0) {
+ return null;
+ }
+
const contexts = service.getScreenContexts();
const starterPrompts = uniq(
From 1ab7a2cbedc66323602814d9141e7753b9b1dd83 Mon Sep 17 00:00:00 2001
From: Janki Salvi <117571355+js-jankisalvi@users.noreply.github.com>
Date: Tue, 23 Apr 2024 11:45:47 +0200
Subject: [PATCH 059/183] [Cases] Update case connector framework to use
generic types (#181059)
## Summary
This PR addresses comments mentioned in
[here](https://github.com/elastic/kibana/pull/180561#issuecomment-2058751525)
It fixes CaseConnector bugs by updating its methods to use generic types
for params and response.
### Checklist
- [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
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
x-pack/plugins/actions/server/plugin.ts | 13 +-
.../server/sub_action_framework/case.test.ts | 178 ++++++++++++++----
.../server/sub_action_framework/case.ts | 64 +++----
.../server/sub_action_framework/mocks.ts | 48 +++--
.../server/sub_action_framework/types.ts | 5 +
5 files changed, 219 insertions(+), 89 deletions(-)
diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts
index 24253e7d01ae4..ac5b3206b722f 100644
--- a/x-pack/plugins/actions/server/plugin.ts
+++ b/x-pack/plugins/actions/server/plugin.ts
@@ -100,7 +100,11 @@ import {
ConnectorWithOptionalDeprecation,
} from './application/connector/lib';
import { createSubActionConnectorFramework } from './sub_action_framework';
-import { IServiceAbstract, SubActionConnectorType } from './sub_action_framework/types';
+import {
+ ICaseServiceAbstract,
+ IServiceAbstract,
+ SubActionConnectorType,
+} from './sub_action_framework/types';
import { SubActionConnector } from './sub_action_framework/sub_action_connector';
import { CaseConnector } from './sub_action_framework/case';
import type { IUnsecuredActionsClient } from './unsecured_actions_client/unsecured_actions_client';
@@ -128,7 +132,12 @@ export interface PluginSetupContract {
isPreconfiguredConnector(connectorId: string): boolean;
getSubActionConnectorClass: () => IServiceAbstract;
- getCaseConnectorClass: () => IServiceAbstract;
+ getCaseConnectorClass: () => ICaseServiceAbstract<
+ Config,
+ Secrets,
+ Incident,
+ GetIncidentResponse
+ >;
getActionsHealth: () => { hasPermanentEncryptionKey: boolean };
getActionsConfigurationUtilities: () => ActionsConfigurationUtilities;
setEnabledConnectorTypes: (connectorTypes: EnabledConnectorTypes) => void;
diff --git a/x-pack/plugins/actions/server/sub_action_framework/case.test.ts b/x-pack/plugins/actions/server/sub_action_framework/case.test.ts
index f13d18d193485..91e2df1972de8 100644
--- a/x-pack/plugins/actions/server/sub_action_framework/case.test.ts
+++ b/x-pack/plugins/actions/server/sub_action_framework/case.test.ts
@@ -5,6 +5,7 @@
* 2.0.
*/
+import { schema } from '@kbn/config-schema';
import { loggingSystemMock } from '@kbn/core/server/mocks';
import { MockedLogger } from '@kbn/logging-mocks';
import { actionsConfigMock } from '../actions_config.mock';
@@ -13,11 +14,24 @@ import { TestCaseConnector } from './mocks';
import { ActionsConfigurationUtilities } from '../actions_config';
describe('CaseConnector', () => {
- const pushToServiceParams = { incident: { externalId: null }, comments: [] };
let logger: MockedLogger;
let services: ReturnType;
let mockedActionsConfig: jest.Mocked;
let service: TestCaseConnector;
+ const pushToServiceIncidentParamsSchema = {
+ name: schema.string(),
+ category: schema.nullable(schema.string()),
+ foo: schema.arrayOf(schema.boolean()),
+ bar: schema.object({
+ check: schema.nullable(schema.number()),
+ }),
+ };
+
+ const incidentSchemaMock = { name: 'Test', category: null, foo: [false], bar: { check: 1 } };
+ const pushToServiceParams = {
+ incident: { externalId: null, ...incidentSchemaMock },
+ comments: [],
+ };
beforeEach(() => {
jest.resetAllMocks();
@@ -32,14 +46,17 @@ describe('CaseConnector', () => {
timeout: 360000,
});
- service = new TestCaseConnector({
- configurationUtilities: mockedActionsConfig,
- logger,
- connector: { id: 'test-id', type: '.test' },
- config: { url: 'https://example.com' },
- secrets: { username: 'elastic', password: 'changeme' },
- services,
- });
+ service = new TestCaseConnector(
+ {
+ configurationUtilities: mockedActionsConfig,
+ logger,
+ connector: { id: 'test-id', type: '.test' },
+ config: { url: 'https://example.com' },
+ secrets: { username: 'elastic', password: 'changeme' },
+ services,
+ },
+ pushToServiceIncidentParamsSchema
+ );
});
describe('Sub actions', () => {
@@ -57,11 +74,11 @@ describe('CaseConnector', () => {
const subAction = subActions.get('pushToService');
expect(
subAction?.schema?.validate({
- incident: { externalId: 'test' },
+ incident: { externalId: 'test', ...incidentSchemaMock },
comments: [{ comment: 'comment', commentId: 'comment-id' }],
})
).toEqual({
- incident: { externalId: 'test' },
+ incident: { externalId: 'test', ...incidentSchemaMock },
comments: [{ comment: 'comment', commentId: 'comment-id' }],
});
});
@@ -69,7 +86,12 @@ describe('CaseConnector', () => {
it('should accept null for externalId', async () => {
const subActions = service.getSubActions();
const subAction = subActions.get('pushToService');
- expect(subAction?.schema?.validate({ incident: { externalId: null }, comments: [] }));
+ expect(
+ subAction?.schema?.validate({
+ incident: { externalId: null, ...incidentSchemaMock },
+ comments: [],
+ })
+ );
});
it.each([[undefined], [1], [false], [{ test: 'hello' }], [['test']], [{ test: 'hello' }]])(
@@ -84,7 +106,12 @@ describe('CaseConnector', () => {
it('should accept null for comments', async () => {
const subActions = service.getSubActions();
const subAction = subActions.get('pushToService');
- expect(subAction?.schema?.validate({ incident: { externalId: 'test' }, comments: null }));
+ expect(
+ subAction?.schema?.validate({
+ incident: { externalId: 'test', ...incidentSchemaMock },
+ comments: null,
+ })
+ );
});
it.each([
@@ -101,33 +128,64 @@ describe('CaseConnector', () => {
expect(() => subAction?.schema?.validate({ incident: { externalId: 'test' }, comments }));
});
- it('should allow any field in the params', async () => {
+ it('should throw if necessary schema params not provided', async () => {
const subActions = service.getSubActions();
const subAction = subActions.get('pushToService');
- expect(
+ expect(() =>
subAction?.schema?.validate({
incident: {
externalId: 'test',
- foo: 'foo',
- bar: 1,
- baz: [{ test: 'hello' }, 1, 'test', false],
- isValid: false,
- val: null,
},
- comments: [{ comment: 'comment', commentId: 'comment-id' }],
})
- ).toEqual({
- incident: {
- externalId: 'test',
- foo: 'foo',
- bar: 1,
- baz: [{ test: 'hello' }, 1, 'test', false],
- isValid: false,
- val: null,
- },
- comments: [{ comment: 'comment', commentId: 'comment-id' }],
- });
+ ).toThrow('[incident.name]: expected value of type [string] but got [undefined]');
+ });
+
+ it('should throw if schema params does not match string type', async () => {
+ const subActions = service.getSubActions();
+ const subAction = subActions.get('pushToService');
+
+ expect(() =>
+ subAction?.schema?.validate({
+ incident: {
+ externalId: 'test',
+ name: false,
+ },
+ })
+ ).toThrow('[incident.name]: expected value of type [string] but got [boolean]');
+ });
+
+ it('should throw if schema params does not match array type', async () => {
+ const subActions = service.getSubActions();
+ const subAction = subActions.get('pushToService');
+
+ expect(() =>
+ subAction?.schema?.validate({
+ incident: {
+ externalId: 'test',
+ name: 'sample',
+ foo: null,
+ },
+ })
+ ).toThrow('[incident.foo]: expected value of type [array] but got [null]');
+ });
+
+ it('should throw if schema params does not match nested object type', async () => {
+ const subActions = service.getSubActions();
+ const subAction = subActions.get('pushToService');
+
+ expect(() =>
+ subAction?.schema?.validate({
+ incident: {
+ externalId: 'test',
+ name: 'sample',
+ foo: [true],
+ bar: { check: 'hello' },
+ },
+ })
+ ).toThrow(
+ '[incident.bar.check]: types that failed validation:\n- [incident.bar.check.0]: expected value of type [number] but got [string]\n- [incident.bar.check.1]: expected value to equal [null]'
+ );
});
});
@@ -144,8 +202,8 @@ describe('CaseConnector', () => {
it('should update an incident if externalId is not null', async () => {
const res = await service.pushToService({
- ...pushToServiceParams,
- incident: { externalId: 'test-id' },
+ incident: { ...pushToServiceParams.incident, externalId: 'test-id' },
+ comments: [],
});
expect(res).toEqual({
@@ -212,4 +270,56 @@ describe('CaseConnector', () => {
});
});
});
+
+ describe('PushParamsSchema', () => {
+ let newService: TestCaseConnector;
+ beforeEach(() => {
+ jest.resetAllMocks();
+ jest.clearAllMocks();
+
+ const newPushToServiceSchema = {
+ name: schema.string(),
+ externalId: schema.number(),
+ };
+
+ newService = new TestCaseConnector(
+ {
+ configurationUtilities: mockedActionsConfig,
+ logger,
+ connector: { id: 'test-id', type: '.test' },
+ config: { url: 'https://example.com' },
+ secrets: { username: 'elastic', password: 'changeme' },
+ services,
+ },
+ newPushToServiceSchema
+ );
+ });
+
+ it('should add externalId as null', async () => {
+ const subActions = newService.getSubActions();
+ const subAction = subActions.get('pushToService');
+ expect(
+ subAction?.schema?.validate({
+ incident: { name: 'foo' },
+ comments: [],
+ })
+ ).toEqual({
+ incident: { name: 'foo', externalId: null },
+ comments: [],
+ });
+ });
+
+ it('should not override externalId schema', async () => {
+ const subActions = newService.getSubActions();
+ const subAction = subActions.get('pushToService');
+ expect(() =>
+ subAction?.schema?.validate({
+ incident: { name: 'foo', externalId: 123 },
+ comments: [],
+ })
+ ).toThrow(
+ '[incident.externalId]: types that failed validation:\n- [incident.externalId.0]: expected value of type [string] but got [number]\n- [incident.externalId.1]: expected value to equal [null]'
+ );
+ });
+ });
});
diff --git a/x-pack/plugins/actions/server/sub_action_framework/case.ts b/x-pack/plugins/actions/server/sub_action_framework/case.ts
index c7419d5de1b0f..24a0512378912 100644
--- a/x-pack/plugins/actions/server/sub_action_framework/case.ts
+++ b/x-pack/plugins/actions/server/sub_action_framework/case.ts
@@ -5,50 +5,45 @@
* 2.0.
*/
-import { schema } from '@kbn/config-schema';
-import {
- ExternalServiceIncidentResponse,
- PushToServiceParams,
- PushToServiceResponse,
-} from './types';
+import { schema, Type } from '@kbn/config-schema';
+import { ExternalServiceIncidentResponse, PushToServiceResponse } from './types';
import { SubActionConnector } from './sub_action_connector';
import { ServiceParams } from './types';
-export interface CaseConnectorInterface {
- addComment: ({
- incidentId,
- comment,
- }: {
- incidentId: string;
- comment: string;
- }) => Promise;
- createIncident: (incident: Record) => Promise;
+export interface CaseConnectorInterface {
+ addComment: ({ incidentId, comment }: { incidentId: string; comment: string }) => Promise;
+ createIncident: (incident: Incident) => Promise;
updateIncident: ({
incidentId,
incident,
}: {
incidentId: string;
- incident: Record;
+ incident: Incident;
}) => Promise;
- getIncident: ({ id }: { id: string }) => Promise;
- pushToService: (params: PushToServiceParams) => Promise;
+ getIncident: ({ id }: { id: string }) => Promise;
+ pushToService: (params: {
+ incident: { externalId: string | null } & Incident;
+ comments: Array<{ commentId: string; comment: string }>;
+ }) => Promise;
}
-export abstract class CaseConnector
+export abstract class CaseConnector
extends SubActionConnector
- implements CaseConnectorInterface
+ implements CaseConnectorInterface
{
- constructor(params: ServiceParams) {
+ constructor(
+ params: ServiceParams,
+ pushToServiceIncidentParamsSchema: Record>
+ ) {
super(params);
this.registerSubAction({
name: 'pushToService',
method: 'pushToService',
schema: schema.object({
- incident: schema.object(
- { externalId: schema.nullable(schema.string()) },
- { unknowns: 'allow' }
- ),
+ incident: schema
+ .object(pushToServiceIncidentParamsSchema)
+ .extends({ externalId: schema.nullable(schema.string()) }),
comments: schema.nullable(
schema.arrayOf(
schema.object({
@@ -67,21 +62,22 @@ export abstract class CaseConnector
}: {
incidentId: string;
comment: string;
- }): Promise;
+ }): Promise;
- public abstract createIncident(
- incident: Record
- ): Promise;
+ public abstract createIncident(incident: Incident): Promise;
public abstract updateIncident({
incidentId,
incident,
}: {
incidentId: string;
- incident: Record;
+ incident: Incident;
}): Promise;
- public abstract getIncident({ id }: { id: string }): Promise;
+ public abstract getIncident({ id }: { id: string }): Promise;
- public async pushToService(params: PushToServiceParams) {
+ public async pushToService(params: {
+ incident: { externalId: string | null } & Incident;
+ comments: Array<{ commentId: string; comment: string }>;
+ }) {
const { incident, comments } = params;
const { externalId, ...rest } = incident;
@@ -90,10 +86,10 @@ export abstract class CaseConnector
if (externalId != null) {
res = await this.updateIncident({
incidentId: externalId,
- incident: rest,
+ incident: rest as Incident,
});
} else {
- res = await this.createIncident(rest);
+ res = await this.createIncident(rest as Incident);
}
if (comments && Array.isArray(comments) && comments.length > 0) {
diff --git a/x-pack/plugins/actions/server/sub_action_framework/mocks.ts b/x-pack/plugins/actions/server/sub_action_framework/mocks.ts
index 274662bb7a35f..572aa20422a94 100644
--- a/x-pack/plugins/actions/server/sub_action_framework/mocks.ts
+++ b/x-pack/plugins/actions/server/sub_action_framework/mocks.ts
@@ -6,7 +6,7 @@
*/
/* eslint-disable max-classes-per-file */
-import { schema, TypeOf } from '@kbn/config-schema';
+import { schema, Type, TypeOf } from '@kbn/config-schema';
import { AxiosError } from 'axios';
import { SubActionConnector } from './sub_action_connector';
import { CaseConnector } from './case';
@@ -20,6 +20,18 @@ export const TestSecretsSchema = schema.object({
export type TestConfig = TypeOf;
export type TestSecrets = TypeOf;
+export interface GetIncidentResponse {
+ id: string;
+ title: string;
+ description?: string;
+ severity: number;
+}
+
+export interface Incident {
+ name: string;
+ category: string | null;
+}
+
interface ErrorSchema {
errorMessage: string;
errorCode: number;
@@ -133,18 +145,24 @@ export class TestExecutor extends SubActionConnector {
public noAsync() {}
}
-export class TestCaseConnector extends CaseConnector {
- constructor(params: ServiceParams) {
- super(params);
+export class TestCaseConnector extends CaseConnector<
+ TestConfig,
+ TestSecrets,
+ Incident,
+ GetIncidentResponse
+> {
+ constructor(
+ params: ServiceParams,
+ pushToServiceParamsSchema: Record>
+ ) {
+ super(params, pushToServiceParamsSchema);
}
protected getResponseErrorMessage(error: AxiosError) {
return `Message: ${error.response?.data.errorMessage}. Code: ${error.response?.data.errorCode}`;
}
- public async createIncident(incident: {
- category: string;
- }): Promise {
+ public async createIncident(incident: Incident): Promise {
return {
id: 'create-incident',
title: 'Test incident',
@@ -159,21 +177,14 @@ export class TestCaseConnector extends CaseConnector {
}: {
incidentId: string;
comment: string;
- }): Promise {
- return {
- id: 'add-comment',
- title: 'Test incident',
- url: 'https://example.com',
- pushedDate: '2022-05-06T09:41:00.401Z',
- };
- }
+ }): Promise {}
public async updateIncident({
incidentId,
incident,
}: {
incidentId: string;
- incident: { category: string };
+ incident: Incident;
}): Promise {
return {
id: 'update-incident',
@@ -183,12 +194,11 @@ export class TestCaseConnector extends CaseConnector {
};
}
- public async getIncident({ id }: { id: string }): Promise {
+ public async getIncident({ id }: { id: string }): Promise {
return {
id: 'get-incident',
title: 'Test incident',
- url: 'https://example.com',
- pushedDate: '2022-05-06T09:41:00.401Z',
+ severity: 4,
};
}
}
diff --git a/x-pack/plugins/actions/server/sub_action_framework/types.ts b/x-pack/plugins/actions/server/sub_action_framework/types.ts
index a95f25edee49f..9a197fc5a01e8 100644
--- a/x-pack/plugins/actions/server/sub_action_framework/types.ts
+++ b/x-pack/plugins/actions/server/sub_action_framework/types.ts
@@ -48,6 +48,11 @@ export type IServiceAbstract = abstract new (
params: ServiceParams
) => SubActionConnector;
+export type ICaseServiceAbstract = abstract new (
+ params: ServiceParams,
+ pushToServiceIncidentParamsSchema: Record>
+) => SubActionConnector;
+
export enum ValidatorType {
CONFIG,
SECRETS,
From 48286557c11ca5ded61d3966cf2bb6118930d36e Mon Sep 17 00:00:00 2001
From: Justin Kambic
Date: Tue, 23 Apr 2024 05:47:26 -0400
Subject: [PATCH 060/183] [Observability Onboarding] Add virtual otel
onboarding card (#180843)
## Summary
Resolves #178946.
## Why am I being pinged
### AppEx
~I've added a custom SVG for Open Telemetry as part of this patch. I've
never done this in this manner before, so if there is any issue with the
way I'm doing it please call it out.~
I moved the SVG out of the home plugin and am just keeping it in the
assets of the onboarding plugin now.
### APM/obs-ux
The APM onboarding flow doesn't support deep linking via hash (or if it
does I missed how it works). This changes the onboarding instructions
component to pick up the hash on the initial load, and update the
history as the user clicks around the different tabs.
### Logs
This adds a virtual card for Open Telemetry to the application
monitoring phase of the new onboarding flow. You can see this by going
to the experimental flow and clicking the second question. I'll include
a GIF of this.
![20240415141016](https://github.com/elastic/kibana/assets/18429259/7bbc6976-9320-417d-b804-9dc2dfa7d315)
---------
Co-authored-by: Joe Reuter
---
.../app/onboarding/instructions_set.tsx | 15 ++--
.../components/routing/onboarding/index.tsx | 18 +++++
.../onboarding_flow_form.tsx | 3 +-
.../use_custom_cards_for_category.ts | 69 ++++++++++++-------
.../application/packages_list/index.tsx | 2 +-
.../public/application/packages_list/types.ts | 6 +-
.../use_integration_card_list.ts | 2 +-
.../public/application/packages_list/utils.ts | 2 +-
.../public/assets/opentelemetry.svg | 14 ++++
9 files changed, 97 insertions(+), 34 deletions(-)
create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/assets/opentelemetry.svg
diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/onboarding/instructions_set.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/onboarding/instructions_set.tsx
index 7f045beb0fa9e..8d8a83265813c 100644
--- a/x-pack/plugins/observability_solution/apm/public/components/app/onboarding/instructions_set.tsx
+++ b/x-pack/plugins/observability_solution/apm/public/components/app/onboarding/instructions_set.tsx
@@ -6,7 +6,8 @@
*/
import { EuiSplitPanel, EuiTabs, EuiTab, EuiTitle, EuiSteps, EuiSpacer } from '@elastic/eui';
-import React, { useState } from 'react';
+import React from 'react';
+import { useHistory } from 'react-router-dom';
import { useEuiTheme } from '@elastic/eui';
import {
INSTRUCTION_VARIANT,
@@ -14,6 +15,8 @@ import {
InstructionVariant,
InstructionSet,
} from './instruction_variants';
+import { useApmParams } from '../../../hooks/use_apm_params';
+import { push } from '../../shared/links/url_helpers';
interface AgentTab {
id: INSTRUCTION_VARIANT;
@@ -30,9 +33,13 @@ function getTabs(variants: InstructionVariant[]): AgentTab[] {
export function InstructionsSet({ instructions }: { instructions: InstructionSet }) {
const tabs = getTabs(instructions.instructionVariants);
- const [selectedTab, setSelectedTab] = useState(tabs[0].id);
- const onSelectedTabChange = (tab: string) => {
- setSelectedTab(tab);
+ const {
+ query: { agent: agentQuery },
+ } = useApmParams('/onboarding');
+ const history = useHistory();
+ const selectedTab = agentQuery ?? tabs[0].id;
+ const onSelectedTabChange = (agent: string) => {
+ push(history, { query: { agent } });
};
const { euiTheme } = useEuiTheme();
diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/onboarding/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/onboarding/index.tsx
index 46d1317dfdee3..6fb6624b94e82 100644
--- a/x-pack/plugins/observability_solution/apm/public/components/routing/onboarding/index.tsx
+++ b/x-pack/plugins/observability_solution/apm/public/components/routing/onboarding/index.tsx
@@ -5,11 +5,29 @@
* 2.0.
*/
+import * as t from 'io-ts';
import React from 'react';
import { Onboarding } from '../../app/onboarding';
+import { INSTRUCTION_VARIANT } from '../../app/onboarding/instruction_variants';
export const onboarding = {
'/onboarding': {
element: ,
+ params: t.partial({
+ query: t.partial({
+ agent: t.union([
+ t.literal(INSTRUCTION_VARIANT.NODE),
+ t.literal(INSTRUCTION_VARIANT.DJANGO),
+ t.literal(INSTRUCTION_VARIANT.FLASK),
+ t.literal(INSTRUCTION_VARIANT.RAILS),
+ t.literal(INSTRUCTION_VARIANT.RACK),
+ t.literal(INSTRUCTION_VARIANT.GO),
+ t.literal(INSTRUCTION_VARIANT.JAVA),
+ t.literal(INSTRUCTION_VARIANT.DOTNET),
+ t.literal(INSTRUCTION_VARIANT.PHP),
+ t.literal(INSTRUCTION_VARIANT.OPEN_TELEMETRY),
+ ]),
+ }),
+ }),
},
};
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
index e5977ff0172c7..1e10139963a75 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
@@ -188,7 +188,8 @@ export const OnboardingFlowForm: FunctionComponent = () => {
flowCategory={searchParams.get('category')}
ref={packageListRef}
customCards={customCards?.filter(
- (card) => card.type === 'generated' && !card.isCollectionCard
+ // Filter out collection cards and regular integrations that show up via search anyway
+ (card) => card.type === 'virtual' && !card.isCollectionCard
)}
joinCardLists
/>
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
index a9cc265b753af..ccf974cea897b 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts
@@ -21,7 +21,11 @@ export function useCustomCardsForCategory(
): CustomCard[] | undefined {
const history = useHistory();
const location = useLocation();
- const getUrlForApp = useKibana()?.services.application?.getUrlForApp;
+ const {
+ services: { application, http },
+ } = useKibana();
+ const getUrlForApp = application?.getUrlForApp;
+ const basePath = http?.basePath;
const { href: systemLogsUrl } = reactRouterNavigate(history, `/systemLogs/${location.search}`);
const { href: customLogsUrl } = reactRouterNavigate(history, `/customLogs/${location.search}`);
@@ -30,8 +34,8 @@ export function useCustomCardsForCategory(
case 'apm':
return [
{
- id: 'apm-generated',
- type: 'generated',
+ id: 'apm-virtual',
+ type: 'virtual',
title: 'Elastic APM',
description: 'Collect distributed traces from your applications with Elastic APM',
name: 'apm',
@@ -42,13 +46,32 @@ export function useCustomCardsForCategory(
src: 'apmApp',
},
],
- url: getUrlForApp?.('apm') ?? '',
+ url: `${getUrlForApp?.('apm')}/onboarding` ?? '',
version: '',
integration: '',
},
{
- id: 'synthetics-generated',
- type: 'generated',
+ id: 'otel-virtual',
+ type: 'virtual',
+ title: 'OpenTelemetry',
+ description: 'Collect distributed traces with OpenTelemetry',
+ name: 'otel',
+ categories: ['observability'],
+ icons: [
+ {
+ type: 'svg',
+ src:
+ basePath?.prepend('/plugins/observabilityOnboarding/assets/opentelemetry.svg') ??
+ '',
+ },
+ ],
+ url: `${getUrlForApp?.('apm')}/onboarding?agent=openTelemetry` ?? '',
+ version: '',
+ integration: '',
+ },
+ {
+ id: 'synthetics-virtual',
+ type: 'virtual',
title: 'Synthetic monitor',
description: 'Monitor endpoints, pages, and user journeys',
name: 'synthetics',
@@ -70,8 +93,8 @@ export function useCustomCardsForCategory(
toFeaturedCard('prometheus'),
toFeaturedCard('docker'),
{
- id: 'azure-generated',
- type: 'generated',
+ id: 'azure-virtual',
+ type: 'virtual',
title: 'Azure',
description: 'Collect logs and metrics from Microsoft Azure',
name: 'azure',
@@ -84,8 +107,8 @@ export function useCustomCardsForCategory(
onCardClick: createCollectionCardHandler('azure'),
},
{
- id: 'aws-generated',
- type: 'generated',
+ id: 'aws-virtual',
+ type: 'virtual',
title: 'AWS',
description: 'Collect logs and metrics from Amazon Web Services (AWS)',
name: 'aws',
@@ -98,8 +121,8 @@ export function useCustomCardsForCategory(
onCardClick: createCollectionCardHandler('aws'),
},
{
- id: 'gcp-generated',
- type: 'generated',
+ id: 'gcp-virtual',
+ type: 'virtual',
title: 'Google Cloud Platform',
description: 'Collect logs and metrics from Google Cloud Platform',
name: 'gcp',
@@ -116,15 +139,15 @@ export function useCustomCardsForCategory(
return [
{
id: 'system-logs',
- type: 'generated',
+ type: 'virtual',
title: 'Stream host system logs',
description: 'The quickest path to onboard log data from your own machine or server',
- name: 'system-logs-generated',
+ name: 'system-logs-virtual',
categories: ['observability'],
icons: [
{
type: 'svg',
- src: '/XXXXXXXXXXXX/plugins/home/assets/logos/system.svg',
+ src: basePath?.prepend('/plugins/home/assets/logos/system.svg') ?? '',
},
],
url: systemLogsUrl,
@@ -133,10 +156,10 @@ export function useCustomCardsForCategory(
},
{
id: 'custom-logs',
- type: 'generated',
+ type: 'virtual',
title: 'Stream log files',
description: 'Stream any logs into Elastic in a simple way and explore their data',
- name: 'custom-logs-generated',
+ name: 'custom-logs-virtual',
categories: ['observability'],
icons: [
{
@@ -150,8 +173,8 @@ export function useCustomCardsForCategory(
},
toFeaturedCard('nginx'),
{
- id: 'azure-logs-generated',
- type: 'generated',
+ id: 'azure-logs-virtual',
+ type: 'virtual',
title: 'Azure',
description: 'Collect logs from Microsoft Azure',
name: 'azure',
@@ -164,8 +187,8 @@ export function useCustomCardsForCategory(
onCardClick: createCollectionCardHandler('azure'),
},
{
- id: 'aws-logs-generated',
- type: 'generated',
+ id: 'aws-logs-virtual',
+ type: 'virtual',
title: 'AWS',
description: 'Collect logs from Amazon Web Services (AWS)',
name: 'aws',
@@ -178,8 +201,8 @@ export function useCustomCardsForCategory(
onCardClick: createCollectionCardHandler('aws'),
},
{
- id: 'gcp-logs-generated',
- type: 'generated',
+ id: 'gcp-logs-virtual',
+ type: 'virtual',
title: 'Google Cloud Platform',
description: 'Collect logs from Google Cloud Platform',
name: 'gcp',
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index 135e4650ccc09..ad02ad7b977cb 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -19,7 +19,7 @@ import { CustomCard } from './types';
interface Props {
/**
- * A subset of either existing card names to feature, or generated
+ * A subset of either existing card names to feature, or virtual
* cards to display. The inclusion of CustomCards will override the default
* list functionality.
*/
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/types.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/types.ts
index 31b5ed945be45..f999ebb5e5db0 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/types.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/types.ts
@@ -7,8 +7,8 @@
import { IntegrationCardItem } from '@kbn/fleet-plugin/public';
-export type GeneratedCard = {
- type: 'generated';
+export type VirtualCard = {
+ type: 'virtual';
} & IntegrationCardItem;
export interface FeaturedCard {
@@ -16,4 +16,4 @@ export interface FeaturedCard {
name: string;
}
-export type CustomCard = FeaturedCard | GeneratedCard;
+export type CustomCard = FeaturedCard | VirtualCard;
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
index 4d52856ce5551..9532826cd96e7 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/use_integration_card_list.ts
@@ -70,7 +70,7 @@ function formatCustomCards(
for (const card of customCards) {
if (card.type === 'featured' && !!featuredCards[card.name]) {
cards.push(toCustomCard(rewriteUrl(featuredCards[card.name]!)));
- } else if (card.type === 'generated') {
+ } else if (card.type === 'virtual') {
cards.push(toCustomCard(rewriteUrl(card)));
}
}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
index 22552f9df44fa..aa7927f5620d2 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts
@@ -7,7 +7,7 @@
import { IntegrationCardItem } from '@kbn/fleet-plugin/public';
-export const QUICKSTART_FLOWS = ['system-logs-generated', 'custom-logs-generated'];
+export const QUICKSTART_FLOWS = ['system-logs-virtual', 'custom-logs-virtual'];
export const toCustomCard = (card: IntegrationCardItem) => ({
...card,
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/opentelemetry.svg b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/opentelemetry.svg
new file mode 100644
index 0000000000000..a4dc58e057630
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/opentelemetry.svg
@@ -0,0 +1,14 @@
+
From 67bc795f8d5489ce3ed7685eb3e6dd218b9da61c Mon Sep 17 00:00:00 2001
From: Matthew Kime
Date: Tue, 23 Apr 2024 05:19:01 -0500
Subject: [PATCH 061/183] [data views] Fix create runtime field functional test
on MKI (#181101)
## Summary
Addresses flaky test that fails to set the runtime field type to
composite. Passed a 50x run on the flaky test runner -
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5724
Attempts to avoid this happening -
![image
(4)](https://github.com/elastic/kibana/assets/216176/57f38aed-1e70-4fa7-82e6-b9f84e8cb509)
---
test/functional/page_objects/settings_page.ts | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts
index 546e08fe31115..e3e68613d8873 100644
--- a/test/functional/page_objects/settings_page.ts
+++ b/test/functional/page_objects/settings_page.ts
@@ -787,7 +787,7 @@ export class SettingsPageObject extends FtrService {
) {
await this.clickAddField();
await this.setFieldName(name);
- await this.setFieldTypeComposite();
+ await this.setFieldType('Composite');
await this.setCompositeScript(script);
if (subfieldCount > 0) {
await this.testSubjects.find(`typeField_${subfieldCount - 1}`);
@@ -874,14 +874,13 @@ export class SettingsPageObject extends FtrService {
}
async setFieldType(type: string) {
+ const typeFieldDataTestSubj = 'typeField';
this.log.debug('set type = ' + type);
- await this.comboBox.set('typeField', type);
- }
-
- async setFieldTypeComposite() {
- this.log.debug('set type = Composite');
- await this.testSubjects.setValue('typeField', 'Composite');
- await this.browser.pressKeys(this.browser.keys.RETURN);
+ await this.retry.try(async () => {
+ await this.comboBox.set(typeFieldDataTestSubj, type);
+ const comboBox = await this.testSubjects.find(typeFieldDataTestSubj);
+ expect(await this.comboBox.isOptionSelected(comboBox, type)).to.be(true);
+ });
}
async setFieldScript(script: string) {
From 5546c98b35832e06d297da210216d519d29e68dc Mon Sep 17 00:00:00 2001
From: Katerina
Date: Tue, 23 Apr 2024 13:27:39 +0300
Subject: [PATCH 062/183] [Synthetics] Fix externally-controlled format string
(#181281)
## Summary
Close https://github.com/elastic/kibana/issues/177702
use a %s specifier to fix security issue. The %s logs the output as
string
---
.../synthetics/public/utils/api_service/api_service.ts | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/x-pack/plugins/observability_solution/synthetics/public/utils/api_service/api_service.ts b/x-pack/plugins/observability_solution/synthetics/public/utils/api_service/api_service.ts
index 2df15b228590e..131aa2917b661 100644
--- a/x-pack/plugins/observability_solution/synthetics/public/utils/api_service/api_service.ts
+++ b/x-pack/plugins/observability_solution/synthetics/public/utils/api_service/api_service.ts
@@ -50,9 +50,8 @@ class ApiService {
} else {
// eslint-disable-next-line no-console
console.error(
- `API ${apiUrl} is not returning expected response, ${formatErrors(
- decoded.left
- )} for response`,
+ `API $s is not returning expected response, ${formatErrors(decoded.left)} for response`,
+ apiUrl,
response
);
}
From 2141ba76ce4bd690dd5c96e8e41480383797615f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?=
Date: Tue, 23 Apr 2024 12:48:08 +0200
Subject: [PATCH 063/183] [Obs AI Assistant] Address feedback for contextual
insights on alert details page (#181049)
- This PR addresses comments made in
https://github.com/elastic/kibana/pull/180766
- Adds API tests for `GET
/internal/apm/assistant/get_obs_alert_details_context`
- Fixes some bugs I found during testing
- Removes the option `forceSyntheticSource` in the APM app since it is
no longer needed and causes problems when applied to the traces data
stream
---
.../apm/server/index.ts | 6 +-
.../create_apm_event_client/index.test.ts | 1 -
.../create_apm_event_client/index.ts | 9 +-
.../lib/helpers/get_apm_event_client.ts | 1 -
.../get_log_categories/index.ts | 12 +-
.../get_container_id_from_signals.ts | 96 ++--
.../get_service_name_from_signals.ts | 101 ++--
.../index.ts | 135 +++--
.../routes/assistant_functions/route.ts | 10 +-
.../services/get_service_metadata_details.ts | 6 +-
.../alert_details_contextual_insights.tsx | 90 ++--
.../common/apm_api_supertest.ts | 3 +
.../test/apm_api_integration/common/config.ts | 17 +-
.../obs_alert_details_context.spec.ts | 484 ++++++++++++++++++
14 files changed, 749 insertions(+), 222 deletions(-)
create mode 100644 x-pack/test/apm_api_integration/tests/assistant/obs_alert_details_context.spec.ts
diff --git a/x-pack/plugins/observability_solution/apm/server/index.ts b/x-pack/plugins/observability_solution/apm/server/index.ts
index b4cc9b1e3fa5a..44d447ce4c110 100644
--- a/x-pack/plugins/observability_solution/apm/server/index.ts
+++ b/x-pack/plugins/observability_solution/apm/server/index.ts
@@ -50,7 +50,8 @@ const configSchema = schema.object({
enabled: schema.boolean({ defaultValue: false }),
}),
}),
- forceSyntheticSource: schema.boolean({ defaultValue: false }),
+
+ forceSyntheticSource: schema.boolean({ defaultValue: false }), // deprecated
latestAgentVersionsUrl: schema.string({
defaultValue: 'https://apm-agent-versions.elastic.co/versions.json',
}),
@@ -103,6 +104,9 @@ export const config: PluginConfigDescriptor = {
renameFromRoot('xpack.apm.maxServiceSelection', `uiSettings.overrides[${maxSuggestions}]`, {
level: 'warning',
}),
+ unused('forceSyntheticSource', {
+ level: 'warning',
+ }),
],
exposeToBrowser: {
serviceMapEnabled: true,
diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts
index fe96966491538..058897dedd32e 100644
--- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts
+++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts
@@ -45,7 +45,6 @@ describe('APMEventClient', () => {
indices: {} as any,
options: {
includeFrozen: false,
- forceSyntheticSource: false,
},
});
diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts
index 9292856ade32b..1d6592814526c 100644
--- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts
+++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts
@@ -90,7 +90,6 @@ export interface APMEventClientConfig {
indices: APMIndices;
options: {
includeFrozen: boolean;
- forceSyntheticSource: boolean;
};
}
@@ -100,7 +99,6 @@ export class APMEventClient {
private readonly request: KibanaRequest;
public readonly indices: APMIndices;
private readonly includeFrozen: boolean;
- private readonly forceSyntheticSource: boolean;
constructor(config: APMEventClientConfig) {
this.esClient = config.esClient;
@@ -108,7 +106,6 @@ export class APMEventClient {
this.request = config.request;
this.indices = config.indices;
this.includeFrozen = config.options.includeFrozen;
- this.forceSyntheticSource = config.options.forceSyntheticSource;
}
private callAsyncWithDebug({
@@ -156,14 +153,11 @@ export class APMEventClient {
operationName: string,
params: TParams
): Promise> {
- const { events, index, filters } = getRequestBase({
+ const { index, filters } = getRequestBase({
apm: params.apm,
indices: this.indices,
});
- const forceSyntheticSourceForThisRequest =
- this.forceSyntheticSource && events.includes(ProcessorEvent.metric);
-
const searchParams = {
...omit(params, 'apm', 'body'),
index,
@@ -180,7 +174,6 @@ export class APMEventClient {
ignore_unavailable: true,
preference: 'any',
expand_wildcards: ['open' as const, 'hidden' as const],
- ...(forceSyntheticSourceForThisRequest ? { force_synthetic_source: true } : {}),
};
return this.callAsyncWithDebug({
diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts
index d04020531b2b2..3b80c5ede61d3 100644
--- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts
+++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts
@@ -36,7 +36,6 @@ export async function getApmEventClient({
indices,
options: {
includeFrozen,
- forceSyntheticSource: config.forceSyntheticSource,
},
});
});
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts
index 1e5eee8c69050..c842512507bec 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts
@@ -9,7 +9,12 @@ import datemath from '@elastic/datemath';
import { ElasticsearchClient } from '@kbn/core-elasticsearch-server';
import type { CoreRequestHandlerContext } from '@kbn/core/server';
import { aiAssistantLogsIndexPattern } from '@kbn/observability-ai-assistant-plugin/server';
-import { SERVICE_NAME, CONTAINER_ID, HOST_NAME } from '../../../../common/es_fields/apm';
+import {
+ SERVICE_NAME,
+ CONTAINER_ID,
+ HOST_NAME,
+ KUBERNETES_POD_NAME,
+} from '../../../../common/es_fields/apm';
import { getTypedSearch } from '../../../utils/create_typed_es_client';
export type LogCategories =
@@ -33,6 +38,7 @@ export async function getLogCategories({
'service.name'?: string;
'host.name'?: string;
'container.id'?: string;
+ 'kubernetes.pod.name'?: string;
};
}): Promise {
const start = datemath.parse(args.start)?.valueOf()!;
@@ -42,10 +48,10 @@ export async function getLogCategories({
{ field: SERVICE_NAME, value: args[SERVICE_NAME] },
{ field: CONTAINER_ID, value: args[CONTAINER_ID] },
{ field: HOST_NAME, value: args[HOST_NAME] },
+ { field: KUBERNETES_POD_NAME, value: args[KUBERNETES_POD_NAME] },
]);
- const index =
- (await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern)) ?? 'logs-*';
+ const index = await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern);
const search = getTypedSearch(esClient);
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_container_id_from_signals.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_container_id_from_signals.ts
index 35fcb8860d5d6..953b49890a521 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_container_id_from_signals.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_container_id_from_signals.ts
@@ -8,11 +8,15 @@
import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server';
import { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server';
import { aiAssistantLogsIndexPattern } from '@kbn/observability-ai-assistant-plugin/common';
-import { rangeQuery, termQuery, typedSearch } from '@kbn/observability-plugin/server/utils/queries';
+import { rangeQuery, typedSearch } from '@kbn/observability-plugin/server/utils/queries';
import * as t from 'io-ts';
import moment from 'moment';
+import { ESSearchRequest } from '@kbn/es-types';
import { ApmDocumentType } from '../../../../common/document_type';
-import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client';
+import {
+ APMEventClient,
+ APMEventESSearchRequest,
+} from '../../../lib/helpers/create_es_client/create_apm_event_client';
import { observabilityAlertDetailsContextRt } from '.';
import { RollupInterval } from '../../../../common/rollup';
@@ -31,37 +35,14 @@ export async function getContainerIdFromSignals({
return query['container.id'];
}
- if (query['service.name']) {
- const containerId = await getContainerIdFromTrace({
- query,
- apmEventClient,
- });
-
- if (containerId) {
- return containerId;
- }
-
- return getContainerIdFromLogs({ query, esClient, coreContext });
+ if (!query['service.name']) {
+ return;
}
-}
-
-async function getContainerIdFromLogs({
- query,
- esClient,
- coreContext,
-}: {
- query: t.TypeOf;
- esClient: ElasticsearchClient;
- coreContext: CoreRequestHandlerContext;
-}) {
- const index =
- (await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern)) ?? 'logs-*';
- const start = moment(query.alert_started_at).subtract(30, 'minutes').unix();
- const end = moment(query.alert_started_at).unix();
+ const start = moment(query.alert_started_at).subtract(30, 'minutes').valueOf();
+ const end = moment(query.alert_started_at).valueOf();
- const res = await typedSearch<{ container: { id: string } }, any>(esClient, {
- index,
+ const params: APMEventESSearchRequest['body'] = {
_source: ['container.id'],
terminate_after: 1,
size: 1,
@@ -69,28 +50,51 @@ async function getContainerIdFromLogs({
query: {
bool: {
filter: [
+ { term: { 'service.name': query['service.name'] } },
{ exists: { field: 'container.id' } },
- ...termQuery('service.name', query['service.name']),
...rangeQuery(start, end),
],
},
},
+ };
+ const containerId = await getContainerIdFromTraces({
+ params,
+ apmEventClient,
+ });
+
+ if (containerId) {
+ return containerId;
+ }
+
+ return getContainerIdFromLogs({ params, esClient, coreContext });
+}
+
+async function getContainerIdFromLogs({
+ params,
+ esClient,
+ coreContext,
+}: {
+ params: ESSearchRequest['body'];
+ esClient: ElasticsearchClient;
+ coreContext: CoreRequestHandlerContext;
+}) {
+ const index = await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern);
+ const res = await typedSearch<{ container: { id: string } }, any>(esClient, {
+ index,
+ ...params,
});
return res.hits.hits[0]?._source?.container?.id;
}
-async function getContainerIdFromTrace({
- query,
+async function getContainerIdFromTraces({
+ params,
apmEventClient,
}: {
- query: t.TypeOf;
+ params: APMEventESSearchRequest['body'];
apmEventClient: APMEventClient;
}) {
- const start = moment(query.alert_started_at).subtract(30, 'minutes').unix();
- const end = moment(query.alert_started_at).unix();
-
- const res = await apmEventClient.search('get_container_id', {
+ const res = await apmEventClient.search('get_container_id_from_traces', {
apm: {
sources: [
{
@@ -99,21 +103,7 @@ async function getContainerIdFromTrace({
},
],
},
- body: {
- _source: ['container.id'],
- terminate_after: 1,
- size: 1,
- track_total_hits: false,
- query: {
- bool: {
- filter: [
- { exists: { field: 'container.id' } },
- ...termQuery('service.name', query['service.name']),
- ...rangeQuery(start, end),
- ],
- },
- },
- },
+ body: params,
});
return res.hits.hits[0]?._source.container?.id;
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_service_name_from_signals.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_service_name_from_signals.ts
index 738cb54f162a9..3f79178b76d19 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_service_name_from_signals.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_service_name_from_signals.ts
@@ -11,8 +11,12 @@ import { aiAssistantLogsIndexPattern } from '@kbn/observability-ai-assistant-plu
import { rangeQuery, termQuery, typedSearch } from '@kbn/observability-plugin/server/utils/queries';
import * as t from 'io-ts';
import moment from 'moment';
+import { ESSearchRequest } from '@kbn/es-types';
import { ApmDocumentType } from '../../../../common/document_type';
-import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client';
+import {
+ APMEventClient,
+ APMEventESSearchRequest,
+} from '../../../lib/helpers/create_es_client/create_apm_event_client';
import { observabilityAlertDetailsContextRt } from '.';
import { RollupInterval } from '../../../../common/rollup';
@@ -31,37 +35,14 @@ export async function getServiceNameFromSignals({
return query['service.name'];
}
- if (query['container.id']) {
- const serviceName = await getServiceNameFromTraces({
- query,
- apmEventClient,
- });
-
- if (serviceName) {
- return serviceName;
- }
-
- return getServiceNameFromLogs({ query, esClient, coreContext });
+ if (!query['kubernetes.pod.name'] && !query['container.id']) {
+ return;
}
-}
-async function getServiceNameFromLogs({
- query,
- esClient,
- coreContext,
-}: {
- query: t.TypeOf;
- esClient: ElasticsearchClient;
- coreContext: CoreRequestHandlerContext;
-}) {
- const index =
- (await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern)) ?? 'logs-*';
-
- const start = moment(query.alert_started_at).subtract(30, 'minutes').unix();
- const end = moment(query.alert_started_at).unix();
+ const start = moment(query.alert_started_at).subtract(30, 'minutes').valueOf();
+ const end = moment(query.alert_started_at).valueOf();
- const res = await typedSearch<{ service: { name: string } }, any>(esClient, {
- index,
+ const params: APMEventESSearchRequest['body'] = {
_source: ['service.name'],
terminate_after: 1,
size: 1,
@@ -69,28 +50,60 @@ async function getServiceNameFromLogs({
query: {
bool: {
filter: [
+ {
+ bool: {
+ should: [
+ ...termQuery('container.id', query['container.id']),
+ ...termQuery('kubernetes.pod.name', query['kubernetes.pod.name']),
+ ],
+ minimum_should_match: 1,
+ },
+ },
{ exists: { field: 'service.name' } },
- ...termQuery('container.id', query['container.id']),
...rangeQuery(start, end),
],
},
},
+ };
+
+ const serviceName = await getServiceNameFromTraces({
+ params,
+ apmEventClient,
+ });
+
+ if (serviceName) {
+ return serviceName;
+ }
+
+ return getServiceNameFromLogs({ params, esClient, coreContext });
+}
+
+async function getServiceNameFromLogs({
+ params,
+ esClient,
+ coreContext,
+}: {
+ params: ESSearchRequest['body'];
+ esClient: ElasticsearchClient;
+ coreContext: CoreRequestHandlerContext;
+}) {
+ const index = await coreContext.uiSettings.client.get(aiAssistantLogsIndexPattern);
+ const res = await typedSearch<{ service: { name: string } }, any>(esClient, {
+ index,
+ ...params,
});
return res.hits.hits[0]?._source?.service?.name;
}
async function getServiceNameFromTraces({
- query,
+ params,
apmEventClient,
}: {
- query: t.TypeOf;
+ params: APMEventESSearchRequest['body'];
apmEventClient: APMEventClient;
}) {
- const start = moment(query.alert_started_at).subtract(30, 'minutes').unix();
- const end = moment(query.alert_started_at).unix();
-
- const res = await apmEventClient.search('get_service_name', {
+ const res = await apmEventClient.search('get_service_name_from_traces', {
apm: {
sources: [
{
@@ -99,21 +112,7 @@ async function getServiceNameFromTraces({
},
],
},
- body: {
- _source: ['service.name'],
- terminate_after: 1,
- size: 1,
- track_total_hits: false,
- query: {
- bool: {
- filter: [
- { exists: { field: 'service.name' } },
- ...termQuery('container.id', query['container.id']),
- ...rangeQuery(start, end),
- ],
- },
- },
- },
+ body: params,
});
return res.hits.hits[0]?._source.service.name;
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts
index e888fedbc8139..0b76089d1e1c5 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts
@@ -36,6 +36,7 @@ export const observabilityAlertDetailsContextRt = t.intersection([
// infrastructure fields
'host.name': t.string,
'container.id': t.string,
+ 'kubernetes.pod.name': t.string,
}),
]);
@@ -61,6 +62,7 @@ export async function getObservabilityAlertDetailsContext({
const alertStartedAt = query.alert_started_at;
const serviceEnvironment = query['service.environment'];
const hostName = query['host.name'];
+ const kubernetesPodName = query['kubernetes.pod.name'];
const [serviceName, containerId] = await Promise.all([
getServiceNameFromSignals({
query,
@@ -76,70 +78,93 @@ export async function getObservabilityAlertDetailsContext({
}),
]);
+ async function handleError(cb: () => Promise): Promise {
+ try {
+ return await cb();
+ } catch (error) {
+ logger.error('Error while fetching observability alert details context');
+ logger.error(error);
+ return;
+ }
+ }
+
const serviceSummaryPromise = serviceName
- ? getApmServiceSummary({
- apmEventClient,
- annotationsClient,
- esClient,
- apmAlertsClient,
- mlClient,
- logger,
- arguments: {
- 'service.name': serviceName,
- 'service.environment': serviceEnvironment,
- start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
- end: alertStartedAt,
- },
- })
+ ? handleError(() =>
+ getApmServiceSummary({
+ apmEventClient,
+ annotationsClient,
+ esClient,
+ apmAlertsClient,
+ mlClient,
+ logger,
+ arguments: {
+ 'service.name': serviceName,
+ 'service.environment': serviceEnvironment,
+ start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
+ end: alertStartedAt,
+ },
+ })
+ )
: undefined;
const downstreamDependenciesPromise = serviceName
- ? getAssistantDownstreamDependencies({
- apmEventClient,
- arguments: {
- 'service.name': serviceName,
- 'service.environment': serviceEnvironment,
- start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
- end: alertStartedAt,
- },
- })
+ ? handleError(() =>
+ getAssistantDownstreamDependencies({
+ apmEventClient,
+ arguments: {
+ 'service.name': serviceName,
+ 'service.environment': serviceEnvironment,
+ start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
+ end: alertStartedAt,
+ },
+ })
+ )
: undefined;
- const logCategoriesPromise = getLogCategories({
- esClient,
- coreContext,
- arguments: {
- start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
- end: alertStartedAt,
- 'service.name': serviceName,
- 'host.name': hostName,
- 'container.id': containerId,
- },
- });
+ const logCategoriesPromise = handleError(() =>
+ getLogCategories({
+ esClient,
+ coreContext,
+ arguments: {
+ start: moment(alertStartedAt).subtract(5, 'minute').toISOString(),
+ end: alertStartedAt,
+ 'service.name': serviceName,
+ 'host.name': hostName,
+ 'container.id': containerId,
+ 'kubernetes.pod.name': kubernetesPodName,
+ },
+ })
+ );
- const serviceChangePointsPromise = getServiceChangePoints({
- apmEventClient,
- alertStartedAt,
- serviceName,
- serviceEnvironment,
- transactionType: query['transaction.type'],
- transactionName: query['transaction.name'],
- });
+ const serviceChangePointsPromise = handleError(() =>
+ getServiceChangePoints({
+ apmEventClient,
+ alertStartedAt,
+ serviceName,
+ serviceEnvironment,
+ transactionType: query['transaction.type'],
+ transactionName: query['transaction.name'],
+ })
+ );
- const exitSpanChangePointsPromise = getExitSpanChangePoints({
- apmEventClient,
- alertStartedAt,
- serviceName,
- serviceEnvironment,
- });
+ const exitSpanChangePointsPromise = handleError(() =>
+ getExitSpanChangePoints({
+ apmEventClient,
+ alertStartedAt,
+ serviceName,
+ serviceEnvironment,
+ })
+ );
- const anomaliesPromise = getAnomalies({
- start: moment(alertStartedAt).subtract(1, 'hour').valueOf(),
- end: moment(alertStartedAt).valueOf(),
- environment: serviceEnvironment,
- mlClient,
- logger,
- });
+ const anomaliesPromise = handleError(() =>
+ getAnomalies({
+ start: moment(alertStartedAt).subtract(1, 'hour').valueOf(),
+ end: moment(alertStartedAt).valueOf(),
+ environment: serviceEnvironment,
+ mlClient,
+ logger,
+ })
+ );
const [
serviceSummary,
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts
index 62729b60e4e92..a94b13b79577c 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts
@@ -34,7 +34,7 @@ import { LogCategories } from './get_log_categories';
const getObservabilityAlertDetailsContextRoute = createApmServerRoute({
endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
options: {
- tags: ['access:apm', 'access:ai_assistant'],
+ tags: ['access:apm'],
},
params: t.type({
@@ -45,16 +45,16 @@ const getObservabilityAlertDetailsContextRoute = createApmServerRoute({
): Promise<{
serviceSummary?: ServiceSummary;
downstreamDependencies?: APMDownstreamDependency[];
- logCategories: LogCategories;
- serviceChangePoints: Array<{
+ logCategories?: LogCategories;
+ serviceChangePoints?: Array<{
title: string;
changes: TimeseriesChangePoint[];
}>;
- exitSpanChangePoints: Array<{
+ exitSpanChangePoints?: Array<{
title: string;
changes: TimeseriesChangePoint[];
}>;
- anomalies: ApmAnomalies;
+ anomalies?: ApmAnomalies;
}> => {
const { context, request, plugins, logger, params } = resources;
const { query } = params;
diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts
index 5d233c8ac0837..d7a81a7902efb 100644
--- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts
+++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts
@@ -171,7 +171,8 @@ export async function getServiceMetadataDetails({
const response = await apmEventClient.search('get_service_metadata_details', params);
- if (response.hits.total.value === 0) {
+ const hit = response.hits.hits[0]?._source as ServiceMetadataDetailsRaw | undefined;
+ if (!hit) {
return {
service: undefined,
container: undefined,
@@ -179,8 +180,7 @@ export async function getServiceMetadataDetails({
};
}
- const { service, agent, host, kubernetes, container, cloud, labels } = response.hits.hits[0]
- ._source as ServiceMetadataDetailsRaw;
+ const { service, agent, host, kubernetes, container, cloud, labels } = hit;
const serviceMetadataDetails = {
versions: response.aggregations?.serviceVersions.buckets.map((bucket) => bucket.key as string),
diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details_contextual_insights.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details_contextual_insights.tsx
index 6228d778ec70c..5b043e3ac8928 100644
--- a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details_contextual_insights.tsx
+++ b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details_contextual_insights.tsx
@@ -28,40 +28,42 @@ export function AlertDetailContextualInsights({ alert }: { alert: AlertData | nu
return [];
}
- const res = await http.get('/internal/apm/assistant/get_obs_alert_details_context', {
- query: {
- alert_started_at: new Date(alert.formatted.start).toISOString(),
-
- // service fields
- 'service.name': fields['service.name'],
- 'service.environment': fields['service.environment'],
- 'transaction.type': fields['transaction.type'],
- 'transaction.name': fields['transaction.name'],
-
- // infra fields
- 'host.name': fields['host.name'],
- 'container.id': fields['container.id'],
- },
- });
-
- const {
- serviceSummary,
- downstreamDependencies,
- logCategories,
- serviceChangePoints,
- exitSpanChangePoints,
- anomalies,
- } = res as any;
-
- const serviceName = fields['service.name'];
- const serviceEnvironment = fields['service.environment'];
-
- const obsAlertContext = `${
- !isEmpty(serviceSummary)
- ? `Metadata for the service where the alert occurred:
+ try {
+ const res = await http.get('/internal/apm/assistant/get_obs_alert_details_context', {
+ query: {
+ alert_started_at: new Date(alert.formatted.start).toISOString(),
+
+ // service fields
+ 'service.name': fields['service.name'],
+ 'service.environment': fields['service.environment'],
+ 'transaction.type': fields['transaction.type'],
+ 'transaction.name': fields['transaction.name'],
+
+ // infra fields
+ 'host.name': fields['host.name'],
+ 'container.id': fields['container.id'],
+ 'kubernetes.pod.name': fields['kubernetes.pod.name'],
+ },
+ });
+
+ const {
+ serviceSummary,
+ downstreamDependencies,
+ logCategories,
+ serviceChangePoints,
+ exitSpanChangePoints,
+ anomalies,
+ } = res as any;
+
+ const serviceName = fields['service.name'];
+ const serviceEnvironment = fields['service.environment'];
+
+ const obsAlertContext = `${
+ !isEmpty(serviceSummary)
+ ? `Metadata for the service where the alert occurred:
${JSON.stringify(serviceSummary, null, 2)}`
- : ''
- }
+ : ''
+ }
${
!isEmpty(downstreamDependencies)
@@ -99,21 +101,29 @@ ${JSON.stringify(downstreamDependencies, null, 2)}`
}
`;
- return observabilityAIAssistant.getContextualInsightMessages({
- message: `I'm looking at an alert and trying to understand why it was triggered`,
- instructions: dedent(
- `I'm an SRE. I am looking at an alert that was triggered. I want to understand why it was triggered, what it means, and what I should do next.
+ return observabilityAIAssistant.getContextualInsightMessages({
+ message: `I'm looking at an alert and trying to understand why it was triggered`,
+ instructions: dedent(
+ `I'm an SRE. I am looking at an alert that was triggered. I want to understand why it was triggered, what it means, and what I should do next.
The following contextual information is available to help me understand the alert:
${obsAlertContext}
Be brief and to the point.
Do not list the alert details as bullet points.
- Do refer to the contextual information provided above when relevant.
+ Refer to the contextual information provided above when relevant.
Pay specific attention to why the alert happened and what may have contributed to it.
`
- ),
- });
+ ),
+ });
+ } catch (e) {
+ return observabilityAIAssistant.getContextualInsightMessages({
+ message: `I'm looking at an alert and trying to understand why it was triggered`,
+ instructions: dedent(
+ `I'm an SRE. I am looking at an alert that was triggered. I want to understand why it was triggered, what it means, and what I should do next.`
+ ),
+ });
+ }
}, [alert, http, observabilityAIAssistant]);
if (!ObservabilityAIAssistantContextualInsight) {
diff --git a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts
index 4fe7ae4a62e71..9e4f25a7c7c7b 100644
--- a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts
+++ b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts
@@ -31,6 +31,9 @@ export function createApmApiClient(st: supertest.SuperTest) {
const pathnameWithSpaceId = options.spaceId ? `/s/${options.spaceId}${pathname}` : pathname;
const url = format({ pathname: pathnameWithSpaceId, query: params?.query });
+ // eslint-disable-next-line no-console
+ console.debug(`Calling APM API: ${method.toUpperCase()} ${url}`);
+
const headers: Record = {
'kbn-xsrf': 'foo',
'x-elastic-internal-origin': 'foo',
diff --git a/x-pack/test/apm_api_integration/common/config.ts b/x-pack/test/apm_api_integration/common/config.ts
index e2c57ae442d26..a4f02524b98cf 100644
--- a/x-pack/test/apm_api_integration/common/config.ts
+++ b/x-pack/test/apm_api_integration/common/config.ts
@@ -7,7 +7,13 @@
import { ApmUsername } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/authentication';
import { createApmUsers } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/create_apm_users';
-import { ApmSynthtraceEsClient, ApmSynthtraceKibanaClient } from '@kbn/apm-synthtrace';
+import {
+ ApmSynthtraceEsClient,
+ ApmSynthtraceKibanaClient,
+ LogsSynthtraceEsClient,
+ createLogger,
+ LogLevel,
+} from '@kbn/apm-synthtrace';
import { FtrConfigProviderContext, kbnTestConfig } from '@kbn/test';
import supertest from 'supertest';
import { format, UrlObject } from 'url';
@@ -66,6 +72,9 @@ export interface CreateTest {
services: InheritedServices & {
apmFtrConfig: () => ApmFtrConfig;
registry: ({ getService }: FtrProviderContext) => ReturnType;
+ logSynthtraceEsClient: (
+ context: InheritedFtrProviderContext
+ ) => Promise;
synthtraceEsClient: (context: InheritedFtrProviderContext) => Promise;
synthtraceKibanaClient: (
context: InheritedFtrProviderContext
@@ -106,6 +115,12 @@ export function createTestConfig(
synthtraceEsClient: (context: InheritedFtrProviderContext) => {
return bootstrapApmSynthtrace(context, synthtraceKibanaClient);
},
+ logSynthtraceEsClient: (context: InheritedFtrProviderContext) =>
+ new LogsSynthtraceEsClient({
+ client: context.getService('es'),
+ logger: createLogger(LogLevel.info),
+ refreshAfterIndex: true,
+ }),
synthtraceKibanaClient: () => synthtraceKibanaClient,
apmApiClient: async (context: InheritedFtrProviderContext) => {
const { username, password } = servers.kibana;
diff --git a/x-pack/test/apm_api_integration/tests/assistant/obs_alert_details_context.spec.ts b/x-pack/test/apm_api_integration/tests/assistant/obs_alert_details_context.spec.ts
new file mode 100644
index 0000000000000..fe9967683ec8d
--- /dev/null
+++ b/x-pack/test/apm_api_integration/tests/assistant/obs_alert_details_context.spec.ts
@@ -0,0 +1,484 @@
+/*
+ * 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 moment from 'moment';
+import { log, apm, generateShortId, timerange } from '@kbn/apm-synthtrace-client';
+import expect from '@kbn/expect';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { SupertestReturnType } from '../../common/apm_api_supertest';
+
+export default function ApiTest({ getService }: FtrProviderContext) {
+ const registry = getService('registry');
+ const apmApiClient = getService('apmApiClient');
+ const apmSynthtraceClient = getService('synthtraceEsClient');
+ const logSynthtraceClient = getService('logSynthtraceEsClient');
+
+ registry.when(
+ 'fetching observability alerts details context for AI assistant contextual insights',
+ { config: 'trial', archives: [] },
+ () => {
+ const start = moment().subtract(10, 'minutes').valueOf();
+ const end = moment().valueOf();
+ const range = timerange(start, end);
+
+ describe('when no traces or logs are available', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ },
+ },
+ });
+ });
+
+ it('returns nothing', () => {
+ expect(response.body).to.eql({
+ serviceChangePoints: [],
+ exitSpanChangePoints: [],
+ anomalies: [],
+ });
+ });
+ });
+
+ describe('when traces and logs are ingested and logs are not annotated with service.name', async () => {
+ before(async () => {
+ await ingestTraces({ 'service.name': 'Backend', 'container.id': 'my-container-a' });
+ await ingestLogs({
+ 'container.id': 'my-container-a',
+ 'kubernetes.pod.name': 'pod-a',
+ });
+ });
+
+ after(async () => {
+ await cleanup();
+ });
+
+ describe('when no params are specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ },
+ },
+ });
+ });
+
+ it('returns no service summary', async () => {
+ expect(response.body.serviceSummary).to.be(undefined);
+ });
+
+ it('returns no downstream dependencies', async () => {
+ expect(response.body.downstreamDependencies ?? []).to.eql([]);
+ });
+
+ it('returns 1 log category', async () => {
+ expect(response.body.logCategories?.map(({ errorCategory }) => errorCategory)).to.eql([
+ 'Error message from container my-container-a',
+ ]);
+ });
+ });
+
+ describe('when service name is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'service.name': 'Backend',
+ },
+ },
+ });
+ });
+
+ it('returns service summary', () => {
+ expect(response.body.serviceSummary).to.eql({
+ 'service.name': 'Backend',
+ 'service.environment': ['production'],
+ 'agent.name': 'java',
+ 'service.version': ['1.0.0'],
+ 'language.name': 'java',
+ instances: 1,
+ anomalies: [],
+ alerts: [],
+ deployments: [],
+ });
+ });
+
+ it('returns downstream dependencies', async () => {
+ expect(response.body.downstreamDependencies).to.eql([
+ {
+ 'span.destination.service.resource': 'elasticsearch',
+ 'span.type': 'db',
+ 'span.subtype': 'elasticsearch',
+ },
+ ]);
+ });
+
+ it('returns log categories', () => {
+ expect(response.body.logCategories).to.have.length(1);
+
+ const logCategory = response.body.logCategories?.[0];
+ expect(logCategory?.sampleMessage).to.match(
+ /Error message #\d{16} from container my-container-a/
+ );
+ expect(logCategory?.docCount).to.be.greaterThan(0);
+ expect(logCategory?.errorCategory).to.be('Error message from container my-container-a');
+ });
+ });
+
+ describe('when container id is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'container.id': 'my-container-a',
+ },
+ },
+ });
+ });
+
+ it('returns service summary', () => {
+ expect(response.body.serviceSummary).to.eql({
+ 'service.name': 'Backend',
+ 'service.environment': ['production'],
+ 'agent.name': 'java',
+ 'service.version': ['1.0.0'],
+ 'language.name': 'java',
+ instances: 1,
+ anomalies: [],
+ alerts: [],
+ deployments: [],
+ });
+ });
+
+ it('returns downstream dependencies', async () => {
+ expect(response.body.downstreamDependencies).to.eql([
+ {
+ 'span.destination.service.resource': 'elasticsearch',
+ 'span.type': 'db',
+ 'span.subtype': 'elasticsearch',
+ },
+ ]);
+ });
+
+ it('returns log categories', () => {
+ expect(response.body.logCategories).to.have.length(1);
+
+ const logCategory = response.body.logCategories?.[0];
+ expect(logCategory?.sampleMessage).to.match(
+ /Error message #\d{16} from container my-container-a/
+ );
+ expect(logCategory?.docCount).to.be.greaterThan(0);
+ expect(logCategory?.errorCategory).to.be('Error message from container my-container-a');
+ });
+ });
+
+ describe('when non-existing container id is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'container.id': 'non-existing-container',
+ },
+ },
+ });
+ });
+
+ it('returns nothing', () => {
+ expect(response.body).to.eql({
+ logCategories: [],
+ serviceChangePoints: [],
+ exitSpanChangePoints: [],
+ anomalies: [],
+ });
+ });
+ });
+
+ describe('when non-existing service.name is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'service.name': 'non-existing-service',
+ },
+ },
+ });
+ });
+
+ it('returns empty service summary', () => {
+ expect(response.body.serviceSummary).to.eql({
+ 'service.name': 'non-existing-service',
+ 'service.environment': [],
+ instances: 1,
+ anomalies: [],
+ alerts: [],
+ deployments: [],
+ });
+ });
+
+ it('returns no downstream dependencies', async () => {
+ expect(response.body.downstreamDependencies).to.eql([]);
+ });
+
+ it('returns log categories', () => {
+ expect(response.body.logCategories).to.have.length(1);
+ });
+ });
+ });
+
+ describe('when traces and logs are ingested and logs are annotated with service.name', async () => {
+ before(async () => {
+ await ingestTraces({ 'service.name': 'Backend', 'container.id': 'my-container-a' });
+ await ingestLogs({
+ 'service.name': 'Backend',
+ 'container.id': 'my-container-a',
+ 'kubernetes.pod.name': 'pod-a',
+ });
+
+ // also ingest unrelated Frontend traces and logs that should not show up in the response when fetching "Backend"-related things
+ await ingestTraces({ 'service.name': 'Frontend', 'container.id': 'my-container-b' });
+ await ingestLogs({
+ 'service.name': 'Frontend',
+ 'container.id': 'my-container-b',
+ 'kubernetes.pod.name': 'pod-b',
+ });
+
+ // also ingest logs that are not annotated with service.name
+ await ingestLogs({
+ 'container.id': 'my-container-c',
+ 'kubernetes.pod.name': 'pod-c',
+ });
+ });
+
+ after(async () => {
+ await cleanup();
+ });
+
+ describe('when no params are specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ },
+ },
+ });
+ });
+
+ it('returns no service summary', async () => {
+ expect(response.body.serviceSummary).to.be(undefined);
+ });
+
+ it('returns 1 log category', async () => {
+ expect(response.body.logCategories?.map(({ errorCategory }) => errorCategory)).to.eql([
+ 'Error message from service',
+ 'Error message from container my-container-c',
+ ]);
+ });
+ });
+
+ describe('when service name is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'service.name': 'Backend',
+ },
+ },
+ });
+ });
+
+ it('returns log categories', () => {
+ expect(response.body.logCategories).to.have.length(1);
+
+ const logCategory = response.body.logCategories?.[0];
+ expect(logCategory?.sampleMessage).to.match(
+ /Error message #\d{16} from service Backend/
+ );
+ expect(logCategory?.docCount).to.be.greaterThan(0);
+ expect(logCategory?.errorCategory).to.be('Error message from service Backend');
+ });
+ });
+
+ describe('when container id is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'container.id': 'my-container-a',
+ },
+ },
+ });
+ });
+
+ it('returns log categories', () => {
+ expect(response.body.logCategories).to.have.length(1);
+
+ const logCategory = response.body.logCategories?.[0];
+ expect(logCategory?.sampleMessage).to.match(
+ /Error message #\d{16} from service Backend/
+ );
+ expect(logCategory?.docCount).to.be.greaterThan(0);
+ expect(logCategory?.errorCategory).to.be('Error message from service Backend');
+ });
+ });
+
+ describe('when non-existing service.name is specified', async () => {
+ let response: SupertestReturnType<'GET /internal/apm/assistant/get_obs_alert_details_context'>;
+ before(async () => {
+ response = await apmApiClient.writeUser({
+ endpoint: 'GET /internal/apm/assistant/get_obs_alert_details_context',
+ params: {
+ query: {
+ alert_started_at: new Date(end).toISOString(),
+ 'service.name': 'non-existing-service',
+ },
+ },
+ });
+ });
+
+ it('returns empty service summary', () => {
+ expect(response.body.serviceSummary).to.eql({
+ 'service.name': 'non-existing-service',
+ 'service.environment': [],
+ instances: 1,
+ anomalies: [],
+ alerts: [],
+ deployments: [],
+ });
+ });
+
+ it('does not return log categories', () => {
+ expect(response.body.logCategories?.map(({ errorCategory }) => errorCategory)).to.eql([
+ 'Error message from container my-container-c',
+ ]);
+ });
+ });
+ });
+
+ async function ingestTraces(eventMetadata: {
+ 'service.name': string;
+ 'container.id'?: string;
+ 'host.name'?: string;
+ 'kubernetes.pod.name'?: string;
+ }) {
+ const serviceInstance = apm
+ .service({
+ name: eventMetadata['service.name'],
+ environment: 'production',
+ agentName: 'java',
+ })
+ .instance('my-instance');
+
+ const events = range
+ .interval('1m')
+ .rate(1)
+ .generator((timestamp) => {
+ return serviceInstance
+ .transaction({ transactionName: 'tx' })
+ .timestamp(timestamp)
+ .duration(10000)
+ .defaults({ 'service.version': '1.0.0', ...eventMetadata })
+ .outcome('success')
+ .children(
+ serviceInstance
+ .span({
+ spanName: 'GET apm-*/_search',
+ spanType: 'db',
+ spanSubtype: 'elasticsearch',
+ })
+ .duration(1000)
+ .success()
+ .destination('elasticsearch')
+ .timestamp(timestamp)
+ );
+ });
+
+ await apmSynthtraceClient.index(events);
+ }
+
+ function ingestLogs(eventMetadata: {
+ 'service.name'?: string;
+ 'container.id'?: string;
+ 'kubernetes.pod.name'?: string;
+ 'host.name'?: string;
+ }) {
+ const getMessage = () => {
+ const msgPrefix = `Error message #${generateShortId()}`;
+
+ if (eventMetadata['service.name']) {
+ return `${msgPrefix} from service ${eventMetadata['service.name']}`;
+ }
+
+ if (eventMetadata['container.id']) {
+ return `${msgPrefix} from container ${eventMetadata['container.id']}`;
+ }
+
+ if (eventMetadata['kubernetes.pod.name']) {
+ return `${msgPrefix} from pod ${eventMetadata['kubernetes.pod.name']}`;
+ }
+
+ if (eventMetadata['host.name']) {
+ return `${msgPrefix} from host ${eventMetadata['host.name']}`;
+ }
+
+ return msgPrefix;
+ };
+
+ const events = range
+ .interval('1m')
+ .rate(1)
+ .generator((timestamp) => {
+ return [
+ log
+ .create()
+ .message(getMessage())
+ .logLevel('error')
+ .defaults({
+ 'trace.id': generateShortId(),
+ 'agent.name': 'synth-agent',
+ ...eventMetadata,
+ })
+ .timestamp(timestamp),
+ ];
+ });
+
+ return logSynthtraceClient.index(events);
+ }
+
+ async function cleanup() {
+ await apmSynthtraceClient.clean();
+ await logSynthtraceClient.clean();
+ }
+ }
+ );
+}
From 441d00d880bfe9cb6f04b23fd2fff13b8df113b2 Mon Sep 17 00:00:00 2001
From: Pablo Machado
Date: Tue, 23 Apr 2024 13:10:43 +0200
Subject: [PATCH 064/183] [SecuritySolution] Add auditing to Asset Criticality
and Risk Engine (#181045)
## Summary
Add auditing to Asset Criticality and Risk Engine as specified in the
EPIC ticket.
All telemetry is sent from data clients and route files. To do that, I
had to update some extra files to make sure the routes and data clients
had access to the audit logger.
### How to test
1. Deploy branch to cloud
2. Send cloud deployment logs to another deployment
3. Enable `xpack.security.audit.enabled: true` for kibana
4. Use the risk engine on the deployment
5. On the logs deployment, verify if the audit logs are arriving
* Open explore
* Set the data view `elastic-cloud-logs-*`
* Search for the actions `event.action: action_name`
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../routes/__mocks__/request_context.ts | 3 +
.../asset_criticality_data_client.test.ts | 5 ++
.../asset_criticality_data_client.ts | 25 +++++++
.../asset_criticality/audit.ts | 16 ++++
...ck_and_init_asset_criticality_resources.ts | 1 +
.../asset_criticality/routes/delete.ts | 15 +++-
.../asset_criticality/routes/get.ts | 12 +++
.../asset_criticality/routes/privileges.ts | 13 ++++
.../asset_criticality/routes/status.ts | 13 ++++
.../asset_criticality/routes/upload_csv.ts | 14 +++-
.../asset_criticality/routes/upsert.ts | 12 +++
.../server/lib/entity_analytics/audit.ts | 25 +++++++
.../lib/entity_analytics/risk_engine/audit.ts | 19 +++++
.../risk_engine_data_client.test.ts | 1 +
.../risk_engine/risk_engine_data_client.ts | 75 +++++++++++++++++++
.../risk_engine/routes/disable.ts | 32 +++++++-
.../risk_engine/routes/enable.ts | 30 +++++++-
.../risk_engine/routes/init.ts | 15 +++-
.../risk_engine/routes/privileges.ts | 15 +++-
.../risk_engine/routes/settings.ts | 12 +++
.../lib/entity_analytics/risk_score/audit.ts | 13 ++++
.../risk_score/risk_score_data_client.ts | 14 ++++
.../risk_score/routes/calculation.ts | 15 +++-
.../risk_score/routes/preview.ts | 12 +++
.../tasks/risk_scoring_task.test.ts | 2 +
.../risk_score/tasks/risk_scoring_task.ts | 6 ++
.../security_solution/server/plugin.ts | 1 +
.../server/request_context_factory.ts | 6 ++
.../plugins/security_solution/server/types.ts | 2 +
.../plugins/security_solution/tsconfig.json | 3 +-
30 files changed, 418 insertions(+), 9 deletions(-)
create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/audit.ts
create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/audit.ts
create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/audit.ts
create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/audit.ts
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts
index cb0b48b8e3f0d..0893c7297763c 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts
@@ -37,6 +37,7 @@ import type { EndpointAuthz } from '../../../../../common/endpoint/types/authz';
import { riskEngineDataClientMock } from '../../../entity_analytics/risk_engine/risk_engine_data_client.mock';
import { riskScoreDataClientMock } from '../../../entity_analytics/risk_score/risk_score_data_client.mock';
import { assetCriticalityDataClientMock } from '../../../entity_analytics/asset_criticality/asset_criticality_data_client.mock';
+import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
export const createMockClients = () => {
const core = coreMock.createRequestHandlerContext();
@@ -114,6 +115,7 @@ const createSecuritySolutionRequestContextMock = (
): jest.Mocked => {
const core = clients.core;
const kibanaRequest = requestMock.create();
+ const mockAuditLogger = auditLoggerMock.create();
return {
core,
@@ -148,6 +150,7 @@ const createSecuritySolutionRequestContextMock = (
getRiskEngineDataClient: jest.fn(() => clients.riskEngineDataClient),
getRiskScoreDataClient: jest.fn(() => clients.riskScoreDataClient),
getAssetCriticalityDataClient: jest.fn(() => clients.assetCriticalityDataClient),
+ getAuditLogger: jest.fn(() => mockAuditLogger),
};
};
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.test.ts
index b9cabeb732450..b77ea7742077d 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.test.ts
@@ -8,6 +8,7 @@
import { loggingSystemMock, elasticsearchServiceMock } from '@kbn/core/server/mocks';
import { AssetCriticalityDataClient } from './asset_criticality_data_client';
import { createOrUpdateIndex } from '../utils/create_or_update_index';
+import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
type MockInternalEsClient = ReturnType<
typeof elasticsearchServiceMock.createScopedClusterClient
@@ -19,12 +20,15 @@ jest.mock('../utils/create_or_update_index', () => ({
describe('AssetCriticalityDataClient', () => {
const esClientInternal = elasticsearchServiceMock.createScopedClusterClient().asInternalUser;
const logger = loggingSystemMock.createLogger();
+ const mockAuditLogger = auditLoggerMock.create();
+
describe('init', () => {
it('ensures the index is available and up to date', async () => {
const assetCriticalityDataClient = new AssetCriticalityDataClient({
esClient: esClientInternal,
logger,
namespace: 'default',
+ auditLogger: mockAuditLogger,
});
await assetCriticalityDataClient.init();
@@ -72,6 +76,7 @@ describe('AssetCriticalityDataClient', () => {
esClient: esClientMock,
logger: loggerMock,
namespace: 'default',
+ auditLogger: mockAuditLogger,
});
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts
index fd72e7501f7bb..81f0386a6c96c 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts
@@ -8,6 +8,7 @@ import type { ESFilter } from '@kbn/es-types';
import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types';
import type { Logger, ElasticsearchClient } from '@kbn/core/server';
import { mappingFromFieldMap } from '@kbn/alerting-plugin/common';
+import type { AuditLogger } from '@kbn/security-plugin-types-server';
import type {
AssetCriticalityCsvUploadResponse,
AssetCriticalityUpsert,
@@ -16,9 +17,12 @@ import type { AssetCriticalityRecord } from '../../../../common/api/entity_analy
import { createOrUpdateIndex } from '../utils/create_or_update_index';
import { getAssetCriticalityIndex } from '../../../../common/entity_analytics/asset_criticality';
import { assetCriticalityFieldMap } from './constants';
+import { AssetCriticalityAuditActions } from './audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../audit';
interface AssetCriticalityClientOpts {
logger: Logger;
+ auditLogger: AuditLogger | undefined;
esClient: ElasticsearchClient;
namespace: string;
}
@@ -49,6 +53,16 @@ export class AssetCriticalityDataClient {
mappings: mappingFromFieldMap(assetCriticalityFieldMap, 'strict'),
},
});
+
+ this.options.auditLogger?.log({
+ message: 'User installed asset criticality Elasticsearch resources',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_INITIALIZE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CREATION,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
}
/**
@@ -83,6 +97,17 @@ export class AssetCriticalityDataClient {
const result = await this.options.esClient.indices.exists({
index: this.getIndex(),
});
+
+ this.options.auditLogger?.log({
+ message: 'User checked if the asset criticality Elasticsearch resources were installed',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_INITIALIZE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return result;
} catch (e) {
return false;
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/audit.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/audit.ts
new file mode 100644
index 0000000000000..3d4a4dfed4c22
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/audit.ts
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */
+
+export enum AssetCriticalityAuditActions {
+ ASSET_CRITICALITY_INITIALIZE = 'asset_criticality_initialize',
+ ASSET_CRITICALITY_UNASSIGN = 'asset_criticality_unassign',
+ ASSET_CRITICALITY_GET = 'asset_criticality_get',
+ ASSET_CRITICALITY_PRIVILEGE_GET = 'asset_criticality_privilege_get',
+ ASSET_CRITICALITY_STATUS_GET = 'asset_criticality_status_get',
+ ASSET_CRITICALITY_UPDATE = 'asset_criticality_update',
+ ASSET_CRITICALITY_BULK_UPDATE = 'asset_criticality_bulk_update',
+}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/check_and_init_asset_criticality_resources.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/check_and_init_asset_criticality_resources.ts
index 08843c90a1739..9dbede37adb50 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/check_and_init_asset_criticality_resources.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/check_and_init_asset_criticality_resources.ts
@@ -25,6 +25,7 @@ export const checkAndInitAssetCriticalityResources = async (
const assetCriticalityDataClient = new AssetCriticalityDataClient({
esClient,
logger,
+ auditLogger: securityContext.getAuditLogger(),
namespace: securityContext.getSpaceId(),
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts
index 596e371fad4fb..f9630542283ef 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts
@@ -17,6 +17,8 @@ import { buildRouteValidationWithZod } from '../../../../utils/build_validation/
import { checkAndInitAssetCriticalityResources } from '../check_and_init_asset_criticality_resources';
import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { AssetCriticalityAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const assetCriticalityDeleteRoute = (
router: EntityAnalyticsRoutesDeps['router'],
logger: Logger
@@ -39,12 +41,23 @@ export const assetCriticalityDeleteRoute = (
},
},
async (context, request, response) => {
+ const securitySolution = await context.securitySolution;
+
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to un-assign asset criticality from an entity',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_UNASSIGN,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.DELETION,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
const siemResponse = buildSiemResponse(response);
try {
await assertAdvancedSettingsEnabled(await context.core, ENABLE_ASSET_CRITICALITY_SETTING);
await checkAndInitAssetCriticalityResources(context, logger);
- const securitySolution = await context.securitySolution;
const assetCriticalityClient = securitySolution.getAssetCriticalityDataClient();
await assetCriticalityClient.delete({
idField: request.query.id_field,
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/get.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/get.ts
index b81eddfa5ecea..fd2a826df117a 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/get.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/get.ts
@@ -17,6 +17,8 @@ import { buildRouteValidationWithZod } from '../../../../utils/build_validation/
import { AssetCriticalityRecordIdParts } from '../../../../../common/api/entity_analytics/asset_criticality';
import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { AssetCriticalityAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const assetCriticalityGetRoute = (
router: EntityAnalyticsRoutesDeps['router'],
logger: Logger
@@ -55,6 +57,16 @@ export const assetCriticalityGetRoute = (
return response.notFound();
}
+ securitySolution.getAuditLogger()?.log({
+ message: 'User accessed the criticality level for an entity',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return response.ok({ body: record });
} catch (e) {
const error = transformError(e);
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/privileges.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/privileges.ts
index a4433eaaca4cf..a339ee994c8c2 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/privileges.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/privileges.ts
@@ -16,6 +16,8 @@ import { checkAndInitAssetCriticalityResources } from '../check_and_init_asset_c
import { getUserAssetCriticalityPrivileges } from '../get_user_asset_criticality_privileges';
import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { AssetCriticalityAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const assetCriticalityPrivilegesRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -45,6 +47,17 @@ export const assetCriticalityPrivilegesRoute = (
const [_, { security }] = await getStartServices();
const body = await getUserAssetCriticalityPrivileges(request, security);
+ const securitySolution = await context.securitySolution;
+ securitySolution.getAuditLogger()?.log({
+ message: 'User checked if they have the required privileges to use asset criticality',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_PRIVILEGE_GET,
+ category: AUDIT_CATEGORY.AUTHENTICATION,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
return response.ok({
body,
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/status.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/status.ts
index 465cfcc4d4154..27910cfd40631 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/status.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/status.ts
@@ -13,8 +13,10 @@ import {
APP_ID,
ENABLE_ASSET_CRITICALITY_SETTING,
} from '../../../../../common/constants';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
import type { EntityAnalyticsRoutesDeps } from '../../types';
import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled';
+import { AssetCriticalityAuditActions } from '../audit';
import { checkAndInitAssetCriticalityResources } from '../check_and_init_asset_criticality_resources';
export const assetCriticalityStatusRoute = (
@@ -39,6 +41,17 @@ export const assetCriticalityStatusRoute = (
const assetCriticalityClient = securitySolution.getAssetCriticalityDataClient();
const result = await assetCriticalityClient.getStatus();
+
+ securitySolution.getAuditLogger()?.log({
+ message: 'User checked the status of the asset criticality service',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_STATUS_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
const body: AssetCriticalityStatusResponse = {
asset_criticality_resources_installed: result.isAssetCriticalityResourcesInstalled,
};
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts
index 2374c4427b6d3..cf4123db487a4 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts
@@ -23,6 +23,8 @@ import { transformCSVToUpsertRecords } from '../transform_csv_to_upsert_records'
import { createAssetCriticalityProcessedFileEvent } from '../../../telemetry/event_based/events';
import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { AssetCriticalityAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const assetCriticalityCSVUploadRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -57,6 +59,17 @@ export const assetCriticalityCSVUploadRoute = (
},
},
async (context, request, response) => {
+ const securitySolution = await context.securitySolution;
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to assign many asset criticalities via file upload',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_BULK_UPDATE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CREATION,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
const start = new Date();
const siemResponse = buildSiemResponse(response);
const [coreStart] = await getStartServices();
@@ -65,7 +78,6 @@ export const assetCriticalityCSVUploadRoute = (
try {
await assertAdvancedSettingsEnabled(await context.core, ENABLE_ASSET_CRITICALITY_SETTING);
await checkAndInitAssetCriticalityResources(context, logger);
- const securitySolution = await context.securitySolution;
const assetCriticalityClient = securitySolution.getAssetCriticalityDataClient();
const fileStream = request.body.file as HapiReadableStream;
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts
index c1e9db429ceaa..6398c2ec56e3a 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts
@@ -12,6 +12,8 @@ import { checkAndInitAssetCriticalityResources } from '../check_and_init_asset_c
import { buildRouteValidationWithZod } from '../../../../utils/build_validation/route_validation';
import { CreateAssetCriticalityRecord } from '../../../../../common/api/entity_analytics/asset_criticality';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { AssetCriticalityAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const assetCriticalityUpsertRoute = (
router: EntityAnalyticsRoutesDeps['router'],
logger: Logger
@@ -49,6 +51,16 @@ export const assetCriticalityUpsertRoute = (
const result = await assetCriticalityClient.upsert(assetCriticalityRecord);
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to assign the asset criticality level for an entity',
+ event: {
+ action: AssetCriticalityAuditActions.ASSET_CRITICALITY_UPDATE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CREATION,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
return response.ok({
body: result,
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/audit.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/audit.ts
new file mode 100644
index 0000000000000..685cf50dc8024
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/audit.ts
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+export enum AUDIT_TYPE {
+ CHANGE = 'change',
+ DELETION = 'deletion',
+ ACCESS = 'access',
+ CREATION = 'creation',
+}
+
+export enum AUDIT_CATEGORY {
+ AUTHENTICATION = 'authentication',
+ DATABASE = 'database',
+ WEB = 'web',
+}
+
+export enum AUDIT_OUTCOME {
+ FAILURE = 'failure',
+ SUCCESS = 'success',
+ UNKNOWN = 'unknown',
+}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/audit.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/audit.ts
new file mode 100644
index 0000000000000..e92319c81719f
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/audit.ts
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
+export enum RiskEngineAuditActions {
+ RISK_ENGINE_ENABLE = 'risk_engine_enable',
+ RISK_ENGINE_START = 'risk_engine_start',
+ RISK_ENGINE_DISABLE = 'risk_engine_disable',
+ RISK_ENGINE_INIT = 'risk_engine_init',
+ RISK_ENGINE_GET_LEGACY_ENGINE_STATUS_GET = 'risk_engine_get_legacy_engine_status_get',
+ RISK_ENGINE_STATUS_FOR_ALL_SPACES_GET = 'risk_engine_status_for_all_spaces_get',
+ RISK_ENGINE_STATUS_GET = 'risk_engine_status_get',
+ RISK_ENGINE_CONFIGURATION_GET = 'risk_engine_configuration_get',
+ RISK_ENGINE_DISABLE_LEGACY_ENGINE = 'risk_engine_disable_legacy_engine',
+ RISK_ENGINE_REMOVE_TASK = 'risk_engine_remove_task',
+}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts
index a155a320cb606..15569b0b17f21 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts
@@ -78,6 +78,7 @@ describe('RiskEngineDataClient', () => {
esClient,
soClient: mockSavedObjectClient,
namespace: 'default',
+ auditLogger: undefined,
};
riskEngineDataClient = new RiskEngineDataClient(options);
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts
index 88c911a6d7789..f462584a60ea0 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts
@@ -7,6 +7,7 @@
import type { Logger, ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server';
import type { TaskManagerStartContract } from '@kbn/task-manager-plugin/server';
+import type { AuditLogger } from '@kbn/security-plugin-types-server';
import type { InitRiskEngineResult } from '../../../../common/entity_analytics/risk_engine';
import {
RiskEngineStatus,
@@ -23,6 +24,8 @@ import {
import { bulkDeleteSavedObjects } from '../../risk_score/prebuilt_saved_objects/helpers/bulk_delete_saved_objects';
import type { RiskScoreDataClient } from '../risk_score/risk_score_data_client';
import { removeRiskScoringTask, startRiskScoringTask } from '../risk_score/tasks';
+import { RiskEngineAuditActions } from './audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../audit';
interface InitOpts {
namespace: string;
@@ -36,6 +39,7 @@ interface RiskEngineDataClientOpts {
esClient: ElasticsearchClient;
namespace: string;
soClient: SavedObjectsClientContract;
+ auditLogger: AuditLogger | undefined;
}
export class RiskEngineDataClient {
@@ -52,6 +56,15 @@ export class RiskEngineDataClient {
try {
result.legacyRiskEngineDisabled = await this.disableLegacyRiskEngine({ namespace });
+ this.options.auditLogger?.log({
+ message: 'System disabled the legacy risk engine.',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_DISABLE_LEGACY_ENGINE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
} catch (e) {
result.legacyRiskEngineDisabled = false;
result.errors.push(e.message);
@@ -97,6 +110,17 @@ export class RiskEngineDataClient {
const riskEngineStatus = await this.getCurrentStatus();
const legacyRiskEngineStatus = await this.getLegacyStatus({ namespace });
const isMaxAmountOfRiskEnginesReached = await this.getIsMaxAmountOfRiskEnginesReached();
+
+ this.options.auditLogger?.log({
+ message: 'User checked if the risk engine is enabled',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_STATUS_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return { riskEngineStatus, legacyRiskEngineStatus, isMaxAmountOfRiskEnginesReached };
}
@@ -116,10 +140,31 @@ export class RiskEngineDataClient {
taskManager,
});
+ this.options.auditLogger?.log({
+ message: 'User started risk scoring service',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_START,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return configurationResult;
} catch (e) {
this.options.logger.error(`Error while enabling risk engine: ${e.message}`);
+ this.options.auditLogger?.log({
+ message: 'System stopped risk scoring service after error occurred',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_DISABLE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.FAILURE,
+ },
+ error: e,
+ });
+
await this.disableRiskEngine({ taskManager });
throw e;
@@ -133,6 +178,16 @@ export class RiskEngineDataClient {
logger: this.options.logger,
});
+ this.options.auditLogger?.log({
+ message: 'User removed risk scoring task',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_REMOVE_TASK,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return updateSavedObjectAttribute({
savedObjectsClient: this.options.soClient,
attributes: {
@@ -185,6 +240,16 @@ export class RiskEngineDataClient {
savedObjectsClient: this.options.soClient,
});
+ this.options.auditLogger?.log({
+ message: 'System checked if the risk engine is enabled in each space',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_STATUS_FOR_ALL_SPACES_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return amountOfEnabledConfigurations >= MAX_SPACES_COUNT;
} catch (e) {
this.options.logger.error(`Error while getting amount of enabled risk engines: ${e.message}`);
@@ -195,6 +260,16 @@ export class RiskEngineDataClient {
private async getLegacyStatus({ namespace }: { namespace: string }) {
const transforms = await getLegacyTransforms({ namespace, esClient: this.options.esClient });
+ this.options.auditLogger?.log({
+ message: 'System checked if the legacy risk engine is enabled',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_GET_LEGACY_ENGINE_STATUS_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
if (transforms.length === 0) {
return RiskEngineStatus.NOT_INSTALLED;
}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts
index 89fbdd730c912..5a8d44ef057a8 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts
@@ -11,6 +11,8 @@ import { RISK_ENGINE_DISABLE_URL, APP_ID } from '../../../../../common/constants
import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations';
import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { RiskEngineAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const riskEngineDisableRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -27,13 +29,39 @@ export const riskEngineDisableRoute = (
.addVersion(
{ version: '1', validate: {} },
withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => {
- const siemResponse = buildSiemResponse(response);
+ const securitySolution = await context.securitySolution;
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to disable the risk engine.',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_DISABLE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
+ const siemResponse = buildSiemResponse(response);
const [_, { taskManager }] = await getStartServices();
- const securitySolution = await context.securitySolution;
+
const riskEngineClient = securitySolution.getRiskEngineDataClient();
if (!taskManager) {
+ securitySolution.getAuditLogger()?.log({
+ message:
+ 'User attempted to disable the risk engine, but the Kibana Task Manager was unavailable',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_DISABLE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.FAILURE,
+ },
+ error: {
+ message:
+ 'User attempted to disable the risk engine, but the Kibana Task Manager was unavailable',
+ },
+ });
+
return siemResponse.error({
statusCode: 400,
body: TASK_MANAGER_UNAVAILABLE_ERROR,
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts
index a086278a8b7d2..237f10bc00ad6 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts
@@ -11,6 +11,8 @@ import { RISK_ENGINE_ENABLE_URL, APP_ID } from '../../../../../common/constants'
import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations';
import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { RiskEngineAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const riskEngineEnableRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -27,11 +29,37 @@ export const riskEngineEnableRoute = (
.addVersion(
{ version: '1', validate: {} },
withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => {
+ const securitySolution = await context.securitySolution;
+
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to enable the risk engine',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_ENABLE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
const siemResponse = buildSiemResponse(response);
const [_, { taskManager }] = await getStartServices();
- const securitySolution = await context.securitySolution;
const riskEngineClient = securitySolution.getRiskEngineDataClient();
if (!taskManager) {
+ securitySolution.getAuditLogger()?.log({
+ message:
+ 'User attempted to enable the risk engine, but the Kibana Task Manager was unavailable',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_ENABLE,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.FAILURE,
+ },
+ error: {
+ message:
+ 'User attempted to enable the risk engine, but the Kibana Task Manager was unavailable',
+ },
+ });
+
return siemResponse.error({
statusCode: 400,
body: TASK_MANAGER_UNAVAILABLE_ERROR,
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts
index 5dcc657497fc0..0b0efda642fc0 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts
@@ -11,6 +11,8 @@ import { RISK_ENGINE_INIT_URL, APP_ID } from '../../../../../common/constants';
import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations';
import type { EntityAnalyticsRoutesDeps, InitRiskEngineResultResponse } from '../../types';
import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges';
+import { RiskEngineAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const riskEngineInitRoute = (
router: EntityAnalyticsRoutesDeps['router'],
getStartServices: EntityAnalyticsRoutesDeps['getStartServices']
@@ -26,8 +28,19 @@ export const riskEngineInitRoute = (
.addVersion(
{ version: '1', validate: {} },
withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => {
- const siemResponse = buildSiemResponse(response);
const securitySolution = await context.securitySolution;
+
+ securitySolution.getAuditLogger()?.log({
+ message: 'User attempted to initialize the risk engine',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_INIT,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
+ const siemResponse = buildSiemResponse(response);
const [_, { taskManager }] = await getStartServices();
const riskEngineDataClient = securitySolution.getRiskEngineDataClient();
const riskScoreDataClient = securitySolution.getRiskScoreDataClient();
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts
index ebcf382cc148e..d7343343a1c3d 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts
@@ -8,6 +8,8 @@
import { buildSiemResponse } from '@kbn/lists-plugin/server/routes/utils';
import { transformError } from '@kbn/securitysolution-es-utils';
import { RISK_ENGINE_PRIVILEGES_URL, APP_ID } from '../../../../../common/constants';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
+import { RiskScoreAuditActions } from '../../risk_score/audit';
import type { EntityAnalyticsRoutesDeps } from '../../types';
import { getUserRiskEnginePrivileges } from '../risk_engine_privileges';
@@ -26,10 +28,21 @@ export const riskEnginePrivilegesRoute = (
})
.addVersion({ version: '1', validate: false }, async (context, request, response) => {
const siemResponse = buildSiemResponse(response);
-
const [_, { security }] = await getStartServices();
+ const securitySolution = await context.securitySolution;
+
const body = await getUserRiskEnginePrivileges(request, security);
+ securitySolution.getAuditLogger()?.log({
+ message: 'User checked if they have the required privileges to configure the risk engine',
+ event: {
+ action: RiskScoreAuditActions.RISK_ENGINE_PRIVILEGES_GET,
+ category: AUDIT_CATEGORY.AUTHENTICATION,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
try {
return response.ok({
body,
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/settings.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/settings.ts
index e2af681785554..e538ae660b6eb 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/settings.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/settings.ts
@@ -8,7 +8,9 @@
import { buildSiemResponse } from '@kbn/lists-plugin/server/routes/utils';
import { transformError } from '@kbn/securitysolution-es-utils';
import { RISK_ENGINE_SETTINGS_URL, APP_ID } from '../../../../../common/constants';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { RiskEngineAuditActions } from '../audit';
export const riskEngineSettingsRoute = (router: EntityAnalyticsRoutesDeps['router']) => {
router.versioned
@@ -27,6 +29,16 @@ export const riskEngineSettingsRoute = (router: EntityAnalyticsRoutesDeps['route
try {
const result = await riskEngineClient.getConfiguration();
+ securitySolution.getAuditLogger()?.log({
+ message: 'User accessed risk engine configuration information',
+ event: {
+ action: RiskEngineAuditActions.RISK_ENGINE_CONFIGURATION_GET,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.ACCESS,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
if (!result) {
throw new Error('Unable to get risk engine configuration');
}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/audit.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/audit.ts
new file mode 100644
index 0000000000000..012b55cf4f325
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/audit.ts
@@ -0,0 +1,13 @@
+/*
+ * 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.
+ */
+
+export enum RiskScoreAuditActions {
+ RISK_ENGINE_INSTALL = 'risk_engine_install',
+ RISK_ENGINE_PRIVILEGES_GET = 'risk_engine_privileges_get',
+ RISK_ENGINE_MANUAL_SCORING = 'risk_engine_manual_scoring',
+ RISK_ENGINE_PREVIEW = 'risk_engine_preview',
+}
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts
index 1b7e3d36ae34c..ac912e3eb6308 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts
@@ -17,6 +17,7 @@ import {
import { mappingFromFieldMap } from '@kbn/alerting-plugin/common';
import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server';
+import type { AuditLogger } from '@kbn/security-plugin-types-server';
import {
getIndexPatternDataStream,
getTransformOptions,
@@ -33,6 +34,8 @@ import { getRiskInputsIndex } from './get_risk_inputs_index';
import { createOrUpdateIndex } from '../utils/create_or_update_index';
import { retryTransientEsErrors } from '../utils/retry_transient_es_errors';
+import { RiskScoreAuditActions } from './audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../audit';
interface RiskScoringDataClientOpts {
logger: Logger;
@@ -40,6 +43,7 @@ interface RiskScoringDataClientOpts {
esClient: ElasticsearchClient;
namespace: string;
soClient: SavedObjectsClientContract;
+ auditLogger?: AuditLogger | undefined;
}
export class RiskScoreDataClient {
@@ -160,6 +164,16 @@ export class RiskScoreDataClient {
}),
},
});
+
+ this.options.auditLogger?.log({
+ message: 'System installed risk engine Elasticsearch components',
+ event: {
+ action: RiskScoreAuditActions.RISK_ENGINE_INSTALL,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
} catch (error) {
this.options.logger.error(`Error initializing risk engine resources: ${error.message}`);
throw error;
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts
index e5a489852c48e..b303eaaf407d5 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts
@@ -19,6 +19,8 @@ import { assetCriticalityServiceFactory } from '../../asset_criticality';
import { riskScoreServiceFactory } from '../risk_score_service';
import { getRiskInputsIndex } from '../get_risk_inputs_index';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { RiskScoreAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const riskScoreCalculationRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -38,8 +40,19 @@ export const riskScoreCalculationRoute = (
validate: { request: { body: buildRouteValidation(riskScoreCalculationRequestSchema) } },
},
async (context, request, response) => {
- const siemResponse = buildSiemResponse(response);
const securityContext = await context.securitySolution;
+
+ securityContext.getAuditLogger()?.log({
+ message: 'User triggered custom manual scoring',
+ event: {
+ action: RiskScoreAuditActions.RISK_ENGINE_MANUAL_SCORING,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.UNKNOWN,
+ },
+ });
+
+ const siemResponse = buildSiemResponse(response);
const coreContext = await context.core;
const esClient = coreContext.elasticsearch.client.asCurrentUser;
const soClient = coreContext.savedObjects.client;
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/preview.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/preview.ts
index 86bfa37f219f0..d0a083cf2a5a2 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/preview.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/preview.ts
@@ -20,6 +20,8 @@ import { assetCriticalityServiceFactory } from '../../asset_criticality';
import { riskScoreServiceFactory } from '../risk_score_service';
import { getRiskInputsIndex } from '../get_risk_inputs_index';
import type { EntityAnalyticsRoutesDeps } from '../../types';
+import { RiskScoreAuditActions } from '../audit';
+import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit';
export const riskScorePreviewRoute = (
router: EntityAnalyticsRoutesDeps['router'],
@@ -105,6 +107,16 @@ export const riskScorePreviewRoute = (
alertSampleSizePerShard,
});
+ securityContext.getAuditLogger()?.log({
+ message: 'User triggered custom manual scoring',
+ event: {
+ action: RiskScoreAuditActions.RISK_ENGINE_PREVIEW,
+ category: AUDIT_CATEGORY.DATABASE,
+ type: AUDIT_TYPE.CHANGE,
+ outcome: AUDIT_OUTCOME.SUCCESS,
+ },
+ });
+
return response.ok({ body: result });
} catch (e) {
const error = transformError(e);
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts
index 89721e949a1d6..7e1519e3745c4 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts
@@ -59,6 +59,7 @@ describe('Risk Scoring Task', () => {
logger: mockLogger,
telemetry: mockTelemetry,
entityAnalyticsConfig,
+ auditLogger: undefined,
});
expect(mockTaskManagerSetup.registerTaskDefinitions).toHaveBeenCalled();
});
@@ -72,6 +73,7 @@ describe('Risk Scoring Task', () => {
logger: mockLogger,
telemetry: mockTelemetry,
entityAnalyticsConfig,
+ auditLogger: undefined,
});
expect(mockTaskManagerSetup.registerTaskDefinitions).not.toHaveBeenCalled();
});
diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts
index 5e1881cb7173f..f936ca6a83c76 100644
--- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts
+++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts
@@ -14,6 +14,7 @@ import type {
TaskManagerStartContract,
} from '@kbn/task-manager-plugin/server';
import type { AnalyticsServiceSetup } from '@kbn/core-analytics-server';
+import type { AuditLogger } from '@kbn/security-plugin-types-server';
import {
type AfterKeys,
type IdentifierType,
@@ -56,6 +57,7 @@ export const registerRiskScoringTask = ({
getStartServices,
kibanaVersion,
logger,
+ auditLogger,
taskManager,
telemetry,
entityAnalyticsConfig,
@@ -63,6 +65,7 @@ export const registerRiskScoringTask = ({
getStartServices: EntityAnalyticsRoutesDeps['getStartServices'];
kibanaVersion: string;
logger: Logger;
+ auditLogger: AuditLogger | undefined;
taskManager: TaskManagerSetupContract | undefined;
telemetry: AnalyticsServiceSetup;
entityAnalyticsConfig: EntityAnalyticsConfig;
@@ -80,6 +83,7 @@ export const registerRiskScoringTask = ({
const assetCriticalityDataClient = new AssetCriticalityDataClient({
esClient,
logger,
+ auditLogger,
namespace,
});
@@ -94,6 +98,7 @@ export const registerRiskScoringTask = ({
esClient,
namespace,
soClient,
+ auditLogger,
});
const riskScoreDataClient = new RiskScoreDataClient({
logger,
@@ -101,6 +106,7 @@ export const registerRiskScoringTask = ({
esClient,
namespace,
soClient,
+ auditLogger,
});
return riskScoreServiceFactory({
diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts
index 1b05cbd1740b3..1b282771a608a 100644
--- a/x-pack/plugins/security_solution/server/plugin.ts
+++ b/x-pack/plugins/security_solution/server/plugin.ts
@@ -211,6 +211,7 @@ export class Plugin implements ISecuritySolutionPlugin {
getStartServices: core.getStartServices,
kibanaVersion: pluginContext.env.packageInfo.version,
logger: this.logger,
+ auditLogger: plugins.security?.audit.withoutRequest,
taskManager: plugins.taskManager,
telemetry: core.analytics,
entityAnalyticsConfig: config.entityAnalytics,
diff --git a/x-pack/plugins/security_solution/server/request_context_factory.ts b/x-pack/plugins/security_solution/server/request_context_factory.ts
index 3f1d9f818e431..ddb825cb642e6 100644
--- a/x-pack/plugins/security_solution/server/request_context_factory.ts
+++ b/x-pack/plugins/security_solution/server/request_context_factory.ts
@@ -77,6 +77,8 @@ export class RequestContextFactory implements IRequestContextFactory {
kibanaBranch: options.kibanaBranch,
});
+ const getAuditLogger = () => security?.audit.asScoped(request);
+
// List of endpoint authz for the current request's user. Will be initialized the first
// time it is requested (see `getEndpointAuthz()` below)
let endpointAuthz: Immutable;
@@ -107,6 +109,8 @@ export class RequestContextFactory implements IRequestContextFactory {
getRacClient: startPlugins.ruleRegistry.getRacClientWithRequest,
+ getAuditLogger,
+
getDetectionEngineHealthClient: memoize(() =>
ruleMonitoringService.createDetectionEngineHealthClient({
rulesClient: startPlugins.alerting.getRulesClientWithRequest(request),
@@ -141,6 +145,7 @@ export class RequestContextFactory implements IRequestContextFactory {
esClient: coreContext.elasticsearch.client.asCurrentUser,
soClient: coreContext.savedObjects.client,
namespace: getSpaceId(),
+ auditLogger: getAuditLogger(),
})
),
getRiskScoreDataClient: memoize(
@@ -159,6 +164,7 @@ export class RequestContextFactory implements IRequestContextFactory {
logger: options.logger,
esClient: coreContext.elasticsearch.client.asCurrentUser,
namespace: getSpaceId(),
+ auditLogger: getAuditLogger(),
})
),
};
diff --git a/x-pack/plugins/security_solution/server/types.ts b/x-pack/plugins/security_solution/server/types.ts
index 7833c1dff6b8a..513eb6079e041 100644
--- a/x-pack/plugins/security_solution/server/types.ts
+++ b/x-pack/plugins/security_solution/server/types.ts
@@ -19,6 +19,7 @@ import type { ExceptionListClient, ListsApiRequestHandlerContext } from '@kbn/li
import type { AlertsClient, IRuleDataService } from '@kbn/rule-registry-plugin/server';
import type { Readable } from 'stream';
+import type { AuditLogger } from '@kbn/security-plugin-types-server';
import type { Immutable } from '../common/endpoint/types';
import { AppClient } from './client';
import type { ConfigType } from './config';
@@ -46,6 +47,7 @@ export interface SecuritySolutionApiRequestHandlerContext {
getDetectionEngineHealthClient: () => IDetectionEngineHealthClient;
getRuleExecutionLog: () => IRuleExecutionLogForRoutes;
getRacClient: (req: KibanaRequest) => Promise;
+ getAuditLogger: () => AuditLogger | undefined;
getExceptionListClient: () => ExceptionListClient | null;
getInternalFleetServices: () => EndpointInternalFleetServicesInterface;
getRiskEngineDataClient: () => RiskEngineDataClient;
diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json
index 81be1505f116c..48e37a562dd72 100644
--- a/x-pack/plugins/security_solution/tsconfig.json
+++ b/x-pack/plugins/security_solution/tsconfig.json
@@ -198,6 +198,7 @@
"@kbn/core-chrome-browser",
"@kbn/shared-ux-chrome-navigation",
"@kbn/core-ui-settings-browser-mocks",
- "@kbn/management-plugin"
+ "@kbn/management-plugin",
+ "@kbn/security-plugin-types-server"
]
}
From d9f345108eb1e6af94b59177004b45716fea23e9 Mon Sep 17 00:00:00 2001
From: Elastic Machine
Date: Tue, 23 Apr 2024 13:49:02 +0200
Subject: [PATCH 065/183] Update kubernetes templates for elastic-agent
(#181213)
Automated by https://buildkite.com/elastic/elastic-agent/builds/8460
---------
Co-authored-by: Andreas Gkizas
---
x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
index 829b72070cf89..912bc637120be 100644
--- a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
+++ b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
@@ -42,7 +42,7 @@ spec:
# - -c
# - >-
# mkdir -p /etc/elastic-agent/inputs.d &&
- # wget -O - https://github.com/elastic/elastic-agent/archive/8.14.tar.gz | tar xz -C /etc/elastic-agent/inputs.d --strip=5 "elastic-agent-8.14/deploy/kubernetes/elastic-agent/templates.d"
+ # wget -O - https://github.com/elastic/elastic-agent/archive/8.15.tar.gz | tar xz -C /etc/elastic-agent/inputs.d --strip=5 "elastic-agent-8.15/deploy/kubernetes/elastic-agent/templates.d"
# volumeMounts:
# - name: external-inputs
# mountPath: /etc/elastic-agent/inputs.d
From cc94a663115642439d3087edf63714151013aa23 Mon Sep 17 00:00:00 2001
From: Marco Liberati
Date: Tue, 23 Apr 2024 14:26:11 +0200
Subject: [PATCH 066/183] [ES|QL] Improve validation for some ES|QL scenarios
(#181381)
## Summary
Fixes some issues with specific types in ES|QL query validation:
* comparator operators now support `ip` type too
* `==` and `!=` support `boolean` type now
* column/variable/returnType of `any` type will skip strict type
validation
### Checklist
- [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
---
.../src/definitions/builtin.ts | 28 +
.../src/shared/helpers.ts | 7 +-
.../esql_validation_meta_tests.json | 570 +++++++++++++++++-
.../src/validation/validation.test.ts | 71 ++-
4 files changed, 666 insertions(+), 10 deletions(-)
diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts
index 23da9e1684cf4..037e5a4a1da91 100644
--- a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts
@@ -47,9 +47,11 @@ function createComparisonDefinition(
{
name,
description,
+ extraSignatures = [],
}: {
name: string;
description: string;
+ extraSignatures?: FunctionDefinition['signatures'];
},
validate?: FunctionDefinition['validate']
): FunctionDefinition {
@@ -82,6 +84,14 @@ function createComparisonDefinition(
],
returnType: 'boolean',
},
+ {
+ params: [
+ { name: 'left', type: 'ip' },
+ { name: 'right', type: 'ip' },
+ ],
+ returnType: 'boolean',
+ },
+ ...extraSignatures,
],
};
}
@@ -180,6 +190,15 @@ export const builtinFunctions: FunctionDefinition[] = [
description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.equalToDoc', {
defaultMessage: 'Equal to',
}),
+ extraSignatures: [
+ {
+ params: [
+ { name: 'left', type: 'boolean' },
+ { name: 'right', type: 'boolean' },
+ ],
+ returnType: 'boolean',
+ },
+ ],
},
{
name: '!=',
@@ -189,6 +208,15 @@ export const builtinFunctions: FunctionDefinition[] = [
defaultMessage: 'Not equal to',
}
),
+ extraSignatures: [
+ {
+ params: [
+ { name: 'left', type: 'boolean' },
+ { name: 'right', type: 'boolean' },
+ ],
+ returnType: 'boolean',
+ },
+ ],
},
{
name: '<',
diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts
index cf5ed3304b41b..b2f782b52dd45 100644
--- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts
@@ -380,7 +380,9 @@ export function isEqualType(
if (arg.type === 'function') {
if (isSupportedFunction(arg.name, parentCommand).supported) {
const fnDef = buildFunctionLookup().get(arg.name)!;
- return fnDef.signatures.some((signature) => argType === signature.returnType);
+ return fnDef.signatures.some(
+ (signature) => signature.returnType === 'any' || argType === signature.returnType
+ );
}
}
if (arg.type === 'timeInterval') {
@@ -397,7 +399,8 @@ export function isEqualType(
return false;
}
const wrappedTypes = Array.isArray(validHit.type) ? validHit.type : [validHit.type];
- return wrappedTypes.some((ct) => argType === ct);
+ // if final type is of type any make it pass for now
+ return wrappedTypes.some((ct) => ct === 'any' || argType === ct);
}
}
diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json
index 8cad05403d8fd..38f52da328688 100644
--- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json
+++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json
@@ -2984,6 +2984,24 @@
],
"warning": []
},
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") > to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() > now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false > false",
+ "error": [
+ "Argument of [>] must be [number], found value [false] type [boolean]",
+ "Argument of [>] must be [number], found value [false] type [boolean]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 5 >= 0",
"error": [],
@@ -3013,6 +3031,24 @@
],
"warning": []
},
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") >= to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() >= now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false >= false",
+ "error": [
+ "Argument of [>=] must be [number], found value [false] type [boolean]",
+ "Argument of [>=] must be [number], found value [false] type [boolean]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 5 < 0",
"error": [],
@@ -3042,6 +3078,24 @@
],
"warning": []
},
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") < to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() < now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false < false",
+ "error": [
+ "Argument of [<] must be [number], found value [false] type [boolean]",
+ "Argument of [<] must be [number], found value [false] type [boolean]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 5 <= 0",
"error": [],
@@ -3071,6 +3125,24 @@
],
"warning": []
},
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") <= to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() <= now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false <= false",
+ "error": [
+ "Argument of [<=] must be [number], found value [false] type [boolean]",
+ "Argument of [<=] must be [number], found value [false] type [boolean]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 5 == 0",
"error": [],
@@ -3100,6 +3172,65 @@
],
"warning": []
},
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") == to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() == now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false == false",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = 5 != 0",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = NOT 5 != 0",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = (numberField != 0)",
+ "error": [
+ "Unknown column [numberField]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "row var = (NOT (5 != 0))",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = \"a\" != 0",
+ "error": [
+ "Argument of [!=] must be [number], found value [\"a\"] type [string]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "row var = to_ip(\"127.0.0.1\") != to_ip(\"127.0.0.1\")",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = now() != now()",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "row var = false != false",
+ "error": [],
+ "warning": []
+ },
{
"query": "row var = 1 + 1",
"error": [],
@@ -3110,6 +3241,11 @@
"error": [],
"warning": []
},
+ {
+ "query": "row var = now() + now()",
+ "error": [],
+ "warning": []
+ },
{
"query": "row var = 1 - 1",
"error": [],
@@ -3120,6 +3256,11 @@
"error": [],
"warning": []
},
+ {
+ "query": "row var = now() - now()",
+ "error": [],
+ "warning": []
+ },
{
"query": "row var = 1 * 1",
"error": [],
@@ -3130,6 +3271,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "row var = now() * now()",
+ "error": [
+ "Argument of [*] must be [number], found value [now()] type [date]",
+ "Argument of [*] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 1 / 1",
"error": [],
@@ -3140,6 +3289,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "row var = now() / now()",
+ "error": [
+ "Argument of [/] must be [number], found value [now()] type [date]",
+ "Argument of [/] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "row var = 1 % 1",
"error": [],
@@ -3150,6 +3307,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "row var = now() % now()",
+ "error": [
+ "Argument of [%] must be [number], found value [now()] type [date]",
+ "Argument of [%] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "row var = \"a\" like \"?a\"",
"error": [],
@@ -5158,12 +5323,40 @@
"warning": []
},
{
- "query": "from a_index | eval stringField > 0",
+ "query": "from a_index | where stringField > 0",
"error": [
"Argument of [>] must be [number], found value [stringField] type [string]"
],
"warning": []
},
+ {
+ "query": "from a_index | where stringField > stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField > numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField > dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField > booleanField",
+ "error": [
+ "Argument of [>] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [>] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField > ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | where numberField >= 0",
"error": [],
@@ -5190,12 +5383,40 @@
"warning": []
},
{
- "query": "from a_index | eval stringField >= 0",
+ "query": "from a_index | where stringField >= 0",
"error": [
"Argument of [>=] must be [number], found value [stringField] type [string]"
],
"warning": []
},
+ {
+ "query": "from a_index | where stringField >= stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField >= numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField >= dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField >= booleanField",
+ "error": [
+ "Argument of [>=] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [>=] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField >= ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | where numberField < 0",
"error": [],
@@ -5222,12 +5443,40 @@
"warning": []
},
{
- "query": "from a_index | eval stringField < 0",
+ "query": "from a_index | where stringField < 0",
"error": [
"Argument of [<] must be [number], found value [stringField] type [string]"
],
"warning": []
},
+ {
+ "query": "from a_index | where stringField < stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField < numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField < dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField < booleanField",
+ "error": [
+ "Argument of [<] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [<] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField < ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | where numberField <= 0",
"error": [],
@@ -5254,12 +5503,40 @@
"warning": []
},
{
- "query": "from a_index | eval stringField <= 0",
+ "query": "from a_index | where stringField <= 0",
"error": [
"Argument of [<=] must be [number], found value [stringField] type [string]"
],
"warning": []
},
+ {
+ "query": "from a_index | where stringField <= stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField <= numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField <= dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField <= booleanField",
+ "error": [
+ "Argument of [<=] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [<=] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField <= ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | where numberField == 0",
"error": [],
@@ -5286,12 +5563,94 @@
"warning": []
},
{
- "query": "from a_index | eval stringField == 0",
+ "query": "from a_index | where stringField == 0",
"error": [
"Argument of [==] must be [number], found value [stringField] type [string]"
],
"warning": []
},
+ {
+ "query": "from a_index | where stringField == stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField == numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField == dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField == booleanField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField == ipField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField != 0",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where NOT numberField != 0",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where (numberField != 0)",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where (NOT (numberField != 0))",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where 1 != 0",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where stringField != 0",
+ "error": [
+ "Argument of [!=] must be [number], found value [stringField] type [string]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where stringField != stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where numberField != numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where dateField != dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where booleanField != booleanField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | where ipField != ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | where - numberField > 0",
"error": [],
@@ -11418,6 +11777,34 @@
],
"warning": []
},
+ {
+ "query": "from a_index | eval stringField > stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval numberField > numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval dateField > dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval booleanField > booleanField",
+ "error": [
+ "Argument of [>] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [>] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval ipField > ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField >= 0",
"error": [],
@@ -11450,6 +11837,34 @@
],
"warning": []
},
+ {
+ "query": "from a_index | eval stringField >= stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval numberField >= numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval dateField >= dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval booleanField >= booleanField",
+ "error": [
+ "Argument of [>=] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [>=] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval ipField >= ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField < 0",
"error": [],
@@ -11482,6 +11897,34 @@
],
"warning": []
},
+ {
+ "query": "from a_index | eval stringField < stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval numberField < numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval dateField < dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval booleanField < booleanField",
+ "error": [
+ "Argument of [<] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [<] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval ipField < ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField <= 0",
"error": [],
@@ -11514,6 +11957,34 @@
],
"warning": []
},
+ {
+ "query": "from a_index | eval stringField <= stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval numberField <= numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval dateField <= dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval booleanField <= booleanField",
+ "error": [
+ "Argument of [<=] must be [number], found value [booleanField] type [boolean]",
+ "Argument of [<=] must be [number], found value [booleanField] type [boolean]"
+ ],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval ipField <= ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField == 0",
"error": [],
@@ -11546,6 +12017,31 @@
],
"warning": []
},
+ {
+ "query": "from a_index | eval stringField == stringField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval numberField == numberField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval dateField == dateField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval booleanField == booleanField",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval ipField == ipField",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField + 1",
"error": [],
@@ -11561,6 +12057,11 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval now() + now()",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField - 1",
"error": [],
@@ -11576,6 +12077,11 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval now() - now()",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField * 1",
"error": [],
@@ -11591,6 +12097,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval now() * now()",
+ "error": [
+ "Argument of [*] must be [number], found value [now()] type [date]",
+ "Argument of [*] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField / 1",
"error": [],
@@ -11606,6 +12120,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval now() / now()",
+ "error": [
+ "Argument of [/] must be [number], found value [now()] type [date]",
+ "Argument of [/] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "from a_index | eval numberField % 1",
"error": [],
@@ -11621,6 +12143,14 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval now() % now()",
+ "error": [
+ "Argument of [%] must be [number], found value [now()] type [date]",
+ "Argument of [%] must be [number], found value [now()] type [date]"
+ ],
+ "warning": []
+ },
{
"query": "from a_index | eval 1/0",
"error": [],
@@ -11900,6 +12430,26 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | eval result = case(false, 0, 1), round(result)",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval result = case(false, 0, 1) | stats sum(result)",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval result = case(false, 0, 1) | stats var0 = sum(result)",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | eval round(case(false, 0, 1))",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | eval 1 anno",
"error": [
@@ -14836,6 +15386,16 @@
"error": [],
"warning": []
},
+ {
+ "query": "from a_index | stats sum(case(false, 0, 1))",
+ "error": [],
+ "warning": []
+ },
+ {
+ "query": "from a_index | stats var0 = sum( case(false, 0, 1))",
+ "error": [],
+ "warning": []
+ },
{
"query": "from a_index | sort ",
"error": [
diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts
index 42748a62be92f..49283cdd7f210 100644
--- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts
+++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts
@@ -656,7 +656,7 @@ describe('validation logic', () => {
}
}
}
- for (const op of ['>', '>=', '<', '<=', '==']) {
+ for (const op of ['>', '>=', '<', '<=', '==', '!=']) {
testErrorsAndWarnings(`row var = 5 ${op} 0`, []);
testErrorsAndWarnings(`row var = NOT 5 ${op} 0`, []);
testErrorsAndWarnings(`row var = (numberField ${op} 0)`, ['Unknown column [numberField]']);
@@ -664,10 +664,30 @@ describe('validation logic', () => {
testErrorsAndWarnings(`row var = "a" ${op} 0`, [
`Argument of [${op}] must be [number], found value ["a"] type [string]`,
]);
+ testErrorsAndWarnings(`row var = to_ip("127.0.0.1") ${op} to_ip("127.0.0.1")`, []);
+ testErrorsAndWarnings(`row var = now() ${op} now()`, []);
+ testErrorsAndWarnings(
+ `row var = false ${op} false`,
+ ['==', '!='].includes(op)
+ ? []
+ : [
+ `Argument of [${op}] must be [number], found value [false] type [boolean]`,
+ `Argument of [${op}] must be [number], found value [false] type [boolean]`,
+ ]
+ );
}
for (const op of ['+', '-', '*', '/', '%']) {
testErrorsAndWarnings(`row var = 1 ${op} 1`, []);
testErrorsAndWarnings(`row var = (5 ${op} 1)`, []);
+ testErrorsAndWarnings(
+ `row var = now() ${op} now()`,
+ ['+', '-'].includes(op)
+ ? []
+ : [
+ `Argument of [${op}] must be [number], found value [now()] type [date]`,
+ `Argument of [${op}] must be [number], found value [now()] type [date]`,
+ ]
+ );
}
for (const op of ['like', 'rlike']) {
@@ -1064,15 +1084,26 @@ describe('validation logic', () => {
testErrorsAndWarnings(`from a_index | where ${nValue} > 0`, []);
testErrorsAndWarnings(`from a_index | where NOT ${nValue} > 0`, []);
}
- for (const op of ['>', '>=', '<', '<=', '==']) {
+ for (const op of ['>', '>=', '<', '<=', '==', '!=']) {
testErrorsAndWarnings(`from a_index | where numberField ${op} 0`, []);
testErrorsAndWarnings(`from a_index | where NOT numberField ${op} 0`, []);
testErrorsAndWarnings(`from a_index | where (numberField ${op} 0)`, []);
testErrorsAndWarnings(`from a_index | where (NOT (numberField ${op} 0))`, []);
testErrorsAndWarnings(`from a_index | where 1 ${op} 0`, []);
- testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [
+ testErrorsAndWarnings(`from a_index | where stringField ${op} 0`, [
`Argument of [${op}] must be [number], found value [stringField] type [string]`,
]);
+ for (const type of ['string', 'number', 'date', 'boolean', 'ip']) {
+ testErrorsAndWarnings(
+ `from a_index | where ${type}Field ${op} ${type}Field`,
+ type !== 'boolean' || ['==', '!='].includes(op)
+ ? []
+ : [
+ `Argument of [${op}] must be [number], found value [${type}Field] type [${type}]`,
+ `Argument of [${op}] must be [number], found value [${type}Field] type [${type}]`,
+ ]
+ );
+ }
}
for (const nesting of NESTED_DEPTHS) {
@@ -1643,11 +1674,31 @@ describe('validation logic', () => {
testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [
`Argument of [${op}] must be [number], found value [stringField] type [string]`,
]);
+ for (const type of ['string', 'number', 'date', 'boolean', 'ip']) {
+ testErrorsAndWarnings(
+ `from a_index | eval ${type}Field ${op} ${type}Field`,
+ type !== 'boolean' || ['==', '!='].includes(op)
+ ? []
+ : [
+ `Argument of [${op}] must be [number], found value [${type}Field] type [${type}]`,
+ `Argument of [${op}] must be [number], found value [${type}Field] type [${type}]`,
+ ]
+ );
+ }
}
for (const op of ['+', '-', '*', '/', '%']) {
testErrorsAndWarnings(`from a_index | eval numberField ${op} 1`, []);
testErrorsAndWarnings(`from a_index | eval (numberField ${op} 1)`, []);
testErrorsAndWarnings(`from a_index | eval 1 ${op} 1`, []);
+ testErrorsAndWarnings(
+ `from a_index | eval now() ${op} now()`,
+ ['+', '-'].includes(op)
+ ? []
+ : [
+ `Argument of [${op}] must be [number], found value [now()] type [date]`,
+ `Argument of [${op}] must be [number], found value [now()] type [date]`,
+ ]
+ );
}
for (const divideByZeroExpr of ['1/0', 'var = 1/0', '1 + 1/0']) {
testErrorsAndWarnings(
@@ -1745,6 +1796,17 @@ describe('validation logic', () => {
testErrorsAndWarnings(`from a_index | eval mv_sort(["a", "b"], "ASC")`, []);
testErrorsAndWarnings(`from a_index | eval mv_sort(["a", "b"], "DESC")`, []);
+ testErrorsAndWarnings(`from a_index | eval result = case(false, 0, 1), round(result)`, []);
+ testErrorsAndWarnings(
+ `from a_index | eval result = case(false, 0, 1) | stats sum(result)`,
+ []
+ );
+ testErrorsAndWarnings(
+ `from a_index | eval result = case(false, 0, 1) | stats var0 = sum(result)`,
+ []
+ );
+ testErrorsAndWarnings(`from a_index | eval round(case(false, 0, 1))`, []);
+
describe('date math', () => {
testErrorsAndWarnings('from a_index | eval 1 anno', [
'EVAL does not support [date_period] in expression [1 anno]',
@@ -2251,6 +2313,9 @@ describe('validation logic', () => {
`FROM index | STATS AVG(numberField) by round(numberField) + 1 | EVAL \`round(numberField) + 1\` / 2`,
[]
);
+
+ testErrorsAndWarnings(`from a_index | stats sum(case(false, 0, 1))`, []);
+ testErrorsAndWarnings(`from a_index | stats var0 = sum( case(false, 0, 1))`, []);
});
describe('sort', () => {
From 2384e46ef4ebb28aa71f804953a4b957b6881c6a Mon Sep 17 00:00:00 2001
From: Pablo Machado
Date: Tue, 23 Apr 2024 14:29:07 +0200
Subject: [PATCH 067/183] [SecuritySolution] Update asset criticality CSV
upload copy (#181390)
## Summary
Copy after changes:
![Screenshot 2024-04-23 at 11 17
36](https://github.com/elastic/kibana/assets/1490444/375d26c8-8337-4ee3-856f-98246c60e49a)
![Screenshot 2024-04-23 at 11 17
46](https://github.com/elastic/kibana/assets/1490444/217a2e74-dcf9-473e-9621-e1bcd8f4be68)
![Screenshot 2024-04-23 at 11 17
58](https://github.com/elastic/kibana/assets/1490444/58203f1a-59c3-4e25-bf85-12019dbf3754)
### Checklist
Delete any items that are not applicable to this PR.
- [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/packages/kbn-i18n/README.md)
- [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
---
.../components/file_picker_step.tsx | 21 ++++++++++---------
.../components/result_step.tsx | 2 +-
.../components/validation_step.test.tsx | 2 +-
.../components/validation_step.tsx | 2 +-
.../pages/asset_criticality_upload_page.tsx | 6 +++---
.../asset_criticality_upload_page.cy.ts | 5 ++++-
6 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx
index 094b43595aa3b..efe70c77f4c8f 100644
--- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx
+++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx
@@ -6,6 +6,7 @@
*/
import {
+ EuiCode,
EuiCodeBlock,
EuiFilePicker,
EuiPanel,
@@ -52,7 +53,7 @@ export const AssetCriticalityFilePickerStep: React.FC
@@ -62,7 +63,7 @@ export const AssetCriticalityFilePickerStep: React.FC
@@ -93,7 +94,7 @@ export const AssetCriticalityFilePickerStep: React.FC
{'host'},
@@ -104,21 +105,21 @@ export const AssetCriticalityFilePickerStep: React.FC
{
{'Host.name'},
- userName: {'User.name'},
+ hostName: {'host.name'},
+ userName: {'user.name'},
}}
/>
}
{ValidCriticalityLevels.join(', ')},
+ labels: {ValidCriticalityLevels.join(', ')},
}}
/>
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/result_step.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/result_step.tsx
index c620e020cd5d1..30834f2fb8c32 100644
--- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/result_step.tsx
+++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/result_step.tsx
@@ -67,7 +67,7 @@ export const AssetCriticalityResultStep: React.FC<{
iconType="checkInCircleFilled"
>
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.test.tsx
index c20a0b6e0aaea..ca1dcfb6e7f42 100644
--- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.test.tsx
+++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.test.tsx
@@ -54,7 +54,7 @@ describe('AssetCriticalityValidationStep', () => {
wrapper: TestProviders,
});
- expect(container).toHaveTextContent('10 asset criticalities will be assigned');
+ expect(container).toHaveTextContent('10 asset criticality levels will be assigned');
expect(container).toHaveTextContent("5 lines are invalid and won't be assigned");
expect(container).toHaveTextContent('test.csv preview');
});
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.tsx
index 0c8150d85a369..538e19f4d5fd6 100644
--- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.tsx
+++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/validation_step.tsx
@@ -72,7 +72,7 @@ export const AssetCriticalityValidationStep: React.FC
{validLines.count},
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/pages/asset_criticality_upload_page.tsx b/x-pack/plugins/security_solution/public/entity_analytics/pages/asset_criticality_upload_page.tsx
index 67fd97d2e8026..eced6e59031ad 100644
--- a/x-pack/plugins/security_solution/public/entity_analytics/pages/asset_criticality_upload_page.tsx
+++ b/x-pack/plugins/security_solution/public/entity_analytics/pages/asset_criticality_upload_page.tsx
@@ -121,7 +121,7 @@ export const AssetCriticalityUploadPage = () => {
@@ -129,7 +129,7 @@ export const AssetCriticalityUploadPage = () => {
@@ -152,7 +152,7 @@ export const AssetCriticalityUploadPage = () => {
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts
index 9a31f3f06edad..097e2541f57f9 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts
@@ -38,7 +38,10 @@ describe(
uploadAssetCriticalityFile();
cy.get(FILE_PICKER).should('not.visible');
- cy.get(VALID_LINES_MESSAGE).should('have.text', '4 asset criticalities will be assigned');
+ cy.get(VALID_LINES_MESSAGE).should(
+ 'have.text',
+ '4 asset criticality levels will be assigned'
+ );
cy.get(INVALID_LINES_MESSAGE).should('have.text', "1 line is invalid and won't be assigned");
clickAssignButton();
From 26b8c71730de6686fe4fe5de5f60ab5577b79902 Mon Sep 17 00:00:00 2001
From: Rudolf Meijering
Date: Tue, 23 Apr 2024 14:33:35 +0200
Subject: [PATCH 068/183] Enable heap snapshots for all our distributables
(#181363)
## Summary
Fixes https://github.com/elastic/kibana/issues/167955
To test:
```
# Build Kibana
node scripts/build --skip-os-packages --skip-cdn-assets --skip-canvas-shareable-runtime --skip-docker-ubi --skip-docker-ubuntu --skip-docker-fips --skip-node-download
# Run Kibana
cd build/default/kibana-8.15.0-SNAPSHOT-darwin-aarch64
./bin/kibana
# In a different terminal find the pid and send the signal
ps -e | grep bin/node
kill -s SIGUSR2 PID # use pid from ^
# verify heap snapshot is created
ls ./data
# expect to see a file like
Heap.20240423.132053.37884.0.001.heapsnapshot
```
### Checklist
Delete any items that are not applicable to this PR.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### Risk Matrix
Delete this section if it is not applicable to this PR.
Before closing this PR, invite QA, stakeholders, and other developers to
identify risks that should be tested prior to the change/feature
release.
When forming the risk matrix, consider some of the following examples
and how they may potentially impact the change:
| Risk | Probability | Severity | Mitigation/Notes |
|---------------------------|-------------|----------|-------------------------|
| Multiple Spaces—unexpected behavior in non-default Kibana Space.
| Low | High | Integration tests will verify that all features are still
supported in non-default Kibana Space and when user switches between
spaces. |
| Multiple nodes—Elasticsearch polling might have race conditions
when multiple Kibana nodes are polling for the same tasks. | High | Low
| Tasks are idempotent, so executing them multiple times will not result
in logical error, but will degrade performance. To test for this case we
add plenty of unit tests around this logic and document manual testing
procedure. |
| Code should gracefully handle cases when feature X or plugin Y are
disabled. | Medium | High | Unit tests will verify that any feature flag
or plugin combination still results in our service operational. |
| [See more potential risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) |
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
config/node.options | 4 ++++
.../os_packages/docker_generator/templates/base/Dockerfile | 3 ---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/config/node.options b/config/node.options
index abcb40a5c19d4..2bc49f5db1f4a 100644
--- a/config/node.options
+++ b/config/node.options
@@ -13,3 +13,7 @@
## enable OpenSSL 3 legacy provider
--openssl-legacy-provider
+
+# Enable capturing heap snapshots. See https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal
+--heapsnapshot-signal=SIGUSR2
+--diagnostic-dir=./data
\ No newline at end of file
diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile
index 1869086b51ab7..2284e504229a8 100644
--- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile
+++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile
@@ -157,9 +157,6 @@ COPY --chown=1000:0 config/serverless.yml /usr/share/kibana/config/serverless.ym
COPY --chown=1000:0 config/serverless.es.yml /usr/share/kibana/config/serverless.es.yml
COPY --chown=1000:0 config/serverless.oblt.yml /usr/share/kibana/config/serverless.oblt.yml
COPY --chown=1000:0 config/serverless.security.yml /usr/share/kibana/config/serverless.security.yml
-# Supportability enhancement: enable capturing heap snapshots. See https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal
-RUN /usr/bin/echo -e '\n--heapsnapshot-signal=SIGUSR2' >> config/node.options
-RUN /usr/bin/echo '--diagnostic-dir=./data' >> config/node.options
ENV PROFILER_SIGNAL=SIGUSR1
{{/serverless}}
{{^opensslLegacyProvider}}
From 1b53a8d0505c9061f51f824d471507d069d9206c Mon Sep 17 00:00:00 2001
From: Pablo Machado
Date: Tue, 23 Apr 2024 14:55:10 +0200
Subject: [PATCH 069/183] [SecuritySolution] Add asset criticality page to
serverless (#180817)
## Summary
Add asset criticality page to serverless.
![Captura de pantalla 2024-04-16 a les 10 15
33](https://github.com/elastic/kibana/assets/1490444/abbb5307-3b0e-4bc9-b098-95a573dd0b58)
---
.../app/solution_navigation/categories.ts | 5 +++-
.../links/sections/settings_links.ts | 23 ++++++++++---------
.../public/navigation/management_cards.ts | 1 +
.../public/navigation/management_cards.ts | 1 +
4 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/categories.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/categories.ts
index 1cd7124891e53..01e2f54375c99 100644
--- a/x-pack/plugins/security_solution/public/app/solution_navigation/categories.ts
+++ b/x-pack/plugins/security_solution/public/app/solution_navigation/categories.ts
@@ -47,7 +47,10 @@ export const CATEGORIES: Array> = [
// --- Hidden links that need to be configured in the navigationTree for breadcrumbs ---
{
type: LinkCategoryType.separator,
- linkIds: [SecurityPageName.entityAnalyticsManagement], // Linked from the management cards landing.
+ linkIds: [
+ SecurityPageName.entityAnalyticsManagement,
+ SecurityPageName.entityAnalyticsAssetClassification,
+ ], // Linked from the management cards landing.
},
];
diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/settings_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/settings_links.ts
index f66af2ee30d13..ed08596fe6c79 100644
--- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/settings_links.ts
+++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/settings_links.ts
@@ -10,18 +10,19 @@ import type { LinkItem } from '../../../../common/links/types';
import type { SolutionNavLink } from '../../../../common/links';
import * as i18n from './settings_translations';
+const ENTITY_ANALYTICS_LINKS = [
+ SecurityPageName.entityAnalyticsManagement,
+ SecurityPageName.entityAnalyticsAssetClassification,
+];
+
export const createSettingsLinksFromManage = (manageLink: LinkItem): LinkItem[] => {
- const entityAnalyticsLink = manageLink.links?.find(
- ({ id }) => id === SecurityPageName.entityAnalyticsManagement
- );
- return entityAnalyticsLink
- ? [
- {
- ...entityAnalyticsLink,
- sideNavDisabled: true, // Link disabled from the side nav but configured in the navigationTree (breadcrumbs). It is displayed in the management cards landing.
- },
- ]
- : [];
+ const entityAnalyticsLinks =
+ manageLink.links?.filter(({ id }) => ENTITY_ANALYTICS_LINKS.includes(id)) ?? [];
+
+ return entityAnalyticsLinks.map((link) => ({
+ ...link,
+ sideNavDisabled: true, // Link disabled from the side nav but configured in the navigationTree (breadcrumbs). It is displayed in the management cards landing.
+ }));
};
export const settingsNavLinks: SolutionNavLink[] = [
diff --git a/x-pack/plugins/security_solution_ess/public/navigation/management_cards.ts b/x-pack/plugins/security_solution_ess/public/navigation/management_cards.ts
index 07900f824fa7f..c2b302956384a 100644
--- a/x-pack/plugins/security_solution_ess/public/navigation/management_cards.ts
+++ b/x-pack/plugins/security_solution_ess/public/navigation/management_cards.ts
@@ -17,6 +17,7 @@ const SecurityManagementCards = new Map {
const { securitySolution, management, application, navigation } = services;
diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/management_cards.ts b/x-pack/plugins/security_solution_serverless/public/navigation/management_cards.ts
index 2199b4411e4d5..6306933d6a14b 100644
--- a/x-pack/plugins/security_solution_serverless/public/navigation/management_cards.ts
+++ b/x-pack/plugins/security_solution_serverless/public/navigation/management_cards.ts
@@ -16,6 +16,7 @@ const SecurityManagementCards = new Map {
From 4c09bc938ce1654d0acf40d9a1f881a04ac8b709 Mon Sep 17 00:00:00 2001
From: Julia Rechkunova
Date: Tue, 23 Apr 2024 14:55:30 +0200
Subject: [PATCH 070/183] [UnifiedHistogram] Improve breakdown chart when
values for the field are missing (#181013)
## Summary
This PR changes Lens configuration to visualize data even if values for
the "Breakdown by" field are not provided.
Before:
After:
---
.../public/services/lens_vis_service.attributes.test.ts | 2 +-
.../unified_histogram/public/services/lens_vis_service.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
index 3703439b32fca..2e4f5a873aeb7 100644
--- a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
+++ b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts
@@ -240,7 +240,7 @@ describe('LensVisService attributes', () => {
"label": "Top 3 values of extension",
"operationType": "terms",
"params": Object {
- "missingBucket": false,
+ "missingBucket": true,
"orderBy": Object {
"columnId": "count_column",
"type": "column",
diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.ts
index a78d3859da441..a7f75f91d0430 100644
--- a/src/plugins/unified_histogram/public/services/lens_vis_service.ts
+++ b/src/plugins/unified_histogram/public/services/lens_vis_service.ts
@@ -378,7 +378,7 @@ export class LensVisService {
},
orderDirection: 'desc',
otherBucket: true,
- missingBucket: false,
+ missingBucket: true,
parentFormat: {
id: 'terms',
},
From 0a4081e1d81eb980998585144c85ac8fbd078f8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?=
Date: Tue, 23 Apr 2024 15:49:25 +0200
Subject: [PATCH 071/183] [Search] Adds telemetry warning rules and fixes a
bunch of telemetry issues (#181350)
## Summary
Enables telemetry warning eslint rule.
Fixes a bunch of missing telemetry strings.
### Checklist
Delete any items that are not applicable to this PR.
- [ ] [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
---
.eslintrc.js | 1 +
.../connector_detail/attach_index_box.tsx | 4 +++
.../connector_configuration.tsx | 30 ++++++++++++++--
.../connector_detail/connector_stats.tsx | 4 ++-
.../native_connector_configuration.tsx | 7 +++-
.../components/connector_detail/overview.tsx | 14 ++++++--
.../components/connectors/connectors.tsx | 9 ++++-
.../connectors/crawler_empty_state.tsx | 2 ++
.../connectors/delete_connector_modal.tsx | 34 +++++++++----------
.../select_connector/connector_checkable.tsx | 16 +++++++--
.../select_connector/native_popover.tsx | 2 ++
.../select_connector/select_connector.tsx | 4 +++
.../settings/default_settings_flyout.tsx | 14 ++++++--
13 files changed, 110 insertions(+), 31 deletions(-)
diff --git a/.eslintrc.js b/.eslintrc.js
index 5c44dcc5ad40a..062626507ab8f 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1524,6 +1524,7 @@ module.exports = {
],
'@kbn/i18n/strings_should_be_translated_with_i18n': 'warn',
'@kbn/i18n/strings_should_be_translated_with_formatted_message': 'warn',
+ '@kbn/telemetry/event_generating_elements_should_be_instrumented': 'warn',
},
},
/**
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx
index 5acc069144df1..8b5bb17020ac0 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx
@@ -253,6 +253,8 @@ export const AttachIndexBox: React.FC = ({ connector }) =>
onSave()}
disabled={!selectedIndex || selectedIndex.label === connector.index_name}
isLoading={isSaveLoading}
@@ -286,6 +288,8 @@ export const AttachIndexBox: React.FC = ({ connector }) =>
{
values={{
exampleLink: (
{
values={{
link: (
{
fetchConnector({ connectorId: connector.id })}
@@ -272,7 +277,12 @@ export const ConnectorConfiguration: React.FC = () => {
defaultMessage="{advancedSyncRulesDocs} can override some configuration fields."
values={{
advancedSyncRulesDocs: (
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.advancedSyncRulesDocs',
{ defaultMessage: 'Advanced Sync Rules' }
@@ -417,7 +427,12 @@ export const ConnectorConfiguration: React.FC = () => {
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.connector_detail.configurationConnector.support.viewDocumentation.label',
{
@@ -438,6 +453,8 @@ export const ConnectorConfiguration: React.FC = () => {
@@ -451,7 +468,12 @@ export const ConnectorConfiguration: React.FC = () => {
{docsUrl && (
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.connector_detail.configurationConnector.support.dockerDeploy.label',
{
@@ -463,6 +485,8 @@ export const ConnectorConfiguration: React.FC = () => {
)}
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx
index 09db1326768a0..ec2edf2df0450 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx
@@ -168,7 +168,9 @@ export const ConnectorStats: React.FC = ({ connector, index
{
}
)}
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.securityReminder.securityLinkLabel',
{
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx
index f8a9b8f12bcb0..a97f7b8c862fd 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx
@@ -148,7 +148,12 @@ export const ConnectorDetailOverview: React.FC = () => {
defaultMessage="Convert it to a {link}, to be self-managed on your own infrastructure. Native connectors are available only in your Elastic Cloud deployment."
values={{
link: (
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.connectors.overview.nativeCloudCallout.connectorClient',
{ defaultMessage: 'connector client' }
@@ -160,7 +165,12 @@ export const ConnectorDetailOverview: React.FC = () => {
- showModal()}>
+ showModal()}
+ >
{i18n.translate(
'xpack.enterpriseSearch.content.indices.connectors.overview.convertConnector.buttonLabel',
{ defaultMessage: 'Convert connector' }
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx
index 1356a5ff98799..eab42df85cc2f 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx
@@ -108,6 +108,8 @@ export const Connectors: React.FC = ({ isCrawler }) => {
= ({ isCrawler }) => {
closePopover={() => setShowMoreOptionsPopover(false)}
button={
= ({ isCrawler }) => {
]
: [
= ({ isCrawler }) => {
? [
setShowDefaultSettingsFlyout(true)}
>
{i18n.translate(
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/crawler_empty_state.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/crawler_empty_state.tsx
index dd3aed042928d..8e5b91b94e39b 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/crawler_empty_state.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/crawler_empty_state.tsx
@@ -41,6 +41,8 @@ export const CrawlerEmptyState: React.FC = () => {
}
actions={
= ({ isCr
{isCrawler && (
- <>
-
-
- {connectorName}
-
- ),
- }}
- />
-
- >
+
+
+ {connectorName}
+
+ ),
+ }}
+ />
+
)}
{!isCrawler && (
@@ -199,13 +197,13 @@ export const DeleteConnectorModal: React.FC = ({ isCr
}
>
setInputConnectorName(e.target.value)}
value={inputConnectorName}
/>
- ) : (
- <>>
- );
+ ) : null;
};
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx
index e765138a848d5..9a1a8727245c7 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx
@@ -119,6 +119,8 @@ export const ConnectorCheckable: React.FC = ({
= ({
= ({
= ({
{ defaultMessage: 'Setup a Native Connector' }
)}
,
- ,
-
+ ,
{
@@ -263,7 +268,12 @@ export const ConnectorCheckable: React.FC = ({
{documentationUrl && (
-
+
{i18n.translate(
'xpack.enterpriseSearch.content.indices.selectConnector.connectorCheckable.documentationLinkLabel',
{
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx
index 641e2b655adfa..226d4a96c6978 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx
@@ -73,6 +73,8 @@ export const NativePopover: React.FC = ({
{
{
/>
= ({ cl
defaultMessage="These settings apply to all new Elasticsearch indices created by Search ingestion mechanisms. For API ingest-based indices, remember to include the pipeline when you ingest documents. These features are powered by {link}"
values={{
link: (
-
+
{i18n.translate(
'xpack.enterpriseSearch.defaultSettingsFlyout.body.description.ingestPipelinesLink.link',
{
@@ -154,7 +159,12 @@ export const DefaultSettingsFlyout: React.FC = ({ cl
defaultMessage: 'ML Inference',
})}
link={
-
+
{i18n.translate('xpack.enterpriseSearch.content.settings.mlInference.link', {
defaultMessage: 'Learn more about document enrichment with ML',
})}
From 46cb23a80deb106f29a5823b492ea75d94d6b8e8 Mon Sep 17 00:00:00 2001
From: Nathan Reese
Date: Tue, 23 Apr 2024 08:07:33 -0600
Subject: [PATCH 072/183] Update SearchReactEmbeddable example to use sessionId
and abortSignal (#181249)
Fixes https://github.com/elastic/kibana/issues/181199
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../public/react_embeddables/search/get_count.ts | 6 +++++-
.../search/search_react_embeddable.tsx | 16 +++++++++++++---
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/examples/embeddable_examples/public/react_embeddables/search/get_count.ts b/examples/embeddable_examples/public/react_embeddables/search/get_count.ts
index d4cdb2e70cb33..fdb1269097c00 100644
--- a/examples/embeddable_examples/public/react_embeddables/search/get_count.ts
+++ b/examples/embeddable_examples/public/react_embeddables/search/get_count.ts
@@ -16,7 +16,9 @@ export async function getCount(
dataService: DataPublicPluginStart,
filters: Filter[],
query: Query | AggregateQuery | undefined,
- timeRange: TimeRange | undefined
+ timeRange: TimeRange | undefined,
+ abortSignal: AbortSignal,
+ sessionId?: string
) {
const searchSource = await dataService.search.searchSource.create();
searchSource.setField('index', dataView);
@@ -38,7 +40,9 @@ export async function getCount(
const { rawResponse: resp } = await lastValueFrom(
searchSource.fetch$({
+ abortSignal,
legacyHitsTotal: false,
+ sessionId,
})
);
// eslint-disable-next-line no-console
diff --git a/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx
index 6d5aff1dcb490..3f1918beda531 100644
--- a/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx
+++ b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx
@@ -15,7 +15,7 @@ import {
useBatchedPublishingSubjects,
} from '@kbn/presentation-publishing';
import React, { useEffect } from 'react';
-import { BehaviorSubject, switchMap } from 'rxjs';
+import { BehaviorSubject, switchMap, tap } from 'rxjs';
import { SEARCH_EMBEDDABLE_ID } from './constants';
import { getCount } from './get_count';
import { Api, Services, State } from './types';
@@ -55,8 +55,14 @@ export const getSearchEmbeddableFactory = (services: Services) => {
const error$ = new BehaviorSubject(undefined);
const count$ = new BehaviorSubject(0);
+ let prevRequestAbortController: AbortController | undefined;
const fetchSubscription = fetch$(api)
.pipe(
+ tap(() => {
+ if (prevRequestAbortController) {
+ prevRequestAbortController.abort();
+ }
+ }),
switchMap(async (fetchContext) => {
error$.next(undefined);
if (!defaultDataView) {
@@ -65,6 +71,8 @@ export const getSearchEmbeddableFactory = (services: Services) => {
try {
dataLoading$.next(true);
+ const abortController = new AbortController();
+ prevRequestAbortController = abortController;
const count = await getCount(
defaultDataView,
services.data,
@@ -79,11 +87,13 @@ export const getSearchEmbeddableFactory = (services: Services) => {
to: new Date(fetchContext.timeslice[1]).toISOString(),
mode: 'absolute' as 'absolute',
}
- : fetchContext.timeRange
+ : fetchContext.timeRange,
+ abortController.signal,
+ fetchContext.searchSessionId
);
return { count };
} catch (error) {
- return { error };
+ return error.name === 'AbortError' ? undefined : { error };
}
})
)
From d6e3bd1693e78968ce69226317458ae7bce77fc9 Mon Sep 17 00:00:00 2001
From: Liam Thompson <32779855+leemthompo@users.noreply.github.com>
Date: Tue, 23 Apr 2024 16:10:05 +0200
Subject: [PATCH 073/183] [Ent Search] Connectors tooltip copyediting (#181308)
Following up on https://github.com/elastic/kibana/pull/180728/files
Part of https://github.com/elastic/connectors/issues/2316
---------
Co-authored-by: Sean Story
Co-authored-by: Sean Story
---
.../sync_jobs/__snapshots__/documents_panel.test.tsx.snap | 6 +++---
.../components/sync_jobs/documents_panel.tsx | 6 +++---
.../components/sync_jobs/sync_jobs_table.tsx | 8 ++++----
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap
index 66caa5b55f567..06d3ba30eff83 100644
--- a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap
+++ b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap
@@ -12,7 +12,7 @@ exports[`DocumentsPanel renders 1`] = `
"name": = (sync
content={
index }}
/>
}
@@ -51,7 +51,7 @@ export const SyncJobDocumentsPanel: React.FC = (sync
content={
delete }}
/>
}
@@ -72,7 +72,7 @@ export const SyncJobDocumentsPanel: React.FC = (sync
content={
index }}
/>
}
diff --git a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx
index 87f3559c3fab6..d526bc2bc0afc 100644
--- a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx
+++ b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx
@@ -64,7 +64,7 @@ export const SyncJobsTable: React.FC = ({
content={
completed_at }}
/>
}
@@ -88,7 +88,7 @@ export const SyncJobsTable: React.FC = ({
content={
completed_at,
started_at: started_at,
@@ -116,7 +116,7 @@ export const SyncJobsTable: React.FC = ({
content={
index }}
/>
}
@@ -144,7 +144,7 @@ export const SyncJobsTable: React.FC = ({
content={
delete }}
/>
}
From bd1666705653e941bfdc4bf7ec7d048d81ddf810 Mon Sep 17 00:00:00 2001
From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com>
Date: Tue, 23 Apr 2024 16:35:04 +0200
Subject: [PATCH 074/183] Connection Details Flyout (#180912)
## Summary
Implements the new *Connection Details* flyout, which allows to copy ES
connection details and provides a simplified interface to create an API
key.
![connection-details](https://github.com/elastic/kibana/assets/82822460/2223db63-748c-4620-9686-1b79c40037a7)
![image](https://github.com/elastic/kibana/assets/82822460/6c3f9661-12bf-4868-b432-483e88dbaab5)
![image](https://github.com/elastic/kibana/assets/82822460/50016456-c880-4738-af24-cb7bebafd01a)
![image](https://github.com/elastic/kibana/assets/82822460/d92f20a5-75bf-4563-abc9-afa5c3256bbd)
### Old UIs
Old connection details modal:
![image](https://github.com/elastic/kibana/assets/82822460/661a9988-6c3b-493f-beca-96e7d2457ad4)
Could be open from help menu:
![image](https://github.com/elastic/kibana/assets/82822460/717bac4c-b041-4163-b4b9-1b7e5ef0a791)
Or, could be open from a setup guide card:
![image](https://github.com/elastic/kibana/assets/82822460/c1d5a657-183f-4af6-90c3-c1d393379785)
## How to test
Add these Cloud settings to your `config/kibana.dev.yml` as a mock data:
```
elasticsearch.hosts: ["http://localhost:9200"]
xpack.cloud.id: my-cluster-id:dXMtZWFzdC0xLmF3cy5zdGFnaW5nLmZvdW5kaXQubm8kZjY3ZDZiZjFhM2NmNDA4ODhlODg2M2Y2Y2IyY2RjNGMkOWViYzEzYjRkOTU0NDI2NDljMzcwZTNlZjMyZWYzOGI=
```
To make Kibana think your local user is a "cloud user", hard-code
`elastic_cloud_user` to `true`:
### Checklist
Delete any items that are not applicable to this PR.
- [ ]
[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] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [x] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
## Release note
The new *Connection details* overlay features a cleaner UI for
Elasticsearch endpoint URL and Cloud ID token retrieval. As well as the
new *"API key"* tab, which is a simplified interface for creating an API
key with all the default settings, except the expiration time is set to
90 days. If user wants a more granular API keys, there is a link which
navigates to the right section in Stack Management.
![connection-details](https://github.com/elastic/kibana/assets/82822460/2223db63-748c-4620-9686-1b79c40037a7)
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
packages/cloud/.storybook/main.js | 14 +++
.../copy_input/copy_input.stories.tsx | 23 ++++
.../components/copy_input/copy_input.tsx | 72 ++++++++++++
.../components/copy_input/index.ts | 9 ++
.../fancy_select/fancy_select.stories.tsx | 33 ++++++
.../components/fancy_select/fancy_select.tsx | 51 ++++++++
.../components/fancy_select/index.ts | 9 ++
.../components/fancy_select/types.ts | 14 +++
.../components/spa_no_router_link/index.ts | 9 ++
.../spa_no_router_link/spa_no_router_link.tsx | 49 ++++++++
.../connection_details.stories.tsx | 23 ++++
.../connection_details/connection_details.tsx | 67 +++++++++++
...nection_details_flyout_content.stories.tsx | 50 ++++++++
.../connection_details_flyout_content.tsx | 64 ++++++++++
.../cloud/connection_details/context/index.ts | 10 ++
.../connection_details/context/options.tsx | 37 ++++++
.../connection_details/context/service.tsx | 22 ++++
.../hooks/use_async_memo.ts | 32 +++++
.../hooks/use_behavior_subject.ts | 14 +++
packages/cloud/connection_details/index.ts | 13 +++
.../cloud/connection_details/kibana/global.ts | 44 +++++++
.../cloud/connection_details/kibana/index.ts | 22 ++++
.../kibana_connection_details_provider.tsx | 106 +++++++++++++++++
...bana_wired_connection_details_provider.tsx | 29 +++++
.../kibana/open_connection_details.tsx | 42 +++++++
.../kibana/open_wired_connection_details.tsx | 25 ++++
packages/cloud/connection_details/service.ts | 86 ++++++++++++++
packages/cloud/connection_details/stories.tsx | 76 ++++++++++++
.../api_keys_tab/api_keys_tab.stories.tsx | 23 ++++
.../tabs/api_keys_tab/api_keys_tab.tsx | 27 +++++
.../components/manage_keys_link.tsx | 32 +++++
.../tabs/api_keys_tab/index.ts | 9 ++
.../configuration_form/configuration_form.tsx | 40 +++++++
.../configuration_form_controlled.tsx | 110 ++++++++++++++++++
.../views/configuration_form/index.tsx | 9 ++
.../views/missing_permissions_panel.tsx | 31 +++++
.../views/success_form/format_select.tsx | 59 ++++++++++
.../api_keys_tab/views/success_form/index.tsx | 9 ++
.../views/success_form/success_form.tsx | 28 +++++
.../success_form_controlled.stories.tsx | 35 ++++++
.../success_form/success_form_controlled.tsx | 74 ++++++++++++
.../api_keys_tab/views/success_form/types.tsx | 14 +++
.../endpoints_tab/endpoint_tab.stories.tsx | 23 ++++
.../tabs/endpoints_tab/endpoints_tab.tsx | 26 +++++
.../tabs/endpoints_tab/index.ts | 9 ++
.../tabs/endpoints_tab/rows/cloud_id_row.tsx | 56 +++++++++
.../endpoints_tab/rows/endpoints_url_row.tsx | 33 ++++++
packages/cloud/connection_details/types.ts | 33 ++++++
packages/cloud/tsconfig.json | 4 +
.../landing_page/guide/guide_card.tsx | 43 +------
.../landing_page/guide/guide_cards.tsx | 13 ---
packages/kbn-guided-onboarding/tsconfig.json | 7 --
src/dev/storybook/aliases.ts | 1 +
.../guided_onboarding/getting_started.tsx | 20 +---
.../public/application/kibana_services.ts | 8 +-
src/plugins/home/public/plugin.ts | 16 ++-
.../maybe_add_cloud_links/help_menu_links.tsx | 29 +----
.../maybe_add_cloud_links.ts | 5 +-
.../cloud_links/public/plugin.tsx | 12 +-
.../functional_cloud/tests/cloud_links.ts | 68 +++++++++--
60 files changed, 1823 insertions(+), 128 deletions(-)
create mode 100644 packages/cloud/.storybook/main.js
create mode 100644 packages/cloud/connection_details/components/copy_input/copy_input.stories.tsx
create mode 100644 packages/cloud/connection_details/components/copy_input/copy_input.tsx
create mode 100644 packages/cloud/connection_details/components/copy_input/index.ts
create mode 100644 packages/cloud/connection_details/components/fancy_select/fancy_select.stories.tsx
create mode 100644 packages/cloud/connection_details/components/fancy_select/fancy_select.tsx
create mode 100644 packages/cloud/connection_details/components/fancy_select/index.ts
create mode 100644 packages/cloud/connection_details/components/fancy_select/types.ts
create mode 100644 packages/cloud/connection_details/components/spa_no_router_link/index.ts
create mode 100644 packages/cloud/connection_details/components/spa_no_router_link/spa_no_router_link.tsx
create mode 100644 packages/cloud/connection_details/connection_details.stories.tsx
create mode 100644 packages/cloud/connection_details/connection_details.tsx
create mode 100644 packages/cloud/connection_details/connection_details_flyout_content.stories.tsx
create mode 100644 packages/cloud/connection_details/connection_details_flyout_content.tsx
create mode 100644 packages/cloud/connection_details/context/index.ts
create mode 100644 packages/cloud/connection_details/context/options.tsx
create mode 100644 packages/cloud/connection_details/context/service.tsx
create mode 100644 packages/cloud/connection_details/hooks/use_async_memo.ts
create mode 100644 packages/cloud/connection_details/hooks/use_behavior_subject.ts
create mode 100644 packages/cloud/connection_details/index.ts
create mode 100644 packages/cloud/connection_details/kibana/global.ts
create mode 100644 packages/cloud/connection_details/kibana/index.ts
create mode 100644 packages/cloud/connection_details/kibana/kibana_connection_details_provider.tsx
create mode 100644 packages/cloud/connection_details/kibana/kibana_wired_connection_details_provider.tsx
create mode 100644 packages/cloud/connection_details/kibana/open_connection_details.tsx
create mode 100644 packages/cloud/connection_details/kibana/open_wired_connection_details.tsx
create mode 100644 packages/cloud/connection_details/service.ts
create mode 100644 packages/cloud/connection_details/stories.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.stories.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/components/manage_keys_link.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/index.ts
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form_controlled.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/index.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/missing_permissions_panel.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/format_select.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/index.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.stories.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.tsx
create mode 100644 packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/types.tsx
create mode 100644 packages/cloud/connection_details/tabs/endpoints_tab/endpoint_tab.stories.tsx
create mode 100644 packages/cloud/connection_details/tabs/endpoints_tab/endpoints_tab.tsx
create mode 100644 packages/cloud/connection_details/tabs/endpoints_tab/index.ts
create mode 100644 packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row.tsx
create mode 100644 packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx
create mode 100644 packages/cloud/connection_details/types.ts
diff --git a/packages/cloud/.storybook/main.js b/packages/cloud/.storybook/main.js
new file mode 100644
index 0000000000000..b7011e2dd8cca
--- /dev/null
+++ b/packages/cloud/.storybook/main.js
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { defaultConfig } from '@kbn/storybook';
+
+module.exports = {
+ ...defaultConfig,
+ stories: ['../**/*.stories.+(tsx|mdx)'],
+};
diff --git a/packages/cloud/connection_details/components/copy_input/copy_input.stories.tsx b/packages/cloud/connection_details/components/copy_input/copy_input.stories.tsx
new file mode 100644
index 0000000000000..49dd62ce94366
--- /dev/null
+++ b/packages/cloud/connection_details/components/copy_input/copy_input.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from '../../stories';
+import { CopyInput } from './copy_input';
+
+export default {
+ title: 'Connection Details/Components/',
+};
+
+export const Default = () => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/components/copy_input/copy_input.tsx b/packages/cloud/connection_details/components/copy_input/copy_input.tsx
new file mode 100644
index 0000000000000..6111208b06148
--- /dev/null
+++ b/packages/cloud/connection_details/components/copy_input/copy_input.tsx
@@ -0,0 +1,72 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiCopy, EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+
+export interface CopyInputProps {
+ value: string;
+}
+
+export const CopyInput: React.FC = ({ value }) => {
+ const textRef = React.useRef(null);
+
+ return (
+
+
+
+
+ {
+ const span = textRef.current;
+ if (!span) return;
+ if (window.getSelection && document.createRange) {
+ const selection = window.getSelection();
+ if (!selection) return;
+ event.preventDefault();
+ const range = document.createRange();
+ range.selectNodeContents(span);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ }}
+ data-test-subj="copyText"
+ >
+ {value}
+
+
+
+
+
+ {(copy) => (
+
+ )}
+
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/components/copy_input/index.ts b/packages/cloud/connection_details/components/copy_input/index.ts
new file mode 100644
index 0000000000000..9dc3294964e27
--- /dev/null
+++ b/packages/cloud/connection_details/components/copy_input/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './copy_input';
diff --git a/packages/cloud/connection_details/components/fancy_select/fancy_select.stories.tsx b/packages/cloud/connection_details/components/fancy_select/fancy_select.stories.tsx
new file mode 100644
index 0000000000000..a18e4f7814de6
--- /dev/null
+++ b/packages/cloud/connection_details/components/fancy_select/fancy_select.stories.tsx
@@ -0,0 +1,33 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from '../../stories';
+import { FancySelect } from './fancy_select';
+
+export default {
+ title: 'Connection Details/Components/',
+};
+
+export const Default = () => {
+ const [value, setValue] = React.useState('1');
+
+ return (
+
+ setValue(newValue)}
+ />
+
+ );
+};
diff --git a/packages/cloud/connection_details/components/fancy_select/fancy_select.tsx b/packages/cloud/connection_details/components/fancy_select/fancy_select.tsx
new file mode 100644
index 0000000000000..303f4eec1bed5
--- /dev/null
+++ b/packages/cloud/connection_details/components/fancy_select/fancy_select.tsx
@@ -0,0 +1,51 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiSuperSelect, EuiText, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui';
+import type { FancySelectOption } from './types';
+
+export interface FancySelectProps {
+ value: string;
+ options: FancySelectOption[];
+ onChange: (value: string) => void;
+}
+
+export const FancySelect: React.FC = ({ value, options, onChange }) => {
+ return (
+ ({
+ value: option.id,
+ icon: option.icon,
+ layoutAlign: 'center',
+ inputDisplay: (
+
+
+
+
+
+
+ {option.title}
+
+
+
+ ),
+ dropdownDisplay: (
+
+ {option.title}
+
+ {option.description}
+
+
+ ),
+ }))}
+ onChange={onChange}
+ />
+ );
+};
diff --git a/packages/cloud/connection_details/components/fancy_select/index.ts b/packages/cloud/connection_details/components/fancy_select/index.ts
new file mode 100644
index 0000000000000..5b76ace802b4d
--- /dev/null
+++ b/packages/cloud/connection_details/components/fancy_select/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './fancy_select';
diff --git a/packages/cloud/connection_details/components/fancy_select/types.ts b/packages/cloud/connection_details/components/fancy_select/types.ts
new file mode 100644
index 0000000000000..6927dc6618604
--- /dev/null
+++ b/packages/cloud/connection_details/components/fancy_select/types.ts
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export interface FancySelectOption {
+ id: string;
+ title: string;
+ description: string;
+ icon: string;
+}
diff --git a/packages/cloud/connection_details/components/spa_no_router_link/index.ts b/packages/cloud/connection_details/components/spa_no_router_link/index.ts
new file mode 100644
index 0000000000000..df700c03225a7
--- /dev/null
+++ b/packages/cloud/connection_details/components/spa_no_router_link/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './spa_no_router_link';
diff --git a/packages/cloud/connection_details/components/spa_no_router_link/spa_no_router_link.tsx b/packages/cloud/connection_details/components/spa_no_router_link/spa_no_router_link.tsx
new file mode 100644
index 0000000000000..3756adb2f35da
--- /dev/null
+++ b/packages/cloud/connection_details/components/spa_no_router_link/spa_no_router_link.tsx
@@ -0,0 +1,49 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiLink } from '@elastic/eui';
+
+const hasActiveModifierKey = (event: React.MouseEvent): boolean => {
+ return event.metaKey || event.altKey || event.ctrlKey || event.shiftKey;
+};
+
+export interface SpaNoRouterLinkProps {
+ url: string;
+ go?: (url: string) => void;
+ onClick?: React.MouseEventHandler;
+ 'data-test-subj'?: string;
+}
+
+export const SpaNoRouterLink: React.FC = ({
+ url,
+ go,
+ onClick,
+ children,
+ ...rest
+}) => {
+ return (
+ /* eslint-disable-next-line @elastic/eui/href-or-on-click */
+ {
+ if (!go) return;
+
+ if (!hasActiveModifierKey(e)) {
+ e.preventDefault();
+ go(url);
+ }
+
+ onClick?.(e);
+ }}
+ >
+ {children}
+
+ );
+};
diff --git a/packages/cloud/connection_details/connection_details.stories.tsx b/packages/cloud/connection_details/connection_details.stories.tsx
new file mode 100644
index 0000000000000..b365bcaa86d1e
--- /dev/null
+++ b/packages/cloud/connection_details/connection_details.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from './stories';
+import { ConnectionDetails } from './connection_details';
+
+export default {
+ title: 'Connection Details',
+};
+
+export const Default = () => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/connection_details.tsx b/packages/cloud/connection_details/connection_details.tsx
new file mode 100644
index 0000000000000..d1aabbbc7b958
--- /dev/null
+++ b/packages/cloud/connection_details/connection_details.tsx
@@ -0,0 +1,67 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiSpacer, EuiTab, EuiTabs } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { useConnectionDetailsOpts } from './context';
+import { EndpointsTab } from './tabs/endpoints_tab';
+import { ApiKeysTab } from './tabs/api_keys_tab';
+
+export const ConnectionDetails: React.FC = () => {
+ type TabID = 'endpoints' | 'apiKeys';
+ type Tab = [id: TabID, name: string, content: React.ReactNode];
+
+ const ctx = useConnectionDetailsOpts();
+ const [tab, setTab] = React.useState('endpoints');
+
+ const tabs: Tab[] = [];
+
+ if (ctx.endpoints) {
+ tabs.push([
+ 'endpoints',
+ i18n.translate('cloud.connectionDetails.tab.endpoints', {
+ defaultMessage: 'Endpoints',
+ }),
+ ,
+ ]);
+ }
+
+ if (ctx.apiKeys) {
+ tabs.push([
+ 'apiKeys',
+ i18n.translate('cloud.connectionDetails.tab.apiKeys', {
+ defaultMessage: 'API key',
+ }),
+ ,
+ ]);
+ }
+
+ if (tabs.length === 0) {
+ return null;
+ }
+
+ return (
+ <>
+
+ {tabs.map(([id, name]) => (
+ setTab(id)}
+ isSelected={tab === id}
+ data-test-subj={`connectionDetailsTabBtn-${id}`}
+ >
+ {name}
+
+ ))}
+
+
+ {tabs.find(([id]) => id === tab)?.[2] || null}
+ >
+ );
+};
diff --git a/packages/cloud/connection_details/connection_details_flyout_content.stories.tsx b/packages/cloud/connection_details/connection_details_flyout_content.stories.tsx
new file mode 100644
index 0000000000000..5bd9cd140dfdf
--- /dev/null
+++ b/packages/cloud/connection_details/connection_details_flyout_content.stories.tsx
@@ -0,0 +1,50 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { EuiFlyout } from '@elastic/eui';
+import {
+ StoriesProvider,
+ StoriesProviderKeyCreationError,
+ StoriesProviderNoKeyPermissions,
+} from './stories';
+import { ConnectionDetailsFlyoutContent } from './connection_details_flyout_content';
+
+export default {
+ title: 'Connection Details/Flyout',
+};
+
+export const Default = () => {
+ return (
+ {}}>
+
+
+
+
+ );
+};
+
+export const CreationError = () => {
+ return (
+ {}}>
+
+
+
+
+ );
+};
+
+export const MissingPermissions = () => {
+ return (
+ {}}>
+
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/connection_details_flyout_content.tsx b/packages/cloud/connection_details/connection_details_flyout_content.tsx
new file mode 100644
index 0000000000000..83cf22b45ee3a
--- /dev/null
+++ b/packages/cloud/connection_details/connection_details_flyout_content.tsx
@@ -0,0 +1,64 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import {
+ EuiFlyoutBody,
+ EuiFlyoutHeader,
+ EuiLink,
+ EuiSpacer,
+ EuiText,
+ EuiTitle,
+} from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { ConnectionDetails } from './connection_details';
+import { useConnectionDetailsOpts } from './context';
+
+export const ConnectionDetailsFlyoutContent: React.FC = () => {
+ const ctx = useConnectionDetailsOpts();
+
+ const header = (
+
+
+
+ {i18n.translate('cloud.connectionDetails.flyout.title', {
+ defaultMessage: 'Connection details',
+ })}
+
+
+
+
+
+ {i18n.translate('cloud.connectionDetails.flyout.subtitle', {
+ defaultMessage: 'Connect to the Elasticsearch API by using the following details.',
+ })}{' '}
+ {!!ctx.links?.learnMore && (
+
+ {i18n.translate('cloud.connectionDetails.learnMoreButtonLabel', {
+ defaultMessage: 'Learn more',
+ })}
+
+ )}
+
+
+
+ );
+
+ const body = (
+
+
+
+ );
+
+ return (
+ <>
+ {header}
+ {body}
+ >
+ );
+};
diff --git a/packages/cloud/connection_details/context/index.ts b/packages/cloud/connection_details/context/index.ts
new file mode 100644
index 0000000000000..d3885d5b4c94c
--- /dev/null
+++ b/packages/cloud/connection_details/context/index.ts
@@ -0,0 +1,10 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './options';
+export { useConnectionDetailsService } from './service';
diff --git a/packages/cloud/connection_details/context/options.tsx b/packages/cloud/connection_details/context/options.tsx
new file mode 100644
index 0000000000000..63bd650016d25
--- /dev/null
+++ b/packages/cloud/connection_details/context/options.tsx
@@ -0,0 +1,37 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { ConnectionDetailsService } from '../service';
+import { ConnectionDetailsOpts } from '../types';
+import { context as serviceContext } from './service';
+
+export const context = React.createContext({});
+
+export const ConnectionDetailsOptsProvider: React.FC = ({
+ children,
+ ...opts
+}) => {
+ const service = React.useMemo(() => new ConnectionDetailsService(opts), [opts]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useConnectionDetailsOpts = (): ConnectionDetailsOpts => {
+ const value = React.useContext(context);
+
+ if (!value || Object.keys(value).length === 0) {
+ throw new Error('ConnectionDetailsOptsContextValue is not set up.');
+ }
+
+ return value;
+};
diff --git a/packages/cloud/connection_details/context/service.tsx b/packages/cloud/connection_details/context/service.tsx
new file mode 100644
index 0000000000000..9cd5c5f24960f
--- /dev/null
+++ b/packages/cloud/connection_details/context/service.tsx
@@ -0,0 +1,22 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { ConnectionDetailsService } from '../service';
+
+export const context = React.createContext(null!);
+
+export const useConnectionDetailsService = (): ConnectionDetailsService => {
+ const value = React.useContext(context);
+
+ if (!value || Object.keys(value).length === 0) {
+ throw new Error('ConnectionDetailsServiceProvider is not set up.');
+ }
+
+ return value;
+};
diff --git a/packages/cloud/connection_details/hooks/use_async_memo.ts b/packages/cloud/connection_details/hooks/use_async_memo.ts
new file mode 100644
index 0000000000000..5391e74faa088
--- /dev/null
+++ b/packages/cloud/connection_details/hooks/use_async_memo.ts
@@ -0,0 +1,32 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+
+export const useAsyncMemo = (
+ fn: () => Promise,
+ deps: React.DependencyList
+): T | undefined => {
+ const [value, setValue] = React.useState(undefined);
+
+ React.useLayoutEffect(() => {
+ let isMounted = true;
+
+ fn().then((result) => {
+ if (isMounted) {
+ setValue(result);
+ }
+ });
+
+ return () => {
+ isMounted = false;
+ };
+ }, deps); // eslint-disable-line react-hooks/exhaustive-deps
+
+ return value;
+};
diff --git a/packages/cloud/connection_details/hooks/use_behavior_subject.ts b/packages/cloud/connection_details/hooks/use_behavior_subject.ts
new file mode 100644
index 0000000000000..e4a199200174b
--- /dev/null
+++ b/packages/cloud/connection_details/hooks/use_behavior_subject.ts
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import useObservable from 'react-use/lib/useObservable';
+import type { BehaviorSubject } from 'rxjs';
+
+export const useBehaviorSubject = (subject: BehaviorSubject): T => {
+ return useObservable(subject, subject.getValue());
+};
diff --git a/packages/cloud/connection_details/index.ts b/packages/cloud/connection_details/index.ts
new file mode 100644
index 0000000000000..3e991bc1ffad0
--- /dev/null
+++ b/packages/cloud/connection_details/index.ts
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './types';
+export { ConnectionDetailsOptsProvider } from './context';
+export { ConnectionDetails } from './connection_details';
+export { ConnectionDetailsFlyoutContent } from './connection_details_flyout_content';
+export * from './kibana';
diff --git a/packages/cloud/connection_details/kibana/global.ts b/packages/cloud/connection_details/kibana/global.ts
new file mode 100644
index 0000000000000..af3767d12ad77
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/global.ts
@@ -0,0 +1,44 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreStart } from '@kbn/core-lifecycle-browser';
+import type { CloudStart } from '@kbn/cloud-plugin/public';
+import type { SharePluginStart } from '@kbn/share-plugin/public';
+
+export interface ConnectionDetailsGlobalDependencies {
+ start: {
+ core: {
+ i18n: CoreStart['i18n'];
+ docLinks: CoreStart['docLinks'];
+ theme: CoreStart['theme'];
+ http: CoreStart['http'];
+ application: CoreStart['application'];
+ overlays: CoreStart['overlays'];
+ };
+ plugins: {
+ cloud?: CloudStart;
+ share?: SharePluginStart;
+ };
+ };
+}
+
+const kDependencies = 'ConnectionDetailsGlobalDependencies';
+
+export const setGlobalDependencies = (dependencies: ConnectionDetailsGlobalDependencies) => {
+ (global as any)[kDependencies] = dependencies;
+};
+
+export const getGlobalDependencies = (): ConnectionDetailsGlobalDependencies => {
+ const dependencies = (global as any)[kDependencies];
+
+ if (dependencies === undefined) {
+ throw new Error('ConnectionDetailsGlobalDependencies not set');
+ }
+
+ return dependencies as ConnectionDetailsGlobalDependencies;
+};
diff --git a/packages/cloud/connection_details/kibana/index.ts b/packages/cloud/connection_details/kibana/index.ts
new file mode 100644
index 0000000000000..12c2575059e36
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/index.ts
@@ -0,0 +1,22 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export {
+ KibanaConnectionDetailsProvider,
+ type KibanaConnectionDetailsProviderProps,
+} from './kibana_connection_details_provider';
+export { setGlobalDependencies } from './global';
+export {
+ KibanaWiredConnectionDetailsProvider,
+ type KibanaWiredConnectionDetailsProviderProps,
+} from './kibana_wired_connection_details_provider';
+export { openConnectionDetails, type OpenConnectionDetailsParams } from './open_connection_details';
+export {
+ openWiredConnectionDetails,
+ type OpenWiredConnectionDetailsParams,
+} from './open_wired_connection_details';
diff --git a/packages/cloud/connection_details/kibana/kibana_connection_details_provider.tsx b/packages/cloud/connection_details/kibana/kibana_connection_details_provider.tsx
new file mode 100644
index 0000000000000..57f1fe13df4d8
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/kibana_connection_details_provider.tsx
@@ -0,0 +1,106 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import type { CoreStart } from '@kbn/core-lifecycle-browser';
+import type { CloudStart } from '@kbn/cloud-plugin/public';
+import type { SharePluginStart } from '@kbn/share-plugin/public';
+import type { CreateAPIKeyParams, CreateAPIKeyResult } from '@kbn/security-plugin-types-server';
+import { ConnectionDetailsOptsProvider } from '../context';
+import { ConnectionDetailsOpts } from '../types';
+import { useAsyncMemo } from '../hooks/use_async_memo';
+
+const createOpts = async (props: KibanaConnectionDetailsProviderProps) => {
+ const { options, start } = props;
+ const { http, docLinks } = start.core;
+ const locator = start.plugins?.share?.url?.locators.get('MANAGEMENT_APP_LOCATOR');
+ const manageKeysLink = await locator?.getUrl({ sectionId: 'security', appId: 'api_keys' });
+ const result: ConnectionDetailsOpts = {
+ ...options,
+ navigateToUrl: start.core.application
+ ? (link: string) => {
+ props.onNavigation?.();
+ start.core.application?.navigateToUrl?.(link);
+ }
+ : undefined,
+ links: {
+ learnMore: docLinks.links.fleet.apiKeysLearnMore,
+ ...options?.links,
+ },
+ endpoints: {
+ id: start.plugins?.cloud?.cloudId,
+ url: start.plugins?.cloud?.elasticsearchUrl,
+ ...options?.endpoints,
+ },
+ apiKeys: {
+ manageKeysLink,
+ createKey: async ({ name }) => {
+ if (!http) {
+ throw new Error('HTTP service is not available');
+ }
+
+ const request: CreateAPIKeyParams = {
+ name,
+ expiration: '90d',
+ metadata: {},
+ role_descriptors: {},
+ };
+
+ const response = await http.post('/internal/security/api_key', {
+ body: JSON.stringify(request),
+ });
+
+ return {
+ apiKey: {
+ id: response.id,
+ name: response.name,
+ key: response.api_key,
+ encoded: response.encoded,
+ },
+ };
+ },
+ hasPermission: async () => true,
+ ...options?.apiKeys,
+ },
+ };
+
+ return result;
+};
+
+export interface KibanaConnectionDetailsProviderProps {
+ onNavigation?: () => void;
+ options?: ConnectionDetailsOpts;
+ start: {
+ core: {
+ i18n: CoreStart['i18n'];
+ docLinks: CoreStart['docLinks'];
+ theme: CoreStart['theme'];
+ http?: CoreStart['http'];
+ application?: CoreStart['application'];
+ };
+ plugins?: {
+ cloud?: CloudStart;
+ share?: SharePluginStart;
+ };
+ };
+}
+
+export const KibanaConnectionDetailsProvider: React.FC = (
+ props
+) => {
+ const opts = useAsyncMemo(
+ () => createOpts(props),
+ [props.onNavigation, props.options, props.start]
+ );
+
+ if (!opts) {
+ return null;
+ }
+
+ return {props.children};
+};
diff --git a/packages/cloud/connection_details/kibana/kibana_wired_connection_details_provider.tsx b/packages/cloud/connection_details/kibana/kibana_wired_connection_details_provider.tsx
new file mode 100644
index 0000000000000..a45e9ce436676
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/kibana_wired_connection_details_provider.tsx
@@ -0,0 +1,29 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import {
+ KibanaConnectionDetailsProvider,
+ KibanaConnectionDetailsProviderProps,
+} from './kibana_connection_details_provider';
+import { getGlobalDependencies } from './global';
+
+export type KibanaWiredConnectionDetailsProviderProps = Omit<
+ KibanaConnectionDetailsProviderProps,
+ 'start'
+>;
+
+export const KibanaWiredConnectionDetailsProvider: React.FC<
+ KibanaWiredConnectionDetailsProviderProps
+> = (props) => {
+ return (
+
+ {props.children}
+
+ );
+};
diff --git a/packages/cloud/connection_details/kibana/open_connection_details.tsx b/packages/cloud/connection_details/kibana/open_connection_details.tsx
new file mode 100644
index 0000000000000..52078662c337d
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/open_connection_details.tsx
@@ -0,0 +1,42 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import ReactDOM from 'react-dom';
+import type { CoreStart } from '@kbn/core-lifecycle-browser';
+import * as conn from '..';
+
+export interface OpenConnectionDetailsParams {
+ props: conn.KibanaConnectionDetailsProviderProps;
+ start: {
+ core: {
+ overlays: CoreStart['overlays'];
+ };
+ };
+}
+
+export const openConnectionDetails = async ({ props, start }: OpenConnectionDetailsParams) => {
+ const mount = (element: HTMLElement) => {
+ const reactElement = (
+ {
+ flyoutRef?.close();
+ }}
+ >
+
+
+ );
+ ReactDOM.render(reactElement, element);
+
+ return () => ReactDOM.unmountComponentAtNode(element);
+ };
+ const flyoutRef = start.core.overlays.openFlyout(mount, { size: 's' });
+
+ return flyoutRef;
+};
diff --git a/packages/cloud/connection_details/kibana/open_wired_connection_details.tsx b/packages/cloud/connection_details/kibana/open_wired_connection_details.tsx
new file mode 100644
index 0000000000000..a119caf04847c
--- /dev/null
+++ b/packages/cloud/connection_details/kibana/open_wired_connection_details.tsx
@@ -0,0 +1,25 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { openConnectionDetails, OpenConnectionDetailsParams } from './open_connection_details';
+import { getGlobalDependencies } from './global';
+
+export type OpenWiredConnectionDetailsParams = Partial>;
+
+export const openWiredConnectionDetails = async (params: OpenWiredConnectionDetailsParams = {}) => {
+ const start = getGlobalDependencies().start;
+
+ return openConnectionDetails({
+ ...params,
+ props: {
+ ...params.props,
+ start,
+ },
+ start,
+ });
+};
diff --git a/packages/cloud/connection_details/service.ts b/packages/cloud/connection_details/service.ts
new file mode 100644
index 0000000000000..2fec4e95d179b
--- /dev/null
+++ b/packages/cloud/connection_details/service.ts
@@ -0,0 +1,86 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { BehaviorSubject } from 'rxjs';
+import { i18n } from '@kbn/i18n';
+import { ApiKey } from './tabs/api_keys_tab/views/success_form/types';
+import type { Format } from './tabs/api_keys_tab/views/success_form/format_select';
+import type { ConnectionDetailsOpts } from './types';
+
+export class ConnectionDetailsService {
+ public readonly showCloudId$ = new BehaviorSubject(false);
+ public readonly apiKeyName$ = new BehaviorSubject('');
+ public readonly apiKeyStatus$ = new BehaviorSubject<'configuring' | 'creating'>('configuring');
+ public readonly apiKeyError$ = new BehaviorSubject(undefined);
+ public readonly apiKey$ = new BehaviorSubject(null);
+ public readonly apiKeyFormat$ = new BehaviorSubject('encoded');
+ public readonly apiKeyHasAccess$ = new BehaviorSubject(null);
+
+ constructor(public readonly opts: ConnectionDetailsOpts) {
+ opts.apiKeys
+ ?.hasPermission()
+ .then((hasAccess) => {
+ this.apiKeyHasAccess$.next(hasAccess);
+ })
+ .catch((error) => {
+ // eslint-disable-next-line no-console
+ console.error('Error checking API key creation permissions', error);
+ });
+ }
+
+ public readonly toggleShowCloudId = () => {
+ this.showCloudId$.next(!this.showCloudId$.getValue());
+ };
+
+ public readonly setApiKeyName = (name: string) => {
+ this.apiKeyName$.next(name);
+ this.apiKeyError$.next(undefined);
+ };
+
+ public readonly setApiKeyFormat = (format: Format) => {
+ this.apiKeyFormat$.next(format);
+ };
+
+ private validateName = () => {
+ const name = this.apiKeyName$.getValue();
+
+ if (!name) {
+ const message = i18n.translate('cloud.connectionDetails.tab.apiKeys.nameField.missingError', {
+ defaultMessage: 'API key name is required.',
+ });
+ throw new Error(message);
+ }
+ };
+
+ private readonly createKeyAsync = async () => {
+ const createKey = this.opts.apiKeys?.createKey;
+
+ if (!createKey) {
+ throw new Error('createKey() is not implemented');
+ }
+
+ this.apiKeyStatus$.next('creating');
+ try {
+ this.validateName();
+ const { apiKey } = await createKey({
+ name: this.apiKeyName$.getValue(),
+ });
+ this.apiKey$.next(apiKey);
+ } catch (error) {
+ this.apiKeyError$.next(error);
+ } finally {
+ this.apiKeyStatus$.next('configuring');
+ }
+ };
+
+ public readonly createKey = () => {
+ this.createKeyAsync().catch((error) => {
+ this.apiKeyError$.next(error);
+ });
+ };
+}
diff --git a/packages/cloud/connection_details/stories.tsx b/packages/cloud/connection_details/stories.tsx
new file mode 100644
index 0000000000000..e3c9a82beea38
--- /dev/null
+++ b/packages/cloud/connection_details/stories.tsx
@@ -0,0 +1,76 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { ConnectionDetailsOptsProvider } from './context';
+import type { ConnectionDetailsOpts } from './types';
+
+const defaultOpts: ConnectionDetailsOpts = {
+ links: {
+ learnMore: 'https://www.elastic.co/LEARN_MORE',
+ },
+ endpoints: {
+ url: 'https://f67d6bf1a3cf40888e8863f6cb2cdc4c.us-east-1.aws.staging.foundit.no:443',
+ id: 'my-cluster-id:dXMtZWFzdC0xLmF3cy5zdGFnaW5nLmZvdW5kaXQubm8kZjY3ZDZiZjFhM2NmNDA4ODhlODg2M2Y2Y2IyY2RjNGMkOWViYzEzYjRkOTU0NDI2NDljMzcwZTNlZjMyZWYzOGI=',
+ },
+ apiKeys: {
+ manageKeysLink: 'https://www.elastic.co/MANAGE_API_KEYS',
+ createKey: async ({ name }) => {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+
+ return {
+ apiKey: {
+ id: 'hjfq4o4BTjxWQruxIear',
+ name,
+ encoded: 'aGpmcTRvNEJUanhXUXJ1eEllYXI6VUJYc1lPNkhSTy1PempUTk0tSjF6Zw==',
+ key: 'UBXsYO6HRO-OzjTNM-J1zg',
+ },
+ };
+ },
+ hasPermission: async () => {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+
+ return true;
+ },
+ },
+};
+
+export const StoriesProvider: React.FC = ({ children }) => {
+ return {children};
+};
+
+export const StoriesProviderKeyCreationError: React.FC = ({ children }) => {
+ const opts: ConnectionDetailsOpts = {
+ ...defaultOpts,
+ apiKeys: {
+ ...defaultOpts!.apiKeys!,
+ createKey: async () => {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ throw new Error('Failed to create API key');
+ },
+ },
+ };
+
+ return {children};
+};
+
+export const StoriesProviderNoKeyPermissions: React.FC = ({ children }) => {
+ const opts: ConnectionDetailsOpts = {
+ ...defaultOpts,
+ apiKeys: {
+ ...defaultOpts!.apiKeys!,
+ hasPermission: async () => {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+
+ return false;
+ },
+ },
+ };
+
+ return {children};
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.stories.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.stories.tsx
new file mode 100644
index 0000000000000..8e870bbe0c704
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from '../../stories';
+import { ApiKeysTab } from './api_keys_tab';
+
+export default {
+ title: 'Connection Details/Tabs/API Keys',
+};
+
+export const Default = () => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.tsx
new file mode 100644
index 0000000000000..dcb31eabfc287
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/api_keys_tab.tsx
@@ -0,0 +1,27 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { useConnectionDetailsService } from '../../context';
+import { useBehaviorSubject } from '../../hooks/use_behavior_subject';
+import { ConfigurationForm } from './views/configuration_form';
+import { MissingPermissionsPanel } from './views/missing_permissions_panel';
+import { SuccessForm } from './views/success_form';
+
+export const ApiKeysTab: React.FC = () => {
+ const service = useConnectionDetailsService();
+ const { apiKeys } = service.opts;
+ const apiKey = useBehaviorSubject(service.apiKey$);
+ const hasAccess = useBehaviorSubject(service.apiKeyHasAccess$);
+
+ if (!apiKeys) return null;
+ if (hasAccess === false) return ;
+ if (apiKey) return ;
+
+ return ;
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/components/manage_keys_link.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/components/manage_keys_link.tsx
new file mode 100644
index 0000000000000..a6ead0f520bb4
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/components/manage_keys_link.tsx
@@ -0,0 +1,32 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { i18n } from '@kbn/i18n';
+import { useConnectionDetailsService } from '../../../context';
+import { SpaNoRouterLink } from '../../../components/spa_no_router_link';
+
+export const ManageKeysLink: React.FC = () => {
+ const service = useConnectionDetailsService();
+
+ const link = service.opts.apiKeys?.manageKeysLink;
+
+ if (!link) return null;
+
+ return (
+
+ {i18n.translate('cloud.connectionDetails.apiKeys.managerLinkLabel', {
+ defaultMessage: 'Manage API keys',
+ })}
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/index.ts b/packages/cloud/connection_details/tabs/api_keys_tab/index.ts
new file mode 100644
index 0000000000000..de7bfb9e1ff1d
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './api_keys_tab';
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form.tsx
new file mode 100644
index 0000000000000..9a1c9de454ff0
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form.tsx
@@ -0,0 +1,40 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiSkeletonText } from '@elastic/eui';
+import { ConfigurationFormControlled } from './configuration_form_controlled';
+import { useConnectionDetailsService } from '../../../../context';
+import { useBehaviorSubject } from '../../../../hooks/use_behavior_subject';
+
+export const ConfigurationForm: React.FC = () => {
+ const service = useConnectionDetailsService();
+ const keyName = useBehaviorSubject(service.apiKeyName$);
+ const keyStatus = useBehaviorSubject(service.apiKeyStatus$);
+ const keyError = useBehaviorSubject(service.apiKeyError$);
+ const hasAccess = useBehaviorSubject(service.apiKeyHasAccess$);
+
+ const isLoadingPermissions = hasAccess === null;
+
+ return (
+
+ {
+ service.setApiKeyName(event.target.value);
+ }}
+ onSubmit={(event) => {
+ event.preventDefault();
+ service.createKey();
+ }}
+ />
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form_controlled.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form_controlled.tsx
new file mode 100644
index 0000000000000..9d566ef431522
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/configuration_form_controlled.tsx
@@ -0,0 +1,110 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import {
+ EuiButton,
+ EuiCallOut,
+ EuiFieldText,
+ EuiFlexGroup,
+ EuiFlexItem,
+ EuiForm,
+ EuiFormRow,
+ EuiSpacer,
+} from '@elastic/eui';
+import * as React from 'react';
+import { i18n } from '@kbn/i18n';
+import { ManageKeysLink } from '../../components/manage_keys_link';
+
+export interface ConfigurationFormControlledProps {
+ name: string;
+ loading?: boolean;
+ error?: Error | unknown;
+ onNameChange: React.ChangeEventHandler;
+ onSubmit: React.FormEventHandler;
+}
+
+export const ConfigurationFormControlled: React.FC = ({
+ name,
+ loading,
+ error,
+ onNameChange,
+ onSubmit,
+}) => {
+ const body = (
+ <>
+ {!!error && (
+ <>
+
+ {error instanceof Error ? error.message : String(error)}
+
+
+ >
+ )}
+
+
+
+
+ >
+ );
+
+ const footer = (
+
+
+
+
+
+
+ {i18n.translate('cloud.connectionDetails.tab.apiKeys.nameField.createButton.label', {
+ defaultMessage: 'Create API key',
+ })}
+
+
+
+ );
+
+ return (
+
+ {body}
+
+ {footer}
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/index.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/index.tsx
new file mode 100644
index 0000000000000..e8ced5717da1d
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/configuration_form/index.tsx
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './configuration_form';
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/missing_permissions_panel.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/missing_permissions_panel.tsx
new file mode 100644
index 0000000000000..5e2d5dd2da830
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/missing_permissions_panel.tsx
@@ -0,0 +1,31 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiCallOut } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+
+export const MissingPermissionsPanel: React.FC = () => {
+ return (
+
+
+ {i18n.translate('cloud.connectionDetails.tabs.apiKeys.missingPermPanel.description', {
+ defaultMessage:
+ 'Your assigned role does not have the necessary permissions to create an API key. ' +
+ 'Please contact your administrator.',
+ })}
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/format_select.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/format_select.tsx
new file mode 100644
index 0000000000000..b13d562bff8ed
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/format_select.tsx
@@ -0,0 +1,59 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { i18n } from '@kbn/i18n';
+import { FancySelect } from '../../../../components/fancy_select';
+
+export type Format = 'encoded' | 'beats' | 'logstash';
+
+export interface FormatSelectProps {
+ value: Format;
+ onChange: (value: Format) => void;
+}
+
+export const FormatSelect: React.FC = ({ value, onChange }) => {
+ return (
+ onChange(newValue as Format)}
+ />
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/index.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/index.tsx
new file mode 100644
index 0000000000000..ce50265f62f02
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/index.tsx
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './success_form';
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form.tsx
new file mode 100644
index 0000000000000..154c3c8d2b4bb
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form.tsx
@@ -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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { useConnectionDetailsService } from '../../../../context';
+import { useBehaviorSubject } from '../../../../hooks/use_behavior_subject';
+import { SuccessFormControlled } from './success_form_controlled';
+
+export const SuccessForm: React.FC = () => {
+ const service = useConnectionDetailsService();
+ const apiKey = useBehaviorSubject(service.apiKey$);
+ const format = useBehaviorSubject(service.apiKeyFormat$);
+
+ if (!apiKey) return null;
+
+ return (
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.stories.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.stories.tsx
new file mode 100644
index 0000000000000..aa87dd26b568a
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.stories.tsx
@@ -0,0 +1,35 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from '../../../../stories';
+import { SuccessFormControlled } from './success_form_controlled';
+import type { Format } from './format_select';
+
+export default {
+ title: 'Connection Details/Tabs/API Keys/Success Form (controlled)',
+};
+
+export const Default = () => {
+ const [format, setFormat] = React.useState('encoded');
+
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.tsx
new file mode 100644
index 0000000000000..d5717bee8e244
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/success_form_controlled.tsx
@@ -0,0 +1,74 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { EuiCallOut, EuiFormRow, EuiSpacer } from '@elastic/eui';
+import * as React from 'react';
+import { i18n } from '@kbn/i18n';
+import { ApiKey } from './types';
+import { FormatSelect, type Format } from './format_select';
+import { CopyInput } from '../../../../components/copy_input';
+import { ManageKeysLink } from '../../components/manage_keys_link';
+
+export interface SuccessFormControlledProps {
+ apiKey: ApiKey;
+ format: Format;
+ onFormatChange: (format: Format) => void;
+}
+
+export const SuccessFormControlled: React.FC = ({
+ apiKey,
+ format,
+ onFormatChange,
+}) => {
+ const keyValue = format === 'encoded' ? apiKey.encoded : `${apiKey.id}:${apiKey.key}`;
+
+ return (
+ <>
+
+
+ {i18n.translate('cloud.connectionDetails.apiKeys.successForm.message', {
+ defaultMessage:
+ 'Copy your API key below now. It will not be available ' +
+ 'after you close this dialogue. The API key will expire in 90 days.',
+ })}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/types.tsx b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/types.tsx
new file mode 100644
index 0000000000000..d4702bd777121
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/api_keys_tab/views/success_form/types.tsx
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export interface ApiKey {
+ id: string;
+ name: string;
+ key: string;
+ encoded: string;
+}
diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/endpoint_tab.stories.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/endpoint_tab.stories.tsx
new file mode 100644
index 0000000000000..f31a28059b830
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/endpoints_tab/endpoint_tab.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { StoriesProvider } from '../../stories';
+import { EndpointsTab } from './endpoints_tab';
+
+export default {
+ title: 'Connection Details/Tabs/Endpoints Tab',
+};
+
+export const Default = () => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/endpoints_tab.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/endpoints_tab.tsx
new file mode 100644
index 0000000000000..40f442348acf7
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/endpoints_tab/endpoints_tab.tsx
@@ -0,0 +1,26 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { EuiForm } from '@elastic/eui';
+import * as React from 'react';
+import { useConnectionDetailsOpts } from '../../context';
+import { CloudIdRow } from './rows/cloud_id_row';
+import { EndpointUrlRow } from './rows/endpoints_url_row';
+
+export const EndpointsTab: React.FC = () => {
+ const { endpoints } = useConnectionDetailsOpts();
+
+ if (!endpoints) return null;
+
+ return (
+
+ {!!endpoints?.url && }
+ {!!endpoints?.id && }
+
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/index.ts b/packages/cloud/connection_details/tabs/endpoints_tab/index.ts
new file mode 100644
index 0000000000000..5b3437f2979cc
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/endpoints_tab/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export * from './endpoints_tab';
diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row.tsx
new file mode 100644
index 0000000000000..217bc533e9255
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row.tsx
@@ -0,0 +1,56 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiFormRow, EuiSpacer, EuiSwitch } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { CopyInput } from '../../../components/copy_input';
+import { useConnectionDetailsService } from '../../../context';
+import { useBehaviorSubject } from '../../../hooks/use_behavior_subject';
+
+export interface CloudIdRowProps {
+ value: string;
+}
+
+export const CloudIdRow: React.FC = ({ value }) => {
+ const service = useConnectionDetailsService();
+ const showCloudId = useBehaviorSubject(service.showCloudId$);
+
+ return (
+ <>
+
+
+
+
+ {showCloudId && }
+
+ {showCloudId && (
+
+
+
+ )}
+ >
+ );
+};
diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx
new file mode 100644
index 0000000000000..29f40dcb0c5e2
--- /dev/null
+++ b/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx
@@ -0,0 +1,33 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import * as React from 'react';
+import { EuiFormRow } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { CopyInput } from '../../../components/copy_input';
+
+export interface EndpointUrlProps {
+ url: string;
+}
+
+export const EndpointUrlRow: React.FC = ({ url }) => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/cloud/connection_details/types.ts b/packages/cloud/connection_details/types.ts
new file mode 100644
index 0000000000000..e7df5adf20bdb
--- /dev/null
+++ b/packages/cloud/connection_details/types.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { ApiKey } from './tabs/api_keys_tab/views/success_form/types';
+
+export interface ConnectionDetailsOpts {
+ links?: ConnectionDetailsOptsLinks;
+ endpoints?: ConnectionDetailsOptsEndpoints;
+ apiKeys?: ConnectionDetailsOptsApiKeys;
+ navigateToUrl?: (url: string) => void;
+}
+
+export interface ConnectionDetailsOptsLinks {
+ learnMore?: string;
+}
+
+export interface ConnectionDetailsOptsEndpoints {
+ url?: string;
+ id?: string;
+}
+
+export interface ConnectionDetailsOptsApiKeys {
+ manageKeysLink?: string;
+ createKey: (params: { name: string }) => Promise<{
+ apiKey: ApiKey;
+ }>;
+ hasPermission: () => Promise;
+}
diff --git a/packages/cloud/tsconfig.json b/packages/cloud/tsconfig.json
index f56351356720a..1eb5dbd01b1e0 100644
--- a/packages/cloud/tsconfig.json
+++ b/packages/cloud/tsconfig.json
@@ -18,5 +18,9 @@
"kbn_references": [
"@kbn/i18n",
"@kbn/i18n-react",
+ "@kbn/core-lifecycle-browser",
+ "@kbn/cloud-plugin",
+ "@kbn/share-plugin",
+ "@kbn/security-plugin-types-server",
]
}
diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_card.tsx b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_card.tsx
index 3809f212c6fa6..5c17c83c7e47f 100644
--- a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_card.tsx
+++ b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_card.tsx
@@ -10,10 +10,8 @@ import React, { useCallback, useState } from 'react';
import { EuiCard, EuiFlexGroup, EuiIcon, EuiTextColor, useEuiTheme } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
-
import { css } from '@emotion/react';
-import { DeploymentDetailsModal, DeploymentDetailsProvider } from '@kbn/cloud/deployment_details';
-import { toMountPoint } from '@kbn/react-kibana-mount';
+import { openWiredConnectionDetails } from '@kbn/cloud/connection_details';
import { GuideState } from '../../../types';
import { GuideCardConstants } from './guide_cards.constants';
import { GuideCardsProps } from './guide_cards';
@@ -43,13 +41,6 @@ export const GuideCard = ({
activateGuide,
navigateToApp,
activeFilter,
- openModal,
- i18nStart,
- theme,
- url,
- cloud,
- docLinks,
- navigateToUrl,
}: GuideCardsProps & { card: GuideCardConstants }) => {
const [isLoading, setIsLoading] = useState(false);
const { euiTheme } = useEuiTheme();
@@ -58,35 +49,6 @@ export const GuideCard = ({
guideState = guidesState.find((state) => state.guideId === card.guideId);
}
- const managementUrl = url.locators
- .get('MANAGEMENT_APP_LOCATOR')
- ?.useUrl({ sectionId: 'security', appId: 'api_keys' });
-
- const openESApiModal = useCallback(() => {
- const modal = openModal(
- toMountPoint(
-
- modal.close()} />
- ,
- {
- theme,
- i18n: i18nStart,
- }
- ),
- {
- maxWidth: 400,
- 'data-test-subj': 'guideModalESApi',
- }
- );
- }, [openModal, i18nStart, theme, cloud, docLinks, managementUrl, navigateToUrl]);
-
const onClick = useCallback(async () => {
setIsLoading(true);
if (card.guideId) {
@@ -96,7 +58,7 @@ export const GuideCard = ({
path: card.navigateTo.path,
});
} else if (card.openEndpointModal) {
- openESApiModal();
+ openWiredConnectionDetails();
}
setIsLoading(false);
}, [
@@ -106,7 +68,6 @@ export const GuideCard = ({
guideState,
navigateToApp,
card.openEndpointModal,
- openESApiModal,
]);
const isHighlighted = activeFilter === card.solution;
diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.tsx b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.tsx
index 239ab42c35325..1fce96f6ca2e5 100644
--- a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.tsx
+++ b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.tsx
@@ -12,12 +12,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui';
import type { ApplicationStart } from '@kbn/core-application-browser';
-import type { OverlayStart } from '@kbn/core-overlays-browser';
-import type { ThemeServiceStart } from '@kbn/core-theme-browser';
-import type { I18nStart } from '@kbn/core-i18n-browser';
-import type { BrowserUrlService } from '@kbn/share-plugin/public';
-import type { CloudSetup } from '@kbn/cloud-plugin/public';
-import type { CoreStart } from '@kbn/core-lifecycle-browser';
import { GuideId, GuideState } from '../../../types';
import { GuideFilterValues } from './guide_filters';
import { GuideCardConstants } from './guide_cards.constants';
@@ -31,13 +25,6 @@ export interface GuideCardsProps {
activeFilter: GuideFilterValues;
guidesState: GuideState[];
filteredCards?: GuideCardConstants[];
- openModal: OverlayStart['openModal'];
- theme: ThemeServiceStart;
- i18nStart: I18nStart;
- url: BrowserUrlService;
- cloud: CloudSetup;
- docLinks: CoreStart['docLinks'];
- navigateToUrl: ApplicationStart['navigateToUrl'];
}
export const GuideCards = (props: GuideCardsProps) => {
const { filteredCards } = props;
diff --git a/packages/kbn-guided-onboarding/tsconfig.json b/packages/kbn-guided-onboarding/tsconfig.json
index 0ef62f4bc89f9..b47b2dad14429 100644
--- a/packages/kbn-guided-onboarding/tsconfig.json
+++ b/packages/kbn-guided-onboarding/tsconfig.json
@@ -15,14 +15,7 @@
"@kbn/i18n",
"@kbn/core-application-browser",
"@kbn/i18n-react",
- "@kbn/react-kibana-mount",
- "@kbn/core-overlays-browser",
- "@kbn/core-theme-browser",
- "@kbn/core-i18n-browser",
"@kbn/cloud",
- "@kbn/share-plugin",
- "@kbn/cloud-plugin",
- "@kbn/core-lifecycle-browser",
"@kbn/analytics",
],
"exclude": [
diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts
index 083337f7e6211..cc8b46c136aa2 100644
--- a/src/dev/storybook/aliases.ts
+++ b/src/dev/storybook/aliases.ts
@@ -16,6 +16,7 @@ export const storybookAliases = {
cases: 'packages/kbn-cases-components/.storybook',
cell_actions: 'packages/kbn-cell-actions/.storybook',
cloud_chat: 'x-pack/plugins/cloud_integrations/cloud_chat/.storybook',
+ cloud: 'packages/cloud/.storybook',
coloring: 'packages/kbn-coloring/.storybook',
language_documentation_popover: 'packages/kbn-language-documentation-popover/.storybook',
chart_icons: 'packages/kbn-chart-icons/.storybook',
diff --git a/src/plugins/home/public/application/components/guided_onboarding/getting_started.tsx b/src/plugins/home/public/application/components/guided_onboarding/getting_started.tsx
index 273fc22545266..ed20bc45023fb 100644
--- a/src/plugins/home/public/application/components/guided_onboarding/getting_started.tsx
+++ b/src/plugins/home/public/application/components/guided_onboarding/getting_started.tsx
@@ -54,18 +54,7 @@ const skipText = i18n.translate('home.guidedOnboarding.gettingStarted.skip.butto
});
export const GettingStarted = () => {
- const {
- application,
- trackUiMetric,
- chrome,
- guidedOnboardingService,
- cloud,
- openModal,
- theme,
- i18nStart,
- docLinks,
- share,
- } = getServices();
+ const { application, trackUiMetric, chrome, guidedOnboardingService, cloud } = getServices();
const [guidesState, setGuidesState] = useState([]);
const [isLoading, setIsLoading] = useState(false);
@@ -245,13 +234,6 @@ export const GettingStarted = () => {
activeFilter={filter as GuideFilterValues}
guidesState={guidesState}
filteredCards={filteredCards}
- openModal={openModal}
- i18nStart={i18nStart}
- theme={theme}
- docLinks={docLinks}
- cloud={cloud!}
- url={share.url}
- navigateToUrl={application.navigateToUrl}
/>
);
diff --git a/src/plugins/home/public/application/kibana_services.ts b/src/plugins/home/public/application/kibana_services.ts
index 558f193ad84f2..14a1dfa794ccb 100644
--- a/src/plugins/home/public/application/kibana_services.ts
+++ b/src/plugins/home/public/application/kibana_services.ts
@@ -21,9 +21,9 @@ import {
import { UiCounterMetricType } from '@kbn/analytics';
import { UrlForwardingStart } from '@kbn/url-forwarding-plugin/public';
import { DataViewsContract } from '@kbn/data-views-plugin/public';
-import type { SharePluginSetup } from '@kbn/share-plugin/public';
+import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public';
import { GuidedOnboardingApi } from '@kbn/guided-onboarding-plugin/public';
-import { CloudSetup } from '@kbn/cloud-plugin/public';
+import { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public';
import { TutorialService } from '../services/tutorials';
import { AddDataService } from '../services/add_data';
import { FeatureCatalogueRegistry } from '../services/feature_catalogue';
@@ -35,6 +35,7 @@ export interface HomeKibanaServices {
dataViewsService: DataViewsContract;
kibanaVersion: string;
share: SharePluginSetup;
+ shareStart: SharePluginStart;
chrome: ChromeStart;
application: ApplicationStart;
uiSettings: IUiSettingsClient;
@@ -55,7 +56,8 @@ export interface HomeKibanaServices {
welcomeService: WelcomeService;
guidedOnboardingService?: GuidedOnboardingApi;
cloud: CloudSetup;
- openModal: OverlayStart['openModal'];
+ cloudStart: CloudStart;
+ overlays: OverlayStart;
theme: ThemeServiceStart;
i18nStart: I18nStart;
}
diff --git a/src/plugins/home/public/plugin.ts b/src/plugins/home/public/plugin.ts
index 84c383eb8a749..b002918c6a001 100644
--- a/src/plugins/home/public/plugin.ts
+++ b/src/plugins/home/public/plugin.ts
@@ -81,8 +81,16 @@ export class HomePublicPlugin
const trackUiMetric = usageCollection
? usageCollection.reportUiCounter.bind(usageCollection, 'Kibana_home')
: () => {};
- const [coreStart, { dataViews, urlForwarding: urlForwardingStart, guidedOnboarding }] =
- await core.getStartServices();
+ const [
+ coreStart,
+ {
+ dataViews,
+ urlForwarding: urlForwardingStart,
+ guidedOnboarding,
+ share: shareStart,
+ cloud: cloudStart,
+ },
+ ] = await core.getStartServices();
setServices({
share,
@@ -108,9 +116,11 @@ export class HomePublicPlugin
welcomeService: this.welcomeService,
guidedOnboardingService: guidedOnboarding?.guidedOnboardingApi,
cloud,
- openModal: coreStart.overlays.openModal,
+ cloudStart,
+ overlays: coreStart.overlays,
theme: core.theme,
i18nStart: coreStart.i18n,
+ shareStart,
});
coreStart.chrome.docTitle.change(
i18n.translate('home.pageTitle', { defaultMessage: 'Home' })
diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx
index 14edb22d97665..14bcf41ea418b 100644
--- a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx
+++ b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx
@@ -4,32 +4,20 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import React from 'react';
+
import { i18n } from '@kbn/i18n';
import { ChromeHelpMenuLink } from '@kbn/core-chrome-browser';
import type { DocLinksStart } from '@kbn/core-doc-links-browser';
-import type { CoreStart } from '@kbn/core/public';
-import type { CloudStart } from '@kbn/cloud-plugin/public';
-import type { SharePluginStart } from '@kbn/share-plugin/public';
-import { toMountPoint } from '@kbn/react-kibana-mount';
-import { ConnectionDetailsModal } from './connection_details_modal';
+import { openWiredConnectionDetails } from '@kbn/cloud/connection_details';
export const createHelpMenuLinks = ({
docLinks,
helpSupportUrl,
- core,
- cloud,
- share,
}: {
docLinks: DocLinksStart;
- core: CoreStart;
- cloud: CloudStart;
- share: SharePluginStart;
helpSupportUrl: string;
}) => {
- const { overlays } = core;
-
const helpMenuLinks: ChromeHelpMenuLink[] = [
{
title: i18n.translate('xpack.cloudLinks.helpMenuLinks.documentation', {
@@ -55,18 +43,7 @@ export const createHelpMenuLinks = ({
}),
dataTestSubj: 'connectionDetailsHelpLink',
onClick: () => {
- const modal = overlays.openModal(
- toMountPoint(
- modal.close()}
- />,
- { theme: core.theme, i18n: core.i18n }
- )
- );
+ openWiredConnectionDetails();
},
},
];
diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts
index 2772c87d124d3..8bd2bd0ff1cf7 100644
--- a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts
+++ b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts
@@ -22,7 +22,7 @@ export interface MaybeAddCloudLinksDeps {
share: SharePluginStart;
}
-export function maybeAddCloudLinks({ core, security, cloud, share }: MaybeAddCloudLinksDeps): void {
+export function maybeAddCloudLinks({ core, security, cloud }: MaybeAddCloudLinksDeps): void {
const userObservable = defer(() => security.authc.getCurrentUser()).pipe(
// Check if user is a cloud user.
map((user) => user.elastic_cloud_user),
@@ -56,9 +56,6 @@ export function maybeAddCloudLinks({ core, security, cloud, share }: MaybeAddClo
const helpMenuLinks = createHelpMenuLinks({
docLinks: core.docLinks,
helpSupportUrl,
- core,
- share,
- cloud,
});
core.chrome.setHelpMenuLinks(helpMenuLinks);
diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx
index bfebe531276d4..0e8b5eec26f65 100755
--- a/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx
+++ b/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx
@@ -12,6 +12,7 @@ import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public';
import type { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/public';
import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public';
import type { SharePluginStart } from '@kbn/share-plugin/public';
+import * as connectionDetails from '@kbn/cloud/connection_details';
import { maybeAddCloudLinks } from './maybe_add_cloud_links';
interface CloudLinksDepsSetup {
@@ -31,7 +32,9 @@ export class CloudLinksPlugin
{
public setup() {}
- public start(core: CoreStart, { cloud, security, guidedOnboarding, share }: CloudLinksDepsStart) {
+ public start(core: CoreStart, plugins: CloudLinksDepsStart) {
+ const { cloud, security, guidedOnboarding, share } = plugins;
+
if (cloud?.isCloudEnabled && !core.http.anonymousPaths.isAnonymous(window.location.pathname)) {
if (guidedOnboarding?.guidedOnboardingApi?.isEnabled) {
core.chrome.registerGlobalHelpExtensionMenuLink({
@@ -54,6 +57,13 @@ export class CloudLinksPlugin
});
}
}
+
+ connectionDetails.setGlobalDependencies({
+ start: {
+ core,
+ plugins,
+ },
+ });
}
public stop() {}
diff --git a/x-pack/test/functional_cloud/tests/cloud_links.ts b/x-pack/test/functional_cloud/tests/cloud_links.ts
index 6125b52135b9c..1534c10002f90 100644
--- a/x-pack/test/functional_cloud/tests/cloud_links.ts
+++ b/x-pack/test/functional_cloud/tests/cloud_links.ts
@@ -47,32 +47,78 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
).to.not.be(null);
});
- it('A button to open a modal to view the CloudID and ES endpoint is added', async () => {
+ it('Can open "Connection details" overlay with ES URL and Cloud ID', async () => {
await PageObjects.common.clickAndValidate('helpMenuButton', 'connectionDetailsHelpLink');
expect(await find.byCssSelector('[data-test-subj="connectionDetailsHelpLink"]')).to.not.be(
null
);
- // Open the modal
+ // Open connection details overlay.
await PageObjects.common.clickAndValidate(
'connectionDetailsHelpLink',
'deploymentDetailsModal'
);
- const esEndpointInput = await find.byCssSelector(
- '[data-test-subj="deploymentDetailsEsEndpoint"]'
- );
- const esEndpointValue = await esEndpointInput.getAttribute('value');
- expect(esEndpointValue).to.be('https://ES123abc.hello.com:443');
+ const esUrlRow = await find.byCssSelector('[data-test-subj="connectionDetailsEsUrl"]');
+ const esUrlText = await esUrlRow.findByTestSubject('copyText');
+ const esUrlTextValue = await esUrlText.getVisibleText();
+ expect(esUrlTextValue).to.be('https://ES123abc.hello.com:443');
- const cloudIdInput = await find.byCssSelector(
- '[data-test-subj="deploymentDetailsCloudID"]'
+ // Show Cloud ID text row.
+ await PageObjects.common.clickAndValidate(
+ 'connectionDetailsCloudIdSwitch',
+ 'connectionDetailsCloudId'
);
- const cloudIdInputValue = await cloudIdInput.getAttribute('value');
- expect(cloudIdInputValue).to.be(
+
+ const cloudIdRow = await find.byCssSelector('[data-test-subj="connectionDetailsCloudId"]');
+ const cloudIdText = await cloudIdRow.findByTestSubject('copyText');
+ const cloudIdTextValue = await cloudIdText.getVisibleText();
+ expect(cloudIdTextValue).to.be(
'ftr_fake_cloud_id:aGVsbG8uY29tOjQ0MyRFUzEyM2FiYyRrYm4xMjNhYmM='
);
});
+
+ it('Can create an API key', async () => {
+ // Open connection details overlay.
+ await PageObjects.common.clickAndValidate('helpMenuButton', 'connectionDetailsHelpLink');
+ await PageObjects.common.clickAndValidate(
+ 'connectionDetailsHelpLink',
+ 'deploymentDetailsModal'
+ );
+
+ // Navigate to the "API key" tab.
+ await PageObjects.common.clickAndValidate(
+ 'connectionDetailsTabBtn-apiKeys',
+ 'connectionDetailsApiKeyForm'
+ );
+
+ // Select the input form.
+ const form = await find.byCssSelector(
+ '[data-test-subj="connectionDetailsApiKeyConfigForm"]'
+ );
+
+ // Select the name in that form.
+ const nameInput = await form.findByCssSelector('[name="api-key-name"]');
+
+ // Enter a name for the API key.
+ const keyName = 'test-api-key-' + Date.now().toString(36);
+ await nameInput.type(keyName);
+
+ // Click the submit button.
+ const submitButton = await form.findByCssSelector('button[type="submit"]');
+ await submitButton.click();
+
+ // Wait for the success message to appear.
+ const successForm = await find.byCssSelector(
+ '[data-test-subj="connectionDetailsApiKeySuccessForm"]'
+ );
+
+ // Check that user is shown the API key value.
+ const apiKeyRow = await successForm.findByTestSubject('connectionDetailsApiKeyValueRow');
+ const apiKeyText = await apiKeyRow.findByTestSubject('copyText');
+ const apiKeyTextValue = await apiKeyText.getVisibleText();
+ expect(apiKeyTextValue.length).to.be.greaterThan(40);
+ });
});
it('"Manage this deployment" is appended to the nav list', async () => {
From 9e8a25c90244af4f882a62b9fca22a051b508d9d Mon Sep 17 00:00:00 2001
From: Tiago Costa
Date: Tue, 23 Apr 2024 15:38:23 +0100
Subject: [PATCH 075/183] skip flaky suite (#181369)
---
.../public/resolver/view/clickthrough.test.tsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx
index 2bc671c1b7d78..8c53ebaf53307 100644
--- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx
+++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx
@@ -214,7 +214,8 @@ describe('Resolver, when analyzing a tree that has no ancestors and 2 children',
});
});
-describe('Resolver, when using a generated tree with 20 generations, 4 children per child, and 10 ancestors', () => {
+// FLAKY: https://github.com/elastic/kibana/issues/181369
+describe.skip('Resolver, when using a generated tree with 20 generations, 4 children per child, and 10 ancestors', () => {
const findAndClickFirstLoadingNodeInPanel = async (graphSimulator: Simulator) => {
// If the camera has not moved it will return a node with ID 2kt059pl3i, this is the first node with the state
// loading that is outside of the initial loaded view
From 3c71d69bf92e152ce05cb46b9210b6f7969f9dd6 Mon Sep 17 00:00:00 2001
From: Victor Martinez
Date: Tue, 23 Apr 2024 16:55:36 +0200
Subject: [PATCH 076/183] ci: integrate observability deployments with the
oblt-test-env (#181041)
---
.../steps/serverless/build_and_deploy.sh | 35 ++++++++++++++++++-
.github/workflows/deploy-my-kibana.yml | 4 +--
.github/workflows/oblt-github-commands.yml | 1 -
3 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/.buildkite/scripts/steps/serverless/build_and_deploy.sh b/.buildkite/scripts/steps/serverless/build_and_deploy.sh
index c346bf11a3ada..77c0cd6a92584 100644
--- a/.buildkite/scripts/steps/serverless/build_and_deploy.sh
+++ b/.buildkite/scripts/steps/serverless/build_and_deploy.sh
@@ -137,8 +137,41 @@ EOF
buildkite-agent meta-data set pr_comment:early_comment_job_id "$BUILDKITE_JOB_ID"
}
+# This is the integration with the observability-test-environments
+create_github_issue_oblt_test_environments() {
+
+echo "--- Create GitHub issue for deploying in the oblt test env"
+
+GITHUB_ISSUE=$(mktemp --suffix ".md")
+cat < "$GITHUB_ISSUE"
+### Kibana image
+
+$KIBANA_IMAGE
+
+### Kibana pull request
+
+$BUILDKITE_PULL_REQUEST
+
+### Further details
+
+Caused by @$GITHUB_PR_TRIGGER_USER using the github label in https://github.com/elastic/kibana/pull/$BUILDKITE_PULL_REQUEST
+EOF
+
+ GH_TOKEN="$GITHUB_TOKEN" \
+ gh issue create \
+ --title "[Deploy Serverless Kibana] for user $GITHUB_PR_TRIGGER_USER with PR kibana@pr-$BUILDKITE_PULL_REQUEST" \
+ --body-file "${GITHUB_ISSUE}" \
+ --label 'deploy-custom-kibana-serverless' \
+ --repo 'elastic/observability-test-environments' \
+ --assignee "$GITHUB_PR_OWNER"
+}
+
is_pr_with_label "ci:project-deploy-elasticsearch" && deploy "elasticsearch"
-is_pr_with_label "ci:project-deploy-observability" && deploy "observability"
+if is_pr_with_label "ci:project-deploy-observability" ; then
+ create_github_issue_oblt_test_environments
+ echo "--- Deploy observability with Kibana CI"
+ deploy "observability"
+fi
is_pr_with_label "ci:project-deploy-security" && deploy "security"
exit 0;
diff --git a/.github/workflows/deploy-my-kibana.yml b/.github/workflows/deploy-my-kibana.yml
index d1f7d993bf7b4..4eac490b2c0a7 100644
--- a/.github/workflows/deploy-my-kibana.yml
+++ b/.github/workflows/deploy-my-kibana.yml
@@ -20,7 +20,7 @@ permissions:
jobs:
deploy-my-kibana:
- if: ${{ github.event.issue.pull_request && (github.event.comment.body == '/oblt-deploy' || github.event.comment.body == '/oblt-deploy-serverless') }}
+ if: ${{ github.event.issue.pull_request && github.event.comment.body == '/oblt-deploy' }}
runs-on: ubuntu-latest
steps:
- uses: elastic/apm-pipeline-library/.github/actions/deploy-my-kibana@current
@@ -28,4 +28,4 @@ jobs:
vaultUrl: ${{ secrets.OBLT_VAULT_ADDR }}
vaultRoleId: ${{ secrets.OBLT_VAULT_ROLE_ID }}
vaultSecretId: ${{ secrets.OBLT_VAULT_SECRET_ID }}
- serverless: ${{ github.event.comment.body == '/oblt-deploy-serverless' }}
+ serverless: false
diff --git a/.github/workflows/oblt-github-commands.yml b/.github/workflows/oblt-github-commands.yml
index f6d095766ccac..4388901e2fa0e 100644
--- a/.github/workflows/oblt-github-commands.yml
+++ b/.github/workflows/oblt-github-commands.yml
@@ -50,7 +50,6 @@ jobs:
Just comment with:
- \`/oblt-deploy\` : Deploy a Kibana instance using the Observability test environments.
- - \`/oblt-deploy-serverless\` : Deploy a serverless Kibana instance using the Observability test environments.
- \`run\` \`elasticsearch-ci/docs\` : Re-trigger the docs validation. (use unformatted text in the comment!)
From 550fa3fb8cd0ca151651e02996b786ddc1237164 Mon Sep 17 00:00:00 2001
From: Rickyanto Ang
Date: Tue, 23 Apr 2024 08:03:25 -0700
Subject: [PATCH 077/183] [Cloud Security][FTR]More FTRs (#178365)
## Summary
- Added more FTRs
- CIS AWS Organization - Manual (all 4 options)
- CIS AWS Single - Cloud Formation
- CIS AWS Single - Manual (All 4 options)
- CIS GCP Single - Cloud Shell
- CIS GCP Organization - Manual (both options)
- CIS Azure
- KSPM
- Refactored cis_integration FTRs in response to the number of new FTRs
added
- Updated some component to include data-test-subj field for FTRs usage
---------
Co-authored-by: Maxim Kholod
---
...enerated_csp_requirements_test_coverage.md | 231 +-
.../__auto_generated_csp_test_log.json | 2436 ++++++++++++++---
.../public/common/constants.ts | 2 +
.../aws_input_var_fields.tsx | 10 +-
.../get_aws_credentials_form_options.tsx | 16 +-
.../azure_credentials_form.tsx | 2 +
.../fleet_extensions/eks_credentials_form.tsx | 19 +-
.../fleet_extensions/policy_template_form.tsx | 4 +
.../public/components/test_subjects.ts | 1 +
.../config.ts | 2 +-
.../add_cis_integration_form_page.ts | 151 +-
.../cnvm/cis_integration_cnvm.ts | 65 +
.../cspm/cis_integration_aws.ts | 320 +++
.../cspm/cis_integration_azure.ts | 282 ++
.../cspm/cis_integration_gcp.ts} | 265 +-
.../kspm/cis_integration_eks.ts | 139 +
.../kspm/cis_integration_k8s.ts | 38 +
.../pages/index.ts | 7 +-
18 files changed, 3348 insertions(+), 642 deletions(-)
create mode 100644 x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts
create mode 100644 x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts
create mode 100644 x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts
rename x-pack/test/cloud_security_posture_functional/pages/{cis_integration.ts => cis_integrations/cspm/cis_integration_gcp.ts} (51%)
create mode 100644 x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts
create mode 100644 x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts
diff --git a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md b/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md
index f0851690203c7..16c826cbc9dd2 100644
--- a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md
+++ b/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md
@@ -7,7 +7,7 @@ You can also check out the dedicated app view, which enables easier search and f
## Directory: x-pack/plugins/cloud_security_posture
-**Total Tests:** 424 | **Skipped:** 5 (1.18%) | **Todo:** 0 (0.00%)
+**Total Tests:** 444 | **Skipped:** 5 (1.13%) | **Todo:** 0 (0.00%)
![](https://img.shields.io/badge/UT-brightgreen) ![](https://img.shields.io/badge/HAS-SKIP-yellow)
@@ -127,11 +127,15 @@ You can also check out the dedicated app view, which enables easier search and f
| [calls onAddColumn when a checkbox is checked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
| [calls onRemoveColumn when a checkbox is unchecked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
| [View selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | |
-| [should render "view all" option when filterSelected is not enabled](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
-| [should render "view selected" option when filterSelected is not enabled](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should show "view all" option by default](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should render "view selected" option when previous selection was "view selected"](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should show "view all" option after the "view all" is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should show only selected columns after the "view selected" option is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should show all columns available after the "view all" option is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
| [should open the view selector with button click](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
-| [should callback when "view all" option is clicked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
-| [should callback when "view selected" option is clicked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [Searching columns](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | |
+| [should find all columns match the search term](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
+| [should find all columns match the search term and are selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | |
| [firstNonNullValue](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | describe | | |
| [returns the value itself for non-null single value](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | |
| [returns undefined for a null single value](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | |
@@ -207,10 +211,12 @@ You can also check out the dedicated app view, which enables easier search and f
| [updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [Agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | |
| [should render setup technology selector for AWS and allow to select agent-based](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
+| [should render setup technology selector for GCP for organisation account type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
+| [should render setup technology selector for GCP for single-account](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
+| [should render setup technology selector for Azure for Organisation type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
+| [should render setup technology selector for Azure for Single Subscription type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [should not render setup technology selector for KSPM](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [should not render setup technology selector for CNVM](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
-| [should not render setup technology selector for CSPM GCP](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
-| [should not render setup technology selector for CSPM Azure](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [renders Service principal with Client Certificate fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [updates Service principal with Client Certificate fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
| [should not render Service principal with Client Username and Password option](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | |
@@ -219,7 +225,10 @@ You can also check out the dedicated app view, which enables easier search and f
| [useSetupTechnology](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | |
| [create page flow](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | |
| [initializes with AGENT_BASED technology](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
-| [sets to AGENTLESS when agentless is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
+| [sets to AGENTLESS when agentless is available and AWS cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
+| [sets to AGENTLESS when agentless is available and GCP cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
+| [sets to AGENTLESS when agentless is available and Azure cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
+| [sets to AGENT_BASED when agentless is available but input is not supported for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
| [sets to AGENT_BASED when agentPolicyId differs from agentlessPolicyId](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
| [calls handleSetupTechnologyChange when setupTechnology changes](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | |
| [edit page flow](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | |
@@ -246,6 +255,17 @@ You can also check out the dedicated app view, which enables easier search and f
| [should return "direct_access_key" for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
| [should return "assume_role" for agent-based, when cloudformation is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
| [should return "cloud_formation" for agent-based, when cloudformation is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [should return "service_principal_with_client_secret" for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [shold return "arm_template" for agent-based, when arm_template is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [should return "managed_identity" for agent-based, when arm_template is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [should return manual credentials-json credentials type for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [should return google_cloud_shell setup access for agent-based if cloud_shell_url is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [should return manual setup access for agent-based if cloud_shell_url is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [Should return var item when key exist](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [Should return undefined when key is invalid](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [Should return undefined when datastream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [Should return undefined when stream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
+| [Should return undefined when stream.var is invalid](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | |
| [](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | describe | | |
| [renders cis integration name](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | |
| [renders benchmark version](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | |
@@ -444,9 +464,9 @@ You can also check out the dedicated app view, which enables easier search and f
## Directory: x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture
-**Total Tests:** 37 | **Skipped:** 0 (0.00%) | **Todo:** 0 (0.00%)
+**Total Tests:** 37 | **Skipped:** 4 (10.81%) | **Todo:** 0 (0.00%)
-![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/SERVERLESS-pink) ![](https://img.shields.io/badge/API-INTEGRATION-purple)
+![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/SERVERLESS-pink) ![](https://img.shields.io/badge/API-INTEGRATION-purple) ![](https://img.shields.io/badge/HAS-SKIP-yellow)
Test Details
@@ -470,10 +490,10 @@ You can also check out the dedicated app view, which enables easier search and f
| [Should return 200 status code and paginate rules with a limit of PerPage](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/find_csp_benchmark_rule.ts) | it | | |
| [cloud_security_posture](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts) | describe | | |
| [GET /internal/cloud_security_posture/status](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | | |
-| [STATUS = INDEXED TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | | |
-| [Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | |
-| [Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | |
-| [Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | |
+| [STATUS = INDEXED TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
| [GET /internal/cloud_security_posture/status](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | describe | | |
| [STATUS = INDEXING TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | describe | | |
| [Return kspm status indexing when logs-cloud_security_posture.findings_latest-default doesn](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | it | | |
@@ -586,19 +606,19 @@ You can also check out the dedicated app view, which enables easier search and f
## Directory: x-pack/test/cloud_security_posture_api
-**Total Tests:** 35 | **Skipped:** 0 (0.00%) | **Todo:** 0 (0.00%)
+**Total Tests:** 35 | **Skipped:** 4 (11.43%) | **Todo:** 0 (0.00%)
-![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/API-INTEGRATION-purple)
+![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/API-INTEGRATION-purple) ![](https://img.shields.io/badge/HAS-SKIP-yellow)
Test Details
| Test Label | Type | Skipped | Todo |
|------------|------|---------|------|
-| [GET /internal/cloud_security_posture/benchmarks](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | describe | | |
-| [Get Benchmark API](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | describe | | |
-| [Verify cspm benchmark score is updated when muting rules](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | it | | |
-| [Verify kspm benchmark score is updated when muting rules](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | it | | |
+| [GET /internal/cloud_security_posture/benchmarks](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Get Benchmark API](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Verify cspm benchmark score is updated when muting rules](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Verify kspm benchmark score is updated when muting rules](x-pack/test/cloud_security_posture_api/routes/benchmarks.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
| [Verify update csp rules states API](x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts) | describe | | |
| [mute benchmark rules successfully](x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts) | it | | |
| [unmute rules successfully](x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts) | it | | |
@@ -634,7 +654,7 @@ You can also check out the dedicated app view, which enables easier search and f
## Directory: x-pack/test/cloud_security_posture_functional
-**Total Tests:** 137 | **Skipped:** 6 (4.38%) | **Todo:** 2 (1.46%)
+**Total Tests:** 190 | **Skipped:** 37 (19.47%) | **Todo:** 2 (1.05%)
![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/HAS-TODO-green) ![](https://img.shields.io/badge/HAS-SKIP-yellow)
@@ -643,42 +663,95 @@ You can also check out the dedicated app view, which enables easier search and f
| Test Label | Type | Skipped | Todo |
|------------|------|---------|------|
-| [Test adding Cloud Security Posture Integrations](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | describe | | |
-| [CNVM AWS](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | describe | | |
-| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [CIS_AWS](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | describe | | |
-| [Initial form state, AWS Org account, and CloudFormation should be selected by default](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [CIS_GCP Organization](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | describe | | |
-| [Switch between Manual and Google cloud shell](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [CIS_GCP Single](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | describe | | |
-| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID, it should use default value](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Add Agent FLyout - Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [On add agent modal, if user chose Google Cloud Shell as their setup access; a google cloud shell modal should show up and clicking on the launch button will redirect user to Google cloud shell page](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Users are able to add CIS_GCP Integration with Manual settings using Credentials File](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Users are able to switch credentials_type from/to Credential JSON fields ](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Users are able to add CIS_GCP Integration with Manual settings using Credentials JSON](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
-| [Users are able to switch credentials_type from/to Credential File fields ](x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations CNVM](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | describe | | |
+| [CNVM AWS](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | describe | | |
+| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | it | | |
+| [On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | it | | |
+| [Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations CSPM AWS](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Organization Cloud Formation](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [Initial form state, AWS Org account, and CloudFormation should be selected by default](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Organization Manual Assume Role](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Organization Manual Assume Role Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Organization Manual Direct Access](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Organization Manual Direct Access Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Organization Manual Temporary Keys](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Organization Manual Temporary Keys Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Organization Manual Shared Access](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Organization Manual Shared Access Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Single Cloud Formation](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Single Cloud Formation workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Single Manual Assume Role](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Single Manual Assume Role Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Single Manual Direct Access](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Single Manual Direct Access Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Single Manual Temporary Keys](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Single Manual Temporary Keys Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [CIS_AWS Single Manual Shared Access](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | describe | | |
+| [CIS_AWS Single Manual Shared Access Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations CSPM AZURE](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Organization ARM Template](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Organization ARM Template Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Organization Manual Managed Identity](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Organization Manual Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Organization Manual Service Principle with Client Secret](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Organization Manual Service Principle with Client Secret Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Organization Manual Service Principle with Client Certificate](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Organization Manual Service Principle with Client Certificate Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Single ARM Template](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Single ARM Template Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Single Manual Managed Identity](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Single Manual Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Single Manual Service Principle with Client Secret](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Single Manual Service Principle with Client Secret Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Azure Single Manual Service Principle with Client Certificate](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | describe | | |
+| [Azure Single Manual Service Principle with Client Certificate Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations CSPM GCP](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | describe | | |
+| [CIS_GCP Organization](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | describe | | |
+| [Switch between Manual and Google cloud shell](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [CIS_GCP Organization Credentials File](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | describe | | |
+| [CIS_GCP Organization Credentials File workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [CIS_GCP Organization Credentials JSON](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | describe | | |
+| [CIS_GCP Organization Credentials JSON workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [CIS_GCP Single](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | describe | | |
+| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID, it should use default value](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID, it should use that value](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Add Agent FLyout - Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [On add agent modal, if user chose Google Cloud Shell as their setup access; a google cloud shell modal should show up and clicking on the launch button will redirect user to Google cloud shell page](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Users are able to add CIS_GCP Integration with Manual settings using Credentials File](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Users are able to switch credentials_type from/to Credential JSON fields ](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Users are able to add CIS_GCP Integration with Manual settings using Credentials JSON](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Users are able to switch credentials_type from/to Credential File fields ](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations KSPM EKS](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | describe | | |
+| [KSPM EKS Assume Role](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | describe | | |
+| [KSPM EKS Assume Role workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | it | | |
+| [KSPM EKS Direct Access](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | describe | | |
+| [KSPM EKS Direct Access Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | it | | |
+| [KSPM EKS Temporary Keys](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | describe | | |
+| [KSPM EKS Temporary Keys Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | it | | |
+| [KSPM EKS Shared Credentials](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | describe | | |
+| [KSPM EKS Shared Credentials Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts) | it | | |
+| [Test adding Cloud Security Posture Integrations KSPM K8S](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts) | describe | | |
+| [KSPM K8S](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts) | describe | | |
+| [KSPM K8S Workflow](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts) | it | | |
| [Cloud Posture Dashboard Page](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | describe | | |
| [Kubernetes Dashboard](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | describe | | |
| [displays accurate summary compliance score](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | | |
| [TODO - Cloud Dashboard](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | describe | | ![](https://img.shields.io/badge/todo-green) |
| [todo - displays accurate summary compliance score](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | | ![](https://img.shields.io/badge/todo-green) |
| [Findings Page - Alerts](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | | |
-| [Create detection rule](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | | |
-| [Creates a detection rule from the Take Action button and navigates to rule page](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | | |
-| [Creates a detection rule from the Alerts section and navigates to rule page](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | | |
+| [Create detection rule](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Creates a detection rule from the Take Action button and navigates to rule page](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Creates a detection rule from the Alerts section and navigates to rule page](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
| [Rule details](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | | |
| [The rule page contains the expected matching data](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | | |
| [Navigation](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | | |
@@ -724,34 +797,34 @@ You can also check out the dedicated app view, which enables easier search and f
| [Findings Page - support muting rules](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | describe | | |
| [verify only enabled rules appears](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | it | | |
| [Cloud Security Posture](x-pack/test/cloud_security_posture_functional/pages/index.ts) | describe | | |
-| [Cloud Posture Rules Page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [Rules Page - Rules Counters](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [Shows posture score when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Clicking the posture score button leads to the dashboard](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Shows integrations count when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Clicking the integrations counter button leads to the integration page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Shows the failed findings counter when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Clicking the failed findings button leads to the findings page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Shows the disabled rules count](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Clicking the disabled rules button shows enables the disabled filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Shows empty state when there are no findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Rules Page - Bulk Action buttons](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [It should disable Enable option when there are all rules selected are already enabled ](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [It should disable both Enable and Disable options when there are no rules selected](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [It should disable Disable option when there are all rules selected are already Disabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Both option should not be disabled if selected rules contains both enabled and disabled rules](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Rules Page - Enable Rules and Disabled Rules Filter Toggle](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [Should only display Enabled rules when Enabled Rules filter is ON](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Should only display Disabled rules when Disabled Rules filter is ON](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Rules Page - CIS Section & Rule Number filters](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [Table should only show result that has the same section as in the Section filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Table should only show result that has the same section as in the Rule number filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Table should only show result that passes both Section and Rule number filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Rules Page - Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | | |
-| [Users are able to Enable/Disable Rule from Switch on Rule Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Alerts section of Rules Flyout shows Disabled text when Rules are disabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Users are able to Enable/Disable Rule from Take Action on Rule Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
-| [Alerts section of Rules Flyout shows Detection Rule Counter component when Rules are enabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | | |
+| [Cloud Posture Rules Page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Rules Page - Rules Counters](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Shows posture score when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Clicking the posture score button leads to the dashboard](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Shows integrations count when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Clicking the integrations counter button leads to the integration page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Shows the failed findings counter when there are findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Clicking the failed findings button leads to the findings page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Shows the disabled rules count](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Clicking the disabled rules button shows enables the disabled filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Shows empty state when there are no findings](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Rules Page - Bulk Action buttons](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [It should disable Enable option when there are all rules selected are already enabled ](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [It should disable both Enable and Disable options when there are no rules selected](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [It should disable Disable option when there are all rules selected are already Disabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Both option should not be disabled if selected rules contains both enabled and disabled rules](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Rules Page - Enable Rules and Disabled Rules Filter Toggle](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Should only display Enabled rules when Enabled Rules filter is ON](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Should only display Disabled rules when Disabled Rules filter is ON](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Rules Page - CIS Section & Rule Number filters](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Table should only show result that has the same section as in the Section filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Table should only show result that has the same section as in the Rule number filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Table should only show result that passes both Section and Rule number filter](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Rules Page - Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Users are able to Enable/Disable Rule from Switch on Rule Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Alerts section of Rules Flyout shows Disabled text when Rules are disabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Users are able to Enable/Disable Rule from Take Action on Rule Flyout](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
+| [Alerts section of Rules Flyout shows Detection Rule Counter component when Rules are enabled](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | |
| [Vulnerabilities Page - Grouping](x-pack/test/cloud_security_posture_functional/pages/vulnerabilities_grouping.ts) | describe | | |
| [Default Grouping](x-pack/test/cloud_security_posture_functional/pages/vulnerabilities_grouping.ts) | describe | | |
| [groups vulnerabilities by cloud account and sort by number of vulnerabilities desc](x-pack/test/cloud_security_posture_functional/pages/vulnerabilities_grouping.ts) | it | | |
diff --git a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json b/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json
index 7ed63d28af437..98a7c6629ee7e 100644
--- a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json
+++ b/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json
@@ -2488,11 +2488,15 @@
" it('calls onAddColumn when a checkbox is checked')",
" it('calls onRemoveColumn when a checkbox is unchecked')",
" describe('View selected')",
- " it('should render \"view all\" option when filterSelected is not enabled')",
- " it('should render \"view selected\" option when filterSelected is not enabled')",
+ " it('should show \"view all\" option by default')",
+ " it('should render \"view selected\" option when previous selection was \"view selected\"')",
+ " it('should show \"view all\" option after the \"view all\" is selected')",
+ " it('should show only selected columns after the \"view selected\" option is selected')",
+ " it('should show all columns available after the \"view all\" option is selected')",
" it('should open the view selector with button click')",
- " it('should callback when \"view all\" option is clicked')",
- " it('should callback when \"view selected\" option is clicked')"
+ " describe('Searching columns')",
+ " it('should find all columns match the search term')",
+ " it('should find all columns match the search term and are selected')"
],
"testSuits": [
{
@@ -2546,20 +2550,50 @@
"isTodo": false
},
{
- "id": "should-render-\"view-all\"-option-when-filterselected-is-not-enabled",
- "rawLine": " it('should render \"view all\" option when filterSelected is not enabled', () => {",
- "line": " it('should render \"view all\" option when filterSelected is not enabled')",
- "label": "should render \"view all\" option when filterSelected is not enabled",
+ "id": "should-show-\"view-all\"-option-by-default",
+ "rawLine": " it('should show \"view all\" option by default', () => {",
+ "line": " it('should show \"view all\" option by default')",
+ "label": "should show \"view all\" option by default",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-render-\"view-selected\"-option-when-filterselected-is-not-enabled",
- "rawLine": " it('should render \"view selected\" option when filterSelected is not enabled', () => {",
- "line": " it('should render \"view selected\" option when filterSelected is not enabled')",
- "label": "should render \"view selected\" option when filterSelected is not enabled",
+ "id": "should-render-\"view-selected\"-option-when-previous-selection-was-\"view-selected\"",
+ "rawLine": " it('should render \"view selected\" option when previous selection was \"view selected\"', () => {",
+ "line": " it('should render \"view selected\" option when previous selection was \"view selected\"')",
+ "label": "should render \"view selected\" option when previous selection was \"view selected\"",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-show-\"view-all\"-option-after-the-\"view-all\"-is-selected",
+ "rawLine": " it('should show \"view all\" option after the \"view all\" is selected', async () => {",
+ "line": " it('should show \"view all\" option after the \"view all\" is selected')",
+ "label": "should show \"view all\" option after the \"view all\" is selected",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-show-only-selected-columns-after-the-\"view-selected\"-option-is-selected",
+ "rawLine": " it('should show only selected columns after the \"view selected\" option is selected', async () => {",
+ "line": " it('should show only selected columns after the \"view selected\" option is selected')",
+ "label": "should show only selected columns after the \"view selected\" option is selected",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-show-all-columns-available-after-the-\"view-all\"-option-is-selected",
+ "rawLine": " it('should show all columns available after the \"view all\" option is selected', async () => {",
+ "line": " it('should show all columns available after the \"view all\" option is selected')",
+ "label": "should show all columns available after the \"view all\" option is selected",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -2576,20 +2610,30 @@
"isTodo": false
},
{
- "id": "should-callback-when-\"view-all\"-option-is-clicked",
- "rawLine": " it('should callback when \"view all\" option is clicked', async () => {",
- "line": " it('should callback when \"view all\" option is clicked')",
- "label": "should callback when \"view all\" option is clicked",
+ "id": "searching-columns",
+ "rawLine": " describe('Searching columns', () => {",
+ "line": " describe('Searching columns')",
+ "label": "Searching columns",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-find-all-columns-match-the-search-term",
+ "rawLine": " it('should find all columns match the search term', async () => {",
+ "line": " it('should find all columns match the search term')",
+ "label": "should find all columns match the search term",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-callback-when-\"view-selected\"-option-is-clicked",
- "rawLine": " it('should callback when \"view selected\" option is clicked', async () => {",
- "line": " it('should callback when \"view selected\" option is clicked')",
- "label": "should callback when \"view selected\" option is clicked",
+ "id": "should-find-all-columns-match-the-search-term-and-are-selected",
+ "rawLine": " it('should find all columns match the search term and are selected', async () => {",
+ "line": " it('should find all columns match the search term and are selected')",
+ "label": "should find all columns match the search term and are selected",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -2648,20 +2692,50 @@
"isTodo": false,
"children": [
{
- "id": "should-render-\"view-all\"-option-when-filterselected-is-not-enabled",
- "rawLine": " it('should render \"view all\" option when filterSelected is not enabled', () => {",
- "line": " it('should render \"view all\" option when filterSelected is not enabled')",
- "label": "should render \"view all\" option when filterSelected is not enabled",
+ "id": "should-show-\"view-all\"-option-by-default",
+ "rawLine": " it('should show \"view all\" option by default', () => {",
+ "line": " it('should show \"view all\" option by default')",
+ "label": "should show \"view all\" option by default",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-render-\"view-selected\"-option-when-previous-selection-was-\"view-selected\"",
+ "rawLine": " it('should render \"view selected\" option when previous selection was \"view selected\"', () => {",
+ "line": " it('should render \"view selected\" option when previous selection was \"view selected\"')",
+ "label": "should render \"view selected\" option when previous selection was \"view selected\"",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-show-\"view-all\"-option-after-the-\"view-all\"-is-selected",
+ "rawLine": " it('should show \"view all\" option after the \"view all\" is selected', async () => {",
+ "line": " it('should show \"view all\" option after the \"view all\" is selected')",
+ "label": "should show \"view all\" option after the \"view all\" is selected",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-show-only-selected-columns-after-the-\"view-selected\"-option-is-selected",
+ "rawLine": " it('should show only selected columns after the \"view selected\" option is selected', async () => {",
+ "line": " it('should show only selected columns after the \"view selected\" option is selected')",
+ "label": "should show only selected columns after the \"view selected\" option is selected",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-render-\"view-selected\"-option-when-filterselected-is-not-enabled",
- "rawLine": " it('should render \"view selected\" option when filterSelected is not enabled', () => {",
- "line": " it('should render \"view selected\" option when filterSelected is not enabled')",
- "label": "should render \"view selected\" option when filterSelected is not enabled",
+ "id": "should-show-all-columns-available-after-the-\"view-all\"-option-is-selected",
+ "rawLine": " it('should show all columns available after the \"view all\" option is selected', async () => {",
+ "line": " it('should show all columns available after the \"view all\" option is selected')",
+ "label": "should show all columns available after the \"view all\" option is selected",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -2676,22 +2750,34 @@
"type": "it",
"isSkipped": false,
"isTodo": false
- },
+ }
+ ]
+ },
+ {
+ "id": "searching-columns",
+ "rawLine": " describe('Searching columns', () => {",
+ "line": " describe('Searching columns')",
+ "label": "Searching columns",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
{
- "id": "should-callback-when-\"view-all\"-option-is-clicked",
- "rawLine": " it('should callback when \"view all\" option is clicked', async () => {",
- "line": " it('should callback when \"view all\" option is clicked')",
- "label": "should callback when \"view all\" option is clicked",
+ "id": "should-find-all-columns-match-the-search-term",
+ "rawLine": " it('should find all columns match the search term', async () => {",
+ "line": " it('should find all columns match the search term')",
+ "label": "should find all columns match the search term",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-callback-when-\"view-selected\"-option-is-clicked",
- "rawLine": " it('should callback when \"view selected\" option is clicked', async () => {",
- "line": " it('should callback when \"view selected\" option is clicked')",
- "label": "should callback when \"view selected\" option is clicked",
+ "id": "should-find-all-columns-match-the-search-term-and-are-selected",
+ "rawLine": " it('should find all columns match the search term and are selected', async () => {",
+ "line": " it('should find all columns match the search term and are selected')",
+ "label": "should find all columns match the search term and are selected",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -3059,10 +3145,12 @@
" it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`)",
" describe('Agentless')",
" it('should render setup technology selector for AWS and allow to select agent-based')",
+ " it('should render setup technology selector for GCP for organisation account type')",
+ " it('should render setup technology selector for GCP for single-account')",
+ " it('should render setup technology selector for Azure for Organisation type')",
+ " it('should render setup technology selector for Azure for Single Subscription type')",
" it('should not render setup technology selector for KSPM')",
" it('should not render setup technology selector for CNVM')",
- " it('should not render setup technology selector for CSPM GCP')",
- " it('should not render setup technology selector for CSPM Azure')",
" it(`renders Service principal with Client Certificate fields`)",
" it(`updates Service principal with Client Certificate fields`)",
" it(`should not render Service principal with Client Username and Password option`)",
@@ -3252,7 +3340,7 @@
},
{
"id": "renders-${cloudbeat_eks}-direct-access-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`)",
"label": "renders ${CLOUDBEAT_EKS} Direct Access Keys fields",
"indent": 4,
@@ -3262,7 +3350,7 @@
},
{
"id": "updates-${cloudbeat_eks}-direct-access-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`)",
"label": "updates ${CLOUDBEAT_EKS} Direct Access Keys fields",
"indent": 4,
@@ -3272,7 +3360,7 @@
},
{
"id": "renders-${cloudbeat_eks}-temporary-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`)",
"label": "renders ${CLOUDBEAT_EKS} Temporary Keys fields",
"indent": 4,
@@ -3282,7 +3370,7 @@
},
{
"id": "updates-${cloudbeat_eks}-temporary-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`)",
"label": "updates ${CLOUDBEAT_EKS} Temporary Keys fields",
"indent": 4,
@@ -3402,7 +3490,7 @@
},
{
"id": "renders-${cloudbeat_aws}-direct-access-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`)",
"label": "renders ${CLOUDBEAT_AWS} Direct Access Keys fields",
"indent": 4,
@@ -3412,7 +3500,7 @@
},
{
"id": "updates-${cloudbeat_aws}-direct-access-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`)",
"label": "updates ${CLOUDBEAT_AWS} Direct Access Keys fields",
"indent": 4,
@@ -3422,7 +3510,7 @@
},
{
"id": "renders-${cloudbeat_aws}-temporary-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`)",
"label": "renders ${CLOUDBEAT_AWS} Temporary Keys fields",
"indent": 4,
@@ -3432,7 +3520,7 @@
},
{
"id": "updates-${cloudbeat_aws}-temporary-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`)",
"label": "updates ${CLOUDBEAT_AWS} Temporary Keys fields",
"indent": 4,
@@ -3662,7 +3750,7 @@
},
{
"id": "renders-${cloudbeat_azure}-service-principal-with-client-secret-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`)",
"label": "renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields",
"indent": 4,
@@ -3672,7 +3760,7 @@
},
{
"id": "updates-${cloudbeat_azure}-service-principal-with-client-secret-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`)",
"label": "updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields",
"indent": 4,
@@ -3701,40 +3789,60 @@
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-kspm",
- "rawLine": " it('should not render setup technology selector for KSPM', () => {",
- "line": " it('should not render setup technology selector for KSPM')",
- "label": "should not render setup technology selector for KSPM",
+ "id": "should-render-setup-technology-selector-for-gcp-for-organisation-account-type",
+ "rawLine": " it('should render setup technology selector for GCP for organisation account type', async () => {",
+ "line": " it('should render setup technology selector for GCP for organisation account type')",
+ "label": "should render setup technology selector for GCP for organisation account type",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cnvm",
- "rawLine": " it('should not render setup technology selector for CNVM', () => {",
- "line": " it('should not render setup technology selector for CNVM')",
- "label": "should not render setup technology selector for CNVM",
+ "id": "should-render-setup-technology-selector-for-gcp-for-single-account",
+ "rawLine": " it('should render setup technology selector for GCP for single-account', async () => {",
+ "line": " it('should render setup technology selector for GCP for single-account')",
+ "label": "should render setup technology selector for GCP for single-account",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-render-setup-technology-selector-for-azure-for-organisation-type",
+ "rawLine": " it('should render setup technology selector for Azure for Organisation type', async () => {",
+ "line": " it('should render setup technology selector for Azure for Organisation type')",
+ "label": "should render setup technology selector for Azure for Organisation type",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-render-setup-technology-selector-for-azure-for-single-subscription-type",
+ "rawLine": " it('should render setup technology selector for Azure for Single Subscription type', async () => {",
+ "line": " it('should render setup technology selector for Azure for Single Subscription type')",
+ "label": "should render setup technology selector for Azure for Single Subscription type",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cspm-gcp",
- "rawLine": " it('should not render setup technology selector for CSPM GCP', () => {",
- "line": " it('should not render setup technology selector for CSPM GCP')",
- "label": "should not render setup technology selector for CSPM GCP",
+ "id": "should-not-render-setup-technology-selector-for-kspm",
+ "rawLine": " it('should not render setup technology selector for KSPM', () => {",
+ "line": " it('should not render setup technology selector for KSPM')",
+ "label": "should not render setup technology selector for KSPM",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cspm-azure",
- "rawLine": " it('should not render setup technology selector for CSPM Azure', () => {",
- "line": " it('should not render setup technology selector for CSPM Azure')",
- "label": "should not render setup technology selector for CSPM Azure",
+ "id": "should-not-render-setup-technology-selector-for-cnvm",
+ "rawLine": " it('should not render setup technology selector for CNVM', () => {",
+ "line": " it('should not render setup technology selector for CNVM')",
+ "label": "should not render setup technology selector for CNVM",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -3742,7 +3850,7 @@
},
{
"id": "renders-service-principal-with-client-certificate-fields",
- "rawLine": " it(`renders Service principal with Client Certificate fields`, () => {",
+ "rawLine": " it(`renders Service principal with Client Certificate fields`, async () => {",
"line": " it(`renders Service principal with Client Certificate fields`)",
"label": "renders Service principal with Client Certificate fields",
"indent": 2,
@@ -3752,7 +3860,7 @@
},
{
"id": "updates-service-principal-with-client-certificate-fields",
- "rawLine": " it(`updates Service principal with Client Certificate fields`, () => {",
+ "rawLine": " it(`updates Service principal with Client Certificate fields`, async () => {",
"line": " it(`updates Service principal with Client Certificate fields`)",
"label": "updates Service principal with Client Certificate fields",
"indent": 2,
@@ -3976,7 +4084,7 @@
},
{
"id": "renders-${cloudbeat_eks}-direct-access-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_EKS} Direct Access Keys fields`)",
"label": "renders ${CLOUDBEAT_EKS} Direct Access Keys fields",
"indent": 4,
@@ -3986,7 +4094,7 @@
},
{
"id": "updates-${cloudbeat_eks}-direct-access-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_EKS} Direct Access Keys fields`)",
"label": "updates ${CLOUDBEAT_EKS} Direct Access Keys fields",
"indent": 4,
@@ -3996,7 +4104,7 @@
},
{
"id": "renders-${cloudbeat_eks}-temporary-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_EKS} Temporary Keys fields`)",
"label": "renders ${CLOUDBEAT_EKS} Temporary Keys fields",
"indent": 4,
@@ -4006,7 +4114,7 @@
},
{
"id": "updates-${cloudbeat_eks}-temporary-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_EKS} Temporary Keys fields`)",
"label": "updates ${CLOUDBEAT_EKS} Temporary Keys fields",
"indent": 4,
@@ -4128,7 +4236,7 @@
},
{
"id": "renders-${cloudbeat_aws}-direct-access-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AWS} Direct Access Keys fields`)",
"label": "renders ${CLOUDBEAT_AWS} Direct Access Keys fields",
"indent": 4,
@@ -4138,7 +4246,7 @@
},
{
"id": "updates-${cloudbeat_aws}-direct-access-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AWS} Direct Access Keys fields`)",
"label": "updates ${CLOUDBEAT_AWS} Direct Access Keys fields",
"indent": 4,
@@ -4148,7 +4256,7 @@
},
{
"id": "renders-${cloudbeat_aws}-temporary-keys-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AWS} Temporary Keys fields`)",
"label": "renders ${CLOUDBEAT_AWS} Temporary Keys fields",
"indent": 4,
@@ -4158,7 +4266,7 @@
},
{
"id": "updates-${cloudbeat_aws}-temporary-keys-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AWS} Temporary Keys fields`)",
"label": "updates ${CLOUDBEAT_AWS} Temporary Keys fields",
"indent": 4,
@@ -4394,7 +4502,7 @@
},
{
"id": "renders-${cloudbeat_azure}-service-principal-with-client-secret-fields",
- "rawLine": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, () => {",
+ "rawLine": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, async () => {",
"line": " it(`renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`)",
"label": "renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields",
"indent": 4,
@@ -4404,7 +4512,7 @@
},
{
"id": "updates-${cloudbeat_azure}-service-principal-with-client-secret-fields",
- "rawLine": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, () => {",
+ "rawLine": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`, async () => {",
"line": " it(`updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields`)",
"label": "updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields",
"indent": 4,
@@ -4435,40 +4543,60 @@
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-kspm",
- "rawLine": " it('should not render setup technology selector for KSPM', () => {",
- "line": " it('should not render setup technology selector for KSPM')",
- "label": "should not render setup technology selector for KSPM",
+ "id": "should-render-setup-technology-selector-for-gcp-for-organisation-account-type",
+ "rawLine": " it('should render setup technology selector for GCP for organisation account type', async () => {",
+ "line": " it('should render setup technology selector for GCP for organisation account type')",
+ "label": "should render setup technology selector for GCP for organisation account type",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cnvm",
- "rawLine": " it('should not render setup technology selector for CNVM', () => {",
- "line": " it('should not render setup technology selector for CNVM')",
- "label": "should not render setup technology selector for CNVM",
+ "id": "should-render-setup-technology-selector-for-gcp-for-single-account",
+ "rawLine": " it('should render setup technology selector for GCP for single-account', async () => {",
+ "line": " it('should render setup technology selector for GCP for single-account')",
+ "label": "should render setup technology selector for GCP for single-account",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-render-setup-technology-selector-for-azure-for-organisation-type",
+ "rawLine": " it('should render setup technology selector for Azure for Organisation type', async () => {",
+ "line": " it('should render setup technology selector for Azure for Organisation type')",
+ "label": "should render setup technology selector for Azure for Organisation type",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-render-setup-technology-selector-for-azure-for-single-subscription-type",
+ "rawLine": " it('should render setup technology selector for Azure for Single Subscription type', async () => {",
+ "line": " it('should render setup technology selector for Azure for Single Subscription type')",
+ "label": "should render setup technology selector for Azure for Single Subscription type",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cspm-gcp",
- "rawLine": " it('should not render setup technology selector for CSPM GCP', () => {",
- "line": " it('should not render setup technology selector for CSPM GCP')",
- "label": "should not render setup technology selector for CSPM GCP",
+ "id": "should-not-render-setup-technology-selector-for-kspm",
+ "rawLine": " it('should not render setup technology selector for KSPM', () => {",
+ "line": " it('should not render setup technology selector for KSPM')",
+ "label": "should not render setup technology selector for KSPM",
"indent": 4,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "should-not-render-setup-technology-selector-for-cspm-azure",
- "rawLine": " it('should not render setup technology selector for CSPM Azure', () => {",
- "line": " it('should not render setup technology selector for CSPM Azure')",
- "label": "should not render setup technology selector for CSPM Azure",
+ "id": "should-not-render-setup-technology-selector-for-cnvm",
+ "rawLine": " it('should not render setup technology selector for CNVM', () => {",
+ "line": " it('should not render setup technology selector for CNVM')",
+ "label": "should not render setup technology selector for CNVM",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -4478,7 +4606,7 @@
},
{
"id": "renders-service-principal-with-client-certificate-fields",
- "rawLine": " it(`renders Service principal with Client Certificate fields`, () => {",
+ "rawLine": " it(`renders Service principal with Client Certificate fields`, async () => {",
"line": " it(`renders Service principal with Client Certificate fields`)",
"label": "renders Service principal with Client Certificate fields",
"indent": 2,
@@ -4488,7 +4616,7 @@
},
{
"id": "updates-service-principal-with-client-certificate-fields",
- "rawLine": " it(`updates Service principal with Client Certificate fields`, () => {",
+ "rawLine": " it(`updates Service principal with Client Certificate fields`, async () => {",
"line": " it(`updates Service principal with Client Certificate fields`)",
"label": "updates Service principal with Client Certificate fields",
"indent": 2,
@@ -4541,7 +4669,10 @@
"describe('useSetupTechnology')",
" describe('create page flow')",
" it('initializes with AGENT_BASED technology')",
- " it('sets to AGENTLESS when agentless is available')",
+ " it('sets to AGENTLESS when agentless is available and AWS cloud')",
+ " it('sets to AGENTLESS when agentless is available and GCP cloud')",
+ " it('sets to AGENTLESS when agentless is available and Azure cloud')",
+ " it('sets to AGENT_BASED when agentless is available but input is not supported for agentless')",
" it('sets to AGENT_BASED when agentPolicyId differs from agentlessPolicyId')",
" it('calls handleSetupTechnologyChange when setupTechnology changes')",
" describe('edit page flow')",
@@ -4582,10 +4713,40 @@
"isTodo": false
},
{
- "id": "sets-to-agentless-when-agentless-is-available",
- "rawLine": " it('sets to AGENTLESS when agentless is available', () => {",
- "line": " it('sets to AGENTLESS when agentless is available')",
- "label": "sets to AGENTLESS when agentless is available",
+ "id": "sets-to-agentless-when-agentless-is-available-and-aws-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and AWS cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and AWS cloud')",
+ "label": "sets to AGENTLESS when agentless is available and AWS cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agentless-when-agentless-is-available-and-gcp-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and GCP cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and GCP cloud')",
+ "label": "sets to AGENTLESS when agentless is available and GCP cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agentless-when-agentless-is-available-and-azure-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and Azure cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and Azure cloud')",
+ "label": "sets to AGENTLESS when agentless is available and Azure cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agent_based-when-agentless-is-available-but-input-is-not-supported-for-agentless",
+ "rawLine": " it('sets to AGENT_BASED when agentless is available but input is not supported for agentless', () => {",
+ "line": " it('sets to AGENT_BASED when agentless is available but input is not supported for agentless')",
+ "label": "sets to AGENT_BASED when agentless is available but input is not supported for agentless",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -4694,10 +4855,40 @@
"isTodo": false
},
{
- "id": "sets-to-agentless-when-agentless-is-available",
- "rawLine": " it('sets to AGENTLESS when agentless is available', () => {",
- "line": " it('sets to AGENTLESS when agentless is available')",
- "label": "sets to AGENTLESS when agentless is available",
+ "id": "sets-to-agentless-when-agentless-is-available-and-aws-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and AWS cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and AWS cloud')",
+ "label": "sets to AGENTLESS when agentless is available and AWS cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agentless-when-agentless-is-available-and-gcp-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and GCP cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and GCP cloud')",
+ "label": "sets to AGENTLESS when agentless is available and GCP cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agentless-when-agentless-is-available-and-azure-cloud",
+ "rawLine": " it('sets to AGENTLESS when agentless is available and Azure cloud', () => {",
+ "line": " it('sets to AGENTLESS when agentless is available and Azure cloud')",
+ "label": "sets to AGENTLESS when agentless is available and Azure cloud",
+ "indent": 4,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "sets-to-agent_based-when-agentless-is-available-but-input-is-not-supported-for-agentless",
+ "rawLine": " it('sets to AGENT_BASED when agentless is available but input is not supported for agentless', () => {",
+ "line": " it('sets to AGENT_BASED when agentless is available but input is not supported for agentless')",
+ "label": "sets to AGENT_BASED when agentless is available but input is not supported for agentless",
"indent": 4,
"type": "it",
"isSkipped": false,
@@ -4811,7 +5002,21 @@
"describe('getDefaultAwsCredentialsType')",
" it('should return \"direct_access_key\" for agentless')",
" it('should return \"assume_role\" for agent-based, when cloudformation is not available')",
- " it('should return \"cloud_formation\" for agent-based, when cloudformation is available')"
+ " it('should return \"cloud_formation\" for agent-based, when cloudformation is available')",
+ "describe('getDefaultAzureCredentialsType')",
+ " it('should return \"service_principal_with_client_secret\" for agentless')",
+ " it('shold return \"arm_template\" for agent-based, when arm_template is available')",
+ " it('should return \"managed_identity\" for agent-based, when arm_template is not available')",
+ "describe('getDefaultGcpHiddenVars')",
+ " it('should return manual credentials-json credentials type for agentless')",
+ " it('should return google_cloud_shell setup access for agent-based if cloud_shell_url is available')",
+ " it('should return manual setup access for agent-based if cloud_shell_url is not available')",
+ "describe('findVariableDef')",
+ " it('Should return var item when key exist')",
+ " it('Should return undefined when key is invalid')",
+ " it('Should return undefined when datastream is undefined')",
+ " it('Should return undefined when stream is undefined')",
+ " it('Should return undefined when stream.var is invalid')"
],
"testSuits": [
{
@@ -5043,6 +5248,146 @@
"type": "it",
"isSkipped": false,
"isTodo": false
+ },
+ {
+ "id": "getdefaultazurecredentialstype",
+ "rawLine": "describe('getDefaultAzureCredentialsType', () => {",
+ "line": "describe('getDefaultAzureCredentialsType')",
+ "label": "getDefaultAzureCredentialsType",
+ "indent": 0,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-\"service_principal_with_client_secret\"-for-agentless",
+ "rawLine": " it('should return \"service_principal_with_client_secret\" for agentless', () => {",
+ "line": " it('should return \"service_principal_with_client_secret\" for agentless')",
+ "label": "should return \"service_principal_with_client_secret\" for agentless",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "shold-return-\"arm_template\"-for-agent-based,-when-arm_template-is-available",
+ "rawLine": " it('shold return \"arm_template\" for agent-based, when arm_template is available', () => {",
+ "line": " it('shold return \"arm_template\" for agent-based, when arm_template is available')",
+ "label": "shold return \"arm_template\" for agent-based, when arm_template is available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-\"managed_identity\"-for-agent-based,-when-arm_template-is-not-available",
+ "rawLine": " it('should return \"managed_identity\" for agent-based, when arm_template is not available', () => {",
+ "line": " it('should return \"managed_identity\" for agent-based, when arm_template is not available')",
+ "label": "should return \"managed_identity\" for agent-based, when arm_template is not available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "getdefaultgcphiddenvars",
+ "rawLine": "describe('getDefaultGcpHiddenVars', () => {",
+ "line": "describe('getDefaultGcpHiddenVars')",
+ "label": "getDefaultGcpHiddenVars",
+ "indent": 0,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-manual-credentials-json-credentials-type-for-agentless",
+ "rawLine": " it('should return manual credentials-json credentials type for agentless', () => {",
+ "line": " it('should return manual credentials-json credentials type for agentless')",
+ "label": "should return manual credentials-json credentials type for agentless",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-google_cloud_shell-setup-access-for-agent-based-if-cloud_shell_url-is-available",
+ "rawLine": " it('should return google_cloud_shell setup access for agent-based if cloud_shell_url is available', () => {",
+ "line": " it('should return google_cloud_shell setup access for agent-based if cloud_shell_url is available')",
+ "label": "should return google_cloud_shell setup access for agent-based if cloud_shell_url is available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-manual-setup-access-for-agent-based-if-cloud_shell_url-is-not-available",
+ "rawLine": " it('should return manual setup access for agent-based if cloud_shell_url is not available', () => {",
+ "line": " it('should return manual setup access for agent-based if cloud_shell_url is not available')",
+ "label": "should return manual setup access for agent-based if cloud_shell_url is not available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "findvariabledef",
+ "rawLine": "describe('findVariableDef', () => {",
+ "line": "describe('findVariableDef')",
+ "label": "findVariableDef",
+ "indent": 0,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-var-item-when-key-exist",
+ "rawLine": " it('Should return var item when key exist', () => {",
+ "line": " it('Should return var item when key exist')",
+ "label": "Should return var item when key exist",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-key-is-invalid",
+ "rawLine": " it('Should return undefined when key is invalid', () => {",
+ "line": " it('Should return undefined when key is invalid')",
+ "label": "Should return undefined when key is invalid",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-datastream-is-undefined",
+ "rawLine": " it('Should return undefined when datastream is undefined', () => {",
+ "line": " it('Should return undefined when datastream is undefined')",
+ "label": "Should return undefined when datastream is undefined",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-stream-is-undefined",
+ "rawLine": " it('Should return undefined when stream is undefined', () => {",
+ "line": " it('Should return undefined when stream is undefined')",
+ "label": "Should return undefined when stream is undefined",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-stream.var-is-invalid",
+ "rawLine": " it('Should return undefined when stream.var is invalid', () => {",
+ "line": " it('Should return undefined when stream.var is invalid')",
+ "label": "Should return undefined when stream.var is invalid",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
}
],
"tree": [
@@ -5237,32 +5582,142 @@
"type": "it",
"isSkipped": false,
"isTodo": false
- }
- ]
- },
- {
- "filePath": "x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx",
- "fileName": "benchmarks_table.test.tsx",
- "directory": "x-pack/plugins/cloud_security_posture",
- "tags": [
- "UT"
- ],
- "lines": [
- "describe('')",
- " it('renders cis integration name')",
- " it('renders benchmark version')",
- " it('renders applicable to')",
- " it('renders evaluated')",
- " it('renders compliance')"
- ],
- "testSuits": [
+ },
{
- "id": "",
- "rawLine": "describe('', () => {",
- "line": "describe('')",
- "label": "",
- "indent": 0,
- "type": "describe",
+ "id": "should-return-\"service_principal_with_client_secret\"-for-agentless",
+ "rawLine": " it('should return \"service_principal_with_client_secret\" for agentless', () => {",
+ "line": " it('should return \"service_principal_with_client_secret\" for agentless')",
+ "label": "should return \"service_principal_with_client_secret\" for agentless",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "shold-return-\"arm_template\"-for-agent-based,-when-arm_template-is-available",
+ "rawLine": " it('shold return \"arm_template\" for agent-based, when arm_template is available', () => {",
+ "line": " it('shold return \"arm_template\" for agent-based, when arm_template is available')",
+ "label": "shold return \"arm_template\" for agent-based, when arm_template is available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-\"managed_identity\"-for-agent-based,-when-arm_template-is-not-available",
+ "rawLine": " it('should return \"managed_identity\" for agent-based, when arm_template is not available', () => {",
+ "line": " it('should return \"managed_identity\" for agent-based, when arm_template is not available')",
+ "label": "should return \"managed_identity\" for agent-based, when arm_template is not available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-manual-credentials-json-credentials-type-for-agentless",
+ "rawLine": " it('should return manual credentials-json credentials type for agentless', () => {",
+ "line": " it('should return manual credentials-json credentials type for agentless')",
+ "label": "should return manual credentials-json credentials type for agentless",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-google_cloud_shell-setup-access-for-agent-based-if-cloud_shell_url-is-available",
+ "rawLine": " it('should return google_cloud_shell setup access for agent-based if cloud_shell_url is available', () => {",
+ "line": " it('should return google_cloud_shell setup access for agent-based if cloud_shell_url is available')",
+ "label": "should return google_cloud_shell setup access for agent-based if cloud_shell_url is available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-manual-setup-access-for-agent-based-if-cloud_shell_url-is-not-available",
+ "rawLine": " it('should return manual setup access for agent-based if cloud_shell_url is not available', () => {",
+ "line": " it('should return manual setup access for agent-based if cloud_shell_url is not available')",
+ "label": "should return manual setup access for agent-based if cloud_shell_url is not available",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-var-item-when-key-exist",
+ "rawLine": " it('Should return var item when key exist', () => {",
+ "line": " it('Should return var item when key exist')",
+ "label": "Should return var item when key exist",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-key-is-invalid",
+ "rawLine": " it('Should return undefined when key is invalid', () => {",
+ "line": " it('Should return undefined when key is invalid')",
+ "label": "Should return undefined when key is invalid",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-datastream-is-undefined",
+ "rawLine": " it('Should return undefined when datastream is undefined', () => {",
+ "line": " it('Should return undefined when datastream is undefined')",
+ "label": "Should return undefined when datastream is undefined",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-stream-is-undefined",
+ "rawLine": " it('Should return undefined when stream is undefined', () => {",
+ "line": " it('Should return undefined when stream is undefined')",
+ "label": "Should return undefined when stream is undefined",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "should-return-undefined-when-stream.var-is-invalid",
+ "rawLine": " it('Should return undefined when stream.var is invalid', () => {",
+ "line": " it('Should return undefined when stream.var is invalid')",
+ "label": "Should return undefined when stream.var is invalid",
+ "indent": 2,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "filePath": "x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx",
+ "fileName": "benchmarks_table.test.tsx",
+ "directory": "x-pack/plugins/cloud_security_posture",
+ "tags": [
+ "UT"
+ ],
+ "lines": [
+ "describe('')",
+ " it('renders cis integration name')",
+ " it('renders benchmark version')",
+ " it('renders applicable to')",
+ " it('renders evaluated')",
+ " it('renders compliance')"
+ ],
+ "testSuits": [
+ {
+ "id": "",
+ "rawLine": "describe('', () => {",
+ "line": "describe('')",
+ "label": "",
+ "indent": 0,
+ "type": "describe",
"isSkipped": false,
"isTodo": false
},
@@ -10228,11 +10683,12 @@
"tags": [
"FTR",
"SERVERLESS",
- "API INTEGRATION"
+ "API INTEGRATION",
+ "HAS SKIP"
],
"lines": [
" describe('GET /internal/cloud_security_posture/status')",
- " describe('STATUS = INDEXED TEST')",
+ " describe.skip('STATUS = INDEXED TEST')",
" it(`Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents`)",
" it(`Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents`)",
" it(`Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents`)"
@@ -10250,12 +10706,12 @@
},
{
"id": "status-=-indexed-test",
- "rawLine": " describe('STATUS = INDEXED TEST', () => {",
- "line": " describe('STATUS = INDEXED TEST')",
+ "rawLine": " describe.skip('STATUS = INDEXED TEST', () => {",
+ "line": " describe.skip('STATUS = INDEXED TEST')",
"label": "STATUS = INDEXED TEST",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -10302,12 +10758,12 @@
"children": [
{
"id": "status-=-indexed-test",
- "rawLine": " describe('STATUS = INDEXED TEST', () => {",
- "line": " describe('STATUS = INDEXED TEST')",
+ "rawLine": " describe.skip('STATUS = INDEXED TEST', () => {",
+ "line": " describe.skip('STATUS = INDEXED TEST')",
"label": "STATUS = INDEXED TEST",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -10317,7 +10773,7 @@
"label": "Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -10327,7 +10783,7 @@
"label": "Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -10337,7 +10793,7 @@
"label": "Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -12382,10 +12838,11 @@
"directory": "x-pack/test/cloud_security_posture_api",
"tags": [
"FTR",
- "API INTEGRATION"
+ "API INTEGRATION",
+ "HAS SKIP"
],
"lines": [
- " describe('GET /internal/cloud_security_posture/benchmarks')",
+ " describe.skip('GET /internal/cloud_security_posture/benchmarks')",
" describe('Get Benchmark API')",
" it('Verify cspm benchmark score is updated when muting rules')",
" it('Verify kspm benchmark score is updated when muting rules')"
@@ -12393,12 +12850,12 @@
"testSuits": [
{
"id": "get-/internal/cloud_security_posture/benchmarks",
- "rawLine": " describe('GET /internal/cloud_security_posture/benchmarks', () => {",
- "line": " describe('GET /internal/cloud_security_posture/benchmarks')",
+ "rawLine": " describe.skip('GET /internal/cloud_security_posture/benchmarks', () => {",
+ "line": " describe.skip('GET /internal/cloud_security_posture/benchmarks')",
"label": "GET /internal/cloud_security_posture/benchmarks",
"indent": 2,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -12435,12 +12892,12 @@
"tree": [
{
"id": "get-/internal/cloud_security_posture/benchmarks",
- "rawLine": " describe('GET /internal/cloud_security_posture/benchmarks', () => {",
- "line": " describe('GET /internal/cloud_security_posture/benchmarks')",
+ "rawLine": " describe.skip('GET /internal/cloud_security_posture/benchmarks', () => {",
+ "line": " describe.skip('GET /internal/cloud_security_posture/benchmarks')",
"label": "GET /internal/cloud_security_posture/benchmarks",
"indent": 2,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -12450,7 +12907,7 @@
"label": "Get Benchmark API",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -12460,7 +12917,7 @@
"label": "Verify cspm benchmark score is updated when muting rules",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -12470,7 +12927,7 @@
"label": "Verify kspm benchmark score is updated when muting rules",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -13222,47 +13679,25 @@
]
},
{
- "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts",
- "fileName": "cis_integration.ts",
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts",
+ "fileName": "cis_integration_cnvm.ts",
"directory": "x-pack/test/cloud_security_posture_functional",
"tags": [
"FTR"
],
"lines": [
- " describe('Test adding Cloud Security Posture Integrations')",
+ " describe('Test adding Cloud Security Posture Integrations CNVM')",
" describe('CNVM AWS')",
" it('Hyperlink on PostInstallation Modal should have the correct URL')",
" it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
- " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
- " describe('CIS_AWS')",
- " it('Initial form state, AWS Org account, and CloudFormation should be selected by default')",
- " it('Hyperlink on PostInstallation Modal should have the correct URL')",
- " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
- " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
- " describe('CIS_GCP Organization')",
- " it('Switch between Manual and Google cloud shell')",
- " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value')",
- " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
- " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
- " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
- " it('Hyperlink on PostInstallation Modal should have the correct URL')",
- " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page')",
- " describe('CIS_GCP Single')",
- " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID, it should use default value')",
- " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID, it should use that value')",
- " it('Add Agent FLyout - Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
- " it('On add agent modal, if user chose Google Cloud Shell as their setup access; a google cloud shell modal should show up and clicking on the launch button will redirect user to Google cloud shell page')",
- " it('Users are able to add CIS_GCP Integration with Manual settings using Credentials File')",
- " it('Users are able to switch credentials_type from/to Credential JSON fields ')",
- " it('Users are able to add CIS_GCP Integration with Manual settings using Credentials JSON')",
- " it('Users are able to switch credentials_type from/to Credential File fields ')"
+ " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')"
],
"testSuits": [
{
- "id": "test-adding-cloud-security-posture-integrations",
- "rawLine": " describe('Test adding Cloud Security Posture Integrations', function () {",
- "line": " describe('Test adding Cloud Security Posture Integrations')",
- "label": "Test adding Cloud Security Posture Integrations",
+ "id": "test-adding-cloud-security-posture-integrations-cnvm",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CNVM', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CNVM')",
+ "label": "Test adding Cloud Security Posture Integrations CNVM",
"indent": 2,
"type": "describe",
"isSkipped": false,
@@ -13307,12 +13742,114 @@
"type": "it",
"isSkipped": false,
"isTodo": false
+ }
+ ],
+ "tree": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cnvm",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CNVM', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CNVM')",
+ "label": "Test adding Cloud Security Posture Integrations CNVM",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cnvm-aws",
+ "rawLine": " describe('CNVM AWS', () => {",
+ "line": " describe('CNVM AWS')",
+ "label": "CNVM AWS",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
+ "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
+ "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
+ "label": "Hyperlink on PostInstallation Modal should have the correct URL",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "on-add-agent-modal-there-should-be-modal-that-has-cloud-formation-details-as-well-as-button-that-redirects-user-to-cloud-formation-page-on-aws-upon-clicking-them-",
+ "rawLine": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {",
+ "line": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
+ "label": "On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "clicking-on-launch-cloudformation-on-post-intall-modal-should-lead-user-to-cloud-formation-page",
+ "rawLine": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {",
+ "line": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
+ "label": "Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts",
+ "fileName": "cis_integration_aws.ts",
+ "directory": "x-pack/test/cloud_security_posture_functional",
+ "tags": [
+ "FTR"
+ ],
+ "lines": [
+ " describe('Test adding Cloud Security Posture Integrations CSPM AWS')",
+ " describe('CIS_AWS Organization Cloud Formation')",
+ " it('Initial form state, AWS Org account, and CloudFormation should be selected by default')",
+ " it('Hyperlink on PostInstallation Modal should have the correct URL')",
+ " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
+ " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
+ " describe('CIS_AWS Organization Manual Assume Role')",
+ " it('CIS_AWS Organization Manual Assume Role Workflow')",
+ " describe('CIS_AWS Organization Manual Direct Access')",
+ " it('CIS_AWS Organization Manual Direct Access Workflow')",
+ " describe('CIS_AWS Organization Manual Temporary Keys')",
+ " it('CIS_AWS Organization Manual Temporary Keys Workflow')",
+ " describe('CIS_AWS Organization Manual Shared Access')",
+ " it('CIS_AWS Organization Manual Shared Access Workflow')",
+ " describe('CIS_AWS Single Cloud Formation')",
+ " it('CIS_AWS Single Cloud Formation workflow')",
+ " describe('CIS_AWS Single Manual Assume Role')",
+ " it('CIS_AWS Single Manual Assume Role Workflow')",
+ " describe('CIS_AWS Single Manual Direct Access')",
+ " it('CIS_AWS Single Manual Direct Access Workflow')",
+ " describe('CIS_AWS Single Manual Temporary Keys')",
+ " it('CIS_AWS Single Manual Temporary Keys Workflow')",
+ " describe('CIS_AWS Single Manual Shared Access')",
+ " it('CIS_AWS Single Manual Shared Access Workflow')"
+ ],
+ "testSuits": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cspm-aws",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM AWS', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM AWS')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM AWS",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
},
{
- "id": "cis_aws",
- "rawLine": " describe('CIS_AWS', () => {",
- "line": " describe('CIS_AWS')",
- "label": "CIS_AWS",
+ "id": "cis_aws-organization-cloud-formation",
+ "rawLine": " describe('CIS_AWS Organization Cloud Formation', () => {",
+ "line": " describe('CIS_AWS Organization Cloud Formation')",
+ "label": "CIS_AWS Organization Cloud Formation",
"indent": 4,
"type": "describe",
"isSkipped": false,
@@ -13359,87 +13896,1004 @@
"isTodo": false
},
{
- "id": "cis_gcp-organization",
- "rawLine": " describe('CIS_GCP Organization', () => {",
- "line": " describe('CIS_GCP Organization')",
- "label": "CIS_GCP Organization",
+ "id": "cis_aws-organization-manual-assume-role",
+ "rawLine": " describe('CIS_AWS Organization Manual Assume Role', () => {",
+ "line": " describe('CIS_AWS Organization Manual Assume Role')",
+ "label": "CIS_AWS Organization Manual Assume Role",
"indent": 4,
"type": "describe",
"isSkipped": false,
"isTodo": false
},
{
- "id": "switch-between-manual-and-google-cloud-shell",
- "rawLine": " it('Switch between Manual and Google cloud shell', async () => {",
- "line": " it('Switch between Manual and Google cloud shell')",
- "label": "Switch between Manual and Google cloud shell",
+ "id": "cis_aws-organization-manual-assume-role-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Assume Role Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Assume Role Workflow')",
+ "label": "CIS_AWS Organization Manual Assume Role Workflow",
"indent": 6,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-no-project-id-or-organization-id-provided,-it-should-use-default-value",
- "rawLine": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value', async () => {",
- "line": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value')",
- "label": "Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value",
- "indent": 6,
- "type": "it",
+ "id": "cis_aws-organization-manual-direct-access",
+ "rawLine": " describe('CIS_AWS Organization Manual Direct Access', () => {",
+ "line": " describe('CIS_AWS Organization Manual Direct Access')",
+ "label": "CIS_AWS Organization Manual Direct Access",
+ "indent": 4,
+ "type": "describe",
"isSkipped": false,
"isTodo": false
},
{
- "id": "post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-project-id-or-organization-id-provided,-it-should-use-that-value",
- "rawLine": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {",
- "line": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
- "label": "Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value",
+ "id": "cis_aws-organization-manual-direct-access-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Direct Access Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Direct Access Workflow')",
+ "label": "CIS_AWS Organization Manual Direct Access Workflow",
"indent": 6,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "add-agent-flyout---post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-project-id-or-organization-id-provided,-it-should-use-that-value",
- "rawLine": " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {",
- "line": " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
- "label": "Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value",
- "indent": 6,
- "type": "it",
+ "id": "cis_aws-organization-manual-temporary-keys",
+ "rawLine": " describe('CIS_AWS Organization Manual Temporary Keys', () => {",
+ "line": " describe('CIS_AWS Organization Manual Temporary Keys')",
+ "label": "CIS_AWS Organization Manual Temporary Keys",
+ "indent": 4,
+ "type": "describe",
"isSkipped": false,
"isTodo": false
},
{
- "id": "organization-id-field-on-cloud-shell-command-should-only-be-shown-if-user-chose-google-cloud-shell,-if-user-chose-single-account-it-shouldn-not-show-up",
- "rawLine": " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up', async () => {",
- "line": " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
- "label": "Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up",
+ "id": "cis_aws-organization-manual-temporary-keys-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Temporary Keys Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Temporary Keys Workflow')",
+ "label": "CIS_AWS Organization Manual Temporary Keys Workflow",
"indent": 6,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
- "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
- "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
- "label": "Hyperlink on PostInstallation Modal should have the correct URL",
- "indent": 6,
- "type": "it",
+ "id": "cis_aws-organization-manual-shared-access",
+ "rawLine": " describe('CIS_AWS Organization Manual Shared Access', () => {",
+ "line": " describe('CIS_AWS Organization Manual Shared Access')",
+ "label": "CIS_AWS Organization Manual Shared Access",
+ "indent": 4,
+ "type": "describe",
"isSkipped": false,
"isTodo": false
},
{
- "id": "clicking-on-launch-cloudshell-on-post-intall-modal-should-lead-user-to-cloudshell-page",
- "rawLine": " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page', async () => {",
- "line": " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page')",
- "label": "Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page",
+ "id": "cis_aws-organization-manual-shared-access-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Shared Access Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Shared Access Workflow')",
+ "label": "CIS_AWS Organization Manual Shared Access Workflow",
"indent": 6,
"type": "it",
"isSkipped": false,
"isTodo": false
},
{
- "id": "cis_gcp-single",
+ "id": "cis_aws-single-cloud-formation",
+ "rawLine": " describe('CIS_AWS Single Cloud Formation', () => {",
+ "line": " describe('CIS_AWS Single Cloud Formation')",
+ "label": "CIS_AWS Single Cloud Formation",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-cloud-formation-workflow",
+ "rawLine": " it('CIS_AWS Single Cloud Formation workflow', async () => {",
+ "line": " it('CIS_AWS Single Cloud Formation workflow')",
+ "label": "CIS_AWS Single Cloud Formation workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-assume-role",
+ "rawLine": " describe('CIS_AWS Single Manual Assume Role', () => {",
+ "line": " describe('CIS_AWS Single Manual Assume Role')",
+ "label": "CIS_AWS Single Manual Assume Role",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-assume-role-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Assume Role Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Assume Role Workflow')",
+ "label": "CIS_AWS Single Manual Assume Role Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-direct-access",
+ "rawLine": " describe('CIS_AWS Single Manual Direct Access', () => {",
+ "line": " describe('CIS_AWS Single Manual Direct Access')",
+ "label": "CIS_AWS Single Manual Direct Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-direct-access-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Direct Access Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Direct Access Workflow')",
+ "label": "CIS_AWS Single Manual Direct Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-temporary-keys",
+ "rawLine": " describe('CIS_AWS Single Manual Temporary Keys', () => {",
+ "line": " describe('CIS_AWS Single Manual Temporary Keys')",
+ "label": "CIS_AWS Single Manual Temporary Keys",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-temporary-keys-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Temporary Keys Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Temporary Keys Workflow')",
+ "label": "CIS_AWS Single Manual Temporary Keys Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-shared-access",
+ "rawLine": " describe('CIS_AWS Single Manual Shared Access', () => {",
+ "line": " describe('CIS_AWS Single Manual Shared Access')",
+ "label": "CIS_AWS Single Manual Shared Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_aws-single-manual-shared-access-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Shared Access Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Shared Access Workflow')",
+ "label": "CIS_AWS Single Manual Shared Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ],
+ "tree": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cspm-aws",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM AWS', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM AWS')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM AWS",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-organization-cloud-formation",
+ "rawLine": " describe('CIS_AWS Organization Cloud Formation', () => {",
+ "line": " describe('CIS_AWS Organization Cloud Formation')",
+ "label": "CIS_AWS Organization Cloud Formation",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "initial-form-state,-aws-org-account,-and-cloudformation-should-be-selected-by-default",
+ "rawLine": " it('Initial form state, AWS Org account, and CloudFormation should be selected by default', async () => {",
+ "line": " it('Initial form state, AWS Org account, and CloudFormation should be selected by default')",
+ "label": "Initial form state, AWS Org account, and CloudFormation should be selected by default",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
+ "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
+ "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
+ "label": "Hyperlink on PostInstallation Modal should have the correct URL",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "on-add-agent-modal-there-should-be-modal-that-has-cloud-formation-details-as-well-as-button-that-redirects-user-to-cloud-formation-page-on-aws-upon-clicking-them-",
+ "rawLine": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {",
+ "line": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
+ "label": "On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "clicking-on-launch-cloudformation-on-post-intall-modal-should-lead-user-to-cloud-formation-page",
+ "rawLine": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {",
+ "line": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
+ "label": "Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-organization-manual-assume-role",
+ "rawLine": " describe('CIS_AWS Organization Manual Assume Role', () => {",
+ "line": " describe('CIS_AWS Organization Manual Assume Role')",
+ "label": "CIS_AWS Organization Manual Assume Role",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-organization-manual-assume-role-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Assume Role Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Assume Role Workflow')",
+ "label": "CIS_AWS Organization Manual Assume Role Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-organization-manual-direct-access",
+ "rawLine": " describe('CIS_AWS Organization Manual Direct Access', () => {",
+ "line": " describe('CIS_AWS Organization Manual Direct Access')",
+ "label": "CIS_AWS Organization Manual Direct Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-organization-manual-direct-access-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Direct Access Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Direct Access Workflow')",
+ "label": "CIS_AWS Organization Manual Direct Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-organization-manual-temporary-keys",
+ "rawLine": " describe('CIS_AWS Organization Manual Temporary Keys', () => {",
+ "line": " describe('CIS_AWS Organization Manual Temporary Keys')",
+ "label": "CIS_AWS Organization Manual Temporary Keys",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-organization-manual-temporary-keys-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Temporary Keys Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Temporary Keys Workflow')",
+ "label": "CIS_AWS Organization Manual Temporary Keys Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-organization-manual-shared-access",
+ "rawLine": " describe('CIS_AWS Organization Manual Shared Access', () => {",
+ "line": " describe('CIS_AWS Organization Manual Shared Access')",
+ "label": "CIS_AWS Organization Manual Shared Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-organization-manual-shared-access-workflow",
+ "rawLine": " it('CIS_AWS Organization Manual Shared Access Workflow', async () => {",
+ "line": " it('CIS_AWS Organization Manual Shared Access Workflow')",
+ "label": "CIS_AWS Organization Manual Shared Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-single-cloud-formation",
+ "rawLine": " describe('CIS_AWS Single Cloud Formation', () => {",
+ "line": " describe('CIS_AWS Single Cloud Formation')",
+ "label": "CIS_AWS Single Cloud Formation",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-single-cloud-formation-workflow",
+ "rawLine": " it('CIS_AWS Single Cloud Formation workflow', async () => {",
+ "line": " it('CIS_AWS Single Cloud Formation workflow')",
+ "label": "CIS_AWS Single Cloud Formation workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-single-manual-assume-role",
+ "rawLine": " describe('CIS_AWS Single Manual Assume Role', () => {",
+ "line": " describe('CIS_AWS Single Manual Assume Role')",
+ "label": "CIS_AWS Single Manual Assume Role",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-single-manual-assume-role-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Assume Role Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Assume Role Workflow')",
+ "label": "CIS_AWS Single Manual Assume Role Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-single-manual-direct-access",
+ "rawLine": " describe('CIS_AWS Single Manual Direct Access', () => {",
+ "line": " describe('CIS_AWS Single Manual Direct Access')",
+ "label": "CIS_AWS Single Manual Direct Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-single-manual-direct-access-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Direct Access Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Direct Access Workflow')",
+ "label": "CIS_AWS Single Manual Direct Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-single-manual-temporary-keys",
+ "rawLine": " describe('CIS_AWS Single Manual Temporary Keys', () => {",
+ "line": " describe('CIS_AWS Single Manual Temporary Keys')",
+ "label": "CIS_AWS Single Manual Temporary Keys",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-single-manual-temporary-keys-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Temporary Keys Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Temporary Keys Workflow')",
+ "label": "CIS_AWS Single Manual Temporary Keys Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_aws-single-manual-shared-access",
+ "rawLine": " describe('CIS_AWS Single Manual Shared Access', () => {",
+ "line": " describe('CIS_AWS Single Manual Shared Access')",
+ "label": "CIS_AWS Single Manual Shared Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_aws-single-manual-shared-access-workflow",
+ "rawLine": " it('CIS_AWS Single Manual Shared Access Workflow', async () => {",
+ "line": " it('CIS_AWS Single Manual Shared Access Workflow')",
+ "label": "CIS_AWS Single Manual Shared Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts",
+ "fileName": "cis_integration_azure.ts",
+ "directory": "x-pack/test/cloud_security_posture_functional",
+ "tags": [
+ "FTR"
+ ],
+ "lines": [
+ " describe('Test adding Cloud Security Posture Integrations CSPM AZURE')",
+ " describe('Azure Organization ARM Template')",
+ " it('Azure Organization ARM Template Workflow')",
+ " describe('Azure Organization Manual Managed Identity')",
+ " it('Azure Organization Manual Workflow')",
+ " describe('Azure Organization Manual Service Principle with Client Secret')",
+ " it('Azure Organization Manual Service Principle with Client Secret Workflow')",
+ " describe('Azure Organization Manual Service Principle with Client Certificate')",
+ " it('Azure Organization Manual Service Principle with Client Certificate Workflow')",
+ " describe('Azure Single ARM Template')",
+ " it('Azure Single ARM Template Workflow')",
+ " describe('Azure Single Manual Managed Identity')",
+ " it('Azure Single Manual Workflow')",
+ " describe('Azure Single Manual Service Principle with Client Secret')",
+ " it('Azure Single Manual Service Principle with Client Secret Workflow')",
+ " describe('Azure Single Manual Service Principle with Client Certificate')",
+ " it('Azure Single Manual Service Principle with Client Certificate Workflow')"
+ ],
+ "testSuits": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cspm-azure",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM AZURE', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM AZURE')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM AZURE",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-arm-template",
+ "rawLine": " describe('Azure Organization ARM Template', () => {",
+ "line": " describe('Azure Organization ARM Template')",
+ "label": "Azure Organization ARM Template",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-arm-template-workflow",
+ "rawLine": " it('Azure Organization ARM Template Workflow', async () => {",
+ "line": " it('Azure Organization ARM Template Workflow')",
+ "label": "Azure Organization ARM Template Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-managed-identity",
+ "rawLine": " describe('Azure Organization Manual Managed Identity', () => {",
+ "line": " describe('Azure Organization Manual Managed Identity')",
+ "label": "Azure Organization Manual Managed Identity",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-workflow",
+ "rawLine": " it('Azure Organization Manual Workflow', async () => {",
+ "line": " it('Azure Organization Manual Workflow')",
+ "label": "Azure Organization Manual Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-secret",
+ "rawLine": " describe('Azure Organization Manual Service Principle with Client Secret', () => {",
+ "line": " describe('Azure Organization Manual Service Principle with Client Secret')",
+ "label": "Azure Organization Manual Service Principle with Client Secret",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-secret-workflow",
+ "rawLine": " it('Azure Organization Manual Service Principle with Client Secret Workflow', async () => {",
+ "line": " it('Azure Organization Manual Service Principle with Client Secret Workflow')",
+ "label": "Azure Organization Manual Service Principle with Client Secret Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-certificate",
+ "rawLine": " describe('Azure Organization Manual Service Principle with Client Certificate', () => {",
+ "line": " describe('Azure Organization Manual Service Principle with Client Certificate')",
+ "label": "Azure Organization Manual Service Principle with Client Certificate",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-certificate-workflow",
+ "rawLine": " it('Azure Organization Manual Service Principle with Client Certificate Workflow', async () => {",
+ "line": " it('Azure Organization Manual Service Principle with Client Certificate Workflow')",
+ "label": "Azure Organization Manual Service Principle with Client Certificate Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-arm-template",
+ "rawLine": " describe('Azure Single ARM Template', () => {",
+ "line": " describe('Azure Single ARM Template')",
+ "label": "Azure Single ARM Template",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-arm-template-workflow",
+ "rawLine": " it('Azure Single ARM Template Workflow', async () => {",
+ "line": " it('Azure Single ARM Template Workflow')",
+ "label": "Azure Single ARM Template Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-managed-identity",
+ "rawLine": " describe('Azure Single Manual Managed Identity', () => {",
+ "line": " describe('Azure Single Manual Managed Identity')",
+ "label": "Azure Single Manual Managed Identity",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-workflow",
+ "rawLine": " it('Azure Single Manual Workflow', async () => {",
+ "line": " it('Azure Single Manual Workflow')",
+ "label": "Azure Single Manual Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-secret",
+ "rawLine": " describe('Azure Single Manual Service Principle with Client Secret', () => {",
+ "line": " describe('Azure Single Manual Service Principle with Client Secret')",
+ "label": "Azure Single Manual Service Principle with Client Secret",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-secret-workflow",
+ "rawLine": " it('Azure Single Manual Service Principle with Client Secret Workflow', async () => {",
+ "line": " it('Azure Single Manual Service Principle with Client Secret Workflow')",
+ "label": "Azure Single Manual Service Principle with Client Secret Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-certificate",
+ "rawLine": " describe('Azure Single Manual Service Principle with Client Certificate', () => {",
+ "line": " describe('Azure Single Manual Service Principle with Client Certificate')",
+ "label": "Azure Single Manual Service Principle with Client Certificate",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-certificate-workflow",
+ "rawLine": " it('Azure Single Manual Service Principle with Client Certificate Workflow', async () => {",
+ "line": " it('Azure Single Manual Service Principle with Client Certificate Workflow')",
+ "label": "Azure Single Manual Service Principle with Client Certificate Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ],
+ "tree": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cspm-azure",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM AZURE', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM AZURE')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM AZURE",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-organization-arm-template",
+ "rawLine": " describe('Azure Organization ARM Template', () => {",
+ "line": " describe('Azure Organization ARM Template')",
+ "label": "Azure Organization ARM Template",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-organization-arm-template-workflow",
+ "rawLine": " it('Azure Organization ARM Template Workflow', async () => {",
+ "line": " it('Azure Organization ARM Template Workflow')",
+ "label": "Azure Organization ARM Template Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-organization-manual-managed-identity",
+ "rawLine": " describe('Azure Organization Manual Managed Identity', () => {",
+ "line": " describe('Azure Organization Manual Managed Identity')",
+ "label": "Azure Organization Manual Managed Identity",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-organization-manual-workflow",
+ "rawLine": " it('Azure Organization Manual Workflow', async () => {",
+ "line": " it('Azure Organization Manual Workflow')",
+ "label": "Azure Organization Manual Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-secret",
+ "rawLine": " describe('Azure Organization Manual Service Principle with Client Secret', () => {",
+ "line": " describe('Azure Organization Manual Service Principle with Client Secret')",
+ "label": "Azure Organization Manual Service Principle with Client Secret",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-organization-manual-service-principle-with-client-secret-workflow",
+ "rawLine": " it('Azure Organization Manual Service Principle with Client Secret Workflow', async () => {",
+ "line": " it('Azure Organization Manual Service Principle with Client Secret Workflow')",
+ "label": "Azure Organization Manual Service Principle with Client Secret Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-organization-manual-service-principle-with-client-certificate",
+ "rawLine": " describe('Azure Organization Manual Service Principle with Client Certificate', () => {",
+ "line": " describe('Azure Organization Manual Service Principle with Client Certificate')",
+ "label": "Azure Organization Manual Service Principle with Client Certificate",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-organization-manual-service-principle-with-client-certificate-workflow",
+ "rawLine": " it('Azure Organization Manual Service Principle with Client Certificate Workflow', async () => {",
+ "line": " it('Azure Organization Manual Service Principle with Client Certificate Workflow')",
+ "label": "Azure Organization Manual Service Principle with Client Certificate Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-single-arm-template",
+ "rawLine": " describe('Azure Single ARM Template', () => {",
+ "line": " describe('Azure Single ARM Template')",
+ "label": "Azure Single ARM Template",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-single-arm-template-workflow",
+ "rawLine": " it('Azure Single ARM Template Workflow', async () => {",
+ "line": " it('Azure Single ARM Template Workflow')",
+ "label": "Azure Single ARM Template Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-single-manual-managed-identity",
+ "rawLine": " describe('Azure Single Manual Managed Identity', () => {",
+ "line": " describe('Azure Single Manual Managed Identity')",
+ "label": "Azure Single Manual Managed Identity",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-single-manual-workflow",
+ "rawLine": " it('Azure Single Manual Workflow', async () => {",
+ "line": " it('Azure Single Manual Workflow')",
+ "label": "Azure Single Manual Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-secret",
+ "rawLine": " describe('Azure Single Manual Service Principle with Client Secret', () => {",
+ "line": " describe('Azure Single Manual Service Principle with Client Secret')",
+ "label": "Azure Single Manual Service Principle with Client Secret",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-single-manual-service-principle-with-client-secret-workflow",
+ "rawLine": " it('Azure Single Manual Service Principle with Client Secret Workflow', async () => {",
+ "line": " it('Azure Single Manual Service Principle with Client Secret Workflow')",
+ "label": "Azure Single Manual Service Principle with Client Secret Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "azure-single-manual-service-principle-with-client-certificate",
+ "rawLine": " describe('Azure Single Manual Service Principle with Client Certificate', () => {",
+ "line": " describe('Azure Single Manual Service Principle with Client Certificate')",
+ "label": "Azure Single Manual Service Principle with Client Certificate",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "azure-single-manual-service-principle-with-client-certificate-workflow",
+ "rawLine": " it('Azure Single Manual Service Principle with Client Certificate Workflow', async () => {",
+ "line": " it('Azure Single Manual Service Principle with Client Certificate Workflow')",
+ "label": "Azure Single Manual Service Principle with Client Certificate Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts",
+ "fileName": "cis_integration_gcp.ts",
+ "directory": "x-pack/test/cloud_security_posture_functional",
+ "tags": [
+ "FTR"
+ ],
+ "lines": [
+ " describe('Test adding Cloud Security Posture Integrations CSPM GCP')",
+ " describe('CIS_GCP Organization')",
+ " it('Switch between Manual and Google cloud shell')",
+ " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value')",
+ " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
+ " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
+ " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
+ " it('Hyperlink on PostInstallation Modal should have the correct URL')",
+ " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page')",
+ " describe('CIS_GCP Organization Credentials File')",
+ " it('CIS_GCP Organization Credentials File workflow')",
+ " describe('CIS_GCP Organization Credentials JSON')",
+ " it('CIS_GCP Organization Credentials JSON workflow')",
+ " describe('CIS_GCP Single')",
+ " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID, it should use default value')",
+ " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID, it should use that value')",
+ " it('Add Agent FLyout - Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
+ " it('On add agent modal, if user chose Google Cloud Shell as their setup access; a google cloud shell modal should show up and clicking on the launch button will redirect user to Google cloud shell page')",
+ " it('Users are able to add CIS_GCP Integration with Manual settings using Credentials File')",
+ " it('Users are able to switch credentials_type from/to Credential JSON fields ')",
+ " it('Users are able to add CIS_GCP Integration with Manual settings using Credentials JSON')",
+ " it('Users are able to switch credentials_type from/to Credential File fields ')"
+ ],
+ "testSuits": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-cspm-gcp",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM GCP', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM GCP')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM GCP",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-organization",
+ "rawLine": " describe('CIS_GCP Organization', () => {",
+ "line": " describe('CIS_GCP Organization')",
+ "label": "CIS_GCP Organization",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "switch-between-manual-and-google-cloud-shell",
+ "rawLine": " it('Switch between Manual and Google cloud shell', async () => {",
+ "line": " it('Switch between Manual and Google cloud shell')",
+ "label": "Switch between Manual and Google cloud shell",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-no-project-id-or-organization-id-provided,-it-should-use-default-value",
+ "rawLine": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value', async () => {",
+ "line": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value')",
+ "label": "Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-project-id-or-organization-id-provided,-it-should-use-that-value",
+ "rawLine": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {",
+ "line": " it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
+ "label": "Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "add-agent-flyout---post-installation-google-cloud-shell-modal-pops-up-after-user-clicks-on-save-button-when-adding-integration,-when-there-are-project-id-or-organization-id-provided,-it-should-use-that-value",
+ "rawLine": " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {",
+ "line": " it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value')",
+ "label": "Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "organization-id-field-on-cloud-shell-command-should-only-be-shown-if-user-chose-google-cloud-shell,-if-user-chose-single-account-it-shouldn-not-show-up",
+ "rawLine": " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up', async () => {",
+ "line": " it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up')",
+ "label": "Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
+ "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
+ "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
+ "label": "Hyperlink on PostInstallation Modal should have the correct URL",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "clicking-on-launch-cloudshell-on-post-intall-modal-should-lead-user-to-cloudshell-page",
+ "rawLine": " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page', async () => {",
+ "line": " it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page')",
+ "label": "Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-organization-credentials-file",
+ "rawLine": " describe('CIS_GCP Organization Credentials File', () => {",
+ "line": " describe('CIS_GCP Organization Credentials File')",
+ "label": "CIS_GCP Organization Credentials File",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-organization-credentials-file-workflow",
+ "rawLine": " it('CIS_GCP Organization Credentials File workflow', async () => {",
+ "line": " it('CIS_GCP Organization Credentials File workflow')",
+ "label": "CIS_GCP Organization Credentials File workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-organization-credentials-json",
+ "rawLine": " describe('CIS_GCP Organization Credentials JSON', () => {",
+ "line": " describe('CIS_GCP Organization Credentials JSON')",
+ "label": "CIS_GCP Organization Credentials JSON",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-organization-credentials-json-workflow",
+ "rawLine": " it('CIS_GCP Organization Credentials JSON workflow', async () => {",
+ "line": " it('CIS_GCP Organization Credentials JSON workflow')",
+ "label": "CIS_GCP Organization Credentials JSON workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "cis_gcp-single",
"rawLine": " describe('CIS_GCP Single', () => {",
"line": " describe('CIS_GCP Single')",
"label": "CIS_GCP Single",
@@ -13531,109 +14985,15 @@
],
"tree": [
{
- "id": "test-adding-cloud-security-posture-integrations",
- "rawLine": " describe('Test adding Cloud Security Posture Integrations', function () {",
- "line": " describe('Test adding Cloud Security Posture Integrations')",
- "label": "Test adding Cloud Security Posture Integrations",
+ "id": "test-adding-cloud-security-posture-integrations-cspm-gcp",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations CSPM GCP', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations CSPM GCP')",
+ "label": "Test adding Cloud Security Posture Integrations CSPM GCP",
"indent": 2,
"type": "describe",
"isSkipped": false,
"isTodo": false,
"children": [
- {
- "id": "cnvm-aws",
- "rawLine": " describe('CNVM AWS', () => {",
- "line": " describe('CNVM AWS')",
- "label": "CNVM AWS",
- "indent": 4,
- "type": "describe",
- "isSkipped": false,
- "isTodo": false,
- "children": [
- {
- "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
- "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
- "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
- "label": "Hyperlink on PostInstallation Modal should have the correct URL",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- },
- {
- "id": "on-add-agent-modal-there-should-be-modal-that-has-cloud-formation-details-as-well-as-button-that-redirects-user-to-cloud-formation-page-on-aws-upon-clicking-them-",
- "rawLine": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {",
- "line": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
- "label": "On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- },
- {
- "id": "clicking-on-launch-cloudformation-on-post-intall-modal-should-lead-user-to-cloud-formation-page",
- "rawLine": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {",
- "line": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
- "label": "Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- }
- ]
- },
- {
- "id": "cis_aws",
- "rawLine": " describe('CIS_AWS', () => {",
- "line": " describe('CIS_AWS')",
- "label": "CIS_AWS",
- "indent": 4,
- "type": "describe",
- "isSkipped": false,
- "isTodo": false,
- "children": [
- {
- "id": "initial-form-state,-aws-org-account,-and-cloudformation-should-be-selected-by-default",
- "rawLine": " it('Initial form state, AWS Org account, and CloudFormation should be selected by default', async () => {",
- "line": " it('Initial form state, AWS Org account, and CloudFormation should be selected by default')",
- "label": "Initial form state, AWS Org account, and CloudFormation should be selected by default",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- },
- {
- "id": "hyperlink-on-postinstallation-modal-should-have-the-correct-url",
- "rawLine": " it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {",
- "line": " it('Hyperlink on PostInstallation Modal should have the correct URL')",
- "label": "Hyperlink on PostInstallation Modal should have the correct URL",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- },
- {
- "id": "on-add-agent-modal-there-should-be-modal-that-has-cloud-formation-details-as-well-as-button-that-redirects-user-to-cloud-formation-page-on-aws-upon-clicking-them-",
- "rawLine": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {",
- "line": " it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ')",
- "label": "On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- },
- {
- "id": "clicking-on-launch-cloudformation-on-post-intall-modal-should-lead-user-to-cloud-formation-page",
- "rawLine": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {",
- "line": " it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page')",
- "label": "Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page",
- "indent": 6,
- "type": "it",
- "isSkipped": false,
- "isTodo": false
- }
- ]
- },
{
"id": "cis_gcp-organization",
"rawLine": " describe('CIS_GCP Organization', () => {",
@@ -13716,6 +15076,50 @@
}
]
},
+ {
+ "id": "cis_gcp-organization-credentials-file",
+ "rawLine": " describe('CIS_GCP Organization Credentials File', () => {",
+ "line": " describe('CIS_GCP Organization Credentials File')",
+ "label": "CIS_GCP Organization Credentials File",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_gcp-organization-credentials-file-workflow",
+ "rawLine": " it('CIS_GCP Organization Credentials File workflow', async () => {",
+ "line": " it('CIS_GCP Organization Credentials File workflow')",
+ "label": "CIS_GCP Organization Credentials File workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "cis_gcp-organization-credentials-json",
+ "rawLine": " describe('CIS_GCP Organization Credentials JSON', () => {",
+ "line": " describe('CIS_GCP Organization Credentials JSON')",
+ "label": "CIS_GCP Organization Credentials JSON",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "cis_gcp-organization-credentials-json-workflow",
+ "rawLine": " it('CIS_GCP Organization Credentials JSON workflow', async () => {",
+ "line": " it('CIS_GCP Organization Credentials JSON workflow')",
+ "label": "CIS_GCP Organization Credentials JSON workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
{
"id": "cis_gcp-single",
"rawLine": " describe('CIS_GCP Single', () => {",
@@ -13812,6 +15216,300 @@
}
]
},
+ {
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts",
+ "fileName": "cis_integration_eks.ts",
+ "directory": "x-pack/test/cloud_security_posture_functional",
+ "tags": [
+ "FTR"
+ ],
+ "lines": [
+ " describe('Test adding Cloud Security Posture Integrations KSPM EKS')",
+ " describe('KSPM EKS Assume Role')",
+ " it('KSPM EKS Assume Role workflow')",
+ " describe('KSPM EKS Direct Access')",
+ " it('KSPM EKS Direct Access Workflow')",
+ " describe('KSPM EKS Temporary Keys')",
+ " it('KSPM EKS Temporary Keys Workflow')",
+ " describe('KSPM EKS Shared Credentials')",
+ " it('KSPM EKS Shared Credentials Workflow')"
+ ],
+ "testSuits": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-kspm-eks",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations KSPM EKS', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations KSPM EKS')",
+ "label": "Test adding Cloud Security Posture Integrations KSPM EKS",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-assume-role",
+ "rawLine": " describe('KSPM EKS Assume Role', async () => {",
+ "line": " describe('KSPM EKS Assume Role')",
+ "label": "KSPM EKS Assume Role",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-assume-role-workflow",
+ "rawLine": " it('KSPM EKS Assume Role workflow', async () => {",
+ "line": " it('KSPM EKS Assume Role workflow')",
+ "label": "KSPM EKS Assume Role workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-direct-access",
+ "rawLine": " describe('KSPM EKS Direct Access', async () => {",
+ "line": " describe('KSPM EKS Direct Access')",
+ "label": "KSPM EKS Direct Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-direct-access-workflow",
+ "rawLine": " it('KSPM EKS Direct Access Workflow', async () => {",
+ "line": " it('KSPM EKS Direct Access Workflow')",
+ "label": "KSPM EKS Direct Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-temporary-keys",
+ "rawLine": " describe('KSPM EKS Temporary Keys', () => {",
+ "line": " describe('KSPM EKS Temporary Keys')",
+ "label": "KSPM EKS Temporary Keys",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-temporary-keys-workflow",
+ "rawLine": " it('KSPM EKS Temporary Keys Workflow', async () => {",
+ "line": " it('KSPM EKS Temporary Keys Workflow')",
+ "label": "KSPM EKS Temporary Keys Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-shared-credentials",
+ "rawLine": " describe('KSPM EKS Shared Credentials', () => {",
+ "line": " describe('KSPM EKS Shared Credentials')",
+ "label": "KSPM EKS Shared Credentials",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-eks-shared-credentials-workflow",
+ "rawLine": " it('KSPM EKS Shared Credentials Workflow', async () => {",
+ "line": " it('KSPM EKS Shared Credentials Workflow')",
+ "label": "KSPM EKS Shared Credentials Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ],
+ "tree": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-kspm-eks",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations KSPM EKS', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations KSPM EKS')",
+ "label": "Test adding Cloud Security Posture Integrations KSPM EKS",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-eks-assume-role",
+ "rawLine": " describe('KSPM EKS Assume Role', async () => {",
+ "line": " describe('KSPM EKS Assume Role')",
+ "label": "KSPM EKS Assume Role",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-eks-assume-role-workflow",
+ "rawLine": " it('KSPM EKS Assume Role workflow', async () => {",
+ "line": " it('KSPM EKS Assume Role workflow')",
+ "label": "KSPM EKS Assume Role workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "kspm-eks-direct-access",
+ "rawLine": " describe('KSPM EKS Direct Access', async () => {",
+ "line": " describe('KSPM EKS Direct Access')",
+ "label": "KSPM EKS Direct Access",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-eks-direct-access-workflow",
+ "rawLine": " it('KSPM EKS Direct Access Workflow', async () => {",
+ "line": " it('KSPM EKS Direct Access Workflow')",
+ "label": "KSPM EKS Direct Access Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "kspm-eks-temporary-keys",
+ "rawLine": " describe('KSPM EKS Temporary Keys', () => {",
+ "line": " describe('KSPM EKS Temporary Keys')",
+ "label": "KSPM EKS Temporary Keys",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-eks-temporary-keys-workflow",
+ "rawLine": " it('KSPM EKS Temporary Keys Workflow', async () => {",
+ "line": " it('KSPM EKS Temporary Keys Workflow')",
+ "label": "KSPM EKS Temporary Keys Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ },
+ {
+ "id": "kspm-eks-shared-credentials",
+ "rawLine": " describe('KSPM EKS Shared Credentials', () => {",
+ "line": " describe('KSPM EKS Shared Credentials')",
+ "label": "KSPM EKS Shared Credentials",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-eks-shared-credentials-workflow",
+ "rawLine": " it('KSPM EKS Shared Credentials Workflow', async () => {",
+ "line": " it('KSPM EKS Shared Credentials Workflow')",
+ "label": "KSPM EKS Shared Credentials Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts",
+ "fileName": "cis_integration_k8s.ts",
+ "directory": "x-pack/test/cloud_security_posture_functional",
+ "tags": [
+ "FTR"
+ ],
+ "lines": [
+ " describe('Test adding Cloud Security Posture Integrations KSPM K8S')",
+ " describe('KSPM K8S')",
+ " it('KSPM K8S Workflow')"
+ ],
+ "testSuits": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-kspm-k8s",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations KSPM K8S', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations KSPM K8S')",
+ "label": "Test adding Cloud Security Posture Integrations KSPM K8S",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-k8s",
+ "rawLine": " describe('KSPM K8S', () => {",
+ "line": " describe('KSPM K8S')",
+ "label": "KSPM K8S",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false
+ },
+ {
+ "id": "kspm-k8s-workflow",
+ "rawLine": " it('KSPM K8S Workflow', async () => {",
+ "line": " it('KSPM K8S Workflow')",
+ "label": "KSPM K8S Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ],
+ "tree": [
+ {
+ "id": "test-adding-cloud-security-posture-integrations-kspm-k8s",
+ "rawLine": " describe('Test adding Cloud Security Posture Integrations KSPM K8S', function () {",
+ "line": " describe('Test adding Cloud Security Posture Integrations KSPM K8S')",
+ "label": "Test adding Cloud Security Posture Integrations KSPM K8S",
+ "indent": 2,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-k8s",
+ "rawLine": " describe('KSPM K8S', () => {",
+ "line": " describe('KSPM K8S')",
+ "label": "KSPM K8S",
+ "indent": 4,
+ "type": "describe",
+ "isSkipped": false,
+ "isTodo": false,
+ "children": [
+ {
+ "id": "kspm-k8s-workflow",
+ "rawLine": " it('KSPM K8S Workflow', async () => {",
+ "line": " it('KSPM K8S Workflow')",
+ "label": "KSPM K8S Workflow",
+ "indent": 6,
+ "type": "it",
+ "isSkipped": false,
+ "isTodo": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
"filePath": "x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts",
"fileName": "compliance_dashboard.ts",
@@ -13943,11 +15641,12 @@
"fileName": "findings_alerts.ts",
"directory": "x-pack/test/cloud_security_posture_functional",
"tags": [
- "FTR"
+ "FTR",
+ "HAS SKIP"
],
"lines": [
" describe('Findings Page - Alerts')",
- " describe('Create detection rule')",
+ " describe.skip('Create detection rule')",
" it('Creates a detection rule from the Take Action button and navigates to rule page')",
" it('Creates a detection rule from the Alerts section and navigates to rule page')",
" describe('Rule details')",
@@ -13969,12 +15668,12 @@
},
{
"id": "create-detection-rule",
- "rawLine": " describe('Create detection rule', () => {",
- "line": " describe('Create detection rule')",
+ "rawLine": " describe.skip('Create detection rule', () => {",
+ "line": " describe.skip('Create detection rule')",
"label": "Create detection rule",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -14061,12 +15760,12 @@
"children": [
{
"id": "create-detection-rule",
- "rawLine": " describe('Create detection rule', () => {",
- "line": " describe('Create detection rule')",
+ "rawLine": " describe.skip('Create detection rule', () => {",
+ "line": " describe.skip('Create detection rule')",
"label": "Create detection rule",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -14076,7 +15775,7 @@
"label": "Creates a detection rule from the Take Action button and navigates to rule page",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -14086,7 +15785,7 @@
"label": "Creates a detection rule from the Alerts section and navigates to rule page",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -15095,10 +16794,11 @@
"fileName": "rules.ts",
"directory": "x-pack/test/cloud_security_posture_functional",
"tags": [
- "FTR"
+ "FTR",
+ "HAS SKIP"
],
"lines": [
- " describe('Cloud Posture Rules Page')",
+ " describe.skip('Cloud Posture Rules Page')",
" describe('Rules Page - Rules Counters')",
" it('Shows posture score when there are findings')",
" it('Clicking the posture score button leads to the dashboard')",
@@ -15130,12 +16830,12 @@
"testSuits": [
{
"id": "cloud-posture-rules-page",
- "rawLine": " describe('Cloud Posture Rules Page', function () {",
- "line": " describe('Cloud Posture Rules Page')",
+ "rawLine": " describe.skip('Cloud Posture Rules Page', function () {",
+ "line": " describe.skip('Cloud Posture Rules Page')",
"label": "Cloud Posture Rules Page",
"indent": 2,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15412,12 +17112,12 @@
"tree": [
{
"id": "cloud-posture-rules-page",
- "rawLine": " describe('Cloud Posture Rules Page', function () {",
- "line": " describe('Cloud Posture Rules Page')",
+ "rawLine": " describe.skip('Cloud Posture Rules Page', function () {",
+ "line": " describe.skip('Cloud Posture Rules Page')",
"label": "Cloud Posture Rules Page",
"indent": 2,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15427,7 +17127,7 @@
"label": "Rules Page - Rules Counters",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15437,7 +17137,7 @@
"label": "Shows posture score when there are findings",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15447,7 +17147,7 @@
"label": "Clicking the posture score button leads to the dashboard",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15457,7 +17157,7 @@
"label": "Shows integrations count when there are findings",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15467,7 +17167,7 @@
"label": "Clicking the integrations counter button leads to the integration page",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15477,7 +17177,7 @@
"label": "Shows the failed findings counter when there are findings",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15487,7 +17187,7 @@
"label": "Clicking the failed findings button leads to the findings page",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15497,7 +17197,7 @@
"label": "Shows the disabled rules count",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15507,7 +17207,7 @@
"label": "Clicking the disabled rules button shows enables the disabled filter",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15517,7 +17217,7 @@
"label": "Shows empty state when there are no findings",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -15529,7 +17229,7 @@
"label": "Rules Page - Bulk Action buttons",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15539,7 +17239,7 @@
"label": "It should disable Enable option when there are all rules selected are already enabled ",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15549,7 +17249,7 @@
"label": "It should disable both Enable and Disable options when there are no rules selected",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15559,7 +17259,7 @@
"label": "It should disable Disable option when there are all rules selected are already Disabled",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15569,7 +17269,7 @@
"label": "Both option should not be disabled if selected rules contains both enabled and disabled rules",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -15581,7 +17281,7 @@
"label": "Rules Page - Enable Rules and Disabled Rules Filter Toggle",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15591,7 +17291,7 @@
"label": "Should only display Enabled rules when Enabled Rules filter is ON",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15601,7 +17301,7 @@
"label": "Should only display Disabled rules when Disabled Rules filter is ON",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -15613,7 +17313,7 @@
"label": "Rules Page - CIS Section & Rule Number filters",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15623,7 +17323,7 @@
"label": "Table should only show result that has the same section as in the Section filter",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15633,7 +17333,7 @@
"label": "Table should only show result that has the same section as in the Rule number filter",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15643,7 +17343,7 @@
"label": "Table should only show result that passes both Section and Rule number filter",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
@@ -15655,7 +17355,7 @@
"label": "Rules Page - Flyout",
"indent": 4,
"type": "describe",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false,
"children": [
{
@@ -15665,7 +17365,7 @@
"label": "Users are able to Enable/Disable Rule from Switch on Rule Flyout",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15675,7 +17375,7 @@
"label": "Alerts section of Rules Flyout shows Disabled text when Rules are disabled",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15685,7 +17385,7 @@
"label": "Users are able to Enable/Disable Rule from Take Action on Rule Flyout",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
},
{
@@ -15695,7 +17395,7 @@
"label": "Alerts section of Rules Flyout shows Detection Rule Counter component when Rules are enabled",
"indent": 6,
"type": "it",
- "isSkipped": false,
+ "isSkipped": true,
"isTodo": false
}
]
diff --git a/x-pack/plugins/cloud_security_posture/public/common/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/constants.ts
index 735a28a8ed0e1..a9bee587980f5 100644
--- a/x-pack/plugins/cloud_security_posture/public/common/constants.ts
+++ b/x-pack/plugins/cloud_security_posture/public/common/constants.ts
@@ -137,6 +137,7 @@ export const cloudPostureIntegrations: CloudPostureIntegrations = {
defaultMessage: 'CIS Kubernetes',
}),
icon: 'logoKubernetes',
+ testId: 'cisK8sTestId',
},
{
type: CLOUDBEAT_EKS,
@@ -150,6 +151,7 @@ export const cloudPostureIntegrations: CloudPostureIntegrations = {
tooltip: i18n.translate('xpack.csp.kspmIntegration.eksOption.tooltipContent', {
defaultMessage: 'Elastic Kubernetes Service',
}),
+ testId: 'cisEksTestId',
},
{
type: CLOUDBEAT_AKS,
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx
index 960c1c3b39ddc..a66bff8bd3506 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx
@@ -18,7 +18,13 @@ export const AwsInputVarFields = ({
onChange,
packageInfo,
}: {
- fields: Array;
+ fields: Array<
+ AwsOptions[keyof AwsOptions]['fields'][number] & {
+ value: string;
+ id: string;
+ dataTestSubj: string;
+ }
+ >;
onChange: (key: string, value: string) => void;
packageInfo: PackageInfo;
}) => {
@@ -55,6 +61,7 @@ export const AwsInputVarFields = ({
errors={[]}
forceShowErrors={false}
isEditPage={true}
+ data-test-subj={field.dataTestSubj}
/>
@@ -74,6 +81,7 @@ export const AwsInputVarFields = ({
fullWidth
value={field.value || ''}
onChange={(event) => onChange(field.id, event.target.value)}
+ data-test-subj={field.dataTestSubj}
/>
)}
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx
index d490e7cad5e27..cb96e5a58d566 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx
@@ -73,7 +73,7 @@ const AWS_FIELD_LABEL = {
export type AwsCredentialsFields = Record<
string,
- { label: string; type?: 'password' | 'text'; isSecret?: boolean }
+ { label: string; type?: 'password' | 'text'; isSecret?: boolean; dataTestSubj: string }
>;
export interface AwsOptionValue {
@@ -92,6 +92,7 @@ export const getInputVarsFields = (input: NewPackagePolicyInput, fields: AwsCred
label: field.label,
type: field.type || 'text',
value: inputVar.value,
+ dataTestSubj: field.dataTestSubj,
isSecret: field.isSecret,
} as const;
});
@@ -141,6 +142,7 @@ export const getAwsCredentialsFormOptions = (): AwsOptions => ({
label: i18n.translate('xpack.csp.awsIntegration.roleArnLabel', {
defaultMessage: 'Role ARN',
}),
+ dataTestSubj: 'awsRoleArnInput',
},
},
},
@@ -150,10 +152,11 @@ export const getAwsCredentialsFormOptions = (): AwsOptions => ({
}),
info: DirectAccessKeysDescription,
fields: {
- access_key_id: { label: AWS_FIELD_LABEL.access_key_id },
+ access_key_id: { label: AWS_FIELD_LABEL.access_key_id, dataTestSubj: 'awsDirectAccessKeyId' },
secret_access_key: {
label: AWS_FIELD_LABEL.secret_access_key,
type: 'password',
+ dataTestSubj: 'awsDirectAccessSecretKey',
isSecret: true,
},
},
@@ -164,16 +167,21 @@ export const getAwsCredentialsFormOptions = (): AwsOptions => ({
defaultMessage: 'Temporary keys',
}),
fields: {
- access_key_id: { label: AWS_FIELD_LABEL.access_key_id },
+ access_key_id: {
+ label: AWS_FIELD_LABEL.access_key_id,
+ dataTestSubj: 'awsTemporaryKeysAccessKeyId',
+ },
secret_access_key: {
label: AWS_FIELD_LABEL.secret_access_key,
type: 'password',
+ dataTestSubj: 'awsTemporaryKeysSecretAccessKey',
isSecret: true,
},
session_token: {
label: i18n.translate('xpack.csp.awsIntegration.sessionTokenLabel', {
defaultMessage: 'Session Token',
}),
+ dataTestSubj: 'awsTemporaryKeysSessionToken',
},
},
},
@@ -187,11 +195,13 @@ export const getAwsCredentialsFormOptions = (): AwsOptions => ({
label: i18n.translate('xpack.csp.awsIntegration.sharedCredentialFileLabel', {
defaultMessage: 'Shared Credential File',
}),
+ dataTestSubj: 'awsSharedCredentialFile',
},
credential_profile_name: {
label: i18n.translate('xpack.csp.awsIntegration.credentialProfileNameLabel', {
defaultMessage: 'Credential Profile Name',
}),
+ dataTestSubj: 'awsCredentialProfileName',
},
},
},
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx
index 1bf6b72cf1417..0f3b9916cef1a 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx
@@ -35,6 +35,7 @@ import { useAzureCredentialsForm } from './hooks';
import { findVariableDef, getPosturePolicy, NewPackagePolicyPostureInput } from '../utils';
import { CspRadioOption, RadioGroup } from '../csp_boxed_radio_group';
import { CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS } from '../../test_subjects';
+import { AZURE_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ } from '../../test_subjects';
interface AzureSetupInfoContentProps {
integrationLink: string;
@@ -215,6 +216,7 @@ const AzureCredentialTypeSelector = ({
onChange={(optionElem) => {
onChange(optionElem.target.value as AzureCredentialsType);
}}
+ data-test-subj={AZURE_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ}
/>
);
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx
index 476aa627cfb53..ddd447a4fcdcd 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx
@@ -119,7 +119,10 @@ type AwsOptions = Record<
{
label: string;
info: React.ReactNode;
- fields: Record
;
+ fields: Record<
+ string,
+ { label: string; type?: 'password' | 'text'; isSecret?: boolean; dataTestSubj: string }
+ >;
testId: string;
}
>;
@@ -135,6 +138,7 @@ const options: AwsOptions = {
label: i18n.translate('xpack.csp.eksIntegration.roleArnLabel', {
defaultMessage: 'Role ARN',
}),
+ dataTestSubj: 'roleArnInput',
},
},
testId: 'assumeRoleTestId',
@@ -145,10 +149,11 @@ const options: AwsOptions = {
}),
info: DirectAccessKeysDescription,
fields: {
- access_key_id: { label: AWS_FIELD_LABEL.access_key_id },
+ access_key_id: { label: AWS_FIELD_LABEL.access_key_id, dataTestSubj: 'directAccessKeyId' },
secret_access_key: {
label: AWS_FIELD_LABEL.secret_access_key,
type: 'password',
+ dataTestSubj: 'directAccessSecretKey',
isSecret: true,
},
},
@@ -160,16 +165,21 @@ const options: AwsOptions = {
defaultMessage: 'Temporary keys',
}),
fields: {
- access_key_id: { label: AWS_FIELD_LABEL.access_key_id },
+ access_key_id: {
+ label: AWS_FIELD_LABEL.access_key_id,
+ dataTestSubj: 'temporaryKeysAccessKeyId',
+ },
secret_access_key: {
label: AWS_FIELD_LABEL.secret_access_key,
type: 'password',
+ dataTestSubj: 'temporaryKeysSecretAccessKey',
isSecret: true,
},
session_token: {
label: i18n.translate('xpack.csp.eksIntegration.sessionTokenLabel', {
defaultMessage: 'Session Token',
}),
+ dataTestSubj: 'temporaryKeysSessionToken',
},
},
testId: 'temporaryKeyTestId',
@@ -184,11 +194,13 @@ const options: AwsOptions = {
label: i18n.translate('xpack.csp.eksIntegration.sharedCredentialFileLabel', {
defaultMessage: 'Shared Credential File',
}),
+ dataTestSubj: 'sharedCredentialFile',
},
credential_profile_name: {
label: i18n.translate('xpack.csp.eksIntegration.credentialProfileNameLabel', {
defaultMessage: 'Credential Profile Name',
}),
+ dataTestSubj: 'credentialProfileName',
},
},
testId: 'sharedCredentialsTestId',
@@ -222,6 +234,7 @@ const getInputVarsFields = (
id,
label: field.label,
type: field.type || 'text',
+ dataTestSubj: field.dataTestSubj,
value: inputVar.value,
isSecret: field?.isSecret,
} as const;
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx
index 9ef413d1e3e46..c205ef7f82525 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx
@@ -110,12 +110,14 @@ const getAwsAccountTypeOptions = (isAwsOrgDisabled: boolean): CspRadioGroupProps
defaultMessage: 'Supported from integration version 1.5.0 and above',
})
: undefined,
+ testId: 'awsOrganizationTestId',
},
{
id: AWS_SINGLE_ACCOUNT,
label: i18n.translate('xpack.csp.fleetIntegration.awsAccountType.singleAccountLabel', {
defaultMessage: 'Single Account',
}),
+ testId: 'awsSingleTestId',
},
];
@@ -150,6 +152,7 @@ const getAzureAccountTypeOptions = (
label: i18n.translate('xpack.csp.fleetIntegration.azureAccountType.azureOrganizationLabel', {
defaultMessage: 'Azure Organization',
}),
+ testId: 'azureOrganizationAccountTestId',
disabled: isAzureOrganizationDisabled,
tooltip: isAzureOrganizationDisabled
? i18n.translate(
@@ -165,6 +168,7 @@ const getAzureAccountTypeOptions = (
label: i18n.translate('xpack.csp.fleetIntegration.azureAccountType.singleAccountLabel', {
defaultMessage: 'Single Subscription',
}),
+ testId: 'azureSingleAccountTestId',
},
];
diff --git a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts
index 0872dff084498..4538b04520f84 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts
+++ b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts
@@ -63,6 +63,7 @@ export const CIS_AZURE_OPTION_TEST_SUBJ = 'cisAzureTestId';
export const SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ = 'setup-technology-selector-accordion';
export const SETUP_TECHNOLOGY_SELECTOR_TEST_SUBJ = 'setup-technology-selector';
+export const AZURE_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ = 'azure-credentials-type-selector';
export const CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS = {
TENANT_ID: 'cisAzureTenantId',
CLIENT_ID: 'cisAzureClientId',
diff --git a/x-pack/test/cloud_security_posture_functional/config.ts b/x-pack/test/cloud_security_posture_functional/config.ts
index 96698bbbb007e..bd2f1eb9d594d 100644
--- a/x-pack/test/cloud_security_posture_functional/config.ts
+++ b/x-pack/test/cloud_security_posture_functional/config.ts
@@ -38,7 +38,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
* 2. merge the updated version number change to kibana
*/
`--xpack.fleet.packages.0.name=cloud_security_posture`,
- `--xpack.fleet.packages.0.version=1.6.5`,
+ `--xpack.fleet.packages.0.version=1.7.4`,
// `--xpack.fleet.registryUrl=https://localhost:8080`,
`--xpack.fleet.agents.fleet_server.hosts=["https://ftr.kibana:8220"]`,
`--xpack.fleet.internal.fleetServerStandalone=true`,
diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts
index 038d16a82ca82..18df32bd71993 100644
--- a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts
+++ b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts
@@ -15,46 +15,25 @@ export function AddCisIntegrationFormPageProvider({
const PageObjects = getPageObjects(['common', 'header']);
const browser = getService('browser');
+ const cisAzure = {
+ getPostInstallArmTemplateModal: async () => {
+ return await testSubjects.find('postInstallAzureArmTemplateModal');
+ },
+ };
+
const cisAws = {
getUrlValueInEditPage: async () => {
/* Newly added/edited integration always shows up on top by default as such we can just always click the most top if we want to check for the latest one */
const fieldValue = await (await testSubjects.find('externalLink')).getAttribute('href');
return fieldValue;
},
- };
-
- const cisGcp = {
- getIntegrationFormEntirePage: () => testSubjects.find('dataCollectionSetupStep'),
-
- getIntegrationPolicyTable: () => testSubjects.find('integrationPolicyTable'),
-
- getIntegrationFormEditPage: () => testSubjects.find('editPackagePolicy_page'),
-
- findOptionInPage: async (text: string) => {
- await PageObjects.header.waitUntilLoadingHasFinished();
- const optionToBeClicked = await testSubjects.find(text);
- return await optionToBeClicked;
- },
-
- clickOptionButton: async (text: string) => {
- const optionToBeClicked = await cisGcp.findOptionInPage(text);
- await optionToBeClicked.click();
- },
-
- clickSaveButton: async () => {
- const optionToBeClicked = await cisGcp.findOptionInPage('createPackagePolicySaveButton');
- await optionToBeClicked.click();
- },
-
- clickSaveIntegrationButton: async () => {
- const optionToBeClicked = await cisGcp.findOptionInPage('saveIntegration');
- await optionToBeClicked.click();
- },
- getPostInstallModal: async () => {
- return await testSubjects.find('confirmModalTitleText');
+ getPostInstallCloudFormationModal: async () => {
+ return await testSubjects.find('postInstallCloudFormationModal');
},
+ };
+ const cisGcp = {
isPostInstallGoogleCloudShellModal: async (isOrg: boolean, orgID?: string, prjID?: string) => {
const googleCloudShellModal = await testSubjects.find('postInstallGoogleCloudShellModal');
const googleCloudShellModalVisibleText = await googleCloudShellModal.getVisibleText();
@@ -143,6 +122,15 @@ export function AddCisIntegrationFormPageProvider({
await PageObjects.header.waitUntilLoadingHasFinished();
};
+ const navigateToAddIntegrationKspmPage = async () => {
+ await PageObjects.common.navigateToUrl(
+ 'fleet', // Defined in Security Solution plugin
+ 'integrations/cloud_security_posture/add-integration/kspm',
+ { shouldUseHashForSubUrl: false }
+ );
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ };
+
const navigateToIntegrationCspList = async () => {
await PageObjects.common.navigateToActualUrl(
'integrations', // Defined in Security Solution plugin
@@ -181,11 +169,96 @@ export function AddCisIntegrationFormPageProvider({
return currentUrl;
};
+ const getIntegrationFormEntirePage = () => testSubjects.find('dataCollectionSetupStep');
+
+ const getIntegrationPolicyTable = () => testSubjects.find('integrationPolicyTable');
+
+ const getIntegrationFormEditPage = () => testSubjects.find('editPackagePolicy_page');
+
+ const findOptionInPage = async (text: string) => {
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ const optionToBeClicked = await testSubjects.find(text);
+ return await optionToBeClicked;
+ };
+
+ const clickOptionButton = async (text: string) => {
+ const optionToBeClicked = await findOptionInPage(text);
+ await optionToBeClicked.scrollIntoView();
+ await optionToBeClicked.click();
+ };
+
+ const clickSaveButton = async () => {
+ const optionToBeClicked = await findOptionInPage('createPackagePolicySaveButton');
+ await optionToBeClicked.click();
+ };
+
+ const clickSaveIntegrationButton = async () => {
+ const optionToBeClicked = await findOptionInPage('saveIntegration');
+ await optionToBeClicked.click();
+ };
+
+ const getPostInstallModal = async () => {
+ return await testSubjects.find('confirmModalTitleText');
+ };
+
+ const fillInTextField = async (selector: string, text: string) => {
+ const textField = await testSubjects.find(selector);
+ await textField.type(text);
+ };
+
+ const chooseDropDown = async (selector: string, text: string) => {
+ const credentialTypeBox = await testSubjects.find(selector);
+ const chosenOption = await testSubjects.find(text);
+ await credentialTypeBox.click();
+ await chosenOption.click();
+ };
+
+ const getFieldValueInEditPage = async (field: string) => {
+ /* Newly added/edited integration always shows up on top by default as such we can just always click the most top if we want to check for the latest one */
+ const integrationList = await testSubjects.findAll('integrationNameLink');
+ await integrationList[0].click();
+ const fieldValue = await (await testSubjects.find(field)).getAttribute('value');
+ return fieldValue;
+ };
+
+ const doesStringExistInCodeBlock = async (str: string) => {
+ const flyout = await testSubjects.find('agentEnrollmentFlyout');
+ const codeBlock = await flyout.findByXpath('//code');
+ const commandsToBeCopied = await codeBlock.getVisibleText();
+ return commandsToBeCopied.includes(str);
+ };
+
+ const getFieldValueInAddAgentFlyout = async (field: string, value: string) => {
+ /* Newly added/edited integration always shows up on top by default as such we can just always click the most top if we want to check for the latest one */
+ const integrationList = await testSubjects.findAll('agentEnrollmentFlyout');
+ await integrationList[0].click();
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ const fieldValue = await (await testSubjects.find(field)).getAttribute(value);
+ return fieldValue;
+ };
+
+ const selectValue = async (selector: string, value: string) => {
+ return testSubjects.selectValue(selector, value);
+ };
+
+ const getValueInEditPage = async (field: string) => {
+ /* Newly added/edited integration always shows up on top by default as such we can just always click the most top if we want to check for the latest one */
+ const fieldValue = await (await testSubjects.find(field)).getAttribute('value');
+ return fieldValue;
+ };
+
+ const isOptionChecked = async (testId: string, id: string) => {
+ const checkBox = await testSubjects.find(testId);
+ return await (await checkBox.findByCssSelector(`input[id='${id}']`)).getAttribute('checked');
+ };
+
return {
+ cisAzure,
cisAws,
cisGcp,
navigateToAddIntegrationCspmPage,
navigateToAddIntegrationCnvmPage,
+ navigateToAddIntegrationKspmPage,
navigateToIntegrationCspList,
getUrlOnPostInstallModal,
isRadioButtonChecked,
@@ -193,5 +266,21 @@ export function AddCisIntegrationFormPageProvider({
clickFirstElementOnIntegrationTable,
clickFirstElementOnIntegrationTableAddAgent,
clickLaunchAndGetCurrentUrl,
+ getIntegrationFormEntirePage,
+ getIntegrationPolicyTable,
+ getIntegrationFormEditPage,
+ findOptionInPage,
+ clickOptionButton,
+ clickSaveButton,
+ clickSaveIntegrationButton,
+ getPostInstallModal,
+ fillInTextField,
+ chooseDropDown,
+ getFieldValueInEditPage,
+ doesStringExistInCodeBlock,
+ getFieldValueInAddAgentFlyout,
+ selectValue,
+ getValueInEditPage,
+ isOptionChecked,
};
}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts
new file mode 100644
index 0000000000000..1e5ff7868f902
--- /dev/null
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts
@@ -0,0 +1,65 @@
+/*
+ * 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 expect from '@kbn/expect';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
+
+// eslint-disable-next-line import/no-default-export
+export default function (providerContext: FtrProviderContext) {
+ const { getPageObjects } = providerContext;
+ const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
+
+ describe('Test adding Cloud Security Posture Integrations CNVM', function () {
+ this.tags(['cloud_security_posture_cis_integration_cnvm']);
+ let cisIntegration: typeof pageObjects.cisAddIntegration;
+
+ beforeEach(async () => {
+ cisIntegration = pageObjects.cisAddIntegration;
+
+ await cisIntegration.navigateToAddIntegrationCspmPage();
+ });
+
+ describe('CNVM AWS', () => {
+ it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {
+ await cisIntegration.navigateToAddIntegrationCnvmPage();
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect(
+ (await cisIntegration.getUrlOnPostInstallModal()) ===
+ 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html'
+ );
+ });
+
+ it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
+ expect(
+ (
+ await cisIntegration.getFieldValueInAddAgentFlyout(
+ 'launchCloudFormationButtonAgentFlyoutTestId',
+ 'href'
+ )
+ )?.includes('https://console.aws.amazon.com/cloudformation/')
+ ).to.be(true);
+ });
+
+ it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {
+ await cisIntegration.navigateToAddIntegrationCnvmPage();
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect(
+ (
+ await cisIntegration.clickLaunchAndGetCurrentUrl(
+ 'confirmCloudFormationModalConfirmButton',
+ 1
+ )
+ ).includes('console.aws.amazon.com%2Fcloudformation')
+ ).to.be(true);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts
new file mode 100644
index 0000000000000..2dd8f36af154d
--- /dev/null
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts
@@ -0,0 +1,320 @@
+/*
+ * 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 expect from '@kbn/expect';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
+
+const CIS_AWS_OPTION_TEST_ID = 'cisAwsTestId';
+const AWS_SINGLE_ACCOUNT_TEST_ID = 'awsSingleTestId';
+const AWS_MANUAL_TEST_ID = 'aws-manual-setup-option';
+const AWS_CREDENTIAL_SELECTOR = 'aws-credentials-type-selector';
+const ROLE_ARN_TEST_ID = 'awsRoleArnInput';
+const DIRECT_ACCESS_KEY_ID_TEST_ID = 'awsDirectAccessKeyId';
+const DIRECT_ACCESS_SECRET_KEY_TEST_ID = 'passwordInput-secret-access-key';
+const TEMP_ACCESS_KEY_ID_TEST_ID = 'awsTemporaryKeysAccessKeyId';
+const TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID = 'passwordInput-secret-access-key';
+const TEMP_ACCESS_SESSION_TOKEN_TEST_ID = 'awsTemporaryKeysSessionToken';
+const SHARED_CREDENTIALS_FILE_TEST_ID = 'awsSharedCredentialFile';
+const SHARED_CREDETIALS_PROFILE_NAME_TEST_ID = 'awsCredentialProfileName';
+
+// eslint-disable-next-line import/no-default-export
+export default function (providerContext: FtrProviderContext) {
+ const { getPageObjects } = providerContext;
+ const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
+
+ describe('Test adding Cloud Security Posture Integrations CSPM AWS', function () {
+ this.tags(['cloud_security_posture_cis_integration_cspm_aws']);
+ let cisIntegrationAws: typeof pageObjects.cisAddIntegration.cisAws;
+ let cisIntegration: typeof pageObjects.cisAddIntegration;
+
+ beforeEach(async () => {
+ cisIntegration = pageObjects.cisAddIntegration;
+ cisIntegrationAws = pageObjects.cisAddIntegration.cisAws;
+
+ await cisIntegration.navigateToAddIntegrationCspmPage();
+ });
+
+ describe('CIS_AWS Organization Cloud Formation', () => {
+ it('Initial form state, AWS Org account, and CloudFormation should be selected by default', async () => {
+ expect((await cisIntegration.isRadioButtonChecked('cloudbeat/cis_aws')) === true);
+ expect((await cisIntegration.isRadioButtonChecked('organization-account')) === true);
+ expect((await cisIntegration.isRadioButtonChecked('cloud_formation')) === true);
+ });
+ it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegrationAws.getPostInstallCloudFormationModal()) !== undefined).to.be(
+ true
+ );
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect(
+ (await cisIntegration.getUrlOnPostInstallModal()) ===
+ 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html'
+ );
+ });
+ it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
+ expect(
+ (
+ await cisIntegration.getFieldValueInAddAgentFlyout(
+ 'launchCloudFormationButtonAgentFlyoutTestId',
+ 'href'
+ )
+ )?.includes('https://console.aws.amazon.com/cloudformation/')
+ ).to.be(true);
+ });
+ it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect(
+ (
+ await cisIntegration.clickLaunchAndGetCurrentUrl(
+ 'confirmCloudFormationModalConfirmButton',
+ 2
+ )
+ ).includes('console.aws.amazon.com%2Fcloudformation')
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Organization Manual Assume Role', () => {
+ it('CIS_AWS Organization Manual Assume Role Workflow', async () => {
+ const roleArn = 'RoleArnTestValue';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be(
+ true
+ );
+ });
+ });
+
+ describe('CIS_AWS Organization Manual Direct Access', () => {
+ it('CIS_AWS Organization Manual Direct Access Workflow', async () => {
+ const directAccessKeyId = 'directAccessKeyIdTest';
+ const directAccessSecretKey = 'directAccessSecretKeyTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'direct_access_keys');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId);
+ await cisIntegration.fillInTextField(
+ DIRECT_ACCESS_SECRET_KEY_TEST_ID,
+ directAccessSecretKey
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect(
+ (await cisIntegration.getFieldValueInEditPage(DIRECT_ACCESS_KEY_ID_TEST_ID)) ===
+ directAccessKeyId
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Organization Manual Temporary Keys', () => {
+ it('CIS_AWS Organization Manual Temporary Keys Workflow', async () => {
+ const accessKeyId = 'accessKeyIdTest';
+ const accessKeySecretKey = 'accessKeySecretKeyTest';
+ const tempAccessSessionToken = 'tempAccessSessionTokenTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'temporary_keys');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId);
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID,
+ accessKeySecretKey
+ );
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_SESSION_TOKEN_TEST_ID,
+ tempAccessSessionToken
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_KEY_ID_TEST_ID)) === accessKeyId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_SESSION_TOKEN_TEST_ID)) ===
+ tempAccessSessionToken
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Organization Manual Shared Access', () => {
+ it('CIS_AWS Organization Manual Shared Access Workflow', async () => {
+ const sharedCredentialFile = 'sharedCredentialFileTest';
+ const sharedCredentialProfileName = 'sharedCredentialProfileNameTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'shared_credentials');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile);
+ await cisIntegration.fillInTextField(
+ SHARED_CREDETIALS_PROFILE_NAME_TEST_ID,
+ sharedCredentialProfileName
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDENTIALS_FILE_TEST_ID)) ===
+ sharedCredentialFile
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDETIALS_PROFILE_NAME_TEST_ID)) ===
+ sharedCredentialProfileName
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Single Cloud Formation', () => {
+ it('CIS_AWS Single Cloud Formation workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect(
+ (await cisIntegration.getUrlOnPostInstallModal()) ===
+ 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html'
+ );
+ });
+ });
+
+ describe('CIS_AWS Single Manual Assume Role', () => {
+ it('CIS_AWS Single Manual Assume Role Workflow', async () => {
+ const roleArn = 'RoleArnTestValue';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be(
+ true
+ );
+ });
+ });
+
+ describe('CIS_AWS Single Manual Direct Access', () => {
+ it('CIS_AWS Single Manual Direct Access Workflow', async () => {
+ const directAccessKeyId = 'directAccessKeyIdTest';
+ const directAccessSecretKey = 'directAccessSecretKeyTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'direct_access_keys');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId);
+ await cisIntegration.fillInTextField(
+ DIRECT_ACCESS_SECRET_KEY_TEST_ID,
+ directAccessSecretKey
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect(
+ (await cisIntegration.getFieldValueInEditPage(DIRECT_ACCESS_KEY_ID_TEST_ID)) ===
+ directAccessKeyId
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Single Manual Temporary Keys', () => {
+ it('CIS_AWS Single Manual Temporary Keys Workflow', async () => {
+ const accessKeyId = 'accessKeyIdTest';
+ const accessKeySecretKey = 'accessKeySecretKeyTest';
+ const tempAccessSessionToken = 'tempAccessSessionTokenTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'temporary_keys');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId);
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID,
+ accessKeySecretKey
+ );
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_SESSION_TOKEN_TEST_ID,
+ tempAccessSessionToken
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_KEY_ID_TEST_ID)) === accessKeyId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_SESSION_TOKEN_TEST_ID)) ===
+ tempAccessSessionToken
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_AWS Single Manual Shared Access', () => {
+ it('CIS_AWS Single Manual Shared Access Workflow', async () => {
+ const sharedCredentialFile = 'sharedCredentialFileTest';
+ const sharedCredentialProfileName = 'sharedCredentialProfileNameTest';
+ await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR);
+ await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'shared_credentials');
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile);
+ await cisIntegration.fillInTextField(
+ SHARED_CREDETIALS_PROFILE_NAME_TEST_ID,
+ sharedCredentialProfileName
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDENTIALS_FILE_TEST_ID)) ===
+ sharedCredentialFile
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDETIALS_PROFILE_NAME_TEST_ID)) ===
+ sharedCredentialProfileName
+ ).to.be(true);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts
new file mode 100644
index 0000000000000..6bd117c36a85d
--- /dev/null
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts
@@ -0,0 +1,282 @@
+/*
+ * 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 expect from '@kbn/expect';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
+
+const CIS_AZURE_OPTION_TEST_ID = 'cisAzureTestId';
+const CIS_AZURE_SINGLE_SUB_TEST_ID = 'azureSingleAccountTestId';
+const AZURE_CREDENTIAL_SELECTOR = 'azure-credentials-type-selector';
+
+const clientId = 'clientIdTest';
+const tenantId = 'tenantIdTest';
+const clientCertificatePath = 'clientCertificatePathTest';
+const clientSecret = 'clientSecretTest';
+
+export const CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS = {
+ TENANT_ID: 'cisAzureTenantId',
+ CLIENT_ID: 'cisAzureClientId',
+ CLIENT_SECRET: 'passwordInput-client-secret',
+ CLIENT_CERTIFICATE_PATH: 'cisAzureClientCertificatePath',
+ CLIENT_CERTIFICATE_PASSWORD: 'cisAzureClientCertificatePassword',
+ CLIENT_USERNAME: 'cisAzureClientUsername',
+ CLIENT_PASSWORD: 'cisAzureClientPassword',
+};
+export const CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS = {
+ ARM_TEMPLATE: 'cisAzureArmTemplate',
+ MANUAL: 'cisAzureManual',
+};
+
+// eslint-disable-next-line import/no-default-export
+export default function (providerContext: FtrProviderContext) {
+ const { getPageObjects } = providerContext;
+ const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
+
+ describe('Test adding Cloud Security Posture Integrations CSPM AZURE', function () {
+ this.tags(['cloud_security_posture_cis_integration_cspm_azure']);
+ let cisIntegration: typeof pageObjects.cisAddIntegration;
+ let cisIntegrationAzure: typeof pageObjects.cisAddIntegration.cisAzure;
+
+ beforeEach(async () => {
+ cisIntegration = pageObjects.cisAddIntegration;
+ cisIntegrationAzure = pageObjects.cisAddIntegration.cisAzure;
+
+ await cisIntegration.navigateToAddIntegrationCspmPage();
+ });
+
+ describe('Azure Organization ARM Template', () => {
+ it('Azure Organization ARM Template Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.ARM_TEMPLATE);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegrationAzure.getPostInstallArmTemplateModal()) !== undefined).to.be(
+ true
+ );
+ expect(
+ (await cisIntegration.getUrlOnPostInstallModal()) ===
+ 'https://azure.microsoft.com/en-us/get-started/azure-portal/resource-manager'
+ );
+ });
+ });
+
+ describe('Azure Organization Manual Managed Identity', () => {
+ it('Azure Organization Manual Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(AZURE_CREDENTIAL_SELECTOR, 'managed_identity');
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ });
+ });
+
+ describe('Azure Organization Manual Service Principle with Client Secret', () => {
+ it('Azure Organization Manual Service Principle with Client Secret Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(
+ AZURE_CREDENTIAL_SELECTOR,
+ 'service_principal_with_client_secret'
+ );
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID,
+ clientId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID,
+ tenantId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_SECRET,
+ clientSecret
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID
+ )) === clientId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID
+ )) === tenantId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_SECRET
+ )) === clientSecret
+ ).to.be(true);
+ });
+ });
+
+ describe('Azure Organization Manual Service Principle with Client Certificate', () => {
+ it('Azure Organization Manual Service Principle with Client Certificate Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(
+ AZURE_CREDENTIAL_SELECTOR,
+ 'service_principal_with_client_certificate'
+ );
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID,
+ clientId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID,
+ tenantId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_CERTIFICATE_PATH,
+ clientCertificatePath
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID
+ )) === clientId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID
+ )) === tenantId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_CERTIFICATE_PATH
+ )) === clientCertificatePath
+ ).to.be(true);
+ });
+ });
+
+ describe('Azure Single ARM Template', () => {
+ it('Azure Single ARM Template Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SINGLE_SUB_TEST_ID);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegrationAzure.getPostInstallArmTemplateModal()) !== undefined).to.be(
+ true
+ );
+ expect(
+ (await cisIntegration.getUrlOnPostInstallModal()) ===
+ 'https://azure.microsoft.com/en-us/get-started/azure-portal/resource-manager'
+ );
+ });
+ });
+
+ describe('Azure Single Manual Managed Identity', () => {
+ it('Azure Single Manual Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SINGLE_SUB_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(AZURE_CREDENTIAL_SELECTOR, 'managed_identity');
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ });
+ });
+
+ describe('Azure Single Manual Service Principle with Client Secret', () => {
+ it('Azure Single Manual Service Principle with Client Secret Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(
+ AZURE_CREDENTIAL_SELECTOR,
+ 'service_principal_with_client_secret'
+ );
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID,
+ clientId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID,
+ tenantId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_SECRET,
+ clientSecret
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID
+ )) === clientId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID
+ )) === tenantId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_SECRET
+ )) === clientSecret
+ ).to.be(true);
+ });
+ });
+
+ describe('Azure Single Manual Service Principle with Client Certificate', () => {
+ it('Azure Single Manual Service Principle with Client Certificate Workflow', async () => {
+ await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL);
+ await cisIntegration.selectValue(
+ AZURE_CREDENTIAL_SELECTOR,
+ 'service_principal_with_client_certificate'
+ );
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID,
+ clientId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID,
+ tenantId
+ );
+ await cisIntegration.fillInTextField(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_CERTIFICATE_PATH,
+ clientCertificatePath
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID
+ )) === clientId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.TENANT_ID
+ )) === tenantId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(
+ CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_CERTIFICATE_PATH
+ )) === clientCertificatePath
+ ).to.be(true);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts
similarity index 51%
rename from x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts
rename to x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts
index eb121f33f1278..b75c4aeb2b7f3 100644
--- a/x-pack/test/cloud_security_posture_functional/pages/cis_integration.ts
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts
@@ -6,10 +6,9 @@
*/
import expect from '@kbn/expect';
-import type { FtrProviderContext } from '../ftr_provider_context';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
const CIS_GCP_OPTION_TEST_ID = 'cisGcpTestId';
-const CIS_AWS_OPTION_TEST_ID = 'cisAwsTestId';
const GCP_ORGANIZATION_TEST_ID = 'gcpOrganizationAccountTestId';
const GCP_SINGLE_ACCOUNT_TEST_ID = 'gcpSingleAccountTestId';
const GCP_CLOUD_SHELL_TEST_ID = 'gcpGoogleCloudShellOptionTestId';
@@ -22,12 +21,11 @@ const CREDENTIALS_JSON_TEST_ID = 'credentials_json_test_id';
// eslint-disable-next-line import/no-default-export
export default function (providerContext: FtrProviderContext) {
- const { getPageObjects, getService } = providerContext;
+ const { getPageObjects } = providerContext;
const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
- const kibanaServer = getService('kibanaServer');
- describe('Test adding Cloud Security Posture Integrations', function () {
- this.tags(['cloud_security_posture_cis_integration']);
+ describe('Test adding Cloud Security Posture Integrations CSPM GCP', function () {
+ this.tags(['cloud_security_posture_cis_integration_cspm_gcp']);
let cisIntegrationGcp: typeof pageObjects.cisAddIntegration.cisGcp;
let cisIntegration: typeof pageObjects.cisAddIntegration;
@@ -38,96 +36,11 @@ export default function (providerContext: FtrProviderContext) {
await cisIntegration.navigateToAddIntegrationCspmPage();
});
- after(async () => {
- await kibanaServer.savedObjects.cleanStandardList();
- });
-
- describe('CNVM AWS', () => {
- it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {
- await cisIntegration.navigateToAddIntegrationCnvmPage();
- await cisIntegrationGcp.clickSaveButton();
- pageObjects.header.waitUntilLoadingHasFinished();
- expect(
- (await cisIntegration.getUrlOnPostInstallModal()) ===
- 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html'
- );
- });
-
- it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {
- await cisIntegration.navigateToIntegrationCspList();
- await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
- expect(
- (
- await cisIntegrationGcp.getFieldValueInAddAgentFlyout(
- 'launchCloudFormationButtonAgentFlyoutTestId',
- 'href'
- )
- ).includes('https://console.aws.amazon.com/cloudformation/')
- ).to.be(true);
- });
-
- it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {
- await cisIntegration.navigateToAddIntegrationCnvmPage();
- await cisIntegrationGcp.clickSaveButton();
- pageObjects.header.waitUntilLoadingHasFinished();
- expect(
- (
- await cisIntegration.clickLaunchAndGetCurrentUrl(
- 'confirmCloudFormationModalConfirmButton',
- 1
- )
- ).includes('console.aws.amazon.com%2Fcloudformation')
- ).to.be(true);
- });
- });
-
- describe('CIS_AWS', () => {
- it('Initial form state, AWS Org account, and CloudFormation should be selected by default', async () => {
- expect((await cisIntegration.isRadioButtonChecked('cloudbeat/cis_aws')) === true);
- expect((await cisIntegration.isRadioButtonChecked('organization-account')) === true);
- expect((await cisIntegration.isRadioButtonChecked('cloud_formation')) === true);
- });
- it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
- pageObjects.header.waitUntilLoadingHasFinished();
- expect(
- (await cisIntegration.getUrlOnPostInstallModal()) ===
- 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html'
- );
- });
- it('On Add Agent modal there should be modal that has Cloud Formation details as well as button that redirects user to Cloud formation page on AWS upon clicking them ', async () => {
- await cisIntegration.navigateToIntegrationCspList();
- await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
- expect(
- (
- await cisIntegrationGcp.getFieldValueInAddAgentFlyout(
- 'launchCloudFormationButtonAgentFlyoutTestId',
- 'href'
- )
- ).includes('https://console.aws.amazon.com/cloudformation/')
- ).to.be(true);
- });
- it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_AWS_OPTION_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
- pageObjects.header.waitUntilLoadingHasFinished();
- expect(
- (
- await cisIntegration.clickLaunchAndGetCurrentUrl(
- 'confirmCloudFormationModalConfirmButton',
- 2
- )
- ).includes('console.aws.amazon.com%2Fcloudformation')
- ).to.be(true);
- });
- });
-
describe('CIS_GCP Organization', () => {
it('Switch between Manual and Google cloud shell', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_MANUAL_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_MANUAL_TEST_ID);
/* Check for existing fields. In Manual, Credential field should be visible */
expect((await cisIntegrationGcp.checkGcpFieldExist(PRJ_ID_TEST_ID)) === 1).to.be(true);
expect((await cisIntegrationGcp.checkGcpFieldExist(ORG_ID_TEST_ID)) === 1).to.be(true);
@@ -135,7 +48,7 @@ export default function (providerContext: FtrProviderContext) {
true
);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
/* Check for existing fields. In Google Cloud Shell, Credential field should NOT be visible */
expect((await cisIntegrationGcp.checkGcpFieldExist(PRJ_ID_TEST_ID)) === 1).to.be(true);
expect((await cisIntegrationGcp.checkGcpFieldExist(ORG_ID_TEST_ID)) === 1).to.be(true);
@@ -145,10 +58,10 @@ export default function (providerContext: FtrProviderContext) {
});
it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID or Organization ID provided, it should use default value', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(true)) === true).to.be(
true
@@ -158,13 +71,13 @@ export default function (providerContext: FtrProviderContext) {
it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {
const projectName = 'PRJ_NAME_TEST';
const organizationName = 'ORG_NAME_TEST';
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
- await cisIntegrationGcp.fillInTextField('project_id_test_id', projectName);
- await cisIntegrationGcp.fillInTextField('organization_id_test_id', organizationName);
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_ORGANIZATION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.fillInTextField('project_id_test_id', projectName);
+ await cisIntegration.fillInTextField('organization_id_test_id', organizationName);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect(
(await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(
@@ -178,18 +91,16 @@ export default function (providerContext: FtrProviderContext) {
it('Add Agent FLyout - Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID or Organization ID provided, it should use that value', async () => {
await cisIntegration.navigateToIntegrationCspList();
await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
- expect(await cisIntegrationGcp.doesStringExistInCodeBlock('PRJ_NAME_TEST')).to.be(true);
- expect(await cisIntegrationGcp.doesStringExistInCodeBlock('ORG_ID=ORG_NAME_TEST')).to.be(
- true
- );
+ expect(await cisIntegration.doesStringExistInCodeBlock('PRJ_NAME_TEST')).to.be(true);
+ expect(await cisIntegration.doesStringExistInCodeBlock('ORG_ID=ORG_NAME_TEST')).to.be(true);
});
it('Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false)) === true).to.be(
true
@@ -197,8 +108,8 @@ export default function (providerContext: FtrProviderContext) {
});
it('Hyperlink on PostInstallation Modal should have the correct URL', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect(
(await cisIntegration.getUrlOnPostInstallModal()) ===
@@ -207,8 +118,8 @@ export default function (providerContext: FtrProviderContext) {
});
it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect(
(
@@ -221,12 +132,56 @@ export default function (providerContext: FtrProviderContext) {
});
});
+ describe('CIS_GCP Organization Credentials File', () => {
+ it('CIS_GCP Organization Credentials File workflow', async () => {
+ const projectName = 'PRJ_NAME_TEST';
+ const credentialFileName = 'CRED_FILE_TEST_NAME';
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName);
+ await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect(
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) ===
+ credentialFileName
+ ).to.be(true);
+ });
+ });
+
+ describe('CIS_GCP Organization Credentials JSON', () => {
+ it('CIS_GCP Organization Credentials JSON workflow', async () => {
+ const projectName = 'PRJ_NAME_TEST';
+ const credentialJsonName = 'CRED_JSON_TEST_NAME';
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName);
+ await cisIntegration.chooseDropDown(
+ CREDENTIALS_TYPE_TEST_ID,
+ 'credentials_json_option_test_id'
+ );
+ await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect(
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) ===
+ credentialJsonName
+ ).to.be(true);
+ });
+ });
+
describe('CIS_GCP Single', () => {
it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are no Project ID, it should use default value', async () => {
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false)) === true).to.be(
true
@@ -234,11 +189,11 @@ export default function (providerContext: FtrProviderContext) {
});
it('Post Installation Google Cloud Shell modal pops up after user clicks on Save button when adding integration, when there are Project ID, it should use that value', async () => {
const projectName = 'PRJ_NAME_TEST';
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
- await cisIntegrationGcp.fillInTextField('project_id_test_id', projectName);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID);
+ await cisIntegration.fillInTextField('project_id_test_id', projectName);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
expect(
(await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false, '', projectName)) ===
@@ -248,8 +203,8 @@ export default function (providerContext: FtrProviderContext) {
it('Add Agent FLyout - Organization ID field on cloud shell command should only be shown if user chose Google Cloud Shell, if user chose Single Account it shouldn not show up', async () => {
await cisIntegration.navigateToIntegrationCspList();
await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
- expect(await cisIntegrationGcp.doesStringExistInCodeBlock('PRJ_NAME_TEST')).to.be(true);
- expect(await cisIntegrationGcp.doesStringExistInCodeBlock('ORG_ID=ORG_NAME_TEST')).to.be(
+ expect(await cisIntegration.doesStringExistInCodeBlock('PRJ_NAME_TEST')).to.be(true);
+ expect(await cisIntegration.doesStringExistInCodeBlock('ORG_ID=ORG_NAME_TEST')).to.be(
false
);
});
@@ -258,27 +213,27 @@ export default function (providerContext: FtrProviderContext) {
await cisIntegration.clickFirstElementOnIntegrationTableAddAgent();
expect(
(
- await cisIntegrationGcp.getFieldValueInAddAgentFlyout(
+ await cisIntegration.getFieldValueInAddAgentFlyout(
'launchGoogleCloudShellButtonAgentFlyoutTestId',
'href'
)
- ).includes('https://shell.cloud.google.com/cloudshell/')
+ )?.includes('https://shell.cloud.google.com/cloudshell/')
).to.be(true);
});
it('Users are able to add CIS_GCP Integration with Manual settings using Credentials File', async () => {
const projectName = 'PRJ_NAME_TEST';
const credentialFileName = 'CRED_FILE_TEST_NAME';
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_MANUAL_TEST_ID);
- await cisIntegrationGcp.fillInTextField(PRJ_ID_TEST_ID, projectName);
- await cisIntegrationGcp.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName);
+ await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
- expect((await cisIntegrationGcp.getPostInstallModal()) !== undefined).to.be(true);
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
await cisIntegration.navigateToIntegrationCspList();
expect(
- (await cisIntegrationGcp.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) ===
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) ===
credentialFileName
).to.be(true);
});
@@ -286,37 +241,37 @@ export default function (providerContext: FtrProviderContext) {
const credentialJsonName = 'CRED_JSON_TEST_NAME';
await cisIntegration.navigateToIntegrationCspList();
await cisIntegration.clickFirstElementOnIntegrationTable();
- await cisIntegrationGcp.chooseDropDown(
+ await cisIntegration.chooseDropDown(
CREDENTIALS_TYPE_TEST_ID,
'credentials_json_option_test_id'
);
- await cisIntegrationGcp.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName);
- await cisIntegrationGcp.clickSaveIntegrationButton();
+ await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName);
+ await cisIntegration.clickSaveIntegrationButton();
pageObjects.header.waitUntilLoadingHasFinished();
await cisIntegration.navigateToIntegrationCspList();
expect(
- (await cisIntegrationGcp.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) ===
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) ===
credentialJsonName
).to.be(true);
});
it('Users are able to add CIS_GCP Integration with Manual settings using Credentials JSON', async () => {
const projectName = 'PRJ_NAME_TEST';
const credentialJsonName = 'CRED_JSON_TEST_NAME';
- await cisIntegrationGcp.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
- await cisIntegrationGcp.clickOptionButton(GCP_MANUAL_TEST_ID);
- await cisIntegrationGcp.fillInTextField(PRJ_ID_TEST_ID, projectName);
- await cisIntegrationGcp.chooseDropDown(
+ await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID);
+ await cisIntegration.clickOptionButton(GCP_MANUAL_TEST_ID);
+ await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName);
+ await cisIntegration.chooseDropDown(
CREDENTIALS_TYPE_TEST_ID,
'credentials_json_option_test_id'
);
- await cisIntegrationGcp.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName);
- await cisIntegrationGcp.clickSaveButton();
+ await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName);
+ await cisIntegration.clickSaveButton();
pageObjects.header.waitUntilLoadingHasFinished();
- expect((await cisIntegrationGcp.getPostInstallModal()) !== undefined).to.be(true);
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
await cisIntegration.navigateToIntegrationCspList();
expect(
- (await cisIntegrationGcp.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) ===
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) ===
credentialJsonName
).to.be(true);
});
@@ -324,16 +279,16 @@ export default function (providerContext: FtrProviderContext) {
const credentialFileName = 'CRED_FILE_TEST_NAME';
await cisIntegration.navigateToIntegrationCspList();
await cisIntegration.clickFirstElementOnIntegrationTable();
- await cisIntegrationGcp.chooseDropDown(
+ await cisIntegration.chooseDropDown(
CREDENTIALS_TYPE_TEST_ID,
'credentials_file_option_test_id'
);
- await cisIntegrationGcp.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName);
- await cisIntegrationGcp.clickSaveIntegrationButton();
+ await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName);
+ await cisIntegration.clickSaveIntegrationButton();
pageObjects.header.waitUntilLoadingHasFinished();
await cisIntegration.navigateToIntegrationCspList();
expect(
- (await cisIntegrationGcp.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) ===
+ (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) ===
credentialFileName
).to.be(true);
});
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts
new file mode 100644
index 0000000000000..db0778831964f
--- /dev/null
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts
@@ -0,0 +1,139 @@
+/*
+ * 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 expect from '@kbn/expect';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
+
+const CIS_EKS_OPTION_TEST_ID = 'cisEksTestId';
+const EKS_DIRECT_ACCESS_TEST_ID = 'directAccessKeyTestId';
+const EKS_TEMPORARY_KEYS_TEST_ID = 'temporaryKeyTestId';
+const EKS_SHARED_CREDENTIAL_TEST_ID = 'sharedCredentialsTestId';
+const ROLE_ARN_TEST_ID = 'roleArnInput';
+const DIRECT_ACCESS_KEY_ID_TEST_ID = 'directAccessKeyId';
+const DIRECT_ACCESS_SECRET_KEY_TEST_ID = 'passwordInput-secret-access-key';
+const TEMP_ACCESS_KEY_ID_TEST_ID = 'temporaryKeysAccessKeyId';
+const TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID = 'passwordInput-secret-access-key';
+const TEMP_ACCESS_SESSION_TOKEN_TEST_ID = 'temporaryKeysSessionToken';
+const SHARED_CREDENTIALS_FILE_TEST_ID = 'sharedCredentialFile';
+const SHARED_CREDETIALS_PROFILE_NAME_TEST_ID = 'credentialProfileName';
+
+// eslint-disable-next-line import/no-default-export
+export default function (providerContext: FtrProviderContext) {
+ const { getPageObjects } = providerContext;
+ const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
+
+ describe('Test adding Cloud Security Posture Integrations KSPM EKS', function () {
+ this.tags(['cloud_security_posture_cis_integration_kspm_eks']);
+ let cisIntegration: typeof pageObjects.cisAddIntegration;
+
+ beforeEach(async () => {
+ cisIntegration = pageObjects.cisAddIntegration;
+ await cisIntegration.navigateToAddIntegrationKspmPage();
+ });
+
+ describe('KSPM EKS Assume Role', async () => {
+ it('KSPM EKS Assume Role workflow', async () => {
+ const roleArn = 'RoleArnTestValue';
+ await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID);
+ await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn);
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be(
+ true
+ );
+ });
+ });
+
+ describe('KSPM EKS Direct Access', async () => {
+ it('KSPM EKS Direct Access Workflow', async () => {
+ const directAccessKeyId = 'directAccessKeyIdTest';
+ const directAccessSecretKey = 'directAccessSecretKeyTest';
+ await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(EKS_DIRECT_ACCESS_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId);
+ await cisIntegration.fillInTextField(
+ DIRECT_ACCESS_SECRET_KEY_TEST_ID,
+ directAccessSecretKey
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ expect(
+ (await cisIntegration.getFieldValueInEditPage(DIRECT_ACCESS_KEY_ID_TEST_ID)) ===
+ directAccessKeyId
+ ).to.be(true);
+ });
+ });
+
+ describe('KSPM EKS Temporary Keys', () => {
+ it('KSPM EKS Temporary Keys Workflow', async () => {
+ const accessKeyId = 'accessKeyIdTest';
+ const accessKeySecretKey = 'accessKeySecretKeyTest';
+ const tempAccessSessionToken = 'tempAccessSessionTokenTest';
+ await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(EKS_TEMPORARY_KEYS_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId);
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID,
+ accessKeySecretKey
+ );
+ await cisIntegration.fillInTextField(
+ TEMP_ACCESS_SESSION_TOKEN_TEST_ID,
+ tempAccessSessionToken
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_KEY_ID_TEST_ID)) === accessKeyId
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(TEMP_ACCESS_SESSION_TOKEN_TEST_ID)) ===
+ tempAccessSessionToken
+ ).to.be(true);
+ });
+ });
+
+ describe('KSPM EKS Shared Credentials', () => {
+ it('KSPM EKS Shared Credentials Workflow', async () => {
+ const sharedCredentialFile = 'sharedCredentialFileTest';
+ const sharedCredentialProfileName = 'sharedCredentialProfileNameTest';
+ await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.clickOptionButton(EKS_SHARED_CREDENTIAL_TEST_ID);
+ pageObjects.header.waitUntilLoadingHasFinished();
+ await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile);
+ await cisIntegration.fillInTextField(
+ SHARED_CREDETIALS_PROFILE_NAME_TEST_ID,
+ sharedCredentialProfileName
+ );
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDENTIALS_FILE_TEST_ID)) ===
+ sharedCredentialFile
+ ).to.be(true);
+ expect(
+ (await cisIntegration.getValueInEditPage(SHARED_CREDETIALS_PROFILE_NAME_TEST_ID)) ===
+ sharedCredentialProfileName
+ ).to.be(true);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts
new file mode 100644
index 0000000000000..ae2ede4046d11
--- /dev/null
+++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts
@@ -0,0 +1,38 @@
+/*
+ * 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 expect from '@kbn/expect';
+import type { FtrProviderContext } from '../../../ftr_provider_context';
+
+// eslint-disable-next-line import/no-default-export
+export default function (providerContext: FtrProviderContext) {
+ const { getPageObjects } = providerContext;
+ const pageObjects = getPageObjects(['cloudPostureDashboard', 'cisAddIntegration', 'header']);
+
+ describe('Test adding Cloud Security Posture Integrations KSPM K8S', function () {
+ this.tags(['cloud_security_posture_cis_integration_kspm_k8s']);
+ let cisIntegration: typeof pageObjects.cisAddIntegration;
+
+ beforeEach(async () => {
+ cisIntegration = pageObjects.cisAddIntegration;
+ await cisIntegration.navigateToAddIntegrationKspmPage();
+ });
+
+ describe('KSPM K8S', () => {
+ it('KSPM K8S Workflow', async () => {
+ await cisIntegration.clickSaveButton();
+ pageObjects.header.waitUntilLoadingHasFinished();
+ expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true);
+ await cisIntegration.navigateToIntegrationCspList();
+ await cisIntegration.clickFirstElementOnIntegrationTable();
+ expect(
+ (await cisIntegration.isOptionChecked('cisK8sTestId', 'cloudbeat/cis_k8s')) === 'true'
+ ).to.be(true);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/cloud_security_posture_functional/pages/index.ts b/x-pack/test/cloud_security_posture_functional/pages/index.ts
index 8dee827be154f..a1f9177f05c08 100644
--- a/x-pack/test/cloud_security_posture_functional/pages/index.ts
+++ b/x-pack/test/cloud_security_posture_functional/pages/index.ts
@@ -17,7 +17,12 @@ export default function ({ loadTestFile }: FtrProviderContext) {
loadTestFile(require.resolve('./findings_alerts'));
loadTestFile(require.resolve('./compliance_dashboard'));
loadTestFile(require.resolve('./vulnerability_dashboard'));
- loadTestFile(require.resolve('./cis_integration'));
+ loadTestFile(require.resolve('./cis_integrations/cnvm/cis_integration_cnvm'));
+ loadTestFile(require.resolve('./cis_integrations/cspm/cis_integration_aws'));
+ loadTestFile(require.resolve('./cis_integrations/cspm/cis_integration_gcp'));
+ loadTestFile(require.resolve('./cis_integrations/cspm/cis_integration_azure'));
+ loadTestFile(require.resolve('./cis_integrations/kspm/cis_integration_k8s'));
+ loadTestFile(require.resolve('./cis_integrations/kspm/cis_integration_eks'));
loadTestFile(require.resolve('./findings_old_data'));
loadTestFile(require.resolve('./vulnerabilities'));
loadTestFile(require.resolve('./vulnerabilities_grouping'));
From 8eefa842badc7a7846a85946d99e8330bf87d31b Mon Sep 17 00:00:00 2001
From: Dima Arnautov
Date: Tue, 23 Apr 2024 17:13:47 +0200
Subject: [PATCH 078/183] [Embeddable Rebuild] [Embeddable Rebuild] Provide
`executionContext` as part of the Dashboard parent API (#180904)
## Summary
Closes https://github.com/elastic/kibana/issues/180055
Provides Kibana execution context as part of the Dashboard parent API.
### Checklist
- [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
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../presentation_publishing/index.ts | 4 ++++
.../interfaces/has_execution_context.ts | 21 +++++++++++++++++++
.../presentation_publishing/tsconfig.json | 1 +
.../common/dashboard_container/types.ts | 2 +-
.../dashboard/public/dashboard_constants.ts | 3 +++
.../embeddable/dashboard_container.tsx | 4 ++++
src/plugins/dashboard/public/mocks.tsx | 3 +++
.../react_embeddable_registry.ts | 2 +-
.../cases/anomaly_swim_lane_attachment.tsx | 9 +++++++-
...omaly_swimlane_embeddable_factory.test.tsx | 6 ++++++
.../anomaly_swimlane_embeddable_factory.tsx | 13 +++++++++---
11 files changed, 62 insertions(+), 6 deletions(-)
create mode 100644 packages/presentation/presentation_publishing/interfaces/has_execution_context.ts
diff --git a/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts
index a71a4083f35ea..167c15a826d08 100644
--- a/packages/presentation/presentation_publishing/index.ts
+++ b/packages/presentation/presentation_publishing/index.ts
@@ -59,6 +59,10 @@ export {
type HasTypeDisplayName,
} from './interfaces/has_type';
export { apiHasUniqueId, type HasUniqueId } from './interfaces/has_uuid';
+export {
+ apiHasExecutionContext,
+ type HasExecutionContext,
+} from './interfaces/has_execution_context';
export {
apiPublishesBlockingError,
type PublishesBlockingError,
diff --git a/packages/presentation/presentation_publishing/interfaces/has_execution_context.ts b/packages/presentation/presentation_publishing/interfaces/has_execution_context.ts
new file mode 100644
index 0000000000000..8aa4d633e1a0e
--- /dev/null
+++ b/packages/presentation/presentation_publishing/interfaces/has_execution_context.ts
@@ -0,0 +1,21 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { KibanaExecutionContext } from '@kbn/core-execution-context-common';
+
+export interface HasExecutionContext {
+ executionContext: KibanaExecutionContext;
+}
+
+export const apiHasExecutionContext = (
+ unknownApi: null | unknown
+): unknownApi is HasExecutionContext => {
+ return Boolean(
+ unknownApi && typeof unknownApi === 'object' && unknownApi.hasOwnProperty('executionContext')
+ );
+};
diff --git a/packages/presentation/presentation_publishing/tsconfig.json b/packages/presentation/presentation_publishing/tsconfig.json
index fb568596b980f..6d98f0d821401 100644
--- a/packages/presentation/presentation_publishing/tsconfig.json
+++ b/packages/presentation/presentation_publishing/tsconfig.json
@@ -10,5 +10,6 @@
"@kbn/es-query",
"@kbn/data-views-plugin",
"@kbn/expressions-plugin",
+ "@kbn/core-execution-context-common",
]
}
diff --git a/src/plugins/dashboard/common/dashboard_container/types.ts b/src/plugins/dashboard/common/dashboard_container/types.ts
index 1497f7c08bb33..f25d8bb026bc8 100644
--- a/src/plugins/dashboard/common/dashboard_container/types.ts
+++ b/src/plugins/dashboard/common/dashboard_container/types.ts
@@ -54,7 +54,7 @@ export interface DashboardContainerInput extends EmbeddableInput {
viewMode: ViewMode;
description?: string;
isEmbeddedExternally?: boolean;
- executionContext?: KibanaExecutionContext;
+ executionContext: KibanaExecutionContext;
// dashboard options: TODO, build a new system to avoid all shared state appearing here. See https://github.com/elastic/kibana/issues/144532 for more information.
hidePanelTitles: DashboardOptions['hidePanelTitles'];
diff --git a/src/plugins/dashboard/public/dashboard_constants.ts b/src/plugins/dashboard/public/dashboard_constants.ts
index 793923d203d04..965ee67355c58 100644
--- a/src/plugins/dashboard/public/dashboard_constants.ts
+++ b/src/plugins/dashboard/public/dashboard_constants.ts
@@ -85,6 +85,9 @@ export const DEFAULT_DASHBOARD_INPUT: Omit = {
panels: {},
title: '',
tags: [],
+ executionContext: {
+ type: 'dashboard',
+ },
// options
useMargins: true,
diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx
index f264aaa544ac7..190462d69a2df 100644
--- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx
+++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx
@@ -148,6 +148,8 @@ export class DashboardContainer
public timeslice$: BehaviorSubject<[number, number] | undefined>;
public locator?: Pick, 'navigate' | 'getRedirectUrl'>;
+ public readonly executionContext: KibanaExecutionContext;
+
// cleanup
public stopSyncingWithUnifiedSearch?: () => void;
private cleanupStateTools: () => void;
@@ -295,6 +297,8 @@ export class DashboardContainer
string | undefined,
DashboardContainerInput
>(this.publishingSubscription, this, 'lastReloadRequestTime');
+
+ this.executionContext = initialInput.executionContext;
}
public getAppContext() {
diff --git a/src/plugins/dashboard/public/mocks.tsx b/src/plugins/dashboard/public/mocks.tsx
index b160471d20f09..d447015b2b1a6 100644
--- a/src/plugins/dashboard/public/mocks.tsx
+++ b/src/plugins/dashboard/public/mocks.tsx
@@ -119,6 +119,9 @@ export function getSampleDashboardInput(
timeRestore: false,
viewMode: ViewMode.VIEW,
panels: {},
+ executionContext: {
+ type: 'dashboard',
+ },
...overrides,
};
}
diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts
index 481be8b5b5bb8..5cd245ca074cc 100644
--- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts
+++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts
@@ -28,7 +28,7 @@ export const registerReactEmbeddableFactory = <
if (registry[type] !== undefined)
throw new Error(
i18n.translate('embeddableApi.reactEmbeddable.factoryAlreadyExistsError', {
- defaultMessage: 'An embeddable factory for for type: {key} is already registered.',
+ defaultMessage: 'An embeddable factory for type: {key} is already registered.',
values: { key: type },
})
);
diff --git a/x-pack/plugins/ml/public/cases/anomaly_swim_lane_attachment.tsx b/x-pack/plugins/ml/public/cases/anomaly_swim_lane_attachment.tsx
index 8b28b895410b8..5a0429725eb79 100644
--- a/x-pack/plugins/ml/public/cases/anomaly_swim_lane_attachment.tsx
+++ b/x-pack/plugins/ml/public/cases/anomaly_swim_lane_attachment.tsx
@@ -23,7 +23,7 @@ import type {
export const initComponent = memoize((fieldFormats: FieldFormatsStart) => {
return React.memo(
(props: PersistableStateAttachmentViewProps) => {
- const { persistableStateAttachmentState } = props;
+ const { persistableStateAttachmentState, caseData } = props;
const dataFormatter = fieldFormats.deserialize({
id: FIELD_FORMAT_IDS.DATE,
@@ -89,6 +89,13 @@ export const initComponent = memoize((fieldFormats: FieldFormatsStart) => {
state={{
rawState: inputProps,
}}
+ parentApi={{
+ executionContext: {
+ type: 'cases',
+ description: caseData.title,
+ id: caseData.id,
+ },
+ }}
/>
>
);
diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx
index 232f5a562acd8..d58e1f00ca235 100644
--- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx
+++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx
@@ -105,6 +105,12 @@ describe('getAnomalySwimLaneEmbeddableFactory', () => {
rawState,
}}
onApiAvailable={onApiAvailable}
+ parentApi={{
+ executionContext: {
+ type: 'dashboard',
+ id: 'dashboard-id',
+ },
+ }}
/>
);
diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx
index f569f93752c35..665e0b99ddd72 100644
--- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx
+++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx
@@ -14,6 +14,7 @@ import { FormattedMessage } from '@kbn/i18n-react';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { useTimeBuckets } from '@kbn/ml-time-buckets';
import {
+ apiHasExecutionContext,
apiHasParentApi,
apiPublishesTimeRange,
initializeTimeRange,
@@ -90,6 +91,10 @@ export const getAnomalySwimLaneEmbeddableFactory = (
return state.rawState as AnomalySwimLaneEmbeddableState;
},
buildEmbeddable: async (state, buildApi, uuid, parentApi) => {
+ if (!apiHasExecutionContext(parentApi)) {
+ throw new Error('Parent API does not have execution context');
+ }
+
const services = await getServices(getStartServices);
const [coreStartServices, pluginsStartServices, anomalySwimLaneServices] = services;
@@ -211,11 +216,13 @@ export const getAnomalySwimLaneEmbeddableFactory = (
const I18nContext = i18n.Context;
const timeBuckets = useTimeBuckets(uiSettings);
+ if (!apiHasExecutionContext(parentApi)) {
+ throw new Error('Parent API does not have execution context');
+ }
+
useReactEmbeddableExecutionContext(
services[0].executionContext,
- // TODO https://github.com/elastic/kibana/issues/180055
- // @ts-ignore
- parentApi?.executionContext?.value ?? { name: 'dashboard' },
+ parentApi.executionContext,
ANOMALY_SWIMLANE_EMBEDDABLE_TYPE,
uuid
);
From 22dd9f86f4967b85af9857a46fde165205358927 Mon Sep 17 00:00:00 2001
From: Davis McPhee
Date: Tue, 23 Apr 2024 12:39:32 -0300
Subject: [PATCH 079/183] [Discover] Remove Discover customization profiles
(#181259)
## Summary
This PR removes the current Discover customization profile system from
the codebase while leaving the remainder of the customization framework
unaffected.
Testing notes:
- Discover should be unaffected by these changes.
- Logs Explorer should be unaffected by these changes.
- The Timeline ES|QL tab should be unaffected by these changes.
- The `discover_customization_examples` plugin has been migrated from
using a customization profile to using the `DiscoverContainer` component
to embed Discover within its own page, as is done for Logs Explorer and
Timeline.
Resolves #181355.
### Checklist
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.../kibana.jsonc | 9 +-
.../public/plugin.tsx | 718 +++++++++---------
.../tsconfig.json | 4 +
.../discover/common/app_locator.test.ts | 8 -
src/plugins/discover/common/app_locator.ts | 14 +-
.../discover/common/customizations/index.ts | 9 -
.../common/customizations/utils.test.ts | 73 --
.../discover/common/customizations/utils.ts | 27 -
.../context/services/locator.test.ts | 13 -
.../application/context/services/locator.ts | 10 +-
.../application/discover_router.test.tsx | 198 +----
.../public/application/discover_router.tsx | 114 +--
.../public/application/doc/locator.test.ts | 14 -
.../public/application/doc/locator.ts | 10 +-
.../discover/public/application/index.tsx | 4 -
.../application/main/discover_main_route.tsx | 4 +-
.../application/main/hooks/use_url.test.ts | 5 -
.../public/application/main/hooks/use_url.ts | 5 +-
.../discover_container.test.tsx | 7 +-
.../discover_container/discover_container.tsx | 28 +-
.../profile_aware_locator.test.ts | 141 ----
.../customizations/profile_aware_locator.ts | 90 ---
.../customizations/profile_registry.test.ts | 134 ----
.../public/customizations/profile_registry.ts | 73 --
.../discover/public/customizations/types.ts | 19 -
src/plugins/discover/public/index.ts | 3 -
src/plugins/discover/public/mocks.tsx | 1 -
src/plugins/discover/public/plugin.tsx | 81 +-
.../discover/public/utils/breadcrumbs.test.ts | 18 -
.../discover/public/utils/breadcrumbs.ts | 17 +-
src/plugins/discover/tsconfig.json | 1 -
.../customizations.ts | 2 +
.../customizations.ts | 2 +
33 files changed, 476 insertions(+), 1380 deletions(-)
delete mode 100644 src/plugins/discover/common/customizations/index.ts
delete mode 100644 src/plugins/discover/common/customizations/utils.test.ts
delete mode 100644 src/plugins/discover/common/customizations/utils.ts
delete mode 100644 src/plugins/discover/public/customizations/profile_aware_locator.test.ts
delete mode 100644 src/plugins/discover/public/customizations/profile_aware_locator.ts
delete mode 100644 src/plugins/discover/public/customizations/profile_registry.test.ts
delete mode 100644 src/plugins/discover/public/customizations/profile_registry.ts
diff --git a/examples/discover_customization_examples/kibana.jsonc b/examples/discover_customization_examples/kibana.jsonc
index 5f76acaa9b287..42f4882935688 100644
--- a/examples/discover_customization_examples/kibana.jsonc
+++ b/examples/discover_customization_examples/kibana.jsonc
@@ -6,6 +6,13 @@
"id": "discoverCustomizationExamples",
"server": false,
"browser": true,
- "requiredPlugins": ["controls", "developerExamples", "discover", "embeddable", "kibanaUtils"]
+ "requiredPlugins": [
+ "controls",
+ "developerExamples",
+ "discover",
+ "embeddable",
+ "kibanaUtils",
+ "data"
+ ]
}
}
diff --git a/examples/discover_customization_examples/public/plugin.tsx b/examples/discover_customization_examples/public/plugin.tsx
index 22d2145d9917b..f4cc4a8bc1a1e 100644
--- a/examples/discover_customization_examples/public/plugin.tsx
+++ b/examples/discover_customization_examples/public/plugin.tsx
@@ -16,8 +16,11 @@ import {
} from '@elastic/eui';
import { CoreSetup, CoreStart, Plugin, SimpleSavedObject } from '@kbn/core/public';
import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public';
-import type { DiscoverSetup, DiscoverStart } from '@kbn/discover-plugin/public';
-import { noop } from 'lodash';
+import type {
+ CustomizationCallback,
+ DiscoverSetup,
+ DiscoverStart,
+} from '@kbn/discover-plugin/public';
import React, { useEffect, useState } from 'react';
import ReactDOM from 'react-dom';
import useObservable from 'react-use/lib/useObservable';
@@ -25,6 +28,10 @@ import { AwaitingControlGroupAPI, ControlGroupRenderer } from '@kbn/controls-plu
import { css } from '@emotion/react';
import { ViewMode } from '@kbn/embeddable-plugin/public';
import type { ControlsPanels } from '@kbn/controls-plugin/common';
+import { Route, Router, Routes } from '@kbn/shared-ux-router';
+import { I18nProvider } from '@kbn/i18n-react';
+import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme';
+import { DataPublicPluginStart } from '@kbn/data-plugin/public';
import image from './discover_customization_examples.png';
export interface DiscoverCustomizationExamplesSetupPlugins {
@@ -34,23 +41,54 @@ export interface DiscoverCustomizationExamplesSetupPlugins {
export interface DiscoverCustomizationExamplesStartPlugins {
discover: DiscoverStart;
+ data: DataPublicPluginStart;
}
const PLUGIN_ID = 'discoverCustomizationExamples';
const PLUGIN_NAME = 'Discover Customizations';
export class DiscoverCustomizationExamplesPlugin implements Plugin {
- setup(core: CoreSetup, plugins: DiscoverCustomizationExamplesSetupPlugins) {
+ private customizationCallback: CustomizationCallback = () => {};
+
+ setup(
+ core: CoreSetup,
+ plugins: DiscoverCustomizationExamplesSetupPlugins
+ ) {
core.application.register({
id: PLUGIN_ID,
title: PLUGIN_NAME,
visibleIn: [],
- mount() {
- plugins.discover?.locator?.navigate(
- { profile: 'customization-examples' },
- { replace: true }
+ mount: async (appMountParams) => {
+ const [_, { discover, data }] = await core.getStartServices();
+
+ ReactDOM.render(
+
+
+
+
+
+
+
+
+
+
+ ,
+ appMountParams.element
);
- return noop;
+
+ return () => {
+ // work around race condition between unmount effect and current app id
+ // observable in the search session service
+ data.search.session.clear();
+
+ ReactDOM.unmountComponentAtNode(appMountParams.element);
+ };
},
});
@@ -73,356 +111,352 @@ export class DiscoverCustomizationExamplesPlugin implements Plugin {
isOptionsOpen = false;
};
- discover.registerCustomizationProfile('customization-examples', {
- customize: async ({ customizations, stateContainer }) => {
- customizations.set({
- id: 'top_nav',
- defaultMenu: {
- newItem: { disabled: true },
- openItem: { disabled: true },
- shareItem: { order: 200 },
- alertsItem: { disabled: true },
- inspectItem: { disabled: true },
- saveItem: { order: 400 },
- },
- getMenuItems: () => [
- {
- data: {
- id: 'options',
- label: 'Options',
- iconType: 'arrowDown',
- iconSide: 'right',
- testId: 'customOptionsButton',
- run: (anchorElement: HTMLElement) => {
- if (isOptionsOpen) {
- closeOptionsPopover();
- return;
- }
+ this.customizationCallback = ({ customizations, stateContainer }) => {
+ customizations.set({
+ id: 'top_nav',
+ defaultMenu: {
+ newItem: { disabled: true },
+ openItem: { disabled: true },
+ shareItem: { order: 200 },
+ alertsItem: { disabled: true },
+ inspectItem: { disabled: true },
+ saveItem: { order: 400 },
+ },
+ getMenuItems: () => [
+ {
+ data: {
+ id: 'options',
+ label: 'Options',
+ iconType: 'arrowDown',
+ iconSide: 'right',
+ testId: 'customOptionsButton',
+ run: (anchorElement: HTMLElement) => {
+ if (isOptionsOpen) {
+ closeOptionsPopover();
+ return;
+ }
+
+ isOptionsOpen = true;
+ document.body.appendChild(optionsContainer);
+
+ const element = (
+
+ alert('Create new clicked'),
+ },
+ {
+ name: 'Make a copy',
+ icon: 'copy',
+ onClick: () => alert('Make a copy clicked'),
+ },
+ {
+ name: 'Manage saved searches',
+ icon: 'gear',
+ onClick: () => alert('Manage saved searches clicked'),
+ },
+ ],
+ },
+ ]}
+ data-test-subj="customOptionsPopover"
+ />
+
+ );
- isOptionsOpen = true;
- document.body.appendChild(optionsContainer);
-
- const element = (
-
- alert('Create new clicked'),
- },
- {
- name: 'Make a copy',
- icon: 'copy',
- onClick: () => alert('Make a copy clicked'),
- },
- {
- name: 'Manage saved searches',
- icon: 'gear',
- onClick: () => alert('Manage saved searches clicked'),
- },
- ],
- },
- ]}
- data-test-subj="customOptionsPopover"
- />
-
- );
-
- ReactDOM.render(element, optionsContainer);
- },
+ ReactDOM.render(element, optionsContainer);
+ },
+ },
+ order: 100,
+ },
+ {
+ data: {
+ id: 'documentExplorer',
+ label: 'Document explorer',
+ iconType: 'discoverApp',
+ testId: 'documentExplorerButton',
+ run: () => {
+ discover.locator?.navigate({});
},
- order: 100,
},
+ order: 300,
+ },
+ ],
+ getBadges: () => {
+ return [
{
data: {
- id: 'documentExplorer',
- label: 'Document explorer',
- iconType: 'discoverApp',
- testId: 'documentExplorerButton',
- run: () => {
- discover.locator?.navigate({});
- },
+ badgeText: 'Example badge',
+ color: 'warning',
},
- order: 300,
+ order: 10,
},
- ],
- getBadges: () => {
- return [
- {
- data: {
- badgeText: 'Example badge',
- color: 'warning',
- },
- order: 10,
- },
- ];
- },
- });
-
- customizations.set({
- id: 'search_bar',
- CustomDataViewPicker: () => {
- const [isPopoverOpen, setIsPopoverOpen] = useState(false);
- const togglePopover = () => setIsPopoverOpen((open) => !open);
- const closePopover = () => setIsPopoverOpen(false);
- const [savedSearches, setSavedSearches] = useState<
- Array>
- >([]);
-
- useEffect(() => {
- core.savedObjects.client
- .find<{ title: string }>({ type: 'search' })
- .then((response) => {
- setSavedSearches(response.savedObjects);
- });
- }, []);
-
- const currentSavedSearch = useObservable(
- stateContainer.savedSearchState.getCurrent$(),
- stateContainer.savedSearchState.getState()
- );
-
- return (
-
-
- {currentSavedSearch.title ?? 'None selected'}
-
- }
- isOpen={isPopoverOpen}
- panelPaddingSize="none"
- closePopover={closePopover}
- >
- ({
- name: savedSearch.get('title'),
- onClick: () => stateContainer.actions.onOpenSavedSearch(savedSearch.id),
- icon: savedSearch.id === currentSavedSearch.id ? 'check' : 'empty',
- 'data-test-subj': `logsViewSelectorOption-${savedSearch.attributes.title.replace(
- /[^a-zA-Z0-9]/g,
- ''
- )}`,
- })),
- },
- ]}
- />
-
-
- );
- },
- });
-
- customizations.set({
- id: 'search_bar',
- CustomDataViewPicker: () => {
- const [isPopoverOpen, setIsPopoverOpen] = useState(false);
- const togglePopover = () => setIsPopoverOpen((open) => !open);
- const closePopover = () => setIsPopoverOpen(false);
- const [savedSearches, setSavedSearches] = useState<
- Array>
- >([]);
-
- useEffect(() => {
- core.savedObjects.client
- .find<{ title: string }>({ type: 'search' })
- .then((response) => {
- setSavedSearches(response.savedObjects);
- });
- }, []);
-
- const currentSavedSearch = useObservable(
- stateContainer.savedSearchState.getCurrent$(),
- stateContainer.savedSearchState.getState()
- );
-
- return (
-
-
- {currentSavedSearch.title ?? 'None selected'}
-
- }
- isOpen={isPopoverOpen}
- panelPaddingSize="none"
- closePopover={closePopover}
- >
- ({
- name: savedSearch.get('title'),
- onClick: () => stateContainer.actions.onOpenSavedSearch(savedSearch.id),
- icon: savedSearch.id === currentSavedSearch.id ? 'check' : 'empty',
- 'data-test-subj': `logsViewSelectorOption-${savedSearch.attributes.title.replace(
- /[^a-zA-Z0-9]/g,
- ''
- )}`,
- })),
- },
- ]}
- />
-
-
- );
- },
- PrependFilterBar: () => {
- const [controlGroupAPI, setControlGroupAPI] = useState();
- const stateStorage = stateContainer.stateStorage;
- const dataView = useObservable(
- stateContainer.internalState.state$,
- stateContainer.internalState.getState()
- ).dataView;
-
- useEffect(() => {
- if (!controlGroupAPI) {
- return;
- }
-
- const stateSubscription = stateStorage
- .change$('controlPanels')
- .subscribe((panels) =>
- controlGroupAPI.updateInput({ panels: panels ?? undefined })
- );
-
- const inputSubscription = controlGroupAPI.getInput$().subscribe((input) => {
- if (input && input.panels) stateStorage.set('controlPanels', input.panels);
+ ];
+ },
+ });
+
+ customizations.set({
+ id: 'search_bar',
+ CustomDataViewPicker: () => {
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
+ const togglePopover = () => setIsPopoverOpen((open) => !open);
+ const closePopover = () => setIsPopoverOpen(false);
+ const [savedSearches, setSavedSearches] = useState<
+ Array>
+ >([]);
+
+ useEffect(() => {
+ core.savedObjects.client
+ .find<{ title: string }>({ type: 'search' })
+ .then((response) => {
+ setSavedSearches(response.savedObjects);
});
-
- const filterSubscription = controlGroupAPI.onFiltersPublished$.subscribe(
- (newFilters) => {
- stateContainer.internalState.transitions.setCustomFilters(newFilters);
- stateContainer.actions.fetchData();
+ }, []);
+
+ const currentSavedSearch = useObservable(
+ stateContainer.savedSearchState.getCurrent$(),
+ stateContainer.savedSearchState.getState()
+ );
+
+ return (
+
+
+ {currentSavedSearch.title ?? 'None selected'}
+
+ }
+ isOpen={isPopoverOpen}
+ panelPaddingSize="none"
+ closePopover={closePopover}
+ >
+ ({
+ name: savedSearch.get('title'),
+ onClick: () => stateContainer.actions.onOpenSavedSearch(savedSearch.id),
+ icon: savedSearch.id === currentSavedSearch.id ? 'check' : 'empty',
+ 'data-test-subj': `logsViewSelectorOption-${savedSearch.attributes.title.replace(
+ /[^a-zA-Z0-9]/g,
+ ''
+ )}`,
+ })),
+ },
+ ]}
+ />
+
+
+ );
+ },
+ });
+
+ customizations.set({
+ id: 'search_bar',
+ CustomDataViewPicker: () => {
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
+ const togglePopover = () => setIsPopoverOpen((open) => !open);
+ const closePopover = () => setIsPopoverOpen(false);
+ const [savedSearches, setSavedSearches] = useState<
+ Array>
+ >([]);
+
+ useEffect(() => {
+ core.savedObjects.client
+ .find<{ title: string }>({ type: 'search' })
+ .then((response) => {
+ setSavedSearches(response.savedObjects);
+ });
+ }, []);
+
+ const currentSavedSearch = useObservable(
+ stateContainer.savedSearchState.getCurrent$(),
+ stateContainer.savedSearchState.getState()
+ );
+
+ return (
+
+
+ {currentSavedSearch.title ?? 'None selected'}
+
}
- );
+ isOpen={isPopoverOpen}
+ panelPaddingSize="none"
+ closePopover={closePopover}
+ >
+ ({
+ name: savedSearch.get('title'),
+ onClick: () => stateContainer.actions.onOpenSavedSearch(savedSearch.id),
+ icon: savedSearch.id === currentSavedSearch.id ? 'check' : 'empty',
+ 'data-test-subj': `logsViewSelectorOption-${savedSearch.attributes.title.replace(
+ /[^a-zA-Z0-9]/g,
+ ''
+ )}`,
+ })),
+ },
+ ]}
+ />
+
+
+ );
+ },
+ PrependFilterBar: () => {
+ const [controlGroupAPI, setControlGroupAPI] = useState();
+ const stateStorage = stateContainer.stateStorage;
+ const dataView = useObservable(
+ stateContainer.internalState.state$,
+ stateContainer.internalState.getState()
+ ).dataView;
+
+ useEffect(() => {
+ if (!controlGroupAPI) {
+ return;
+ }
- return () => {
- stateSubscription.unsubscribe();
- inputSubscription.unsubscribe();
- filterSubscription.unsubscribe();
- };
- }, [controlGroupAPI, stateStorage]);
+ const stateSubscription = stateStorage
+ .change$('controlPanels')
+ .subscribe((panels) => controlGroupAPI.updateInput({ panels: panels ?? undefined }));
- const fieldToFilterOn = dataView?.fields.filter((field) =>
- field.esTypes?.includes('keyword')
- )[0];
+ const inputSubscription = controlGroupAPI.getInput$().subscribe((input) => {
+ if (input && input.panels) stateStorage.set('controlPanels', input.panels);
+ });
- if (!fieldToFilterOn) {
- return null;
- }
+ const filterSubscription = controlGroupAPI.onFiltersPublished$.subscribe(
+ (newFilters) => {
+ stateContainer.internalState.transitions.setCustomFilters(newFilters);
+ stateContainer.actions.fetchData();
+ }
+ );
- return (
- {
+ stateSubscription.unsubscribe();
+ inputSubscription.unsubscribe();
+ filterSubscription.unsubscribe();
+ };
+ }, [controlGroupAPI, stateStorage]);
+
+ const fieldToFilterOn = dataView?.fields.filter((field) =>
+ field.esTypes?.includes('keyword')
+ )[0];
+
+ if (!fieldToFilterOn) {
+ return null;
+ }
+
+ return (
+
+ {
+ const panels = stateStorage.get('controlPanels');
+
+ if (!panels) {
+ await builder.addOptionsListControl(initialInput, {
+ dataViewId: dataView?.id!,
+ title: fieldToFilterOn.name.split('.')[0],
+ fieldName: fieldToFilterOn.name,
+ grow: false,
+ width: 'small',
+ });
}
- `}
- >
- {
- const panels = stateStorage.get('controlPanels');
-
- if (!panels) {
- await builder.addOptionsListControl(initialInput, {
- dataViewId: dataView?.id!,
- title: fieldToFilterOn.name.split('.')[0],
- fieldName: fieldToFilterOn.name,
- grow: false,
- width: 'small',
- });
- }
-
- return {
- initialInput: {
- ...initialInput,
- panels: panels ?? initialInput.panels,
- viewMode: ViewMode.VIEW,
- filters: stateContainer.appState.get().filters ?? [],
- },
- };
- }}
- />
-
- );
- },
- });
-
- customizations.set({
- id: 'flyout',
- size: '60%',
- title: 'Example custom flyout',
- actions: {
- getActionItems: () =>
- Array.from({ length: 5 }, (_, i) => {
- const index = i + 1;
- return {
- id: `action-item-${index}`,
- enabled: true,
- label: `Action ${index}`,
- iconType: ['faceHappy', 'faceNeutral', 'faceSad', 'infinity', 'bell'].at(
- i
- ) as IconType,
- dataTestSubj: `customActionItem${index}`,
- onClick: () => alert(index),
- };
- }),
- },
- });
- return () => {
- // eslint-disable-next-line no-console
- console.log('Cleaning up Logs explorer customizations');
- };
- },
- });
+ return {
+ initialInput: {
+ ...initialInput,
+ panels: panels ?? initialInput.panels,
+ viewMode: ViewMode.VIEW,
+ filters: stateContainer.appState.get().filters ?? [],
+ },
+ };
+ }}
+ />
+
+ );
+ },
+ });
+
+ customizations.set({
+ id: 'flyout',
+ size: '60%',
+ title: 'Example custom flyout',
+ actions: {
+ getActionItems: () =>
+ Array.from({ length: 5 }, (_, i) => {
+ const index = i + 1;
+ return {
+ id: `action-item-${index}`,
+ enabled: true,
+ label: `Action ${index}`,
+ iconType: ['faceHappy', 'faceNeutral', 'faceSad', 'infinity', 'bell'].at(
+ i
+ ) as IconType,
+ dataTestSubj: `customActionItem${index}`,
+ onClick: () => alert(index),
+ };
+ }),
+ },
+ });
+
+ return () => {
+ // eslint-disable-next-line no-console
+ console.log('Cleaning up Logs explorer customizations');
+ };
+ };
}
}
diff --git a/examples/discover_customization_examples/tsconfig.json b/examples/discover_customization_examples/tsconfig.json
index fee756f127064..c71a72086dde1 100644
--- a/examples/discover_customization_examples/tsconfig.json
+++ b/examples/discover_customization_examples/tsconfig.json
@@ -10,6 +10,10 @@
"@kbn/developer-examples-plugin",
"@kbn/controls-plugin",
"@kbn/embeddable-plugin",
+ "@kbn/shared-ux-router",
+ "@kbn/i18n-react",
+ "@kbn/react-kibana-context-theme",
+ "@kbn/data-plugin",
],
"exclude": ["target/**/*"]
}
diff --git a/src/plugins/discover/common/app_locator.test.ts b/src/plugins/discover/common/app_locator.test.ts
index fc8d33010aa91..78d0d32fd6ed2 100644
--- a/src/plugins/discover/common/app_locator.test.ts
+++ b/src/plugins/discover/common/app_locator.test.ts
@@ -15,7 +15,6 @@ import { mockStorage } from '@kbn/kibana-utils-plugin/public/storage/hashed_item
import { FilterStateStore } from '@kbn/es-query';
import { DiscoverAppLocatorDefinition } from './app_locator';
import { SerializableRecord } from '@kbn/utility-types';
-import { addProfile } from './customizations';
const dataViewId: string = 'c367b774-a4c2-11ea-bb37-0242ac130002';
const savedSearchId: string = '571aaf70-4c88-11e8-b3d7-01146121b73d';
@@ -58,13 +57,6 @@ describe('Discover url generator', () => {
expect(_g).toEqual(undefined);
});
- test('can specify profile', async () => {
- const { locator } = await setup();
- const { path } = await locator.getLocation({ profile: 'test', dataViewId: '123' });
-
- expect(path).toBe(`${addProfile('#/', 'test')}?_a=(index:'123')`);
- });
-
test('can specify specific data view', async () => {
const { locator } = await setup();
const { path } = await locator.getLocation({ dataViewId });
diff --git a/src/plugins/discover/common/app_locator.ts b/src/plugins/discover/common/app_locator.ts
index 9be9947e743dd..144f052c2a44d 100644
--- a/src/plugins/discover/common/app_locator.ts
+++ b/src/plugins/discover/common/app_locator.ts
@@ -14,7 +14,6 @@ import type { DiscoverGridSettings } from '@kbn/saved-search-plugin/common';
import { DataViewSpec } from '@kbn/data-views-plugin/common';
import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/common';
import { VIEW_MODE } from './constants';
-import { addProfile } from './customizations';
export const DISCOVER_APP_LOCATOR = 'DISCOVER_APP_LOCATOR';
@@ -106,10 +105,6 @@ export interface DiscoverAppLocatorParams extends SerializableRecord {
* Used when navigating to particular alert results
*/
isAlertResults?: boolean;
- /**
- * The Discover profile to use
- */
- profile?: string;
}
export type DiscoverAppLocator = LocatorPublic;
@@ -153,7 +148,6 @@ export class DiscoverAppLocatorDefinition implements LocatorDefinition {
- describe('addProfile', () => {
- it('should add profile to path', () => {
- expect(addProfile('/root', 'test')).toEqual('/root/p/test');
- });
-
- it('should add profile to path with trailing slash', () => {
- expect(addProfile('/root/', 'test')).toEqual('/root/p/test/');
- });
-
- it('should trim path', () => {
- expect(addProfile(' /root ', 'test')).toEqual('/root/p/test');
- });
-
- it('should work with empty path', () => {
- expect(addProfile('', 'test')).toEqual('/p/test');
- });
- });
-
- describe('getProfile', () => {
- it('should return profile from path', () => {
- expect(getProfile('/p/test/subpath')).toEqual({
- profile: 'test',
- isProfileRootPath: false,
- });
- });
-
- it('should return profile from path with trailing slash', () => {
- expect(getProfile('/p/test/subpath/')).toEqual({
- profile: 'test',
- isProfileRootPath: false,
- });
- });
-
- it('should return profile from root path', () => {
- expect(getProfile('/p/test')).toEqual({
- profile: 'test',
- isProfileRootPath: true,
- });
- });
-
- it('should return profile from root path with trailing slash', () => {
- expect(getProfile('/p/test/')).toEqual({
- profile: 'test',
- isProfileRootPath: true,
- });
- });
-
- it('should return undefined if profile is not in path', () => {
- expect(getProfile('/root')).toEqual({
- profile: undefined,
- isProfileRootPath: false,
- });
- });
-
- it('should return undefined if path is empty', () => {
- expect(getProfile('')).toEqual({
- profile: undefined,
- isProfileRootPath: false,
- });
- });
- });
-});
diff --git a/src/plugins/discover/common/customizations/utils.ts b/src/plugins/discover/common/customizations/utils.ts
deleted file mode 100644
index 4eeae7de6aad4..0000000000000
--- a/src/plugins/discover/common/customizations/utils.ts
+++ /dev/null
@@ -1,27 +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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { matchPath } from 'react-router-dom';
-
-export const addProfile = (path: string, profile: string) => {
- const trimmedPath = path.trim();
- const hasSlash = trimmedPath.endsWith('/');
-
- return `${trimmedPath}${hasSlash ? '' : '/'}p/${profile}${hasSlash ? '/' : ''}`;
-};
-
-export const getProfile = (path: string) => {
- const match = matchPath<{ profile?: string }>(path, {
- path: '/p/:profile',
- });
-
- return {
- profile: match?.params.profile,
- isProfileRootPath: match?.isExact ?? false,
- };
-};
diff --git a/src/plugins/discover/public/application/context/services/locator.test.ts b/src/plugins/discover/public/application/context/services/locator.test.ts
index ee9dfbb3b7d74..1a0b7060297c2 100644
--- a/src/plugins/discover/public/application/context/services/locator.test.ts
+++ b/src/plugins/discover/public/application/context/services/locator.test.ts
@@ -6,7 +6,6 @@
* Side Public License, v 1.
*/
-import { addProfile } from '../../../../common/customizations';
import { getStatesFromKbnUrl } from '@kbn/kibana-utils-plugin/public';
import { DiscoverContextAppLocatorDefinition } from './locator';
@@ -73,18 +72,6 @@ describe('Discover context url generator', () => {
expect(_g).toEqual({ filters: [] });
});
- test('can specify profile', async () => {
- const { locator } = await setup();
- const { path } = await locator.getLocation({
- profile: 'test',
- index: dataViewId,
- rowId: 'mock-row-id',
- referrer: 'mock-referrer',
- });
-
- expect(path).toBe(`${addProfile('#/', 'test')}context/${dataViewId}/mock-row-id`);
- });
-
test('when useHash set to false, sets data view ID in the generated URL', async () => {
const { locator } = await setup();
const { path } = await locator.getLocation({
diff --git a/src/plugins/discover/public/application/context/services/locator.ts b/src/plugins/discover/public/application/context/services/locator.ts
index 7f51d10b8fdbb..4f4d6673f7f4c 100644
--- a/src/plugins/discover/public/application/context/services/locator.ts
+++ b/src/plugins/discover/public/application/context/services/locator.ts
@@ -12,7 +12,6 @@ import type { GlobalQueryStateFromUrl } from '@kbn/data-plugin/public';
import type { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public';
import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/public';
import type { DataViewSpec } from '@kbn/data-views-plugin/public';
-import { addProfile } from '../../../../common/customizations';
export const DISCOVER_CONTEXT_APP_LOCATOR = 'DISCOVER_CONTEXT_APP_LOCATOR';
@@ -22,7 +21,6 @@ export interface DiscoverContextAppLocatorParams extends SerializableRecord {
columns?: string[];
filters?: Filter[];
referrer: string; // discover main view url
- profile?: string;
}
export type DiscoverContextAppLocator = LocatorPublic;
@@ -65,13 +63,7 @@ export class DiscoverContextAppLocatorDefinition
dataViewId = index;
}
- let path = '#/';
-
- if (params.profile) {
- path = addProfile(path, params.profile);
- }
-
- path = `${path}context/${dataViewId}/${encodeURIComponent(rowId)}`;
+ let path = `#/context/${dataViewId}/${encodeURIComponent(rowId)}`;
if (Object.keys(queryState).length) {
path = setStateToKbnUrl('_g', queryState, { useHash }, path);
diff --git a/src/plugins/discover/public/application/discover_router.test.tsx b/src/plugins/discover/public/application/discover_router.test.tsx
index 5fb68bb9f2e99..a5133be1b764a 100644
--- a/src/plugins/discover/public/application/discover_router.test.tsx
+++ b/src/plugins/discover/public/application/discover_router.test.tsx
@@ -11,29 +11,12 @@ import { Redirect, RouteProps } from 'react-router-dom';
import { Route } from '@kbn/shared-ux-router';
import { createSearchSessionMock } from '../__mocks__/search_session';
import { discoverServiceMock as mockDiscoverServices } from '../__mocks__/services';
-import {
- CustomDiscoverRoutes,
- DiscoverRouter,
- DiscoverRoutes,
- DiscoverRoutesProps,
-} from './discover_router';
+import { DiscoverRouter } from './discover_router';
import { DiscoverMainRoute } from './main';
import { SingleDocRoute } from './doc';
import { ContextAppRoute } from './context';
-import { createProfileRegistry } from '../customizations/profile_registry';
-import { addProfile } from '../../common/customizations';
-import { NotFoundRoute } from './not_found';
import { mockCustomizationContext } from '../customizations/__mocks__/customization_context';
-
-let mockProfile: string | undefined;
-
-jest.mock('react-router-dom', () => {
- const originalModule = jest.requireActual('react-router-dom');
- return {
- ...originalModule,
- useParams: () => ({ profile: mockProfile }),
- };
-});
+import { MainRouteProps } from './main/discover_main_route';
let pathMap: Record = {};
@@ -51,142 +34,10 @@ const gatherRoutes = (wrapper: ShallowWrapper) => {
const mockExperimentalFeatures = {};
-const props: DiscoverRoutesProps = {
- customizationCallbacks: [],
+const props: MainRouteProps = {
customizationContext: mockCustomizationContext,
- experimentalFeatures: mockExperimentalFeatures,
};
-describe('DiscoverRoutes', () => {
- describe('Without prefix', () => {
- beforeAll(() => {
- pathMap = {};
- gatherRoutes(shallow());
- });
-
- it('should show DiscoverMainRoute component for / route', () => {
- expect(pathMap['/']).toMatchObject();
- });
-
- it('should show DiscoverMainRoute component for /view/:id route', () => {
- expect(pathMap['/view/:id']).toMatchObject();
- });
-
- it('should show Redirect component for /doc/:dataView/:index/:type route', () => {
- const redirectParams = {
- match: {
- params: {
- dataView: '123',
- index: '456',
- },
- },
- };
- const redirect = pathMap['/doc/:dataView/:index/:type'] as Function;
- expect(typeof redirect).toBe('function');
- expect(redirect(redirectParams)).toMatchObject();
- });
-
- it('should show SingleDocRoute component for /doc/:dataViewId/:index route', () => {
- expect(pathMap['/doc/:dataViewId/:index']).toMatchObject();
- });
-
- it('should show ContextAppRoute component for /context/:dataViewId/:id route', () => {
- expect(pathMap['/context/:dataViewId/:id']).toMatchObject();
- });
- });
-
- const prefix = addProfile('', 'test');
-
- describe('With prefix', () => {
- beforeAll(() => {
- pathMap = {};
- gatherRoutes(shallow());
- });
-
- it(`should show DiscoverMainRoute component for ${prefix} route`, () => {
- expect(pathMap[`${prefix}/`]).toMatchObject();
- });
-
- it(`should show DiscoverMainRoute component for ${prefix}/view/:id route`, () => {
- expect(pathMap[`${prefix}/view/:id`]).toMatchObject();
- });
-
- it(`should show Redirect component for ${prefix}/doc/:dataView/:index/:type route`, () => {
- const redirectParams = {
- match: {
- params: {
- dataView: '123',
- index: '456',
- },
- },
- };
- const redirect = pathMap[`${prefix}/doc/:dataView/:index/:type`] as Function;
- expect(typeof redirect).toBe('function');
- expect(redirect(redirectParams)).toMatchObject();
- });
-
- it(`should show SingleDocRoute component for ${prefix}/doc/:dataViewId/:index route`, () => {
- expect(pathMap[`${prefix}/doc/:dataViewId/:index`]).toMatchObject();
- });
-
- it(`should show ContextAppRoute component for ${prefix}/context/:dataViewId/:id route`, () => {
- expect(pathMap[`${prefix}/context/:dataViewId/:id`]).toMatchObject();
- });
- });
-});
-
-const profileRegistry = createProfileRegistry();
-const callbacks = [jest.fn()];
-
-profileRegistry.set({
- id: 'default',
- customizationCallbacks: callbacks,
-});
-
-profileRegistry.set({
- id: 'test',
- customizationCallbacks: callbacks,
-});
-
-describe('CustomDiscoverRoutes', () => {
- afterEach(() => {
- mockProfile = undefined;
- });
-
- it('should show DiscoverRoutes for a valid profile', () => {
- mockProfile = 'test';
- const component = shallow(
-
- );
- expect(component.find(DiscoverRoutes).getElement()).toMatchObject(
-
- );
- });
-
- it('should show NotFoundRoute for an invalid profile', () => {
- mockProfile = 'invalid';
- const component = shallow(
-
- );
- expect(component.find(NotFoundRoute).getElement()).toMatchObject();
- });
-});
-
-const profilePath = addProfile('', ':profile');
-
describe('DiscoverRouter', () => {
beforeAll(() => {
pathMap = {};
@@ -195,7 +46,6 @@ describe('DiscoverRouter', () => {
@@ -203,23 +53,33 @@ describe('DiscoverRouter', () => {
gatherRoutes(component);
});
- it('should show DiscoverRoutes component for / route', () => {
- expect(pathMap['/']).toMatchObject(
-
- );
+ it('should show DiscoverMainRoute component for / route', () => {
+ expect(pathMap['/']).toMatchObject();
});
- it(`should show CustomDiscoverRoutes component for ${profilePath} route`, () => {
- expect(pathMap[profilePath]).toMatchObject(
-
- );
+ it('should show DiscoverMainRoute component for /view/:id route', () => {
+ expect(pathMap['/view/:id']).toMatchObject();
+ });
+
+ it('should show Redirect component for /doc/:dataView/:index/:type route', () => {
+ const redirectParams = {
+ match: {
+ params: {
+ dataView: '123',
+ index: '456',
+ },
+ },
+ };
+ const redirect = pathMap['/doc/:dataView/:index/:type'] as Function;
+ expect(typeof redirect).toBe('function');
+ expect(redirect(redirectParams)).toMatchObject();
+ });
+
+ it('should show SingleDocRoute component for /doc/:dataViewId/:index route', () => {
+ expect(pathMap['/doc/:dataViewId/:index']).toMatchObject();
+ });
+
+ it('should show ContextAppRoute component for /context/:dataViewId/:id route', () => {
+ expect(pathMap['/context/:dataViewId/:id']).toMatchObject();
});
});
diff --git a/src/plugins/discover/public/application/discover_router.tsx b/src/plugins/discover/public/application/discover_router.tsx
index d7aff97483665..48767b4e4b8ea 100644
--- a/src/plugins/discover/public/application/discover_router.tsx
+++ b/src/plugins/discover/public/application/discover_router.tsx
@@ -6,9 +6,9 @@
* Side Public License, v 1.
*/
-import { Redirect, useParams } from 'react-router-dom';
+import { Redirect } from 'react-router-dom';
import { Router, Routes, Route } from '@kbn/shared-ux-router';
-import React, { useCallback, useMemo } from 'react';
+import React from 'react';
import { History } from 'history';
import { EuiErrorBoundary } from '@elastic/eui';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
@@ -19,109 +19,43 @@ import { DiscoverMainRoute } from './main';
import { NotFoundRoute } from './not_found';
import { DiscoverServices } from '../build_services';
import { ViewAlertRoute } from './view_alert';
-import type { CustomizationCallback, DiscoverCustomizationContext } from '../customizations';
-import type { DiscoverProfileRegistry } from '../customizations/profile_registry';
-import { addProfile } from '../../common/customizations';
-
-export interface DiscoverRoutesProps {
- prefix?: string;
- customizationCallbacks: CustomizationCallback[];
- customizationContext: DiscoverCustomizationContext;
- experimentalFeatures: ExperimentalFeatures;
-}
-
-export const DiscoverRoutes = ({ prefix, ...mainRouteProps }: DiscoverRoutesProps) => {
- const prefixPath = useCallback(
- (path: string) => (prefix ? `${prefix}/${path}` : `/${path}`),
- [prefix]
- );
-
- return (
-
-
-
-
- (
-
- )}
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-interface CustomDiscoverRoutesProps {
- profileRegistry: DiscoverProfileRegistry;
- customizationContext: DiscoverCustomizationContext;
- experimentalFeatures: ExperimentalFeatures;
-}
-
-export const CustomDiscoverRoutes = ({ profileRegistry, ...props }: CustomDiscoverRoutesProps) => {
- const { profile } = useParams<{ profile: string }>();
- const customizationCallbacks = useMemo(
- () => profileRegistry.get(profile)?.customizationCallbacks,
- [profile, profileRegistry]
- );
-
- if (customizationCallbacks) {
- return (
-
- );
- }
-
- return ;
-};
+import type { DiscoverCustomizationContext } from '../customizations';
export interface DiscoverRouterProps {
services: DiscoverServices;
- profileRegistry: DiscoverProfileRegistry;
customizationContext: DiscoverCustomizationContext;
experimentalFeatures: ExperimentalFeatures;
history: History;
}
-export const DiscoverRouter = ({
- services,
- history,
- profileRegistry,
- ...routeProps
-}: DiscoverRouterProps) => {
- const customizationCallbacks = useMemo(
- () => profileRegistry.get('default')?.customizationCallbacks ?? [],
- [profileRegistry]
- );
-
+export const DiscoverRouter = ({ services, history, ...routeProps }: DiscoverRouterProps) => {
return (
-
-
+
+
+
+ (
+
+ )}
+ />
+
+
+
+
+
+
+
+
-
-
+
+
+
diff --git a/src/plugins/discover/public/application/doc/locator.test.ts b/src/plugins/discover/public/application/doc/locator.test.ts
index 05907adb888e4..1d5340b9b9c5e 100644
--- a/src/plugins/discover/public/application/doc/locator.test.ts
+++ b/src/plugins/discover/public/application/doc/locator.test.ts
@@ -6,7 +6,6 @@
* Side Public License, v 1.
*/
-import { addProfile } from '../../../common/customizations';
import { DiscoverSingleDocLocatorDefinition } from './locator';
const dataViewId: string = 'c367b774-a4c2-11ea-bb37-0242ac130002';
@@ -45,17 +44,4 @@ describe('Discover single doc url generator', () => {
`"#/doc/c367b774-a4c2-11ea-bb37-0242ac130002/mock-row-index?id=id%20with%20special%20characters%3A%20%26%3F%23%2B%2F%3D"`
);
});
-
- test('can specify profile', async () => {
- const { locator } = await setup();
- const { path } = await locator.getLocation({
- profile: 'test',
- index: dataViewId,
- rowId: 'mock-row-id',
- rowIndex: 'mock-row-index',
- referrer: 'mock-referrer',
- });
-
- expect(path).toBe(`${addProfile('#/', 'test')}doc/${dataViewId}/mock-row-index?id=mock-row-id`);
- });
});
diff --git a/src/plugins/discover/public/application/doc/locator.ts b/src/plugins/discover/public/application/doc/locator.ts
index d230086dcd3db..1c1026ead35fc 100644
--- a/src/plugins/discover/public/application/doc/locator.ts
+++ b/src/plugins/discover/public/application/doc/locator.ts
@@ -9,7 +9,6 @@
import type { SerializableRecord } from '@kbn/utility-types';
import type { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public';
import { DataViewSpec } from '@kbn/data-views-plugin/public';
-import { addProfile } from '../../../common/customizations';
export const DISCOVER_SINGLE_DOC_LOCATOR = 'DISCOVER_SINGLE_DOC_LOCATOR';
@@ -18,7 +17,6 @@ export interface DiscoverSingleDocLocatorParams extends SerializableRecord {
rowId: string;
rowIndex: string;
referrer: string; // discover main view url
- profile?: string;
}
export type DiscoverSingleDocLocator = LocatorPublic;
@@ -47,13 +45,7 @@ export class DiscoverSingleDocLocatorDefinition
dataViewId = index;
}
- let path = '#/';
-
- if (params.profile) {
- path = addProfile(path, params.profile);
- }
-
- path = `${path}doc/${dataViewId}/${rowIndex}?id=${encodeURIComponent(rowId)}`;
+ const path = `#/doc/${dataViewId}/${rowIndex}?id=${encodeURIComponent(rowId)}`;
return {
app: 'discover',
diff --git a/src/plugins/discover/public/application/index.tsx b/src/plugins/discover/public/application/index.tsx
index 97ae7c62aa953..8843533b68327 100644
--- a/src/plugins/discover/public/application/index.tsx
+++ b/src/plugins/discover/public/application/index.tsx
@@ -12,13 +12,11 @@ import { toMountPoint } from '@kbn/react-kibana-mount';
import { ExperimentalFeatures } from '../../common/config';
import { DiscoverRouter } from './discover_router';
import { DiscoverServices } from '../build_services';
-import type { DiscoverProfileRegistry } from '../customizations/profile_registry';
import type { DiscoverCustomizationContext } from '../customizations';
export interface RenderAppProps {
element: HTMLElement;
services: DiscoverServices;
- profileRegistry: DiscoverProfileRegistry;
customizationContext: DiscoverCustomizationContext;
experimentalFeatures: ExperimentalFeatures;
}
@@ -26,7 +24,6 @@ export interface RenderAppProps {
export const renderApp = ({
element,
services,
- profileRegistry,
customizationContext,
experimentalFeatures,
}: RenderAppProps) => {
@@ -46,7 +43,6 @@ export const renderApp = ({
const unmount = toMountPoint(
{
const { load } = prepareTest(savedSearchMockWithTimeFieldNew, '/');
expect(load).toHaveBeenCalledTimes(1);
});
- test('loadSavedSearch is triggered when a new saved search is pre-selected with an active profile', () => {
- const { load } = prepareTest(savedSearchMockWithTimeFieldNew, addProfile('', 'test'));
- expect(load).toHaveBeenCalledTimes(1);
- });
});
diff --git a/src/plugins/discover/public/application/main/hooks/use_url.ts b/src/plugins/discover/public/application/main/hooks/use_url.ts
index 9a64b20a6f39e..debcadabacfe1 100644
--- a/src/plugins/discover/public/application/main/hooks/use_url.ts
+++ b/src/plugins/discover/public/application/main/hooks/use_url.ts
@@ -8,7 +8,6 @@
import { useEffect } from 'react';
import { History } from 'history';
-import { getProfile } from '../../../../common/customizations';
export function useUrl({
history,
@@ -27,9 +26,7 @@ export function useUrl({
// which could be set through pressing "New" button in top nav or go to "Discover" plugin from the sidebar
// to reload the page in a right way
const unlistenHistoryBasePath = history.listen(({ pathname, search, hash }) => {
- const { isProfileRootPath } = getProfile(pathname);
-
- if ((pathname === '/' || isProfileRootPath) && !search && !hash && !savedSearchId) {
+ if (pathname === '/' && !search && !hash && !savedSearchId) {
onNewUrl();
}
});
diff --git a/src/plugins/discover/public/components/discover_container/discover_container.test.tsx b/src/plugins/discover/public/components/discover_container/discover_container.test.tsx
index 3dc04996c483c..47ac6d499e1b8 100644
--- a/src/plugins/discover/public/components/discover_container/discover_container.test.tsx
+++ b/src/plugins/discover/public/components/discover_container/discover_container.test.tsx
@@ -18,9 +18,7 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { dataPluginMock } from '@kbn/data-plugin/public/mocks';
const mockOverrideService = {};
-const getDiscoverServicesMock = jest.fn(
- () => new Promise((resolve) => resolve(discoverServiceMock))
-);
+const getDiscoverServicesMock = jest.fn(() => discoverServiceMock);
jest.mock('../../application/main', () => {
return {
@@ -57,8 +55,7 @@ describe('DiscoverContainerInternal should render properly', () => {
afterEach(() => jest.clearAllMocks());
it('should render', async () => {
- const { getByTestId, queryByTestId } = render();
- expect(queryByTestId(TEST_IDS.DISCOVER_CONTAINER_INTERNAL)).not.toBeInTheDocument();
+ const { getByTestId } = render();
expect(getDiscoverServicesMock).toHaveBeenCalledTimes(1);
diff --git a/src/plugins/discover/public/components/discover_container/discover_container.tsx b/src/plugins/discover/public/components/discover_container/discover_container.tsx
index f9695f57f867f..4f768554e1e54 100644
--- a/src/plugins/discover/public/components/discover_container/discover_container.tsx
+++ b/src/plugins/discover/public/components/discover_container/discover_container.tsx
@@ -9,7 +9,7 @@
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import type { ScopedHistory } from '@kbn/core/public';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
-import React, { useEffect, useMemo, useState } from 'react';
+import React, { useMemo } from 'react';
import { css } from '@emotion/react';
import type { IKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public';
import { DiscoverMainRoute } from '../../application/main';
@@ -25,7 +25,7 @@ export interface DiscoverContainerInternalProps {
* already consumes.
*/
overrideServices: Partial;
- getDiscoverServices: () => Promise;
+ getDiscoverServices: () => DiscoverServices;
scopedHistory: ScopedHistory;
customizationCallbacks: CustomizationCallback[];
stateStorageContainer?: IKbnUrlStateStorage;
@@ -59,23 +59,15 @@ export const DiscoverContainerInternal = ({
stateStorageContainer,
isLoading = false,
}: DiscoverContainerInternalProps) => {
- const [discoverServices, setDiscoverServices] = useState();
+ const services = useMemo(() => {
+ return {
+ ...getDiscoverServices(),
+ ...overrideServices,
+ getScopedHistory: () => scopedHistory as ScopedHistory,
+ };
+ }, [getDiscoverServices, overrideServices, scopedHistory]);
- useEffect(() => {
- getDiscoverServices().then(setDiscoverServices);
- }, [getDiscoverServices]);
-
- const services = useMemo(() => {
- return discoverServices
- ? {
- ...discoverServices,
- ...overrideServices,
- getScopedHistory: () => scopedHistory as ScopedHistory,
- }
- : undefined;
- }, [discoverServices, overrideServices, scopedHistory]);
-
- if (!services || isLoading) {
+ if (isLoading) {
return (
diff --git a/src/plugins/discover/public/customizations/profile_aware_locator.test.ts b/src/plugins/discover/public/customizations/profile_aware_locator.test.ts
deleted file mode 100644
index d0ef7a526dac2..0000000000000
--- a/src/plugins/discover/public/customizations/profile_aware_locator.test.ts
+++ /dev/null
@@ -1,141 +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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { History } from 'history';
-import { addProfile } from '../../common/customizations';
-import { HistoryLocationState } from '../build_services';
-import { ProfileAwareLocator } from './profile_aware_locator';
-
-let mockHistory: History;
-
-describe('ProfileAwareLocator', () => {
- beforeEach(() => {
- mockHistory = {
- location: {
- pathname: '',
- },
- } as History;
- });
-
- it('should inject profile', async () => {
- mockHistory.location.pathname = addProfile('', 'test');
- const locator = {
- id: 'test',
- migrations: {},
- getLocation: jest.fn(),
- getUrl: jest.fn(),
- getRedirectUrl: jest.fn(),
- navigate: jest.fn(),
- navigateSync: jest.fn(),
- useUrl: jest.fn(),
- telemetry: jest.fn(),
- inject: jest.fn(),
- extract: jest.fn(),
- };
- const profileAwareLocator = new ProfileAwareLocator(locator, mockHistory);
- const params = { foo: 'bar' };
- const injectedParams = { foo: 'bar', profile: 'test' };
- await profileAwareLocator.getLocation(params);
- expect(locator.getLocation).toHaveBeenCalledWith(injectedParams);
- await profileAwareLocator.getUrl(params, { absolute: true });
- expect(locator.getUrl).toHaveBeenCalledWith(injectedParams, { absolute: true });
- profileAwareLocator.getRedirectUrl(params, { lzCompress: true });
- expect(locator.getRedirectUrl).toHaveBeenCalledWith(injectedParams, { lzCompress: true });
- await profileAwareLocator.navigate(params, { replace: true });
- expect(locator.navigate).toHaveBeenCalledWith(injectedParams, { replace: true });
- profileAwareLocator.navigateSync(params, { replace: true });
- expect(locator.navigateSync).toHaveBeenCalledWith(injectedParams, { replace: true });
- profileAwareLocator.useUrl(params, { absolute: true }, ['test']);
- expect(locator.useUrl).toHaveBeenCalledWith(injectedParams, { absolute: true }, ['test']);
- profileAwareLocator.telemetry(params, { foo: 'bar' });
- expect(locator.telemetry).toHaveBeenCalledWith(injectedParams, { foo: 'bar' });
- await profileAwareLocator.inject(params, [{ id: 'test', name: 'test', type: 'test' }]);
- expect(locator.inject).toHaveBeenCalledWith(injectedParams, [
- { id: 'test', name: 'test', type: 'test' },
- ]);
- profileAwareLocator.extract(params);
- expect(locator.extract).toHaveBeenCalledWith(injectedParams);
- });
-
- it('should not overwrite the provided profile with an injected one', async () => {
- mockHistory.location.pathname = addProfile('', 'test');
- const locator = {
- id: 'test',
- migrations: {},
- getLocation: jest.fn(),
- getUrl: jest.fn(),
- getRedirectUrl: jest.fn(),
- navigate: jest.fn(),
- navigateSync: jest.fn(),
- useUrl: jest.fn(),
- telemetry: jest.fn(),
- inject: jest.fn(),
- extract: jest.fn(),
- };
- const profileAwareLocator = new ProfileAwareLocator(locator, mockHistory);
- const params = { foo: 'bar', profile: 'test2' };
- await profileAwareLocator.getLocation(params);
- expect(locator.getLocation).toHaveBeenCalledWith(params);
- await profileAwareLocator.getUrl(params, { absolute: true });
- expect(locator.getUrl).toHaveBeenCalledWith(params, { absolute: true });
- profileAwareLocator.getRedirectUrl(params, { lzCompress: true });
- expect(locator.getRedirectUrl).toHaveBeenCalledWith(params, { lzCompress: true });
- await profileAwareLocator.navigate(params, { replace: true });
- expect(locator.navigate).toHaveBeenCalledWith(params, { replace: true });
- profileAwareLocator.navigateSync(params, { replace: true });
- expect(locator.navigateSync).toHaveBeenCalledWith(params, { replace: true });
- profileAwareLocator.useUrl(params, { absolute: true }, ['test']);
- expect(locator.useUrl).toHaveBeenCalledWith(params, { absolute: true }, ['test']);
- profileAwareLocator.telemetry(params, { foo: 'bar' });
- expect(locator.telemetry).toHaveBeenCalledWith(params, { foo: 'bar' });
- await profileAwareLocator.inject(params, [{ id: 'test', name: 'test', type: 'test' }]);
- expect(locator.inject).toHaveBeenCalledWith(params, [
- { id: 'test', name: 'test', type: 'test' },
- ]);
- profileAwareLocator.extract(params);
- expect(locator.extract).toHaveBeenCalledWith(params);
- });
-
- it('should not pass a profile if there is no profile in the URL', async () => {
- const locator = {
- id: 'test',
- migrations: {},
- getLocation: jest.fn(),
- getUrl: jest.fn(),
- getRedirectUrl: jest.fn(),
- navigate: jest.fn(),
- navigateSync: jest.fn(),
- useUrl: jest.fn(),
- telemetry: jest.fn(),
- inject: jest.fn(),
- extract: jest.fn(),
- };
- const profileAwareLocator = new ProfileAwareLocator(locator, mockHistory);
- const params = { foo: 'bar' };
- await profileAwareLocator.getLocation(params);
- expect(locator.getLocation).toHaveBeenCalledWith(params);
- await profileAwareLocator.getUrl(params, { absolute: true });
- expect(locator.getUrl).toHaveBeenCalledWith(params, { absolute: true });
- profileAwareLocator.getRedirectUrl(params, { lzCompress: true });
- expect(locator.getRedirectUrl).toHaveBeenCalledWith(params, { lzCompress: true });
- await profileAwareLocator.navigate(params, { replace: true });
- expect(locator.navigate).toHaveBeenCalledWith(params, { replace: true });
- profileAwareLocator.navigateSync(params, { replace: true });
- expect(locator.navigateSync).toHaveBeenCalledWith(params, { replace: true });
- profileAwareLocator.useUrl(params, { absolute: true }, ['test']);
- expect(locator.useUrl).toHaveBeenCalledWith(params, { absolute: true }, ['test']);
- profileAwareLocator.telemetry(params, { foo: 'bar' });
- expect(locator.telemetry).toHaveBeenCalledWith(params, { foo: 'bar' });
- await profileAwareLocator.inject(params, [{ id: 'test', name: 'test', type: 'test' }]);
- expect(locator.inject).toHaveBeenCalledWith(params, [
- { id: 'test', name: 'test', type: 'test' },
- ]);
- profileAwareLocator.extract(params);
- expect(locator.extract).toHaveBeenCalledWith(params);
- });
-});
diff --git a/src/plugins/discover/public/customizations/profile_aware_locator.ts b/src/plugins/discover/public/customizations/profile_aware_locator.ts
deleted file mode 100644
index 5339a7c382aac..0000000000000
--- a/src/plugins/discover/public/customizations/profile_aware_locator.ts
+++ /dev/null
@@ -1,90 +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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import type { SavedObjectReference } from '@kbn/core-saved-objects-api-server';
-import type {
- MigrateFunctionsObject,
- GetMigrationFunctionObjectFn,
-} from '@kbn/kibana-utils-plugin/common';
-import type {
- LocatorGetUrlParams,
- FormatSearchParamsOptions,
- LocatorNavigationParams,
-} from '@kbn/share-plugin/common/url_service';
-import type { LocatorPublic } from '@kbn/share-plugin/public';
-import { History } from 'history';
-import type { DependencyList } from 'react';
-import { getProfile } from '../../common/customizations';
-import { HistoryLocationState } from '../build_services';
-
-export class ProfileAwareLocator implements LocatorPublic {
- id: string;
- migrations: MigrateFunctionsObject | GetMigrationFunctionObjectFn;
-
- constructor(
- private readonly locator: LocatorPublic,
- private readonly history: History
- ) {
- this.id = locator.id;
- this.migrations = locator.migrations;
- }
-
- private injectProfile(params: T) {
- if (params.profile) {
- return params;
- }
-
- const { profile } = getProfile(this.history.location.pathname);
-
- if (profile) {
- params = { ...params, profile };
- }
-
- return params;
- }
-
- getLocation(params: T) {
- return this.locator.getLocation(this.injectProfile(params));
- }
-
- getUrl(params: T, getUrlParams?: LocatorGetUrlParams) {
- return this.locator.getUrl(this.injectProfile(params), getUrlParams);
- }
-
- getRedirectUrl(params: T, options?: FormatSearchParamsOptions) {
- return this.locator.getRedirectUrl(this.injectProfile(params), options);
- }
-
- navigate(params: T, navigationParams?: LocatorNavigationParams) {
- return this.locator.navigate(this.injectProfile(params), navigationParams);
- }
-
- navigateSync(params: T, navigationParams?: LocatorNavigationParams) {
- return this.locator.navigateSync(this.injectProfile(params), navigationParams);
- }
-
- useUrl(
- params: T,
- getUrlParams?: LocatorGetUrlParams | undefined,
- deps?: DependencyList | undefined
- ) {
- return this.locator.useUrl(this.injectProfile(params), getUrlParams, deps);
- }
-
- telemetry(state: T, stats: Record) {
- return this.locator.telemetry(this.injectProfile(state), stats);
- }
-
- inject(state: T, references: SavedObjectReference[]) {
- return this.locator.inject(this.injectProfile(state), references);
- }
-
- extract(state: T) {
- return this.locator.extract(this.injectProfile(state));
- }
-}
diff --git a/src/plugins/discover/public/customizations/profile_registry.test.ts b/src/plugins/discover/public/customizations/profile_registry.test.ts
deleted file mode 100644
index 7d3ae5cca742a..0000000000000
--- a/src/plugins/discover/public/customizations/profile_registry.test.ts
+++ /dev/null
@@ -1,134 +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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { App, AppDeepLink, AppUpdater } from '@kbn/core/public';
-import { BehaviorSubject, combineLatest, map, take } from 'rxjs';
-import { createRegisterCustomizationProfile, createProfileRegistry } from './profile_registry';
-
-describe('createProfileRegistry', () => {
- it('should allow registering profiles', () => {
- const registry = createProfileRegistry();
- registry.set({
- id: 'test',
- customizationCallbacks: [],
- });
- registry.set({
- id: 'test2',
- customizationCallbacks: [],
- });
- expect(registry.get('test')).toEqual({
- id: 'test',
- customizationCallbacks: [],
- });
- expect(registry.get('test2')).toEqual({
- id: 'test2',
- customizationCallbacks: [],
- });
- });
-
- it('should allow overriding profiles', () => {
- const registry = createProfileRegistry();
- registry.set({
- id: 'test',
- customizationCallbacks: [],
- });
- expect(registry.get('test')).toEqual({
- id: 'test',
- customizationCallbacks: [],
- });
- const callback = jest.fn();
- registry.set({
- id: 'test',
- customizationCallbacks: [callback],
- });
- expect(registry.get('test')).toEqual({
- id: 'test',
- customizationCallbacks: [callback],
- });
- });
-
- it('should be case insensitive', () => {
- const registry = createProfileRegistry();
- registry.set({
- id: 'test',
- customizationCallbacks: [],
- });
- expect(registry.get('tEsT')).toEqual({
- id: 'test',
- customizationCallbacks: [],
- });
- });
-});
-
-describe('createRegisterCustomizationProfile', () => {
- test('should add a customization callback to the registry', () => {
- const registry = createProfileRegistry();
- const registerCustomizationProfile = createRegisterCustomizationProfile(registry);
- const callback = jest.fn();
- registerCustomizationProfile('test', { customize: callback });
- expect(registry.get('test')).toEqual({
- id: 'test',
- customizationCallbacks: [callback],
- deepLinks: [],
- });
- const callback2 = jest.fn();
- registerCustomizationProfile('test', { customize: callback2 });
- expect(registry.get('test')).toEqual({
- id: 'test',
- customizationCallbacks: [callback, callback2],
- deepLinks: [],
- });
- });
-});
-
-describe('profile.getContributedAppState$ observable', () => {
- test('should notify subscribers with new app updates when a profile is registered', (done) => {
- const registry = createProfileRegistry();
- const callback = jest.fn();
- const appUpdater$ = new BehaviorSubject(() => ({}));
-
- const mockDeepLink: AppDeepLink = {
- id: 'test-deepLink',
- title: 'Test deep link',
- path: '/test-deep-link',
- };
- let mockApp: App = { id: 'test-app', title: 'Test App', mount: () => () => {} };
- const expectedApp: App = { ...mockApp, deepLinks: [mockDeepLink] };
-
- const appStateUpdater$ = combineLatest([appUpdater$, registry.getContributedAppState$()]).pipe(
- map(
- ([appUpdater, registryContributor]): AppUpdater =>
- (app) => ({ ...appUpdater(app), ...registryContributor(app) })
- ),
- take(3)
- );
-
- appStateUpdater$.subscribe({
- next: (updater) => {
- mockApp = { ...mockApp, ...updater(mockApp) };
- },
- complete: () => {
- expect(mockApp).toEqual(expectedApp);
- done();
- },
- });
-
- // First update, no deepLinks set
- registry.set({
- id: 'test',
- customizationCallbacks: [callback],
- });
-
- // Second update, deepLinks set to update app
- registry.set({
- id: 'test',
- customizationCallbacks: [],
- deepLinks: [mockDeepLink],
- });
- });
-});
diff --git a/src/plugins/discover/public/customizations/profile_registry.ts b/src/plugins/discover/public/customizations/profile_registry.ts
deleted file mode 100644
index f56f7d9c2d9e7..0000000000000
--- a/src/plugins/discover/public/customizations/profile_registry.ts
+++ /dev/null
@@ -1,73 +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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import type { AppDeepLink, AppUpdater } from '@kbn/core/public';
-import { map, Observable, BehaviorSubject } from 'rxjs';
-import type { RegisterCustomizationProfile, DiscoverProfile, DiscoverProfileId } from './types';
-
-export interface DiscoverProfileRegistry {
- get(id: DiscoverProfileId): DiscoverProfile | undefined;
- set(profile: DiscoverProfile): void;
- getContributedAppState$: () => Observable;
-}
-
-export const createProfileRegistry = (): DiscoverProfileRegistry => {
- const profiles = new Map([['default', createProfile('default')]]);
- const profiles$ = new BehaviorSubject([...profiles.values()]);
-
- return {
- get: (id) => profiles.get(id.toLowerCase()),
- set: (profile) => {
- profiles.set(profile.id.toLowerCase(), profile);
- profiles$.next([...profiles.values()]);
- },
- getContributedAppState$() {
- return profiles$.pipe(
- map((profilesList) => profilesList.flatMap((profile) => profile.deepLinks ?? [])),
- map((profilesDeepLinks) => (app) => ({
- deepLinks: getUniqueDeepLinks([...(app.deepLinks ?? []), ...profilesDeepLinks]),
- }))
- );
- },
- };
-};
-
-export const createRegisterCustomizationProfile =
- (profileRegistry: DiscoverProfileRegistry): RegisterCustomizationProfile =>
- (id, options) => {
- const profile = profileRegistry.get(id) ?? createProfile(id);
-
- const { customize, deepLinks } = options;
-
- profile.customizationCallbacks.push(customize);
-
- if (Array.isArray(deepLinks) && profile.deepLinks) {
- profile.deepLinks = getUniqueDeepLinks([...profile.deepLinks, ...deepLinks]);
- } else if (Array.isArray(deepLinks)) {
- profile.deepLinks = getUniqueDeepLinks(deepLinks);
- }
-
- profileRegistry.set(profile);
- };
-
-/**
- * Utils
- */
-const createProfile = (id: DiscoverProfileId): DiscoverProfile => ({
- id,
- customizationCallbacks: [],
- deepLinks: [],
-});
-
-const getUniqueDeepLinks = (deepLinks: AppDeepLink[]): AppDeepLink[] => {
- const mapValues = deepLinks
- .reduce((deepLinksMap, deepLink) => deepLinksMap.set(deepLink.id, deepLink), new Map())
- .values();
-
- return Array.from(mapValues);
-};
diff --git a/src/plugins/discover/public/customizations/types.ts b/src/plugins/discover/public/customizations/types.ts
index 97ce9e4fa2615..3f81b2cce7aa1 100644
--- a/src/plugins/discover/public/customizations/types.ts
+++ b/src/plugins/discover/public/customizations/types.ts
@@ -6,33 +6,14 @@
* Side Public License, v 1.
*/
-import type { AppDeepLink } from '@kbn/core/public';
import type { DiscoverStateContainer } from '../application/main/services/discover_state';
import type { DiscoverCustomizationService } from './customization_service';
-export type DiscoverProfileId = string;
-
-export interface DiscoverProfile {
- id: DiscoverProfileId;
- customizationCallbacks: CustomizationCallback[];
- deepLinks?: AppDeepLink[];
-}
-
export interface CustomizationCallbackContext {
customizations: DiscoverCustomizationService;
stateContainer: DiscoverStateContainer;
}
-export interface DiscoverProfileOptions {
- customize: CustomizationCallback;
- deepLinks?: AppDeepLink[];
-}
-
-export type RegisterCustomizationProfile = (
- id: DiscoverProfileId,
- options: DiscoverProfileOptions
-) => void;
-
export type CustomizationCallback = (
options: CustomizationCallbackContext
) => void | (() => void) | Promise void)>;
diff --git a/src/plugins/discover/public/index.ts b/src/plugins/discover/public/index.ts
index b21a76fe9e596..b25e4a25decf0 100644
--- a/src/plugins/discover/public/index.ts
+++ b/src/plugins/discover/public/index.ts
@@ -21,9 +21,6 @@ export type { DataDocumentsMsg } from './application/main/services/discover_data
export type { DiscoverContainerProps } from './components/discover_container';
export type {
CustomizationCallback,
- DiscoverProfileId,
- DiscoverProfileOptions,
- RegisterCustomizationProfile,
DiscoverCustomization,
DiscoverCustomizationService,
FlyoutCustomization,
diff --git a/src/plugins/discover/public/mocks.tsx b/src/plugins/discover/public/mocks.tsx
index c218a56531b25..89dd00e7d591d 100644
--- a/src/plugins/discover/public/mocks.tsx
+++ b/src/plugins/discover/public/mocks.tsx
@@ -26,7 +26,6 @@ const createStartContract = (): Start => {
const startContract: Start = {
locator: sharePluginMock.createLocator(),
DiscoverContainer: jest.fn().mockImplementation(() => <>>),
- registerCustomizationProfile: jest.fn(),
};
return startContract;
};
diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx
index f1f7dee81abd5..f3396663b8763 100644
--- a/src/plugins/discover/public/plugin.tsx
+++ b/src/plugins/discover/public/plugin.tsx
@@ -7,7 +7,7 @@
*/
import React, { ComponentType } from 'react';
-import { BehaviorSubject, combineLatest, map } from 'rxjs';
+import { BehaviorSubject } from 'rxjs';
import {
AppMountParameters,
AppUpdater,
@@ -66,11 +66,7 @@ import {
DiscoverAppLocatorDefinition,
DiscoverESQLLocatorDefinition,
} from '../common';
-import type { DiscoverCustomizationContext, RegisterCustomizationProfile } from './customizations';
-import {
- createRegisterCustomizationProfile,
- createProfileRegistry,
-} from './customizations/profile_registry';
+import type { DiscoverCustomizationContext } from './customizations';
import { SEARCH_EMBEDDABLE_CELL_ACTIONS_TRIGGER } from './embeddable/constants';
import {
DiscoverContainerInternal,
@@ -153,7 +149,6 @@ export interface DiscoverStart {
*/
readonly locator: undefined | DiscoverAppLocator;
readonly DiscoverContainer: ComponentType;
- readonly registerCustomizationProfile: RegisterCustomizationProfile;
}
/**
@@ -218,7 +213,6 @@ export class DiscoverPlugin
private scopedHistory?: ScopedHistory;
private urlTracker?: UrlTracker;
private stopUrlTracking: (() => void) | undefined = undefined;
- private profileRegistry = createProfileRegistry();
private locator?: DiscoverAppLocator;
private contextLocator?: DiscoverContextAppLocator;
private singleDocLocator?: DiscoverSingleDocLocator;
@@ -239,7 +233,6 @@ export class DiscoverPlugin
if (plugins.share) {
const useHash = core.uiSettings.get('state:storeInSessionStorage');
- // Create locators for external use without profile-awareness
this.locator = plugins.share.url.locators.create(
new DiscoverAppLocatorDefinition({ useHash, setStateToKbnUrl })
);
@@ -290,23 +283,10 @@ export class DiscoverPlugin
this.urlTracker = { setTrackedUrl, restorePreviousUrl, setTrackingEnabled };
this.stopUrlTracking = stopUrlTracker;
- const appStateUpdater$ = combineLatest([
- this.appStateUpdater,
- this.profileRegistry.getContributedAppState$(),
- ]).pipe(
- map(
- ([urlAppStateUpdater, profileAppStateUpdater]): AppUpdater =>
- (app) => ({
- ...urlAppStateUpdater(app),
- ...profileAppStateUpdater(app),
- })
- )
- );
-
core.application.register({
id: PLUGIN_ID,
title: 'Discover',
- updater$: appStateUpdater$,
+ updater$: this.appStateUpdater,
order: 1000,
euiIconType: 'logoKibana',
defaultPath: '#/',
@@ -327,19 +307,13 @@ export class DiscoverPlugin
window.dispatchEvent(new HashChangeEvent('hashchange'));
});
- const { locator, contextLocator, singleDocLocator } = await this.getProfileAwareLocators({
- locator: this.locator!,
- contextLocator: this.contextLocator!,
- singleDocLocator: this.singleDocLocator!,
- });
-
const services = buildServices({
core: coreStart,
plugins: discoverStartPlugins,
context: this.initializerContext,
- locator,
- contextLocator,
- singleDocLocator,
+ locator: this.locator!,
+ contextLocator: this.contextLocator!,
+ singleDocLocator: this.singleDocLocator!,
history: this.historyService.getHistory(),
scopedHistory: this.scopedHistory,
urlTracker: this.urlTracker!,
@@ -357,7 +331,6 @@ export class DiscoverPlugin
const unmount = renderApp({
element: params.element,
services,
- profileRegistry: this.profileRegistry,
customizationContext: {
displayMode: 'standalone',
inlineTopNav: this.inlineTopNav,
@@ -422,10 +395,7 @@ export class DiscoverPlugin
plugins.uiActions.registerTrigger(SEARCH_EMBEDDABLE_CELL_ACTIONS_TRIGGER);
injectTruncateStyles(core.uiSettings.get(TRUNCATE_MAX_HEIGHT));
- const getDiscoverServicesInternal = () => {
- return this.getDiscoverServices(core, plugins);
- };
-
+ const getDiscoverServicesInternal = () => this.getDiscoverServices(core, plugins);
const isEsqlEnabled = core.uiSettings.get(ENABLE_ESQL);
if (plugins.share && this.locator && isEsqlEnabled) {
@@ -442,7 +412,6 @@ export class DiscoverPlugin
DiscoverContainer: (props: DiscoverContainerProps) => (
),
- registerCustomizationProfile: createRegisterCustomizationProfile(this.profileRegistry),
};
}
@@ -452,47 +421,19 @@ export class DiscoverPlugin
}
}
- private getDiscoverServices = async (core: CoreStart, plugins: DiscoverStartPlugins) => {
- const { locator, contextLocator, singleDocLocator } = await this.getProfileAwareLocators({
- locator: this.locator!,
- contextLocator: this.contextLocator!,
- singleDocLocator: this.singleDocLocator!,
- });
-
+ private getDiscoverServices = (core: CoreStart, plugins: DiscoverStartPlugins) => {
return buildServices({
core,
plugins,
context: this.initializerContext,
- locator,
- contextLocator,
- singleDocLocator,
+ locator: this.locator!,
+ contextLocator: this.contextLocator!,
+ singleDocLocator: this.singleDocLocator!,
history: this.historyService.getHistory(),
urlTracker: this.urlTracker!,
});
};
- /**
- * Create profile-aware locators for internal use
- */
- private async getProfileAwareLocators({
- locator,
- contextLocator,
- singleDocLocator,
- }: {
- locator: DiscoverAppLocator;
- contextLocator: DiscoverContextAppLocator;
- singleDocLocator: DiscoverSingleDocLocator;
- }) {
- const { ProfileAwareLocator } = await import('./customizations/profile_aware_locator');
- const history = this.historyService.getHistory();
-
- return {
- locator: new ProfileAwareLocator(locator, history),
- contextLocator: new ProfileAwareLocator(contextLocator, history),
- singleDocLocator: new ProfileAwareLocator(singleDocLocator, history),
- };
- }
-
private registerEmbeddable(core: CoreSetup, plugins: DiscoverSetupPlugins) {
const getStartServices = async () => {
const [coreStart, deps] = await core.getStartServices();
diff --git a/src/plugins/discover/public/utils/breadcrumbs.test.ts b/src/plugins/discover/public/utils/breadcrumbs.test.ts
index 22c87cd4b50a1..3bd8d04957b2a 100644
--- a/src/plugins/discover/public/utils/breadcrumbs.test.ts
+++ b/src/plugins/discover/public/utils/breadcrumbs.test.ts
@@ -8,8 +8,6 @@
import { createDiscoverServicesMock } from '../__mocks__/services';
import { setBreadcrumbs } from './breadcrumbs';
-import { createMemoryHistory } from 'history';
-import type { HistoryLocationState } from '../build_services';
describe('Breadcrumbs', () => {
const discoverServiceMock = createDiscoverServicesMock();
@@ -41,20 +39,4 @@ describe('Breadcrumbs', () => {
{ text: 'Saved Search' },
]);
});
-
- test('should set breadcrumbs with profile root path', () => {
- const history = createMemoryHistory({});
- history.push('/p/my-profile');
- setBreadcrumbs({
- services: {
- ...discoverServiceMock,
- history,
- },
- titleBreadcrumbText: 'Saved Search',
- });
- expect(discoverServiceMock.chrome.setBreadcrumbs).toHaveBeenCalledWith([
- { text: 'Discover', href: '#/p/my-profile/', deepLinkId: 'discover' },
- { text: 'Saved Search' },
- ]);
- });
});
diff --git a/src/plugins/discover/public/utils/breadcrumbs.ts b/src/plugins/discover/public/utils/breadcrumbs.ts
index c260077e24f9f..8dec61cd91522 100644
--- a/src/plugins/discover/public/utils/breadcrumbs.ts
+++ b/src/plugins/discover/public/utils/breadcrumbs.ts
@@ -8,30 +8,18 @@
import { i18n } from '@kbn/i18n';
import type { ChromeBreadcrumb } from '@kbn/core-chrome-browser';
-import { addProfile, getProfile } from '../../common/customizations';
import type { DiscoverServices } from '../build_services';
const rootPath = '#/';
-const getRootPath = ({ history }: DiscoverServices) => {
- const { profile } = getProfile(history.location.pathname);
- return profile ? addProfile(rootPath, profile) : rootPath;
-};
-
-function getRootBreadcrumbs({
- breadcrumb,
- services,
-}: {
- breadcrumb?: string;
- services: DiscoverServices;
-}): ChromeBreadcrumb[] {
+function getRootBreadcrumbs({ breadcrumb }: { breadcrumb?: string }): ChromeBreadcrumb[] {
return [
{
text: i18n.translate('discover.rootBreadcrumb', {
defaultMessage: 'Discover',
}),
deepLinkId: 'discover',
- href: breadcrumb || getRootPath(services),
+ href: breadcrumb || rootPath,
},
];
}
@@ -51,7 +39,6 @@ export function setBreadcrumbs({
}) {
const rootBreadcrumbs = getRootBreadcrumbs({
breadcrumb: rootBreadcrumbPath,
- services,
});
const discoverBreadcrumbsTitle = i18n.translate('discover.discoverBreadcrumbTitle', {
defaultMessage: 'Discover',
diff --git a/src/plugins/discover/tsconfig.json b/src/plugins/discover/tsconfig.json
index 4e6213e745796..b10dee36e3fb7 100644
--- a/src/plugins/discover/tsconfig.json
+++ b/src/plugins/discover/tsconfig.json
@@ -57,7 +57,6 @@
"@kbn/dom-drag-drop",
"@kbn/ebt-tools",
"@kbn/unified-field-list",
- "@kbn/core-saved-objects-api-server",
"@kbn/cell-actions",
"@kbn/shared-ux-utility",
"@kbn/core-saved-objects-server",
diff --git a/test/examples/discover_customization_examples/customizations.ts b/test/examples/discover_customization_examples/customizations.ts
index 6d0d223a06cfe..d5777701de1fc 100644
--- a/test/examples/discover_customization_examples/customizations.ts
+++ b/test/examples/discover_customization_examples/customizations.ts
@@ -71,6 +71,8 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => {
expect(title).to.eql(expected.title);
expect(description).to.eql(expected.description);
});
+ await browser.goBack();
+ await PageObjects.header.waitUntilLoadingHasFinished();
});
it('Search bar Prepend Filters exists and should apply filter properly', async () => {
diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/discover_customization_examples/customizations.ts b/x-pack/test_serverless/functional/test_suites/common/examples/discover_customization_examples/customizations.ts
index 08e59867c8aac..59a0349c79580 100644
--- a/x-pack/test_serverless/functional/test_suites/common/examples/discover_customization_examples/customizations.ts
+++ b/x-pack/test_serverless/functional/test_suites/common/examples/discover_customization_examples/customizations.ts
@@ -70,6 +70,8 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => {
expect(title).to.eql(expected.title);
expect(description).to.eql(expected.description);
});
+ await browser.goBack();
+ await PageObjects.header.waitUntilLoadingHasFinished();
});
it('Search bar Prepend Filters exists and should apply filter properly', async () => {
From 3def76dab85eb10b1fd1f261e9ac73fbbb2464dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?=
Date: Tue, 23 Apr 2024 17:43:49 +0200
Subject: [PATCH 080/183] [Obs AI Assistant] Add form validation to new kb
entry (#181379)
The name and content are required when submitting a KB entry. This PR
adds validation to ensure both are filled out
---
...nowledge_base_edit_manual_entry_flyout.tsx | 9 ++++++-
.../components/knowledge_base_tab.test.tsx | 24 +++++++++++++++----
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx
index 675b46bd3ba86..102fda79af72b 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx
@@ -45,6 +45,10 @@ export function KnowledgeBaseEditManualEntryFlyout({
const [newEntryId, setNewEntryId] = useState(entry?.id ?? '');
const [newEntryText, setNewEntryText] = useState(entry?.text ?? '');
+ const isEntryIdInvalid = newEntryId.trim() === '';
+ const isEntryTextInvalid = newEntryText.trim() === '';
+ const isFormInvalid = isEntryIdInvalid || isEntryTextInvalid;
+
const handleSubmitNewEntryClick = async () => {
createEntry({
entry: {
@@ -92,10 +96,11 @@ export function KnowledgeBaseEditManualEntryFlyout({
)}
>
setNewEntryId(e.target.value)}
+ isInvalid={isEntryIdInvalid}
/>
) : (
@@ -136,6 +141,7 @@ export function KnowledgeBaseEditManualEntryFlyout({
)}
>
{i18n.translate(
'xpack.observabilityAiAssistantManagement.knowledgeBaseNewManualEntryFlyout.saveButtonLabel',
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx
index 9a675ed37b89e..fcf6da4598cf7 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx
@@ -71,15 +71,31 @@ describe('KnowledgeBaseTab', () => {
fireEvent.click(getByTestId('knowledgeBaseSingleEntryContextMenuItem'));
- fireEvent.click(getByTestId('knowledgeBaseEditManualEntryFlyoutFieldText'));
-
- fireEvent.change(getByTestId('knowledgeBaseEditManualEntryFlyoutFieldText'), {
+ fireEvent.change(getByTestId('knowledgeBaseEditManualEntryFlyoutIdInput'), {
target: { value: 'foo' },
});
+ fireEvent.change(getByTestId('euiMarkdownEditorTextArea'), {
+ target: { value: 'bar' },
+ });
+
getByTestId('knowledgeBaseEditManualEntryFlyoutSaveButton').click();
- expect(createMock).toHaveBeenCalledWith({ entry: { id: 'foo', text: '' } });
+ expect(createMock).toHaveBeenCalledWith({ entry: { id: 'foo', text: 'bar' } });
+ });
+
+ it('should require an id', () => {
+ const { getByTestId } = render();
+
+ fireEvent.click(getByTestId('knowledgeBaseNewEntryButton'));
+
+ fireEvent.click(getByTestId('knowledgeBaseSingleEntryContextMenuItem'));
+
+ fireEvent.change(getByTestId('knowledgeBaseEditManualEntryFlyoutIdInput'), {
+ target: { value: 'foo' },
+ });
+
+ expect(getByTestId('knowledgeBaseEditManualEntryFlyoutSaveButton')).toBeDisabled();
});
});
From 2ea506e30b724b052fdf61a4a1e092b967e13672 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Apr 2024 10:56:45 -0500
Subject: [PATCH 081/183] Update babel (main) (#181248)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@babel/cli](https://babel.dev/docs/en/next/babel-cli)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-cli))
| [`^7.23.9` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2fcli/7.23.9/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fcli/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fcli/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fcli/7.23.9/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fcli/7.23.9/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/core](https://babel.dev/docs/en/next/babel-core)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-core))
| [`^7.24.0` ->
`^7.24.4`](https://renovatebot.com/diffs/npm/@babel%2fcore/7.24.0/7.24.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fcore/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fcore/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fcore/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fcore/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/eslint-parser](https://babel.dev/)
([source](https://togithub.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser))
| [`^7.23.10` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2feslint-parser/7.23.10/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2feslint-parser/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2feslint-parser/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2feslint-parser/7.23.10/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2feslint-parser/7.23.10/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/generator](https://babel.dev/docs/en/next/babel-generator)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-generator))
| [`^7.23.6` ->
`^7.24.4`](https://renovatebot.com/diffs/npm/@babel%2fgenerator/7.23.6/7.24.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fgenerator/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fgenerator/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fgenerator/7.23.6/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fgenerator/7.23.6/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/parser](https://babel.dev/docs/en/next/babel-parser)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-parser))
| [`^7.24.0` ->
`^7.24.4`](https://renovatebot.com/diffs/npm/@babel%2fparser/7.24.0/7.24.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fparser/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fparser/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fparser/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fparser/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@babel/plugin-transform-class-properties](https://babel.dev/docs/en/next/babel-plugin-transform-class-properties)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-class-properties))
| [`^7.23.3` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2fplugin-transform-class-properties/7.23.3/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fplugin-transform-class-properties/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fplugin-transform-class-properties/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fplugin-transform-class-properties/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fplugin-transform-class-properties/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@babel/plugin-transform-numeric-separator](https://babel.dev/docs/en/next/babel-plugin-transform-numeric-separator)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-numeric-separator))
| [`^7.23.4` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2fplugin-transform-numeric-separator/7.23.4/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fplugin-transform-numeric-separator/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fplugin-transform-numeric-separator/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fplugin-transform-numeric-separator/7.23.4/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fplugin-transform-numeric-separator/7.23.4/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@babel/plugin-transform-runtime](https://babel.dev/docs/en/next/babel-plugin-transform-runtime)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime))
| [`^7.24.0` ->
`^7.24.3`](https://renovatebot.com/diffs/npm/@babel%2fplugin-transform-runtime/7.24.0/7.24.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fplugin-transform-runtime/7.24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fplugin-transform-runtime/7.24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fplugin-transform-runtime/7.24.0/7.24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fplugin-transform-runtime/7.24.0/7.24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/preset-env](https://babel.dev/docs/en/next/babel-preset-env)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-preset-env))
| [`^7.24.0` ->
`^7.24.4`](https://renovatebot.com/diffs/npm/@babel%2fpreset-env/7.24.0/7.24.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fpreset-env/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fpreset-env/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fpreset-env/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fpreset-env/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@babel/preset-react](https://babel.dev/docs/en/next/babel-preset-react)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-preset-react))
| [`^7.23.3` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2fpreset-react/7.23.3/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fpreset-react/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fpreset-react/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fpreset-react/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fpreset-react/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@babel/preset-typescript](https://babel.dev/docs/en/next/babel-preset-typescript)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-preset-typescript))
| [`^7.23.3` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2fpreset-typescript/7.23.3/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fpreset-typescript/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fpreset-typescript/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fpreset-typescript/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fpreset-typescript/7.23.3/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/runtime](https://babel.dev/docs/en/next/babel-runtime)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-runtime))
| [`^7.24.0` ->
`^7.24.4`](https://renovatebot.com/diffs/npm/@babel%2fruntime/7.24.0/7.24.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fruntime/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fruntime/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fruntime/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fruntime/7.24.0/7.24.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/traverse](https://babel.dev/docs/en/next/babel-traverse)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-traverse))
| [`^7.24.0` ->
`^7.24.1`](https://renovatebot.com/diffs/npm/@babel%2ftraverse/7.24.0/7.24.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2ftraverse/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2ftraverse/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2ftraverse/7.24.0/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2ftraverse/7.24.0/7.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@babel/types](https://babel.dev/docs/en/next/babel-types)
([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-types))
| [`7.21.2` ->
`7.24.0`](https://renovatebot.com/diffs/npm/@babel%2ftypes/7.21.2/7.24.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2ftypes/7.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2ftypes/7.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2ftypes/7.21.2/7.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2ftypes/7.21.2/7.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
babel/babel (@babel/cli)
###
[`v7.24.1`](https://togithub.com/babel/babel/blob/HEAD/CHANGELOG.md#v7241-2024-03-19)
[Compare
Source](https://togithub.com/babel/babel/compare/v7.23.9...v7.24.1)
##### :bug: Bug Fix
- `babel-helper-create-class-features-plugin`,
`babel-plugin-proposal-decorators`
- [#16350](https://togithub.com/babel/babel/pull/16350) Fix
decorated class computed keys ordering
([@JLHwung](https://togithub.com/JLHwung))
- [#16344](https://togithub.com/babel/babel/pull/16344) Fix
decorated class static field private access
([@JLHwung](https://togithub.com/JLHwung))
- `babel-plugin-proposal-decorators`,
`babel-plugin-proposal-json-modules`,
`babel-plugin-transform-async-generator-functions`,
`babel-plugin-transform-regenerator`, `babel-plugin-transform-runtime`,
`babel-preset-env`
- [#16329](https://togithub.com/babel/babel/pull/16329) Respect
`moduleName` for `@babel/runtime/regenerator` imports
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-create-class-features-plugin`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-pipeline-operator`,
`babel-plugin-transform-class-properties`
- [#16331](https://togithub.com/babel/babel/pull/16331) Fix
decorator memoiser binding kind
([@JLHwung](https://togithub.com/JLHwung))
- `babel-helper-create-class-features-plugin`,
`babel-helper-replace-supers`, `babel-plugin-proposal-decorators`,
`babel-plugin-transform-class-properties`
- [#16325](https://togithub.com/babel/babel/pull/16325) Fix
decorator evaluation private environment
([@JLHwung](https://togithub.com/JLHwung))
##### :memo: Documentation
- [#16319](https://togithub.com/babel/babel/pull/16319) Update
SECURITY.md
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
##### :house: Internal
- `babel-code-frame`, `babel-highlight`
- [#16359](https://togithub.com/babel/babel/pull/16359) Replace
`chalk` with `picocolors`
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-fixtures`, `babel-helpers`,
`babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression`,
`babel-plugin-proposal-pipeline-operator`,
`babel-plugin-transform-unicode-sets-regex`, `babel-preset-env`,
`babel-preset-flow`
- [#16352](https://togithub.com/babel/babel/pull/16352) Run Babel
transform tests on old node if possible
([@JLHwung](https://togithub.com/JLHwung))
- `babel-helpers`, `babel-plugin-transform-async-generator-functions`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-class-static-block`,
`babel-plugin-transform-modules-commonjs`,
`babel-plugin-transform-modules-systemjs`,
`babel-plugin-transform-regenerator`, `babel-plugin-transform-runtime`,
`babel-preset-env`, `babel-runtime-corejs3`, `babel-runtime`,
`babel-standalone`
- [#16323](https://togithub.com/babel/babel/pull/16323) Allow
separate helpers to be excluded in Babel 8
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-helper-module-imports`,
`babel-plugin-proposal-import-wasm-source`,
`babel-plugin-proposal-json-modules`,
`babel-plugin-proposal-record-and-tuple`,
`babel-plugin-transform-react-jsx-development`,
`babel-plugin-transform-react-jsx`
- [#16349](https://togithub.com/babel/babel/pull/16349) Support
merging imports in import injector
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-create-class-features-plugin`,
`babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression`,
`babel-plugin-bugfix-v8-spread-parameters-in-optional-chaining`,
`babel-plugin-bugfix-v8-static-class-fields-redefine-readonly`,
`babel-plugin-external-helpers`,
`babel-plugin-proposal-async-do-expressions`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-destructuring-private`,
`babel-plugin-proposal-do-expressions`,
`babel-plugin-proposal-duplicate-named-capturing-groups-regex`,
`babel-plugin-proposal-explicit-resource-management`,
`babel-plugin-proposal-export-default-from`,
`babel-plugin-proposal-function-bind`,
`babel-plugin-proposal-function-sent`,
`babel-plugin-proposal-import-attributes-to-assertions`,
`babel-plugin-proposal-import-defer`,
`babel-plugin-proposal-import-wasm-source`,
`babel-plugin-proposal-json-modules`,
`babel-plugin-proposal-optional-chaining-assign`,
`babel-plugin-proposal-partial-application`,
`babel-plugin-proposal-pipeline-operator`,
`babel-plugin-proposal-record-and-tuple`,
`babel-plugin-proposal-regexp-modifiers`,
`babel-plugin-proposal-throw-expressions`,
`babel-plugin-syntax-async-do-expressions`,
`babel-plugin-syntax-decimal`, `babel-plugin-syntax-decorators`,
`babel-plugin-syntax-destructuring-private`,
`babel-plugin-syntax-do-expressions`,
`babel-plugin-syntax-explicit-resource-management`,
`babel-plugin-syntax-export-default-from`, `babel-plugin-syntax-flow`,
`babel-plugin-syntax-function-bind`,
`babel-plugin-syntax-function-sent`,
`babel-plugin-syntax-import-assertions`,
`babel-plugin-syntax-import-attributes`,
`babel-plugin-syntax-import-defer`,
`babel-plugin-syntax-import-reflection`,
`babel-plugin-syntax-import-source`, `babel-plugin-syntax-jsx`,
`babel-plugin-syntax-module-blocks`,
`babel-plugin-syntax-optional-chaining-assign`,
`babel-plugin-syntax-partial-application`,
`babel-plugin-syntax-pipeline-operator`,
`babel-plugin-syntax-record-and-tuple`,
`babel-plugin-syntax-throw-expressions`,
`babel-plugin-syntax-typescript`,
`babel-plugin-transform-arrow-functions`,
`babel-plugin-transform-async-generator-functions`,
`babel-plugin-transform-async-to-generator`,
`babel-plugin-transform-block-scoped-functions`,
`babel-plugin-transform-block-scoping`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-class-static-block`,
`babel-plugin-transform-classes`,
`babel-plugin-transform-computed-properties`,
`babel-plugin-transform-destructuring`,
`babel-plugin-transform-dotall-regex`,
`babel-plugin-transform-duplicate-keys`,
`babel-plugin-transform-dynamic-import`,
`babel-plugin-transform-exponentiation-operator`,
`babel-plugin-transform-export-namespace-from`,
`babel-plugin-transform-flow-comments`,
`babel-plugin-transform-flow-strip-types`,
`babel-plugin-transform-for-of`, `babel-plugin-transform-function-name`,
`babel-plugin-transform-instanceof`, `babel-plugin-transform-jscript`,
`babel-plugin-transform-json-strings`,
`babel-plugin-transform-literals`,
`babel-plugin-transform-logical-assignment-operators`,
`babel-plugin-transform-member-expression-literals`,
`babel-plugin-transform-modules-amd`,
`babel-plugin-transform-modules-commonjs`,
`babel-plugin-transform-modules-systemjs`,
`babel-plugin-transform-modules-umd`,
`babel-plugin-transform-new-target`,
`babel-plugin-transform-nullish-coalescing-operator`,
`babel-plugin-transform-numeric-separator`,
`babel-plugin-transform-object-assign`,
`babel-plugin-transform-object-rest-spread`,
`babel-plugin-transform-object-set-prototype-of-to-assign`,
`babel-plugin-transform-object-super`,
`babel-plugin-transform-optional-catch-binding`,
`babel-plugin-transform-optional-chaining`,
`babel-plugin-transform-parameters`,
`babel-plugin-transform-private-methods`,
`babel-plugin-transform-private-property-in-object`,
`babel-plugin-transform-property-literals`,
`babel-plugin-transform-property-mutators`,
`babel-plugin-transform-proto-to-assign`,
`babel-plugin-transform-react-constant-elements`,
`babel-plugin-transform-react-display-name`,
`babel-plugin-transform-react-inline-elements`,
`babel-plugin-transform-react-jsx-compat`,
`babel-plugin-transform-react-jsx-self`,
`babel-plugin-transform-react-jsx-source`,
`babel-plugin-transform-react-pure-annotations`,
`babel-plugin-transform-regenerator`,
`babel-plugin-transform-reserved-words`,
`babel-plugin-transform-runtime`,
`babel-plugin-transform-shorthand-properties`,
`babel-plugin-transform-spread`, `babel-plugin-transform-sticky-regex`,
`babel-plugin-transform-strict-mode`,
`babel-plugin-transform-template-literals`,
`babel-plugin-transform-typeof-symbol`,
`babel-plugin-transform-typescript`,
`babel-plugin-transform-unicode-escapes`,
`babel-plugin-transform-unicode-property-regex`,
`babel-plugin-transform-unicode-regex`,
`babel-plugin-transform-unicode-sets-regex`, `babel-preset-env`,
`babel-preset-flow`, `babel-preset-react`, `babel-preset-typescript`
- [#16332](https://togithub.com/babel/babel/pull/16332) Test
Babel 7 plugins compatibility with Babel 8 core
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-compat-data`, `babel-plugin-transform-object-rest-spread`,
`babel-preset-env`
- [#16318](https://togithub.com/babel/babel/pull/16318) \[babel
8] Fix `@babel/compat-data` package.json
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
##### :microscope: Output optimization
- `babel-helper-replace-supers`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`, `babel-plugin-transform-parameters`,
`babel-plugin-transform-runtime`
- [#16345](https://togithub.com/babel/babel/pull/16345) Optimize
the use of `assertThisInitialized` after `super()`
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`
- [#16343](https://togithub.com/babel/babel/pull/16343) Use
simpler `assertThisInitialized` more often
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-plugin-proposal-decorators`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-object-rest-spread`, `babel-traverse`
- [#16342](https://togithub.com/babel/babel/pull/16342) Consider
well-known and registered symbols as literals
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-core`, `babel-plugin-external-helpers`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-function-bind`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`,
`babel-plugin-transform-flow-comments`,
`babel-plugin-transform-flow-strip-types`,
`babel-plugin-transform-function-name`,
`babel-plugin-transform-modules-systemjs`,
`babel-plugin-transform-parameters`,
`babel-plugin-transform-private-property-in-object`,
`babel-plugin-transform-react-jsx`, `babel-plugin-transform-runtime`,
`babel-plugin-transform-spread`, `babel-plugin-transform-typescript`,
`babel-preset-env`
- [#16326](https://togithub.com/babel/babel/pull/16326) Reduce
the use of class names
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
babel/babel (@babel/eslint-parser)
###
[`v7.24.1`](https://togithub.com/babel/babel/compare/v7.23.10...v7.24.1)
[Compare
Source](https://togithub.com/babel/babel/compare/v7.23.10...v7.24.1)
babel/babel (@babel/parser)
### [`v7.24.4`](https://togithub.com/babel/babel/releases/tag/v7.24.4)
[Compare
Source](https://togithub.com/babel/babel/compare/v7.24.1...v7.24.4)
#### v7.24.4 (2024-04-03)
Thanks [@Dunqing](https://togithub.com/Dunqing),
[@luiscubal](https://togithub.com/luiscubal), and
[@samualtnorman](https://togithub.com/samualtnorman) for your
first PRs!
##### :eyeglasses: Spec Compliance
- `babel-parser`
- [#16403](https://togithub.com/babel/babel/pull/16403) Forbid
initializerless using ([@JLHwung](https://togithub.com/JLHwung))
- `babel-helpers`, `babel-plugin-proposal-decorators`,
`babel-runtime-corejs3`
- [#16388](https://togithub.com/babel/babel/pull/16388) Ensure
decorators are callable
([@JLHwung](https://togithub.com/JLHwung))
##### :bug: Bug Fix
- `babel-generator`
- [#16402](https://togithub.com/babel/babel/pull/16402) fix:
Correctly prints `{ [key in Bar]? }`
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- [#16394](https://togithub.com/babel/babel/pull/16394) fix:
Correctly generate `TSMappedType`
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-compat-data`,
`babel-plugin-bugfix-firefox-class-in-computed-class-key`,
`babel-preset-env`
- [#16390](https://togithub.com/babel/babel/pull/16390) Create
bugfix plugin for classes in computed keys in Firefox
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-create-class-features-plugin`,
`babel-plugin-proposal-decorators`
- [#16387](https://togithub.com/babel/babel/pull/16387) fix:
support mutated outer decorated class binding
([@JLHwung](https://togithub.com/JLHwung))
- [#16385](https://togithub.com/babel/babel/pull/16385) fix:
Decorators when `super()` exists and `protoInit` is not needed
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-plugin-transform-block-scoping`
- [#16384](https://togithub.com/babel/babel/pull/16384) fix:
Transform scoping for `for X` in loop
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- [#16368](https://togithub.com/babel/babel/pull/16368) fix:
Capture `let` when the `for` body is not a block
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-core`, `babel-plugin-transform-block-scoped-functions`,
`babel-plugin-transform-block-scoping`
- [#16363](https://togithub.com/babel/babel/pull/16363) Fix
incorrect function hoisting in some case statements
([@luiscubal](https://togithub.com/luiscubal))
##### Committers: 7
- Babel Bot ([@babel-bot](https://togithub.com/babel-bot))
- Dunqing ([@Dunqing](https://togithub.com/Dunqing))
- Huáng Jùnliàng ([@JLHwung](https://togithub.com/JLHwung))
- Luís Reis ([@luiscubal](https://togithub.com/luiscubal))
- Nicolò Ribaudo
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- Samual Norman
([@samualtnorman](https://togithub.com/samualtnorman))
- [@liuxingbaoyu](https://togithub.com/liuxingbaoyu)
### [`v7.24.1`](https://togithub.com/babel/babel/releases/tag/v7.24.1)
[Compare
Source](https://togithub.com/babel/babel/compare/v7.24.0...v7.24.1)
#### v7.24.1 (2024-03-19)
##### :bug: Bug Fix
- `babel-helper-create-class-features-plugin`,
`babel-plugin-proposal-decorators`
- [#16350](https://togithub.com/babel/babel/pull/16350) Fix
decorated class computed keys ordering
([@JLHwung](https://togithub.com/JLHwung))
- [#16344](https://togithub.com/babel/babel/pull/16344) Fix
decorated class static field private access
([@JLHwung](https://togithub.com/JLHwung))
- `babel-plugin-proposal-decorators`,
`babel-plugin-proposal-json-modules`,
`babel-plugin-transform-async-generator-functions`,
`babel-plugin-transform-regenerator`, `babel-plugin-transform-runtime`,
`babel-preset-env`
- [#16329](https://togithub.com/babel/babel/pull/16329) Respect
`moduleName` for `@babel/runtime/regenerator` imports
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-create-class-features-plugin`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-pipeline-operator`,
`babel-plugin-transform-class-properties`
- [#16331](https://togithub.com/babel/babel/pull/16331) Fix
decorator memoiser binding kind
([@JLHwung](https://togithub.com/JLHwung))
- `babel-helper-create-class-features-plugin`,
`babel-helper-replace-supers`, `babel-plugin-proposal-decorators`,
`babel-plugin-transform-class-properties`
- [#16325](https://togithub.com/babel/babel/pull/16325) Fix
decorator evaluation private environment
([@JLHwung](https://togithub.com/JLHwung))
##### :memo: Documentation
- [#16319](https://togithub.com/babel/babel/pull/16319) Update
SECURITY.md
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
##### :house: Internal
- `babel-code-frame`, `babel-highlight`
- [#16359](https://togithub.com/babel/babel/pull/16359) Replace
`chalk` with `picocolors`
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-helper-fixtures`, `babel-helpers`,
`babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression`,
`babel-plugin-proposal-pipeline-operator`,
`babel-plugin-transform-unicode-sets-regex`, `babel-preset-env`,
`babel-preset-flow`
- [#16352](https://togithub.com/babel/babel/pull/16352) Run Babel
transform tests on old node if possible
([@JLHwung](https://togithub.com/JLHwung))
- `babel-helper-module-imports`,
`babel-plugin-proposal-import-wasm-source`,
`babel-plugin-proposal-json-modules`,
`babel-plugin-proposal-record-and-tuple`,
`babel-plugin-transform-react-jsx-development`,
`babel-plugin-transform-react-jsx`
- [#16349](https://togithub.com/babel/babel/pull/16349) Support
merging imports in import injector
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- Other
- [#16332](https://togithub.com/babel/babel/pull/16332) Test
Babel 7 plugins compatibility with Babel 8 core
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
##### :microscope: Output optimization
- `babel-helper-replace-supers`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`, `babel-plugin-transform-parameters`,
`babel-plugin-transform-runtime`
- [#16345](https://togithub.com/babel/babel/pull/16345) Optimize
the use of `assertThisInitialized` after `super()`
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`
- [#16343](https://togithub.com/babel/babel/pull/16343) Use
simpler `assertThisInitialized` more often
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
- `babel-plugin-proposal-decorators`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-object-rest-spread`, `babel-traverse`
- [#16342](https://togithub.com/babel/babel/pull/16342) Consider
well-known and registered symbols as literals
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- `babel-core`, `babel-plugin-external-helpers`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-function-bind`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-classes`,
`babel-plugin-transform-flow-comments`,
`babel-plugin-transform-flow-strip-types`,
`babel-plugin-transform-function-name`,
`babel-plugin-transform-modules-systemjs`,
`babel-plugin-transform-parameters`,
`babel-plugin-transform-private-property-in-object`,
`babel-plugin-transform-react-jsx`, `babel-plugin-transform-runtime`,
`babel-plugin-transform-spread`, `babel-plugin-transform-typescript`,
`babel-preset-env`
- [#16326](https://togithub.com/babel/babel/pull/16326) Reduce
the use of class names
([@liuxingbaoyu](https://togithub.com/liuxingbaoyu))
##### Committers: 4
- Babel Bot ([@babel-bot](https://togithub.com/babel-bot))
- Huáng Jùnliàng ([@JLHwung](https://togithub.com/JLHwung))
- Nicolò Ribaudo
([@nicolo-ribaudo](https://togithub.com/nicolo-ribaudo))
- [@liuxingbaoyu](https://togithub.com/liuxingbaoyu)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/elastic/kibana).
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jonathan Budzenski
---
package.json | 26 +-
yarn.lock | 1008 +++++++++++++++++++++++++-------------------------
2 files changed, 516 insertions(+), 518 deletions(-)
diff --git a/package.json b/package.json
index 06040e5681c0b..fd15d8a4ce34a 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
},
"dependencies": {
"@appland/sql-parser": "^1.5.1",
- "@babel/runtime": "^7.24.0",
+ "@babel/runtime": "^7.24.4",
"@cfworker/json-schema": "^1.12.7",
"@dnd-kit/core": "^3.1.1",
"@dnd-kit/sortable": "^4.0.0",
@@ -1172,27 +1172,27 @@
},
"devDependencies": {
"@apidevtools/swagger-parser": "^10.0.3",
- "@babel/cli": "^7.23.9",
- "@babel/core": "^7.24.0",
- "@babel/eslint-parser": "^7.23.10",
+ "@babel/cli": "^7.24.1",
+ "@babel/core": "^7.24.4",
+ "@babel/eslint-parser": "^7.24.1",
"@babel/eslint-plugin": "^7.23.5",
- "@babel/generator": "^7.23.6",
+ "@babel/generator": "^7.24.4",
"@babel/helper-plugin-utils": "^7.24.0",
- "@babel/parser": "^7.24.0",
+ "@babel/parser": "^7.24.4",
"@babel/plugin-proposal-decorators": "^7.24.1",
"@babel/plugin-proposal-export-namespace-from": "^7.18.9",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
"@babel/plugin-proposal-private-methods": "^7.18.6",
- "@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-numeric-separator": "^7.23.4",
- "@babel/plugin-transform-runtime": "^7.24.0",
- "@babel/preset-env": "^7.24.0",
- "@babel/preset-react": "^7.23.3",
- "@babel/preset-typescript": "^7.23.3",
+ "@babel/plugin-transform-class-properties": "^7.24.1",
+ "@babel/plugin-transform-numeric-separator": "^7.24.1",
+ "@babel/plugin-transform-runtime": "^7.24.3",
+ "@babel/preset-env": "^7.24.4",
+ "@babel/preset-react": "^7.24.1",
+ "@babel/preset-typescript": "^7.24.1",
"@babel/register": "^7.23.7",
- "@babel/traverse": "^7.24.0",
+ "@babel/traverse": "^7.24.1",
"@babel/types": "7.21.2",
"@bazel/ibazel": "^0.16.2",
"@bazel/typescript": "4.6.2",
diff --git a/yarn.lock b/yarn.lock
index 8cc252b3258d0..47b6a266bd734 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -125,12 +125,12 @@
dependencies:
tslib "^2.3.1"
-"@babel/cli@^7.23.9":
- version "7.23.9"
- resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.9.tgz#06b3e76376ee53f14ac8ac422c884950c69e1b9e"
- integrity sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==
+"@babel/cli@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.1.tgz#2e11e071e32fe82850b4fe514f56b9c9e1c44911"
+ integrity sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==
dependencies:
- "@jridgewell/trace-mapping" "^0.3.17"
+ "@jridgewell/trace-mapping" "^0.3.25"
commander "^4.0.1"
convert-source-map "^2.0.0"
fs-readdir-recursive "^1.1.0"
@@ -141,18 +141,18 @@
"@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
chokidar "^3.4.0"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
- version "7.23.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
- integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
+ version "7.24.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
+ integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
dependencies:
- "@babel/highlight" "^7.23.4"
- chalk "^2.4.2"
+ "@babel/highlight" "^7.24.2"
+ picocolors "^1.0.0"
-"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5":
- version "7.23.5"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98"
- integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
+ integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
"@babel/core@7.12.9":
version "7.12.9"
@@ -176,20 +176,20 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.24.0", "@babel/core@^7.7.5":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b"
- integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==
+"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.24.4", "@babel/core@^7.7.5":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
+ integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.23.5"
- "@babel/generator" "^7.23.6"
+ "@babel/code-frame" "^7.24.2"
+ "@babel/generator" "^7.24.4"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3"
- "@babel/helpers" "^7.24.0"
- "@babel/parser" "^7.24.0"
+ "@babel/helpers" "^7.24.4"
+ "@babel/parser" "^7.24.4"
"@babel/template" "^7.24.0"
- "@babel/traverse" "^7.24.0"
+ "@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
convert-source-map "^2.0.0"
debug "^4.1.0"
@@ -197,10 +197,10 @@
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/eslint-parser@^7.23.10":
- version "7.23.10"
- resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2"
- integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==
+"@babel/eslint-parser@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32"
+ integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==
dependencies:
"@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
eslint-visitor-keys "^2.1.0"
@@ -213,14 +213,14 @@
dependencies:
eslint-rule-composer "^0.3.0"
-"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.23.6", "@babel/generator@^7.7.2":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
- integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
+"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498"
+ integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==
dependencies:
- "@babel/types" "^7.23.6"
- "@jridgewell/gen-mapping" "^0.3.2"
- "@jridgewell/trace-mapping" "^0.3.17"
+ "@babel/types" "^7.24.0"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
@@ -237,7 +237,7 @@
dependencies:
"@babel/types" "^7.22.15"
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6":
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
@@ -248,10 +248,10 @@
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6", "@babel/helper-create-class-features-plugin@^7.24.1":
- version "7.24.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f"
- integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3"
+ integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-environment-visitor" "^7.22.20"
@@ -286,21 +286,10 @@
resolve "^1.14.2"
semver "^6.1.2"
-"@babel/helper-define-polyfill-provider@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b"
- integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==
- dependencies:
- "@babel/helper-compilation-targets" "^7.22.6"
- "@babel/helper-plugin-utils" "^7.22.5"
- debug "^4.1.1"
- lodash.debounce "^4.0.8"
- resolve "^1.14.2"
-
-"@babel/helper-define-polyfill-provider@^0.6.0":
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.0.tgz#4d1a8b898c8299a2fcf295d7d356d2648471ab31"
- integrity sha512-efwOM90nCG6YeT8o3PCyBVSxRfmILxCNL+TNI8CGQl7a62M0Wd9VkV+XHwIlkOz1r4b+lxu6gBjdWiOMdUCrCQ==
+"@babel/helper-define-polyfill-provider@^0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd"
+ integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==
dependencies:
"@babel/helper-compilation-targets" "^7.22.6"
"@babel/helper-plugin-utils" "^7.22.5"
@@ -335,12 +324,12 @@
dependencies:
"@babel/types" "^7.23.0"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
- integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
+ integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
dependencies:
- "@babel/types" "^7.22.15"
+ "@babel/types" "^7.24.0"
"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.23.3":
version "7.23.3"
@@ -379,7 +368,7 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-wrap-function" "^7.22.20"
-"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.24.1":
+"@babel/helper-replace-supers@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1"
integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==
@@ -419,7 +408,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
-"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5":
+"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
@@ -433,52 +422,61 @@
"@babel/template" "^7.22.15"
"@babel/types" "^7.22.19"
-"@babel/helpers@^7.12.5", "@babel/helpers@^7.24.0":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b"
- integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==
+"@babel/helpers@^7.12.5", "@babel/helpers@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
+ integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==
dependencies:
"@babel/template" "^7.24.0"
- "@babel/traverse" "^7.24.0"
+ "@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
-"@babel/highlight@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
- integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+"@babel/highlight@^7.24.2":
+ version "7.24.2"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
+ integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
chalk "^2.4.2"
js-tokens "^4.0.0"
+ picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac"
- integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==
+"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
+ integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a"
- integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1"
+ integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d"
- integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf"
+ integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3"
+ integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/plugin-transform-optional-chaining" "^7.23.3"
+ "@babel/plugin-transform-optional-chaining" "^7.24.1"
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7":
- version "7.23.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b"
- integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988"
+ integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-proposal-class-properties@^7.12.1":
version "7.18.6"
@@ -636,19 +634,19 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-syntax-import-assertions@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc"
- integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==
+"@babel/plugin-syntax-import-assertions@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971"
+ integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-syntax-import-attributes@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06"
- integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==
+"@babel/plugin-syntax-import-attributes@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093"
+ integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
@@ -671,12 +669,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473"
- integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==
+"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10"
+ integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
@@ -734,12 +732,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-typescript@^7.23.3", "@babel/plugin-syntax-typescript@^7.7.2":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f"
- integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==
+"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844"
+ integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
@@ -748,129 +746,129 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b"
- integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==
+"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27"
+ integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-async-generator-functions@^7.23.9":
- version "7.23.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce"
- integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==
+"@babel/plugin-transform-async-generator-functions@^7.24.3":
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89"
+ integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-remap-async-to-generator" "^7.22.20"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-transform-async-to-generator@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa"
- integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==
+"@babel/plugin-transform-async-to-generator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4"
+ integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==
dependencies:
- "@babel/helper-module-imports" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-module-imports" "^7.24.1"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-remap-async-to-generator" "^7.22.20"
-"@babel/plugin-transform-block-scoped-functions@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77"
- integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==
+"@babel/plugin-transform-block-scoped-functions@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380"
+ integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5"
- integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==
+"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012"
+ integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-class-properties@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48"
- integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==
+"@babel/plugin-transform-class-properties@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29"
+ integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.24.1"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-class-static-block@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5"
- integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==
+"@babel/plugin-transform-class-static-block@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4"
+ integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.24.4"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
-"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.23.8":
- version "7.23.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92"
- integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==
+"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1"
+ integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.20"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/helper-replace-supers" "^7.24.1"
"@babel/helper-split-export-declaration" "^7.22.6"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474"
- integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==
+"@babel/plugin-transform-computed-properties@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7"
+ integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/template" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/template" "^7.24.0"
-"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311"
- integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==
+"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345"
+ integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-dotall-regex@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50"
- integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==
+"@babel/plugin-transform-dotall-regex@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13"
+ integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-duplicate-keys@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce"
- integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==
+"@babel/plugin-transform-duplicate-keys@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88"
+ integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-dynamic-import@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143"
- integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==
+"@babel/plugin-transform-dynamic-import@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd"
+ integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
-"@babel/plugin-transform-exponentiation-operator@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18"
- integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==
+"@babel/plugin-transform-exponentiation-operator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4"
+ integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==
dependencies:
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-export-namespace-from@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191"
- integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==
+"@babel/plugin-transform-export-namespace-from@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd"
+ integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-transform-flow-strip-types@^7.18.6":
@@ -881,87 +879,87 @@
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-syntax-flow" "^7.18.6"
-"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.23.6":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e"
- integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==
+"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd"
+ integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-function-name@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc"
- integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==
+"@babel/plugin-transform-function-name@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361"
+ integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==
dependencies:
- "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-function-name" "^7.23.0"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-json-strings@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d"
- integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==
+"@babel/plugin-transform-json-strings@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7"
+ integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-json-strings" "^7.8.3"
-"@babel/plugin-transform-literals@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4"
- integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==
+"@babel/plugin-transform-literals@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096"
+ integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-logical-assignment-operators@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5"
- integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==
+"@babel/plugin-transform-logical-assignment-operators@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40"
+ integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-transform-member-expression-literals@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc"
- integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==
+"@babel/plugin-transform-member-expression-literals@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489"
+ integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-modules-amd@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d"
- integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==
+"@babel/plugin-transform-modules-amd@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39"
+ integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==
dependencies:
"@babel/helper-module-transforms" "^7.23.3"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-modules-commonjs@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4"
- integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==
+"@babel/plugin-transform-modules-commonjs@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9"
+ integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==
dependencies:
"@babel/helper-module-transforms" "^7.23.3"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-simple-access" "^7.22.5"
-"@babel/plugin-transform-modules-systemjs@^7.23.9":
- version "7.23.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be"
- integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==
+"@babel/plugin-transform-modules-systemjs@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e"
+ integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==
dependencies:
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-module-transforms" "^7.23.3"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-validator-identifier" "^7.22.20"
-"@babel/plugin-transform-modules-umd@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9"
- integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==
+"@babel/plugin-transform-modules-umd@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef"
+ integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==
dependencies:
"@babel/helper-module-transforms" "^7.23.3"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
version "7.22.5"
@@ -971,103 +969,102 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-new-target@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980"
- integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==
+"@babel/plugin-transform-new-target@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34"
+ integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e"
- integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988"
+ integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-transform-numeric-separator@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29"
- integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==
+"@babel/plugin-transform-numeric-separator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8"
+ integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-transform-object-rest-spread@^7.24.0":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz#7b836ad0088fdded2420ce96d4e1d3ed78b71df1"
- integrity sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==
+"@babel/plugin-transform-object-rest-spread@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff"
+ integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==
dependencies:
- "@babel/compat-data" "^7.23.5"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.23.3"
+ "@babel/plugin-transform-parameters" "^7.24.1"
-"@babel/plugin-transform-object-super@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd"
- integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==
+"@babel/plugin-transform-object-super@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520"
+ integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.20"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/helper-replace-supers" "^7.24.1"
-"@babel/plugin-transform-optional-catch-binding@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017"
- integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==
+"@babel/plugin-transform-optional-catch-binding@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da"
+ integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017"
- integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==
+"@babel/plugin-transform-optional-chaining@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6"
+ integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af"
- integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==
+"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510"
+ integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-private-methods@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4"
- integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==
+"@babel/plugin-transform-private-methods@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a"
+ integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.24.1"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-private-property-in-object@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5"
- integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==
+"@babel/plugin-transform-private-property-in-object@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a"
+ integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-create-class-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.24.1"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-transform-property-literals@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875"
- integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==
+"@babel/plugin-transform-property-literals@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825"
+ integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-react-display-name@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200"
- integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==
+"@babel/plugin-transform-react-display-name@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb"
+ integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-transform-react-jsx-development@^7.22.5":
version "7.22.5"
@@ -1076,7 +1073,7 @@
dependencies:
"@babel/plugin-transform-react-jsx" "^7.22.5"
-"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.17.12", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5":
+"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.17.12", "@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4":
version "7.23.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312"
integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==
@@ -1087,138 +1084,139 @@
"@babel/plugin-syntax-jsx" "^7.23.3"
"@babel/types" "^7.23.4"
-"@babel/plugin-transform-react-pure-annotations@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c"
- integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==
+"@babel/plugin-transform-react-pure-annotations@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470"
+ integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-regenerator@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c"
- integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==
+"@babel/plugin-transform-regenerator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c"
+ integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
regenerator-transform "^0.15.2"
-"@babel/plugin-transform-reserved-words@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8"
- integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==
+"@babel/plugin-transform-reserved-words@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1"
+ integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-runtime@^7.24.0":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz#e308fe27d08b74027d42547081eefaf4f2ffbcc9"
- integrity sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==
+"@babel/plugin-transform-runtime@^7.24.3":
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f"
+ integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==
dependencies:
- "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-module-imports" "^7.24.3"
"@babel/helper-plugin-utils" "^7.24.0"
- babel-plugin-polyfill-corejs2 "^0.4.8"
- babel-plugin-polyfill-corejs3 "^0.9.0"
- babel-plugin-polyfill-regenerator "^0.5.5"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.1"
+ babel-plugin-polyfill-regenerator "^0.6.1"
semver "^6.3.1"
-"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210"
- integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==
+"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55"
+ integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c"
- integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==
+"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391"
+ integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-sticky-regex@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04"
- integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==
+"@babel/plugin-transform-sticky-regex@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9"
+ integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07"
- integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==
+"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7"
+ integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-typeof-symbol@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4"
- integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==
+"@babel/plugin-transform-typeof-symbol@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7"
+ integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-typescript@^7.23.3":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c"
- integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==
+"@babel/plugin-transform-typescript@^7.24.1":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15"
+ integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-create-class-features-plugin" "^7.23.6"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-typescript" "^7.23.3"
+ "@babel/helper-create-class-features-plugin" "^7.24.4"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/plugin-syntax-typescript" "^7.24.1"
-"@babel/plugin-transform-unicode-escapes@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925"
- integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==
+"@babel/plugin-transform-unicode-escapes@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4"
+ integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-property-regex@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad"
- integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==
+"@babel/plugin-transform-unicode-property-regex@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e"
+ integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-regex@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc"
- integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==
+"@babel/plugin-transform-unicode-regex@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385"
+ integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-sets-regex@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e"
- integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==
+"@babel/plugin-transform-unicode-sets-regex@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f"
+ integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.24.0"
-"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.24.0":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.0.tgz#11536a7f4b977294f0bdfad780f01a8ac8e183fc"
- integrity sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==
+"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.24.4":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b"
+ integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==
dependencies:
- "@babel/compat-data" "^7.23.5"
+ "@babel/compat-data" "^7.24.4"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-validator-option" "^7.23.5"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3"
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1"
"@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.23.3"
- "@babel/plugin-syntax-import-attributes" "^7.23.3"
+ "@babel/plugin-syntax-import-assertions" "^7.24.1"
+ "@babel/plugin-syntax-import-attributes" "^7.24.1"
"@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
@@ -1230,58 +1228,58 @@
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
"@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.23.3"
- "@babel/plugin-transform-async-generator-functions" "^7.23.9"
- "@babel/plugin-transform-async-to-generator" "^7.23.3"
- "@babel/plugin-transform-block-scoped-functions" "^7.23.3"
- "@babel/plugin-transform-block-scoping" "^7.23.4"
- "@babel/plugin-transform-class-properties" "^7.23.3"
- "@babel/plugin-transform-class-static-block" "^7.23.4"
- "@babel/plugin-transform-classes" "^7.23.8"
- "@babel/plugin-transform-computed-properties" "^7.23.3"
- "@babel/plugin-transform-destructuring" "^7.23.3"
- "@babel/plugin-transform-dotall-regex" "^7.23.3"
- "@babel/plugin-transform-duplicate-keys" "^7.23.3"
- "@babel/plugin-transform-dynamic-import" "^7.23.4"
- "@babel/plugin-transform-exponentiation-operator" "^7.23.3"
- "@babel/plugin-transform-export-namespace-from" "^7.23.4"
- "@babel/plugin-transform-for-of" "^7.23.6"
- "@babel/plugin-transform-function-name" "^7.23.3"
- "@babel/plugin-transform-json-strings" "^7.23.4"
- "@babel/plugin-transform-literals" "^7.23.3"
- "@babel/plugin-transform-logical-assignment-operators" "^7.23.4"
- "@babel/plugin-transform-member-expression-literals" "^7.23.3"
- "@babel/plugin-transform-modules-amd" "^7.23.3"
- "@babel/plugin-transform-modules-commonjs" "^7.23.3"
- "@babel/plugin-transform-modules-systemjs" "^7.23.9"
- "@babel/plugin-transform-modules-umd" "^7.23.3"
+ "@babel/plugin-transform-arrow-functions" "^7.24.1"
+ "@babel/plugin-transform-async-generator-functions" "^7.24.3"
+ "@babel/plugin-transform-async-to-generator" "^7.24.1"
+ "@babel/plugin-transform-block-scoped-functions" "^7.24.1"
+ "@babel/plugin-transform-block-scoping" "^7.24.4"
+ "@babel/plugin-transform-class-properties" "^7.24.1"
+ "@babel/plugin-transform-class-static-block" "^7.24.4"
+ "@babel/plugin-transform-classes" "^7.24.1"
+ "@babel/plugin-transform-computed-properties" "^7.24.1"
+ "@babel/plugin-transform-destructuring" "^7.24.1"
+ "@babel/plugin-transform-dotall-regex" "^7.24.1"
+ "@babel/plugin-transform-duplicate-keys" "^7.24.1"
+ "@babel/plugin-transform-dynamic-import" "^7.24.1"
+ "@babel/plugin-transform-exponentiation-operator" "^7.24.1"
+ "@babel/plugin-transform-export-namespace-from" "^7.24.1"
+ "@babel/plugin-transform-for-of" "^7.24.1"
+ "@babel/plugin-transform-function-name" "^7.24.1"
+ "@babel/plugin-transform-json-strings" "^7.24.1"
+ "@babel/plugin-transform-literals" "^7.24.1"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.1"
+ "@babel/plugin-transform-member-expression-literals" "^7.24.1"
+ "@babel/plugin-transform-modules-amd" "^7.24.1"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.1"
+ "@babel/plugin-transform-modules-systemjs" "^7.24.1"
+ "@babel/plugin-transform-modules-umd" "^7.24.1"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
- "@babel/plugin-transform-new-target" "^7.23.3"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4"
- "@babel/plugin-transform-numeric-separator" "^7.23.4"
- "@babel/plugin-transform-object-rest-spread" "^7.24.0"
- "@babel/plugin-transform-object-super" "^7.23.3"
- "@babel/plugin-transform-optional-catch-binding" "^7.23.4"
- "@babel/plugin-transform-optional-chaining" "^7.23.4"
- "@babel/plugin-transform-parameters" "^7.23.3"
- "@babel/plugin-transform-private-methods" "^7.23.3"
- "@babel/plugin-transform-private-property-in-object" "^7.23.4"
- "@babel/plugin-transform-property-literals" "^7.23.3"
- "@babel/plugin-transform-regenerator" "^7.23.3"
- "@babel/plugin-transform-reserved-words" "^7.23.3"
- "@babel/plugin-transform-shorthand-properties" "^7.23.3"
- "@babel/plugin-transform-spread" "^7.23.3"
- "@babel/plugin-transform-sticky-regex" "^7.23.3"
- "@babel/plugin-transform-template-literals" "^7.23.3"
- "@babel/plugin-transform-typeof-symbol" "^7.23.3"
- "@babel/plugin-transform-unicode-escapes" "^7.23.3"
- "@babel/plugin-transform-unicode-property-regex" "^7.23.3"
- "@babel/plugin-transform-unicode-regex" "^7.23.3"
- "@babel/plugin-transform-unicode-sets-regex" "^7.23.3"
+ "@babel/plugin-transform-new-target" "^7.24.1"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1"
+ "@babel/plugin-transform-numeric-separator" "^7.24.1"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.1"
+ "@babel/plugin-transform-object-super" "^7.24.1"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.1"
+ "@babel/plugin-transform-optional-chaining" "^7.24.1"
+ "@babel/plugin-transform-parameters" "^7.24.1"
+ "@babel/plugin-transform-private-methods" "^7.24.1"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.1"
+ "@babel/plugin-transform-property-literals" "^7.24.1"
+ "@babel/plugin-transform-regenerator" "^7.24.1"
+ "@babel/plugin-transform-reserved-words" "^7.24.1"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.1"
+ "@babel/plugin-transform-spread" "^7.24.1"
+ "@babel/plugin-transform-sticky-regex" "^7.24.1"
+ "@babel/plugin-transform-template-literals" "^7.24.1"
+ "@babel/plugin-transform-typeof-symbol" "^7.24.1"
+ "@babel/plugin-transform-unicode-escapes" "^7.24.1"
+ "@babel/plugin-transform-unicode-property-regex" "^7.24.1"
+ "@babel/plugin-transform-unicode-regex" "^7.24.1"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.24.1"
"@babel/preset-modules" "0.1.6-no-external-plugins"
- babel-plugin-polyfill-corejs2 "^0.4.8"
- babel-plugin-polyfill-corejs3 "^0.9.0"
- babel-plugin-polyfill-regenerator "^0.5.5"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-regenerator "^0.6.1"
core-js-compat "^3.31.0"
semver "^6.3.1"
@@ -1303,28 +1301,28 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709"
- integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==
+"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95"
+ integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-transform-react-display-name" "^7.23.3"
- "@babel/plugin-transform-react-jsx" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/helper-validator-option" "^7.23.5"
+ "@babel/plugin-transform-react-display-name" "^7.24.1"
+ "@babel/plugin-transform-react-jsx" "^7.23.4"
"@babel/plugin-transform-react-jsx-development" "^7.22.5"
- "@babel/plugin-transform-react-pure-annotations" "^7.23.3"
+ "@babel/plugin-transform-react-pure-annotations" "^7.24.1"
-"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.23.3":
- version "7.23.3"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913"
- integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==
+"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec"
+ integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-syntax-jsx" "^7.23.3"
- "@babel/plugin-transform-modules-commonjs" "^7.23.3"
- "@babel/plugin-transform-typescript" "^7.23.3"
+ "@babel/helper-plugin-utils" "^7.24.0"
+ "@babel/helper-validator-option" "^7.23.5"
+ "@babel/plugin-syntax-jsx" "^7.24.1"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.1"
+ "@babel/plugin-transform-typescript" "^7.24.1"
"@babel/register@^7.12.1", "@babel/register@^7.23.7":
version "7.23.7"
@@ -1342,10 +1340,10 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e"
- integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
+ integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
dependencies:
regenerator-runtime "^0.14.0"
@@ -1358,18 +1356,18 @@
"@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0"
-"@babel/traverse@^7.10.3", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.24.0", "@babel/traverse@^7.4.5":
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e"
- integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==
+"@babel/traverse@^7.10.3", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.24.1", "@babel/traverse@^7.4.5":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
+ integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
dependencies:
- "@babel/code-frame" "^7.23.5"
- "@babel/generator" "^7.23.6"
+ "@babel/code-frame" "^7.24.1"
+ "@babel/generator" "^7.24.1"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.24.0"
+ "@babel/parser" "^7.24.1"
"@babel/types" "^7.24.0"
debug "^4.3.1"
globals "^11.1.0"
@@ -1392,7 +1390,7 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
-"@babel/types@^7.22.19", "@babel/types@^7.23.4", "@babel/types@^7.23.6":
+"@babel/types@^7.22.19", "@babel/types@^7.23.4":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
@@ -2995,24 +2993,24 @@
"@jridgewell/set-array" "^1.0.0"
"@jridgewell/sourcemap-codec" "^1.4.10"
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
- integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
dependencies:
- "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/set-array" "^1.2.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
+ "@jridgewell/trace-mapping" "^0.3.24"
"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
"@jridgewell/source-map@^0.3.3":
version "0.3.5"
@@ -3035,7 +3033,7 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
-"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9":
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.25"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
@@ -12357,13 +12355,13 @@ babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0:
cosmiconfig "^7.0.0"
resolve "^1.19.0"
-babel-plugin-polyfill-corejs2@^0.4.8:
- version "0.4.9"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.9.tgz#15a285f681e1c5495093d85f1cf72bd1cbed41ce"
- integrity sha512-BXIWIaO3MewbXWdJdIGDWZurv5OGJlFNo7oy20DpB3kWDVJLcY2NRypRsRUbRe5KMqSNLuOGnWTFQQtY5MAsRw==
+babel-plugin-polyfill-corejs2@^0.4.10:
+ version "0.4.10"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1"
+ integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==
dependencies:
"@babel/compat-data" "^7.22.6"
- "@babel/helper-define-polyfill-provider" "^0.6.0"
+ "@babel/helper-define-polyfill-provider" "^0.6.1"
semver "^6.3.1"
babel-plugin-polyfill-corejs3@^0.1.0:
@@ -12374,20 +12372,20 @@ babel-plugin-polyfill-corejs3@^0.1.0:
"@babel/helper-define-polyfill-provider" "^0.1.5"
core-js-compat "^3.8.1"
-babel-plugin-polyfill-corejs3@^0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81"
- integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==
+babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77"
+ integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.5.0"
- core-js-compat "^3.34.0"
+ "@babel/helper-define-polyfill-provider" "^0.6.1"
+ core-js-compat "^3.36.1"
-babel-plugin-polyfill-regenerator@^0.5.5:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a"
- integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==
+babel-plugin-polyfill-regenerator@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be"
+ integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.5.0"
+ "@babel/helper-define-polyfill-provider" "^0.6.1"
babel-plugin-react-docgen@^4.2.1:
version "4.2.1"
@@ -12967,7 +12965,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.20.3, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.22.3:
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.20.3, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0:
version "4.23.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
@@ -14217,12 +14215,12 @@ copy-to-clipboard@^3.0.8, copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1:
dependencies:
toggle-selection "^1.0.6"
-core-js-compat@^3.31.0, core-js-compat@^3.34.0, core-js-compat@^3.8.1:
- version "3.36.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190"
- integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==
+core-js-compat@^3.31.0, core-js-compat@^3.36.1, core-js-compat@^3.8.1:
+ version "3.37.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73"
+ integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==
dependencies:
- browserslist "^4.22.3"
+ browserslist "^4.23.0"
core-js-pure@^3.8.1:
version "3.26.0"
From e45a26edfe69590973eaa325fea38529ed7b2f6b Mon Sep 17 00:00:00 2001
From: Elastic Machine
Date: Tue, 23 Apr 2024 18:01:36 +0200
Subject: [PATCH 082/183] [main] Sync bundled packages with Package Storage
(#181447)
Automated by
https://buildkite.com/elastic/package-storage-infra-kibana-discover-release-branches/builds/603
---
fleet_packages.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fleet_packages.json b/fleet_packages.json
index 633fd76e2498f..4de7895192d4e 100644
--- a/fleet_packages.json
+++ b/fleet_packages.json
@@ -56,6 +56,6 @@
},
{
"name": "security_detection_engine",
- "version": "8.13.3"
+ "version": "8.13.4"
}
]
\ No newline at end of file
From bc53c8ae428698aef554c947e976c9d48b41988c Mon Sep 17 00:00:00 2001
From: Steph Milovic
Date: Tue, 23 Apr 2024 10:12:52 -0600
Subject: [PATCH 083/183] [Security solution] Remove extra spacing from message
(#181367)
---
.../chat_send/use_chat_send.test.tsx | 4 +-
.../impl/assistant/prompt/helpers.test.ts | 58 +++++++++++++++++--
.../impl/assistant/prompt/helpers.ts | 13 +++--
3 files changed, 63 insertions(+), 12 deletions(-)
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx
index 73caae8ed6fc3..6b3b2f8f06efb 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx
@@ -104,7 +104,7 @@ describe('use chat send', () => {
expect(sendMessage).toHaveBeenCalled();
const appendMessageSend = sendMessage.mock.calls[0][0].message;
expect(appendMessageSend).toEqual(
- `You are a helpful, expert assistant who answers questions about Elastic Security. Do not answer questions unrelated to Elastic Security.\nIf you answer a question related to KQL or EQL, it should be immediately usable within an Elastic Security timeline; please always format the output correctly with back ticks. Any answer provided for Query DSL should also be usable in a security timeline. This means you should only ever include the "filter" portion of the query.\nUse the following context to answer questions:\n\n\n\n${promptText}`
+ `You are a helpful, expert assistant who answers questions about Elastic Security. Do not answer questions unrelated to Elastic Security.\nIf you answer a question related to KQL or EQL, it should be immediately usable within an Elastic Security timeline; please always format the output correctly with back ticks. Any answer provided for Query DSL should also be usable in a security timeline. This means you should only ever include the "filter" portion of the query.\nUse the following context to answer questions:\n\n${promptText}`
);
});
});
@@ -124,7 +124,7 @@ describe('use chat send', () => {
await waitFor(() => {
expect(sendMessage).toHaveBeenCalled();
const messages = setCurrentConversation.mock.calls[0][0].messages;
- expect(messages[messages.length - 1].content).toEqual(`\n\n${promptText}`);
+ expect(messages[messages.length - 1].content).toEqual(promptText);
});
});
it('handleRegenerateResponse removes the last message of the conversation, resends the convo to GenAI, and appends the message received', async () => {
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts
index 97840d777feac..33b33f83e6581 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts
@@ -94,9 +94,7 @@ User prompt text`);
selectedSystemPrompt: undefined, // <-- no system prompt
});
- expect(message.content).toEqual(`
-
-CONTEXT:
+ expect(message.content).toEqual(`CONTEXT:
"""
alert data
"""
@@ -148,6 +146,56 @@ User prompt text`);
expect(Date.parse(message.timestamp)).not.toBeNaN();
});
+ it('should return the correct combined message for a new chat without prompt context', () => {
+ const result = getCombinedMessage({
+ currentReplacements: {},
+ isNewChat: true,
+ promptText: 'User prompt text',
+ selectedSystemPrompt: mockSystemPrompt,
+ selectedPromptContexts: {},
+ });
+
+ expect(result.content).toEqual(
+ `You are a helpful, expert assistant who answers questions about Elastic Security.\n\nUser prompt text`
+ );
+ });
+
+ it('should return the correct combined message for a new chat without system context and multiple selectedPromptContext', () => {
+ const result = getCombinedMessage({
+ currentReplacements: {},
+ isNewChat: true,
+ promptText: 'User prompt text',
+ selectedPromptContexts: {
+ context1: {
+ promptContextId: 'context1',
+ rawData: 'This is raw data for context 1',
+ replacements: {},
+ },
+ context2: {
+ promptContextId: 'context2',
+ rawData: 'This is raw data for context 2',
+ replacements: {},
+ },
+ },
+ selectedSystemPrompt: { ...mockSystemPrompt, content: '' },
+ });
+
+ expect(result.content).toEqual(
+ `CONTEXT:\n\"\"\"\nThis is raw data for context 1\n\"\"\"\n,CONTEXT:\n\"\"\"\nThis is raw data for context 2\n\"\"\"\n\nUser prompt text`
+ );
+ });
+
+ it('should remove extra spaces when there is no prompt content or system prompt', () => {
+ const result = getCombinedMessage({
+ currentReplacements: {},
+ isNewChat: true,
+ promptText: 'User prompt text',
+ selectedPromptContexts: {},
+ selectedSystemPrompt: { ...mockSystemPrompt, content: '' },
+ });
+
+ expect(result.content).toEqual(`User prompt text`);
+ });
describe('when there is data to anonymize', () => {
const mockPromptContextWithDataToAnonymize: SelectedPromptContext = {
@@ -210,9 +258,7 @@ User prompt text`);
selectedSystemPrompt: mockSystemPrompt,
});
- expect(message.content).toEqual(`
-
-User prompt text`);
+ expect(message.content).toEqual(`User prompt text`);
});
});
});
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts
index 5d334f64f0e11..448ab6aa895b1 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts
@@ -71,13 +71,18 @@ export function getCombinedMessage({
rawData: selectedPromptContexts[id].rawData,
});
- return `${SYSTEM_PROMPT_CONTEXT_NON_I18N(promptContextData)}`;
+ return `${SYSTEM_PROMPT_CONTEXT_NON_I18N(promptContextData)}\n`;
});
+ const content = `${
+ isNewChat && selectedSystemPrompt && selectedSystemPrompt.content.length > 0
+ ? `${selectedSystemPrompt?.content ?? ''}\n\n`
+ : ''
+ }${promptContextsContent.length > 0 ? `${promptContextsContent}\n` : ''}${promptText}`;
+
return {
- content: `${
- isNewChat ? `${selectedSystemPrompt?.content ?? ''}\n\n` : ''
- }${promptContextsContent}\n\n${promptText}`,
+ // trim ensures any extra \n and other whitespace is removed
+ content: content.trim(),
role: 'user', // we are combining the system and user messages into one message
timestamp: new Date().toLocaleString(),
replacements,
From c351e14e83552262a25488104d207ce70e1d0b47 Mon Sep 17 00:00:00 2001
From: Gloria Hornero
Date: Tue, 23 Apr 2024 18:21:13 +0200
Subject: [PATCH 084/183] [Security Solution] Adds serverlessQA tag to the API
tests (#180773)
Continues https://github.com/elastic/kibana/pull/179737 effort we are
aligning the tags on Cypress and API to have a unified experience.
## Summary
We want to start integrating our Cypress tests with the serverless
Kibana quality gate. However, not all the teams feel comfortable
enabling all the tests, to facilitate the effort of enabling tests in
the quality gate we are adding the `@serverlessQA` tag, now on API tests
as well.
We use tags to select which tests we want to execute on each environment
and pipeline.
`ess` - runs in ESS env
`serverless` - runs in serverless env and periodic pipeline (failures
don't block release)
`serverlessQA` - runs in kibana release process (failures block release)
`skipInEss` - skipped for ESS env
`skipInServerless` - skipped for all serverless related environments
`skipInServerlessMKI` - skipped for MKI environments
### Description
**Tests tagged as `@serverless`**
All the tests tagged as `@serverless` will be executed as part of the PR
validation process using the serverless FTR environment (not a real
one). That tests will be executed as well as part of the periodic
pipeline using a real serverless project. QA environment is used to do
so using the latest available commit in main at the time of the
execution.
**Tests tagged as `@serverlessQA`**
All the tests tagged as `@serverlessQA` will be executed as part of the
kibana release process using a real serverless project with the latest
image available in the QA environment
**Tests tagged as `@ess`**
All the tests tagged as `@ess` will be executed as part of the PR
validation process using an on-prem ESS environment.
**Tests tagged as `@skipInServerless`**
All the tests tagged as `@skipInServerless` will be excluded from the PR
validation process using the serverless FTR environment, the periodic
pipeline and kibana release process for Serverless.
**Tests tagged as `@skipInEss`**
All the tests tagged as `skipInEss` will be excluded from the PR
validation process using an on-prem ESS environment.
---------
Co-authored-by: Ryland Herrick
---
.../api_integration_serverless_release.yml | 389 ++++++++++++++++++
.../README.md | 20 +-
.../config/ess/config.base.ts | 2 +-
.../serverless/config.base.essentials.ts | 2 +-
.../config/serverless/config.base.ts | 2 +-
.../package.json | 114 +++--
.../scripts/index.js | 10 +-
.../add_actions.ts | 2 +-
.../check_privileges.ts | 2 +-
.../update_actions.ts | 12 +-
.../field_aliases.ts | 2 +-
.../query_alerts.ts | 2 +-
.../set_alert_tags.ts | 3 +-
.../assignments/assignments.ts | 3 +-
.../assignments/assignments_serverless.ts | 3 +-
.../document_level_security.ts | 2 +-
.../basic_license_essentials_tier/date.ts | 2 +-
.../basic_license_essentials_tier/double.ts | 2 +-
.../basic_license_essentials_tier/float.ts | 2 +-
.../basic_license_essentials_tier/integer.ts | 2 +-
.../ips/basic_license_essentials_tier/ip.ts | 2 +-
.../basic_license_essentials_tier/ip_array.ts | 2 +-
.../basic_license_essentials_tier/keyword.ts | 2 +-
.../keyword_array.ts | 2 +-
.../basic_license_essentials_tier/long.ts | 2 +-
.../basic_license_essentials_tier/text.ts | 2 +-
.../text_array.ts | 2 +-
.../create_endpoint_exceptions.ts | 2 +-
.../create_rule_exceptions.ts | 2 +-
.../exception_comments_serverless.ts | 3 +-
.../exceptions_data_integrity.ts | 3 +-
.../find_rule_exception_references.ts | 2 +-
.../prebuilt_rules.ts | 3 +-
.../rule_exceptions_execution.ts | 2 +-
.../execution_logic/eql.ts | 2 +-
.../execution_logic/machine_learning.ts | 8 +-
.../execution_logic/new_terms.ts | 2 +-
.../new_terms_alert_suppression.ts | 2 +-
.../execution_logic/non_ecs_fields.ts | 2 +-
.../execution_logic/query.ts | 4 +-
.../execution_logic/saved_query.ts | 2 +-
.../execution_logic/threat_match.ts | 3 +-
.../threat_match_alert_suppression.ts | 2 +-
.../execution_logic/threshold.ts | 2 +-
.../threshold_alert_suppression.ts | 2 +-
.../ignore_fields.ts | 6 +-
.../keyword_family/const_keyword.ts | 2 +-
.../keyword_family/keyword.ts | 2 +-
.../keyword_mixed_with_const.ts | 2 +-
.../trial_license_complete_tier/runtime.ts | 2 +-
.../trial_license_complete_tier/timestamps.ts | 2 +-
.../install_latest_bundled_prebuilt_rules.ts | 2 +-
.../prerelease_packages.ts | 2 +-
.../install_large_prebuilt_rules_package.ts | 2 +-
.../fleet_integration.ts | 2 +-
.../get_prebuilt_rules_status.ts | 2 +-
.../get_prebuilt_timelines_status.ts | 2 +-
.../install_prebuilt_rules.ts | 2 +-
...prebuilt_rules_with_historical_versions.ts | 2 +-
.../upgrade_prebuilt_rules.ts | 2 +-
...prebuilt_rules_with_historical_versions.ts | 2 +-
.../update_prebuilt_rules_package.ts | 2 +-
.../perform_bulk_action.ts | 2 +-
.../perform_bulk_action_dry_run.ts | 2 +-
.../create_rules.ts | 6 +-
.../create_rules_bulk.ts | 2 +-
.../preview_rules.ts | 4 +-
.../delete_rules_bulk.ts | 2 +-
.../import_rules_with_overwrite.ts | 2 +-
.../export_rules.ts | 2 +-
.../import_connectors.ts | 2 +-
.../import_rules.ts | 2 +-
.../import_rules_with_overwrite.ts | 2 +-
.../patch_rules.ts | 2 +-
.../patch_rules.ts | 10 +-
.../patch_rules_bulk.ts | 2 +-
.../trial_license_complete_tier/read_rules.ts | 4 +-
.../update_rules.ts | 2 +-
.../update_rules.ts | 10 +-
.../update_rules_bulk.ts | 2 +-
.../task_based/all_types.ts | 2 +-
.../task_based/detection_rules.ts | 14 +-
.../usage_collector/all_types.ts | 2 +-
.../usage_collector/detection_rule_status.ts | 8 +-
.../usage_collector/detection_rules.ts | 36 +-
.../read_privileges.ts | 2 +-
.../asset_criticality.ts | 2 +-
.../risk_scoring_task/task_execution.ts | 10 +-
.../trial_license_complete_tier/basic.ts | 4 +-
89 files changed, 630 insertions(+), 188 deletions(-)
create mode 100644 .buildkite/pipelines/security_solution/api_integration_serverless_release.yml
diff --git a/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml b/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml
new file mode 100644
index 0000000000000..25c6f0ce06b8e
--- /dev/null
+++ b/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml
@@ -0,0 +1,389 @@
+steps:
+ - group: 'API Integration Serverless Release Tests'
+ key: test_execution
+ depends_on: build_image
+ steps:
+ - label: Running integration tests for Serverless Exception Workflows
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_workflows:qa:serverless:release
+ key: exception_workflows:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '*'
+ limit: 2
+
+ - label: Running exception_operators_date_numeric_types:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_date_numeric_types:qa:serverless:release
+ key: exception_operators_date_numeric_types:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '*'
+ limit: 2
+
+ - label: Running exception_operators_keyword:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_keyword:qa:serverless:release
+ key: exception_operators_keyword:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '*'
+ limit: 2
+
+ - label: Running exception_operators_ips:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_ips:qa:serverless:release
+ key: exception_operators_ips:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '*'
+ limit: 2
+
+ - label: Running exception_operators_long:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_long:qa:serverless:release
+ key: exception_operators_long:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running exception_operators_text:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_text:qa:serverless:release
+ key: exception_operators_text:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running alerts:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:qa:serverless:release
+ key: alerts:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running alerts:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:essentials:qa:serverless:release
+ key: alerts:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running actions:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh actions:qa:serverless:release
+ key: actions:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running genai:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh genai:qa:serverless:release
+ key: genai:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: "1"
+ limit: 2
+
+ - label: Running rule_execution_logic:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_execution_logic:qa:serverless:release
+ key: rule_execution_logic:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_patch:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:qa:serverless:release
+ key: rule_patch:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_patch:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:essentials:qa:serverless:release
+ key: rule_patch:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_update:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:qa:serverless:release
+ key: rule_update:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_update:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:essentials:qa:serverless:release
+ key: rule_update:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rules_management:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rules_management:essentials:qa:serverless:release
+ key: rules_management:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running prebuilt_rules_management:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_management:qa:serverless:release
+ key: prebuilt_rules_management:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release
+ key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release
+ key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release
+ key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_bulk_actions:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_bulk_actions:qa:serverless:release
+ key: rule_bulk_actions:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_read:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:qa:serverless:release
+ key: rule_read:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_import_export:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:essentials:qa:serverless:release
+ key: rule_import_export:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_import_export:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:qa:serverless:release
+ key: rule_import_export:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+
+ - label: Running rule_management:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_management:qa:serverless:release
+ key: rule_management:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_read:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:essentials:qa:serverless:release
+ key: rule_read:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_creation:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:qa:serverless:release
+ key: rule_creation:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_creation:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:essentials:qa:serverless:release
+ key: rule_creation:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_delete:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:qa:serverless:release
+ key: rule_delete:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running rule_delete:essentials:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:essentials:qa:serverless:release
+ key: rule_delete:essentials:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running exception_lists_items:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_lists_items:qa:serverless:release
+ key: exception_lists_items:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running lists_items:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh lists_items:qa:serverless:release
+ key: lists_items:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running user_roles:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh user_roles:qa:serverless:release
+ key: user_roles:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+
+ - label: Running telemetry:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh telemetry:qa:serverless:release
+ key: telemetry:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
+ - label: Running entity_analytics:qa:serverless:release
+ command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:qa:serverless:release
+ key: entity_analytics:qa:serverless:release
+ agents:
+ queue: n2-4-spot
+ timeout_in_minutes: 120
+ retry:
+ automatic:
+ - exit_status: '1'
+ limit: 2
diff --git a/x-pack/test/security_solution_api_integration/README.md b/x-pack/test/security_solution_api_integration/README.md
index c0162a0abb041..1cfc87a1420c9 100644
--- a/x-pack/test/security_solution_api_integration/README.md
+++ b/x-pack/test/security_solution_api_integration/README.md
@@ -15,16 +15,28 @@ we have introduced the `detection_response` directory to consolidate all the int
- In this directory, Mocha tagging is utilized to assign tags to specific test suites and individual test cases. This tagging system enables the ability to selectively apply tags to test suites and test cases, facilitating the exclusion of specific test cases within a test suite as needed.
-- There are three primary tags that have been defined: @ess, @serverless, and @brokenInServerless
-
- Test suites and cases are prefixed with specific tags to determine their execution in particular environments or to exclude them from specific environments.
+- We are using the following tags:
+ * `@ess`: Runs in an ESS environment (on-prem installation) as part of the CI validation on PRs.
+
+ * `@serverless`: Runs in the first quality gate and in the periodic pipeline.
+
+ * `@serverlessQA`: Runs in the second quality gate.
+
+ * `@skipInEss`: Skipped for ESS environment.
+
+ * `@skipInServerless`: Skipped for all quality gates, CI and periodic pipeline.
+
+ * `@skipInServerlessMKI`: Skipped for all the MKI environments.
+
ex:
```
describe('@serverless @ess create_rules', () => { ==> tests in this suite will run in both Ess and Serverless
describe('creating rules', () => {});
- describe('@brokenInServerless missing timestamps', () => {}); ==> tests in this suite will be excluded in Serverless
+ // This test is skipped due to flakiness in serverless environments: https://github.com/elastic/kibana/issues/497777
+ describe('@skipInServerless missing timestamps', () => {}); ==> tests in this suite will be excluded in Serverless
```
@@ -86,7 +98,7 @@ In this project, you can run various commands to execute tests and workflows, ea
```
3. **Run tests for "exception_workflows" using the serverless runner in the "qaEnv" environment:**
```shell
- npm run run-tests:dr:default exceptions/workflows serverless qaEnv
+ npm run run-tests:dr:default exceptions/workflows serverless qaPeriodicEnv
```
4. **Run the server for "exception_workflows" in the "essEnv" environment:**
```shell
diff --git a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts
index 7408b0093f7e9..fc25abe814400 100644
--- a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts
+++ b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts
@@ -96,7 +96,7 @@ export function createTestConfig(options: CreateTestConfigOptions, testFiles?: s
],
},
mochaOpts: {
- grep: '/^(?!.*@brokenInEss).*@ess.*/',
+ grep: '/^(?!.*@skipInEss).*@ess.*/',
},
};
};
diff --git a/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts b/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts
index 377d970d3451d..55a7957ae20d6 100644
--- a/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts
+++ b/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts
@@ -44,7 +44,7 @@ export function createTestConfig(options: CreateTestConfigOptions) {
mochaOpts: {
...svlSharedConfig.get('mochaOpts'),
- grep: '/^(?!.*@brokenInServerless).*@serverless.*/',
+ grep: '/^(?!.*@skipInServerless).*@serverless.*/',
},
};
};
diff --git a/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts
index ae3b17ce086c3..026f8cad10395 100644
--- a/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts
+++ b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts
@@ -42,7 +42,7 @@ export function createTestConfig(options: CreateTestConfigOptions) {
mochaOpts: {
...svlSharedConfig.get('mochaOpts'),
- grep: '/^(?!.*@brokenInServerless).*@serverless.*/',
+ grep: '/^(?!.*@skipInServerless).*@serverless.*/',
},
};
};
diff --git a/x-pack/test/security_solution_api_integration/package.json b/x-pack/test/security_solution_api_integration/package.json
index 88e55374b3b9f..ff58c521ccd15 100644
--- a/x-pack/test/security_solution_api_integration/package.json
+++ b/x-pack/test/security_solution_api_integration/package.json
@@ -37,225 +37,263 @@
"genai:server:serverless": "npm run initialize-server:genai:trial_complete invoke_ai serverless",
"genai:runner:serverless": "npm run run-tests:genai:trial_complete invoke_ai serverless serverlessEnv",
- "genai:qa:serverless": "npm run run-tests:genai:trial_complete invoke_ai serverless qaEnv",
+ "genai:qa:serverless": "npm run run-tests:genai:trial_complete invoke_ai serverless qaPeriodicEnv",
+ "genai:qa:serverless:release": "npm run run-tests:genai:trial_complete invoke_ai serverlessQA qaEnv",
"genai:server:ess": "npm run initialize-server:genai:trial_complete invoke_ai ess",
"genai:runner:ess": "npm run run-tests:genai:trial_complete invoke_ai ess essEnv",
"nlp_cleanup_task:complete:server:serverless": "npm run initialize-server:genai:trial_complete nlp_cleanup_task serverless",
"nlp_cleanup_task:complete:runner:serverless": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless serverlessEnv",
- "nlp_cleanup_task:complete:qa:serverless": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless qaEnv",
+ "nlp_cleanup_task:complete:qa:serverless": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless qaPeriodicEnv",
+ "nlp_cleanup_task:complete:qa:serverless:release": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverlessQA qaEnv",
"nlp_cleanup_task:essentials:server:serverless": "npm run initialize-server:genai:basic_essentials nlp_cleanup_task serverless",
"nlp_cleanup_task:essentials:runner:serverless": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless serverlessEnv",
- "nlp_cleanup_task:essentials:qa:serverless": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless qaEnv",
+ "nlp_cleanup_task:essentials:qa:serverless": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless qaPeriodicEnv",
+ "nlp_cleanup_task:essentials:qa:serverless:release": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverlessQA qaEnv",
"entity_analytics:server:serverless": "npm run initialize-server:ea:trial_complete risk_engine serverless",
"entity_analytics:runner:serverless": "npm run run-tests:ea:trial_complete risk_engine serverless serverlessEnv",
- "entity_analytics:qa:serverless": "npm run run-tests:ea:trial_complete risk_engine serverless qaEnv",
+ "entity_analytics:qa:serverless": "npm run run-tests:ea:trial_complete risk_engine serverless qaPeriodicEnv",
+ "entity_analytics:qa:serverless:release": "npm run run-tests:ea:trial_complete risk_engine serverlessQA qaEnv",
"entity_analytics:server:ess": "npm run initialize-server:ea:trial_complete risk_engine ess",
"entity_analytics:runner:ess": "npm run run-tests:ea:trial_complete risk_engine ess essEnv",
"entity_analytics:essentials:server:serverless": "npm run initialize-server:ea:basic_essentials risk_engine serverless",
"entity_analytics:essentials:runner:serverless": "npm run run-tests:ea:basic_essentials risk_engine serverless serverlessEnv",
- "entity_analytics:essentials:qa:serverless": "npm run run-tests:ea:basic_essentials risk_engine serverless qaEnv",
+ "entity_analytics:essentials:qa:serverless": "npm run run-tests:ea:basic_essentials risk_engine serverless qaPeriodicEnv",
+ "entity_analytics:essentials:qa:serverless:release": "npm run run-tests:ea:basic_essentials risk_engine serverlessQA qaEnv",
"entity_analytics:essentials:server:ess": "npm run initialize-server:ea:basic_essentials risk_engine ess",
"entity_analytics:essentials:runner:ess": "npm run run-tests:ea:basic_essentials risk_engine ess essEnv",
"exception_lists_items:server:serverless": "npm run initialize-server:lists:complete exception_lists_items serverless",
"exception_lists_items:runner:serverless": "npm run run-tests:lists:complete exception_lists_items serverless serverlessEnv",
- "exception_lists_items:qa:serverless": "npm run run-tests:lists:complete exception_lists_items serverless qaEnv",
+ "exception_lists_items:qa:serverless": "npm run run-tests:lists:complete exception_lists_items serverless qaPeriodicEnv",
+ "exception_lists_items:qa:serverless:release": "npm run run-tests:lists:complete exception_lists_items serverlessQA qaEnv",
"exception_lists_items:server:ess": "npm run initialize-server:lists:complete exception_lists_items ess",
"exception_lists_items:runner:ess": "npm run run-tests:lists:complete exception_lists_items ess essEnv",
"lists_items:server:serverless": "npm run initialize-server:lists:complete lists_items serverless",
"lists_items:runner:serverless": "npm run run-tests:lists:complete lists_items serverless serverlessEnv",
- "lists_items:qa:serverless": "npm run run-tests:lists:complete lists_items serverless qaEnv",
+ "lists_items:qa:serverless": "npm run run-tests:lists:complete lists_items serverless qaPeriodicEnv",
+ "lists_items:qa:serverless:release": "npm run run-tests:lists:complete lists_items serverlessQA qaEnv",
"lists_items:server:ess": "npm run initialize-server:lists:complete lists_items ess",
"lists_items:runner:ess": "npm run run-tests:lists:complete lists_items ess essEnv",
"user_roles:server:serverless": "npm run initialize-server:dr user_roles serverless",
"user_roles:runner:serverless": "npm run run-tests:dr user_roles serverless serverlessEnv",
- "user_roles:qa:serverless": "npm run run-tests:dr user_roles serverless qaEnv",
+ "user_roles:qa:serverless": "npm run run-tests:dr user_roles serverless qaPeriodicEnv",
+ "user_roles:qa:serverless:release": "npm run run-tests:dr user_roles serverlessQA qaEnv",
"user_roles:server:ess": "npm run initialize-server:dr user_roles ess",
"user_roles:runner:ess": "npm run run-tests:dr user_roles ess essEnv",
"telemetry:server:serverless": "npm run initialize-server:dr telemetry serverless",
"telemetry:runner:serverless": "npm run run-tests:dr telemetry serverless serverlessEnv",
- "telemetry:qa:serverless": "npm run run-tests:dr telemetry serverless qaEnv",
+ "telemetry:qa:serverless": "npm run run-tests:dr telemetry serverless qaPeriodicEnv",
+ "telemetry:qa:serverless:release": "npm run run-tests:dr telemetry serverlessQA qaEnv",
"telemetry:server:ess": "npm run initialize-server:dr telemetry ess",
"telemetry:runner:ess": "npm run run-tests:dr telemetry ess essEnv",
"exception_workflows:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/workflows serverless",
"exception_workflows:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/workflows serverless serverlessEnv",
- "exception_workflows:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/workflows serverless qaEnv",
+ "exception_workflows:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/workflows serverless qaPeriodicEnv",
+ "exception_workflows:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/workflows serverlessQA qaEnv",
"exception_workflows:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/workflows ess",
"exception_workflows:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/workflows ess essEnv",
"exception_operators_date_numeric_types:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless",
"exception_operators_date_numeric_types:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless serverlessEnv",
- "exception_operators_date_numeric_types:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless qaEnv",
+ "exception_operators_date_numeric_types:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless qaPeriodicEnv",
+ "exception_operators_date_numeric_types:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverlessQA qaEnv",
"exception_operators_date_numeric_types:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/date_numeric_types ess",
"exception_operators_date_numeric_types:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types ess essEnv",
"exception_operators_keyword:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/keyword serverless",
"exception_operators_keyword:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless serverlessEnv",
- "exception_operators_keyword:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless qaEnv",
+ "exception_operators_keyword:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless qaPeriodicEnv",
+ "exception_operators_keyword:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverlessQA qaEnv",
"exception_operators_keyword:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/keyword ess",
"exception_operators_keyword:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword ess essEnv",
"exception_operators_ips:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/ips serverless",
"exception_operators_ips:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless serverlessEnv",
- "exception_operators_ips:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless qaEnv",
+ "exception_operators_ips:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless qaPeriodicEnv",
+ "exception_operators_ips:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverlessQA qaEnv",
"exception_operators_ips:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/ips ess",
"exception_operators_ips:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips ess essEnv",
"exception_operators_long:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/long serverless",
"exception_operators_long:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless serverlessEnv",
- "exception_operators_long:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless qaEnv",
+ "exception_operators_long:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless qaPeriodicEnv",
+ "exception_operators_long:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverlessQA qaEnv",
"exception_operators_long:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/long ess",
"exception_operators_long:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long ess essEnv",
"exception_operators_text:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/text serverless",
"exception_operators_text:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless serverlessEnv",
- "exception_operators_text:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless qaEnv",
+ "exception_operators_text:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless qaPeriodicEnv",
+ "exception_operators_text:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverlessQA qaEnv",
"exception_operators_text:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/text ess",
"exception_operators_text:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text ess essEnv",
"actions:server:serverless": "npm run initialize-server:de actions serverless",
"actions:runner:serverless": "npm run run-tests:de actions serverless serverlessEnv",
- "actions:qa:serverless": "npm run run-tests:de actions serverless qaEnv",
+ "actions:qa:serverless": "npm run run-tests:de actions serverless qaPeriodicEnv",
+ "actions:qa:serverless:release": "npm run run-tests:de actions serverlessQA qaEnv",
"actions:server:ess": "npm run initialize-server:de actions ess",
"actions:runner:ess": "npm run run-tests:de actions ess essEnv",
"alerts:server:serverless": "npm run initialize-server:de alerts serverless",
"alerts:runner:serverless": "npm run run-tests:de alerts serverless serverlessEnv",
- "alerts:qa:serverless": "npm run run-tests:de alerts serverless qaEnv",
+ "alerts:qa:serverless": "npm run run-tests:de alerts serverless qaPeriodicEnv",
+ "alerts:qa:serverless:release": "npm run run-tests:de alerts serverlessQA qaEnv",
"alerts:server:ess": "npm run initialize-server:de alerts ess",
"alerts:runner:ess": "npm run run-tests:de alerts ess essEnv",
"alerts:essentials:server:serverless": "npm run initialize-server:de:basic_essentials alerts serverless",
"alerts:essentials:runner:serverless": "npm run run-tests:de:basic_essentials alerts serverless serverlessEnv",
- "alerts:essentials:qa:serverless": "npm run run-tests:de:basic_essentials alerts serverless qaEnv",
+ "alerts:essentials:qa:serverless": "npm run run-tests:de:basic_essentials alerts serverless qaPeriodicEnv",
+ "alerts:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials alerts serverlessQA qaEnv",
"alerts:basic:server:ess": "npm run initialize-server:de:basic_essentials alerts ess",
"alerts:basic:runner:ess": "npm run run-tests:de:basic_essentials alerts ess essEnv",
"rule_execution_logic:server:serverless": "npm run initialize-server:de rule_execution_logic serverless",
"rule_execution_logic:runner:serverless": "npm run run-tests:de rule_execution_logic serverless serverlessEnv",
- "rule_execution_logic:qa:serverless": "npm run run-tests:de rule_execution_logic serverless qaEnv",
+ "rule_execution_logic:qa:serverless": "npm run run-tests:de rule_execution_logic serverless qaPeriodicEnv",
+ "rule_execution_logic:qa:serverless:release": "npm run run-tests:de rule_execution_logic serverlessQA qaEnv",
"rule_execution_logic:server:ess": "npm run initialize-server:de rule_execution_logic ess",
"rule_execution_logic:runner:ess": "npm run run-tests:de rule_execution_logic ess essEnv",
"rule_creation:server:serverless": "npm run initialize-server:rm rule_creation serverless",
"rule_creation:runner:serverless": "npm run run-tests:rm rule_creation serverless serverlessEnv",
- "rule_creation:qa:serverless": "npm run run-tests:rm rule_creation serverless qaEnv",
+ "rule_creation:qa:serverless": "npm run run-tests:rm rule_creation serverless qaPeriodicEnv",
+ "rule_creation:qa:serverless:release": "npm run run-tests:rm rule_creation serverlessQA qaEnv",
"rule_creation:server:ess": "npm run initialize-server:rm rule_creation ess",
"rule_creation:runner:ess": "npm run run-tests:rm rule_creation ess essEnv",
"rule_creation:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_creation serverless",
"rule_creation:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_creation serverless serverlessEnv",
- "rule_creation:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_creation serverless qaEnv",
+ "rule_creation:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_creation serverless qaPeriodicEnv",
+ "rule_creation:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_creation serverlessQA qaEnv",
"rule_creation:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_creation ess",
"rule_creation:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_creation ess essEnv",
"rule_update:server:serverless": "npm run initialize-server:rm rule_update serverless",
"rule_update:runner:serverless": "npm run run-tests:rm rule_update serverless serverlessEnv",
- "rule_update:qa:serverless": "npm run run-tests:rm rule_update serverless qaEnv",
+ "rule_update:qa:serverless": "npm run run-tests:rm rule_update serverless qaPeriodicEnv",
+ "rule_update:qa:serverless:release": "npm run run-tests:rm rule_update serverlessQA qaEnv",
"rule_update:server:ess": "npm run initialize-server:rm rule_update ess",
"rule_update:runner:ess": "npm run run-tests:rm rule_update ess essEnv",
"rule_update:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_update serverless",
"rule_update:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_update serverless serverlessEnv",
- "rule_update:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_update serverless qaEnv",
+ "rule_update:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_update serverless qaPeriodicEnv",
+ "rule_update:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_update serverlessQA qaEnv",
"rule_update:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_update ess",
"rule_update:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_update ess essEnv",
"rule_patch:server:serverless": "npm run initialize-server:rm rule_patch serverless",
"rule_patch:runner:serverless": "npm run run-tests:rm rule_patch serverless serverlessEnv",
- "rule_patch:qa:serverless": "npm run run-tests:rm rule_patch serverless qaEnv",
+ "rule_patch:qa:serverless": "npm run run-tests:rm rule_patch serverless qaPeriodicEnv",
+ "rule_patch:qa:serverless:release": "npm run run-tests:rm rule_patch serverlessQA qaEnv",
"rule_patch:server:ess": "npm run initialize-server:rm rule_patch ess",
"rule_patch:runner:ess": "npm run run-tests:rm rule_patch ess essEnv",
"rule_patch:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_patch serverless",
"rule_patch:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_patch serverless serverlessEnv",
- "rule_patch:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_patch serverless qaEnv",
+ "rule_patch:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_patch serverless qaPeriodicEnv",
+ "rule_patch:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_patch serverlessQA qaEnv",
"rule_patch:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_patch ess",
"rule_patch:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_patch ess essEnv",
"prebuilt_rules_management:server:serverless": "npm run initialize-server:rm prebuilt_rules/management serverless",
"prebuilt_rules_management:runner:serverless": "npm run run-tests:rm prebuilt_rules/management serverless serverlessEnv",
- "prebuilt_rules_management:qa:serverless": "npm run run-tests:rm prebuilt_rules/management serverless qaEnv",
+ "prebuilt_rules_management:qa:serverless": "npm run run-tests:rm prebuilt_rules/management serverless qaPeriodicEnv",
+ "prebuilt_rules_management:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/management serverlessQA qaEnv",
"prebuilt_rules_management:server:ess": "npm run initialize-server:rm prebuilt_rules/management ess",
"prebuilt_rules_management:runner:ess": "npm run run-tests:rm prebuilt_rules/management ess essEnv",
"prebuilt_rules_bundled_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/bundled_prebuilt_rules_package serverless",
"prebuilt_rules_bundled_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless serverlessEnv",
- "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless qaEnv",
+ "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless qaPeriodicEnv",
+ "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverlessQA qaEnv",
"prebuilt_rules_bundled_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/bundled_prebuilt_rules_package ess",
"prebuilt_rules_bundled_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package ess essEnv",
"prebuilt_rules_large_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/large_prebuilt_rules_package serverless",
"prebuilt_rules_large_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless serverlessEnv",
- "prebuilt_rules_large_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless qaEnv",
+ "prebuilt_rules_large_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless qaPeriodicEnv",
+ "prebuilt_rules_large_prebuilt_rules_package:qa:serverles:release": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverlessQA qaEnv",
"prebuilt_rules_large_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/large_prebuilt_rules_package ess",
"prebuilt_rules_large_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package ess essEnv",
"prebuilt_rules_update_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/update_prebuilt_rules_package serverless",
"prebuilt_rules_update_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless serverlessEnv",
- "prebuilt_rules_update_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless qaEnv",
+ "prebuilt_rules_update_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless qaPeriodicEnv",
+ "prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverlessQA qaEnv",
"prebuilt_rules_update_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/update_prebuilt_rules_package ess",
"prebuilt_rules_update_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package ess essEnv",
"rule_delete:server:serverless": "npm run initialize-server:rm rule_delete serverless",
"rule_delete:runner:serverless": "npm run run-tests:rm rule_delete serverless serverlessEnv",
- "rule_delete:qa:serverless": "npm run run-tests:rm rule_delete serverless qaEnv",
+ "rule_delete:qa:serverless": "npm run run-tests:rm rule_delete serverless qaPeriodicEnv",
+ "rule_delete:qa:serverless:release": "npm run run-tests:rm rule_delete serverlessQA qaEnv",
"rule_delete:server:ess": "npm run initialize-server:rm rule_delete ess",
"rule_delete:runner:ess": "npm run run-tests:rm rule_delete ess essEnv",
"rule_delete:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_delete serverless",
"rule_delete:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_delete serverless serverlessEnv",
- "rule_delete:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_delete serverless qaEnv",
+ "rule_delete:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_delete serverless qaPeriodicEnv",
+ "rule_delete:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_delete serverlessQA qaEnv",
"rule_delete:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_delete ess",
"rule_delete:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_delete ess essEnv",
"rule_import_export:server:serverless": "npm run initialize-server:rm rule_import_export serverless",
"rule_import_export:runner:serverless": "npm run run-tests:rm rule_import_export serverless serverlessEnv",
- "rule_import_export:qa:serverless": "npm run run-tests:rm rule_import_export serverless qaEnv",
+ "rule_import_export:qa:serverless": "npm run run-tests:rm rule_import_export serverless qaPeriodicEnv",
+ "rule_import_export:qa:serverless:release": "npm run run-tests:rm rule_import_export serverlessQA qaEnv",
"rule_import_export:server:ess": "npm run initialize-server:rm rule_import_export ess",
"rule_import_export:runner:ess": "npm run run-tests:rm rule_import_export ess essEnv",
"rule_import_export:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_import_export serverless",
"rule_import_export:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_import_export serverless serverlessEnv",
- "rule_import_export:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_import_export serverless qaEnv",
+ "rule_import_export:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_import_export serverless qaPeriodicEnv",
+ "rule_import_export:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_import_export serverlessQA qaEnv",
"rule_import_export:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_import_export ess",
"rule_import_export:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_import_export ess essEnv",
"rule_management:server:serverless": "npm run initialize-server:rm rule_management serverless",
"rule_management:runner:serverless": "npm run run-tests:rm rule_management serverless serverlessEnv",
- "rule_management:qa:serverless": "npm run run-tests:rm rule_management serverless qaEnv",
+ "rule_management:qa:serverless": "npm run run-tests:rm rule_management serverless qaPeriodicEnv",
+ "rule_management:qa:serverless:release": "npm run run-tests:rm rule_management serverlessQA qaEnv",
"rule_management:server:ess": "npm run initialize-server:rm rule_management ess",
"rule_management:runner:ess": "npm run run-tests:rm rule_management ess essEnv",
"rule_bulk_actions:server:serverless": "npm run initialize-server:rm rule_bulk_actions serverless",
"rule_bulk_actions:runner:serverless": "npm run run-tests:rm rule_bulk_actions serverless serverlessEnv",
- "rule_bulk_actions:qa:serverless": "npm run run-tests:rm rule_bulk_actions serverless qaEnv",
+ "rule_bulk_actions:qa:serverless": "npm run run-tests:rm rule_bulk_actions serverless qaPeriodicEnv",
+ "rule_bulk_actions:qa:serverless:release": "npm run run-tests:rm rule_bulk_actions serverlessQA qaEnv",
"rule_bulk_actions:server:ess": "npm run initialize-server:rm rule_bulk_actions ess",
"rule_bulk_actions:runner:ess": "npm run run-tests:rm rule_bulk_actions ess essEnv",
"rule_read:server:serverless": "npm run initialize-server:rm rule_read serverless",
"rule_read:runner:serverless": "npm run run-tests:rm rule_read serverless serverlessEnv",
- "rule_read:qa:serverless": "npm run run-tests:rm rule_read serverless qaEnv",
+ "rule_read:qa:serverless": "npm run run-tests:rm rule_read serverless qaPeriodicEnv",
+ "rule_read:qa:serverless:release": "npm run run-tests:rm rule_read serverlessQA qaEnv",
"rule_read:server:ess": "npm run initialize-server:rm rule_read ess",
"rule_read:runner:ess": "npm run run-tests:rm rule_read ess essEnv",
"rule_read:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_read serverless",
"rule_read:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_read serverless serverlessEnv",
- "rule_read:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_read serverless qaEnv",
+ "rule_read:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_read serverless qaPeriodicEnv",
+ "rule_read:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_read serverlessQA qaEnv",
"rule_read:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_read ess",
"rule_read:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_read ess essEnv",
"rules_management:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_management serverless",
"rules_management:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_management serverless serverlessEnv",
- "rules_management:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_management serverless qaEnv",
+ "rules_management:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_management serverless qaPeriodicEnv",
+ "rules_management:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_management serverlessQA qaEnv",
"rules_management:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_management ess",
"rules_management:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_management ess essEnv"
}
diff --git a/x-pack/test/security_solution_api_integration/scripts/index.js b/x-pack/test/security_solution_api_integration/scripts/index.js
index c89421ee8feb4..6cc8dd1ef5c7a 100644
--- a/x-pack/test/security_solution_api_integration/scripts/index.js
+++ b/x-pack/test/security_solution_api_integration/scripts/index.js
@@ -21,15 +21,19 @@ let grepArgs = [];
if (type !== 'server') {
switch (environment) {
case 'serverlessEnv':
- grepArgs = ['--grep', '/^(?!.*@brokenInServerless).*@serverless.*/'];
+ grepArgs = ['--grep', '/^(?!.*@skipInServerless).*@serverless.*/'];
break;
case 'essEnv':
- grepArgs = ['--grep', '/^(?!.*@brokenInEss).*@ess.*/'];
+ grepArgs = ['--grep', '/^(?!.*@skipInEss).*@ess.*/'];
+ break;
+
+ case 'qaPeriodicEnv':
+ grepArgs = ['--grep', '/^(?!.*@skipInServerless|.*@skipInServerlessMKI).*@serverless.*/'];
break;
case 'qaEnv':
- grepArgs = ['--grep', '/^(?!.*@brokenInServerless|.*@skipInQA).*@serverless.*/'];
+ grepArgs = ['--grep', '/^(?!.*@skipInServerless|.*@skipInServerlessMKI).*@serverlessQA.*/'];
break;
default:
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/add_actions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/add_actions.ts
index 442385ed5e2f7..335fad4c7acee 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/add_actions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/add_actions.ts
@@ -21,7 +21,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess add_actions', () => {
+ describe('@serverless @serverlessQA @ess add_actions', () => {
describe('adding actions', () => {
beforeEach(async () => {
await es.indices.delete({ index: 'logs-test', ignore_unavailable: true });
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/check_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/check_privileges.ts
index fb120059f44be..966f92bbc4672 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/check_privileges.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/check_privileges.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@ess @serverless @brokenInServerless check_privileges', () => {
+ describe('@ess @serverless @skipInServerless check_privileges', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts');
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alias');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/update_actions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/update_actions.ts
index abbb039793bf3..40a967c068a00 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/update_actions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/actions/trial_license_complete_tier/update_actions.ts
@@ -147,7 +147,8 @@ export default ({ getService }: FtrProviderContext) => {
expect(body?.execution_summary?.last_execution?.status).toBe('succeeded');
});
- it('@skipInQA expects an updated rule with a webhook action and meta field runs successfully', async () => {
+ // Broken in MKI environment, needs triage
+ it('@skipInServerlessMKI expects an updated rule with a webhook action and meta field runs successfully', async () => {
const webhookAction = await createWebHookRuleAction(supertest);
await supertest
@@ -187,7 +188,8 @@ export default ({ getService }: FtrProviderContext) => {
expect(body?.execution_summary?.last_execution?.status).toBe('succeeded');
});
- it('@skipInQA adds a webhook to an immutable rule', async () => {
+ // Broken in MKI environment, needs triage
+ it('@skipInServerlessMKI adds a webhook to an immutable rule', async () => {
const immutableRule = await getImmutableRule();
const webhookAction = await createWebHookRuleAction(supertest);
const ruleAction = {
@@ -210,7 +212,8 @@ export default ({ getService }: FtrProviderContext) => {
expect(updatedRule.throttle).toEqual(immutableRule.throttle);
});
- it('@skipInQA should be able to create a new webhook action, attach it to an immutable rule and the count of prepackaged rules should not increase. If this fails, suspect the immutable tags are not staying on the rule correctly.', async () => {
+ // Broken in MKI environment, needs triage
+ it('@skipInServerlessMKI should be able to create a new webhook action, attach it to an immutable rule and the count of prepackaged rules should not increase. If this fails, suspect the immutable tags are not staying on the rule correctly.', async () => {
const immutableRule = await getImmutableRule();
const hookAction = await createWebHookRuleAction(supertest);
const ruleToUpdate = getRuleWithWebHookAction(
@@ -224,7 +227,8 @@ export default ({ getService }: FtrProviderContext) => {
expect(status.rules_not_installed).toBe(0);
});
- it('@skipInQA should be able to create a new webhook action, attach it to an immutable rule and the rule should stay immutable when searching against immutable tags', async () => {
+ // Broken in MKI environment, needs triage
+ it('@skipInServerlessMKI should be able to create a new webhook action, attach it to an immutable rule and the rule should stay immutable when searching against immutable tags', async () => {
const immutableRule = await getImmutableRule();
const webhookAction = await createWebHookRuleAction(supertest);
const ruleAction = {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/field_aliases.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/field_aliases.ts
index cc37d7396cc0f..b6c6d265c14da 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/field_aliases.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/field_aliases.ts
@@ -29,7 +29,7 @@ export default ({ getService }: FtrProviderContext) => {
name: string;
}
- describe('@ess @serverless Tests involving aliases of source indexes and the alerts index', () => {
+ describe('@ess @serverless @serverlessQA Tests involving aliases of source indexes and the alerts index', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alias');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/query_alerts.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/query_alerts.ts
index 5dcc78486ebdc..95764a6894fd4 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/query_alerts.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/query_alerts.ts
@@ -34,7 +34,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@ess @serverless query_signals_route and find_alerts_route', () => {
+ describe('@ess @serverless @serverlessQA query_signals_route and find_alerts_route', () => {
describe('validation checks', () => {
it('should not give errors when querying and the alerts index does exist and is empty', async () => {
await createAlertsIndex(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts
index 305d57ace71eb..25ed0c62d0d58 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts
@@ -40,8 +40,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- // Intentionally setting as @skipInQA, keeping tests running in MKI that should block release
- describe('@ess @serverless @skipInQA set_alert_tags', () => {
+ describe('@ess @serverless set_alert_tags', () => {
describe('validation checks', () => {
it('should give errors when no alert ids are provided', async () => {
const { body } = await supertest
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts
index 69538dfb6c1ca..4e4ecb21ca157 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts
@@ -39,8 +39,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- // Intentionally setting as @skipInQA, keeping tests running in MKI that should block release
- describe('@ess @serverless @skipInQA Alert User Assignment - ESS & Serverless', () => {
+ describe('@ess @serverless Alert User Assignment - ESS & Serverless', () => {
describe('validation checks', () => {
it('should give errors when no alert ids are provided', async () => {
const { body } = await supertest
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts
index 48c9e5f065800..7064f27cfd3bd 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts
@@ -33,8 +33,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- // Intentionally setting as @skipInQA, keeping tests running in MKI that should block release
- describe('@serverless @skipInQA Alert User Assignment - Serverless', () => {
+ describe('@serverless Alert User Assignment - Serverless', () => {
before(async () => {
await esArchiver.load(path);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/document_level_security.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/document_level_security.ts
index 32177044f8486..5c2f0333c4a0e 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/document_level_security.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/document_level_security.ts
@@ -74,7 +74,7 @@ export default ({ getService }: FtrProviderContext) => {
const esArchiver = getService('esArchiver');
const security = getService('security');
- describe('@ess @serverless @brokenInServerless find alert with/without doc level security', () => {
+ describe('@ess @serverless @skipInServerless find alert with/without doc level security', () => {
before(async () => {
await security.role.create(
roleToAccessSecuritySolution.name,
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/date.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/date.ts
index 9c3a3afa52d68..7a911995da977 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/date.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/date.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type date', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type date', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/date');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/double.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/double.ts
index 6b4ecfab9024e..3c4b21f8ee3d5 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/double.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/double.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type double', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type double', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/double');
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/double_as_string');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/float.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/float.ts
index 16408aba28834..5e42ee8a56c4d 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/float.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/float.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type float', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type float', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/float');
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/float_as_string');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/integer.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/integer.ts
index fd5b2e6fd9bcb..e728cfc98ee83 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/integer.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/date_numeric_types/basic_license_essentials_tier/integer.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type integer', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type integer', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/integer');
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/integer_as_string');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip.ts
index cdffe6d65aa23..31924284e79ed 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type ip', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type ip', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/ip');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip_array.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip_array.ts
index 398e5d5f13573..cd67498c421c9 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip_array.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/ips/basic_license_essentials_tier/ip_array.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type ip', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type ip', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/ip_as_array');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword.ts
index f8272e6bf4b0b..4db39a1230ad3 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type keyword', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type keyword', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/keyword');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword_array.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword_array.ts
index 6d8da5cd51159..c4d50860ea5c2 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword_array.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/keyword/basic_license_essentials_tier/keyword_array.ts
@@ -33,7 +33,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type keyword', () => {
+ describe('@serverles @serverlessQA @ess Rule exception operators for data type keyword', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/keyword_as_array');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/long/basic_license_essentials_tier/long.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/long/basic_license_essentials_tier/long.ts
index 4acbd385bde43..947303c0c3f7a 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/long/basic_license_essentials_tier/long.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/long/basic_license_essentials_tier/long.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type long', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type long', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/long');
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/long_as_string');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text.ts
index d8c44b3fc5e91..8442106dcf6d6 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text.ts
@@ -33,7 +33,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type text', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type text', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/text');
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/text_no_spaces');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text_array.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text_array.ts
index 674d24e6231f1..bfc528cf6ad6b 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text_array.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/operators_data_types/text/basic_license_essentials_tier/text_array.ts
@@ -32,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess Rule exception operators for data type text', () => {
+ describe('@serverless @serverlessQA @ess Rule exception operators for data type text', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_exceptions/text_as_array');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_endpoint_exceptions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_endpoint_exceptions.ts
index 8850976d1cf53..728d5328a9174 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_endpoint_exceptions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_endpoint_exceptions.ts
@@ -74,7 +74,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess create_endpoint_exceptions', () => {
+ describe('@serverless @serverlessQA @ess create_endpoint_exceptions', () => {
before(async () => {
await esArchiver.load(
'x-pack/test/functional/es_archives/rule_exceptions/endpoint_without_host_type'
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_rule_exceptions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_rule_exceptions.ts
index e65914d7f4193..21147663a630d 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_rule_exceptions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/create_rule_exceptions.ts
@@ -48,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => {
const config = getService('config');
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
- describe('@serverless @ess create "rule_default" exceptions', () => {
+ describe('@serverless @serverlessQA @ess create "rule_default" exceptions', () => {
before(async () => {
await createAlertsIndex(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts
index e4431967bf439..5af48e8216c3c 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts
@@ -26,8 +26,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const supertestWithoutAuth = getService('supertestWithoutAuth');
- // @skipInQA purposefully - only running tests in MKI whose failure should block release
- describe('@serverless @skipInQA exception item comments - serverless specific behavior', () => {
+ describe('@serverless exception item comments - serverless specific behavior', () => {
describe('Rule Exceptions', () => {
afterEach(async () => {
await deleteAllExceptions(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exceptions_data_integrity.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exceptions_data_integrity.ts
index 8aac6a504d52e..fe88000c9df1d 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exceptions_data_integrity.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exceptions_data_integrity.ts
@@ -37,8 +37,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- // @skipInQA purposefully - only running tests in MKI whose failure should block release
- describe('@serverless @ess @skipInQA exceptions data integrity', () => {
+ describe('@serverless @ess exceptions data integrity', () => {
afterEach(async () => {
await deleteAllAlerts(supertest, log, es);
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/find_rule_exception_references.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/find_rule_exception_references.ts
index e8f8a5bab1981..9df4347efe7bf 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/find_rule_exception_references.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/find_rule_exception_references.ts
@@ -36,7 +36,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@serverless @ess find_rule_exception_references', () => {
+ describe('@serverless @serverlessQA @ess find_rule_exception_references', () => {
before(async () => {
await createAlertsIndex(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts
index 0eb674d148727..7ce1ec3bd5a3f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts
@@ -37,8 +37,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- // @skipInQA purposefully - only running tests in MKI whose failure should block release
- describe('@serverless @ess @skipInQA exceptions workflows for prebuilt rules', () => {
+ describe('@serverless @ess exceptions workflows for prebuilt rules', () => {
describe('creating rules with exceptions', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/rule_exceptions_execution.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/rule_exceptions_execution.ts
index 4c24d025ce76f..550bb16d1dfe8 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/rule_exceptions_execution.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/rule_exceptions_execution.ts
@@ -58,7 +58,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- describe('@serverless @ess rule exceptions execution', () => {
+ describe('@serverless @serverlessQA @ess rule exceptions execution', () => {
before(async () => {
await esArchiver.load(path);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts
index a9e87e3018508..8222fd2640bea 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts
@@ -77,7 +77,7 @@ export default ({ getService }: FtrProviderContext) => {
const auditPath = dataPathBuilder.getPath('auditbeat/hosts');
// FLAKY: https://github.com/elastic/kibana/issues/180641
- describe.skip('@ess @serverless EQL type rules', () => {
+ describe.skip('@ess @serverless @serverlessQA EQL type rules', () => {
const { indexListOfDocuments } = dataGeneratorFactory({
es,
index: 'ecs_compliant',
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/machine_learning.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/machine_learning.ts
index a822fb5f82b96..a9763445e9bf5 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/machine_learning.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/machine_learning.ts
@@ -87,7 +87,7 @@ export default ({ getService }: FtrProviderContext) => {
};
// FLAKY: https://github.com/elastic/kibana/issues/171426
- describe.skip('@ess @serverless Machine learning type rules', () => {
+ describe.skip('@ess @serverless @serverlessQA Machine learning type rules', () => {
before(async () => {
// Order is critical here: auditbeat data must be loaded before attempting to start the ML job,
// as the job looks for certain indices on start
@@ -214,7 +214,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(metricsResponse.metrics?.task_run?.value.by_type['alerting:siem__mlRule']).toEqual(1);
});
- it('@skipInQA generates max alerts warning when circuit breaker is exceeded', async () => {
+ it('@skipInServerlessMKI generates max alerts warning when circuit breaker is exceeded', async () => {
const { logs } = await previewRule({
supertest,
rule: { ...rule, anomaly_threshold: 1, max_signals: 5 }, // This threshold generates 10 alerts with the current esArchive
@@ -230,7 +230,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(logs[0].warnings).not.toContain(getMaxAlertsWarning());
});
- it('@skipInQA should create 7 alerts from ML rule when records meet anomaly_threshold', async () => {
+ it('@skipInServerlessMKI should create 7 alerts from ML rule when records meet anomaly_threshold', async () => {
const { previewId } = await previewRule({
supertest,
rule: { ...rule, anomaly_threshold: 20 },
@@ -309,7 +309,7 @@ export default ({ getService }: FtrProviderContext) => {
await esArchiver.unload('x-pack/test/functional/es_archives/entity/risks');
});
- it('@skipInQA should be enriched with host risk score', async () => {
+ it('@skipInServerlessMKI should be enriched with host risk score', async () => {
const { previewId } = await previewRule({ supertest, rule });
const previewAlerts = await getPreviewAlerts({ es, previewId });
expect(previewAlerts.length).toBe(1);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms.ts
index f87595c0d7bb4..d6f464b63d78d 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms.ts
@@ -81,7 +81,7 @@ export default ({ getService }: FtrProviderContext) => {
};
// Failing: See https://github.com/elastic/kibana/issues/180236
- describe.skip('@ess @serverless New terms type rules', () => {
+ describe.skip('@ess @serverless @serverlessQA New terms type rules', () => {
before(async () => {
await esArchiver.load(path);
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/new_terms');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts
index 654781617f097..863a107af8ab5 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts
@@ -55,7 +55,7 @@ export default ({ getService }: FtrProviderContext) => {
const historicalWindowStart = '2019-10-13T05:00:04.000Z';
- describe('@ess @serverless New terms type rules, alert suppression', () => {
+ describe('@ess @serverless @serverlessQA New terms type rules, alert suppression', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/ecs_compliant');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/non_ecs_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/non_ecs_fields.ts
index bdd3a53914fcf..c5b04cd202d24 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/non_ecs_fields.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/non_ecs_fields.ts
@@ -58,7 +58,7 @@ export default ({ getService }: FtrProviderContext) => {
};
};
- describe('@ess @serverless Non ECS fields in alert document source', () => {
+ describe('@ess @serverless @serverlessQA Non ECS fields in alert document source', () => {
before(async () => {
await esArchiver.load(
'x-pack/test/functional/es_archives/security_solution/ecs_non_compliant'
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/query.ts
index dd9c0dc624035..a3ff1cf2909ff 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/query.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/query.ts
@@ -98,7 +98,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const auditbeatPath = dataPathBuilder.getPath('auditbeat/hosts');
- describe('@ess @serverless Query type rules', () => {
+ describe('@ess @serverless @serverlessQA Query type rules', () => {
before(async () => {
await esArchiver.load(auditbeatPath);
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alerts/8.8.0', {
@@ -2373,7 +2373,7 @@ export default ({ getService }: FtrProviderContext) => {
});
// TODO: Ask YARA
- describe('@brokenInServerless legacy investigation_fields', () => {
+ describe('@skipInServerless legacy investigation_fields', () => {
let ruleWithLegacyInvestigationField: Rule;
beforeEach(async () => {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/saved_query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/saved_query.ts
index 5afbee73fa727..8e88222c9653b 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/saved_query.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/saved_query.ts
@@ -43,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- describe('@ess @serverless Saved query type rules', () => {
+ describe('@ess @serverless @serverlessQA Saved query type rules', () => {
before(async () => {
await esArchiver.load(path);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match.ts
index 5514f7848b461..588ac2d3ec46b 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match.ts
@@ -171,7 +171,8 @@ export default ({ getService }: FtrProviderContext) => {
/**
* Specific api integration tests for threat matching rule type
*/
- describe('@ess @serverless Threat match type rules', () => {
+ // FLAKY: https://github.com/elastic/kibana/issues/155304
+ describe('@ess @serverless @serverlessQA Threat match type rules', () => {
before(async () => {
await esArchiver.load(audibeatHostsPath);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match_alert_suppression.ts
index 84e6ce0469367..c0b8e85ec27af 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match_alert_suppression.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threat_match_alert_suppression.ts
@@ -157,7 +157,7 @@ export default ({ getService }: FtrProviderContext) => {
},
];
- describe('@ess @serverless Indicator match type rules, alert suppression', () => {
+ describe('@ess @serverless @serverlessQA Indicator match type rules, alert suppression', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/ecs_compliant');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold.ts
index 97f1bcaf50c00..98e96dc262841 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold.ts
@@ -47,7 +47,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- describe('@ess @serverless Threshold type rules', () => {
+ describe('@ess @serverless @serverlessQA Threshold type rules', () => {
before(async () => {
await esArchiver.load(path);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts
index 11b38b71599df..53b03edba30df 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts
@@ -49,7 +49,7 @@ export default ({ getService }: FtrProviderContext) => {
const dataPathBuilder = new EsArchivePathBuilder(isServerless);
const path = dataPathBuilder.getPath('auditbeat/hosts');
- describe('@ess @serverless Threshold type rules, alert suppression', () => {
+ describe('@ess @serverless @serverlessQA Threshold type rules, alert suppression', () => {
const { indexListOfDocuments, indexGeneratedDocuments } = dataGeneratorFactory({
es,
index: 'ecs_compliant',
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/ignore_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/ignore_fields.ts
index 3e3cf7eac685f..205570fdd96c3 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/ignore_fields.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/ignore_fields.ts
@@ -46,7 +46,7 @@ export default ({ getService }: FtrProviderContext): void => {
* server/lib/detection_engine/signals/source_fields_merging/utils/is_ignored.ts
* server/lib/detection_engine/signals/source_fields_merging/utils/is_eql_bug_77152.ts
*/
- describe('@ess @serverless ignore_fields', () => {
+ describe('@ess @serverless @serverlessQA ignore_fields', () => {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const log = getService('log');
@@ -69,7 +69,7 @@ export default ({ getService }: FtrProviderContext): void => {
await deleteAllRules(supertest, log);
});
- it('@skipInQA should ignore the field of "testing_ignored"', async () => {
+ it('@skipInServerlessMKI should ignore the field of "testing_ignored"', async () => {
const rule = getEqlRuleForAlertTesting(['ignore_fields']);
const { id } = await createRule(supertest, log, rule);
@@ -84,7 +84,7 @@ export default ({ getService }: FtrProviderContext): void => {
expect(hits).to.eql([undefined, undefined, undefined, undefined]);
});
- it('@skipInQA should ignore the field of "testing_regex"', async () => {
+ it('@skipInServerlessMKI should ignore the field of "testing_regex"', async () => {
const rule = getEqlRuleForAlertTesting(['ignore_fields']);
const { id } = await createRule(supertest, log, rule);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/const_keyword.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/const_keyword.ts
index fca298744b69c..b3464827bd5dd 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/const_keyword.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/const_keyword.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@ess @serverless Rule detects against a keyword of event.dataset', () => {
+ describe('@ess @serverless @serverlessQA Rule detects against a keyword of event.dataset', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/const_keyword');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword.ts
index ddab1e5a1a44b..9afade19216a1 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword.ts
@@ -50,7 +50,7 @@ export default ({ getService }: FtrProviderContext) => {
await deleteAllRules(supertest, log);
});
- describe('@ess @serverless "kql" rule type', () => {
+ describe('@ess @serverless @serverlessQA "kql" rule type', () => {
it('should detect the "dataset_name_1" from "event.dataset"', async () => {
const rule: QueryRuleCreateProps = {
...getRuleForAlertTesting(['keyword']),
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword_mixed_with_const.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword_mixed_with_const.ts
index 4844aadb76a27..c71bf14abb644 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword_mixed_with_const.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/keyword_family/keyword_mixed_with_const.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext) => {
const log = getService('log');
const es = getService('es');
- describe('@ess @serverless Rule detects against a keyword and constant_keyword of event.dataset', () => {
+ describe('@ess @serverless @serverlessQA Rule detects against a keyword and constant_keyword of event.dataset', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/const_keyword');
await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/keyword');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/runtime.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/runtime.ts
index 47e0a0ab3ff9c..439f876921da1 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/runtime.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/runtime.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext) => {
hostname: string;
}
- describe('@ess @serverless Tests involving runtime fields of source indexes and the alerts index', () => {
+ describe('@ess @serverless @serverlessQA Tests involving runtime fields of source indexes and the alerts index', () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/runtime');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/timestamps.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/timestamps.ts
index 108066830c636..8101de2a1e4d3 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/timestamps.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/timestamps.ts
@@ -44,7 +44,7 @@ export default ({ getService }: FtrProviderContext) => {
* the "signal.original_time" field, ensuring that timestamp overrides operate, and ensuring that
* partial errors happen correctly
*/
- describe('@ess @serverless timestamp tests', () => {
+ describe('@ess @serverless @serverlessQA timestamp tests', () => {
describe('alerts generated from events with a timestamp in seconds is converted correctly into the forced ISO8601 format when copying', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/install_latest_bundled_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/install_latest_bundled_prebuilt_rules.ts
index 5e147ee2b711b..52386aaa6d016 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/install_latest_bundled_prebuilt_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/install_latest_bundled_prebuilt_rules.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext): void => {
/* from a package that was bundled with Kibana */
//
// FLAKY: https://github.com/elastic/kibana/issues/180087
- describe.skip('@ess @serverless @skipInQA install_bundled_prebuilt_rules', () => {
+ describe.skip('@ess @serverless @skipInServerlessMKI install_bundled_prebuilt_rules', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
await deleteAllPrebuiltRuleAssets(es, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/prerelease_packages.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/prerelease_packages.ts
index b0e7269a386e0..edae7dd4eb014 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/prerelease_packages.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/bundled_prebuilt_rules_package/trial_license_complete_tier/prerelease_packages.ts
@@ -31,7 +31,7 @@ export default ({ getService }: FtrProviderContext): void => {
/* (We use high mock version numbers to prevent clashes with real packages downloaded in other tests.)
/* To do assertions on which packages have been installed, 99.0.0 has a single rule to install,
/* while 99.0.1-beta.1 has 2 rules to install. Also, both packages have the version as part of the rule names. */
- describe('@ess @serverless @skipInQA prerelease_packages', () => {
+ describe('@ess @serverless @skipInServerlessMKI prerelease_packages', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
await deleteAllPrebuiltRuleAssets(es, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/large_prebuilt_rules_package/trial_license_complete_tier/install_large_prebuilt_rules_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/large_prebuilt_rules_package/trial_license_complete_tier/install_large_prebuilt_rules_package.ts
index b34aae0b97a56..b172c11ea2eed 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/large_prebuilt_rules_package/trial_license_complete_tier/install_large_prebuilt_rules_package.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/large_prebuilt_rules_package/trial_license_complete_tier/install_large_prebuilt_rules_package.ts
@@ -18,7 +18,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA install_large_prebuilt_rules_package', () => {
+ describe('@ess @serverless @skipInServerlessMKI install_large_prebuilt_rules_package', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
await deleteAllPrebuiltRuleAssets(es, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/fleet_integration.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/fleet_integration.ts
index 37c38e25397ae..cb317870d3773 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/fleet_integration.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/fleet_integration.ts
@@ -22,7 +22,7 @@ export default ({ getService }: FtrProviderContext): void => {
const log = getService('log');
const retry = getService('retry');
- describe('@ess @serverless @skipInQA install_prebuilt_rules_from_real_package', () => {
+ describe('@ess @serverless @skipInServerlessMKI install_prebuilt_rules_from_real_package', () => {
beforeEach(async () => {
await deletePrebuiltRulesFleetPackage(supertest);
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_rules_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_rules_status.ts
index 5ae15cd6fc3a1..3c5806688cd61 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_rules_status.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_rules_status.ts
@@ -30,7 +30,7 @@ export default ({ getService }: FtrProviderContext): void => {
const es = getService('es');
const log = getService('log');
- describe('@ess @serverless @skipInQA Prebuilt Rules status', () => {
+ describe('@ess @serverless @skipInServerlessMKI Prebuilt Rules status', () => {
describe('get_prebuilt_rules_status', () => {
beforeEach(async () => {
await deleteAllPrebuiltRuleAssets(es, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_timelines_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_timelines_status.ts
index f0311154a900b..d7f368d7f69a9 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_timelines_status.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/get_prebuilt_timelines_status.ts
@@ -18,7 +18,7 @@ export default ({ getService }: FtrProviderContext): void => {
const es = getService('es');
const log = getService('log');
- describe('@ess @serverless @skipInQA get_prebuilt_timelines_status', () => {
+ describe('@ess @serverless @skipInServerlessMKI get_prebuilt_timelines_status', () => {
beforeEach(async () => {
await deleteAllTimelines(es, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules.ts
index d9a99d50228d5..a96f88101d006 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules.ts
@@ -24,7 +24,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA install prebuilt rules from package without historical versions with mock rule assets', () => {
+ describe('@ess @serverless @skipInServerlessMKI install prebuilt rules from package without historical versions with mock rule assets', () => {
const getRuleAssetSavedObjects = () => [
createRuleAssetSavedObject({ rule_id: 'rule-1', version: 1 }),
createRuleAssetSavedObject({ rule_id: 'rule-2', version: 2 }),
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules_with_historical_versions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules_with_historical_versions.ts
index 8b8b06f6b1519..21e546ff91bdc 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules_with_historical_versions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/install_prebuilt_rules_with_historical_versions.ts
@@ -24,7 +24,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA install prebuilt rules from package with historical versions with mock rule assets', () => {
+ describe('@ess @serverless @skipInServerlessMKI install prebuilt rules from package with historical versions with mock rule assets', () => {
const getRuleAssetSavedObjects = () => [
createRuleAssetSavedObject({ rule_id: 'rule-1', version: 1 }),
createRuleAssetSavedObject({ rule_id: 'rule-1', version: 2 }),
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules.ts
index 73204855bcbf8..cd336f91fae13 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules.ts
@@ -27,7 +27,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA upgrade prebuilt rules from package without historical versions with mock rule assets', () => {
+ describe('@ess @serverless @skipInServerlessMKI upgrade prebuilt rules from package without historical versions with mock rule assets', () => {
const getRuleAssetSavedObjects = () => [
createRuleAssetSavedObject({ rule_id: 'rule-1', version: 1 }),
createRuleAssetSavedObject({ rule_id: 'rule-2', version: 2 }),
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules_with_historical_versions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules_with_historical_versions.ts
index 4137e2a9a194f..049ae3a5a6fd8 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules_with_historical_versions.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_prebuilt_rules_with_historical_versions.ts
@@ -24,7 +24,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA upgrade prebuilt rules from package with historical versions with mock rule assets', () => {
+ describe('@ess @serverless @skipInServerlessMKI upgrade prebuilt rules from package with historical versions with mock rule assets', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
await deleteAllTimelines(es, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/update_prebuilt_rules_package/trial_license_complete_tier/update_prebuilt_rules_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/update_prebuilt_rules_package/trial_license_complete_tier/update_prebuilt_rules_package.ts
index 98264cada6976..8e26b089a9f80 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/update_prebuilt_rules_package/trial_license_complete_tier/update_prebuilt_rules_package.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/update_prebuilt_rules_package/trial_license_complete_tier/update_prebuilt_rules_package.ts
@@ -62,7 +62,7 @@ export default ({ getService }: FtrProviderContext): void => {
return getPackageResponse.body.item.version ?? '';
};
- describe('@ess @serverless @skipInQA update_prebuilt_rules_package', () => {
+ describe('@ess @serverless @skipInServerlessMKI update_prebuilt_rules_package', () => {
before(async () => {
const configFilePath = path.resolve(REPO_ROOT, 'fleet_packages.json');
const fleetPackages = await fs.readFile(configFilePath, 'utf8');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action.ts
index 747426e0c0587..8b59070202b08 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action.ts
@@ -85,7 +85,7 @@ export default ({ getService }: FtrProviderContext): void => {
const createWebHookConnector = () => createConnector(getWebHookAction());
const createSlackConnector = () => createConnector(getSlackAction());
- describe('@ess @serverless @brokenInServerless @skipInQA perform_bulk_action', () => {
+ describe('@ess @serverless @skipInServerless perform_bulk_action', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts');
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_dry_run.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_dry_run.ts
index 29e3cad3f0ab4..149af89f6a72a 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_dry_run.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_dry_run.ts
@@ -24,7 +24,7 @@ export default ({ getService }: FtrProviderContext): void => {
const log = getService('log');
const es = getService('es');
- describe('@ess @serverless @skipInQA perform_bulk_action dry_run', () => {
+ describe('@ess @serverless @skipInServerlessMKI perform_bulk_action dry_run', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules.ts
index e7967df45b5f9..319a4a20c9c96 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules.ts
@@ -346,7 +346,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless t1_analyst', () => {
+ describe('@skipInServerless t1_analyst', () => {
const role = ROLES.t1_analyst;
beforeEach(async () => {
@@ -482,7 +482,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless missing timestamps', () => {
+ describe('@skipInServerless missing timestamps', () => {
beforeEach(async () => {
await es.indices.delete({ index: 'myfakeindex-1', ignore_unavailable: true });
await es.indices.create({
@@ -561,7 +561,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless per-action frequencies', () => {
+ describe('@skipInServerless per-action frequencies', () => {
beforeEach(async () => {
await deleteAllAlerts(supertest, log, es);
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules_bulk.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules_bulk.ts
index c762487b8f278..282ffcf327dee 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules_bulk.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/create_rules_bulk.ts
@@ -45,7 +45,7 @@ export default ({ getService }: FtrProviderContext): void => {
const es = getService('es');
// See https://github.com/elastic/kibana/issues/130963 for discussion on deprecation
- describe('@ess @brokenInServerless @skipInQA create_rules_bulk', () => {
+ describe('@ess @skipInServerless create_rules_bulk', () => {
describe('deprecations', () => {
afterEach(async () => {
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/preview_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/preview_rules.ts
index 43a04eef3cb69..02474fdb91d24 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/preview_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/trial_license_complete_tier/preview_rules.ts
@@ -95,7 +95,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless t1_analyst', () => {
+ describe('@skipInServerless t1_analyst', () => {
const role = ROLES.t1_analyst;
beforeEach(async () => {
@@ -116,7 +116,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless hunter', () => {
+ describe('@skipInServerless hunter', () => {
const role = ROLES.hunter;
beforeEach(async () => {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_delete/trial_license_complete_tier/delete_rules_bulk.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_delete/trial_license_complete_tier/delete_rules_bulk.ts
index a606f286ff1d7..cd4deb8cff7d8 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_delete/trial_license_complete_tier/delete_rules_bulk.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_delete/trial_license_complete_tier/delete_rules_bulk.ts
@@ -40,7 +40,7 @@ export default ({ getService }: FtrProviderContext): void => {
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
// See https://github.com/elastic/kibana/issues/130963 for discussion on deprecation
- describe('@ess @brokenInServerless @skipInQA delete_rules_bulk', () => {
+ describe('@ess @skipInServerlesMKI delete_rules_bulk', () => {
describe('deprecations', () => {
it('should return a warning header', async () => {
await createRule(supertest, log, getSimpleRule());
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/basic_license_essentials_tier/import_rules_with_overwrite.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/basic_license_essentials_tier/import_rules_with_overwrite.ts
index 3f2318208bb16..c58f20a84db8f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/basic_license_essentials_tier/import_rules_with_overwrite.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/basic_license_essentials_tier/import_rules_with_overwrite.ts
@@ -16,7 +16,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA import_rules with rule overwrite set to "true"', () => {
+ describe('@ess @serverless @skipInServerlessMKI import_rules with rule overwrite set to "true"', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts
index 10421b88a9dde..788eb36dddcca 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts
@@ -27,7 +27,7 @@ export default ({ getService }: FtrProviderContext): void => {
const log = getService('log');
const es = getService('es');
- describe('@ess @brokenInServerless @skipInQA export_rules', () => {
+ describe('@ess @skipInServerlessMKI export_rules', () => {
describe('exporting rules', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_connectors.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_connectors.ts
index 60576ff5cabdf..5edaabf86c093 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_connectors.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_connectors.ts
@@ -16,7 +16,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @brokenInServerless @skipInQA import action connectors', () => {
+ describe('@ess @skipInServerlessMKI import action connectors', () => {
const CONNECTOR_ID = '1be16246-642a-4ed8-bfd3-b47f8c7d7055';
const ANOTHER_CONNECTOR_ID = 'abc16246-642a-4ed8-bfd3-b47f8c7d7055';
const CUSTOM_ACTION_CONNECTOR = {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules.ts
index f47d90f5f4e83..b40b5b785ca53 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules.ts
@@ -171,7 +171,7 @@ export default ({ getService }: FtrProviderContext): void => {
const log = getService('log');
const esArchiver = getService('esArchiver');
- describe('@ess @brokenInServerless @skipInQA import_rules', () => {
+ describe('@ess @serverless @skipInServerlessMKI import_rules', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules_with_overwrite.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules_with_overwrite.ts
index 3f2318208bb16..c58f20a84db8f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules_with_overwrite.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/import_rules_with_overwrite.ts
@@ -16,7 +16,7 @@ export default ({ getService }: FtrProviderContext): void => {
const supertest = getService('supertest');
const log = getService('log');
- describe('@ess @serverless @skipInQA import_rules with rule overwrite set to "true"', () => {
+ describe('@ess @serverless @skipInServerlessMKI import_rules with rule overwrite set to "true"', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/basic_license_essentials_tier/patch_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/basic_license_essentials_tier/patch_rules.ts
index f5b1364bc1afb..7abca99e6e052 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/basic_license_essentials_tier/patch_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/basic_license_essentials_tier/patch_rules.ts
@@ -59,7 +59,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(bodyToCompare).to.eql(expectedRule);
});
- it('@brokenInServerless should return a "403 forbidden" using a rule_id of type "machine learning"', async () => {
+ it('@skipInServerless should return a "403 forbidden" using a rule_id of type "machine learning"', async () => {
await createRule(supertest, log, getSimpleRule('rule-1'));
// patch a simple rule's type to machine learning
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules.ts
index 24919448b8522..8256b7734463f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules.ts
@@ -47,7 +47,7 @@ export default ({ getService }: FtrProviderContext) => {
const config = getService('config');
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
- describe('@ess @serverless @skipInQA patch_rules', () => {
+ describe('@ess @serverless @skipInServerlessMKI patch_rules', () => {
describe('patch rules', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
@@ -422,7 +422,7 @@ export default ({ getService }: FtrProviderContext) => {
describe('actions without frequencies', () => {
[undefined, NOTIFICATION_THROTTLE_NO_ACTIONS, NOTIFICATION_THROTTLE_RULE].forEach(
(throttle) => {
- it(`@brokenInServerless it sets each action's frequency attribute to default value when 'throttle' is ${throttle}`, async () => {
+ it(`@skipInServerless it sets each action's frequency attribute to default value when 'throttle' is ${throttle}`, async () => {
const actionsWithoutFrequencies = await getActionsWithoutFrequencies(supertest);
// create simple rule
@@ -452,7 +452,7 @@ export default ({ getService }: FtrProviderContext) => {
// Action throttle cannot be shorter than the schedule interval which is by default is 5m
['300s', '5m', '3h', '4d'].forEach((throttle) => {
- it(`@brokenInServerless it correctly transforms 'throttle = ${throttle}' and sets it as a frequency of each action`, async () => {
+ it(`@skipInServerless it correctly transforms 'throttle = ${throttle}' and sets it as a frequency of each action`, async () => {
const actionsWithoutFrequencies = await getActionsWithoutFrequencies(supertest);
// create simple rule
@@ -490,7 +490,7 @@ export default ({ getService }: FtrProviderContext) => {
'10h',
'2d',
].forEach((throttle) => {
- it(`@brokenInServerless it does not change actions frequency attributes when 'throttle' is '${throttle}'`, async () => {
+ it(`@skipInServerless it does not change actions frequency attributes when 'throttle' is '${throttle}'`, async () => {
const actionsWithFrequencies = await getActionsWithFrequencies(supertest);
// create simple rule
@@ -516,7 +516,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless some actions with frequencies', () => {
+ describe('@skipInServerless some actions with frequencies', () => {
[undefined, NOTIFICATION_THROTTLE_NO_ACTIONS, NOTIFICATION_THROTTLE_RULE].forEach(
(throttle) => {
it(`it overrides each action's frequency attribute to default value when 'throttle' is ${throttle}`, async () => {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules_bulk.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules_bulk.ts
index 984dbaec712c3..88ca9c4ffe289 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules_bulk.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_patch/trial_license_complete_tier/patch_rules_bulk.ts
@@ -44,7 +44,7 @@ export default ({ getService }: FtrProviderContext) => {
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
// See https://github.com/elastic/kibana/issues/130963 for discussion on deprecation
- describe('@ess @brokenInServerless @skipInQA patch_rules_bulk', () => {
+ describe('@ess @skipInServerless patch_rules_bulk', () => {
describe('deprecations', () => {
afterEach(async () => {
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_read/trial_license_complete_tier/read_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_read/trial_license_complete_tier/read_rules.ts
index c8a76f58dbccd..2dc3e8168a24f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_read/trial_license_complete_tier/read_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_read/trial_license_complete_tier/read_rules.ts
@@ -108,7 +108,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless @skipInQA should be able to a read a execute immediately action correctly', async () => {
+ it('@skipInServerless should be able to a read a execute immediately action correctly', async () => {
// create connector/action
const { body: hookAction } = await supertest
.post('/api/actions/action')
@@ -150,7 +150,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(bodyToCompare).to.eql(ruleWithActions);
});
- it('@brokenInServerless should be able to a read a scheduled action correctly', async () => {
+ it('@skipInServerless should be able to a read a scheduled action correctly', async () => {
// create connector/action
const { body: hookAction } = await supertest
.post('/api/actions/action')
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/basic_license_essentials_tier/update_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/basic_license_essentials_tier/update_rules.ts
index 2d787dd099cdb..301b4413805a9 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/basic_license_essentials_tier/update_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/basic_license_essentials_tier/update_rules.ts
@@ -64,7 +64,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(bodyToCompare).to.eql(expectedRule);
});
- it('@brokenInServerless should return a 403 forbidden if it is a machine learning job', async () => {
+ it('@skipInServerless should return a 403 forbidden if it is a machine learning job', async () => {
await createRule(supertest, log, getSimpleRule('rule-1'));
// update a simple rule's type to try to be a machine learning job type
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules.ts
index 500eedb5bc2fd..d905c57aa4a2f 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules.ts
@@ -50,7 +50,7 @@ export default ({ getService }: FtrProviderContext) => {
const config = getService('config');
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
- describe('@ess @serverless @skipInQA update_rules', () => {
+ describe('@ess @serverless @skipInServerlessMKI update_rules', () => {
describe('update rules', () => {
beforeEach(async () => {
await createAlertsIndex(supertest, log);
@@ -142,7 +142,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(bodyToCompare).to.eql(outputRule);
});
- it('@brokenInServerless should update a single rule property and remove the action', async () => {
+ it('@skipInServerless should update a single rule property and remove the action', async () => {
const [connector1] = await Promise.all([
supertest
.post(`/api/actions/connector`)
@@ -562,7 +562,7 @@ export default ({ getService }: FtrProviderContext) => {
return removeServerGeneratedPropertiesIncludingRuleId(updatedRule);
};
- describe('@brokenInServerless actions without frequencies', () => {
+ describe('@skipInServerless actions without frequencies', () => {
[undefined, NOTIFICATION_THROTTLE_NO_ACTIONS, NOTIFICATION_THROTTLE_RULE].forEach(
(throttle) => {
it(`it sets each action's frequency attribute to default value when 'throttle' is ${throttle}`, async () => {
@@ -623,7 +623,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless actions with frequencies', () => {
+ describe('@skipInServerless actions with frequencies', () => {
[
undefined,
NOTIFICATION_THROTTLE_NO_ACTIONS,
@@ -658,7 +658,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless some actions with frequencies', () => {
+ describe('@skipInServerless some actions with frequencies', () => {
[undefined, NOTIFICATION_THROTTLE_NO_ACTIONS, NOTIFICATION_THROTTLE_RULE].forEach(
(throttle) => {
it(`it overrides each action's frequency attribute to default value when 'throttle' is ${throttle}`, async () => {
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules_bulk.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules_bulk.ts
index 5c7f4db37a658..2dead22fd358a 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules_bulk.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_update/trial_license_complete_tier/update_rules_bulk.ts
@@ -54,7 +54,7 @@ export default ({ getService }: FtrProviderContext) => {
const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username');
// See https://github.com/elastic/kibana/issues/130963 for discussion on deprecation
- describe('@ess @brokenInServerless @skipInQA update_rules_bulk', () => {
+ describe('@ess update_rules_bulk', () => {
describe('deprecations', () => {
afterEach(async () => {
await deleteAllRules(supertest, log);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts
index 8ec7a4eeb56cd..db82ff8f6eca4 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts
@@ -43,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => {
await deleteAllExceptions(supertest, log);
});
- it('@skipInQA should only have task metric values when no rules are running', async () => {
+ it('@skipInServerlessMKI should only have task metric values when no rules are running', async () => {
await retry.try(async () => {
const stats = await getSecurityTelemetryStats(supertest, log);
removeExtraFieldsFromTelemetryStats(stats);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts
index abfe92a4cec04..a6d19a2c2aaf3 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts
@@ -55,7 +55,7 @@ export default ({ getService }: FtrProviderContext) => {
});
describe('custom rules should never show any detection_rules telemetry data for each list type', () => {
- it('@skipInQA should NOT give telemetry/stats for an exception list of type "detection"', async () => {
+ it('@skipInServerlessMKI should NOT give telemetry/stats for an exception list of type "detection"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
// create an exception list container of type "detection"
@@ -111,7 +111,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint"', async () => {
+ it('@skipInServerlessMKI should NOT give telemetry/stats for an exception list of type "endpoint"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
// create an exception list container of type "detection"
@@ -167,7 +167,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_trusted_apps"', async () => {
+ it('@skipInServerlessMKI should NOT give telemetry/stats for an exception list of type "endpoint_trusted_apps"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
// create an exception list container of type "detection"
@@ -223,7 +223,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_events"', async () => {
+ it('@skipInServerlessMKI should NOT give telemetry/stats for an exception list of type "endpoint_events"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
// create an exception list container of type "detection"
@@ -279,7 +279,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_host_isolation_exceptions"', async () => {
+ it('@skipInServerlessMKI should NOT give telemetry/stats for an exception list of type "endpoint_host_isolation_exceptions"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
// create an exception list container of type "detection"
@@ -336,7 +336,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@skipInQA pre-built/immutable/elastic rules should show detection_rules telemetry data for each list type', () => {
+ describe('@skipInServerlessMKI pre-built/immutable/elastic rules should show detection_rules telemetry data for each list type', () => {
beforeEach(async () => {
// install prepackaged rules to get immutable rules for testing
await installMockPrebuiltRules(supertest, es);
@@ -789,7 +789,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@skipInQA pre-built/immutable/elastic rules should show detection_rules telemetry data for multiple list items and types', () => {
+ describe('@skipInServerlessMKI pre-built/immutable/elastic rules should show detection_rules telemetry data for multiple list items and types', () => {
beforeEach(async () => {
// install prepackaged rules to get immutable rules for testing
await installMockPrebuiltRules(supertest, es);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/all_types.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/all_types.ts
index a3f893fff8aa9..bbc8280becfa4 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/all_types.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/all_types.ts
@@ -24,7 +24,7 @@ export default ({ getService }: FtrProviderContext) => {
const retry = getService('retry');
const es = getService('es');
- describe('@ess @serverless @skipInQA Detection rule telemetry', async () => {
+ describe('@ess @serverless @skipInServerlessMKI Detection rule telemetry', async () => {
before(async () => {
await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry');
});
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rule_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rule_status.ts
index 317956d5b7dcd..c7d587e487213 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rule_status.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rule_status.ts
@@ -123,7 +123,7 @@ export default ({ getService }: FtrProviderContext) => {
expect(stats?.detection_rules.detection_rule_usage).to.eql(expectedRuleUsage);
});
- it('@skipInQA should have zero values for "detection_rule_status.all_rules" rules that are not query based', () => {
+ it('@skipInServerlessMKI should have zero values for "detection_rule_status.all_rules" rules that are not query based', () => {
expect(stats?.detection_rules.detection_rule_status.all_rules.eql).to.eql(
getInitialSingleEventMetric()
);
@@ -175,7 +175,7 @@ export default ({ getService }: FtrProviderContext) => {
);
});
- it('@skipInQA should have non zero values for "index_duration"', () => {
+ it('@skipInServerlessMKI should have non zero values for "index_duration"', () => {
expect(
stats?.detection_rules.detection_rule_status.custom_rules.query.index_duration.max
).to.be.above(1);
@@ -208,11 +208,11 @@ export default ({ getService }: FtrProviderContext) => {
).to.be.above(1);
});
- it('@skipInQA should have non zero values for "succeeded"', () => {
+ it('@skipInServerlessMKI should have non zero values for "succeeded"', () => {
expect(stats?.detection_rules.detection_rule_status.custom_rules.query.succeeded).to.eql(1);
});
- it('@skipInQA should have non zero values for "succeeded", "index_duration", "search_duration" and "enrichment_duration"', () => {
+ it('@skipInServerlessMKI should have non zero values for "succeeded", "index_duration", "search_duration" and "enrichment_duration"', () => {
expect(
stats?.detection_rules.detection_rule_status.custom_rules.query.index_duration.max
).to.be.above(1);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rules.ts
index 2772b3ebde34e..d0f633707fa62 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rules.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/usage_collector/detection_rules.ts
@@ -162,7 +162,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
const rule = getRuleForAlertTesting(['telemetry']);
const hookAction = await createWebHookRuleAction(supertest);
const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule);
@@ -191,7 +191,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false);
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -217,7 +217,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
const rule = getRuleForAlertTesting(['telemetry']);
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -246,7 +246,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- describe('@brokenInServerless legacy investigation fields', () => {
+ describe('@skipInServerless legacy investigation fields', () => {
beforeEach(async () => {
await deleteAllRules(supertest, log);
await createRuleThroughAlertingEndpoint(
@@ -411,7 +411,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
const rule = getEqlRuleForAlertTesting(['telemetry'], 'rule-1', false);
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -436,7 +436,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
const rule = getEqlRuleForAlertTesting(['telemetry']);
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -609,7 +609,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
const rule: ThresholdRuleCreateProps = {
...getThresholdRuleForAlertTesting(['telemetry'], 'rule-1', false),
threshold: {
@@ -640,7 +640,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
const rule: ThresholdRuleCreateProps = {
...getThresholdRuleForAlertTesting(['telemetry']),
threshold: {
@@ -788,7 +788,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
const rule = getSimpleMlRule();
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -813,7 +813,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
const rule = getSimpleMlRule('rule-1', true);
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -988,7 +988,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => {
const rule = getSimpleThreatMatch();
const { id } = await createRule(supertest, log, rule);
const hookAction = await createWebHookRuleAction(supertest);
@@ -1013,7 +1013,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => {
const rule: ThreatMatchRuleCreateProps = {
...getSimpleThreatMatch('rule-1', true),
index: ['telemetry'],
@@ -1059,7 +1059,7 @@ export default ({ getService }: FtrProviderContext) => {
});
describe('"pre-packaged"/"immutable" rules', async () => {
- it('@skipInQA should show stats for totals for in-active pre-packaged rules', async () => {
+ it('@skipInServerless should show stats for totals for in-active pre-packaged rules', async () => {
await installMockPrebuiltRules(supertest, es);
await retry.try(async () => {
const stats = await getStats(supertest, log);
@@ -1092,7 +1092,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should show stats for the detection_rule_details for a specific pre-packaged rule', async () => {
+ it('@skipInServerlessMKI should show stats for the detection_rule_details for a specific pre-packaged rule', async () => {
await installMockPrebuiltRules(supertest, es);
await retry.try(async () => {
const stats = await getStats(supertest, log);
@@ -1123,7 +1123,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should show "notifications_disabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerlessMKI should show "notifications_disabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => {
await installMockPrebuiltRules(supertest, es);
const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID });
const hookAction = await createWebHookRuleAction(supertest);
@@ -1176,7 +1176,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@skipInQA should show "notifications_enabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerlessMKI should show "notifications_enabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
await installMockPrebuiltRules(supertest, es);
const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID });
const hookAction = await createWebHookRuleAction(supertest);
@@ -1229,7 +1229,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_disabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_disabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => {
await installMockPrebuiltRules(supertest, es);
const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID });
const hookAction = await createWebHookRuleAction(supertest);
@@ -1282,7 +1282,7 @@ export default ({ getService }: FtrProviderContext) => {
});
});
- it('@brokenInServerless should show "legacy_notifications_enabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
+ it('@skipInServerless should show "legacy_notifications_enabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => {
await installMockPrebuiltRules(supertest, es);
const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID });
const hookAction = await createWebHookRuleAction(supertest);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/user_roles/trial_license_complete_tier/read_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/user_roles/trial_license_complete_tier/read_privileges.ts
index d13f4e2e4dd0a..7727958243823 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/user_roles/trial_license_complete_tier/read_privileges.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/user_roles/trial_license_complete_tier/read_privileges.ts
@@ -20,7 +20,7 @@ export default ({ getService }: FtrProviderContext) => {
const supertestWithoutAuth = getService('supertestWithoutAuth');
// Failing ES Promotion: https://github.com/elastic/kibana/issues/174028
- describe.skip('@ess @serverless @brokenInServerless read_privileges', () => {
+ describe.skip('@ess @serverless @skipInServerless read_privileges', () => {
it('should return expected privileges for elastic admin', async () => {
const { body } = await supertest.get(DETECTION_ENGINE_PRIVILEGES_URL).send().expect(200);
expect(body).to.eql({
diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts
index 207cd26a1563c..7f4a9714be640 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts
@@ -23,7 +23,7 @@ export default ({ getService }: FtrProviderContext) => {
const supertest = getService('supertest');
const assetCriticalityRoutes = assetCriticalityRouteHelpersFactory(supertest);
- describe('@ess @serverless @skipInQA asset_criticality Asset Criticality APIs', () => {
+ describe('@ess @serverless @skipInServerlessMKI asset_criticality Asset Criticality APIs', () => {
beforeEach(async () => {
await cleanRiskEngine({ kibanaServer, es, log });
await cleanAssetCriticality({ log, es });
diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts
index 8461cae6d5edb..b575da1e4bbad 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts
@@ -93,7 +93,7 @@ export default ({ getService }: FtrProviderContext): void => {
await riskEngineRoutes.init();
});
- it('@skipInQA calculates and persists risk scores for alert documents', async () => {
+ it('@skipInServerlessMKI calculates and persists risk scores for alert documents', async () => {
await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 });
const scores = await readRiskScores(es);
@@ -104,7 +104,7 @@ export default ({ getService }: FtrProviderContext): void => {
);
});
- it('@skipInQA starts the latest transform', async () => {
+ it('@skipInServerlessMKI starts the latest transform', async () => {
await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 });
const transformStats = await es.transform.getTransformStats({
@@ -114,7 +114,7 @@ export default ({ getService }: FtrProviderContext): void => {
expect(transformStats.transforms[0].state).to.eql('started');
});
- describe('@skipInQA disabling and re-enabling the risk engine', () => {
+ describe('@skipInServerlessMKI disabling and re-enabling the risk engine', () => {
beforeEach(async () => {
await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 });
await riskEngineRoutes.disable();
@@ -136,7 +136,7 @@ export default ({ getService }: FtrProviderContext): void => {
});
});
- describe('@skipInQA disabling the risk engine', () => {
+ describe('@skipInServerlessMKI disabling the risk engine', () => {
beforeEach(async () => {
await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 });
});
@@ -213,7 +213,7 @@ export default ({ getService }: FtrProviderContext): void => {
});
});
- it('@skipInQA calculates and persists risk scores for both types of entities', async () => {
+ it('@skipInServerlessMKI calculates and persists risk scores for both types of entities', async () => {
await riskEngineRoutes.init();
await waitForRiskScoresToBePresent({ es, log, scoreCount: 20 });
const riskScores = await readRiskScores(es);
diff --git a/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/basic.ts b/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/basic.ts
index 840f3be765cb0..2be43b9188044 100644
--- a/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/basic.ts
+++ b/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/basic.ts
@@ -28,8 +28,8 @@ export default ({ getService }: FtrProviderContext) => {
const objectRemover = new ObjectRemover(supertest);
const configService = getService('config');
- // @skipInQA tag because the simulators do not work in the QA env
- describe('@ess @serverless @skipInQA Basic Security AI Assistant Invoke AI [non-streaming, non-LangChain]', async () => {
+ // @skipInServerlessMKI tag because the simulators do not work in the QA env
+ describe('@ess @serverless @skipInServerlessMKI Basic Security AI Assistant Invoke AI [non-streaming, non-LangChain]', async () => {
after(() => {
objectRemover.removeAll();
});
From 812069aa5a682196cc1ca6dbd03074307662b483 Mon Sep 17 00:00:00 2001
From: Bena Kansara <69037875+benakansara@users.noreply.github.com>
Date: Tue, 23 Apr 2024 19:27:33 +0200
Subject: [PATCH 085/183] [Custom threshold] [Alert details] Place annotation
in middle of bar in alerts history chart (#181299)
Closes https://github.com/elastic/kibana/issues/181300
Adjusted annotation time so that it is displayed in the middle of bar
instead of slightly after start of the bar
### Previous
### After change
---
.../components/alert_details_app_section/alert_history.tsx | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_history.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_history.tsx
index 0ce59163184b5..b75b489cd86db 100644
--- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_history.tsx
+++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_history.tsx
@@ -45,7 +45,7 @@ interface Props {
const dateRange = {
from: 'now-30d',
- to: 'now',
+ to: 'now+1d',
};
export function AlertHistoryChart({ rule, dataView, alert }: Props) {
@@ -102,7 +102,10 @@ export function AlertHistoryChart({ rule, dataView, alert }: Props) {
label: String(annotation.doc_count),
key: {
type: 'point_in_time',
- timestamp: moment(new Date(annotation.key_as_string!)).toISOString(),
+ timestamp: moment(new Date(annotation.key_as_string!))
+ .startOf('day')
+ .add(12, 'h')
+ .toISOString(),
},
lineWidth: 2,
color: euiTheme.colors.danger,
From 20694c01dca77883ef774ec0074eed499f8686ee Mon Sep 17 00:00:00 2001
From: Jonathan Budzenski
Date: Tue, 23 Apr 2024 12:32:36 -0500
Subject: [PATCH 086/183] Re-add 8.13 to versions.json
---
versions.json | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/versions.json b/versions.json
index 7407634eb82fe..1dbc0501e298c 100644
--- a/versions.json
+++ b/versions.json
@@ -13,6 +13,12 @@
"currentMajor": true,
"previousMinor": true
},
+ {
+ "version": "8.13.3",
+ "branch": "8.13",
+ "currentMajor": true,
+ "previousMinor": true
+ },
{
"version": "7.17.21",
"branch": "7.17",
From 5ffda28c0e7fb50477e58a95a87b78f8e45a1c53 Mon Sep 17 00:00:00 2001
From: Dominique Clarke
Date: Tue, 23 Apr 2024 13:35:33 -0400
Subject: [PATCH 087/183] [SLOs] support filters in grouped view on slo
overview list (#181360)
## Summary
Resolves https://github.com/elastic/kibana/issues/181311
Supports unified search filters when using the group by option on the
SLO overview page.
### Testing
1. Create a few SLOs
2. Group the SLOs by status
3. Create a unified search filter for `slo.name` that matches a single
SLO
4. Observe that the results are filtered appropriately
5. Negate that unified search filter
6. Observe that the results are filtered appropriately
---
.../slo/public/pages/slos/components/slo_list.tsx | 1 +
.../slo/server/services/find_slo_groups.ts | 1 +
2 files changed, 2 insertions(+)
diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.tsx
index a41143ab8cec9..64ebfe7a6a2d8 100644
--- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.tsx
+++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.tsx
@@ -124,6 +124,7 @@ export function SloList() {
kqlQuery={kqlQuery}
sort={state.sort.by}
direction={state.sort.direction}
+ filters={filters}
/>
)}
diff --git a/x-pack/plugins/observability_solution/slo/server/services/find_slo_groups.ts b/x-pack/plugins/observability_solution/slo/server/services/find_slo_groups.ts
index e3e1ce9db2381..c962c7ae926ea 100644
--- a/x-pack/plugins/observability_solution/slo/server/services/find_slo_groups.ts
+++ b/x-pack/plugins/observability_solution/slo/server/services/find_slo_groups.ts
@@ -73,6 +73,7 @@ export class FindSLOGroups {
getElasticsearchQueryOrThrow(kqlQuery),
...(parsedFilters.filter ?? []),
],
+ must_not: [...(parsedFilters.must_not ?? [])],
},
},
body: {
From 95717a4f63434d6b1fb58f2ba3d7a07ae8b73199 Mon Sep 17 00:00:00 2001
From: Trevor Pierce <1Copenut@users.noreply.github.com>
Date: Tue, 23 Apr 2024 14:03:42 -0500
Subject: [PATCH 088/183] [ES] Added height and virtualization to
ApiRequestFlyout (#180320)
Adds a feature to ApiRequestFlyout component so keyboard users can scroll API output.
---
.../view_api_request_flyout/view_api_request_flyout.tsx | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/plugins/es_ui_shared/public/components/view_api_request_flyout/view_api_request_flyout.tsx b/src/plugins/es_ui_shared/public/components/view_api_request_flyout/view_api_request_flyout.tsx
index c32fab974a811..12030f1c5ea31 100644
--- a/src/plugins/es_ui_shared/public/components/view_api_request_flyout/view_api_request_flyout.tsx
+++ b/src/plugins/es_ui_shared/public/components/view_api_request_flyout/view_api_request_flyout.tsx
@@ -111,7 +111,12 @@ export const ApiRequestFlyout: React.FunctionComponent
-
+
{request}
From d4047fe716ad946310d3327a95cac58dbb06c152 Mon Sep 17 00:00:00 2001
From: Melissa Alvarez
Date: Tue, 23 Apr 2024 13:28:03 -0600
Subject: [PATCH 089/183] [Embeddable rebuild] ML anomaly swim lane embeddable:
ensure dashboard reset works correctly (#181346)
## Summary
Fixes https://github.com/elastic/kibana/issues/181210
The reset functionality was not reverting the embeddable values. This PR
ensures the embeddable values are reset on dashboard reset.
Comparators require the `next` functionality to be wrapped in a function
in order to maintain `this` being defined.
The problem is that BehaviourSubjects are class instances, and if you
pass in the next method like `[someSubject$, someSubject$.next]` you
lose the this context.
NOTE: This needs the `8.14.1` label when it's available
### Checklist
Delete any items that are not applicable to this PR.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
---
.../anomaly_swimlane/initialize_swim_lane_controls.ts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_controls.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_controls.ts
index 218b937b25277..1301b29f80661 100644
--- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_controls.ts
+++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_controls.ts
@@ -60,10 +60,10 @@ export const initializeSwimLaneControls = (
};
const swimLaneComparators: StateComparators = {
- jobIds: [jobIds, jobIds.next, fastIsEqual],
- swimlaneType: [swimlaneType, swimlaneType.next],
- viewBy: [viewBy, viewBy.next],
- perPage: [perPage, perPage.next],
+ jobIds: [jobIds, (arg) => jobIds.next(arg), fastIsEqual],
+ swimlaneType: [swimlaneType, (arg) => swimlaneType.next(arg)],
+ viewBy: [viewBy, (arg) => viewBy.next(arg)],
+ perPage: [perPage, (arg) => perPage.next(arg)],
};
return {
From 37c57599439bd2114b4d45fb8e0b8c71f496ace0 Mon Sep 17 00:00:00 2001
From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Date: Tue, 23 Apr 2024 16:59:18 -0400
Subject: [PATCH 090/183] skip failing test suite (#181493)
---
.../apps/discover/ccs_compatibility/_timeout_results.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts b/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
index f8f81a44bdf8c..cf163ce7c1f7a 100644
--- a/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
+++ b/test/functional/apps/discover/ccs_compatibility/_timeout_results.ts
@@ -21,7 +21,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const esArchiver = getService('esArchiver');
const remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver');
- describe('discover search CCS timeout', () => {
+ // Failing: See https://github.com/elastic/kibana/issues/181493
+ describe.skip('discover search CCS timeout', () => {
before(async () => {
await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional');
await remoteEsArchiver.loadIfNeeded(
From 3142f1ab31fe24e74e5bd19a8e657dac6af3ef6c Mon Sep 17 00:00:00 2001
From: Nicolas Chaulet
Date: Tue, 23 Apr 2024 17:20:56 -0400
Subject: [PATCH 091/183] [Fleet] Filter globalsearch deeplink based on authz
(#181492)
---
x-pack/plugins/fleet/public/deep_links.ts | 105 ++++++++++++----------
x-pack/plugins/fleet/public/plugin.ts | 70 ++++++++-------
2 files changed, 97 insertions(+), 78 deletions(-)
diff --git a/x-pack/plugins/fleet/public/deep_links.ts b/x-pack/plugins/fleet/public/deep_links.ts
index 14e1df2b2f82c..9273bbb61e50e 100644
--- a/x-pack/plugins/fleet/public/deep_links.ts
+++ b/x-pack/plugins/fleet/public/deep_links.ts
@@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n';
import type { AppDeepLink } from '@kbn/core/public';
import type { ExperimentalFeatures } from '../common/experimental_features';
+import type { FleetAuthz } from '../common';
import { FLEET_ROUTING_PATHS } from './constants/page_paths';
@@ -21,51 +22,59 @@ export enum FleetDeepLinkId {
settings = 'settings',
}
-export const getFleetDeepLinks: (experimentalFeatures: ExperimentalFeatures) => AppDeepLink[] = (
- experimentalFeatures
-) => [
- {
- id: FleetDeepLinkId.agents,
- title: i18n.translate('xpack.fleet.deepLinks.agents.title', { defaultMessage: 'Agents' }),
- path: FLEET_ROUTING_PATHS.agents,
- },
- {
- id: FleetDeepLinkId.policies,
- title: i18n.translate('xpack.fleet.deepLinks.policies.title', {
- defaultMessage: 'Agent policies',
- }),
- path: FLEET_ROUTING_PATHS.policies,
- },
- {
- id: FleetDeepLinkId.enrollmentTokens,
- title: i18n.translate('xpack.fleet.deepLinks.enrollmentTokens.title', {
- defaultMessage: 'Enrollment tokens',
- }),
- path: FLEET_ROUTING_PATHS.enrollment_tokens,
- },
- ...(experimentalFeatures.agentTamperProtectionEnabled
- ? [
- {
- id: FleetDeepLinkId.uninstallTokens,
- title: i18n.translate('xpack.fleet.deepLinks.uninstallTokens.title', {
- defaultMessage: 'Uninstall tokens',
- }),
- path: FLEET_ROUTING_PATHS.uninstall_tokens,
- },
- ]
- : []),
- {
- id: FleetDeepLinkId.dataStreams,
- title: i18n.translate('xpack.fleet.deepLinks.dataStreams.title', {
- defaultMessage: 'Data streams',
- }),
- path: FLEET_ROUTING_PATHS.data_streams,
- },
- {
- id: FleetDeepLinkId.settings,
- title: i18n.translate('xpack.fleet.deepLinks.settings.title', {
- defaultMessage: 'Settings',
- }),
- path: FLEET_ROUTING_PATHS.settings,
- },
-];
+export const getFleetDeepLinks: (
+ experimentalFeatures: ExperimentalFeatures,
+ authz?: FleetAuthz
+) => AppDeepLink[] = (experimentalFeatures, authz) => {
+ return [
+ {
+ id: FleetDeepLinkId.agents,
+ title: i18n.translate('xpack.fleet.deepLinks.agents.title', { defaultMessage: 'Agents' }),
+ path: FLEET_ROUTING_PATHS.agents,
+ visibleIn: !authz?.fleet.readAgents ? [] : ['globalSearch'],
+ },
+ {
+ id: FleetDeepLinkId.policies,
+ title: i18n.translate('xpack.fleet.deepLinks.policies.title', {
+ defaultMessage: 'Agent policies',
+ }),
+ path: FLEET_ROUTING_PATHS.policies,
+ visibleIn: !authz?.fleet.readAgentPolicies ? [] : ['globalSearch'],
+ },
+ {
+ id: FleetDeepLinkId.enrollmentTokens,
+ title: i18n.translate('xpack.fleet.deepLinks.enrollmentTokens.title', {
+ defaultMessage: 'Enrollment tokens',
+ }),
+ path: FLEET_ROUTING_PATHS.enrollment_tokens,
+ visibleIn: !authz?.fleet.allAgents ? [] : ['globalSearch'],
+ },
+ ...((experimentalFeatures.agentTamperProtectionEnabled
+ ? [
+ {
+ id: FleetDeepLinkId.uninstallTokens,
+ title: i18n.translate('xpack.fleet.deepLinks.uninstallTokens.title', {
+ defaultMessage: 'Uninstall tokens',
+ }),
+ path: FLEET_ROUTING_PATHS.uninstall_tokens,
+ visibleIn: !authz?.fleet.allAgents ? [] : ['globalSearch'],
+ },
+ ]
+ : []) as AppDeepLink[]),
+ {
+ id: FleetDeepLinkId.dataStreams,
+ title: i18n.translate('xpack.fleet.deepLinks.dataStreams.title', {
+ defaultMessage: 'Data streams',
+ }),
+ path: FLEET_ROUTING_PATHS.data_streams,
+ },
+ {
+ id: FleetDeepLinkId.settings,
+ title: i18n.translate('xpack.fleet.deepLinks.settings.title', {
+ defaultMessage: 'Settings',
+ }),
+ path: FLEET_ROUTING_PATHS.settings,
+ visibleIn: !authz?.fleet.readSettings ? [] : ['globalSearch'],
+ },
+ ];
+};
diff --git a/x-pack/plugins/fleet/public/plugin.ts b/x-pack/plugins/fleet/public/plugin.ts
index e8f36ffed3af4..3a22a8bc5b5a9 100644
--- a/x-pack/plugins/fleet/public/plugin.ts
+++ b/x-pack/plugins/fleet/public/plugin.ts
@@ -8,6 +8,7 @@
import React from 'react';
import type {
AppMountParameters,
+ AppUpdater,
CoreSetup,
CoreStart,
Plugin,
@@ -84,6 +85,7 @@ import type {
import { LazyCustomLogsAssetsExtension } from './lazy_custom_logs_assets_extension';
import { setCustomIntegrations, setCustomIntegrationsStart } from './services/custom_integrations';
import { getFleetDeepLinks } from './deep_links';
+import { Subject } from 'rxjs';
export type { FleetConfigType } from '../common/types';
@@ -149,6 +151,7 @@ export class FleetPlugin implements Plugin();
constructor(private readonly initializerContext: PluginInitializerContext) {
this.config = this.initializerContext.config.get();
@@ -220,6 +223,7 @@ export class FleetPlugin implements Plugin {
const [coreStartServices, startDepsServices, fleetStart] = await core.getStartServices();
@@ -236,7 +240,6 @@ export class FleetPlugin implements Plugin {
unmount();
teardownFleet(startServices);
@@ -302,46 +305,53 @@ export class FleetPlugin implements Plugin ({
+ deepLinks: getFleetDeepLinks(this.experimentalFeatures, authz),
+ }));
+
registerExtension({
package: CUSTOM_LOGS_INTEGRATION_NAME,
view: 'package-detail-assets',
Component: LazyCustomLogsAssetsExtension,
});
- const { capabilities } = core.application;
// Set the custom integrations language clients
setCustomIntegrationsStart(deps.customIntegrations);
// capabilities.fleetv2 returns fleet privileges and capabilities.fleet returns integrations privileges
return {
- authz: {
- ...calculateAuthz({
- fleet: {
- all: capabilities.fleetv2.all as boolean,
- setup: false,
- agents: {
- read: capabilities.fleetv2.agents_read as boolean,
- all: capabilities.fleetv2.agents_all as boolean,
- },
- agentPolicies: {
- read: capabilities.fleetv2.agent_policies_read as boolean,
- all: capabilities.fleetv2.agent_policies_all as boolean,
- },
- settings: {
- read: capabilities.fleetv2.settings_read as boolean,
- all: capabilities.fleetv2.settings_all as boolean,
- },
- },
- integrations: {
- all: capabilities.fleet.all as boolean,
- read: capabilities.fleet.read as boolean,
- },
- subfeatureEnabled: this.experimentalFeatures.subfeaturePrivileges ?? false,
- }),
- packagePrivileges: calculatePackagePrivilegesFromCapabilities(capabilities),
- endpointExceptionsPrivileges:
- calculateEndpointExceptionsPrivilegesFromCapabilities(capabilities),
- },
+ authz,
isInitialized: once(async () => {
const permissionsResponse = await getPermissions();
From 8dcaefcebc49a80c84dad97447428a96e8bb78fe Mon Sep 17 00:00:00 2001
From: Andrew Macri
Date: Tue, 23 Apr 2024 18:19:16 -0400
Subject: [PATCH 092/183] [Security Solution] [AI Insights] Remove secondary
loading placeholder (#181486)
## [Security Solution] [AI Insights] Remove secondary loading placeholder
### Summary
This PR removes the secondary loading placeholder, per the _before_ and _after_ screenshots below:
#### Before
![before](https://github.com/elastic/kibana/assets/4459398/f9e5a61f-16c8-49e9-aba5-ff5f75ca6bd5)
#### After
![after](https://github.com/elastic/kibana/assets/4459398/22ca8d3b-9b28-473c-aace-d4fcb59d168c)
### Feature flag
The `assistantAlertsInsights` feature flag must be enabled to access this feature:
```
xpack.securitySolution.enableExperimental: ['assistantAlertsInsights']
```
---
.../insight/loading_placeholder/index.tsx | 42 -------------------
.../public/ai_insights/pages/index.tsx | 15 +++----
2 files changed, 5 insertions(+), 52 deletions(-)
delete mode 100644 x-pack/plugins/security_solution/public/ai_insights/insight/loading_placeholder/index.tsx
diff --git a/x-pack/plugins/security_solution/public/ai_insights/insight/loading_placeholder/index.tsx b/x-pack/plugins/security_solution/public/ai_insights/insight/loading_placeholder/index.tsx
deleted file mode 100644
index be39e9229a67e..0000000000000
--- a/x-pack/plugins/security_solution/public/ai_insights/insight/loading_placeholder/index.tsx
+++ /dev/null
@@ -1,42 +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 { css } from '@emotion/react';
-import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, EuiSkeletonTitle } from '@elastic/eui';
-import React from 'react';
-
-import { ActionsPlaceholder } from '../actions/actions_placeholder';
-import { Title } from '../title';
-
-const LoadingPlaceholderComponent: React.FC = () => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-LoadingPlaceholderComponent.displayName = 'LoadingPlaceholder';
-
-export const LoadingPlaceholder = React.memo(LoadingPlaceholderComponent);
diff --git a/x-pack/plugins/security_solution/public/ai_insights/pages/index.tsx b/x-pack/plugins/security_solution/public/ai_insights/pages/index.tsx
index 57268041ebb4d..71b7998099837 100644
--- a/x-pack/plugins/security_solution/public/ai_insights/pages/index.tsx
+++ b/x-pack/plugins/security_solution/public/ai_insights/pages/index.tsx
@@ -31,7 +31,6 @@ import {
showSummary,
} from './helpers';
import { Insight } from '../insight';
-import { LoadingPlaceholder } from '../insight/loading_placeholder';
import { LoadingCallout } from './loading_callout';
import { PageTitle } from './page_title';
import { Summary } from './summary';
@@ -191,15 +190,11 @@ const AiInsightsComponent: React.FC = () => {
isLoading,
loadingConnectorId,
}) ? (
- <>
-
-
-
- >
+
) : (
selectedConnectorInsights.map((insight, i) => (
From ebc3fdc1fe9d86577ac116883c0d13526ba198f1 Mon Sep 17 00:00:00 2001
From: Steph Milovic
Date: Tue, 23 Apr 2024 16:35:43 -0600
Subject: [PATCH 093/183] [Security solution] Fix
`OpenAndAcknowledgedAlertsTool` for Haiku (#181485)
---
.../open_and_acknowledged_alerts_tool.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts
index 42262970fb8f6..f77d920978756 100644
--- a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts
+++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts
@@ -22,7 +22,7 @@ export interface OpenAndAcknowledgedAlertsToolParams extends AssistantToolParams
}
export const OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION =
- 'Call this for knowledge about the latest n open and acknowledged alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts';
+ 'Call this for knowledge about the latest n open and acknowledged alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts. Input should be a string.';
/**
* Returns a tool for querying open and acknowledged alerts, or null if the
From 70c574dd6d61f361c763c3315a4caa4a6a99ce54 Mon Sep 17 00:00:00 2001
From: Kevin Delemme
Date: Tue, 23 Apr 2024 20:34:03 -0400
Subject: [PATCH 094/183] fix(slo tests): attempt to fix flakyness (#181439)
---
.../test_suites/observability/slos/delete_slo.ts | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts
index c56b8255b4111..d605e57d997ef 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts
@@ -47,8 +47,8 @@ export default function ({ getService }: FtrProviderContext) {
return {};
}
};
- // Failing: See https://github.com/elastic/kibana/issues/180982
- describe.skip('delete_slo', () => {
+
+ describe('delete_slo', () => {
// DATE_VIEW should match the index template:
// x-pack/packages/kbn-infra-forge/src/data_sources/composable/template.json
const DATE_VIEW = 'kbn-data-forge-fake_hosts';
@@ -136,6 +136,7 @@ export default function ({ getService }: FtrProviderContext) {
indexName: SLO_SUMMARY_DESTINATION_INDEX_PATTERN,
});
+ const numberOfRollupDocumentsBeforeDeletion = sloRollupData.hits.hits.length;
expect(sloRollupData.hits.hits.length > 0).to.be(true);
expect(sloSummaryData.hits.hits.length > 0).to.be(true);
@@ -169,7 +170,9 @@ export default function ({ getService }: FtrProviderContext) {
sloId,
indexName: SLO_DESTINATION_INDEX_PATTERN,
});
- if (sloRollupDataAfterDeletion.hits.hits.length > 0) {
+ if (
+ sloRollupDataAfterDeletion.hits.hits.length >= numberOfRollupDocumentsBeforeDeletion
+ ) {
throw new Error('SLO rollup data not deleted yet');
}
return true;
From 15e55986dd3cdfc7016737242cdd87e172335e6c Mon Sep 17 00:00:00 2001
From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com>
Date: Wed, 24 Apr 2024 04:07:11 +0200
Subject: [PATCH 095/183] [Reporting] Limit report document chunk size to 4MB
(#181395)
## Summary
Closes https://github.com/elastic/kibana/issues/180829
### Checklist
Delete any items that are not applicable to this PR.
- [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
### For maintainers
- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../server/lib/content_stream.test.ts | 8 +--
.../reporting/server/lib/content_stream.ts | 63 ++++---------------
2 files changed, 13 insertions(+), 58 deletions(-)
diff --git a/x-pack/plugins/reporting/server/lib/content_stream.test.ts b/x-pack/plugins/reporting/server/lib/content_stream.test.ts
index 288d528c722bf..d4f179c5c9359 100644
--- a/x-pack/plugins/reporting/server/lib/content_stream.test.ts
+++ b/x-pack/plugins/reporting/server/lib/content_stream.test.ts
@@ -280,9 +280,7 @@ describe('ContentStream', () => {
});
it('should split raw data into chunks', async () => {
- client.cluster.getSettings.mockResponseOnce(
- set({}, 'defaults.http.max_content_length', 1028)
- );
+ stream.chunkSize = 2;
stream.end('123456');
await new Promise((resolve) => stream.once('finish', resolve));
@@ -322,9 +320,7 @@ describe('ContentStream', () => {
});
it('should encode every chunk separately', async () => {
- client.cluster.getSettings.mockResponseOnce(
- set({}, 'defaults.http.max_content_length', 1028)
- );
+ base64Stream.chunkSize = 3;
base64Stream.end('12345678');
await new Promise((resolve) => base64Stream.once('finish', resolve));
diff --git a/x-pack/plugins/reporting/server/lib/content_stream.ts b/x-pack/plugins/reporting/server/lib/content_stream.ts
index 0be61705d84b5..17362516d2c9d 100644
--- a/x-pack/plugins/reporting/server/lib/content_stream.ts
+++ b/x-pack/plugins/reporting/server/lib/content_stream.ts
@@ -5,22 +5,15 @@
* 2.0.
*/
-import { defaults, get } from 'lodash';
import { Duplex } from 'stream';
import { v4 as uuidv4 } from 'uuid';
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-import { ByteSizeValue } from '@kbn/config-schema';
import type { ElasticsearchClient, Logger } from '@kbn/core/server';
import type { ReportSource } from '@kbn/reporting-common/types';
import type { ReportingCore } from '..';
-/**
- * @note The Elasticsearch `http.max_content_length` is including the whole POST body.
- * But the update/index request also contains JSON-serialized query parameters.
- * 1Kb span should be enough for that.
- */
-const REQUEST_SPAN_SIZE_IN_BYTES = 1024;
+const ONE_MB = 1024 * 1024;
type Callback = (error?: Error) => void;
type SearchRequest = estypes.SearchRequest;
@@ -52,21 +45,6 @@ interface ContentStreamParameters {
}
export class ContentStream extends Duplex {
- /**
- * @see https://en.wikipedia.org/wiki/Base64#Output_padding
- */
- private static getMaxBase64EncodedSize(max: number) {
- return Math.floor(max / 4) * 3;
- }
-
- /**
- * @note Raw data might be escaped during JSON serialization.
- * In the worst-case, every character is escaped, so the max raw data length is twice less.
- */
- private static getMaxJsonEscapedSize(max: number) {
- return Math.floor(max / 2);
- }
-
private buffers: Buffer[] = [];
private bytesBuffered = 0;
@@ -74,7 +52,6 @@ export class ContentStream extends Duplex {
private chunksRead = 0;
private chunksWritten = 0;
private jobSize?: number;
- private maxChunkSize?: number;
private parameters: Required;
private primaryTerm?: number;
private seqNo?: number;
@@ -85,6 +62,14 @@ export class ContentStream extends Duplex {
*/
bytesWritten = 0;
+ /**
+ * The chunking size of reporting files. Larger CSV files will be split into
+ * multiple documents, where the stream is chunked into pieces of approximately
+ * this size. The actual document size will be slightly larger due to Base64
+ * encoding and JSON metadata.
+ */
+ chunkSize = 4 * ONE_MB;
+
constructor(
private client: ElasticsearchClient,
private logger: Logger,
@@ -103,30 +88,6 @@ export class ContentStream extends Duplex {
return buffer.toString(this.parameters.encoding === 'base64' ? 'base64' : undefined);
}
- private async getMaxContentSize() {
- const body = await this.client.cluster.getSettings({ include_defaults: true });
- const { persistent, transient, defaults: defaultSettings } = body;
- const settings = defaults({}, persistent, transient, defaultSettings);
- const maxContentSize = get(settings, 'http.max_content_length', '100mb');
-
- return ByteSizeValue.parse(maxContentSize).getValueInBytes();
- }
-
- private async getMaxChunkSize() {
- if (!this.maxChunkSize) {
- const maxContentSize = (await this.getMaxContentSize()) - REQUEST_SPAN_SIZE_IN_BYTES;
-
- this.maxChunkSize =
- this.parameters.encoding === 'base64'
- ? ContentStream.getMaxBase64EncodedSize(maxContentSize)
- : ContentStream.getMaxJsonEscapedSize(maxContentSize);
-
- this.logger.debug(`Chunk size is ${this.maxChunkSize} bytes.`);
- }
-
- return this.maxChunkSize;
- }
-
private async readHead() {
const { id, index } = this.document;
const body: SearchRequest['body'] = {
@@ -306,10 +267,8 @@ export class ContentStream extends Duplex {
}
private async flushAllFullChunks() {
- const maxChunkSize = await this.getMaxChunkSize();
-
- while (this.bytesBuffered >= maxChunkSize && this.buffers.length) {
- await this.flush(maxChunkSize);
+ while (this.bytesBuffered >= this.chunkSize && this.buffers.length) {
+ await this.flush(this.chunkSize);
}
}
From bdac77d3203cc41a89074b32de689050b559da0b Mon Sep 17 00:00:00 2001
From: Julia Rechkunova
Date: Wed, 24 Apr 2024 08:36:45 +0200
Subject: [PATCH 096/183] [Discover] Fix time range filters for CSV when a
relative time filter is specified in UI (#181067)
- Closes https://github.com/elastic/kibana/issues/181061
## Summary
`searchSource` got polluted during UI rendering and then it was used for
CSV generation again. It resulted in the redundant relative time range
filter next to the absolute time range filter. Now only absolute time
range filter will be present.
### Checklist
- [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
---
.../public/utils/get_sharing_data.test.ts | 109 +++++++++++++++++-
.../discover/public/utils/get_sharing_data.ts | 14 ++-
2 files changed, 113 insertions(+), 10 deletions(-)
diff --git a/src/plugins/discover/public/utils/get_sharing_data.test.ts b/src/plugins/discover/public/utils/get_sharing_data.test.ts
index a0c7581fd9419..473c31ff09453 100644
--- a/src/plugins/discover/public/utils/get_sharing_data.test.ts
+++ b/src/plugins/discover/public/utils/get_sharing_data.test.ts
@@ -7,9 +7,9 @@
*/
import { Capabilities, IUiSettingsClient } from '@kbn/core/public';
+import { FilterStateStore, RangeFilter } from '@kbn/es-query';
import type { DataView } from '@kbn/data-views-plugin/public';
import type { DiscoverServices } from '../build_services';
-import { dataPluginMock } from '@kbn/data-plugin/public/mocks';
import { createSearchSourceMock } from '@kbn/data-plugin/common/search/search_source/mocks';
import {
DOC_HIDE_TIME_COLUMN_SETTING,
@@ -17,14 +17,16 @@ import {
SEARCH_FIELDS_FROM_SOURCE,
} from '@kbn/discover-utils';
import { buildDataViewMock, dataViewMock } from '@kbn/discover-utils/src/__mocks__';
+import { createDiscoverServicesMock } from '../__mocks__/services';
import { getSharingData, showPublicUrlSwitch } from './get_sharing_data';
describe('getSharingData', () => {
let services: DiscoverServices;
beforeEach(() => {
+ const discoverServiceMock = createDiscoverServicesMock();
services = {
- data: dataPluginMock.createStartContract(),
+ ...discoverServiceMock,
uiSettings: {
get: (key: string) => {
if (key === SEARCH_FIELDS_FROM_SOURCE) {
@@ -38,8 +40,8 @@ describe('getSharingData', () => {
}
return false;
},
- },
- } as DiscoverServices;
+ } as IUiSettingsClient,
+ };
});
test('returns valid data for sharing', async () => {
@@ -303,6 +305,105 @@ describe('getSharingData', () => {
}
`);
});
+
+ test('getSearchSource works correctly', async () => {
+ const searchSourceMock = createSearchSourceMock({ index: dataViewMock });
+ const appFilter = {
+ $state: {
+ store: FilterStateStore.APP_STATE,
+ },
+ meta: {
+ alias: null,
+ disabled: false,
+ index: dataViewMock.id,
+ key: 'extension.keyword',
+ negate: false,
+ params: {
+ query: 'zip',
+ },
+ type: 'phrase',
+ },
+ query: {
+ match_phrase: {
+ 'extension.keyword': 'zip',
+ },
+ },
+ };
+ const absoluteTimeFilter = {
+ meta: {
+ index: dataViewMock.id,
+ params: {},
+ field: 'timestamp',
+ type: 'range',
+ },
+ query: {
+ range: {
+ timestamp: {
+ format: 'strict_date_optional_time',
+ gte: '2024-04-18T12:07:56.713Z',
+ lte: '2024-04-18T12:22:56.713Z',
+ },
+ },
+ },
+ } as RangeFilter;
+ const relativeTimeFilter = {
+ meta: {
+ index: dataViewMock.id,
+ params: {},
+ field: 'timestamp',
+ type: 'range',
+ },
+ query: {
+ range: {
+ timestamp: {
+ format: 'strict_date_optional_time',
+ gte: 'now-15m',
+ lte: 'now',
+ },
+ },
+ },
+ } as RangeFilter;
+ searchSourceMock.setField('filter', [appFilter]);
+ const servicesMock = createDiscoverServicesMock();
+ servicesMock.data.query.timefilter.timefilter.createFilter = jest.fn(() => absoluteTimeFilter);
+ servicesMock.data.query.timefilter.timefilter.createRelativeFilter = jest.fn(
+ () => relativeTimeFilter
+ );
+
+ // with app filters as an array
+ const result = await getSharingData(
+ searchSourceMock,
+ {
+ columns: ['cool-field-1'],
+ },
+ servicesMock
+ );
+ expect(
+ result.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: false }).filter
+ ).toEqual([relativeTimeFilter, appFilter]);
+ expect(
+ result.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: true }).filter
+ ).toEqual([absoluteTimeFilter, appFilter]);
+ expect(
+ result.getSearchSource({ addGlobalTimeFilter: false, absoluteTime: false }).filter
+ ).toEqual([appFilter]);
+ expect(
+ result.getSearchSource({ addGlobalTimeFilter: false, absoluteTime: true }).filter
+ ).toEqual([appFilter]);
+
+ // with app filter as a single filter and the same as the absolute time filter
+ searchSourceMock.setField('filter', absoluteTimeFilter);
+ const result2 = await getSharingData(
+ searchSourceMock,
+ {
+ columns: ['cool-field-1'],
+ },
+ servicesMock
+ );
+ expect(
+ result2.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: true }).filter
+ ).toEqual([absoluteTimeFilter]);
+ });
});
describe('showPublicUrlSwitch', () => {
diff --git a/src/plugins/discover/public/utils/get_sharing_data.ts b/src/plugins/discover/public/utils/get_sharing_data.ts
index 9e3b2b2369469..9387053698017 100644
--- a/src/plugins/discover/public/utils/get_sharing_data.ts
+++ b/src/plugins/discover/public/utils/get_sharing_data.ts
@@ -39,7 +39,6 @@ export async function getSharingData(
const { uiSettings, data } = services;
const searchSource = currentSearchSource.createCopy();
const index = searchSource.getField('index')!;
- let existingFilter = searchSource.getField('filter') as Filter[] | Filter | undefined;
searchSource.setField(
'sort',
@@ -50,7 +49,6 @@ export async function getSharingData(
})
);
- searchSource.removeField('filter');
searchSource.removeField('highlight');
searchSource.removeField('highlightAll');
searchSource.removeField('aggs');
@@ -81,6 +79,10 @@ export async function getSharingData(
addGlobalTimeFilter?: boolean;
absoluteTime?: boolean;
}): SerializedSearchSourceFields => {
+ let existingFilter = searchSource.getField('filter') as Filter[] | Filter | undefined;
+ const searchSourceUpdated = searchSource.createCopy();
+ searchSourceUpdated.removeField('filter');
+
const timeFilter = absoluteTime ? absoluteTimeFilter : relativeTimeFilter;
if (addGlobalTimeFilter && timeFilter) {
// remove timeFilter from existing filter
@@ -102,7 +104,7 @@ export async function getSharingData(
}
if (existingFilter) {
- searchSource.setField('filter', existingFilter);
+ searchSourceUpdated.setField('filter', existingFilter);
}
/*
@@ -112,7 +114,7 @@ export async function getSharingData(
*/
const useFieldsApi = !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE);
if (useFieldsApi) {
- searchSource.removeField('fieldsFromSource');
+ searchSourceUpdated.removeField('fieldsFromSource');
const fields = columns.length
? columns.map((column) => {
let field = column;
@@ -127,9 +129,9 @@ export async function getSharingData(
})
: [{ field: '*', include_unmapped: 'true' }];
- searchSource.setField('fields', fields);
+ searchSourceUpdated.setField('fields', fields);
}
- return searchSource.getSerializedFields(true);
+ return searchSourceUpdated.getSerializedFields(true);
},
columns,
};
From 773626f67730e2167f69f9f8c6d2c60d9b834669 Mon Sep 17 00:00:00 2001
From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Date: Wed, 24 Apr 2024 03:20:56 -0400
Subject: [PATCH 097/183] [api-docs] 2024-04-24 Daily api_docs build (#181516)
Generated by
https://buildkite.com/elastic/kibana-api-docs-daily/builds/683
---
api_docs/actions.devdocs.json | 90 ++++++--
api_docs/actions.mdx | 4 +-
api_docs/advanced_settings.mdx | 2 +-
.../ai_assistant_management_selection.mdx | 2 +-
api_docs/aiops.mdx | 2 +-
api_docs/alerting.mdx | 2 +-
api_docs/apm.devdocs.json | 26 ++-
api_docs/apm.mdx | 2 +-
api_docs/apm_data_access.mdx | 2 +-
api_docs/asset_manager.mdx | 2 +-
api_docs/banners.mdx | 2 +-
api_docs/bfetch.mdx | 2 +-
api_docs/canvas.mdx | 2 +-
api_docs/cases.mdx | 2 +-
api_docs/charts.mdx | 2 +-
api_docs/cloud.mdx | 2 +-
api_docs/cloud_data_migration.mdx | 2 +-
api_docs/cloud_defend.mdx | 2 +-
api_docs/cloud_experiments.mdx | 2 +-
api_docs/cloud_security_posture.mdx | 2 +-
api_docs/console.mdx | 2 +-
api_docs/content_management.mdx | 2 +-
api_docs/controls.mdx | 2 +-
api_docs/custom_integrations.mdx | 2 +-
api_docs/dashboard.devdocs.json | 3 +-
api_docs/dashboard.mdx | 2 +-
api_docs/dashboard_enhanced.mdx | 2 +-
api_docs/data.mdx | 2 +-
api_docs/data_query.mdx | 2 +-
api_docs/data_search.mdx | 2 +-
api_docs/data_view_editor.mdx | 2 +-
api_docs/data_view_field_editor.mdx | 2 +-
api_docs/data_view_management.mdx | 2 +-
api_docs/data_views.mdx | 2 +-
api_docs/data_visualizer.mdx | 2 +-
api_docs/dataset_quality.mdx | 2 +-
api_docs/deprecations_by_api.mdx | 2 +-
api_docs/deprecations_by_plugin.mdx | 2 +-
api_docs/deprecations_by_team.mdx | 2 +-
api_docs/dev_tools.mdx | 2 +-
api_docs/discover.devdocs.json | 212 ------------------
api_docs/discover.mdx | 4 +-
api_docs/discover_enhanced.mdx | 2 +-
api_docs/ecs_data_quality_dashboard.mdx | 2 +-
api_docs/elastic_assistant.mdx | 2 +-
api_docs/embeddable.mdx | 2 +-
api_docs/embeddable_enhanced.mdx | 2 +-
api_docs/encrypted_saved_objects.mdx | 2 +-
api_docs/enterprise_search.mdx | 2 +-
api_docs/es_ui_shared.mdx | 2 +-
api_docs/event_annotation.mdx | 2 +-
api_docs/event_annotation_listing.mdx | 2 +-
api_docs/event_log.mdx | 2 +-
api_docs/exploratory_view.mdx | 2 +-
api_docs/expression_error.mdx | 2 +-
api_docs/expression_gauge.mdx | 2 +-
api_docs/expression_heatmap.mdx | 2 +-
api_docs/expression_image.mdx | 2 +-
api_docs/expression_legacy_metric_vis.mdx | 2 +-
api_docs/expression_metric.mdx | 2 +-
api_docs/expression_metric_vis.mdx | 2 +-
api_docs/expression_partition_vis.mdx | 2 +-
api_docs/expression_repeat_image.mdx | 2 +-
api_docs/expression_reveal_image.mdx | 2 +-
api_docs/expression_shape.mdx | 2 +-
api_docs/expression_tagcloud.mdx | 2 +-
api_docs/expression_x_y.mdx | 2 +-
api_docs/expressions.mdx | 2 +-
api_docs/features.mdx | 2 +-
api_docs/field_formats.mdx | 2 +-
api_docs/file_upload.mdx | 2 +-
api_docs/files.mdx | 2 +-
api_docs/files_management.mdx | 2 +-
api_docs/fleet.mdx | 2 +-
api_docs/global_search.mdx | 2 +-
api_docs/guided_onboarding.mdx | 2 +-
api_docs/home.mdx | 2 +-
api_docs/image_embeddable.mdx | 2 +-
api_docs/index_lifecycle_management.mdx | 2 +-
api_docs/index_management.mdx | 2 +-
api_docs/infra.mdx | 2 +-
api_docs/ingest_pipelines.mdx | 2 +-
api_docs/inspector.mdx | 2 +-
api_docs/interactive_setup.mdx | 2 +-
api_docs/kbn_ace.mdx | 2 +-
api_docs/kbn_actions_types.mdx | 2 +-
api_docs/kbn_aiops_components.mdx | 2 +-
api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +-
api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +-
.../kbn_alerting_api_integration_helpers.mdx | 2 +-
api_docs/kbn_alerting_state_types.mdx | 2 +-
api_docs/kbn_alerting_types.mdx | 2 +-
api_docs/kbn_alerts_as_data_utils.mdx | 2 +-
api_docs/kbn_alerts_ui_shared.mdx | 2 +-
api_docs/kbn_analytics.mdx | 2 +-
api_docs/kbn_analytics_client.mdx | 2 +-
api_docs/kbn_analytics_collection_utils.mdx | 2 +-
..._analytics_shippers_elastic_v3_browser.mdx | 2 +-
...n_analytics_shippers_elastic_v3_common.mdx | 2 +-
...n_analytics_shippers_elastic_v3_server.mdx | 2 +-
api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +-
api_docs/kbn_apm_config_loader.mdx | 2 +-
api_docs/kbn_apm_data_view.mdx | 2 +-
api_docs/kbn_apm_synthtrace.mdx | 2 +-
api_docs/kbn_apm_synthtrace_client.mdx | 2 +-
api_docs/kbn_apm_utils.mdx | 2 +-
api_docs/kbn_axe_config.mdx | 2 +-
api_docs/kbn_bfetch_error.mdx | 2 +-
api_docs/kbn_calculate_auto.mdx | 2 +-
.../kbn_calculate_width_from_char_count.mdx | 2 +-
api_docs/kbn_cases_components.mdx | 2 +-
api_docs/kbn_cell_actions.mdx | 2 +-
api_docs/kbn_chart_expressions_common.mdx | 2 +-
api_docs/kbn_chart_icons.mdx | 2 +-
api_docs/kbn_ci_stats_core.mdx | 2 +-
api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +-
api_docs/kbn_ci_stats_reporter.mdx | 2 +-
api_docs/kbn_cli_dev_mode.mdx | 2 +-
api_docs/kbn_code_editor.mdx | 2 +-
api_docs/kbn_code_editor_mock.mdx | 2 +-
api_docs/kbn_code_owners.mdx | 2 +-
api_docs/kbn_coloring.mdx | 2 +-
api_docs/kbn_config.mdx | 2 +-
api_docs/kbn_config_mocks.mdx | 2 +-
api_docs/kbn_config_schema.mdx | 2 +-
.../kbn_content_management_content_editor.mdx | 2 +-
...tent_management_tabbed_table_list_view.mdx | 2 +-
...kbn_content_management_table_list_view.mdx | 2 +-
...tent_management_table_list_view_common.mdx | 2 +-
...ntent_management_table_list_view_table.mdx | 2 +-
api_docs/kbn_content_management_utils.mdx | 2 +-
api_docs/kbn_core_analytics_browser.mdx | 2 +-
.../kbn_core_analytics_browser_internal.mdx | 2 +-
api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +-
api_docs/kbn_core_analytics_server.mdx | 2 +-
.../kbn_core_analytics_server_internal.mdx | 2 +-
api_docs/kbn_core_analytics_server_mocks.mdx | 2 +-
api_docs/kbn_core_application_browser.mdx | 2 +-
.../kbn_core_application_browser_internal.mdx | 2 +-
.../kbn_core_application_browser_mocks.mdx | 2 +-
api_docs/kbn_core_application_common.mdx | 2 +-
api_docs/kbn_core_apps_browser_internal.mdx | 2 +-
api_docs/kbn_core_apps_browser_mocks.mdx | 2 +-
api_docs/kbn_core_apps_server_internal.mdx | 2 +-
api_docs/kbn_core_base_browser_mocks.mdx | 2 +-
api_docs/kbn_core_base_common.mdx | 2 +-
api_docs/kbn_core_base_server_internal.mdx | 2 +-
api_docs/kbn_core_base_server_mocks.mdx | 2 +-
.../kbn_core_capabilities_browser_mocks.mdx | 2 +-
api_docs/kbn_core_capabilities_common.mdx | 2 +-
api_docs/kbn_core_capabilities_server.mdx | 2 +-
.../kbn_core_capabilities_server_mocks.mdx | 2 +-
api_docs/kbn_core_chrome_browser.mdx | 2 +-
api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +-
api_docs/kbn_core_config_server_internal.mdx | 2 +-
api_docs/kbn_core_custom_branding_browser.mdx | 2 +-
..._core_custom_branding_browser_internal.mdx | 2 +-
...kbn_core_custom_branding_browser_mocks.mdx | 2 +-
api_docs/kbn_core_custom_branding_common.mdx | 2 +-
api_docs/kbn_core_custom_branding_server.mdx | 2 +-
...n_core_custom_branding_server_internal.mdx | 2 +-
.../kbn_core_custom_branding_server_mocks.mdx | 2 +-
api_docs/kbn_core_deprecations_browser.mdx | 2 +-
...kbn_core_deprecations_browser_internal.mdx | 2 +-
.../kbn_core_deprecations_browser_mocks.mdx | 2 +-
api_docs/kbn_core_deprecations_common.mdx | 2 +-
api_docs/kbn_core_deprecations_server.mdx | 2 +-
.../kbn_core_deprecations_server_internal.mdx | 2 +-
.../kbn_core_deprecations_server_mocks.mdx | 2 +-
api_docs/kbn_core_doc_links_browser.mdx | 2 +-
api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +-
api_docs/kbn_core_doc_links_server.mdx | 2 +-
api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +-
...e_elasticsearch_client_server_internal.mdx | 2 +-
...core_elasticsearch_client_server_mocks.mdx | 2 +-
api_docs/kbn_core_elasticsearch_server.mdx | 2 +-
...kbn_core_elasticsearch_server_internal.mdx | 2 +-
.../kbn_core_elasticsearch_server_mocks.mdx | 2 +-
.../kbn_core_environment_server_internal.mdx | 2 +-
.../kbn_core_environment_server_mocks.mdx | 2 +-
.../kbn_core_execution_context_browser.mdx | 2 +-
...ore_execution_context_browser_internal.mdx | 2 +-
...n_core_execution_context_browser_mocks.mdx | 2 +-
.../kbn_core_execution_context_common.mdx | 2 +-
.../kbn_core_execution_context_server.mdx | 2 +-
...core_execution_context_server_internal.mdx | 2 +-
...bn_core_execution_context_server_mocks.mdx | 2 +-
api_docs/kbn_core_fatal_errors_browser.mdx | 2 +-
.../kbn_core_fatal_errors_browser_mocks.mdx | 2 +-
api_docs/kbn_core_http_browser.mdx | 2 +-
api_docs/kbn_core_http_browser_internal.mdx | 2 +-
api_docs/kbn_core_http_browser_mocks.mdx | 2 +-
api_docs/kbn_core_http_common.mdx | 2 +-
.../kbn_core_http_context_server_mocks.mdx | 2 +-
...re_http_request_handler_context_server.mdx | 2 +-
api_docs/kbn_core_http_resources_server.mdx | 2 +-
...bn_core_http_resources_server_internal.mdx | 2 +-
.../kbn_core_http_resources_server_mocks.mdx | 2 +-
.../kbn_core_http_router_server_internal.mdx | 2 +-
.../kbn_core_http_router_server_mocks.mdx | 2 +-
api_docs/kbn_core_http_server.mdx | 2 +-
api_docs/kbn_core_http_server_internal.mdx | 2 +-
api_docs/kbn_core_http_server_mocks.mdx | 2 +-
api_docs/kbn_core_i18n_browser.mdx | 2 +-
api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +-
api_docs/kbn_core_i18n_server.mdx | 2 +-
api_docs/kbn_core_i18n_server_internal.mdx | 2 +-
api_docs/kbn_core_i18n_server_mocks.mdx | 2 +-
...n_core_injected_metadata_browser_mocks.mdx | 2 +-
...kbn_core_integrations_browser_internal.mdx | 2 +-
.../kbn_core_integrations_browser_mocks.mdx | 2 +-
api_docs/kbn_core_lifecycle_browser.mdx | 2 +-
api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +-
api_docs/kbn_core_lifecycle_server.mdx | 2 +-
api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +-
api_docs/kbn_core_logging_browser_mocks.mdx | 2 +-
api_docs/kbn_core_logging_common_internal.mdx | 2 +-
api_docs/kbn_core_logging_server.mdx | 2 +-
api_docs/kbn_core_logging_server_internal.mdx | 2 +-
api_docs/kbn_core_logging_server_mocks.mdx | 2 +-
...ore_metrics_collectors_server_internal.mdx | 2 +-
...n_core_metrics_collectors_server_mocks.mdx | 2 +-
api_docs/kbn_core_metrics_server.mdx | 2 +-
api_docs/kbn_core_metrics_server_internal.mdx | 2 +-
api_docs/kbn_core_metrics_server_mocks.mdx | 2 +-
api_docs/kbn_core_mount_utils_browser.mdx | 2 +-
api_docs/kbn_core_node_server.mdx | 2 +-
api_docs/kbn_core_node_server_internal.mdx | 2 +-
api_docs/kbn_core_node_server_mocks.mdx | 2 +-
api_docs/kbn_core_notifications_browser.mdx | 2 +-
...bn_core_notifications_browser_internal.mdx | 2 +-
.../kbn_core_notifications_browser_mocks.mdx | 2 +-
api_docs/kbn_core_overlays_browser.mdx | 2 +-
.../kbn_core_overlays_browser_internal.mdx | 2 +-
api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +-
api_docs/kbn_core_plugins_browser.mdx | 2 +-
api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +-
.../kbn_core_plugins_contracts_browser.mdx | 2 +-
.../kbn_core_plugins_contracts_server.mdx | 2 +-
api_docs/kbn_core_plugins_server.mdx | 2 +-
api_docs/kbn_core_plugins_server_mocks.mdx | 2 +-
api_docs/kbn_core_preboot_server.mdx | 2 +-
api_docs/kbn_core_preboot_server_mocks.mdx | 2 +-
api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +-
.../kbn_core_rendering_server_internal.mdx | 2 +-
api_docs/kbn_core_rendering_server_mocks.mdx | 2 +-
api_docs/kbn_core_root_server_internal.mdx | 2 +-
.../kbn_core_saved_objects_api_browser.mdx | 2 +-
.../kbn_core_saved_objects_api_server.mdx | 2 +-
...bn_core_saved_objects_api_server_mocks.mdx | 2 +-
...ore_saved_objects_base_server_internal.mdx | 2 +-
...n_core_saved_objects_base_server_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_browser.mdx | 2 +-
...bn_core_saved_objects_browser_internal.mdx | 2 +-
.../kbn_core_saved_objects_browser_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_common.mdx | 2 +-
..._objects_import_export_server_internal.mdx | 2 +-
...ved_objects_import_export_server_mocks.mdx | 2 +-
...aved_objects_migration_server_internal.mdx | 2 +-
...e_saved_objects_migration_server_mocks.mdx | 2 +-
api_docs/kbn_core_saved_objects_server.mdx | 2 +-
...kbn_core_saved_objects_server_internal.mdx | 2 +-
.../kbn_core_saved_objects_server_mocks.mdx | 2 +-
.../kbn_core_saved_objects_utils_server.mdx | 2 +-
api_docs/kbn_core_security_browser.mdx | 2 +-
.../kbn_core_security_browser_internal.mdx | 2 +-
api_docs/kbn_core_security_browser_mocks.mdx | 2 +-
api_docs/kbn_core_security_common.mdx | 2 +-
api_docs/kbn_core_security_server.mdx | 2 +-
.../kbn_core_security_server_internal.mdx | 2 +-
api_docs/kbn_core_security_server_mocks.mdx | 2 +-
api_docs/kbn_core_status_common.mdx | 2 +-
api_docs/kbn_core_status_common_internal.mdx | 2 +-
api_docs/kbn_core_status_server.mdx | 2 +-
api_docs/kbn_core_status_server_internal.mdx | 2 +-
api_docs/kbn_core_status_server_mocks.mdx | 2 +-
...core_test_helpers_deprecations_getters.mdx | 2 +-
...n_core_test_helpers_http_setup_browser.mdx | 2 +-
api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +-
.../kbn_core_test_helpers_model_versions.mdx | 2 +-
...n_core_test_helpers_so_type_serializer.mdx | 2 +-
api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +-
api_docs/kbn_core_theme_browser.mdx | 2 +-
api_docs/kbn_core_theme_browser_mocks.mdx | 2 +-
api_docs/kbn_core_ui_settings_browser.mdx | 2 +-
.../kbn_core_ui_settings_browser_internal.mdx | 2 +-
.../kbn_core_ui_settings_browser_mocks.mdx | 2 +-
api_docs/kbn_core_ui_settings_common.mdx | 2 +-
api_docs/kbn_core_ui_settings_server.mdx | 2 +-
.../kbn_core_ui_settings_server_internal.mdx | 2 +-
.../kbn_core_ui_settings_server_mocks.mdx | 2 +-
api_docs/kbn_core_usage_data_server.mdx | 2 +-
.../kbn_core_usage_data_server_internal.mdx | 2 +-
api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +-
api_docs/kbn_core_user_settings_server.mdx | 2 +-
...kbn_core_user_settings_server_internal.mdx | 2 +-
.../kbn_core_user_settings_server_mocks.mdx | 2 +-
api_docs/kbn_crypto.mdx | 2 +-
api_docs/kbn_crypto_browser.mdx | 2 +-
api_docs/kbn_custom_icons.mdx | 2 +-
api_docs/kbn_custom_integrations.mdx | 2 +-
api_docs/kbn_cypress_config.mdx | 2 +-
api_docs/kbn_data_forge.mdx | 2 +-
api_docs/kbn_data_service.mdx | 2 +-
api_docs/kbn_data_stream_adapter.mdx | 2 +-
api_docs/kbn_data_view_utils.mdx | 2 +-
api_docs/kbn_datemath.mdx | 2 +-
api_docs/kbn_deeplinks_analytics.mdx | 2 +-
api_docs/kbn_deeplinks_devtools.mdx | 2 +-
api_docs/kbn_deeplinks_fleet.mdx | 2 +-
api_docs/kbn_deeplinks_management.mdx | 2 +-
api_docs/kbn_deeplinks_ml.mdx | 2 +-
api_docs/kbn_deeplinks_observability.mdx | 2 +-
api_docs/kbn_deeplinks_search.mdx | 2 +-
api_docs/kbn_deeplinks_security.mdx | 2 +-
api_docs/kbn_deeplinks_shared.mdx | 2 +-
api_docs/kbn_default_nav_analytics.mdx | 2 +-
api_docs/kbn_default_nav_devtools.mdx | 2 +-
api_docs/kbn_default_nav_management.mdx | 2 +-
api_docs/kbn_default_nav_ml.mdx | 2 +-
api_docs/kbn_dev_cli_errors.mdx | 2 +-
api_docs/kbn_dev_cli_runner.mdx | 2 +-
api_docs/kbn_dev_proc_runner.mdx | 2 +-
api_docs/kbn_dev_utils.mdx | 2 +-
api_docs/kbn_discover_utils.mdx | 2 +-
api_docs/kbn_doc_links.mdx | 2 +-
api_docs/kbn_docs_utils.mdx | 2 +-
api_docs/kbn_dom_drag_drop.mdx | 2 +-
api_docs/kbn_ebt_tools.mdx | 2 +-
api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +-
api_docs/kbn_elastic_agent_utils.mdx | 2 +-
api_docs/kbn_elastic_assistant.mdx | 2 +-
api_docs/kbn_elastic_assistant_common.mdx | 2 +-
api_docs/kbn_es.mdx | 2 +-
api_docs/kbn_es_archiver.mdx | 2 +-
api_docs/kbn_es_errors.mdx | 2 +-
api_docs/kbn_es_query.mdx | 2 +-
api_docs/kbn_es_types.mdx | 2 +-
api_docs/kbn_eslint_plugin_imports.mdx | 2 +-
api_docs/kbn_esql_ast.mdx | 2 +-
api_docs/kbn_esql_utils.devdocs.json | 48 ++++
api_docs/kbn_esql_utils.mdx | 4 +-
api_docs/kbn_esql_validation_autocomplete.mdx | 2 +-
api_docs/kbn_event_annotation_common.mdx | 2 +-
api_docs/kbn_event_annotation_components.mdx | 2 +-
api_docs/kbn_expandable_flyout.mdx | 2 +-
api_docs/kbn_field_types.mdx | 2 +-
api_docs/kbn_field_utils.mdx | 2 +-
api_docs/kbn_find_used_node_modules.mdx | 2 +-
api_docs/kbn_formatters.mdx | 2 +-
.../kbn_ftr_common_functional_services.mdx | 2 +-
.../kbn_ftr_common_functional_ui_services.mdx | 2 +-
api_docs/kbn_generate.mdx | 2 +-
api_docs/kbn_generate_console_definitions.mdx | 2 +-
api_docs/kbn_generate_csv.mdx | 2 +-
api_docs/kbn_guided_onboarding.mdx | 2 +-
api_docs/kbn_handlebars.mdx | 2 +-
api_docs/kbn_hapi_mocks.mdx | 2 +-
api_docs/kbn_health_gateway_server.mdx | 2 +-
api_docs/kbn_home_sample_data_card.mdx | 2 +-
api_docs/kbn_home_sample_data_tab.mdx | 2 +-
api_docs/kbn_i18n.mdx | 2 +-
api_docs/kbn_i18n_react.mdx | 2 +-
api_docs/kbn_import_resolver.mdx | 2 +-
api_docs/kbn_index_management.mdx | 2 +-
api_docs/kbn_inference_integration_flyout.mdx | 2 +-
api_docs/kbn_infra_forge.mdx | 2 +-
api_docs/kbn_interpreter.mdx | 2 +-
api_docs/kbn_io_ts_utils.mdx | 2 +-
api_docs/kbn_ipynb.mdx | 2 +-
api_docs/kbn_jest_serializers.mdx | 2 +-
api_docs/kbn_journeys.mdx | 2 +-
api_docs/kbn_json_ast.mdx | 2 +-
api_docs/kbn_kibana_manifest_schema.mdx | 2 +-
.../kbn_language_documentation_popover.mdx | 2 +-
api_docs/kbn_lens_embeddable_utils.mdx | 2 +-
api_docs/kbn_lens_formula_docs.mdx | 2 +-
api_docs/kbn_logging.mdx | 2 +-
api_docs/kbn_logging_mocks.mdx | 2 +-
api_docs/kbn_managed_content_badge.mdx | 2 +-
api_docs/kbn_managed_vscode_config.mdx | 2 +-
api_docs/kbn_management_cards_navigation.mdx | 2 +-
.../kbn_management_settings_application.mdx | 2 +-
...ent_settings_components_field_category.mdx | 2 +-
...gement_settings_components_field_input.mdx | 2 +-
...nagement_settings_components_field_row.mdx | 2 +-
...bn_management_settings_components_form.mdx | 2 +-
...n_management_settings_field_definition.mdx | 2 +-
api_docs/kbn_management_settings_ids.mdx | 2 +-
...n_management_settings_section_registry.mdx | 2 +-
api_docs/kbn_management_settings_types.mdx | 2 +-
.../kbn_management_settings_utilities.mdx | 2 +-
api_docs/kbn_management_storybook_config.mdx | 2 +-
api_docs/kbn_mapbox_gl.mdx | 2 +-
api_docs/kbn_maps_vector_tile_utils.mdx | 2 +-
api_docs/kbn_ml_agg_utils.mdx | 2 +-
api_docs/kbn_ml_anomaly_utils.mdx | 2 +-
api_docs/kbn_ml_cancellable_search.mdx | 2 +-
api_docs/kbn_ml_category_validator.mdx | 2 +-
api_docs/kbn_ml_chi2test.mdx | 2 +-
.../kbn_ml_data_frame_analytics_utils.mdx | 2 +-
api_docs/kbn_ml_data_grid.mdx | 2 +-
api_docs/kbn_ml_date_picker.mdx | 2 +-
api_docs/kbn_ml_date_utils.mdx | 2 +-
api_docs/kbn_ml_error_utils.mdx | 2 +-
api_docs/kbn_ml_in_memory_table.mdx | 2 +-
api_docs/kbn_ml_is_defined.mdx | 2 +-
api_docs/kbn_ml_is_populated_object.mdx | 2 +-
api_docs/kbn_ml_kibana_theme.mdx | 2 +-
api_docs/kbn_ml_local_storage.mdx | 2 +-
api_docs/kbn_ml_nested_property.mdx | 2 +-
api_docs/kbn_ml_number_utils.mdx | 2 +-
api_docs/kbn_ml_query_utils.mdx | 2 +-
api_docs/kbn_ml_random_sampler_utils.mdx | 2 +-
api_docs/kbn_ml_route_utils.mdx | 2 +-
api_docs/kbn_ml_runtime_field_utils.mdx | 2 +-
api_docs/kbn_ml_string_hash.mdx | 2 +-
api_docs/kbn_ml_time_buckets.mdx | 2 +-
api_docs/kbn_ml_trained_models_utils.mdx | 2 +-
api_docs/kbn_ml_ui_actions.mdx | 2 +-
api_docs/kbn_ml_url_state.mdx | 2 +-
api_docs/kbn_mock_idp_utils.mdx | 2 +-
api_docs/kbn_monaco.mdx | 2 +-
api_docs/kbn_object_versioning.mdx | 2 +-
api_docs/kbn_observability_alert_details.mdx | 2 +-
.../kbn_observability_alerting_test_data.mdx | 2 +-
...ility_get_padded_alert_time_range_util.mdx | 2 +-
api_docs/kbn_openapi_bundler.mdx | 2 +-
api_docs/kbn_openapi_generator.mdx | 2 +-
api_docs/kbn_optimizer.mdx | 2 +-
api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +-
api_docs/kbn_osquery_io_ts_types.mdx | 2 +-
api_docs/kbn_panel_loader.mdx | 2 +-
..._performance_testing_dataset_extractor.mdx | 2 +-
api_docs/kbn_plugin_check.mdx | 2 +-
api_docs/kbn_plugin_generator.mdx | 2 +-
api_docs/kbn_plugin_helpers.mdx | 2 +-
api_docs/kbn_presentation_containers.mdx | 2 +-
.../kbn_presentation_publishing.devdocs.json | 76 +++++++
api_docs/kbn_presentation_publishing.mdx | 4 +-
api_docs/kbn_profiling_utils.mdx | 2 +-
api_docs/kbn_random_sampling.mdx | 2 +-
api_docs/kbn_react_field.mdx | 2 +-
api_docs/kbn_react_kibana_context_common.mdx | 2 +-
api_docs/kbn_react_kibana_context_render.mdx | 2 +-
api_docs/kbn_react_kibana_context_root.mdx | 2 +-
api_docs/kbn_react_kibana_context_styled.mdx | 2 +-
api_docs/kbn_react_kibana_context_theme.mdx | 2 +-
api_docs/kbn_react_kibana_mount.mdx | 2 +-
api_docs/kbn_repo_file_maps.mdx | 2 +-
api_docs/kbn_repo_linter.mdx | 2 +-
api_docs/kbn_repo_path.mdx | 2 +-
api_docs/kbn_repo_source_classifier.mdx | 2 +-
api_docs/kbn_reporting_common.mdx | 2 +-
api_docs/kbn_reporting_csv_share_panel.mdx | 2 +-
api_docs/kbn_reporting_export_types_csv.mdx | 2 +-
.../kbn_reporting_export_types_csv_common.mdx | 2 +-
api_docs/kbn_reporting_export_types_pdf.mdx | 2 +-
.../kbn_reporting_export_types_pdf_common.mdx | 2 +-
api_docs/kbn_reporting_export_types_png.mdx | 2 +-
.../kbn_reporting_export_types_png_common.mdx | 2 +-
api_docs/kbn_reporting_mocks_server.mdx | 2 +-
api_docs/kbn_reporting_public.mdx | 2 +-
api_docs/kbn_reporting_server.mdx | 2 +-
api_docs/kbn_resizable_layout.mdx | 2 +-
api_docs/kbn_rison.mdx | 2 +-
api_docs/kbn_router_to_openapispec.mdx | 2 +-
api_docs/kbn_router_utils.mdx | 2 +-
api_docs/kbn_rrule.mdx | 2 +-
api_docs/kbn_rule_data_utils.mdx | 2 +-
api_docs/kbn_saved_objects_settings.mdx | 2 +-
api_docs/kbn_search_api_panels.mdx | 2 +-
api_docs/kbn_search_connectors.mdx | 2 +-
api_docs/kbn_search_errors.mdx | 2 +-
api_docs/kbn_search_index_documents.mdx | 2 +-
api_docs/kbn_search_response_warnings.mdx | 2 +-
api_docs/kbn_security_hardening.mdx | 2 +-
api_docs/kbn_security_plugin_types_common.mdx | 2 +-
api_docs/kbn_security_plugin_types_public.mdx | 2 +-
api_docs/kbn_security_plugin_types_server.mdx | 2 +-
api_docs/kbn_security_solution_features.mdx | 2 +-
api_docs/kbn_security_solution_navigation.mdx | 2 +-
api_docs/kbn_security_solution_side_nav.mdx | 2 +-
...kbn_security_solution_storybook_config.mdx | 2 +-
.../kbn_securitysolution_autocomplete.mdx | 2 +-
api_docs/kbn_securitysolution_data_table.mdx | 2 +-
api_docs/kbn_securitysolution_ecs.mdx | 2 +-
api_docs/kbn_securitysolution_es_utils.mdx | 2 +-
...ritysolution_exception_list_components.mdx | 2 +-
api_docs/kbn_securitysolution_grouping.mdx | 2 +-
api_docs/kbn_securitysolution_hook_utils.mdx | 2 +-
..._securitysolution_io_ts_alerting_types.mdx | 2 +-
.../kbn_securitysolution_io_ts_list_types.mdx | 2 +-
api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +-
api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +-
api_docs/kbn_securitysolution_list_api.mdx | 2 +-
.../kbn_securitysolution_list_constants.mdx | 2 +-
api_docs/kbn_securitysolution_list_hooks.mdx | 2 +-
api_docs/kbn_securitysolution_list_utils.mdx | 2 +-
api_docs/kbn_securitysolution_rules.mdx | 2 +-
api_docs/kbn_securitysolution_t_grid.mdx | 2 +-
api_docs/kbn_securitysolution_utils.mdx | 2 +-
api_docs/kbn_server_http_tools.mdx | 2 +-
api_docs/kbn_server_route_repository.mdx | 2 +-
api_docs/kbn_serverless_common_settings.mdx | 2 +-
.../kbn_serverless_observability_settings.mdx | 2 +-
api_docs/kbn_serverless_project_switcher.mdx | 2 +-
api_docs/kbn_serverless_search_settings.mdx | 2 +-
api_docs/kbn_serverless_security_settings.mdx | 2 +-
api_docs/kbn_serverless_storybook_config.mdx | 2 +-
api_docs/kbn_shared_svg.mdx | 2 +-
api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +-
.../kbn_shared_ux_button_exit_full_screen.mdx | 2 +-
api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +-
api_docs/kbn_shared_ux_card_no_data.mdx | 2 +-
api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +-
api_docs/kbn_shared_ux_error_boundary.mdx | 2 +-
api_docs/kbn_shared_ux_file_context.mdx | 2 +-
api_docs/kbn_shared_ux_file_image.mdx | 2 +-
api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_file_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_file_picker.mdx | 2 +-
api_docs/kbn_shared_ux_file_types.mdx | 2 +-
api_docs/kbn_shared_ux_file_upload.mdx | 2 +-
api_docs/kbn_shared_ux_file_util.mdx | 2 +-
api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +-
.../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_markdown.mdx | 2 +-
api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +-
.../kbn_shared_ux_page_analytics_no_data.mdx | 2 +-
...shared_ux_page_analytics_no_data_mocks.mdx | 2 +-
.../kbn_shared_ux_page_kibana_no_data.mdx | 2 +-
...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +-
.../kbn_shared_ux_page_kibana_template.mdx | 2 +-
...n_shared_ux_page_kibana_template_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_no_data.mdx | 2 +-
.../kbn_shared_ux_page_no_data_config.mdx | 2 +-
...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +-
.../kbn_shared_ux_prompt_no_data_views.mdx | 2 +-
...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +-
api_docs/kbn_shared_ux_router.mdx | 2 +-
api_docs/kbn_shared_ux_router_mocks.mdx | 2 +-
api_docs/kbn_shared_ux_storybook_config.mdx | 2 +-
api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +-
api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +-
api_docs/kbn_shared_ux_utility.mdx | 2 +-
api_docs/kbn_slo_schema.mdx | 2 +-
api_docs/kbn_solution_nav_es.mdx | 2 +-
api_docs/kbn_solution_nav_oblt.mdx | 2 +-
api_docs/kbn_some_dev_log.mdx | 2 +-
api_docs/kbn_sort_predicates.mdx | 2 +-
api_docs/kbn_std.mdx | 2 +-
api_docs/kbn_stdio_dev_helpers.mdx | 2 +-
api_docs/kbn_storybook.mdx | 2 +-
api_docs/kbn_telemetry_tools.mdx | 2 +-
api_docs/kbn_test.mdx | 2 +-
api_docs/kbn_test_eui_helpers.mdx | 2 +-
api_docs/kbn_test_jest_helpers.mdx | 2 +-
api_docs/kbn_test_subj_selector.mdx | 2 +-
api_docs/kbn_text_based_editor.mdx | 2 +-
api_docs/kbn_timerange.mdx | 2 +-
api_docs/kbn_tooling_log.mdx | 2 +-
api_docs/kbn_triggers_actions_ui_types.mdx | 2 +-
api_docs/kbn_ts_projects.mdx | 2 +-
api_docs/kbn_typed_react_router_config.mdx | 2 +-
api_docs/kbn_ui_actions_browser.mdx | 2 +-
api_docs/kbn_ui_shared_deps_src.mdx | 2 +-
api_docs/kbn_ui_theme.mdx | 2 +-
api_docs/kbn_unified_data_table.mdx | 2 +-
api_docs/kbn_unified_doc_viewer.mdx | 2 +-
api_docs/kbn_unified_field_list.mdx | 2 +-
api_docs/kbn_unsaved_changes_badge.mdx | 2 +-
api_docs/kbn_use_tracked_promise.mdx | 2 +-
api_docs/kbn_user_profile_components.mdx | 2 +-
api_docs/kbn_utility_types.mdx | 2 +-
api_docs/kbn_utility_types_jest.mdx | 2 +-
api_docs/kbn_utils.mdx | 2 +-
api_docs/kbn_visualization_ui_components.mdx | 2 +-
api_docs/kbn_visualization_utils.mdx | 2 +-
api_docs/kbn_xstate_utils.mdx | 2 +-
api_docs/kbn_yarn_lock_validator.mdx | 2 +-
api_docs/kbn_zod_helpers.mdx | 2 +-
api_docs/kibana_overview.mdx | 2 +-
api_docs/kibana_react.mdx | 2 +-
api_docs/kibana_utils.mdx | 2 +-
api_docs/kubernetes_security.mdx | 2 +-
api_docs/lens.mdx | 2 +-
api_docs/license_api_guard.mdx | 2 +-
api_docs/license_management.mdx | 2 +-
api_docs/licensing.mdx | 2 +-
api_docs/links.mdx | 2 +-
api_docs/lists.mdx | 2 +-
api_docs/logs_explorer.mdx | 2 +-
api_docs/logs_shared.mdx | 2 +-
api_docs/management.mdx | 2 +-
api_docs/maps.mdx | 2 +-
api_docs/maps_ems.mdx | 2 +-
api_docs/metrics_data_access.mdx | 2 +-
api_docs/ml.mdx | 2 +-
api_docs/mock_idp_plugin.mdx | 2 +-
api_docs/monitoring.mdx | 2 +-
api_docs/monitoring_collection.mdx | 2 +-
api_docs/navigation.mdx | 2 +-
api_docs/newsfeed.mdx | 2 +-
api_docs/no_data_page.mdx | 2 +-
api_docs/notifications.mdx | 2 +-
api_docs/observability.mdx | 2 +-
api_docs/observability_a_i_assistant.mdx | 2 +-
api_docs/observability_a_i_assistant_app.mdx | 2 +-
.../observability_ai_assistant_management.mdx | 2 +-
api_docs/observability_logs_explorer.mdx | 2 +-
api_docs/observability_onboarding.mdx | 2 +-
api_docs/observability_shared.mdx | 2 +-
api_docs/osquery.mdx | 2 +-
api_docs/painless_lab.mdx | 2 +-
api_docs/plugin_directory.mdx | 14 +-
api_docs/presentation_panel.mdx | 2 +-
api_docs/presentation_util.mdx | 2 +-
api_docs/profiling.mdx | 2 +-
api_docs/profiling_data_access.mdx | 2 +-
api_docs/remote_clusters.mdx | 2 +-
api_docs/reporting.mdx | 2 +-
api_docs/rollup.mdx | 2 +-
api_docs/rule_registry.mdx | 2 +-
api_docs/runtime_fields.mdx | 2 +-
api_docs/saved_objects.mdx | 2 +-
api_docs/saved_objects_finder.mdx | 2 +-
api_docs/saved_objects_management.mdx | 2 +-
api_docs/saved_objects_tagging.mdx | 2 +-
api_docs/saved_objects_tagging_oss.mdx | 2 +-
api_docs/saved_search.mdx | 2 +-
api_docs/screenshot_mode.mdx | 2 +-
api_docs/screenshotting.mdx | 2 +-
api_docs/search_connectors.mdx | 2 +-
api_docs/search_notebooks.mdx | 2 +-
api_docs/search_playground.mdx | 2 +-
api_docs/security.mdx | 2 +-
api_docs/security_solution.devdocs.json | 24 ++
api_docs/security_solution.mdx | 4 +-
api_docs/security_solution_ess.mdx | 2 +-
api_docs/security_solution_serverless.mdx | 2 +-
api_docs/serverless.mdx | 2 +-
api_docs/serverless_observability.mdx | 2 +-
api_docs/serverless_search.mdx | 2 +-
api_docs/session_view.mdx | 2 +-
api_docs/share.mdx | 2 +-
api_docs/slo.mdx | 2 +-
api_docs/snapshot_restore.mdx | 2 +-
api_docs/spaces.mdx | 2 +-
api_docs/stack_alerts.mdx | 2 +-
api_docs/stack_connectors.mdx | 2 +-
api_docs/task_manager.mdx | 2 +-
api_docs/telemetry.mdx | 2 +-
api_docs/telemetry_collection_manager.mdx | 2 +-
api_docs/telemetry_collection_xpack.mdx | 2 +-
api_docs/telemetry_management_section.mdx | 2 +-
api_docs/text_based_languages.mdx | 2 +-
api_docs/threat_intelligence.mdx | 2 +-
api_docs/timelines.mdx | 2 +-
api_docs/transform.mdx | 2 +-
api_docs/triggers_actions_ui.mdx | 2 +-
api_docs/ui_actions.mdx | 2 +-
api_docs/ui_actions_enhanced.mdx | 2 +-
api_docs/unified_doc_viewer.mdx | 2 +-
api_docs/unified_histogram.mdx | 2 +-
api_docs/unified_search.mdx | 2 +-
api_docs/unified_search_autocomplete.mdx | 2 +-
api_docs/uptime.mdx | 2 +-
api_docs/url_forwarding.mdx | 2 +-
api_docs/usage_collection.mdx | 2 +-
api_docs/ux.mdx | 2 +-
api_docs/vis_default_editor.mdx | 2 +-
api_docs/vis_type_gauge.mdx | 2 +-
api_docs/vis_type_heatmap.mdx | 2 +-
api_docs/vis_type_pie.mdx | 2 +-
api_docs/vis_type_table.mdx | 2 +-
api_docs/vis_type_timelion.mdx | 2 +-
api_docs/vis_type_timeseries.mdx | 2 +-
api_docs/vis_type_vega.mdx | 2 +-
api_docs/vis_type_vislib.mdx | 2 +-
api_docs/vis_type_xy.mdx | 2 +-
api_docs/visualizations.mdx | 2 +-
686 files changed, 922 insertions(+), 937 deletions(-)
diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json
index 95740f00086f3..a2d636190c118 100644
--- a/api_docs/actions.devdocs.json
+++ b/api_docs/actions.devdocs.json
@@ -231,7 +231,7 @@
"section": "def-server.CaseConnector",
"text": "CaseConnector"
},
- " extends ",
+ " extends ",
{
"pluginId": "actions",
"scope": "server",
@@ -240,7 +240,8 @@
"text": "SubActionConnector"
},
" implements ",
- "CaseConnectorInterface"
+ "CaseConnectorInterface",
+ ""
],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
@@ -281,6 +282,29 @@
"deprecated": false,
"trackAdoption": false,
"isRequired": true
+ },
+ {
+ "parentPluginId": "actions",
+ "id": "def-server.CaseConnector.Unnamed.$2",
+ "type": "Object",
+ "tags": [],
+ "label": "pushToServiceIncidentParamsSchema",
+ "description": [],
+ "signature": [
+ "Record>"
+ ],
+ "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
}
],
"returnComment": []
@@ -293,7 +317,7 @@
"label": "addComment",
"description": [],
"signature": [
- "({ incidentId, comment, }: { incidentId: string; comment: string; }) => Promise"
+ "({ incidentId, comment, }: { incidentId: string; comment: string; }) => Promise"
],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
@@ -345,7 +369,7 @@
"label": "createIncident",
"description": [],
"signature": [
- "(incident: Record) => Promise<",
+ "(incident: Incident) => Promise<",
"ExternalServiceIncidentResponse",
">"
],
@@ -356,12 +380,12 @@
{
"parentPluginId": "actions",
"id": "def-server.CaseConnector.createIncident.$1",
- "type": "Object",
+ "type": "Uncategorized",
"tags": [],
"label": "incident",
"description": [],
"signature": [
- "Record"
+ "Incident"
],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
@@ -379,7 +403,7 @@
"label": "updateIncident",
"description": [],
"signature": [
- "({ incidentId, incident, }: { incidentId: string; incident: Record; }) => Promise<",
+ "({ incidentId, incident, }: { incidentId: string; incident: Incident; }) => Promise<",
"ExternalServiceIncidentResponse",
">"
],
@@ -412,12 +436,12 @@
{
"parentPluginId": "actions",
"id": "def-server.CaseConnector.updateIncident.$1.incident",
- "type": "Object",
+ "type": "Uncategorized",
"tags": [],
"label": "incident",
"description": [],
"signature": [
- "{ [x: string]: unknown; }"
+ "Incident"
],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
@@ -436,9 +460,7 @@
"label": "getIncident",
"description": [],
"signature": [
- "({ id }: { id: string; }) => Promise<",
- "ExternalServiceIncidentResponse",
- ">"
+ "({ id }: { id: string; }) => Promise"
],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
@@ -479,9 +501,7 @@
"label": "pushToService",
"description": [],
"signature": [
- "(params: ",
- "PushToServiceParams",
- ") => Promise<",
+ "(params: { incident: { externalId: string | null; } & Incident; comments: { commentId: string; comment: string; }[]; }) => Promise<",
"PushToServiceResponse",
">"
],
@@ -496,13 +516,39 @@
"tags": [],
"label": "params",
"description": [],
- "signature": [
- "PushToServiceParams"
- ],
"path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
"deprecated": false,
"trackAdoption": false,
- "isRequired": true
+ "children": [
+ {
+ "parentPluginId": "actions",
+ "id": "def-server.CaseConnector.pushToService.$1.incident",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "incident",
+ "description": [],
+ "signature": [
+ "{ externalId: string | null; } & Incident"
+ ],
+ "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "actions",
+ "id": "def-server.CaseConnector.pushToService.$1.comments",
+ "type": "Array",
+ "tags": [],
+ "label": "comments",
+ "description": [],
+ "signature": [
+ "{ commentId: string; comment: string; }[]"
+ ],
+ "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ]
}
],
"returnComment": []
@@ -3724,9 +3770,9 @@
"label": "getCaseConnectorClass",
"description": [],
"signature": [
- "() => ",
- "IServiceAbstract",
- ""
+ "() => ",
+ "ICaseServiceAbstract",
+ ""
],
"path": "x-pack/plugins/actions/server/plugin.ts",
"deprecated": false,
diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx
index 1fd7347b53a07..235eb1266444a 100644
--- a/api_docs/actions.mdx
+++ b/api_docs/actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions
title: "actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the actions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions']
---
import actionsObj from './actions.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 298 | 0 | 292 | 32 |
+| 301 | 0 | 295 | 32 |
## Client
diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx
index 4ad58dc5c0285..9f715de756869 100644
--- a/api_docs/advanced_settings.mdx
+++ b/api_docs/advanced_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings
title: "advancedSettings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the advancedSettings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings']
---
import advancedSettingsObj from './advanced_settings.devdocs.json';
diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx
index 044214e705094..56c82f528294c 100644
--- a/api_docs/ai_assistant_management_selection.mdx
+++ b/api_docs/ai_assistant_management_selection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection
title: "aiAssistantManagementSelection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the aiAssistantManagementSelection plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection']
---
import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json';
diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx
index bd5c1d94c367a..36a180e2b4c3f 100644
--- a/api_docs/aiops.mdx
+++ b/api_docs/aiops.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops
title: "aiops"
image: https://source.unsplash.com/400x175/?github
description: API docs for the aiops plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops']
---
import aiopsObj from './aiops.devdocs.json';
diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx
index 80b5ab08b9fc2..ddaf4a2a4c7f8 100644
--- a/api_docs/alerting.mdx
+++ b/api_docs/alerting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting
title: "alerting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the alerting plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting']
---
import alertingObj from './alerting.devdocs.json';
diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json
index 05fe4879625a3..1eabcac165064 100644
--- a/api_docs/apm.devdocs.json
+++ b/api_docs/apm.devdocs.json
@@ -273,9 +273,9 @@
"APMPluginSetupDependencies",
") => { config$: ",
"Observable",
- "; searchAggregatedTransactions: ",
+ "; }>; autoCreateApmDataView: boolean; serviceMapEnabled: boolean; serviceMapFingerprintBucketSize: number; serviceMapFingerprintGlobalBucketSize: number; serviceMapTraceIdBucketSize: number; serviceMapTraceIdGlobalBucketSize: number; serviceMapMaxTracesPerRequest: number; serviceMapTerminateAfter: number; serviceMapMaxTraces: number; ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; searchAggregatedTransactions: ",
"SearchAggregatedTransactionSetting",
- "; telemetryCollectionEnabled: boolean; metricsInterval: number; agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>; }"
+ "; telemetryCollectionEnabled: boolean; metricsInterval: number; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>; }"
],
"path": "x-pack/plugins/observability_solution/apm/server/plugin.ts",
"deprecated": false,
@@ -448,9 +448,9 @@
"label": "APMConfig",
"description": [],
"signature": [
- "{ readonly enabled: boolean; readonly autoCreateApmDataView: boolean; readonly serviceMapEnabled: boolean; readonly serviceMapFingerprintBucketSize: number; readonly serviceMapFingerprintGlobalBucketSize: number; readonly serviceMapTraceIdBucketSize: number; readonly serviceMapTraceIdGlobalBucketSize: number; readonly serviceMapMaxTracesPerRequest: number; readonly serviceMapTerminateAfter: number; readonly serviceMapMaxTraces: number; readonly ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; readonly searchAggregatedTransactions: ",
+ "{ readonly enabled: boolean; readonly agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; readonly autoCreateApmDataView: boolean; readonly serviceMapEnabled: boolean; readonly serviceMapFingerprintBucketSize: number; readonly serviceMapFingerprintGlobalBucketSize: number; readonly serviceMapTraceIdBucketSize: number; readonly serviceMapTraceIdGlobalBucketSize: number; readonly serviceMapMaxTracesPerRequest: number; readonly serviceMapTerminateAfter: number; readonly serviceMapMaxTraces: number; readonly ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; readonly searchAggregatedTransactions: ",
"SearchAggregatedTransactionSetting",
- "; readonly telemetryCollectionEnabled: boolean; readonly metricsInterval: number; readonly agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; readonly forceSyntheticSource: boolean; readonly latestAgentVersionsUrl: string; readonly serverless: Readonly<{} & { enabled: true; }>; readonly serverlessOnboarding: boolean; readonly managedServiceUrl: string; readonly featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }"
+ "; readonly telemetryCollectionEnabled: boolean; readonly metricsInterval: number; readonly forceSyntheticSource: boolean; readonly latestAgentVersionsUrl: string; readonly serverless: Readonly<{} & { enabled: true; }>; readonly serverlessOnboarding: boolean; readonly managedServiceUrl: string; readonly featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }"
],
"path": "x-pack/plugins/observability_solution/apm/server/index.ts",
"deprecated": false,
@@ -917,19 +917,21 @@
"StringC",
"; 'container.id': ",
"StringC",
+ "; 'kubernetes.pod.name': ",
+ "StringC",
"; }>]>; }> | undefined; handler: ({}: ",
"APMRouteHandlerResources",
- " & { params: { query: { alert_started_at: string; } & { 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; }; }; }) => Promise<{ serviceSummary?: ",
+ " & { params: { query: { alert_started_at: string; } & { 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; }; }; }) => Promise<{ serviceSummary?: ",
"ServiceSummary",
" | undefined; downstreamDependencies?: ",
"APMDownstreamDependency",
- "[] | undefined; logCategories: ",
+ "[] | undefined; logCategories?: ",
"LogCategories",
- "; serviceChangePoints: { title: string; changes: ",
+ "; serviceChangePoints?: { title: string; changes: ",
"TimeseriesChangePoint",
- "[]; }[]; exitSpanChangePoints: { title: string; changes: ",
+ "[]; }[] | undefined; exitSpanChangePoints?: { title: string; changes: ",
"TimeseriesChangePoint",
- "[]; }[]; anomalies: { '@timestamp': string; metricName: string; \"service.name\": string; \"service.environment\": \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ",
+ "[]; }[] | undefined; anomalies?: { '@timestamp': string; metricName: string; \"service.name\": string; \"service.environment\": \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ",
"Branded",
"; \"transaction.type\": string; anomalyScore: string | number | null; actualValue: number; expectedBoundsLower: number; expectedBoundsUpper: number; }[]; }>; } & ",
+ ">; \"transaction.type\": string; anomalyScore: string | number | null; actualValue: number; expectedBoundsLower: number; expectedBoundsUpper: number; }[] | undefined; }>; } & ",
"APMRouteCreateOptions",
"; \"POST /internal/apm/assistant/get_apm_timeseries\": { endpoint: \"POST /internal/apm/assistant/get_apm_timeseries\"; params?: ",
"TypeC",
@@ -7926,9 +7928,9 @@
"description": [],
"signature": [
"Observable",
- "; searchAggregatedTransactions: ",
+ "; }>; autoCreateApmDataView: boolean; serviceMapEnabled: boolean; serviceMapFingerprintBucketSize: number; serviceMapFingerprintGlobalBucketSize: number; serviceMapTraceIdBucketSize: number; serviceMapTraceIdGlobalBucketSize: number; serviceMapMaxTracesPerRequest: number; serviceMapTerminateAfter: number; serviceMapMaxTraces: number; ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; searchAggregatedTransactions: ",
"SearchAggregatedTransactionSetting",
- "; telemetryCollectionEnabled: boolean; metricsInterval: number; agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>"
+ "; telemetryCollectionEnabled: boolean; metricsInterval: number; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>"
],
"path": "x-pack/plugins/observability_solution/apm/server/types.ts",
"deprecated": false,
diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx
index 8665ca630783d..2f87aa59a7751 100644
--- a/api_docs/apm.mdx
+++ b/api_docs/apm.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm
title: "apm"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apm plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm']
---
import apmObj from './apm.devdocs.json';
diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx
index 2e7f9cfde4693..c4c03333823c9 100644
--- a/api_docs/apm_data_access.mdx
+++ b/api_docs/apm_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess
title: "apmDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apmDataAccess plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess']
---
import apmDataAccessObj from './apm_data_access.devdocs.json';
diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx
index 43aa7b6842f2e..3f67f06dc42a5 100644
--- a/api_docs/asset_manager.mdx
+++ b/api_docs/asset_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager
title: "assetManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the assetManager plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager']
---
import assetManagerObj from './asset_manager.devdocs.json';
diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx
index e0cb6d6fbf276..b0d31fb29446e 100644
--- a/api_docs/banners.mdx
+++ b/api_docs/banners.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners
title: "banners"
image: https://source.unsplash.com/400x175/?github
description: API docs for the banners plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners']
---
import bannersObj from './banners.devdocs.json';
diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx
index cf8b9671663fa..1d53fde562bee 100644
--- a/api_docs/bfetch.mdx
+++ b/api_docs/bfetch.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch
title: "bfetch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the bfetch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch']
---
import bfetchObj from './bfetch.devdocs.json';
diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx
index 87fa606df1ed1..f090926eb8a66 100644
--- a/api_docs/canvas.mdx
+++ b/api_docs/canvas.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas
title: "canvas"
image: https://source.unsplash.com/400x175/?github
description: API docs for the canvas plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas']
---
import canvasObj from './canvas.devdocs.json';
diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx
index 2d2970efadfd4..a08ec62044c1f 100644
--- a/api_docs/cases.mdx
+++ b/api_docs/cases.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases
title: "cases"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cases plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases']
---
import casesObj from './cases.devdocs.json';
diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx
index 07f13bff0c33e..744434d03b9e3 100644
--- a/api_docs/charts.mdx
+++ b/api_docs/charts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts
title: "charts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the charts plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts']
---
import chartsObj from './charts.devdocs.json';
diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx
index 3b886a5aa17d6..50ec3784ee51d 100644
--- a/api_docs/cloud.mdx
+++ b/api_docs/cloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud
title: "cloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloud plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud']
---
import cloudObj from './cloud.devdocs.json';
diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx
index 27a738e5f29de..5789a1bafec32 100644
--- a/api_docs/cloud_data_migration.mdx
+++ b/api_docs/cloud_data_migration.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration
title: "cloudDataMigration"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDataMigration plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration']
---
import cloudDataMigrationObj from './cloud_data_migration.devdocs.json';
diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx
index 16dd20cda1b19..a08a47e4542e3 100644
--- a/api_docs/cloud_defend.mdx
+++ b/api_docs/cloud_defend.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend
title: "cloudDefend"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDefend plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend']
---
import cloudDefendObj from './cloud_defend.devdocs.json';
diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx
index 00132de728bcd..48ede8336aaa2 100644
--- a/api_docs/cloud_experiments.mdx
+++ b/api_docs/cloud_experiments.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments
title: "cloudExperiments"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudExperiments plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments']
---
import cloudExperimentsObj from './cloud_experiments.devdocs.json';
diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx
index c876a57c2f8b5..e2c44d0c3b033 100644
--- a/api_docs/cloud_security_posture.mdx
+++ b/api_docs/cloud_security_posture.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture
title: "cloudSecurityPosture"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudSecurityPosture plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture']
---
import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json';
diff --git a/api_docs/console.mdx b/api_docs/console.mdx
index 84efeaa26e25f..7aec6b5f42ff9 100644
--- a/api_docs/console.mdx
+++ b/api_docs/console.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console
title: "console"
image: https://source.unsplash.com/400x175/?github
description: API docs for the console plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console']
---
import consoleObj from './console.devdocs.json';
diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx
index d2a23746cbd28..a70ac9c2e0eb1 100644
--- a/api_docs/content_management.mdx
+++ b/api_docs/content_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement
title: "contentManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the contentManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement']
---
import contentManagementObj from './content_management.devdocs.json';
diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx
index 306313aaa4df3..bfed4d645626e 100644
--- a/api_docs/controls.mdx
+++ b/api_docs/controls.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls
title: "controls"
image: https://source.unsplash.com/400x175/?github
description: API docs for the controls plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls']
---
import controlsObj from './controls.devdocs.json';
diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx
index 6b629b09fd8be..fcf993fd83945 100644
--- a/api_docs/custom_integrations.mdx
+++ b/api_docs/custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations
title: "customIntegrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the customIntegrations plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations']
---
import customIntegrationsObj from './custom_integrations.devdocs.json';
diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json
index a77f98f8ac102..9026c7aaf99f6 100644
--- a/api_docs/dashboard.devdocs.json
+++ b/api_docs/dashboard.devdocs.json
@@ -1841,6 +1841,7 @@
"label": "executionContext",
"description": [],
"signature": [
+ "{ readonly type?: string | undefined; readonly name?: string | undefined; readonly page?: string | undefined; readonly id?: string | undefined; readonly description?: string | undefined; readonly url?: string | undefined; readonly meta?: { [key: string]: string | number | boolean | undefined; } | undefined; child?: ",
{
"pluginId": "@kbn/core-execution-context-common",
"scope": "common",
@@ -1848,7 +1849,7 @@
"section": "def-common.KibanaExecutionContext",
"text": "KibanaExecutionContext"
},
- " | undefined"
+ " | undefined; }"
],
"path": "src/plugins/dashboard/common/dashboard_container/types.ts",
"deprecated": false,
diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx
index ac078e4337b98..7b994dd255d7e 100644
--- a/api_docs/dashboard.mdx
+++ b/api_docs/dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard
title: "dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboard plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard']
---
import dashboardObj from './dashboard.devdocs.json';
diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx
index e294ac4462ae3..0677e2d4a1017 100644
--- a/api_docs/dashboard_enhanced.mdx
+++ b/api_docs/dashboard_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced
title: "dashboardEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboardEnhanced plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced']
---
import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json';
diff --git a/api_docs/data.mdx b/api_docs/data.mdx
index 54ae2d29b90cd..b39328966ea9c 100644
--- a/api_docs/data.mdx
+++ b/api_docs/data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data
title: "data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data']
---
import dataObj from './data.devdocs.json';
diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx
index 670b749777582..0e22cdc482aca 100644
--- a/api_docs/data_query.mdx
+++ b/api_docs/data_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query
title: "data.query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data.query plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query']
---
import dataQueryObj from './data_query.devdocs.json';
diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx
index 1aff16458a1aa..c2ff9efe3af71 100644
--- a/api_docs/data_search.mdx
+++ b/api_docs/data_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search
title: "data.search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data.search plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search']
---
import dataSearchObj from './data_search.devdocs.json';
diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx
index 1db1f5fb214f9..b31b991de2530 100644
--- a/api_docs/data_view_editor.mdx
+++ b/api_docs/data_view_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor
title: "dataViewEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewEditor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor']
---
import dataViewEditorObj from './data_view_editor.devdocs.json';
diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx
index 1ade689c92649..b7dd9d023af35 100644
--- a/api_docs/data_view_field_editor.mdx
+++ b/api_docs/data_view_field_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor
title: "dataViewFieldEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewFieldEditor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor']
---
import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json';
diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx
index 4b25306777b9b..26b4c6f10ed71 100644
--- a/api_docs/data_view_management.mdx
+++ b/api_docs/data_view_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement
title: "dataViewManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViewManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement']
---
import dataViewManagementObj from './data_view_management.devdocs.json';
diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx
index dc4c2899f3aba..24c07b0cfbf20 100644
--- a/api_docs/data_views.mdx
+++ b/api_docs/data_views.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews
title: "dataViews"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataViews plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews']
---
import dataViewsObj from './data_views.devdocs.json';
diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx
index 5dd35e53aaad1..fac8c97f8aa7c 100644
--- a/api_docs/data_visualizer.mdx
+++ b/api_docs/data_visualizer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer
title: "dataVisualizer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dataVisualizer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer']
---
import dataVisualizerObj from './data_visualizer.devdocs.json';
diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx
index 039d4d01f504b..43bce00047f50 100644
--- a/api_docs/dataset_quality.mdx
+++ b/api_docs/dataset_quality.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality
title: "datasetQuality"
image: https://source.unsplash.com/400x175/?github
description: API docs for the datasetQuality plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality']
---
import datasetQualityObj from './dataset_quality.devdocs.json';
diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx
index 33b126ad89297..051e7415a342f 100644
--- a/api_docs/deprecations_by_api.mdx
+++ b/api_docs/deprecations_by_api.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi
slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api
title: Deprecated API usage by API
description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by.
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx
index f676745d3a966..aae677be01c4a 100644
--- a/api_docs/deprecations_by_plugin.mdx
+++ b/api_docs/deprecations_by_plugin.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin
slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin
title: Deprecated API usage by plugin
description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by.
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx
index f2ee962027da4..7b40831d1685f 100644
--- a/api_docs/deprecations_by_team.mdx
+++ b/api_docs/deprecations_by_team.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam
slug: /kibana-dev-docs/api-meta/deprecations-due-by-team
title: Deprecated APIs due to be removed, by team
description: Lists the teams that are referencing deprecated APIs with a remove by date.
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx
index 9f0a585fe296c..ade608994ec68 100644
--- a/api_docs/dev_tools.mdx
+++ b/api_docs/dev_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools
title: "devTools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the devTools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools']
---
import devToolsObj from './dev_tools.devdocs.json';
diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json
index 621887eb7825d..f0e9fcc18d422 100644
--- a/api_docs/discover.devdocs.json
+++ b/api_docs/discover.devdocs.json
@@ -662,74 +662,6 @@
],
"initialIsOpen": false
},
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverProfileOptions",
- "type": "Interface",
- "tags": [],
- "label": "DiscoverProfileOptions",
- "description": [],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "children": [
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverProfileOptions.customize",
- "type": "Function",
- "tags": [],
- "label": "customize",
- "description": [],
- "signature": [
- "(options: ",
- "CustomizationCallbackContext",
- ") => void | (() => void) | Promise void)>"
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "returnComment": [],
- "children": [
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverProfileOptions.customize.$1",
- "type": "Object",
- "tags": [],
- "label": "options",
- "description": [],
- "signature": [
- "CustomizationCallbackContext"
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- }
- ]
- },
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverProfileOptions.deepLinks",
- "type": "Array",
- "tags": [],
- "label": "deepLinks",
- "description": [],
- "signature": [
- {
- "pluginId": "@kbn/core-application-browser",
- "scope": "common",
- "docId": "kibKbnCoreApplicationBrowserPluginApi",
- "section": "def-common.AppDeepLink",
- "text": "AppDeepLink"
- },
- "[] | undefined"
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- }
- ],
- "initialIsOpen": false
- },
{
"parentPluginId": "discover",
"id": "def-public.DiscoverStateContainer",
@@ -1568,21 +1500,6 @@
"trackAdoption": false,
"initialIsOpen": false
},
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverProfileId",
- "type": "Type",
- "tags": [],
- "label": "DiscoverProfileId",
- "description": [],
- "signature": [
- "string"
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "initialIsOpen": false
- },
{
"parentPluginId": "discover",
"id": "def-public.ISearchEmbeddable",
@@ -1618,63 +1535,6 @@
"trackAdoption": false,
"initialIsOpen": false
},
- {
- "parentPluginId": "discover",
- "id": "def-public.RegisterCustomizationProfile",
- "type": "Type",
- "tags": [],
- "label": "RegisterCustomizationProfile",
- "description": [],
- "signature": [
- "(id: string, options: ",
- {
- "pluginId": "discover",
- "scope": "public",
- "docId": "kibDiscoverPluginApi",
- "section": "def-public.DiscoverProfileOptions",
- "text": "DiscoverProfileOptions"
- },
- ") => void"
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "returnComment": [],
- "children": [
- {
- "parentPluginId": "discover",
- "id": "def-public.RegisterCustomizationProfile.$1",
- "type": "string",
- "tags": [],
- "label": "id",
- "description": [],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "discover",
- "id": "def-public.RegisterCustomizationProfile.$2",
- "type": "Object",
- "tags": [],
- "label": "options",
- "description": [],
- "signature": [
- {
- "pluginId": "discover",
- "scope": "public",
- "docId": "kibDiscoverPluginApi",
- "section": "def-public.DiscoverProfileOptions",
- "text": "DiscoverProfileOptions"
- }
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- }
- ],
- "initialIsOpen": false
- },
{
"parentPluginId": "discover",
"id": "def-public.SEARCH_EMBEDDABLE_CELL_ACTIONS_TRIGGER_ID",
@@ -1892,62 +1752,6 @@
"path": "src/plugins/discover/public/plugin.tsx",
"deprecated": false,
"trackAdoption": false
- },
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverStart.registerCustomizationProfile",
- "type": "Function",
- "tags": [],
- "label": "registerCustomizationProfile",
- "description": [],
- "signature": [
- "(id: string, options: ",
- {
- "pluginId": "discover",
- "scope": "public",
- "docId": "kibDiscoverPluginApi",
- "section": "def-public.DiscoverProfileOptions",
- "text": "DiscoverProfileOptions"
- },
- ") => void"
- ],
- "path": "src/plugins/discover/public/plugin.tsx",
- "deprecated": false,
- "trackAdoption": false,
- "returnComment": [],
- "children": [
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverStart.registerCustomizationProfile.$1",
- "type": "string",
- "tags": [],
- "label": "id",
- "description": [],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "discover",
- "id": "def-public.DiscoverStart.registerCustomizationProfile.$2",
- "type": "Object",
- "tags": [],
- "label": "options",
- "description": [],
- "signature": [
- {
- "pluginId": "discover",
- "scope": "public",
- "docId": "kibDiscoverPluginApi",
- "section": "def-public.DiscoverProfileOptions",
- "text": "DiscoverProfileOptions"
- }
- ],
- "path": "src/plugins/discover/public/customizations/types.ts",
- "deprecated": false,
- "trackAdoption": false
- }
- ]
}
],
"lifecycle": "start",
@@ -3050,22 +2854,6 @@
"path": "src/plugins/discover/common/app_locator.ts",
"deprecated": false,
"trackAdoption": false
- },
- {
- "parentPluginId": "discover",
- "id": "def-common.DiscoverAppLocatorParams.profile",
- "type": "string",
- "tags": [],
- "label": "profile",
- "description": [
- "\nThe Discover profile to use"
- ],
- "signature": [
- "string | undefined"
- ],
- "path": "src/plugins/discover/common/app_locator.ts",
- "deprecated": false,
- "trackAdoption": false
}
],
"initialIsOpen": false
diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx
index df156033e596b..e7cc9c0433189 100644
--- a/api_docs/discover.mdx
+++ b/api_docs/discover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover
title: "discover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discover plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover']
---
import discoverObj from './discover.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 156 | 0 | 108 | 27 |
+| 144 | 0 | 97 | 27 |
## Client
diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx
index cfb5492155604..ec2b1653b1ecf 100644
--- a/api_docs/discover_enhanced.mdx
+++ b/api_docs/discover_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced
title: "discoverEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discoverEnhanced plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced']
---
import discoverEnhancedObj from './discover_enhanced.devdocs.json';
diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx
index 2bca37f7d9e54..5073c811f88bd 100644
--- a/api_docs/ecs_data_quality_dashboard.mdx
+++ b/api_docs/ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard
title: "ecsDataQualityDashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ecsDataQualityDashboard plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard']
---
import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json';
diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx
index c612bd39cc10c..e69a37548dac6 100644
--- a/api_docs/elastic_assistant.mdx
+++ b/api_docs/elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant
title: "elasticAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the elasticAssistant plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant']
---
import elasticAssistantObj from './elastic_assistant.devdocs.json';
diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx
index a2a627bc03350..84f5b4da0e481 100644
--- a/api_docs/embeddable.mdx
+++ b/api_docs/embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable
title: "embeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddable plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable']
---
import embeddableObj from './embeddable.devdocs.json';
diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx
index ea9a2c39ad002..145b383759ee9 100644
--- a/api_docs/embeddable_enhanced.mdx
+++ b/api_docs/embeddable_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced
title: "embeddableEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddableEnhanced plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced']
---
import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json';
diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx
index 50bccd787a9f0..e890f605ab27f 100644
--- a/api_docs/encrypted_saved_objects.mdx
+++ b/api_docs/encrypted_saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects
title: "encryptedSavedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the encryptedSavedObjects plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects']
---
import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json';
diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx
index 7fc9120d309ea..be775ba090f11 100644
--- a/api_docs/enterprise_search.mdx
+++ b/api_docs/enterprise_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch
title: "enterpriseSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the enterpriseSearch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch']
---
import enterpriseSearchObj from './enterprise_search.devdocs.json';
diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx
index 06c02cfa9b605..c01e4b5491890 100644
--- a/api_docs/es_ui_shared.mdx
+++ b/api_docs/es_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared
title: "esUiShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the esUiShared plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared']
---
import esUiSharedObj from './es_ui_shared.devdocs.json';
diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx
index 65e4893f9104e..8bbdd258cb71f 100644
--- a/api_docs/event_annotation.mdx
+++ b/api_docs/event_annotation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation
title: "eventAnnotation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventAnnotation plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation']
---
import eventAnnotationObj from './event_annotation.devdocs.json';
diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx
index 96fde09a46d67..a868685e0aa6c 100644
--- a/api_docs/event_annotation_listing.mdx
+++ b/api_docs/event_annotation_listing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing
title: "eventAnnotationListing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventAnnotationListing plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing']
---
import eventAnnotationListingObj from './event_annotation_listing.devdocs.json';
diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx
index f1a4fa3b57020..a395ebaf5fe8e 100644
--- a/api_docs/event_log.mdx
+++ b/api_docs/event_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog
title: "eventLog"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventLog plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog']
---
import eventLogObj from './event_log.devdocs.json';
diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx
index 2f46e78554732..c169985583d61 100644
--- a/api_docs/exploratory_view.mdx
+++ b/api_docs/exploratory_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView
title: "exploratoryView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the exploratoryView plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView']
---
import exploratoryViewObj from './exploratory_view.devdocs.json';
diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx
index 0b7095a0352c3..35d3fb33eb5c0 100644
--- a/api_docs/expression_error.mdx
+++ b/api_docs/expression_error.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError
title: "expressionError"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionError plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError']
---
import expressionErrorObj from './expression_error.devdocs.json';
diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx
index 39ff778c6684e..c1384d0493f0f 100644
--- a/api_docs/expression_gauge.mdx
+++ b/api_docs/expression_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge
title: "expressionGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionGauge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge']
---
import expressionGaugeObj from './expression_gauge.devdocs.json';
diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx
index 4460faf1bbfd4..02632d6c70308 100644
--- a/api_docs/expression_heatmap.mdx
+++ b/api_docs/expression_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap
title: "expressionHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionHeatmap plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap']
---
import expressionHeatmapObj from './expression_heatmap.devdocs.json';
diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx
index 0b8e2ee9ecb29..34e62baea614d 100644
--- a/api_docs/expression_image.mdx
+++ b/api_docs/expression_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage
title: "expressionImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionImage plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage']
---
import expressionImageObj from './expression_image.devdocs.json';
diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx
index 90d4f7c8a13a1..10989b4d27d3e 100644
--- a/api_docs/expression_legacy_metric_vis.mdx
+++ b/api_docs/expression_legacy_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis
title: "expressionLegacyMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionLegacyMetricVis plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis']
---
import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json';
diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx
index 83b96e2c972ee..23a28acbab697 100644
--- a/api_docs/expression_metric.mdx
+++ b/api_docs/expression_metric.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric
title: "expressionMetric"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetric plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric']
---
import expressionMetricObj from './expression_metric.devdocs.json';
diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx
index b24f93a95b7c9..26d4c9bd16d67 100644
--- a/api_docs/expression_metric_vis.mdx
+++ b/api_docs/expression_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis
title: "expressionMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetricVis plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis']
---
import expressionMetricVisObj from './expression_metric_vis.devdocs.json';
diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx
index e07a4ca0512eb..627e5ebb047b0 100644
--- a/api_docs/expression_partition_vis.mdx
+++ b/api_docs/expression_partition_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis
title: "expressionPartitionVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionPartitionVis plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis']
---
import expressionPartitionVisObj from './expression_partition_vis.devdocs.json';
diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx
index c528fefbb987e..95133924e7040 100644
--- a/api_docs/expression_repeat_image.mdx
+++ b/api_docs/expression_repeat_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage
title: "expressionRepeatImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRepeatImage plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage']
---
import expressionRepeatImageObj from './expression_repeat_image.devdocs.json';
diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx
index 69945a6d00f79..eb5be730a6e94 100644
--- a/api_docs/expression_reveal_image.mdx
+++ b/api_docs/expression_reveal_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage
title: "expressionRevealImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRevealImage plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage']
---
import expressionRevealImageObj from './expression_reveal_image.devdocs.json';
diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx
index 252ed72ef9892..e40c9570e903f 100644
--- a/api_docs/expression_shape.mdx
+++ b/api_docs/expression_shape.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape
title: "expressionShape"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionShape plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape']
---
import expressionShapeObj from './expression_shape.devdocs.json';
diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx
index 98280252f47c7..3d273cea5b21a 100644
--- a/api_docs/expression_tagcloud.mdx
+++ b/api_docs/expression_tagcloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud
title: "expressionTagcloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionTagcloud plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud']
---
import expressionTagcloudObj from './expression_tagcloud.devdocs.json';
diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx
index 0a98bf0d7f600..af4e24b6d53d4 100644
--- a/api_docs/expression_x_y.mdx
+++ b/api_docs/expression_x_y.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY
title: "expressionXY"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionXY plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY']
---
import expressionXYObj from './expression_x_y.devdocs.json';
diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx
index 5c6585756dc31..33736bc6b7646 100644
--- a/api_docs/expressions.mdx
+++ b/api_docs/expressions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions
title: "expressions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions']
---
import expressionsObj from './expressions.devdocs.json';
diff --git a/api_docs/features.mdx b/api_docs/features.mdx
index 7c42d35af4235..0705c0f61454f 100644
--- a/api_docs/features.mdx
+++ b/api_docs/features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features
title: "features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the features plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features']
---
import featuresObj from './features.devdocs.json';
diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx
index 79699821c1e1d..65dcc4d14b590 100644
--- a/api_docs/field_formats.mdx
+++ b/api_docs/field_formats.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats
title: "fieldFormats"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fieldFormats plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats']
---
import fieldFormatsObj from './field_formats.devdocs.json';
diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx
index 17e725046c2f0..d9db257d5f427 100644
--- a/api_docs/file_upload.mdx
+++ b/api_docs/file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload
title: "fileUpload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fileUpload plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload']
---
import fileUploadObj from './file_upload.devdocs.json';
diff --git a/api_docs/files.mdx b/api_docs/files.mdx
index 7bb001c6b9c4e..d52753688099f 100644
--- a/api_docs/files.mdx
+++ b/api_docs/files.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files
title: "files"
image: https://source.unsplash.com/400x175/?github
description: API docs for the files plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files']
---
import filesObj from './files.devdocs.json';
diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx
index 3c3e2fc6d9bb8..1b719d00692e4 100644
--- a/api_docs/files_management.mdx
+++ b/api_docs/files_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement
title: "filesManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the filesManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement']
---
import filesManagementObj from './files_management.devdocs.json';
diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx
index b6e54e1ea3baf..2bc8c2c922f90 100644
--- a/api_docs/fleet.mdx
+++ b/api_docs/fleet.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet
title: "fleet"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fleet plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet']
---
import fleetObj from './fleet.devdocs.json';
diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx
index cff29d529056f..0026b7b14891d 100644
--- a/api_docs/global_search.mdx
+++ b/api_docs/global_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch
title: "globalSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the globalSearch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch']
---
import globalSearchObj from './global_search.devdocs.json';
diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx
index f5e75e7882467..9c0abfd9f8503 100644
--- a/api_docs/guided_onboarding.mdx
+++ b/api_docs/guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding
title: "guidedOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the guidedOnboarding plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding']
---
import guidedOnboardingObj from './guided_onboarding.devdocs.json';
diff --git a/api_docs/home.mdx b/api_docs/home.mdx
index 8e59ba4db41bb..c12d2ec33e90c 100644
--- a/api_docs/home.mdx
+++ b/api_docs/home.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home
title: "home"
image: https://source.unsplash.com/400x175/?github
description: API docs for the home plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home']
---
import homeObj from './home.devdocs.json';
diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx
index f174c67ed4b5f..a607adb784c31 100644
--- a/api_docs/image_embeddable.mdx
+++ b/api_docs/image_embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable
title: "imageEmbeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the imageEmbeddable plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable']
---
import imageEmbeddableObj from './image_embeddable.devdocs.json';
diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx
index 8928a207d60e4..6674010f245f4 100644
--- a/api_docs/index_lifecycle_management.mdx
+++ b/api_docs/index_lifecycle_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement
title: "indexLifecycleManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexLifecycleManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement']
---
import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json';
diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx
index da50e6d4f7d80..52d72954dce56 100644
--- a/api_docs/index_management.mdx
+++ b/api_docs/index_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement
title: "indexManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement']
---
import indexManagementObj from './index_management.devdocs.json';
diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx
index 0223f47e6b2a1..dd0a36d20525f 100644
--- a/api_docs/infra.mdx
+++ b/api_docs/infra.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra
title: "infra"
image: https://source.unsplash.com/400x175/?github
description: API docs for the infra plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra']
---
import infraObj from './infra.devdocs.json';
diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx
index 0f6265cbc160d..6f88226b93574 100644
--- a/api_docs/ingest_pipelines.mdx
+++ b/api_docs/ingest_pipelines.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines
title: "ingestPipelines"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ingestPipelines plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines']
---
import ingestPipelinesObj from './ingest_pipelines.devdocs.json';
diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx
index b80e101155e7e..7b2fc2fd7a675 100644
--- a/api_docs/inspector.mdx
+++ b/api_docs/inspector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector
title: "inspector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the inspector plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector']
---
import inspectorObj from './inspector.devdocs.json';
diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx
index e0d0af4c47fb6..01fac0a87fb13 100644
--- a/api_docs/interactive_setup.mdx
+++ b/api_docs/interactive_setup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup
title: "interactiveSetup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the interactiveSetup plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup']
---
import interactiveSetupObj from './interactive_setup.devdocs.json';
diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx
index df9f795e16fcd..d5b6891424e13 100644
--- a/api_docs/kbn_ace.mdx
+++ b/api_docs/kbn_ace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace
title: "@kbn/ace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ace plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace']
---
import kbnAceObj from './kbn_ace.devdocs.json';
diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx
index f791c73ed0c4e..301a6a6450b04 100644
--- a/api_docs/kbn_actions_types.mdx
+++ b/api_docs/kbn_actions_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types
title: "@kbn/actions-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/actions-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types']
---
import kbnActionsTypesObj from './kbn_actions_types.devdocs.json';
diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx
index 8f46edf664cbf..0c0a617652fab 100644
--- a/api_docs/kbn_aiops_components.mdx
+++ b/api_docs/kbn_aiops_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components
title: "@kbn/aiops-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components']
---
import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json';
diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx
index 9fc50aee2f196..f8c3d59e10f37 100644
--- a/api_docs/kbn_aiops_log_pattern_analysis.mdx
+++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis
title: "@kbn/aiops-log-pattern-analysis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-log-pattern-analysis plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis']
---
import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json';
diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx
index 9add71133906e..61c4fe116b14b 100644
--- a/api_docs/kbn_aiops_log_rate_analysis.mdx
+++ b/api_docs/kbn_aiops_log_rate_analysis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis
title: "@kbn/aiops-log-rate-analysis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-log-rate-analysis plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis']
---
import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json';
diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx
index 072bd4fe4fe0b..5dff30d92a0fb 100644
--- a/api_docs/kbn_alerting_api_integration_helpers.mdx
+++ b/api_docs/kbn_alerting_api_integration_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers
title: "@kbn/alerting-api-integration-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-api-integration-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers']
---
import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json';
diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx
index bf6fca7f67d51..939ac46ec08a8 100644
--- a/api_docs/kbn_alerting_state_types.mdx
+++ b/api_docs/kbn_alerting_state_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types
title: "@kbn/alerting-state-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-state-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types']
---
import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json';
diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx
index 002efeb7a350f..0c87a9a1bc7fa 100644
--- a/api_docs/kbn_alerting_types.mdx
+++ b/api_docs/kbn_alerting_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types
title: "@kbn/alerting-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types']
---
import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json';
diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx
index 394ff33e48ab0..d3541c8cc1bd1 100644
--- a/api_docs/kbn_alerts_as_data_utils.mdx
+++ b/api_docs/kbn_alerts_as_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils
title: "@kbn/alerts-as-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-as-data-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils']
---
import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json';
diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx
index a2bbfa67c9810..3da465b85eb3a 100644
--- a/api_docs/kbn_alerts_ui_shared.mdx
+++ b/api_docs/kbn_alerts_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared
title: "@kbn/alerts-ui-shared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-ui-shared plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared']
---
import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json';
diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx
index 0266206c37a26..690a200240a69 100644
--- a/api_docs/kbn_analytics.mdx
+++ b/api_docs/kbn_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics
title: "@kbn/analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics']
---
import kbnAnalyticsObj from './kbn_analytics.devdocs.json';
diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx
index ef07914f8fa36..c99246faddff3 100644
--- a/api_docs/kbn_analytics_client.mdx
+++ b/api_docs/kbn_analytics_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client
title: "@kbn/analytics-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-client plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client']
---
import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json';
diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx
index 20fbda8215e16..dab51002b381d 100644
--- a/api_docs/kbn_analytics_collection_utils.mdx
+++ b/api_docs/kbn_analytics_collection_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils
title: "@kbn/analytics-collection-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-collection-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils']
---
import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
index 27d4d95554922..568a9973bccb3 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser
title: "@kbn/analytics-shippers-elastic-v3-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser']
---
import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
index bee0e2c709105..c70ea896335f6 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common
title: "@kbn/analytics-shippers-elastic-v3-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common']
---
import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
index d14361538bf59..d64d158ba540d 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server
title: "@kbn/analytics-shippers-elastic-v3-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server']
---
import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx
index 68b35b803efac..8c65716765fe0 100644
--- a/api_docs/kbn_analytics_shippers_fullstory.mdx
+++ b/api_docs/kbn_analytics_shippers_fullstory.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory
title: "@kbn/analytics-shippers-fullstory"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-fullstory plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory']
---
import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json';
diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx
index 9024a0fdb276a..1545c6d4e7125 100644
--- a/api_docs/kbn_apm_config_loader.mdx
+++ b/api_docs/kbn_apm_config_loader.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader
title: "@kbn/apm-config-loader"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-config-loader plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader']
---
import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json';
diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx
index a84d07d07ee11..325909e4480e9 100644
--- a/api_docs/kbn_apm_data_view.mdx
+++ b/api_docs/kbn_apm_data_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view
title: "@kbn/apm-data-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-data-view plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view']
---
import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json';
diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx
index e8298efdf1a43..26ca80ec65f7d 100644
--- a/api_docs/kbn_apm_synthtrace.mdx
+++ b/api_docs/kbn_apm_synthtrace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace
title: "@kbn/apm-synthtrace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace']
---
import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json';
diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx
index 35805e4c80791..f76b0993977b2 100644
--- a/api_docs/kbn_apm_synthtrace_client.mdx
+++ b/api_docs/kbn_apm_synthtrace_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client
title: "@kbn/apm-synthtrace-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace-client plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client']
---
import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json';
diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx
index e85d293453fa7..096a975c09a41 100644
--- a/api_docs/kbn_apm_utils.mdx
+++ b/api_docs/kbn_apm_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils
title: "@kbn/apm-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils']
---
import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json';
diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx
index 4ceb8c139a34c..86f1908d62574 100644
--- a/api_docs/kbn_axe_config.mdx
+++ b/api_docs/kbn_axe_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config
title: "@kbn/axe-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/axe-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config']
---
import kbnAxeConfigObj from './kbn_axe_config.devdocs.json';
diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx
index b0232819f2275..9e47e776a5f99 100644
--- a/api_docs/kbn_bfetch_error.mdx
+++ b/api_docs/kbn_bfetch_error.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error
title: "@kbn/bfetch-error"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/bfetch-error plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error']
---
import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json';
diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx
index 4d3a1d37fd775..c9c14a6ef0ab1 100644
--- a/api_docs/kbn_calculate_auto.mdx
+++ b/api_docs/kbn_calculate_auto.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto
title: "@kbn/calculate-auto"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/calculate-auto plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto']
---
import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json';
diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx
index 5dfe19dd3d140..9dc645f34f1f7 100644
--- a/api_docs/kbn_calculate_width_from_char_count.mdx
+++ b/api_docs/kbn_calculate_width_from_char_count.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count
title: "@kbn/calculate-width-from-char-count"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/calculate-width-from-char-count plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count']
---
import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json';
diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx
index 78cf30bb57b53..ff6992ca6e152 100644
--- a/api_docs/kbn_cases_components.mdx
+++ b/api_docs/kbn_cases_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components
title: "@kbn/cases-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cases-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components']
---
import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json';
diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx
index 5aa84dc9322e1..ad952476aa655 100644
--- a/api_docs/kbn_cell_actions.mdx
+++ b/api_docs/kbn_cell_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions
title: "@kbn/cell-actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cell-actions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions']
---
import kbnCellActionsObj from './kbn_cell_actions.devdocs.json';
diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx
index c00de26cb7fdf..260bd120cdbc6 100644
--- a/api_docs/kbn_chart_expressions_common.mdx
+++ b/api_docs/kbn_chart_expressions_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common
title: "@kbn/chart-expressions-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-expressions-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common']
---
import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json';
diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx
index db52651adecbd..1a2cf277616c2 100644
--- a/api_docs/kbn_chart_icons.mdx
+++ b/api_docs/kbn_chart_icons.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons
title: "@kbn/chart-icons"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-icons plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons']
---
import kbnChartIconsObj from './kbn_chart_icons.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx
index 1a3cda9a55bdc..cbfbc0654a47e 100644
--- a/api_docs/kbn_ci_stats_core.mdx
+++ b/api_docs/kbn_ci_stats_core.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core
title: "@kbn/ci-stats-core"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-core plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core']
---
import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx
index 0c9f0f96093bb..9cf43a8bf4e5f 100644
--- a/api_docs/kbn_ci_stats_performance_metrics.mdx
+++ b/api_docs/kbn_ci_stats_performance_metrics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics
title: "@kbn/ci-stats-performance-metrics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-performance-metrics plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics']
---
import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json';
diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx
index 96121f4540681..e2aa5242cba73 100644
--- a/api_docs/kbn_ci_stats_reporter.mdx
+++ b/api_docs/kbn_ci_stats_reporter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter
title: "@kbn/ci-stats-reporter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-reporter plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter']
---
import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json';
diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx
index 4d6b5be2fedad..6f54f83359313 100644
--- a/api_docs/kbn_cli_dev_mode.mdx
+++ b/api_docs/kbn_cli_dev_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode
title: "@kbn/cli-dev-mode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cli-dev-mode plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode']
---
import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json';
diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx
index 9506c654076e4..4dee60b0400f2 100644
--- a/api_docs/kbn_code_editor.mdx
+++ b/api_docs/kbn_code_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor
title: "@kbn/code-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor']
---
import kbnCodeEditorObj from './kbn_code_editor.devdocs.json';
diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx
index 866c865b3b593..1d321c53a1fd6 100644
--- a/api_docs/kbn_code_editor_mock.mdx
+++ b/api_docs/kbn_code_editor_mock.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock
title: "@kbn/code-editor-mock"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor-mock plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock']
---
import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json';
diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx
index 6b529bb6e9c8b..98f5a0893e848 100644
--- a/api_docs/kbn_code_owners.mdx
+++ b/api_docs/kbn_code_owners.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners
title: "@kbn/code-owners"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-owners plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners']
---
import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json';
diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx
index 6ef0056b50d5f..3dd133a7c9991 100644
--- a/api_docs/kbn_coloring.mdx
+++ b/api_docs/kbn_coloring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring
title: "@kbn/coloring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/coloring plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring']
---
import kbnColoringObj from './kbn_coloring.devdocs.json';
diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx
index 8f7e0e8a1815a..92cd886766239 100644
--- a/api_docs/kbn_config.mdx
+++ b/api_docs/kbn_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config
title: "@kbn/config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config']
---
import kbnConfigObj from './kbn_config.devdocs.json';
diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx
index fe1bc5a0c7f35..9dd1240a9e63f 100644
--- a/api_docs/kbn_config_mocks.mdx
+++ b/api_docs/kbn_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks
title: "@kbn/config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks']
---
import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json';
diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx
index e08798fbb9c7f..1bcd7b59d822b 100644
--- a/api_docs/kbn_config_schema.mdx
+++ b/api_docs/kbn_config_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema
title: "@kbn/config-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-schema plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema']
---
import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json';
diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx
index 7d8151d799226..9079b7eaa123d 100644
--- a/api_docs/kbn_content_management_content_editor.mdx
+++ b/api_docs/kbn_content_management_content_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor
title: "@kbn/content-management-content-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-content-editor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor']
---
import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json';
diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
index e09776bd510a6..877570dce5a5b 100644
--- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx
+++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view
title: "@kbn/content-management-tabbed-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-tabbed-table-list-view plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view']
---
import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx
index d2e80260a6ca4..04aa3d5da3b4a 100644
--- a/api_docs/kbn_content_management_table_list_view.mdx
+++ b/api_docs/kbn_content_management_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view
title: "@kbn/content-management-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view']
---
import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx
index 5c1a03d59984a..68c0ec18e0850 100644
--- a/api_docs/kbn_content_management_table_list_view_common.mdx
+++ b/api_docs/kbn_content_management_table_list_view_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common
title: "@kbn/content-management-table-list-view-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common']
---
import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx
index 63ac806e2ecd0..7c5305431f531 100644
--- a/api_docs/kbn_content_management_table_list_view_table.mdx
+++ b/api_docs/kbn_content_management_table_list_view_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table
title: "@kbn/content-management-table-list-view-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view-table plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table']
---
import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json';
diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx
index 240948d3e4a28..da368c084ea0c 100644
--- a/api_docs/kbn_content_management_utils.mdx
+++ b/api_docs/kbn_content_management_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils
title: "@kbn/content-management-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils']
---
import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx
index 7ff3adf888e4d..0a204a56afa15 100644
--- a/api_docs/kbn_core_analytics_browser.mdx
+++ b/api_docs/kbn_core_analytics_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser
title: "@kbn/core-analytics-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser']
---
import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx
index 7b177db5f7b11..b6668b3b7b7b3 100644
--- a/api_docs/kbn_core_analytics_browser_internal.mdx
+++ b/api_docs/kbn_core_analytics_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal
title: "@kbn/core-analytics-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal']
---
import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx
index c9047b1e5258c..9662072ce8c4d 100644
--- a/api_docs/kbn_core_analytics_browser_mocks.mdx
+++ b/api_docs/kbn_core_analytics_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks
title: "@kbn/core-analytics-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks']
---
import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx
index 26c0fddb3db62..8fb068910ef2d 100644
--- a/api_docs/kbn_core_analytics_server.mdx
+++ b/api_docs/kbn_core_analytics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server
title: "@kbn/core-analytics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server']
---
import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx
index f075d189f26db..7a18c0d053f24 100644
--- a/api_docs/kbn_core_analytics_server_internal.mdx
+++ b/api_docs/kbn_core_analytics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal
title: "@kbn/core-analytics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal']
---
import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx
index c6886bd2fdd16..0e98a183afa03 100644
--- a/api_docs/kbn_core_analytics_server_mocks.mdx
+++ b/api_docs/kbn_core_analytics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks
title: "@kbn/core-analytics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks']
---
import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx
index f17ec400266c2..12342aabaf769 100644
--- a/api_docs/kbn_core_application_browser.mdx
+++ b/api_docs/kbn_core_application_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser
title: "@kbn/core-application-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser']
---
import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx
index 2f12a8ef907c7..f8d32769b8b15 100644
--- a/api_docs/kbn_core_application_browser_internal.mdx
+++ b/api_docs/kbn_core_application_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal
title: "@kbn/core-application-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal']
---
import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx
index f9b12f3c4734c..54d79bc639ee9 100644
--- a/api_docs/kbn_core_application_browser_mocks.mdx
+++ b/api_docs/kbn_core_application_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks
title: "@kbn/core-application-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks']
---
import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx
index ddc8e6544832e..4214aff23ba0d 100644
--- a/api_docs/kbn_core_application_common.mdx
+++ b/api_docs/kbn_core_application_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common
title: "@kbn/core-application-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common']
---
import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json';
diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx
index fb055e600fa8c..506ab63b5de4c 100644
--- a/api_docs/kbn_core_apps_browser_internal.mdx
+++ b/api_docs/kbn_core_apps_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal
title: "@kbn/core-apps-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal']
---
import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx
index dea53c00dee8f..59d27fbf6d9d2 100644
--- a/api_docs/kbn_core_apps_browser_mocks.mdx
+++ b/api_docs/kbn_core_apps_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks
title: "@kbn/core-apps-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks']
---
import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx
index 876268518a70d..c9f1d555786a9 100644
--- a/api_docs/kbn_core_apps_server_internal.mdx
+++ b/api_docs/kbn_core_apps_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal
title: "@kbn/core-apps-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal']
---
import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx
index cdaa56f8a455b..89f218b480d06 100644
--- a/api_docs/kbn_core_base_browser_mocks.mdx
+++ b/api_docs/kbn_core_base_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks
title: "@kbn/core-base-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks']
---
import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx
index ef7b5be3c5b80..2ca2c3d09f42f 100644
--- a/api_docs/kbn_core_base_common.mdx
+++ b/api_docs/kbn_core_base_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common
title: "@kbn/core-base-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common']
---
import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json';
diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx
index a46e85e500416..bfb3dfbecc3a1 100644
--- a/api_docs/kbn_core_base_server_internal.mdx
+++ b/api_docs/kbn_core_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal
title: "@kbn/core-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal']
---
import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx
index eb220edb9a6e6..0ea99a78ba273 100644
--- a/api_docs/kbn_core_base_server_mocks.mdx
+++ b/api_docs/kbn_core_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks
title: "@kbn/core-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks']
---
import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx
index 39401285becb6..ddc4ba57f7b1e 100644
--- a/api_docs/kbn_core_capabilities_browser_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks
title: "@kbn/core-capabilities-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks']
---
import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx
index 578ff065b5836..5a443590dbefd 100644
--- a/api_docs/kbn_core_capabilities_common.mdx
+++ b/api_docs/kbn_core_capabilities_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common
title: "@kbn/core-capabilities-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common']
---
import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx
index 55adfd0793fbd..4264623e3c459 100644
--- a/api_docs/kbn_core_capabilities_server.mdx
+++ b/api_docs/kbn_core_capabilities_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server
title: "@kbn/core-capabilities-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server']
---
import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json';
diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx
index 7d3075c45d248..3f53d58543840 100644
--- a/api_docs/kbn_core_capabilities_server_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks
title: "@kbn/core-capabilities-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks']
---
import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx
index dbcb1bb67321f..66a6cea1bd75b 100644
--- a/api_docs/kbn_core_chrome_browser.mdx
+++ b/api_docs/kbn_core_chrome_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser
title: "@kbn/core-chrome-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser']
---
import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json';
diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx
index 3f25cf3801fe1..6b29876c1001b 100644
--- a/api_docs/kbn_core_chrome_browser_mocks.mdx
+++ b/api_docs/kbn_core_chrome_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks
title: "@kbn/core-chrome-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks']
---
import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx
index 3877f1998ee0a..8f7a15c981933 100644
--- a/api_docs/kbn_core_config_server_internal.mdx
+++ b/api_docs/kbn_core_config_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal
title: "@kbn/core-config-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-config-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal']
---
import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx
index dbbbd5aec530a..657a771deaf15 100644
--- a/api_docs/kbn_core_custom_branding_browser.mdx
+++ b/api_docs/kbn_core_custom_branding_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser
title: "@kbn/core-custom-branding-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser']
---
import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx
index 2590374afdea3..ca5d98231a7e0 100644
--- a/api_docs/kbn_core_custom_branding_browser_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal
title: "@kbn/core-custom-branding-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal']
---
import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx
index e2e8051d3e569..efafe81496b5f 100644
--- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks
title: "@kbn/core-custom-branding-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks']
---
import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx
index eb53060cdef80..9b45bc6fb4625 100644
--- a/api_docs/kbn_core_custom_branding_common.mdx
+++ b/api_docs/kbn_core_custom_branding_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common
title: "@kbn/core-custom-branding-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common']
---
import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx
index f5206bb2ea733..bf39acdeb71d3 100644
--- a/api_docs/kbn_core_custom_branding_server.mdx
+++ b/api_docs/kbn_core_custom_branding_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server
title: "@kbn/core-custom-branding-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server']
---
import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx
index c1e2058bbde3d..e24ea96e8546f 100644
--- a/api_docs/kbn_core_custom_branding_server_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal
title: "@kbn/core-custom-branding-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal']
---
import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx
index 59162f3d7e46a..23c98d99ee4a0 100644
--- a/api_docs/kbn_core_custom_branding_server_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks
title: "@kbn/core-custom-branding-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks']
---
import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx
index 5afc3310f73bb..fe9094ca403ac 100644
--- a/api_docs/kbn_core_deprecations_browser.mdx
+++ b/api_docs/kbn_core_deprecations_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser
title: "@kbn/core-deprecations-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser']
---
import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx
index 4009621a5ee0f..ad12b70b172d3 100644
--- a/api_docs/kbn_core_deprecations_browser_internal.mdx
+++ b/api_docs/kbn_core_deprecations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal
title: "@kbn/core-deprecations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal']
---
import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx
index a7503e761648b..9d7ce31d8f39e 100644
--- a/api_docs/kbn_core_deprecations_browser_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks
title: "@kbn/core-deprecations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks']
---
import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx
index b1fde4c717cf2..2850f6b3a8717 100644
--- a/api_docs/kbn_core_deprecations_common.mdx
+++ b/api_docs/kbn_core_deprecations_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common
title: "@kbn/core-deprecations-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common']
---
import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx
index c769b7cdedb26..ff290c1d60bf9 100644
--- a/api_docs/kbn_core_deprecations_server.mdx
+++ b/api_docs/kbn_core_deprecations_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server
title: "@kbn/core-deprecations-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server']
---
import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx
index eb89b1f92fd8b..1f60a36b0aa8e 100644
--- a/api_docs/kbn_core_deprecations_server_internal.mdx
+++ b/api_docs/kbn_core_deprecations_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal
title: "@kbn/core-deprecations-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal']
---
import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx
index c5a0dadf2efaf..093fad53a5eff 100644
--- a/api_docs/kbn_core_deprecations_server_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks
title: "@kbn/core-deprecations-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks']
---
import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx
index 0662f814f57c4..32d3af2cbc31f 100644
--- a/api_docs/kbn_core_doc_links_browser.mdx
+++ b/api_docs/kbn_core_doc_links_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser
title: "@kbn/core-doc-links-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser']
---
import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx
index cd70bfa6c489c..66cd6ad3871b3 100644
--- a/api_docs/kbn_core_doc_links_browser_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks
title: "@kbn/core-doc-links-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks']
---
import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx
index 1a0593c6fd866..bd6e61ea6f045 100644
--- a/api_docs/kbn_core_doc_links_server.mdx
+++ b/api_docs/kbn_core_doc_links_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server
title: "@kbn/core-doc-links-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server']
---
import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json';
diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx
index fbf7f888383a9..06b4dad10f173 100644
--- a/api_docs/kbn_core_doc_links_server_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks
title: "@kbn/core-doc-links-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks']
---
import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
index 9469f4a30e821..5106b0e50183a 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal
title: "@kbn/core-elasticsearch-client-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal']
---
import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
index deebb231252ab..fda28d6de853a 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks
title: "@kbn/core-elasticsearch-client-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks']
---
import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx
index cec76e7d6b57d..1d4c321dcf166 100644
--- a/api_docs/kbn_core_elasticsearch_server.mdx
+++ b/api_docs/kbn_core_elasticsearch_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server
title: "@kbn/core-elasticsearch-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server']
---
import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx
index 4d2e8bf270196..1b07f53ce0909 100644
--- a/api_docs/kbn_core_elasticsearch_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal
title: "@kbn/core-elasticsearch-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal']
---
import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx
index 65dd63ea828f2..869ddc51920af 100644
--- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks
title: "@kbn/core-elasticsearch-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks']
---
import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx
index 627cc2520da4b..1fdf99dd10787 100644
--- a/api_docs/kbn_core_environment_server_internal.mdx
+++ b/api_docs/kbn_core_environment_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal
title: "@kbn/core-environment-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal']
---
import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx
index 640cc365b6f0d..2282f04fcaf9b 100644
--- a/api_docs/kbn_core_environment_server_mocks.mdx
+++ b/api_docs/kbn_core_environment_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks
title: "@kbn/core-environment-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks']
---
import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx
index 51a716da07273..0d7f4bacf65aa 100644
--- a/api_docs/kbn_core_execution_context_browser.mdx
+++ b/api_docs/kbn_core_execution_context_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser
title: "@kbn/core-execution-context-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser']
---
import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx
index 218f3ee46e35b..4365762d5bf54 100644
--- a/api_docs/kbn_core_execution_context_browser_internal.mdx
+++ b/api_docs/kbn_core_execution_context_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal
title: "@kbn/core-execution-context-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal']
---
import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx
index 832ebdc4f505e..0d2ed14d9224c 100644
--- a/api_docs/kbn_core_execution_context_browser_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks
title: "@kbn/core-execution-context-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks']
---
import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx
index cdde287062066..7e45f6f5f9b2d 100644
--- a/api_docs/kbn_core_execution_context_common.mdx
+++ b/api_docs/kbn_core_execution_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common
title: "@kbn/core-execution-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common']
---
import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx
index 65bad55967eea..cc869e7634e2d 100644
--- a/api_docs/kbn_core_execution_context_server.mdx
+++ b/api_docs/kbn_core_execution_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server
title: "@kbn/core-execution-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server']
---
import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx
index 081f510bab1f9..c1d41eb5f5b2d 100644
--- a/api_docs/kbn_core_execution_context_server_internal.mdx
+++ b/api_docs/kbn_core_execution_context_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal
title: "@kbn/core-execution-context-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal']
---
import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx
index 95926f50176a7..5381f0fdab50c 100644
--- a/api_docs/kbn_core_execution_context_server_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks
title: "@kbn/core-execution-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks']
---
import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx
index c48495224d547..2dd1638442817 100644
--- a/api_docs/kbn_core_fatal_errors_browser.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser
title: "@kbn/core-fatal-errors-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser']
---
import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json';
diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
index f8877417e36a8..99798c93b1b74 100644
--- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks
title: "@kbn/core-fatal-errors-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks']
---
import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx
index b558c9312f63f..de404fb3e0c05 100644
--- a/api_docs/kbn_core_http_browser.mdx
+++ b/api_docs/kbn_core_http_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser
title: "@kbn/core-http-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser']
---
import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx
index 3d17c5fb6e74f..903b5859325ce 100644
--- a/api_docs/kbn_core_http_browser_internal.mdx
+++ b/api_docs/kbn_core_http_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal
title: "@kbn/core-http-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal']
---
import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx
index 326239d33ecc9..f8a441132bff3 100644
--- a/api_docs/kbn_core_http_browser_mocks.mdx
+++ b/api_docs/kbn_core_http_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks
title: "@kbn/core-http-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks']
---
import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx
index 2e48f5da6a139..7fa5824dafb66 100644
--- a/api_docs/kbn_core_http_common.mdx
+++ b/api_docs/kbn_core_http_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common
title: "@kbn/core-http-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common']
---
import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json';
diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx
index 978788c30a0b7..2a6c98d76001c 100644
--- a/api_docs/kbn_core_http_context_server_mocks.mdx
+++ b/api_docs/kbn_core_http_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks
title: "@kbn/core-http-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-context-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks']
---
import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx
index 2f2cd02edc94e..88dfccd74b6c8 100644
--- a/api_docs/kbn_core_http_request_handler_context_server.mdx
+++ b/api_docs/kbn_core_http_request_handler_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server
title: "@kbn/core-http-request-handler-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-request-handler-context-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server']
---
import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx
index f2cc29f33a559..105d07744289a 100644
--- a/api_docs/kbn_core_http_resources_server.mdx
+++ b/api_docs/kbn_core_http_resources_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server
title: "@kbn/core-http-resources-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server']
---
import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx
index e552deeee03d9..10ba6c5171998 100644
--- a/api_docs/kbn_core_http_resources_server_internal.mdx
+++ b/api_docs/kbn_core_http_resources_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal
title: "@kbn/core-http-resources-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal']
---
import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx
index 103d963185953..f5d4a42b63a63 100644
--- a/api_docs/kbn_core_http_resources_server_mocks.mdx
+++ b/api_docs/kbn_core_http_resources_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks
title: "@kbn/core-http-resources-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks']
---
import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx
index c0e51954b659b..0b609b0d9fb05 100644
--- a/api_docs/kbn_core_http_router_server_internal.mdx
+++ b/api_docs/kbn_core_http_router_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal
title: "@kbn/core-http-router-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal']
---
import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx
index 1e863f5557bdb..304c25dc83d4c 100644
--- a/api_docs/kbn_core_http_router_server_mocks.mdx
+++ b/api_docs/kbn_core_http_router_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks
title: "@kbn/core-http-router-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks']
---
import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx
index 1593bd2c338c6..0ab6d565a670e 100644
--- a/api_docs/kbn_core_http_server.mdx
+++ b/api_docs/kbn_core_http_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server
title: "@kbn/core-http-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server']
---
import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json';
diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx
index 0fd75d7030f42..75c1d32578974 100644
--- a/api_docs/kbn_core_http_server_internal.mdx
+++ b/api_docs/kbn_core_http_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal
title: "@kbn/core-http-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal']
---
import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx
index feba59ea87527..4c6417664901a 100644
--- a/api_docs/kbn_core_http_server_mocks.mdx
+++ b/api_docs/kbn_core_http_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks
title: "@kbn/core-http-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks']
---
import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx
index c6acf55d57c15..fd4a198e34fae 100644
--- a/api_docs/kbn_core_i18n_browser.mdx
+++ b/api_docs/kbn_core_i18n_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser
title: "@kbn/core-i18n-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser']
---
import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx
index db72b53d5ac95..07bc8129e321e 100644
--- a/api_docs/kbn_core_i18n_browser_mocks.mdx
+++ b/api_docs/kbn_core_i18n_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks
title: "@kbn/core-i18n-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks']
---
import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx
index f5819e791ba57..9a0b73a66d182 100644
--- a/api_docs/kbn_core_i18n_server.mdx
+++ b/api_docs/kbn_core_i18n_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server
title: "@kbn/core-i18n-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server']
---
import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx
index 6a30c8c9f31ae..639b97329653f 100644
--- a/api_docs/kbn_core_i18n_server_internal.mdx
+++ b/api_docs/kbn_core_i18n_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal
title: "@kbn/core-i18n-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal']
---
import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx
index 2df1befcfc750..32bc2534136c8 100644
--- a/api_docs/kbn_core_i18n_server_mocks.mdx
+++ b/api_docs/kbn_core_i18n_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks
title: "@kbn/core-i18n-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks']
---
import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
index 6206e6dde14a4..f400a2bb8d0d5 100644
--- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
+++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks
title: "@kbn/core-injected-metadata-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks']
---
import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx
index 03dfea619fb28..723cf32dfd847 100644
--- a/api_docs/kbn_core_integrations_browser_internal.mdx
+++ b/api_docs/kbn_core_integrations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal
title: "@kbn/core-integrations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal']
---
import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx
index dfe6e16942527..7441444df9dec 100644
--- a/api_docs/kbn_core_integrations_browser_mocks.mdx
+++ b/api_docs/kbn_core_integrations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks
title: "@kbn/core-integrations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks']
---
import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx
index 6c0478473d5eb..15eb3f157f830 100644
--- a/api_docs/kbn_core_lifecycle_browser.mdx
+++ b/api_docs/kbn_core_lifecycle_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser
title: "@kbn/core-lifecycle-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser']
---
import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx
index 32635a2fd2399..c41a43af63c4a 100644
--- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks
title: "@kbn/core-lifecycle-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks']
---
import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx
index 3bbc63bf01679..772708bbd92e2 100644
--- a/api_docs/kbn_core_lifecycle_server.mdx
+++ b/api_docs/kbn_core_lifecycle_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server
title: "@kbn/core-lifecycle-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server']
---
import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json';
diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx
index 90241b2897625..a02739a32c80d 100644
--- a/api_docs/kbn_core_lifecycle_server_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks
title: "@kbn/core-lifecycle-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks']
---
import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx
index a3ec7cab2ccb0..6debe13186733 100644
--- a/api_docs/kbn_core_logging_browser_mocks.mdx
+++ b/api_docs/kbn_core_logging_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks
title: "@kbn/core-logging-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks']
---
import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx
index 6113d2b60d61f..7e6b52528f740 100644
--- a/api_docs/kbn_core_logging_common_internal.mdx
+++ b/api_docs/kbn_core_logging_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal
title: "@kbn/core-logging-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-common-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal']
---
import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx
index 6d5b8e09b765d..75185d79a6b72 100644
--- a/api_docs/kbn_core_logging_server.mdx
+++ b/api_docs/kbn_core_logging_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server
title: "@kbn/core-logging-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server']
---
import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx
index 096b85dbfdb88..8d45f15a9dc61 100644
--- a/api_docs/kbn_core_logging_server_internal.mdx
+++ b/api_docs/kbn_core_logging_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal
title: "@kbn/core-logging-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal']
---
import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx
index 5262603d6478e..9d74924886779 100644
--- a/api_docs/kbn_core_logging_server_mocks.mdx
+++ b/api_docs/kbn_core_logging_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks
title: "@kbn/core-logging-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks']
---
import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx
index aa867cb1b93b7..9bb63720d4519 100644
--- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal
title: "@kbn/core-metrics-collectors-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal']
---
import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
index e4e4c8eb2c3cb..99c9ea5429eb1 100644
--- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks
title: "@kbn/core-metrics-collectors-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks']
---
import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx
index 677f15700444a..5c847095613b4 100644
--- a/api_docs/kbn_core_metrics_server.mdx
+++ b/api_docs/kbn_core_metrics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server
title: "@kbn/core-metrics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server']
---
import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx
index 845e74808475f..e9a9fbc64a4ed 100644
--- a/api_docs/kbn_core_metrics_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal
title: "@kbn/core-metrics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal']
---
import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx
index ff6cfbdca6eb5..7ecd0b043606a 100644
--- a/api_docs/kbn_core_metrics_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks
title: "@kbn/core-metrics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks']
---
import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx
index b89bcebfede68..3a54ebfe39d8a 100644
--- a/api_docs/kbn_core_mount_utils_browser.mdx
+++ b/api_docs/kbn_core_mount_utils_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser
title: "@kbn/core-mount-utils-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-mount-utils-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser']
---
import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json';
diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx
index 33a79164503f9..ecd1974e0621e 100644
--- a/api_docs/kbn_core_node_server.mdx
+++ b/api_docs/kbn_core_node_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server
title: "@kbn/core-node-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server']
---
import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json';
diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx
index aea0fdf9701a0..6663cb037daf2 100644
--- a/api_docs/kbn_core_node_server_internal.mdx
+++ b/api_docs/kbn_core_node_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal
title: "@kbn/core-node-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal']
---
import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx
index d806418afd319..0f440625c9090 100644
--- a/api_docs/kbn_core_node_server_mocks.mdx
+++ b/api_docs/kbn_core_node_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks
title: "@kbn/core-node-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks']
---
import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx
index b607a07221395..0067d326438c4 100644
--- a/api_docs/kbn_core_notifications_browser.mdx
+++ b/api_docs/kbn_core_notifications_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser
title: "@kbn/core-notifications-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser']
---
import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx
index 419278892e801..4ca72d13812fe 100644
--- a/api_docs/kbn_core_notifications_browser_internal.mdx
+++ b/api_docs/kbn_core_notifications_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal
title: "@kbn/core-notifications-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal']
---
import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx
index b44d18fec7aee..648fa9a59a66f 100644
--- a/api_docs/kbn_core_notifications_browser_mocks.mdx
+++ b/api_docs/kbn_core_notifications_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks
title: "@kbn/core-notifications-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks']
---
import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx
index 9547089954f6e..2f544dfa0b595 100644
--- a/api_docs/kbn_core_overlays_browser.mdx
+++ b/api_docs/kbn_core_overlays_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser
title: "@kbn/core-overlays-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser']
---
import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx
index 81c9332bee482..31b8363631d90 100644
--- a/api_docs/kbn_core_overlays_browser_internal.mdx
+++ b/api_docs/kbn_core_overlays_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal
title: "@kbn/core-overlays-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal']
---
import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx
index 19f7e95299fc3..f869fb78ab434 100644
--- a/api_docs/kbn_core_overlays_browser_mocks.mdx
+++ b/api_docs/kbn_core_overlays_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks
title: "@kbn/core-overlays-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks']
---
import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx
index b0a98007ac6a3..4ce6b25dc82f1 100644
--- a/api_docs/kbn_core_plugins_browser.mdx
+++ b/api_docs/kbn_core_plugins_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser
title: "@kbn/core-plugins-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser']
---
import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx
index 33cf5715a414e..74e2f1ca5e624 100644
--- a/api_docs/kbn_core_plugins_browser_mocks.mdx
+++ b/api_docs/kbn_core_plugins_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks
title: "@kbn/core-plugins-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks']
---
import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx
index 6a25757aa525f..d98ca06bf612d 100644
--- a/api_docs/kbn_core_plugins_contracts_browser.mdx
+++ b/api_docs/kbn_core_plugins_contracts_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser
title: "@kbn/core-plugins-contracts-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-contracts-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser']
---
import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx
index 325d27316909e..2d06a8b3ff14e 100644
--- a/api_docs/kbn_core_plugins_contracts_server.mdx
+++ b/api_docs/kbn_core_plugins_contracts_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server
title: "@kbn/core-plugins-contracts-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-contracts-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server']
---
import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx
index 5a91383572762..28db3d9cac474 100644
--- a/api_docs/kbn_core_plugins_server.mdx
+++ b/api_docs/kbn_core_plugins_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server
title: "@kbn/core-plugins-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server']
---
import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json';
diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx
index 8468f3196415a..645e0b02764ad 100644
--- a/api_docs/kbn_core_plugins_server_mocks.mdx
+++ b/api_docs/kbn_core_plugins_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks
title: "@kbn/core-plugins-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks']
---
import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx
index c73e535065fbe..25c412ab41489 100644
--- a/api_docs/kbn_core_preboot_server.mdx
+++ b/api_docs/kbn_core_preboot_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server
title: "@kbn/core-preboot-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server']
---
import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json';
diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx
index ea93e9e4ad41c..8a2da5d889d01 100644
--- a/api_docs/kbn_core_preboot_server_mocks.mdx
+++ b/api_docs/kbn_core_preboot_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks
title: "@kbn/core-preboot-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks']
---
import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx
index 45c38f78a76f9..76f56aab806d6 100644
--- a/api_docs/kbn_core_rendering_browser_mocks.mdx
+++ b/api_docs/kbn_core_rendering_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks
title: "@kbn/core-rendering-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks']
---
import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx
index 4dbe0929624e9..febad0a87348b 100644
--- a/api_docs/kbn_core_rendering_server_internal.mdx
+++ b/api_docs/kbn_core_rendering_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal
title: "@kbn/core-rendering-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal']
---
import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx
index b687493b1908d..b516bd556a7be 100644
--- a/api_docs/kbn_core_rendering_server_mocks.mdx
+++ b/api_docs/kbn_core_rendering_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks
title: "@kbn/core-rendering-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks']
---
import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx
index 2003684fe2fa5..d05993b3ee862 100644
--- a/api_docs/kbn_core_root_server_internal.mdx
+++ b/api_docs/kbn_core_root_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal
title: "@kbn/core-root-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-root-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal']
---
import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx
index 520b00bc4683a..e0342c2296a32 100644
--- a/api_docs/kbn_core_saved_objects_api_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_api_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser
title: "@kbn/core-saved-objects-api-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser']
---
import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx
index 0440e77befc47..80d5522d09a87 100644
--- a/api_docs/kbn_core_saved_objects_api_server.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server
title: "@kbn/core-saved-objects-api-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server']
---
import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
index cba98a2c44d91..6a45ebe10cb2d 100644
--- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks
title: "@kbn/core-saved-objects-api-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks']
---
import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx
index 56b3f3fcae640..c5cc35c38d536 100644
--- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal
title: "@kbn/core-saved-objects-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal']
---
import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
index 0b5ec1725fc57..9dab18ce0dda3 100644
--- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks
title: "@kbn/core-saved-objects-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks']
---
import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx
index 175d3615df9b1..4a617ceca43a3 100644
--- a/api_docs/kbn_core_saved_objects_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser
title: "@kbn/core-saved-objects-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser']
---
import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx
index b8f8509b3d085..556c52eb0cf70 100644
--- a/api_docs/kbn_core_saved_objects_browser_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal
title: "@kbn/core-saved-objects-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal']
---
import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx
index c0ec7684588bf..d4011ecc8ac09 100644
--- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks
title: "@kbn/core-saved-objects-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks']
---
import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx
index d9f54d516e95d..09bc97c71f389 100644
--- a/api_docs/kbn_core_saved_objects_common.mdx
+++ b/api_docs/kbn_core_saved_objects_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common
title: "@kbn/core-saved-objects-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common']
---
import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
index b3ddc7108b63a..1d3e53e5f37d6 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal
title: "@kbn/core-saved-objects-import-export-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal']
---
import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
index 554388073c9ac..d54c9a06c999f 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks
title: "@kbn/core-saved-objects-import-export-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks']
---
import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
index 055ff99eecc81..5d253a1fcebfe 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal
title: "@kbn/core-saved-objects-migration-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal']
---
import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
index 4457a55cd0b04..bc90bb029a561 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks
title: "@kbn/core-saved-objects-migration-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks']
---
import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx
index 19d9d6d98a3d6..f0acc463e0d71 100644
--- a/api_docs/kbn_core_saved_objects_server.mdx
+++ b/api_docs/kbn_core_saved_objects_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server
title: "@kbn/core-saved-objects-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server']
---
import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx
index 1e142b66d2856..d10976e32036d 100644
--- a/api_docs/kbn_core_saved_objects_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal
title: "@kbn/core-saved-objects-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal']
---
import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx
index 09099196954c3..c133dd6496f4d 100644
--- a/api_docs/kbn_core_saved_objects_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks
title: "@kbn/core-saved-objects-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks']
---
import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx
index 4ae6b60a55606..6189862dde2fe 100644
--- a/api_docs/kbn_core_saved_objects_utils_server.mdx
+++ b/api_docs/kbn_core_saved_objects_utils_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server
title: "@kbn/core-saved-objects-utils-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-utils-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server']
---
import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx
index 12a74fb1f4223..1e0ac27003ed2 100644
--- a/api_docs/kbn_core_security_browser.mdx
+++ b/api_docs/kbn_core_security_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser
title: "@kbn/core-security-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser']
---
import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx
index 1f872d6745c24..c822adadfd52b 100644
--- a/api_docs/kbn_core_security_browser_internal.mdx
+++ b/api_docs/kbn_core_security_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal
title: "@kbn/core-security-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal']
---
import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx
index e119f75f43bdc..74f4494728607 100644
--- a/api_docs/kbn_core_security_browser_mocks.mdx
+++ b/api_docs/kbn_core_security_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks
title: "@kbn/core-security-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks']
---
import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx
index 32d21af09688e..21d7c07863849 100644
--- a/api_docs/kbn_core_security_common.mdx
+++ b/api_docs/kbn_core_security_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common
title: "@kbn/core-security-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common']
---
import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json';
diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx
index 91fb4150abc18..245fb3fe42383 100644
--- a/api_docs/kbn_core_security_server.mdx
+++ b/api_docs/kbn_core_security_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server
title: "@kbn/core-security-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server']
---
import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json';
diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx
index 01266ac8bf68d..89f3194d4c5b6 100644
--- a/api_docs/kbn_core_security_server_internal.mdx
+++ b/api_docs/kbn_core_security_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal
title: "@kbn/core-security-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal']
---
import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx
index cbe0ee9b0c136..f288e62b8c557 100644
--- a/api_docs/kbn_core_security_server_mocks.mdx
+++ b/api_docs/kbn_core_security_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks
title: "@kbn/core-security-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-security-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks']
---
import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx
index a571d3881a413..b5129581076d6 100644
--- a/api_docs/kbn_core_status_common.mdx
+++ b/api_docs/kbn_core_status_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common
title: "@kbn/core-status-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common']
---
import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json';
diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx
index 65138cfd3613e..30c76329f6cc1 100644
--- a/api_docs/kbn_core_status_common_internal.mdx
+++ b/api_docs/kbn_core_status_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal
title: "@kbn/core-status-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal']
---
import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json';
diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx
index 1b01a8a6000ac..6c6807dda84ac 100644
--- a/api_docs/kbn_core_status_server.mdx
+++ b/api_docs/kbn_core_status_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server
title: "@kbn/core-status-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server']
---
import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json';
diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx
index 87a7fc61321ad..88ff212d20753 100644
--- a/api_docs/kbn_core_status_server_internal.mdx
+++ b/api_docs/kbn_core_status_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal
title: "@kbn/core-status-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal']
---
import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx
index ae4adf1296bb2..be958b13cde01 100644
--- a/api_docs/kbn_core_status_server_mocks.mdx
+++ b/api_docs/kbn_core_status_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks
title: "@kbn/core-status-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks']
---
import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
index 0eef0d401957f..c296da59987c1 100644
--- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
+++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters
title: "@kbn/core-test-helpers-deprecations-getters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters']
---
import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
index 7cb6ea6631a6b..5eb1532587066 100644
--- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
+++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser
title: "@kbn/core-test-helpers-http-setup-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser']
---
import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx
index 72068a5586c23..6d32ea2acd858 100644
--- a/api_docs/kbn_core_test_helpers_kbn_server.mdx
+++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server
title: "@kbn/core-test-helpers-kbn-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-kbn-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server']
---
import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx
index aa582a4c54e24..bf5ab83cd3dbd 100644
--- a/api_docs/kbn_core_test_helpers_model_versions.mdx
+++ b/api_docs/kbn_core_test_helpers_model_versions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions
title: "@kbn/core-test-helpers-model-versions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-model-versions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions']
---
import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
index 2a024ac64fa92..ed2c87c8d603a 100644
--- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
+++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer
title: "@kbn/core-test-helpers-so-type-serializer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer']
---
import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json';
diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx
index 0f7c487a7b131..4f825f001700f 100644
--- a/api_docs/kbn_core_test_helpers_test_utils.mdx
+++ b/api_docs/kbn_core_test_helpers_test_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils
title: "@kbn/core-test-helpers-test-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-test-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils']
---
import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json';
diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx
index 8fdc9f9bf0e44..85f4acceadcee 100644
--- a/api_docs/kbn_core_theme_browser.mdx
+++ b/api_docs/kbn_core_theme_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser
title: "@kbn/core-theme-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser']
---
import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json';
diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx
index a11ae8572b3fa..f85cb113b68f0 100644
--- a/api_docs/kbn_core_theme_browser_mocks.mdx
+++ b/api_docs/kbn_core_theme_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks
title: "@kbn/core-theme-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks']
---
import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx
index 1abcef2cef0b1..5128e17c1785f 100644
--- a/api_docs/kbn_core_ui_settings_browser.mdx
+++ b/api_docs/kbn_core_ui_settings_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser
title: "@kbn/core-ui-settings-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser']
---
import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx
index 86e92a754753c..d94e517c67b2c 100644
--- a/api_docs/kbn_core_ui_settings_browser_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal
title: "@kbn/core-ui-settings-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal']
---
import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx
index dcfc5302cdecd..4120662a38f5d 100644
--- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks
title: "@kbn/core-ui-settings-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks']
---
import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx
index 5b655735d154f..d09f1cf33f833 100644
--- a/api_docs/kbn_core_ui_settings_common.mdx
+++ b/api_docs/kbn_core_ui_settings_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common
title: "@kbn/core-ui-settings-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common']
---
import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx
index 86710ab969d19..ca048814e059a 100644
--- a/api_docs/kbn_core_ui_settings_server.mdx
+++ b/api_docs/kbn_core_ui_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server
title: "@kbn/core-ui-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server']
---
import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx
index 717f7c673b00e..4b5ecb14752c7 100644
--- a/api_docs/kbn_core_ui_settings_server_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal
title: "@kbn/core-ui-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal']
---
import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx
index 74ee9688828f9..27b16fa43ccea 100644
--- a/api_docs/kbn_core_ui_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks
title: "@kbn/core-ui-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks']
---
import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx
index 7ce60ee6c70ac..8e6c8a1ff904e 100644
--- a/api_docs/kbn_core_usage_data_server.mdx
+++ b/api_docs/kbn_core_usage_data_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server
title: "@kbn/core-usage-data-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server']
---
import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx
index 3e88ed0884024..cc84cea0f733c 100644
--- a/api_docs/kbn_core_usage_data_server_internal.mdx
+++ b/api_docs/kbn_core_usage_data_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal
title: "@kbn/core-usage-data-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal']
---
import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx
index 57631e9c886a4..a18a4b9e607a6 100644
--- a/api_docs/kbn_core_usage_data_server_mocks.mdx
+++ b/api_docs/kbn_core_usage_data_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks
title: "@kbn/core-usage-data-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks']
---
import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx
index 6c8b57057b43a..8156723ed27fc 100644
--- a/api_docs/kbn_core_user_settings_server.mdx
+++ b/api_docs/kbn_core_user_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server
title: "@kbn/core-user-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server']
---
import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx
index de3eb5db57c0b..74c5eaf226c27 100644
--- a/api_docs/kbn_core_user_settings_server_internal.mdx
+++ b/api_docs/kbn_core_user_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal
title: "@kbn/core-user-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-internal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal']
---
import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx
index 275c0194b27a7..0747c4c994a0d 100644
--- a/api_docs/kbn_core_user_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_user_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks
title: "@kbn/core-user-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks']
---
import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx
index aa13d65f380ff..7e09294109071 100644
--- a/api_docs/kbn_crypto.mdx
+++ b/api_docs/kbn_crypto.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto
title: "@kbn/crypto"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto']
---
import kbnCryptoObj from './kbn_crypto.devdocs.json';
diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx
index 1d97580b4a95d..513ee828dc01f 100644
--- a/api_docs/kbn_crypto_browser.mdx
+++ b/api_docs/kbn_crypto_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser
title: "@kbn/crypto-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser']
---
import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json';
diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx
index 295836997ef55..285cd9c3de222 100644
--- a/api_docs/kbn_custom_icons.mdx
+++ b/api_docs/kbn_custom_icons.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons
title: "@kbn/custom-icons"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/custom-icons plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons']
---
import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json';
diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx
index d18725804a080..afe508066ac73 100644
--- a/api_docs/kbn_custom_integrations.mdx
+++ b/api_docs/kbn_custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations
title: "@kbn/custom-integrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/custom-integrations plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations']
---
import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json';
diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx
index 3a2b0b82b2f8d..8290aa0680f95 100644
--- a/api_docs/kbn_cypress_config.mdx
+++ b/api_docs/kbn_cypress_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config
title: "@kbn/cypress-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cypress-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config']
---
import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json';
diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx
index f0bac9ac900f5..8218cdc2b1d03 100644
--- a/api_docs/kbn_data_forge.mdx
+++ b/api_docs/kbn_data_forge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge
title: "@kbn/data-forge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-forge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge']
---
import kbnDataForgeObj from './kbn_data_forge.devdocs.json';
diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx
index f2df9d5740657..06051368c6b14 100644
--- a/api_docs/kbn_data_service.mdx
+++ b/api_docs/kbn_data_service.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service
title: "@kbn/data-service"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-service plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service']
---
import kbnDataServiceObj from './kbn_data_service.devdocs.json';
diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx
index d245d7a25459f..e6113baf753ad 100644
--- a/api_docs/kbn_data_stream_adapter.mdx
+++ b/api_docs/kbn_data_stream_adapter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter
title: "@kbn/data-stream-adapter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-stream-adapter plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter']
---
import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json';
diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx
index 8607aee930157..3d4d3e7658870 100644
--- a/api_docs/kbn_data_view_utils.mdx
+++ b/api_docs/kbn_data_view_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils
title: "@kbn/data-view-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-view-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils']
---
import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json';
diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx
index ce7d9c940c420..70fc182a06204 100644
--- a/api_docs/kbn_datemath.mdx
+++ b/api_docs/kbn_datemath.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath
title: "@kbn/datemath"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/datemath plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath']
---
import kbnDatemathObj from './kbn_datemath.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx
index 309b5f8707d1e..3e7172fd8879c 100644
--- a/api_docs/kbn_deeplinks_analytics.mdx
+++ b/api_docs/kbn_deeplinks_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics
title: "@kbn/deeplinks-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-analytics plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics']
---
import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx
index 61c6ade944808..66fc3dfa31517 100644
--- a/api_docs/kbn_deeplinks_devtools.mdx
+++ b/api_docs/kbn_deeplinks_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools
title: "@kbn/deeplinks-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-devtools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools']
---
import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx
index 3c3ed137f2004..e6355a2af33ff 100644
--- a/api_docs/kbn_deeplinks_fleet.mdx
+++ b/api_docs/kbn_deeplinks_fleet.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet
title: "@kbn/deeplinks-fleet"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-fleet plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet']
---
import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx
index bb0e586571fb6..b769caf16d7c0 100644
--- a/api_docs/kbn_deeplinks_management.mdx
+++ b/api_docs/kbn_deeplinks_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management
title: "@kbn/deeplinks-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-management plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management']
---
import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx
index 8f4d63c40747a..2f4c2c7aa7fe2 100644
--- a/api_docs/kbn_deeplinks_ml.mdx
+++ b/api_docs/kbn_deeplinks_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml
title: "@kbn/deeplinks-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-ml plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml']
---
import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx
index 1f076393b34ca..f6c2f902f3976 100644
--- a/api_docs/kbn_deeplinks_observability.mdx
+++ b/api_docs/kbn_deeplinks_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability
title: "@kbn/deeplinks-observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-observability plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability']
---
import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx
index 1c02f87a11674..d00f7ad0a87d9 100644
--- a/api_docs/kbn_deeplinks_search.mdx
+++ b/api_docs/kbn_deeplinks_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search
title: "@kbn/deeplinks-search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-search plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search']
---
import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx
index 0916d8645b244..9837cb248de99 100644
--- a/api_docs/kbn_deeplinks_security.mdx
+++ b/api_docs/kbn_deeplinks_security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security
title: "@kbn/deeplinks-security"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-security plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security']
---
import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx
index e6eda43dc1d9d..19484a172a087 100644
--- a/api_docs/kbn_deeplinks_shared.mdx
+++ b/api_docs/kbn_deeplinks_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared
title: "@kbn/deeplinks-shared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-shared plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared']
---
import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json';
diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx
index 9ec9cc34c98b7..67c104a34037f 100644
--- a/api_docs/kbn_default_nav_analytics.mdx
+++ b/api_docs/kbn_default_nav_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics
title: "@kbn/default-nav-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-analytics plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics']
---
import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json';
diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx
index 3d49804a57e0e..36d5b2fc5f0c8 100644
--- a/api_docs/kbn_default_nav_devtools.mdx
+++ b/api_docs/kbn_default_nav_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools
title: "@kbn/default-nav-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-devtools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools']
---
import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json';
diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx
index 392fb09b15433..6cf1e08f65461 100644
--- a/api_docs/kbn_default_nav_management.mdx
+++ b/api_docs/kbn_default_nav_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management
title: "@kbn/default-nav-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-management plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management']
---
import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json';
diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx
index 8892b12474a4c..876fa9595c288 100644
--- a/api_docs/kbn_default_nav_ml.mdx
+++ b/api_docs/kbn_default_nav_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml
title: "@kbn/default-nav-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-ml plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml']
---
import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json';
diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx
index c6eef0acabbba..2b01a3124dd62 100644
--- a/api_docs/kbn_dev_cli_errors.mdx
+++ b/api_docs/kbn_dev_cli_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors
title: "@kbn/dev-cli-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-errors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors']
---
import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json';
diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx
index d93a907e6f9bb..040e6d5faaa37 100644
--- a/api_docs/kbn_dev_cli_runner.mdx
+++ b/api_docs/kbn_dev_cli_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner
title: "@kbn/dev-cli-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-runner plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner']
---
import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json';
diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx
index 1986c32f1b154..b19c838382cb2 100644
--- a/api_docs/kbn_dev_proc_runner.mdx
+++ b/api_docs/kbn_dev_proc_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner
title: "@kbn/dev-proc-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-proc-runner plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner']
---
import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json';
diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx
index ae20b67a11f1f..02f6932678e50 100644
--- a/api_docs/kbn_dev_utils.mdx
+++ b/api_docs/kbn_dev_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils
title: "@kbn/dev-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils']
---
import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json';
diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx
index cce6fe3b155e7..ae1f72bd85d71 100644
--- a/api_docs/kbn_discover_utils.mdx
+++ b/api_docs/kbn_discover_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils
title: "@kbn/discover-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/discover-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils']
---
import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json';
diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx
index aa00fc60b8bbf..d317ef3710703 100644
--- a/api_docs/kbn_doc_links.mdx
+++ b/api_docs/kbn_doc_links.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links
title: "@kbn/doc-links"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/doc-links plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links']
---
import kbnDocLinksObj from './kbn_doc_links.devdocs.json';
diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx
index 8e99112b0087a..2d01243368a30 100644
--- a/api_docs/kbn_docs_utils.mdx
+++ b/api_docs/kbn_docs_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils
title: "@kbn/docs-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/docs-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils']
---
import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json';
diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx
index e3695ef29c5ff..49721c873cc67 100644
--- a/api_docs/kbn_dom_drag_drop.mdx
+++ b/api_docs/kbn_dom_drag_drop.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop
title: "@kbn/dom-drag-drop"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dom-drag-drop plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop']
---
import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json';
diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx
index 0cd988a69ad42..5c4f362c48a12 100644
--- a/api_docs/kbn_ebt_tools.mdx
+++ b/api_docs/kbn_ebt_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools
title: "@kbn/ebt-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ebt-tools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools']
---
import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json';
diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx
index bbb0367472860..2684fd2a92ebe 100644
--- a/api_docs/kbn_ecs_data_quality_dashboard.mdx
+++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard
title: "@kbn/ecs-data-quality-dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ecs-data-quality-dashboard plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard']
---
import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json';
diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx
index 9cea7141133ad..843556bb76e86 100644
--- a/api_docs/kbn_elastic_agent_utils.mdx
+++ b/api_docs/kbn_elastic_agent_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils
title: "@kbn/elastic-agent-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-agent-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils']
---
import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json';
diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx
index cd7f0f6d71b09..26ee1604a56f3 100644
--- a/api_docs/kbn_elastic_assistant.mdx
+++ b/api_docs/kbn_elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant
title: "@kbn/elastic-assistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-assistant plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant']
---
import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json';
diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx
index ba486cabf38f2..7611184bdc72d 100644
--- a/api_docs/kbn_elastic_assistant_common.mdx
+++ b/api_docs/kbn_elastic_assistant_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common
title: "@kbn/elastic-assistant-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-assistant-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common']
---
import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json';
diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx
index e5323e9cd85e9..a5926d79cbf35 100644
--- a/api_docs/kbn_es.mdx
+++ b/api_docs/kbn_es.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es
title: "@kbn/es"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es']
---
import kbnEsObj from './kbn_es.devdocs.json';
diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx
index 0adec688d527e..3c3a630cfcc40 100644
--- a/api_docs/kbn_es_archiver.mdx
+++ b/api_docs/kbn_es_archiver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver
title: "@kbn/es-archiver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-archiver plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver']
---
import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json';
diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx
index b0c266a62093b..720805bac91d9 100644
--- a/api_docs/kbn_es_errors.mdx
+++ b/api_docs/kbn_es_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors
title: "@kbn/es-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-errors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors']
---
import kbnEsErrorsObj from './kbn_es_errors.devdocs.json';
diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx
index 37595d6249acd..6f2a1acac4a0b 100644
--- a/api_docs/kbn_es_query.mdx
+++ b/api_docs/kbn_es_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query
title: "@kbn/es-query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-query plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query']
---
import kbnEsQueryObj from './kbn_es_query.devdocs.json';
diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx
index 9cef5c76ea35d..2e35e13d9fbcc 100644
--- a/api_docs/kbn_es_types.mdx
+++ b/api_docs/kbn_es_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types
title: "@kbn/es-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types']
---
import kbnEsTypesObj from './kbn_es_types.devdocs.json';
diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx
index 6214dd18df301..0d6be432c7cb4 100644
--- a/api_docs/kbn_eslint_plugin_imports.mdx
+++ b/api_docs/kbn_eslint_plugin_imports.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports
title: "@kbn/eslint-plugin-imports"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/eslint-plugin-imports plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports']
---
import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json';
diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx
index a7c73595a52a9..93a8bd2af4624 100644
--- a/api_docs/kbn_esql_ast.mdx
+++ b/api_docs/kbn_esql_ast.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast
title: "@kbn/esql-ast"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-ast plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast']
---
import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json';
diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json
index 508643d19c733..1e363e4a18013 100644
--- a/api_docs/kbn_esql_utils.devdocs.json
+++ b/api_docs/kbn_esql_utils.devdocs.json
@@ -19,6 +19,54 @@
"common": {
"classes": [],
"functions": [
+ {
+ "parentPluginId": "@kbn/esql-utils",
+ "id": "def-common.appendToESQLQuery",
+ "type": "Function",
+ "tags": [],
+ "label": "appendToESQLQuery",
+ "description": [],
+ "signature": [
+ "(baseESQLQuery: string, appendedText: string) => string"
+ ],
+ "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/esql-utils",
+ "id": "def-common.appendToESQLQuery.$1",
+ "type": "string",
+ "tags": [],
+ "label": "baseESQLQuery",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ },
+ {
+ "parentPluginId": "@kbn/esql-utils",
+ "id": "def-common.appendToESQLQuery.$2",
+ "type": "string",
+ "tags": [],
+ "label": "appendedText",
+ "description": [],
+ "signature": [
+ "string"
+ ],
+ "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": [],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/esql-utils",
"id": "def-common.getESQLAdHocDataview",
diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx
index ffde42542170b..d71db17d712f0 100644
--- a/api_docs/kbn_esql_utils.mdx
+++ b/api_docs/kbn_esql_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils
title: "@kbn/esql-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils']
---
import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 21 | 0 | 19 | 0 |
+| 24 | 0 | 22 | 0 |
## Common
diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx
index 56b136a54efee..34a6bc10ec4df 100644
--- a/api_docs/kbn_esql_validation_autocomplete.mdx
+++ b/api_docs/kbn_esql_validation_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete
title: "@kbn/esql-validation-autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/esql-validation-autocomplete plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete']
---
import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json';
diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx
index 221f2c30cf6fb..cf0955335a7c4 100644
--- a/api_docs/kbn_event_annotation_common.mdx
+++ b/api_docs/kbn_event_annotation_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common
title: "@kbn/event-annotation-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common']
---
import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json';
diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx
index bf27153c4e7c3..94c55c2f567b7 100644
--- a/api_docs/kbn_event_annotation_components.mdx
+++ b/api_docs/kbn_event_annotation_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components
title: "@kbn/event-annotation-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components']
---
import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json';
diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx
index 4269967973d1a..dec3de8c3aef6 100644
--- a/api_docs/kbn_expandable_flyout.mdx
+++ b/api_docs/kbn_expandable_flyout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout
title: "@kbn/expandable-flyout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/expandable-flyout plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout']
---
import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json';
diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx
index 17b46004bf0a9..faabec75c60a6 100644
--- a/api_docs/kbn_field_types.mdx
+++ b/api_docs/kbn_field_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types
title: "@kbn/field-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/field-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types']
---
import kbnFieldTypesObj from './kbn_field_types.devdocs.json';
diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx
index a03df66b77475..5871762d2f4c5 100644
--- a/api_docs/kbn_field_utils.mdx
+++ b/api_docs/kbn_field_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils
title: "@kbn/field-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/field-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils']
---
import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json';
diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx
index f92ab3a34c730..ec42cf2864d98 100644
--- a/api_docs/kbn_find_used_node_modules.mdx
+++ b/api_docs/kbn_find_used_node_modules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules
title: "@kbn/find-used-node-modules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/find-used-node-modules plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules']
---
import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json';
diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx
index c8ba408daf619..05fb69a9a5359 100644
--- a/api_docs/kbn_formatters.mdx
+++ b/api_docs/kbn_formatters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters
title: "@kbn/formatters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/formatters plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters']
---
import kbnFormattersObj from './kbn_formatters.devdocs.json';
diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx
index feb8604fb3646..9726682708ff6 100644
--- a/api_docs/kbn_ftr_common_functional_services.mdx
+++ b/api_docs/kbn_ftr_common_functional_services.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services
title: "@kbn/ftr-common-functional-services"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ftr-common-functional-services plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services']
---
import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json';
diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx
index 491f6523e9529..7d5ba302d589a 100644
--- a/api_docs/kbn_ftr_common_functional_ui_services.mdx
+++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services
title: "@kbn/ftr-common-functional-ui-services"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ftr-common-functional-ui-services plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services']
---
import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json';
diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx
index b12baf073d776..d3ab46fb8243e 100644
--- a/api_docs/kbn_generate.mdx
+++ b/api_docs/kbn_generate.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate
title: "@kbn/generate"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate']
---
import kbnGenerateObj from './kbn_generate.devdocs.json';
diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx
index 2c790f3da81c3..32f45c5d3e66b 100644
--- a/api_docs/kbn_generate_console_definitions.mdx
+++ b/api_docs/kbn_generate_console_definitions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions
title: "@kbn/generate-console-definitions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-console-definitions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions']
---
import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json';
diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx
index f82a92b094589..7ceab50833a33 100644
--- a/api_docs/kbn_generate_csv.mdx
+++ b/api_docs/kbn_generate_csv.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv
title: "@kbn/generate-csv"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-csv plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv']
---
import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json';
diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx
index b9af074b2623b..bf635a787b613 100644
--- a/api_docs/kbn_guided_onboarding.mdx
+++ b/api_docs/kbn_guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding
title: "@kbn/guided-onboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/guided-onboarding plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding']
---
import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json';
diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx
index 0c906fb75ec19..a798a6232ac78 100644
--- a/api_docs/kbn_handlebars.mdx
+++ b/api_docs/kbn_handlebars.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars
title: "@kbn/handlebars"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/handlebars plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars']
---
import kbnHandlebarsObj from './kbn_handlebars.devdocs.json';
diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx
index 618d47ecfc65b..f6476aa85f8c0 100644
--- a/api_docs/kbn_hapi_mocks.mdx
+++ b/api_docs/kbn_hapi_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks
title: "@kbn/hapi-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/hapi-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks']
---
import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json';
diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx
index 422683b953552..d64368d90434c 100644
--- a/api_docs/kbn_health_gateway_server.mdx
+++ b/api_docs/kbn_health_gateway_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server
title: "@kbn/health-gateway-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/health-gateway-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server']
---
import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json';
diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx
index cd5168e84cf8a..2ec262bf0a490 100644
--- a/api_docs/kbn_home_sample_data_card.mdx
+++ b/api_docs/kbn_home_sample_data_card.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card
title: "@kbn/home-sample-data-card"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-card plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card']
---
import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json';
diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx
index dc6a117c90263..d874ae0f492d3 100644
--- a/api_docs/kbn_home_sample_data_tab.mdx
+++ b/api_docs/kbn_home_sample_data_tab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab
title: "@kbn/home-sample-data-tab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-tab plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab']
---
import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json';
diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx
index 58510a059dbd6..5034fea39ef50 100644
--- a/api_docs/kbn_i18n.mdx
+++ b/api_docs/kbn_i18n.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n
title: "@kbn/i18n"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n']
---
import kbnI18nObj from './kbn_i18n.devdocs.json';
diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx
index e03a3a95c2af1..fa202acb55e98 100644
--- a/api_docs/kbn_i18n_react.mdx
+++ b/api_docs/kbn_i18n_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react
title: "@kbn/i18n-react"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n-react plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react']
---
import kbnI18nReactObj from './kbn_i18n_react.devdocs.json';
diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx
index 586ac233fcddd..5be59bf1765fd 100644
--- a/api_docs/kbn_import_resolver.mdx
+++ b/api_docs/kbn_import_resolver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver
title: "@kbn/import-resolver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/import-resolver plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver']
---
import kbnImportResolverObj from './kbn_import_resolver.devdocs.json';
diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx
index 335feb03d8ce3..2b0bc72b4a78a 100644
--- a/api_docs/kbn_index_management.mdx
+++ b/api_docs/kbn_index_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management
title: "@kbn/index-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/index-management plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management']
---
import kbnIndexManagementObj from './kbn_index_management.devdocs.json';
diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx
index 2c2fa671e64b8..4b1cea3faa0a8 100644
--- a/api_docs/kbn_inference_integration_flyout.mdx
+++ b/api_docs/kbn_inference_integration_flyout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout
title: "@kbn/inference_integration_flyout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/inference_integration_flyout plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout']
---
import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json';
diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx
index be091dc5f9592..58edb77960672 100644
--- a/api_docs/kbn_infra_forge.mdx
+++ b/api_docs/kbn_infra_forge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge
title: "@kbn/infra-forge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/infra-forge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge']
---
import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json';
diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx
index 4bbb15fbab069..30b14ef007e47 100644
--- a/api_docs/kbn_interpreter.mdx
+++ b/api_docs/kbn_interpreter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter
title: "@kbn/interpreter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/interpreter plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter']
---
import kbnInterpreterObj from './kbn_interpreter.devdocs.json';
diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx
index 63aadc04cedef..d8aff44ed92ef 100644
--- a/api_docs/kbn_io_ts_utils.mdx
+++ b/api_docs/kbn_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils
title: "@kbn/io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/io-ts-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils']
---
import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json';
diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx
index 8ee70f160a430..352fd5a6e7644 100644
--- a/api_docs/kbn_ipynb.mdx
+++ b/api_docs/kbn_ipynb.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb
title: "@kbn/ipynb"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ipynb plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb']
---
import kbnIpynbObj from './kbn_ipynb.devdocs.json';
diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx
index 9fda234b233b1..5288a84074343 100644
--- a/api_docs/kbn_jest_serializers.mdx
+++ b/api_docs/kbn_jest_serializers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers
title: "@kbn/jest-serializers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/jest-serializers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers']
---
import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json';
diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx
index 87757e0894797..14554bc27be30 100644
--- a/api_docs/kbn_journeys.mdx
+++ b/api_docs/kbn_journeys.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys
title: "@kbn/journeys"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/journeys plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys']
---
import kbnJourneysObj from './kbn_journeys.devdocs.json';
diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx
index d224f04cee432..e1b95f33de2d8 100644
--- a/api_docs/kbn_json_ast.mdx
+++ b/api_docs/kbn_json_ast.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast
title: "@kbn/json-ast"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/json-ast plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast']
---
import kbnJsonAstObj from './kbn_json_ast.devdocs.json';
diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx
index dbb2f32684b5a..84a1d8c9a047b 100644
--- a/api_docs/kbn_kibana_manifest_schema.mdx
+++ b/api_docs/kbn_kibana_manifest_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema
title: "@kbn/kibana-manifest-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/kibana-manifest-schema plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema']
---
import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json';
diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx
index cbc138f89632a..98d93636a78fa 100644
--- a/api_docs/kbn_language_documentation_popover.mdx
+++ b/api_docs/kbn_language_documentation_popover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover
title: "@kbn/language-documentation-popover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/language-documentation-popover plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover']
---
import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json';
diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx
index 9e674b89458f5..e87343a8db43d 100644
--- a/api_docs/kbn_lens_embeddable_utils.mdx
+++ b/api_docs/kbn_lens_embeddable_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils
title: "@kbn/lens-embeddable-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/lens-embeddable-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils']
---
import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json';
diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx
index 5d8d9f7b87355..c0276c761129e 100644
--- a/api_docs/kbn_lens_formula_docs.mdx
+++ b/api_docs/kbn_lens_formula_docs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs
title: "@kbn/lens-formula-docs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/lens-formula-docs plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs']
---
import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json';
diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx
index f5ccfb3a64916..be4e9b44f0ae7 100644
--- a/api_docs/kbn_logging.mdx
+++ b/api_docs/kbn_logging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging
title: "@kbn/logging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging']
---
import kbnLoggingObj from './kbn_logging.devdocs.json';
diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx
index 943b10511f5f2..a0607f0fea477 100644
--- a/api_docs/kbn_logging_mocks.mdx
+++ b/api_docs/kbn_logging_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks
title: "@kbn/logging-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks']
---
import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json';
diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx
index d7d3b9f8acd5f..d33b5dac741a9 100644
--- a/api_docs/kbn_managed_content_badge.mdx
+++ b/api_docs/kbn_managed_content_badge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge
title: "@kbn/managed-content-badge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/managed-content-badge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge']
---
import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json';
diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx
index aed24d67d0dd7..54713786ec8ec 100644
--- a/api_docs/kbn_managed_vscode_config.mdx
+++ b/api_docs/kbn_managed_vscode_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config
title: "@kbn/managed-vscode-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/managed-vscode-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config']
---
import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json';
diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx
index 96bc1a86f86f4..7373d134481b2 100644
--- a/api_docs/kbn_management_cards_navigation.mdx
+++ b/api_docs/kbn_management_cards_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation
title: "@kbn/management-cards-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-cards-navigation plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation']
---
import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json';
diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx
index d04838e4938f2..7551a182374e4 100644
--- a/api_docs/kbn_management_settings_application.mdx
+++ b/api_docs/kbn_management_settings_application.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application
title: "@kbn/management-settings-application"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-application plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application']
---
import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx
index 1b87bebc08071..2097976e80ebc 100644
--- a/api_docs/kbn_management_settings_components_field_category.mdx
+++ b/api_docs/kbn_management_settings_components_field_category.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category
title: "@kbn/management-settings-components-field-category"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-category plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category']
---
import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx
index 4feefc373b08a..5557b445e78c2 100644
--- a/api_docs/kbn_management_settings_components_field_input.mdx
+++ b/api_docs/kbn_management_settings_components_field_input.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input
title: "@kbn/management-settings-components-field-input"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-input plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input']
---
import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx
index 3c96ca74a3677..1ac6abbe9e8f7 100644
--- a/api_docs/kbn_management_settings_components_field_row.mdx
+++ b/api_docs/kbn_management_settings_components_field_row.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row
title: "@kbn/management-settings-components-field-row"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-row plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row']
---
import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json';
diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx
index 8761d42f06fb1..38a3afc3f9c1d 100644
--- a/api_docs/kbn_management_settings_components_form.mdx
+++ b/api_docs/kbn_management_settings_components_form.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form
title: "@kbn/management-settings-components-form"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-form plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form']
---
import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json';
diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx
index 09be3f7fd6aa2..fa7ef5a6f768f 100644
--- a/api_docs/kbn_management_settings_field_definition.mdx
+++ b/api_docs/kbn_management_settings_field_definition.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition
title: "@kbn/management-settings-field-definition"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-field-definition plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition']
---
import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json';
diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx
index b444474169642..b09de60eb4965 100644
--- a/api_docs/kbn_management_settings_ids.mdx
+++ b/api_docs/kbn_management_settings_ids.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids
title: "@kbn/management-settings-ids"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-ids plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids']
---
import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json';
diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx
index 73454f0d95f92..7bc2f941fe5be 100644
--- a/api_docs/kbn_management_settings_section_registry.mdx
+++ b/api_docs/kbn_management_settings_section_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry
title: "@kbn/management-settings-section-registry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-section-registry plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry']
---
import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json';
diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx
index 212bbd53d98f0..a03b7792a1593 100644
--- a/api_docs/kbn_management_settings_types.mdx
+++ b/api_docs/kbn_management_settings_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types
title: "@kbn/management-settings-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types']
---
import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json';
diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx
index e7407446f348e..4972c98eddeb0 100644
--- a/api_docs/kbn_management_settings_utilities.mdx
+++ b/api_docs/kbn_management_settings_utilities.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities
title: "@kbn/management-settings-utilities"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-utilities plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities']
---
import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json';
diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx
index 416b78095c297..56b17d6e02d16 100644
--- a/api_docs/kbn_management_storybook_config.mdx
+++ b/api_docs/kbn_management_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config
title: "@kbn/management-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-storybook-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config']
---
import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx
index 3257f7b33a841..5c4317f3c528b 100644
--- a/api_docs/kbn_mapbox_gl.mdx
+++ b/api_docs/kbn_mapbox_gl.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl
title: "@kbn/mapbox-gl"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/mapbox-gl plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl']
---
import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json';
diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx
index d153e5180f408..0691ad3aedae9 100644
--- a/api_docs/kbn_maps_vector_tile_utils.mdx
+++ b/api_docs/kbn_maps_vector_tile_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils
title: "@kbn/maps-vector-tile-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/maps-vector-tile-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils']
---
import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx
index d79b2b25cf817..43f9abb401f27 100644
--- a/api_docs/kbn_ml_agg_utils.mdx
+++ b/api_docs/kbn_ml_agg_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils
title: "@kbn/ml-agg-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-agg-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils']
---
import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx
index afdea3fb155b5..c4cc462820932 100644
--- a/api_docs/kbn_ml_anomaly_utils.mdx
+++ b/api_docs/kbn_ml_anomaly_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils
title: "@kbn/ml-anomaly-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-anomaly-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils']
---
import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx
index 3544adf2fd455..5c13873398c4c 100644
--- a/api_docs/kbn_ml_cancellable_search.mdx
+++ b/api_docs/kbn_ml_cancellable_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search
title: "@kbn/ml-cancellable-search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-cancellable-search plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search']
---
import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json';
diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx
index a90ce9462477d..bb0c792630f70 100644
--- a/api_docs/kbn_ml_category_validator.mdx
+++ b/api_docs/kbn_ml_category_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator
title: "@kbn/ml-category-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-category-validator plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator']
---
import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json';
diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx
index f110682ad006c..74e6cb408c3ff 100644
--- a/api_docs/kbn_ml_chi2test.mdx
+++ b/api_docs/kbn_ml_chi2test.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test
title: "@kbn/ml-chi2test"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-chi2test plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test']
---
import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json';
diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
index 2fe73be5d159a..40b374b6d736d 100644
--- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx
+++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils
title: "@kbn/ml-data-frame-analytics-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-frame-analytics-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils']
---
import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx
index 4f942927bbef3..6bd5c13aee9de 100644
--- a/api_docs/kbn_ml_data_grid.mdx
+++ b/api_docs/kbn_ml_data_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid
title: "@kbn/ml-data-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-grid plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid']
---
import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json';
diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx
index 961d114abd911..3102cedb835eb 100644
--- a/api_docs/kbn_ml_date_picker.mdx
+++ b/api_docs/kbn_ml_date_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker
title: "@kbn/ml-date-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-picker plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker']
---
import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json';
diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx
index 33e0bc1be1e9b..2e309236ea36a 100644
--- a/api_docs/kbn_ml_date_utils.mdx
+++ b/api_docs/kbn_ml_date_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils
title: "@kbn/ml-date-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils']
---
import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx
index d0a9aaaad49ca..db7fe409c4b42 100644
--- a/api_docs/kbn_ml_error_utils.mdx
+++ b/api_docs/kbn_ml_error_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils
title: "@kbn/ml-error-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-error-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils']
---
import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx
index 6ce5cfc9d18e4..a78b5ae2eca0e 100644
--- a/api_docs/kbn_ml_in_memory_table.mdx
+++ b/api_docs/kbn_ml_in_memory_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table
title: "@kbn/ml-in-memory-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-in-memory-table plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table']
---
import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json';
diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx
index 55324c9a47279..9714f11a62edd 100644
--- a/api_docs/kbn_ml_is_defined.mdx
+++ b/api_docs/kbn_ml_is_defined.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined
title: "@kbn/ml-is-defined"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-defined plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined']
---
import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json';
diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx
index 3ccdafee6cd1b..c8d5e4036e9fa 100644
--- a/api_docs/kbn_ml_is_populated_object.mdx
+++ b/api_docs/kbn_ml_is_populated_object.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object
title: "@kbn/ml-is-populated-object"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-populated-object plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object']
---
import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json';
diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx
index b57b0e60c258d..b4bb7127af81f 100644
--- a/api_docs/kbn_ml_kibana_theme.mdx
+++ b/api_docs/kbn_ml_kibana_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme
title: "@kbn/ml-kibana-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-kibana-theme plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme']
---
import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json';
diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx
index ea5d63ace1ad0..ffae1a36906ae 100644
--- a/api_docs/kbn_ml_local_storage.mdx
+++ b/api_docs/kbn_ml_local_storage.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage
title: "@kbn/ml-local-storage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-local-storage plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage']
---
import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json';
diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx
index ceb4129264fb9..92a6490f72083 100644
--- a/api_docs/kbn_ml_nested_property.mdx
+++ b/api_docs/kbn_ml_nested_property.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property
title: "@kbn/ml-nested-property"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-nested-property plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property']
---
import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json';
diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx
index f85437c7b9603..7015638815bda 100644
--- a/api_docs/kbn_ml_number_utils.mdx
+++ b/api_docs/kbn_ml_number_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils
title: "@kbn/ml-number-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-number-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils']
---
import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx
index 802f8771d0eca..ca003e0b85e1a 100644
--- a/api_docs/kbn_ml_query_utils.mdx
+++ b/api_docs/kbn_ml_query_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils
title: "@kbn/ml-query-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-query-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils']
---
import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx
index 3cedb6813fc24..e53ca3beff41a 100644
--- a/api_docs/kbn_ml_random_sampler_utils.mdx
+++ b/api_docs/kbn_ml_random_sampler_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils
title: "@kbn/ml-random-sampler-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-random-sampler-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils']
---
import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx
index 88d561303257c..72ce416d8b2e8 100644
--- a/api_docs/kbn_ml_route_utils.mdx
+++ b/api_docs/kbn_ml_route_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils
title: "@kbn/ml-route-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-route-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils']
---
import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx
index 0ad1e1c9bc595..2be14d0b71b98 100644
--- a/api_docs/kbn_ml_runtime_field_utils.mdx
+++ b/api_docs/kbn_ml_runtime_field_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils
title: "@kbn/ml-runtime-field-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-runtime-field-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils']
---
import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx
index 1841f3cbd924d..ff1a29dd31816 100644
--- a/api_docs/kbn_ml_string_hash.mdx
+++ b/api_docs/kbn_ml_string_hash.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash
title: "@kbn/ml-string-hash"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-string-hash plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash']
---
import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json';
diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx
index d41cf9a3754d2..3865dcb911b28 100644
--- a/api_docs/kbn_ml_time_buckets.mdx
+++ b/api_docs/kbn_ml_time_buckets.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets
title: "@kbn/ml-time-buckets"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-time-buckets plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets']
---
import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json';
diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx
index b2190a02d6998..9276ddd60086b 100644
--- a/api_docs/kbn_ml_trained_models_utils.mdx
+++ b/api_docs/kbn_ml_trained_models_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils
title: "@kbn/ml-trained-models-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-trained-models-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils']
---
import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx
index cd8a27e6a13fa..d07dae5fb8c6e 100644
--- a/api_docs/kbn_ml_ui_actions.mdx
+++ b/api_docs/kbn_ml_ui_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions
title: "@kbn/ml-ui-actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-ui-actions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions']
---
import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json';
diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx
index 53daec43d0de5..b9fe78f1115e7 100644
--- a/api_docs/kbn_ml_url_state.mdx
+++ b/api_docs/kbn_ml_url_state.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state
title: "@kbn/ml-url-state"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-url-state plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state']
---
import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json';
diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx
index 3ac8724212c4d..11ca210448c19 100644
--- a/api_docs/kbn_mock_idp_utils.mdx
+++ b/api_docs/kbn_mock_idp_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils
title: "@kbn/mock-idp-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/mock-idp-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils']
---
import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json';
diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx
index dc526a833aa84..5c1800b933813 100644
--- a/api_docs/kbn_monaco.mdx
+++ b/api_docs/kbn_monaco.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco
title: "@kbn/monaco"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/monaco plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco']
---
import kbnMonacoObj from './kbn_monaco.devdocs.json';
diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx
index 170ac463081ef..0f994545367db 100644
--- a/api_docs/kbn_object_versioning.mdx
+++ b/api_docs/kbn_object_versioning.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning
title: "@kbn/object-versioning"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/object-versioning plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning']
---
import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json';
diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx
index 2252db0c70069..c03a31d3548af 100644
--- a/api_docs/kbn_observability_alert_details.mdx
+++ b/api_docs/kbn_observability_alert_details.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details
title: "@kbn/observability-alert-details"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-alert-details plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details']
---
import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json';
diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx
index 62787b05194fe..f700b0fde7b11 100644
--- a/api_docs/kbn_observability_alerting_test_data.mdx
+++ b/api_docs/kbn_observability_alerting_test_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data
title: "@kbn/observability-alerting-test-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-alerting-test-data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data']
---
import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json';
diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
index 50aad51ed4c49..d210480b0b993 100644
--- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
+++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util
title: "@kbn/observability-get-padded-alert-time-range-util"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util']
---
import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json';
diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx
index 09b41b8b85d85..84cfb8ab20c98 100644
--- a/api_docs/kbn_openapi_bundler.mdx
+++ b/api_docs/kbn_openapi_bundler.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler
title: "@kbn/openapi-bundler"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/openapi-bundler plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler']
---
import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json';
diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx
index d50914bb09e8d..0ac5e5ae8dca3 100644
--- a/api_docs/kbn_openapi_generator.mdx
+++ b/api_docs/kbn_openapi_generator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator
title: "@kbn/openapi-generator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/openapi-generator plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator']
---
import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json';
diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx
index ad16f66198712..ccd0d3c971521 100644
--- a/api_docs/kbn_optimizer.mdx
+++ b/api_docs/kbn_optimizer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer
title: "@kbn/optimizer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer']
---
import kbnOptimizerObj from './kbn_optimizer.devdocs.json';
diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx
index b63f19fc83981..e423cf0365ec0 100644
--- a/api_docs/kbn_optimizer_webpack_helpers.mdx
+++ b/api_docs/kbn_optimizer_webpack_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers
title: "@kbn/optimizer-webpack-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer-webpack-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers']
---
import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json';
diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx
index a2d3d1a3c4895..e72869de4dd24 100644
--- a/api_docs/kbn_osquery_io_ts_types.mdx
+++ b/api_docs/kbn_osquery_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types
title: "@kbn/osquery-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/osquery-io-ts-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types']
---
import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json';
diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx
index 22bdea0d5b08f..c7ada3cb9770f 100644
--- a/api_docs/kbn_panel_loader.mdx
+++ b/api_docs/kbn_panel_loader.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader
title: "@kbn/panel-loader"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/panel-loader plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader']
---
import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json';
diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx
index a40273499006c..6960df5039d2b 100644
--- a/api_docs/kbn_performance_testing_dataset_extractor.mdx
+++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor
title: "@kbn/performance-testing-dataset-extractor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/performance-testing-dataset-extractor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor']
---
import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json';
diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx
index 7418d6b3bdecf..eb7f1dd33e2b6 100644
--- a/api_docs/kbn_plugin_check.mdx
+++ b/api_docs/kbn_plugin_check.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check
title: "@kbn/plugin-check"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-check plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check']
---
import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json';
diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx
index b2ee69a7bec27..91d7ae0b6041a 100644
--- a/api_docs/kbn_plugin_generator.mdx
+++ b/api_docs/kbn_plugin_generator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator
title: "@kbn/plugin-generator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-generator plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator']
---
import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json';
diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx
index 3514d0f1556ce..b3b961bbcd005 100644
--- a/api_docs/kbn_plugin_helpers.mdx
+++ b/api_docs/kbn_plugin_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers
title: "@kbn/plugin-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers']
---
import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json';
diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx
index 661b5dcff51e2..9f1ee04d13617 100644
--- a/api_docs/kbn_presentation_containers.mdx
+++ b/api_docs/kbn_presentation_containers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers
title: "@kbn/presentation-containers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/presentation-containers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers']
---
import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json';
diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json
index e290dee7335a8..844fe5ab1dbdc 100644
--- a/api_docs/kbn_presentation_publishing.devdocs.json
+++ b/api_docs/kbn_presentation_publishing.devdocs.json
@@ -101,6 +101,46 @@
"returnComment": [],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "@kbn/presentation-publishing",
+ "id": "def-common.apiHasExecutionContext",
+ "type": "Function",
+ "tags": [],
+ "label": "apiHasExecutionContext",
+ "description": [],
+ "signature": [
+ "(unknownApi: unknown) => unknownApi is ",
+ {
+ "pluginId": "@kbn/presentation-publishing",
+ "scope": "common",
+ "docId": "kibKbnPresentationPublishingPluginApi",
+ "section": "def-common.HasExecutionContext",
+ "text": "HasExecutionContext"
+ }
+ ],
+ "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/presentation-publishing",
+ "id": "def-common.apiHasExecutionContext.$1",
+ "type": "Unknown",
+ "tags": [],
+ "label": "unknownApi",
+ "description": [],
+ "signature": [
+ "unknown"
+ ],
+ "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": [],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/presentation-publishing",
"id": "def-common.apiHasLegacyLibraryTransforms",
@@ -2152,6 +2192,42 @@
],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "@kbn/presentation-publishing",
+ "id": "def-common.HasExecutionContext",
+ "type": "Interface",
+ "tags": [],
+ "label": "HasExecutionContext",
+ "description": [],
+ "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/presentation-publishing",
+ "id": "def-common.HasExecutionContext.executionContext",
+ "type": "Object",
+ "tags": [],
+ "label": "executionContext",
+ "description": [],
+ "signature": [
+ "{ readonly type?: string | undefined; readonly name?: string | undefined; readonly page?: string | undefined; readonly id?: string | undefined; readonly description?: string | undefined; readonly url?: string | undefined; readonly meta?: { [key: string]: string | number | boolean | undefined; } | undefined; child?: ",
+ {
+ "pluginId": "@kbn/core-execution-context-common",
+ "scope": "common",
+ "docId": "kibKbnCoreExecutionContextCommonPluginApi",
+ "section": "def-common.KibanaExecutionContext",
+ "text": "KibanaExecutionContext"
+ },
+ " | undefined; }"
+ ],
+ "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/presentation-publishing",
"id": "def-common.HasLibraryTransforms",
diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx
index 4f4d4dbc1782f..9a271d82ea631 100644
--- a/api_docs/kbn_presentation_publishing.mdx
+++ b/api_docs/kbn_presentation_publishing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing
title: "@kbn/presentation-publishing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/presentation-publishing plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing']
---
import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 178 | 0 | 149 | 6 |
+| 182 | 0 | 153 | 6 |
## Common
diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx
index e790fc39705fb..176ae441a5edf 100644
--- a/api_docs/kbn_profiling_utils.mdx
+++ b/api_docs/kbn_profiling_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils
title: "@kbn/profiling-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/profiling-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils']
---
import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json';
diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx
index 7e0d2c0b0c592..42259e5fab175 100644
--- a/api_docs/kbn_random_sampling.mdx
+++ b/api_docs/kbn_random_sampling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling
title: "@kbn/random-sampling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/random-sampling plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling']
---
import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json';
diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx
index 85130fa423398..c5ec4724fee48 100644
--- a/api_docs/kbn_react_field.mdx
+++ b/api_docs/kbn_react_field.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field
title: "@kbn/react-field"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-field plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field']
---
import kbnReactFieldObj from './kbn_react_field.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx
index bbc78e668fc61..a237c986af4e8 100644
--- a/api_docs/kbn_react_kibana_context_common.mdx
+++ b/api_docs/kbn_react_kibana_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common
title: "@kbn/react-kibana-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common']
---
import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx
index 6718701b33c9e..654179342abce 100644
--- a/api_docs/kbn_react_kibana_context_render.mdx
+++ b/api_docs/kbn_react_kibana_context_render.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render
title: "@kbn/react-kibana-context-render"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-render plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render']
---
import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx
index f398ec9013544..55dd8d53280dd 100644
--- a/api_docs/kbn_react_kibana_context_root.mdx
+++ b/api_docs/kbn_react_kibana_context_root.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root
title: "@kbn/react-kibana-context-root"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-root plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root']
---
import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx
index 31649d75be30b..7df976906cc14 100644
--- a/api_docs/kbn_react_kibana_context_styled.mdx
+++ b/api_docs/kbn_react_kibana_context_styled.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled
title: "@kbn/react-kibana-context-styled"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-styled plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled']
---
import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx
index 04b9664fa445c..c20cd3874afb8 100644
--- a/api_docs/kbn_react_kibana_context_theme.mdx
+++ b/api_docs/kbn_react_kibana_context_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme
title: "@kbn/react-kibana-context-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-theme plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme']
---
import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx
index 24416d7474f13..9efd027979601 100644
--- a/api_docs/kbn_react_kibana_mount.mdx
+++ b/api_docs/kbn_react_kibana_mount.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount
title: "@kbn/react-kibana-mount"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-mount plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount']
---
import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json';
diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx
index ebd71ace440bf..05b3bc011bd51 100644
--- a/api_docs/kbn_repo_file_maps.mdx
+++ b/api_docs/kbn_repo_file_maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps
title: "@kbn/repo-file-maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-file-maps plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps']
---
import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json';
diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx
index 8284e418530d5..b93b45518e28a 100644
--- a/api_docs/kbn_repo_linter.mdx
+++ b/api_docs/kbn_repo_linter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter
title: "@kbn/repo-linter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-linter plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter']
---
import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json';
diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx
index d91c7ba39bff9..ef4974756cd50 100644
--- a/api_docs/kbn_repo_path.mdx
+++ b/api_docs/kbn_repo_path.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path
title: "@kbn/repo-path"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-path plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path']
---
import kbnRepoPathObj from './kbn_repo_path.devdocs.json';
diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx
index e52f522aa4955..8594f47dc2611 100644
--- a/api_docs/kbn_repo_source_classifier.mdx
+++ b/api_docs/kbn_repo_source_classifier.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier
title: "@kbn/repo-source-classifier"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-source-classifier plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier']
---
import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json';
diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx
index 21350a2f4ec50..6ce06f7bc01b6 100644
--- a/api_docs/kbn_reporting_common.mdx
+++ b/api_docs/kbn_reporting_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common
title: "@kbn/reporting-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common']
---
import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx
index db334115dd640..6d11f2f681bb0 100644
--- a/api_docs/kbn_reporting_csv_share_panel.mdx
+++ b/api_docs/kbn_reporting_csv_share_panel.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel
title: "@kbn/reporting-csv-share-panel"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-csv-share-panel plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel']
---
import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx
index f646136f3d493..cec52373b81fb 100644
--- a/api_docs/kbn_reporting_export_types_csv.mdx
+++ b/api_docs/kbn_reporting_export_types_csv.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv
title: "@kbn/reporting-export-types-csv"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-csv plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv']
---
import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx
index 6d2b54679edea..0dd7c9d06ec8b 100644
--- a/api_docs/kbn_reporting_export_types_csv_common.mdx
+++ b/api_docs/kbn_reporting_export_types_csv_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common
title: "@kbn/reporting-export-types-csv-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-csv-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common']
---
import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx
index 280e16ce27497..8a98772e74b41 100644
--- a/api_docs/kbn_reporting_export_types_pdf.mdx
+++ b/api_docs/kbn_reporting_export_types_pdf.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf
title: "@kbn/reporting-export-types-pdf"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-pdf plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf']
---
import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx
index c0dc57141f65e..9a79f72471d74 100644
--- a/api_docs/kbn_reporting_export_types_pdf_common.mdx
+++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common
title: "@kbn/reporting-export-types-pdf-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-pdf-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common']
---
import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx
index b349c8be19966..b78630e85976d 100644
--- a/api_docs/kbn_reporting_export_types_png.mdx
+++ b/api_docs/kbn_reporting_export_types_png.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png
title: "@kbn/reporting-export-types-png"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-png plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png']
---
import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json';
diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx
index 8fa06e7ca4177..3585a1b9c3866 100644
--- a/api_docs/kbn_reporting_export_types_png_common.mdx
+++ b/api_docs/kbn_reporting_export_types_png_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common
title: "@kbn/reporting-export-types-png-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-export-types-png-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common']
---
import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json';
diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx
index 5d1f5cf9bbd29..3a583eb67b9a1 100644
--- a/api_docs/kbn_reporting_mocks_server.mdx
+++ b/api_docs/kbn_reporting_mocks_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server
title: "@kbn/reporting-mocks-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-mocks-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server']
---
import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json';
diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx
index 614c8c02953be..33e65b08c6d37 100644
--- a/api_docs/kbn_reporting_public.mdx
+++ b/api_docs/kbn_reporting_public.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public
title: "@kbn/reporting-public"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-public plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public']
---
import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json';
diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx
index 6b8173fcfdc6f..3918484f6d533 100644
--- a/api_docs/kbn_reporting_server.mdx
+++ b/api_docs/kbn_reporting_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server
title: "@kbn/reporting-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server']
---
import kbnReportingServerObj from './kbn_reporting_server.devdocs.json';
diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx
index e6745d785eb15..dda61e40adaeb 100644
--- a/api_docs/kbn_resizable_layout.mdx
+++ b/api_docs/kbn_resizable_layout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout
title: "@kbn/resizable-layout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/resizable-layout plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout']
---
import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json';
diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx
index f8b1fb95a236a..31da9365a3cc3 100644
--- a/api_docs/kbn_rison.mdx
+++ b/api_docs/kbn_rison.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison
title: "@kbn/rison"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rison plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison']
---
import kbnRisonObj from './kbn_rison.devdocs.json';
diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx
index 1ac34e2206da1..1bb28995ceb7f 100644
--- a/api_docs/kbn_router_to_openapispec.mdx
+++ b/api_docs/kbn_router_to_openapispec.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec
title: "@kbn/router-to-openapispec"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/router-to-openapispec plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec']
---
import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json';
diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx
index a2dd584c4bfaf..ef26b3268248d 100644
--- a/api_docs/kbn_router_utils.mdx
+++ b/api_docs/kbn_router_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils
title: "@kbn/router-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/router-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils']
---
import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json';
diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx
index 9d781d3881290..89b6ab7a8df5a 100644
--- a/api_docs/kbn_rrule.mdx
+++ b/api_docs/kbn_rrule.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule
title: "@kbn/rrule"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rrule plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule']
---
import kbnRruleObj from './kbn_rrule.devdocs.json';
diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx
index 3d0a282f6369c..cbb11bdc333c1 100644
--- a/api_docs/kbn_rule_data_utils.mdx
+++ b/api_docs/kbn_rule_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils
title: "@kbn/rule-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rule-data-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils']
---
import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json';
diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx
index b48c1ea97dbb9..c261588b1aeb6 100644
--- a/api_docs/kbn_saved_objects_settings.mdx
+++ b/api_docs/kbn_saved_objects_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings
title: "@kbn/saved-objects-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/saved-objects-settings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings']
---
import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json';
diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx
index bdfd4c0518376..1fe032b36768a 100644
--- a/api_docs/kbn_search_api_panels.mdx
+++ b/api_docs/kbn_search_api_panels.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels
title: "@kbn/search-api-panels"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-api-panels plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels']
---
import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json';
diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx
index 2bd098cc95d0c..76aee667c55be 100644
--- a/api_docs/kbn_search_connectors.mdx
+++ b/api_docs/kbn_search_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors
title: "@kbn/search-connectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-connectors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors']
---
import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json';
diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx
index 203faba8a4f66..5df18e329fd48 100644
--- a/api_docs/kbn_search_errors.mdx
+++ b/api_docs/kbn_search_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors
title: "@kbn/search-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-errors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors']
---
import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json';
diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx
index 36070f154c148..ed05ce5a48b6b 100644
--- a/api_docs/kbn_search_index_documents.mdx
+++ b/api_docs/kbn_search_index_documents.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents
title: "@kbn/search-index-documents"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-index-documents plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents']
---
import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json';
diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx
index f3d95afeea1f9..247a2701da252 100644
--- a/api_docs/kbn_search_response_warnings.mdx
+++ b/api_docs/kbn_search_response_warnings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings
title: "@kbn/search-response-warnings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-response-warnings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings']
---
import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json';
diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx
index 15ec4e90fd12c..a54edb0b37db8 100644
--- a/api_docs/kbn_security_hardening.mdx
+++ b/api_docs/kbn_security_hardening.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening
title: "@kbn/security-hardening"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-hardening plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening']
---
import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx
index 388ba057ac16b..f6150a52db994 100644
--- a/api_docs/kbn_security_plugin_types_common.mdx
+++ b/api_docs/kbn_security_plugin_types_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common
title: "@kbn/security-plugin-types-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-common plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common']
---
import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx
index 0e7a4ed615c94..6d5116c8ca3be 100644
--- a/api_docs/kbn_security_plugin_types_public.mdx
+++ b/api_docs/kbn_security_plugin_types_public.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public
title: "@kbn/security-plugin-types-public"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-public plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public']
---
import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json';
diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx
index 0f4a4baa9e5c3..57d7eb854e1e6 100644
--- a/api_docs/kbn_security_plugin_types_server.mdx
+++ b/api_docs/kbn_security_plugin_types_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server
title: "@kbn/security-plugin-types-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-plugin-types-server plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server']
---
import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json';
diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx
index 826f884424a36..b4470435eddb0 100644
--- a/api_docs/kbn_security_solution_features.mdx
+++ b/api_docs/kbn_security_solution_features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features
title: "@kbn/security-solution-features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-features plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features']
---
import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json';
diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx
index ca62f797cc067..0d7d6c7a15dc0 100644
--- a/api_docs/kbn_security_solution_navigation.mdx
+++ b/api_docs/kbn_security_solution_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation
title: "@kbn/security-solution-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-navigation plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation']
---
import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json';
diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx
index 8c363ca19171e..c1fd7387f206f 100644
--- a/api_docs/kbn_security_solution_side_nav.mdx
+++ b/api_docs/kbn_security_solution_side_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav
title: "@kbn/security-solution-side-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-side-nav plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav']
---
import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json';
diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx
index a0bc3eef0123f..dd8ae9c32f66f 100644
--- a/api_docs/kbn_security_solution_storybook_config.mdx
+++ b/api_docs/kbn_security_solution_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config
title: "@kbn/security-solution-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-storybook-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config']
---
import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx
index 8690f820548b0..e747b6bf2b90d 100644
--- a/api_docs/kbn_securitysolution_autocomplete.mdx
+++ b/api_docs/kbn_securitysolution_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete
title: "@kbn/securitysolution-autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-autocomplete plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete']
---
import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx
index 05be1ac6b4431..1f6b4617741f5 100644
--- a/api_docs/kbn_securitysolution_data_table.mdx
+++ b/api_docs/kbn_securitysolution_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table
title: "@kbn/securitysolution-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-data-table plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table']
---
import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx
index a66b1e398fc4e..0f5e3283f7019 100644
--- a/api_docs/kbn_securitysolution_ecs.mdx
+++ b/api_docs/kbn_securitysolution_ecs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs
title: "@kbn/securitysolution-ecs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-ecs plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs']
---
import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx
index b9ce0c7cfb874..c59edda61a904 100644
--- a/api_docs/kbn_securitysolution_es_utils.mdx
+++ b/api_docs/kbn_securitysolution_es_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils
title: "@kbn/securitysolution-es-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-es-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils']
---
import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx
index 568f8aa841d36..a3cc7636e63ea 100644
--- a/api_docs/kbn_securitysolution_exception_list_components.mdx
+++ b/api_docs/kbn_securitysolution_exception_list_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components
title: "@kbn/securitysolution-exception-list-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-exception-list-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components']
---
import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx
index 54d8ce79da466..68e8880b1e09e 100644
--- a/api_docs/kbn_securitysolution_grouping.mdx
+++ b/api_docs/kbn_securitysolution_grouping.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping
title: "@kbn/securitysolution-grouping"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-grouping plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping']
---
import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx
index 6ba9ad3d78d96..81094f9434a20 100644
--- a/api_docs/kbn_securitysolution_hook_utils.mdx
+++ b/api_docs/kbn_securitysolution_hook_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils
title: "@kbn/securitysolution-hook-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-hook-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils']
---
import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
index 5b4ea9e66cfd3..c9519ebe11738 100644
--- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types
title: "@kbn/securitysolution-io-ts-alerting-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types']
---
import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx
index fa788c120c1d2..3809da24ae101 100644
--- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types
title: "@kbn/securitysolution-io-ts-list-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-list-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types']
---
import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx
index e50f718991799..d13b1ad3476f2 100644
--- a/api_docs/kbn_securitysolution_io_ts_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types
title: "@kbn/securitysolution-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types']
---
import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx
index 5dc6a8ca5ad6c..3ca421334edd1 100644
--- a/api_docs/kbn_securitysolution_io_ts_utils.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils
title: "@kbn/securitysolution-io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils']
---
import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx
index f4bbaaca6deb7..b1a5a5b1839e8 100644
--- a/api_docs/kbn_securitysolution_list_api.mdx
+++ b/api_docs/kbn_securitysolution_list_api.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api
title: "@kbn/securitysolution-list-api"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-api plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api']
---
import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx
index 03d33ea6c0576..babfe00912cf2 100644
--- a/api_docs/kbn_securitysolution_list_constants.mdx
+++ b/api_docs/kbn_securitysolution_list_constants.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants
title: "@kbn/securitysolution-list-constants"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-constants plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants']
---
import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx
index 8b741b452ad6a..468847a493614 100644
--- a/api_docs/kbn_securitysolution_list_hooks.mdx
+++ b/api_docs/kbn_securitysolution_list_hooks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks
title: "@kbn/securitysolution-list-hooks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-hooks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks']
---
import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx
index e114208a3cf68..2ffff79453547 100644
--- a/api_docs/kbn_securitysolution_list_utils.mdx
+++ b/api_docs/kbn_securitysolution_list_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils
title: "@kbn/securitysolution-list-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils']
---
import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx
index 9dd927b8e2c55..7d1f1f4f36264 100644
--- a/api_docs/kbn_securitysolution_rules.mdx
+++ b/api_docs/kbn_securitysolution_rules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules
title: "@kbn/securitysolution-rules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-rules plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules']
---
import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx
index a6a6311baac5d..2310a9fa2a4ee 100644
--- a/api_docs/kbn_securitysolution_t_grid.mdx
+++ b/api_docs/kbn_securitysolution_t_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid
title: "@kbn/securitysolution-t-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-t-grid plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid']
---
import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx
index 646fc85dcc516..47535eabd4070 100644
--- a/api_docs/kbn_securitysolution_utils.mdx
+++ b/api_docs/kbn_securitysolution_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils
title: "@kbn/securitysolution-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils']
---
import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json';
diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx
index 7de2e8d0bf5d6..4fa2bb77089f1 100644
--- a/api_docs/kbn_server_http_tools.mdx
+++ b/api_docs/kbn_server_http_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools
title: "@kbn/server-http-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-http-tools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools']
---
import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json';
diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx
index f21bec0400267..f492dd5ef3d84 100644
--- a/api_docs/kbn_server_route_repository.mdx
+++ b/api_docs/kbn_server_route_repository.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository
title: "@kbn/server-route-repository"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-route-repository plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository']
---
import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json';
diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx
index df6867453dfd2..9de480cdff020 100644
--- a/api_docs/kbn_serverless_common_settings.mdx
+++ b/api_docs/kbn_serverless_common_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings
title: "@kbn/serverless-common-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-common-settings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings']
---
import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx
index c52f5d08f5d22..ecff937d5b558 100644
--- a/api_docs/kbn_serverless_observability_settings.mdx
+++ b/api_docs/kbn_serverless_observability_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings
title: "@kbn/serverless-observability-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-observability-settings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings']
---
import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx
index f6165ecf7b45e..5e632b81d7f3b 100644
--- a/api_docs/kbn_serverless_project_switcher.mdx
+++ b/api_docs/kbn_serverless_project_switcher.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher
title: "@kbn/serverless-project-switcher"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-project-switcher plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher']
---
import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json';
diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx
index 92c144e10f0eb..3ce4a5549dbe6 100644
--- a/api_docs/kbn_serverless_search_settings.mdx
+++ b/api_docs/kbn_serverless_search_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings
title: "@kbn/serverless-search-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-search-settings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings']
---
import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx
index a6efc395eab0b..a781effb8d010 100644
--- a/api_docs/kbn_serverless_security_settings.mdx
+++ b/api_docs/kbn_serverless_security_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings
title: "@kbn/serverless-security-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-security-settings plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings']
---
import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json';
diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx
index 0f80d4c7777f6..9661db2a52079 100644
--- a/api_docs/kbn_serverless_storybook_config.mdx
+++ b/api_docs/kbn_serverless_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config
title: "@kbn/serverless-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-storybook-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config']
---
import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx
index 30eceaf6319fa..2d8f9fcd23373 100644
--- a/api_docs/kbn_shared_svg.mdx
+++ b/api_docs/kbn_shared_svg.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg
title: "@kbn/shared-svg"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-svg plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg']
---
import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx
index 980da6c5b7640..1bd8db5759791 100644
--- a/api_docs/kbn_shared_ux_avatar_solution.mdx
+++ b/api_docs/kbn_shared_ux_avatar_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution
title: "@kbn/shared-ux-avatar-solution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-avatar-solution plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution']
---
import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
index 200ffc30a4f8c..acbd1b83db795 100644
--- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
+++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen
title: "@kbn/shared-ux-button-exit-full-screen"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen']
---
import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx
index 5b25f0ae1f668..0e21aa851fa47 100644
--- a/api_docs/kbn_shared_ux_button_toolbar.mdx
+++ b/api_docs/kbn_shared_ux_button_toolbar.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar
title: "@kbn/shared-ux-button-toolbar"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-toolbar plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar']
---
import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx
index d5f7bfc4c0665..398108101438b 100644
--- a/api_docs/kbn_shared_ux_card_no_data.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data
title: "@kbn/shared-ux-card-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data']
---
import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
index 4856c9984b94b..7696e073285ce 100644
--- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks
title: "@kbn/shared-ux-card-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks']
---
import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx
index 1d322fe65e72f..4be49cb7dd672 100644
--- a/api_docs/kbn_shared_ux_chrome_navigation.mdx
+++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation
title: "@kbn/shared-ux-chrome-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-chrome-navigation plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation']
---
import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx
index 995525179de5d..8c4918b591f83 100644
--- a/api_docs/kbn_shared_ux_error_boundary.mdx
+++ b/api_docs/kbn_shared_ux_error_boundary.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary
title: "@kbn/shared-ux-error-boundary"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-error-boundary plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary']
---
import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx
index 80ba71f574725..39f0f6876308f 100644
--- a/api_docs/kbn_shared_ux_file_context.mdx
+++ b/api_docs/kbn_shared_ux_file_context.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context
title: "@kbn/shared-ux-file-context"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-context plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context']
---
import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx
index 1c61558053801..66e49d756c6f2 100644
--- a/api_docs/kbn_shared_ux_file_image.mdx
+++ b/api_docs/kbn_shared_ux_file_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image
title: "@kbn/shared-ux-file-image"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image']
---
import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx
index 187d49dbf558f..4e9a3f17fbb3e 100644
--- a/api_docs/kbn_shared_ux_file_image_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks
title: "@kbn/shared-ux-file-image-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks']
---
import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx
index 97ae9f724bcb1..81d58b66a4b03 100644
--- a/api_docs/kbn_shared_ux_file_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks
title: "@kbn/shared-ux-file-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks']
---
import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx
index a13cb87ed598e..020d14bb2ca08 100644
--- a/api_docs/kbn_shared_ux_file_picker.mdx
+++ b/api_docs/kbn_shared_ux_file_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker
title: "@kbn/shared-ux-file-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-picker plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker']
---
import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx
index 368eecd6285e8..825d923c74a00 100644
--- a/api_docs/kbn_shared_ux_file_types.mdx
+++ b/api_docs/kbn_shared_ux_file_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types
title: "@kbn/shared-ux-file-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types']
---
import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx
index e60c59f3ad72c..11ab8dc6a23c4 100644
--- a/api_docs/kbn_shared_ux_file_upload.mdx
+++ b/api_docs/kbn_shared_ux_file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload
title: "@kbn/shared-ux-file-upload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-upload plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload']
---
import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx
index 519b67c25e4c3..0e4c79987e9a9 100644
--- a/api_docs/kbn_shared_ux_file_util.mdx
+++ b/api_docs/kbn_shared_ux_file_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util
title: "@kbn/shared-ux-file-util"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-util plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util']
---
import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx
index e083e00adfa74..6492ed4a30d9e 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app
title: "@kbn/shared-ux-link-redirect-app"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app']
---
import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
index 12847b693ed15..237b5ab2dba99 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks
title: "@kbn/shared-ux-link-redirect-app-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks']
---
import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx
index d4fa3b798924f..1cd5a7ff986d0 100644
--- a/api_docs/kbn_shared_ux_markdown.mdx
+++ b/api_docs/kbn_shared_ux_markdown.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown
title: "@kbn/shared-ux-markdown"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown']
---
import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx
index cb5b61f759cd3..3ad934d65e8d9 100644
--- a/api_docs/kbn_shared_ux_markdown_mocks.mdx
+++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks
title: "@kbn/shared-ux-markdown-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks']
---
import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
index 0bb46278a69be..570a8dda68163 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data
title: "@kbn/shared-ux-page-analytics-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data']
---
import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
index 85a943301b7ec..bb3a476cf39c1 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks
title: "@kbn/shared-ux-page-analytics-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks']
---
import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
index 1d9fab180d78f..8ea7c4aa3c88c 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data
title: "@kbn/shared-ux-page-kibana-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data']
---
import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
index f5145d8702291..e3f6dbca49bbf 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks
title: "@kbn/shared-ux-page-kibana-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks']
---
import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx
index 8d2e8b6f4e2c4..a545dcae9143f 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template
title: "@kbn/shared-ux-page-kibana-template"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template']
---
import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
index db0472879de68..ebc4fd1a8a29b 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks
title: "@kbn/shared-ux-page-kibana-template-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks']
---
import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx
index 35c2111fc3a93..1cb40772ebbd8 100644
--- a/api_docs/kbn_shared_ux_page_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data
title: "@kbn/shared-ux-page-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data']
---
import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx
index 773ab1f17ba30..d74d06b37a12d 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config
title: "@kbn/shared-ux-page-no-data-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config']
---
import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
index 1e82b53a37c4b..22f433c30cb2c 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks
title: "@kbn/shared-ux-page-no-data-config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks']
---
import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
index 4d999f4026ad3..9098a5be60723 100644
--- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks
title: "@kbn/shared-ux-page-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks']
---
import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx
index 997d23cb52f3d..d389de7231bfe 100644
--- a/api_docs/kbn_shared_ux_page_solution_nav.mdx
+++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav
title: "@kbn/shared-ux-page-solution-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-solution-nav plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav']
---
import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
index 53510078c841d..1606123f72d64 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views
title: "@kbn/shared-ux-prompt-no-data-views"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views']
---
import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
index 70b028078d06f..594a990141f77 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks
title: "@kbn/shared-ux-prompt-no-data-views-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks']
---
import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx
index 84fa04865477a..bc2656033df21 100644
--- a/api_docs/kbn_shared_ux_prompt_not_found.mdx
+++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found
title: "@kbn/shared-ux-prompt-not-found"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-not-found plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found']
---
import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx
index 3217ebd50b66c..d517d414df9e2 100644
--- a/api_docs/kbn_shared_ux_router.mdx
+++ b/api_docs/kbn_shared_ux_router.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router
title: "@kbn/shared-ux-router"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router']
---
import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx
index fef28daed9e7e..6f26619f9cde5 100644
--- a/api_docs/kbn_shared_ux_router_mocks.mdx
+++ b/api_docs/kbn_shared_ux_router_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks
title: "@kbn/shared-ux-router-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router-mocks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks']
---
import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx
index 1c85c7df350d1..a16cfb6614548 100644
--- a/api_docs/kbn_shared_ux_storybook_config.mdx
+++ b/api_docs/kbn_shared_ux_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config
title: "@kbn/shared-ux-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config']
---
import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx
index 07aaf3d1c0aaa..92b5a6df17c9f 100644
--- a/api_docs/kbn_shared_ux_storybook_mock.mdx
+++ b/api_docs/kbn_shared_ux_storybook_mock.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock
title: "@kbn/shared-ux-storybook-mock"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-mock plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock']
---
import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx
index acc62ad844f10..81b13a095708c 100644
--- a/api_docs/kbn_shared_ux_tabbed_modal.mdx
+++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal
title: "@kbn/shared-ux-tabbed-modal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-tabbed-modal plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal']
---
import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx
index e07d03a05a6a2..75941d38b8873 100644
--- a/api_docs/kbn_shared_ux_utility.mdx
+++ b/api_docs/kbn_shared_ux_utility.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility
title: "@kbn/shared-ux-utility"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-utility plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility']
---
import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json';
diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx
index db9d8f9c28e6d..0550bae39a231 100644
--- a/api_docs/kbn_slo_schema.mdx
+++ b/api_docs/kbn_slo_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema
title: "@kbn/slo-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/slo-schema plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema']
---
import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json';
diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx
index 7a328f5d4362e..20f9186826419 100644
--- a/api_docs/kbn_solution_nav_es.mdx
+++ b/api_docs/kbn_solution_nav_es.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es
title: "@kbn/solution-nav-es"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/solution-nav-es plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es']
---
import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json';
diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx
index 4a849649ca053..9e558c3c946ae 100644
--- a/api_docs/kbn_solution_nav_oblt.mdx
+++ b/api_docs/kbn_solution_nav_oblt.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt
title: "@kbn/solution-nav-oblt"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/solution-nav-oblt plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt']
---
import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json';
diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx
index 3aa7659f95db4..3f8573d9b8e8e 100644
--- a/api_docs/kbn_some_dev_log.mdx
+++ b/api_docs/kbn_some_dev_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log
title: "@kbn/some-dev-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/some-dev-log plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log']
---
import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json';
diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx
index 97039b49e6f21..d9436afb04105 100644
--- a/api_docs/kbn_sort_predicates.mdx
+++ b/api_docs/kbn_sort_predicates.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates
title: "@kbn/sort-predicates"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/sort-predicates plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates']
---
import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json';
diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx
index 0150a14b493fb..538923164fc12 100644
--- a/api_docs/kbn_std.mdx
+++ b/api_docs/kbn_std.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std
title: "@kbn/std"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/std plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std']
---
import kbnStdObj from './kbn_std.devdocs.json';
diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx
index b392c95f0e0b5..bc958d4b721a0 100644
--- a/api_docs/kbn_stdio_dev_helpers.mdx
+++ b/api_docs/kbn_stdio_dev_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers
title: "@kbn/stdio-dev-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/stdio-dev-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers']
---
import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json';
diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx
index e4172673c1429..a268072eb487d 100644
--- a/api_docs/kbn_storybook.mdx
+++ b/api_docs/kbn_storybook.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook
title: "@kbn/storybook"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/storybook plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook']
---
import kbnStorybookObj from './kbn_storybook.devdocs.json';
diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx
index a30b07b4aaae4..23e6322ee8515 100644
--- a/api_docs/kbn_telemetry_tools.mdx
+++ b/api_docs/kbn_telemetry_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools
title: "@kbn/telemetry-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/telemetry-tools plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools']
---
import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json';
diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx
index 2628adfd4f610..58498e19f2b43 100644
--- a/api_docs/kbn_test.mdx
+++ b/api_docs/kbn_test.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test
title: "@kbn/test"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test']
---
import kbnTestObj from './kbn_test.devdocs.json';
diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx
index ed347b9acf915..0907c06b17776 100644
--- a/api_docs/kbn_test_eui_helpers.mdx
+++ b/api_docs/kbn_test_eui_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers
title: "@kbn/test-eui-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-eui-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers']
---
import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json';
diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx
index 2e8943ef227cb..3cd1925d40ed4 100644
--- a/api_docs/kbn_test_jest_helpers.mdx
+++ b/api_docs/kbn_test_jest_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers
title: "@kbn/test-jest-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-jest-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers']
---
import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json';
diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx
index 54d47c38a2be2..dc7ecd0eeeeef 100644
--- a/api_docs/kbn_test_subj_selector.mdx
+++ b/api_docs/kbn_test_subj_selector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector
title: "@kbn/test-subj-selector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-subj-selector plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector']
---
import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json';
diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx
index ce8a421b147fb..2247924a4a4ea 100644
--- a/api_docs/kbn_text_based_editor.mdx
+++ b/api_docs/kbn_text_based_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor
title: "@kbn/text-based-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/text-based-editor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor']
---
import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json';
diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx
index 16c07b2ef8f54..24fd45c53588c 100644
--- a/api_docs/kbn_timerange.mdx
+++ b/api_docs/kbn_timerange.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange
title: "@kbn/timerange"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/timerange plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange']
---
import kbnTimerangeObj from './kbn_timerange.devdocs.json';
diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx
index 3f97f465b4de5..f1958ab975ba9 100644
--- a/api_docs/kbn_tooling_log.mdx
+++ b/api_docs/kbn_tooling_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log
title: "@kbn/tooling-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/tooling-log plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log']
---
import kbnToolingLogObj from './kbn_tooling_log.devdocs.json';
diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx
index f7acef4bfb9c3..5cc34cd80c44a 100644
--- a/api_docs/kbn_triggers_actions_ui_types.mdx
+++ b/api_docs/kbn_triggers_actions_ui_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types
title: "@kbn/triggers-actions-ui-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/triggers-actions-ui-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types']
---
import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json';
diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx
index 2aef99077f008..e9c71b024b783 100644
--- a/api_docs/kbn_ts_projects.mdx
+++ b/api_docs/kbn_ts_projects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects
title: "@kbn/ts-projects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ts-projects plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects']
---
import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json';
diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx
index 815d2bfa36b62..8d3e4a6016ffe 100644
--- a/api_docs/kbn_typed_react_router_config.mdx
+++ b/api_docs/kbn_typed_react_router_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config
title: "@kbn/typed-react-router-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/typed-react-router-config plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config']
---
import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json';
diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx
index bdde3ed98110a..698447797bf8c 100644
--- a/api_docs/kbn_ui_actions_browser.mdx
+++ b/api_docs/kbn_ui_actions_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser
title: "@kbn/ui-actions-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-actions-browser plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser']
---
import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json';
diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx
index 826e79e66fd25..78c8a8bb5d26b 100644
--- a/api_docs/kbn_ui_shared_deps_src.mdx
+++ b/api_docs/kbn_ui_shared_deps_src.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src
title: "@kbn/ui-shared-deps-src"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-shared-deps-src plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src']
---
import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json';
diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx
index 50d01084281f5..836503275d2ec 100644
--- a/api_docs/kbn_ui_theme.mdx
+++ b/api_docs/kbn_ui_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme
title: "@kbn/ui-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-theme plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme']
---
import kbnUiThemeObj from './kbn_ui_theme.devdocs.json';
diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx
index 33160bce799d9..49c4b0c1e5329 100644
--- a/api_docs/kbn_unified_data_table.mdx
+++ b/api_docs/kbn_unified_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table
title: "@kbn/unified-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-data-table plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table']
---
import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json';
diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx
index e5d08401e8fea..903c9387e0e3b 100644
--- a/api_docs/kbn_unified_doc_viewer.mdx
+++ b/api_docs/kbn_unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer
title: "@kbn/unified-doc-viewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-doc-viewer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer']
---
import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json';
diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx
index 5fcf1bfbb7db3..16a70fbd21b8f 100644
--- a/api_docs/kbn_unified_field_list.mdx
+++ b/api_docs/kbn_unified_field_list.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list
title: "@kbn/unified-field-list"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-field-list plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list']
---
import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json';
diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx
index e7c537ad9d76d..05f0be93f7401 100644
--- a/api_docs/kbn_unsaved_changes_badge.mdx
+++ b/api_docs/kbn_unsaved_changes_badge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge
title: "@kbn/unsaved-changes-badge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unsaved-changes-badge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge']
---
import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json';
diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx
index 0840d75eefc96..fe863c054b850 100644
--- a/api_docs/kbn_use_tracked_promise.mdx
+++ b/api_docs/kbn_use_tracked_promise.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise
title: "@kbn/use-tracked-promise"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/use-tracked-promise plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise']
---
import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json';
diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx
index ef07b749d9635..2dc526f31abd5 100644
--- a/api_docs/kbn_user_profile_components.mdx
+++ b/api_docs/kbn_user_profile_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components
title: "@kbn/user-profile-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/user-profile-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components']
---
import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json';
diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx
index ec53c936d3a26..cb9059f84c52b 100644
--- a/api_docs/kbn_utility_types.mdx
+++ b/api_docs/kbn_utility_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types
title: "@kbn/utility-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types']
---
import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json';
diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx
index bb0a2dd42b0a0..e81eedce31954 100644
--- a/api_docs/kbn_utility_types_jest.mdx
+++ b/api_docs/kbn_utility_types_jest.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest
title: "@kbn/utility-types-jest"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types-jest plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest']
---
import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json';
diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx
index 854d3ad9a45cf..d00a83c8440f8 100644
--- a/api_docs/kbn_utils.mdx
+++ b/api_docs/kbn_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils
title: "@kbn/utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils']
---
import kbnUtilsObj from './kbn_utils.devdocs.json';
diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx
index 3bdf77b3414a8..9c72d1d9b89c9 100644
--- a/api_docs/kbn_visualization_ui_components.mdx
+++ b/api_docs/kbn_visualization_ui_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components
title: "@kbn/visualization-ui-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/visualization-ui-components plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components']
---
import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json';
diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx
index 6c996d9f087ed..f86381940589b 100644
--- a/api_docs/kbn_visualization_utils.mdx
+++ b/api_docs/kbn_visualization_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils
title: "@kbn/visualization-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/visualization-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils']
---
import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json';
diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx
index 1269823bde005..f30e200ac5380 100644
--- a/api_docs/kbn_xstate_utils.mdx
+++ b/api_docs/kbn_xstate_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils
title: "@kbn/xstate-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/xstate-utils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils']
---
import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json';
diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx
index e69c51ef125a9..c6504033681b2 100644
--- a/api_docs/kbn_yarn_lock_validator.mdx
+++ b/api_docs/kbn_yarn_lock_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator
title: "@kbn/yarn-lock-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/yarn-lock-validator plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator']
---
import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json';
diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx
index 2c8d6a7499eb1..b60cb5e8ce0d2 100644
--- a/api_docs/kbn_zod_helpers.mdx
+++ b/api_docs/kbn_zod_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers
title: "@kbn/zod-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/zod-helpers plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers']
---
import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json';
diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx
index bad93d4b2797e..aebc47458cc62 100644
--- a/api_docs/kibana_overview.mdx
+++ b/api_docs/kibana_overview.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview
title: "kibanaOverview"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaOverview plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview']
---
import kibanaOverviewObj from './kibana_overview.devdocs.json';
diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx
index eeb69d3e1a96a..54484886475a1 100644
--- a/api_docs/kibana_react.mdx
+++ b/api_docs/kibana_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact
title: "kibanaReact"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaReact plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact']
---
import kibanaReactObj from './kibana_react.devdocs.json';
diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx
index 14cb41ffe26ab..f4c35ef29e1e2 100644
--- a/api_docs/kibana_utils.mdx
+++ b/api_docs/kibana_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils
title: "kibanaUtils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaUtils plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils']
---
import kibanaUtilsObj from './kibana_utils.devdocs.json';
diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx
index ea4f6a9d05610..9f83470f9e626 100644
--- a/api_docs/kubernetes_security.mdx
+++ b/api_docs/kubernetes_security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity
title: "kubernetesSecurity"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kubernetesSecurity plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity']
---
import kubernetesSecurityObj from './kubernetes_security.devdocs.json';
diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx
index 83b1038ed65dc..bca03b7837fa4 100644
--- a/api_docs/lens.mdx
+++ b/api_docs/lens.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens
title: "lens"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lens plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens']
---
import lensObj from './lens.devdocs.json';
diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx
index c18d704388da8..5299a9d1710a4 100644
--- a/api_docs/license_api_guard.mdx
+++ b/api_docs/license_api_guard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard
title: "licenseApiGuard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseApiGuard plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard']
---
import licenseApiGuardObj from './license_api_guard.devdocs.json';
diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx
index 2b7f2b915bc68..aba69fa13ceaf 100644
--- a/api_docs/license_management.mdx
+++ b/api_docs/license_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement
title: "licenseManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement']
---
import licenseManagementObj from './license_management.devdocs.json';
diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx
index 0a1d9c1c2b15b..306f78f53cd55 100644
--- a/api_docs/licensing.mdx
+++ b/api_docs/licensing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing
title: "licensing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licensing plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing']
---
import licensingObj from './licensing.devdocs.json';
diff --git a/api_docs/links.mdx b/api_docs/links.mdx
index 7941d098593c8..fdb50f2ccc2b7 100644
--- a/api_docs/links.mdx
+++ b/api_docs/links.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links
title: "links"
image: https://source.unsplash.com/400x175/?github
description: API docs for the links plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links']
---
import linksObj from './links.devdocs.json';
diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx
index ce609a9e6646e..610e4108261bf 100644
--- a/api_docs/lists.mdx
+++ b/api_docs/lists.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists
title: "lists"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lists plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists']
---
import listsObj from './lists.devdocs.json';
diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx
index 6fee5aa2ad7ad..b080aea2a43bc 100644
--- a/api_docs/logs_explorer.mdx
+++ b/api_docs/logs_explorer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer
title: "logsExplorer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logsExplorer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer']
---
import logsExplorerObj from './logs_explorer.devdocs.json';
diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx
index 91a0bb3550bea..f7d4d3600a9d5 100644
--- a/api_docs/logs_shared.mdx
+++ b/api_docs/logs_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared
title: "logsShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logsShared plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared']
---
import logsSharedObj from './logs_shared.devdocs.json';
diff --git a/api_docs/management.mdx b/api_docs/management.mdx
index bd9c15dc16cda..85dd5712ae962 100644
--- a/api_docs/management.mdx
+++ b/api_docs/management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management
title: "management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the management plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management']
---
import managementObj from './management.devdocs.json';
diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx
index 66e31ee61b2ba..546e6b97cd3b0 100644
--- a/api_docs/maps.mdx
+++ b/api_docs/maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps
title: "maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the maps plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps']
---
import mapsObj from './maps.devdocs.json';
diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx
index b911a0689fa00..ec6443dcad528 100644
--- a/api_docs/maps_ems.mdx
+++ b/api_docs/maps_ems.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms
title: "mapsEms"
image: https://source.unsplash.com/400x175/?github
description: API docs for the mapsEms plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms']
---
import mapsEmsObj from './maps_ems.devdocs.json';
diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx
index 727cca5d62fce..478140ca221c0 100644
--- a/api_docs/metrics_data_access.mdx
+++ b/api_docs/metrics_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess
title: "metricsDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the metricsDataAccess plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess']
---
import metricsDataAccessObj from './metrics_data_access.devdocs.json';
diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx
index 2930e5921f8c6..aa8b3e3de703c 100644
--- a/api_docs/ml.mdx
+++ b/api_docs/ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml
title: "ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ml plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml']
---
import mlObj from './ml.devdocs.json';
diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx
index 0b07a10ab6dc3..6ca8e7352b9b4 100644
--- a/api_docs/mock_idp_plugin.mdx
+++ b/api_docs/mock_idp_plugin.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin
title: "mockIdpPlugin"
image: https://source.unsplash.com/400x175/?github
description: API docs for the mockIdpPlugin plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin']
---
import mockIdpPluginObj from './mock_idp_plugin.devdocs.json';
diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx
index c3278a566916e..08b65d4c15e60 100644
--- a/api_docs/monitoring.mdx
+++ b/api_docs/monitoring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring
title: "monitoring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoring plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring']
---
import monitoringObj from './monitoring.devdocs.json';
diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx
index 07c354d1e062b..03e013bcfc34d 100644
--- a/api_docs/monitoring_collection.mdx
+++ b/api_docs/monitoring_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection
title: "monitoringCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoringCollection plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection']
---
import monitoringCollectionObj from './monitoring_collection.devdocs.json';
diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx
index fcdb03dbc3cd2..af46c6ef1d1aa 100644
--- a/api_docs/navigation.mdx
+++ b/api_docs/navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation
title: "navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the navigation plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation']
---
import navigationObj from './navigation.devdocs.json';
diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx
index c43b991193244..9aef4e1126466 100644
--- a/api_docs/newsfeed.mdx
+++ b/api_docs/newsfeed.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed
title: "newsfeed"
image: https://source.unsplash.com/400x175/?github
description: API docs for the newsfeed plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed']
---
import newsfeedObj from './newsfeed.devdocs.json';
diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx
index da6607b897c9f..84a9dc5e2ddc3 100644
--- a/api_docs/no_data_page.mdx
+++ b/api_docs/no_data_page.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage
title: "noDataPage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the noDataPage plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage']
---
import noDataPageObj from './no_data_page.devdocs.json';
diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx
index 647c5189da88e..be2446528425c 100644
--- a/api_docs/notifications.mdx
+++ b/api_docs/notifications.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications
title: "notifications"
image: https://source.unsplash.com/400x175/?github
description: API docs for the notifications plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications']
---
import notificationsObj from './notifications.devdocs.json';
diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx
index e5afa252618a5..06cdfdff0bd8d 100644
--- a/api_docs/observability.mdx
+++ b/api_docs/observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability
title: "observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observability plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability']
---
import observabilityObj from './observability.devdocs.json';
diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx
index cfe2dc7c24064..ab4dc9d7ad1d6 100644
--- a/api_docs/observability_a_i_assistant.mdx
+++ b/api_docs/observability_a_i_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant
title: "observabilityAIAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAIAssistant plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant']
---
import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json';
diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx
index 7462476d32e3c..4ab0e3b388c6a 100644
--- a/api_docs/observability_a_i_assistant_app.mdx
+++ b/api_docs/observability_a_i_assistant_app.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp
title: "observabilityAIAssistantApp"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAIAssistantApp plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp']
---
import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json';
diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx
index 4496d3df5cf76..057c5222d61a8 100644
--- a/api_docs/observability_ai_assistant_management.mdx
+++ b/api_docs/observability_ai_assistant_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement
title: "observabilityAiAssistantManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAiAssistantManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement']
---
import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json';
diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx
index b6377b0711794..2c8f4f2ccd889 100644
--- a/api_docs/observability_logs_explorer.mdx
+++ b/api_docs/observability_logs_explorer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer
title: "observabilityLogsExplorer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityLogsExplorer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer']
---
import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json';
diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx
index 5f9e528f77bb2..52a0c702278d0 100644
--- a/api_docs/observability_onboarding.mdx
+++ b/api_docs/observability_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding
title: "observabilityOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityOnboarding plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding']
---
import observabilityOnboardingObj from './observability_onboarding.devdocs.json';
diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx
index cc118c353a48d..ac5c6fc965ba0 100644
--- a/api_docs/observability_shared.mdx
+++ b/api_docs/observability_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared
title: "observabilityShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityShared plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared']
---
import observabilitySharedObj from './observability_shared.devdocs.json';
diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx
index c8d5db8dd0fd5..8d4ebf8f35261 100644
--- a/api_docs/osquery.mdx
+++ b/api_docs/osquery.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery
title: "osquery"
image: https://source.unsplash.com/400x175/?github
description: API docs for the osquery plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery']
---
import osqueryObj from './osquery.devdocs.json';
diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx
index a916a8d0b3c72..4ba9b1cc4af1f 100644
--- a/api_docs/painless_lab.mdx
+++ b/api_docs/painless_lab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab
title: "painlessLab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the painlessLab plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab']
---
import painlessLabObj from './painless_lab.devdocs.json';
diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx
index 41ca99cb5c9fb..ba20360721af3 100644
--- a/api_docs/plugin_directory.mdx
+++ b/api_docs/plugin_directory.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory
slug: /kibana-dev-docs/api-meta/plugin-api-directory
title: Directory
description: Directory of public APIs available through plugins or packages.
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
@@ -21,13 +21,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| API Count | Any Count | Missing comments | Missing exports |
|--------------|----------|-----------------|--------|
-| 47428 | 240 | 36084 | 1851 |
+| 47427 | 240 | 36084 | 1851 |
## Plugin Directory
| Plugin name | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports |
|--------------|----------------|-----------|--------------|----------|---------------|--------|
-| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 298 | 0 | 292 | 32 |
+| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 301 | 0 | 295 | 32 |
| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 |
| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 |
| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 0 | 4 | 1 |
@@ -64,7 +64,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 3 |
| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 10 | 0 | 10 | 5 |
| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 |
-| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 156 | 0 | 108 | 27 |
+| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 144 | 0 | 97 | 27 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 2 |
| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 |
| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 45 | 0 | 31 | 0 |
@@ -170,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 15 | 0 | 9 | 1 |
| searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 |
| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 410 | 0 | 200 | 2 |
-| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 189 | 0 | 119 | 36 |
+| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 190 | 0 | 120 | 36 |
| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 |
| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 |
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 25 | 0 | 24 | 0 |
@@ -482,7 +482,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 |
| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 63 | 1 | 63 | 6 |
-| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 21 | 0 | 19 | 0 |
+| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 24 | 0 | 22 | 0 |
| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 8 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 |
@@ -579,7 +579,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 65 | 0 | 61 | 1 |
-| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 178 | 0 | 149 | 6 |
+| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 182 | 0 | 153 | 6 |
| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 |
diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx
index e1c347247dc08..e99ee946fdae1 100644
--- a/api_docs/presentation_panel.mdx
+++ b/api_docs/presentation_panel.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel
title: "presentationPanel"
image: https://source.unsplash.com/400x175/?github
description: API docs for the presentationPanel plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel']
---
import presentationPanelObj from './presentation_panel.devdocs.json';
diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx
index 5ba47ca3f8b39..e907544ef2d2c 100644
--- a/api_docs/presentation_util.mdx
+++ b/api_docs/presentation_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil
title: "presentationUtil"
image: https://source.unsplash.com/400x175/?github
description: API docs for the presentationUtil plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil']
---
import presentationUtilObj from './presentation_util.devdocs.json';
diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx
index 30223b9b8b386..ba21dbf7d65c9 100644
--- a/api_docs/profiling.mdx
+++ b/api_docs/profiling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling
title: "profiling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profiling plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling']
---
import profilingObj from './profiling.devdocs.json';
diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx
index 8a7059447a774..1c623f816637c 100644
--- a/api_docs/profiling_data_access.mdx
+++ b/api_docs/profiling_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess
title: "profilingDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profilingDataAccess plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess']
---
import profilingDataAccessObj from './profiling_data_access.devdocs.json';
diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx
index f33bc9526e01c..bd595ffcc5cfd 100644
--- a/api_docs/remote_clusters.mdx
+++ b/api_docs/remote_clusters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters
title: "remoteClusters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the remoteClusters plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters']
---
import remoteClustersObj from './remote_clusters.devdocs.json';
diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx
index 3bfffcff0a671..bbfcbfed6b5df 100644
--- a/api_docs/reporting.mdx
+++ b/api_docs/reporting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting
title: "reporting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the reporting plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting']
---
import reportingObj from './reporting.devdocs.json';
diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx
index 51359229cd989..40f78d24a8e3a 100644
--- a/api_docs/rollup.mdx
+++ b/api_docs/rollup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup
title: "rollup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the rollup plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup']
---
import rollupObj from './rollup.devdocs.json';
diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx
index 147d1ff4b17e7..84e1e4a0efb9c 100644
--- a/api_docs/rule_registry.mdx
+++ b/api_docs/rule_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry
title: "ruleRegistry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ruleRegistry plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry']
---
import ruleRegistryObj from './rule_registry.devdocs.json';
diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx
index eeebd13eb952a..6f69d632cdbe6 100644
--- a/api_docs/runtime_fields.mdx
+++ b/api_docs/runtime_fields.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields
title: "runtimeFields"
image: https://source.unsplash.com/400x175/?github
description: API docs for the runtimeFields plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields']
---
import runtimeFieldsObj from './runtime_fields.devdocs.json';
diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx
index 2493f231c4e9e..5c608fb37bf75 100644
--- a/api_docs/saved_objects.mdx
+++ b/api_docs/saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects
title: "savedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjects plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects']
---
import savedObjectsObj from './saved_objects.devdocs.json';
diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx
index 0ac3b88491fd5..f831d1c3ba4c3 100644
--- a/api_docs/saved_objects_finder.mdx
+++ b/api_docs/saved_objects_finder.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder
title: "savedObjectsFinder"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsFinder plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder']
---
import savedObjectsFinderObj from './saved_objects_finder.devdocs.json';
diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx
index 88bd0f315fc72..0f19dc555d805 100644
--- a/api_docs/saved_objects_management.mdx
+++ b/api_docs/saved_objects_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement
title: "savedObjectsManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsManagement plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement']
---
import savedObjectsManagementObj from './saved_objects_management.devdocs.json';
diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx
index 8335c5523c4be..9d65e49015861 100644
--- a/api_docs/saved_objects_tagging.mdx
+++ b/api_docs/saved_objects_tagging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging
title: "savedObjectsTagging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTagging plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging']
---
import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json';
diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx
index 1dbd2bdd9a822..7982c2fb6264c 100644
--- a/api_docs/saved_objects_tagging_oss.mdx
+++ b/api_docs/saved_objects_tagging_oss.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss
title: "savedObjectsTaggingOss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTaggingOss plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss']
---
import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json';
diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx
index 0a399d7726750..ada34b7a9a651 100644
--- a/api_docs/saved_search.mdx
+++ b/api_docs/saved_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch
title: "savedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedSearch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch']
---
import savedSearchObj from './saved_search.devdocs.json';
diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx
index d9d93cf289cbf..1ac4cb4c375ad 100644
--- a/api_docs/screenshot_mode.mdx
+++ b/api_docs/screenshot_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode
title: "screenshotMode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotMode plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode']
---
import screenshotModeObj from './screenshot_mode.devdocs.json';
diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx
index 63a05fadbbc22..292ada3f776b5 100644
--- a/api_docs/screenshotting.mdx
+++ b/api_docs/screenshotting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting
title: "screenshotting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotting plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting']
---
import screenshottingObj from './screenshotting.devdocs.json';
diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx
index 50234bd0158ad..b37a360a7b4b3 100644
--- a/api_docs/search_connectors.mdx
+++ b/api_docs/search_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors
title: "searchConnectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchConnectors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors']
---
import searchConnectorsObj from './search_connectors.devdocs.json';
diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx
index 8bd1c9928ef70..aa482f475883d 100644
--- a/api_docs/search_notebooks.mdx
+++ b/api_docs/search_notebooks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks
title: "searchNotebooks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchNotebooks plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks']
---
import searchNotebooksObj from './search_notebooks.devdocs.json';
diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx
index 0734255c6dc3c..e2ddd029a7e6c 100644
--- a/api_docs/search_playground.mdx
+++ b/api_docs/search_playground.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground
title: "searchPlayground"
image: https://source.unsplash.com/400x175/?github
description: API docs for the searchPlayground plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground']
---
import searchPlaygroundObj from './search_playground.devdocs.json';
diff --git a/api_docs/security.mdx b/api_docs/security.mdx
index bc5281fe1c98b..4f0d5fd4388d3 100644
--- a/api_docs/security.mdx
+++ b/api_docs/security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security
title: "security"
image: https://source.unsplash.com/400x175/?github
description: API docs for the security plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security']
---
import securityObj from './security.devdocs.json';
diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json
index 37fb9b4540fe2..1330b20f12171 100644
--- a/api_docs/security_solution.devdocs.json
+++ b/api_docs/security_solution.devdocs.json
@@ -2849,6 +2849,30 @@
],
"returnComment": []
},
+ {
+ "parentPluginId": "securitySolution",
+ "id": "def-server.SecuritySolutionApiRequestHandlerContext.getAuditLogger",
+ "type": "Function",
+ "tags": [],
+ "label": "getAuditLogger",
+ "description": [],
+ "signature": [
+ "() => ",
+ {
+ "pluginId": "@kbn/security-plugin-types-server",
+ "scope": "server",
+ "docId": "kibKbnSecurityPluginTypesServerPluginApi",
+ "section": "def-server.AuditLogger",
+ "text": "AuditLogger"
+ },
+ " | undefined"
+ ],
+ "path": "x-pack/plugins/security_solution/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [],
+ "returnComment": []
+ },
{
"parentPluginId": "securitySolution",
"id": "def-server.SecuritySolutionApiRequestHandlerContext.getExceptionListClient",
diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx
index 3a780bb2b743f..08c4470a54fea 100644
--- a/api_docs/security_solution.mdx
+++ b/api_docs/security_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution
title: "securitySolution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolution plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution']
---
import securitySolutionObj from './security_solution.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/secur
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 189 | 0 | 119 | 36 |
+| 190 | 0 | 120 | 36 |
## Client
diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx
index d876284999c3e..061742e193ded 100644
--- a/api_docs/security_solution_ess.mdx
+++ b/api_docs/security_solution_ess.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss
title: "securitySolutionEss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionEss plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss']
---
import securitySolutionEssObj from './security_solution_ess.devdocs.json';
diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx
index 7f8cd1e9e3c59..f1753ca1300f7 100644
--- a/api_docs/security_solution_serverless.mdx
+++ b/api_docs/security_solution_serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless
title: "securitySolutionServerless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionServerless plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless']
---
import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json';
diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx
index 858f52ec2679a..7c2f658239003 100644
--- a/api_docs/serverless.mdx
+++ b/api_docs/serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless
title: "serverless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverless plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless']
---
import serverlessObj from './serverless.devdocs.json';
diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx
index 9560568496a68..654b23d3903ba 100644
--- a/api_docs/serverless_observability.mdx
+++ b/api_docs/serverless_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability
title: "serverlessObservability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessObservability plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability']
---
import serverlessObservabilityObj from './serverless_observability.devdocs.json';
diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx
index 8b22f7abaca63..3d6d2518ba545 100644
--- a/api_docs/serverless_search.mdx
+++ b/api_docs/serverless_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch
title: "serverlessSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessSearch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch']
---
import serverlessSearchObj from './serverless_search.devdocs.json';
diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx
index 7b9f51a9f0f01..f138a283dbdd7 100644
--- a/api_docs/session_view.mdx
+++ b/api_docs/session_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView
title: "sessionView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the sessionView plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView']
---
import sessionViewObj from './session_view.devdocs.json';
diff --git a/api_docs/share.mdx b/api_docs/share.mdx
index b26f1c2a4d8e1..8fa0e1986e4d8 100644
--- a/api_docs/share.mdx
+++ b/api_docs/share.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share
title: "share"
image: https://source.unsplash.com/400x175/?github
description: API docs for the share plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share']
---
import shareObj from './share.devdocs.json';
diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx
index d06e6c8de46c0..1bde8b80968c0 100644
--- a/api_docs/slo.mdx
+++ b/api_docs/slo.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo
title: "slo"
image: https://source.unsplash.com/400x175/?github
description: API docs for the slo plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo']
---
import sloObj from './slo.devdocs.json';
diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx
index aec1404302652..6d8845b386af3 100644
--- a/api_docs/snapshot_restore.mdx
+++ b/api_docs/snapshot_restore.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore
title: "snapshotRestore"
image: https://source.unsplash.com/400x175/?github
description: API docs for the snapshotRestore plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore']
---
import snapshotRestoreObj from './snapshot_restore.devdocs.json';
diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx
index 8b3d044d92bec..2d560031b8fee 100644
--- a/api_docs/spaces.mdx
+++ b/api_docs/spaces.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces
title: "spaces"
image: https://source.unsplash.com/400x175/?github
description: API docs for the spaces plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces']
---
import spacesObj from './spaces.devdocs.json';
diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx
index aa46073968f11..2e34b1aaec17a 100644
--- a/api_docs/stack_alerts.mdx
+++ b/api_docs/stack_alerts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts
title: "stackAlerts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackAlerts plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts']
---
import stackAlertsObj from './stack_alerts.devdocs.json';
diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx
index 033811a9c1e54..ac9c5ce210674 100644
--- a/api_docs/stack_connectors.mdx
+++ b/api_docs/stack_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors
title: "stackConnectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackConnectors plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors']
---
import stackConnectorsObj from './stack_connectors.devdocs.json';
diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx
index d9211312777e2..9f2244b89eaf4 100644
--- a/api_docs/task_manager.mdx
+++ b/api_docs/task_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager
title: "taskManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the taskManager plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager']
---
import taskManagerObj from './task_manager.devdocs.json';
diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx
index 53bf5eeac8d6f..1c8662db8adb9 100644
--- a/api_docs/telemetry.mdx
+++ b/api_docs/telemetry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry
title: "telemetry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetry plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry']
---
import telemetryObj from './telemetry.devdocs.json';
diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx
index a50a79e1ab6ce..a527034afef62 100644
--- a/api_docs/telemetry_collection_manager.mdx
+++ b/api_docs/telemetry_collection_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager
title: "telemetryCollectionManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionManager plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager']
---
import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json';
diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx
index df68620da05f8..b7dbada2f98f8 100644
--- a/api_docs/telemetry_collection_xpack.mdx
+++ b/api_docs/telemetry_collection_xpack.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack
title: "telemetryCollectionXpack"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionXpack plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack']
---
import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json';
diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx
index 6696916cc1c14..36bd881cdde33 100644
--- a/api_docs/telemetry_management_section.mdx
+++ b/api_docs/telemetry_management_section.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection
title: "telemetryManagementSection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryManagementSection plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection']
---
import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json';
diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx
index cbeeecf23e6fd..8da665e2fab5f 100644
--- a/api_docs/text_based_languages.mdx
+++ b/api_docs/text_based_languages.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages
title: "textBasedLanguages"
image: https://source.unsplash.com/400x175/?github
description: API docs for the textBasedLanguages plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages']
---
import textBasedLanguagesObj from './text_based_languages.devdocs.json';
diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx
index bdc10f2952f26..edb2ccb6a752c 100644
--- a/api_docs/threat_intelligence.mdx
+++ b/api_docs/threat_intelligence.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence
title: "threatIntelligence"
image: https://source.unsplash.com/400x175/?github
description: API docs for the threatIntelligence plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence']
---
import threatIntelligenceObj from './threat_intelligence.devdocs.json';
diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx
index a3ee52d900b0f..20b5ee70fc0f9 100644
--- a/api_docs/timelines.mdx
+++ b/api_docs/timelines.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines
title: "timelines"
image: https://source.unsplash.com/400x175/?github
description: API docs for the timelines plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines']
---
import timelinesObj from './timelines.devdocs.json';
diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx
index 5b251f7a1792c..8cd0e82168679 100644
--- a/api_docs/transform.mdx
+++ b/api_docs/transform.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform
title: "transform"
image: https://source.unsplash.com/400x175/?github
description: API docs for the transform plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform']
---
import transformObj from './transform.devdocs.json';
diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx
index 933de564fa363..be1ab03249546 100644
--- a/api_docs/triggers_actions_ui.mdx
+++ b/api_docs/triggers_actions_ui.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi
title: "triggersActionsUi"
image: https://source.unsplash.com/400x175/?github
description: API docs for the triggersActionsUi plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi']
---
import triggersActionsUiObj from './triggers_actions_ui.devdocs.json';
diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx
index 310432e2fdad5..d32e6b85bc089 100644
--- a/api_docs/ui_actions.mdx
+++ b/api_docs/ui_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions
title: "uiActions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActions plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions']
---
import uiActionsObj from './ui_actions.devdocs.json';
diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx
index 41759f84631df..507f3a13a40f9 100644
--- a/api_docs/ui_actions_enhanced.mdx
+++ b/api_docs/ui_actions_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced
title: "uiActionsEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActionsEnhanced plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced']
---
import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json';
diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx
index ffdfbbbd4206d..e13592db995f1 100644
--- a/api_docs/unified_doc_viewer.mdx
+++ b/api_docs/unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer
title: "unifiedDocViewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedDocViewer plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer']
---
import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json';
diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx
index bf3896d5649cf..12e282b63b639 100644
--- a/api_docs/unified_histogram.mdx
+++ b/api_docs/unified_histogram.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram
title: "unifiedHistogram"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedHistogram plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram']
---
import unifiedHistogramObj from './unified_histogram.devdocs.json';
diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx
index 556a490b2b1fd..c8040b51e819e 100644
--- a/api_docs/unified_search.mdx
+++ b/api_docs/unified_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch
title: "unifiedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch']
---
import unifiedSearchObj from './unified_search.devdocs.json';
diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx
index b594e4434d351..e9863492dcab2 100644
--- a/api_docs/unified_search_autocomplete.mdx
+++ b/api_docs/unified_search_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete
title: "unifiedSearch.autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch.autocomplete plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete']
---
import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json';
diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx
index cdd78c505f3a7..fd740fbc46b9d 100644
--- a/api_docs/uptime.mdx
+++ b/api_docs/uptime.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime
title: "uptime"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uptime plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime']
---
import uptimeObj from './uptime.devdocs.json';
diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx
index 1e0957f9243a3..3ff967b9b9761 100644
--- a/api_docs/url_forwarding.mdx
+++ b/api_docs/url_forwarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding
title: "urlForwarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the urlForwarding plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding']
---
import urlForwardingObj from './url_forwarding.devdocs.json';
diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx
index 64cf7a3cd8a17..a3e26e9788d26 100644
--- a/api_docs/usage_collection.mdx
+++ b/api_docs/usage_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection
title: "usageCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the usageCollection plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection']
---
import usageCollectionObj from './usage_collection.devdocs.json';
diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx
index 85aa37d1de037..019cbb76bfe78 100644
--- a/api_docs/ux.mdx
+++ b/api_docs/ux.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux
title: "ux"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ux plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux']
---
import uxObj from './ux.devdocs.json';
diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx
index 5911fcbb7e217..715cd40f9871c 100644
--- a/api_docs/vis_default_editor.mdx
+++ b/api_docs/vis_default_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor
title: "visDefaultEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visDefaultEditor plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor']
---
import visDefaultEditorObj from './vis_default_editor.devdocs.json';
diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx
index 0d3d23a280aa1..b3c72708227c6 100644
--- a/api_docs/vis_type_gauge.mdx
+++ b/api_docs/vis_type_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge
title: "visTypeGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeGauge plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge']
---
import visTypeGaugeObj from './vis_type_gauge.devdocs.json';
diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx
index 21f384e2eaa06..f544db74a3b14 100644
--- a/api_docs/vis_type_heatmap.mdx
+++ b/api_docs/vis_type_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap
title: "visTypeHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeHeatmap plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap']
---
import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json';
diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx
index 648776cb3efc1..c6bd7dc9df1af 100644
--- a/api_docs/vis_type_pie.mdx
+++ b/api_docs/vis_type_pie.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie
title: "visTypePie"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypePie plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie']
---
import visTypePieObj from './vis_type_pie.devdocs.json';
diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx
index 0e017df6a7007..d8907d1c8fae7 100644
--- a/api_docs/vis_type_table.mdx
+++ b/api_docs/vis_type_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable
title: "visTypeTable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTable plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable']
---
import visTypeTableObj from './vis_type_table.devdocs.json';
diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx
index ea0f1acc95e5b..91ba8f336060f 100644
--- a/api_docs/vis_type_timelion.mdx
+++ b/api_docs/vis_type_timelion.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion
title: "visTypeTimelion"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimelion plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion']
---
import visTypeTimelionObj from './vis_type_timelion.devdocs.json';
diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx
index 8ac3c85233644..37d613a330bc1 100644
--- a/api_docs/vis_type_timeseries.mdx
+++ b/api_docs/vis_type_timeseries.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries
title: "visTypeTimeseries"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimeseries plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries']
---
import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json';
diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx
index efd0efbe79b91..fa826b2aba4f4 100644
--- a/api_docs/vis_type_vega.mdx
+++ b/api_docs/vis_type_vega.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega
title: "visTypeVega"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVega plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega']
---
import visTypeVegaObj from './vis_type_vega.devdocs.json';
diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx
index cde653d3b7478..f60dc022cff08 100644
--- a/api_docs/vis_type_vislib.mdx
+++ b/api_docs/vis_type_vislib.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib
title: "visTypeVislib"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVislib plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib']
---
import visTypeVislibObj from './vis_type_vislib.devdocs.json';
diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx
index f430bda90ad99..1241ee6d1465a 100644
--- a/api_docs/vis_type_xy.mdx
+++ b/api_docs/vis_type_xy.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy
title: "visTypeXy"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeXy plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy']
---
import visTypeXyObj from './vis_type_xy.devdocs.json';
diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx
index 046872d18271d..27d359281b6ae 100644
--- a/api_docs/visualizations.mdx
+++ b/api_docs/visualizations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations
title: "visualizations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visualizations plugin
-date: 2024-04-23
+date: 2024-04-24
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations']
---
import visualizationsObj from './visualizations.devdocs.json';
From c91217463713d90ff454b7cb968151e3a2caa533 Mon Sep 17 00:00:00 2001
From: Rudolf Meijering
Date: Wed, 24 Apr 2024 09:34:42 +0200
Subject: [PATCH 098/183] Make readWithPit integration tests less sensitive to
ES response size (#180261)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary
Stateless ES increased their `pit_id` length from 185 to 465 chars. Our
tests were quite sensitive to response sizes so these started failing.
This PR makes tests less sensitive to the exact response size because I
don't think it matters that much, as long as we know that `batchSize: 1`
is ✅ while a `batchSize: 1000` is 🔴 .
### Checklist
Delete any items that are not applicable to this PR.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
### Risk Matrix
Delete this section if it is not applicable to this PR.
Before closing this PR, invite QA, stakeholders, and other developers to
identify risks that should be tested prior to the change/feature
release.
When forming the risk matrix, consider some of the following examples
and how they may potentially impact the change:
| Risk | Probability | Severity | Mitigation/Notes |
|---------------------------|-------------|----------|-------------------------|
| Multiple Spaces—unexpected behavior in non-default Kibana Space.
| Low | High | Integration tests will verify that all features are still
supported in non-default Kibana Space and when user switches between
spaces. |
| Multiple nodes—Elasticsearch polling might have race conditions
when multiple Kibana nodes are polling for the same tasks. | High | Low
| Tasks are idempotent, so executing them multiple times will not result
in logical error, but will degrade performance. To test for this case we
add plenty of unit tests around this logic and document manual testing
procedure. |
| Code should gracefully handle cases when feature X or plugin Y are
disabled. | Medium | High | Unit tests will verify that any feature flag
or plugin combination still results in our service operational. |
| [See more potential risk
examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) |
### For maintainers
- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
---
.../migrations/group3/actions/actions.test.ts | 17 +++++++--------
.../group3/actions/actions_test_suite.ts | 21 ++++++++-----------
2 files changed, 17 insertions(+), 21 deletions(-)
diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts
index 0b4c885484053..e6938bb7a26bb 100644
--- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts
+++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts
@@ -1309,11 +1309,15 @@ describe('migration actions', () => {
query: { match_all: {} },
batchSize: 1, // small batch size so we don't exceed the maxResponseSize
searchAfter: undefined,
- maxResponseSizeBytes: 500, // set a small size to force the error
+ maxResponseSizeBytes: 1000, // set a small size to force the error
});
- const rightResponse = (await readWithPitTask()) as Either.Right;
+ const rightResponse = await readWithPitTask();
- await expect(Either.isRight(rightResponse)).toBe(true);
+ if (Either.isLeft(rightResponse)) {
+ throw new Error(
+ `Expected a successful response but got ${JSON.stringify(rightResponse.left)}`
+ );
+ }
readWithPitTask = readWithPit({
client,
@@ -1321,17 +1325,12 @@ describe('migration actions', () => {
query: { match_all: {} },
batchSize: 10, // a bigger batch will exceed the maxResponseSize
searchAfter: undefined,
- maxResponseSizeBytes: 500, // set a small size to force the error
+ maxResponseSizeBytes: 1000, // set a small size to force the error
});
const leftResponse = (await readWithPitTask()) as Either.Left;
expect(leftResponse.left.type).toBe('es_response_too_large');
- // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7
- // if ES takes more than 9ms, the payload will be 1 byte bigger.
- // see https://github.com/elastic/kibana/issues/160994
- // Thus, the statements below account for response times up to 99ms
expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184);
- expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185);
});
it('rejects if PIT does not exist', async () => {
diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts
index b11efed76e529..f89b9891b8b21 100644
--- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts
+++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts
@@ -1348,9 +1348,7 @@ export const runActionTestSuite = ({
);
});
- // consistently breaking in CI:
- // https://github.com/elastic/kibana/issues/167288
- it.skip('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => {
+ it('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => {
const openPitTask = openPit({ client, index: 'existing_index_with_docs' });
const pitResponse = (await openPitTask()) as Either.Right;
@@ -1360,11 +1358,15 @@ export const runActionTestSuite = ({
query: { match_all: {} },
batchSize: 1, // small batch size so we don't exceed the maxResponseSize
searchAfter: undefined,
- maxResponseSizeBytes: 500, // set a small size to force the error
+ maxResponseSizeBytes: 1000, // set a small size to force the error
});
- const rightResponse = (await readWithPitTask()) as Either.Right;
+ const rightResponse = await readWithPitTask();
- await expect(Either.isRight(rightResponse)).toBe(true);
+ if (Either.isLeft(rightResponse)) {
+ throw new Error(
+ `Expected a successful response but got ${JSON.stringify(rightResponse.left)}`
+ );
+ }
readWithPitTask = readWithPit({
client,
@@ -1372,17 +1374,12 @@ export const runActionTestSuite = ({
query: { match_all: {} },
batchSize: 10, // a bigger batch will exceed the maxResponseSize
searchAfter: undefined,
- maxResponseSizeBytes: 500, // set a small size to force the error
+ maxResponseSizeBytes: 1000, // set a small size to force the error
});
const leftResponse = (await readWithPitTask()) as Either.Left;
expect(leftResponse.left.type).toBe('es_response_too_large');
- // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7
- // if ES takes more than 9ms, the payload will be 1 byte bigger.
- // see https://github.com/elastic/kibana/issues/160994
- // Thus, the statements below account for response times up to 99ms
expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184);
- expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185);
});
it('rejects if PIT does not exist', async () => {
From b3b665bfc82f7f23b73d4f1a812e3a983a7da899 Mon Sep 17 00:00:00 2001
From: Mykola Harmash
Date: Wed, 24 Apr 2024 09:57:35 +0200
Subject: [PATCH 099/183] [Onboarding] Scroll to the featured cards when
clicking on the category (#181438)
Closes https://github.com/elastic/kibana/issues/180827
Adds the logic to wait for the packages to load and scroll them into
view.
https://github.com/elastic/kibana/assets/793851/38a36c39-c851-449d-ab31-28dccbfd8825
---
.../onboarding_flow_form.tsx | 27 +++++++++++++++++--
.../application/packages_list/index.tsx | 10 ++++++-
2 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
index 1e10139963a75..dde4e5b1b108d 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx
@@ -6,7 +6,7 @@
*/
import { i18n } from '@kbn/i18n';
-import React, { useCallback, useEffect, useState } from 'react';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
import { FormattedMessage } from '@kbn/i18n-react';
import type { FunctionComponent } from 'react';
import {
@@ -82,8 +82,29 @@ export const OnboardingFlowForm: FunctionComponent = () => {
const [searchParams, setSearchParams] = useSearchParams();
- const packageListRef = React.useRef(null);
+ const [hasPackageListLoaded, setHasPackageListLoaded] = useState(false);
+ const onPackageListLoaded = useCallback(() => {
+ setHasPackageListLoaded(true);
+ }, []);
+ const packageListRef = useRef(null);
+ const customCardsRef = useRef(null);
const [integrationSearch, setIntegrationSearch] = useState(searchParams.get('search') ?? '');
+ const selectedCategory: Category | null = searchParams.get('category') as Category | null;
+
+ useEffect(() => {
+ if (selectedCategory === null || !hasPackageListLoaded) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ customCardsRef.current?.scrollIntoView({
+ behavior: 'smooth',
+ block: 'end',
+ });
+ }, 10);
+
+ return () => clearTimeout(timeout);
+ }, [selectedCategory, hasPackageListLoaded]);
useEffect(() => {
const searchParam = searchParams.get('search') ?? '';
@@ -168,9 +189,11 @@ export const OnboardingFlowForm: FunctionComponent = () => {
{Array.isArray(customCards) && (
)}
diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
index ad02ad7b977cb..967cf1c5834e8 100644
--- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
+++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx
@@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { EuiButton, EuiCallOut, EuiSearchBar, EuiSkeletonText } from '@elastic/eui';
import { css } from '@emotion/react';
-import React, { useRef, Suspense } from 'react';
+import React, { useRef, Suspense, useEffect } from 'react';
import useAsyncRetry from 'react-use/lib/useAsyncRetry';
import { PackageList, fetchAvailablePackagesHook } from './lazy';
import { useIntegrationCardList } from './use_integration_card_list';
@@ -38,6 +38,7 @@ interface Props {
* When enabled, custom and integration cards are joined into a single list.
*/
joinCardLists?: boolean;
+ onLoaded?: () => void;
}
type WrapperProps = Props & {
@@ -57,6 +58,7 @@ const PackageListGridWrapper = ({
flowCategory,
flowSearch,
joinCardLists = false,
+ onLoaded,
}: WrapperProps) => {
const customMargin = useCustomMargin();
const { filteredCards, isLoading } = useAvailablePackages({
@@ -72,6 +74,12 @@ const PackageListGridWrapper = ({
joinCardLists
);
+ useEffect(() => {
+ if (!isLoading && onLoaded !== undefined) {
+ onLoaded();
+ }
+ }, [isLoading, onLoaded]);
+
if (isLoading) return ;
const showPackageList = (showSearchBar && !!searchQuery) || showSearchBar === false;
From 0f3ecf739e2040a8831c508f1df92c11bb5028dc Mon Sep 17 00:00:00 2001
From: Pierre Gayvallet
Date: Wed, 24 Apr 2024 10:20:05 +0200
Subject: [PATCH 100/183] [Security into Core] expose `userProfile` service
from Core (#180372)
## Summary
Fix https://github.com/elastic/kibana/issues/178932
- Introduce the new `userProfile` core service, both on the browser and
server-side.
- Have the security plugin register its API to Core for re-exposition
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
---
.github/CODEOWNERS | 7 +
package.json | 7 +
.../src/core_route_handler_context.test.ts | 29 ++++
.../src/core_route_handler_context.ts | 16 ++
.../core_route_handler_context_params.mock.ts | 2 +
.../tsconfig.json | 2 +
.../src/request_handler_context.ts | 2 +
.../tsconfig.json | 3 +-
.../src/internal_core_setup.ts | 7 +-
.../src/internal_core_start.ts | 4 +-
.../tsconfig.json | 3 +-
.../src/core_setup.mock.ts | 2 +
.../src/core_start.mock.ts | 2 +
.../tsconfig.json | 3 +-
.../core-lifecycle-browser/src/core_setup.ts | 3 +
.../core-lifecycle-browser/src/core_start.ts | 3 +
.../core-lifecycle-browser/tsconfig.json | 3 +-
.../src/internal_core_setup.ts | 2 +
.../src/internal_core_start.ts | 2 +
.../tsconfig.json | 3 +-
.../src/core_setup.mock.ts | 2 +
.../src/core_start.mock.ts | 2 +
.../src/internal_core_setup.mock.ts | 2 +
.../src/internal_core_start.mock.ts | 2 +
.../core-lifecycle-server-mocks/tsconfig.json | 1 +
.../core-lifecycle-server/src/core_setup.ts | 3 +
.../core-lifecycle-server/src/core_start.ts | 3 +
.../core-lifecycle-server/tsconfig.json | 3 +-
.../src/plugin_context.ts | 7 +-
.../src/plugins_service.test.ts | 5 +
.../tsconfig.json | 1 +
.../src/plugin_context.ts | 7 +-
.../src/core_system.test.mocks.ts | 9 ++
.../src/core_system.test.ts | 13 ++
.../src/core_system.ts | 8 +
.../core-root-browser-internal/tsconfig.json | 2 +
.../src/server.test.mocks.ts | 6 +
.../src/server.test.ts | 8 +
.../core-root-server-internal/src/server.ts | 8 +
.../core-root-server-internal/tsconfig.json | 2 +
.../src/security_service.test.ts | 18 +--
.../src/security_service.ts | 6 +-
.../src/utils/convert_security_api.test.ts | 4 +-
.../src/utils/convert_security_api.ts | 4 +-
.../src/utils/default_implementation.test.ts | 4 +-
.../src/utils/default_implementation.ts | 4 +-
.../src/security_service.mock.ts | 4 +-
.../security/core-security-browser/index.ts | 5 +-
.../core-security-browser/src/api_provider.ts | 2 +-
.../core-security-browser/src/contracts.ts | 4 +-
.../src/security_service.test.ts | 18 +--
.../src/security_service.ts | 6 +-
.../src/utils/convert_security_api.test.ts | 4 +-
.../src/utils/convert_security_api.ts | 4 +-
.../src/utils/default_implementation.test.ts | 4 +-
.../src/utils/default_implementation.ts | 4 +-
.../src/security_service.mock.ts | 4 +-
.../security/core-security-server/index.ts | 5 +-
.../core-security-server/src/api_provider.ts | 2 +-
.../core-security-server/src/contracts.ts | 4 +-
.../README.md | 3 +
.../index.ts | 12 ++
.../jest.config.js | 13 ++
.../kibana.jsonc | 5 +
.../package.json | 6 +
.../src/internal_contracts.ts | 15 ++
.../src/user_profile_service.test.mocks.ts | 19 +++
.../src/user_profile_service.test.ts | 97 ++++++++++++
.../src/user_profile_service.ts | 48 ++++++
.../src/utils/convert_api.test.ts | 76 ++++++++++
.../src/utils/convert_api.ts | 23 +++
.../src/utils/default_implementation.test.ts | 34 +++++
.../src/utils/default_implementation.ts | 26 ++++
.../src/utils/index.ts | 10 ++
.../tsconfig.json | 26 ++++
.../core-user-profile-browser-mocks/README.md | 3 +
.../core-user-profile-browser-mocks/index.ts | 9 ++
.../jest.config.js | 13 ++
.../kibana.jsonc | 5 +
.../package.json | 6 +
.../src/user_profile_service.mock.ts | 76 ++++++++++
.../tsconfig.json | 22 +++
.../core-user-profile-browser/README.md | 3 +
.../core-user-profile-browser/index.ts | 17 +++
.../core-user-profile-browser/jest.config.js | 13 ++
.../core-user-profile-browser/kibana.jsonc | 5 +
.../core-user-profile-browser/package.json | 6 +
.../src/api_provider.ts | 14 ++
.../src/contracts.ts | 31 ++++
.../core-user-profile-browser/src/service.ts | 135 +++++++++++++++++
.../core-user-profile-browser/tsconfig.json | 22 +++
.../core-user-profile-common/README.md | 3 +
.../core-user-profile-common/index.ts | 16 ++
.../core-user-profile-common/jest.config.js | 13 ++
.../core-user-profile-common/kibana.jsonc | 5 +
.../core-user-profile-common/package.json | 6 +
.../src}/user_profile.ts | 5 +-
.../core-user-profile-common/tsconfig.json | 19 +++
.../README.md | 3 +
.../index.ts | 14 ++
.../jest.config.js | 13 ++
.../kibana.jsonc | 5 +
.../package.json | 6 +
.../src/internal_contracts.ts | 17 +++
.../src/user_profile_route_handler_context.ts | 31 ++++
.../src/user_profile_service.test.mocks.ts | 19 +++
.../src/user_profile_service.test.ts | 97 ++++++++++++
.../src/user_profile_service.ts | 48 ++++++
.../src/utils/convert_api.test.ts | 28 ++++
.../src/utils/convert_api.ts | 16 ++
.../src/utils/default_implementation.test.ts | 36 +++++
.../src/utils/default_implementation.ts | 18 +++
.../src/utils/index.ts | 10 ++
.../tsconfig.json | 25 ++++
.../core-user-profile-server-mocks/README.md | 3 +
.../core-user-profile-server-mocks/index.ts | 9 ++
.../jest.config.js | 13 ++
.../kibana.jsonc | 5 +
.../package.json | 6 +
.../src/user_profile_service.mock.ts | 81 ++++++++++
.../tsconfig.json | 20 +++
.../core-user-profile-server/README.md | 3 +
.../core-user-profile-server/index.ts | 18 +++
.../core-user-profile-server/jest.config.js | 13 ++
.../core-user-profile-server/kibana.jsonc | 5 +
.../core-user-profile-server/package.json | 6 +
.../src/api_provider.ts | 19 +++
.../core-user-profile-server/src/contracts.ts | 31 ++++
.../src/request_handler_context.ts | 19 +++
.../core-user-profile-server/src/service.ts | 17 ++-
.../core-user-profile-server/tsconfig.json | 20 +++
src/core/public/index.ts | 16 ++
src/core/server/index.ts | 14 ++
src/core/server/mocks.ts | 3 +
src/core/tsconfig.json | 4 +
tsconfig.base.json | 14 ++
.../src/user_profile/index.ts | 2 +-
.../plugin_types_common/tsconfig.json | 3 +-
.../user_profile/user_profile_api_client.ts | 130 ++--------------
.../plugin_types_public/tsconfig.json | 4 +-
.../src/user_profile/index.ts | 2 +-
.../plugin_types_server/tsconfig.json | 1 +
.../fleet/.storybook/context/index.tsx | 7 +-
.../public/build_delegate_api.test.ts | 141 ++++++++++++++++++
.../security/public/build_delegate_api.ts | 33 ++++
.../public/build_security_api.test.ts | 40 -----
.../security/public/build_security_api.ts | 21 ---
.../plugins/security/public/plugin.test.tsx | 16 +-
x-pack/plugins/security/public/plugin.tsx | 7 +-
.../server/build_delegate_apis.test.ts | 121 +++++++++++++++
.../security/server/build_delegate_apis.ts | 39 +++++
.../server/build_security_api.test.ts | 44 ------
.../security/server/build_security_api.ts | 24 ---
x-pack/plugins/security/server/plugin.test.ts | 10 +-
x-pack/plugins/security/server/plugin.ts | 9 +-
.../routes/user_profile/get_current.test.ts | 51 ++++---
.../server/routes/user_profile/get_current.ts | 7 +-
x-pack/plugins/security/tsconfig.json | 2 +
yarn.lock | 28 ++++
159 files changed, 2279 insertions(+), 357 deletions(-)
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/README.md
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/package.json
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/README.md
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/package.json
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-browser/README.md
create mode 100644 packages/core/user-profile/core-user-profile-browser/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-browser/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-browser/package.json
create mode 100644 packages/core/user-profile/core-user-profile-browser/src/api_provider.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser/src/contracts.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser/src/service.ts
create mode 100644 packages/core/user-profile/core-user-profile-browser/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-common/README.md
create mode 100644 packages/core/user-profile/core-user-profile-common/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-common/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-common/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-common/package.json
rename {x-pack/packages/security/plugin_types_common/src/user_profile => packages/core/user-profile/core-user-profile-common/src}/user_profile.ts (92%)
create mode 100644 packages/core/user-profile/core-user-profile-common/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/README.md
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/package.json
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-internal/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/README.md
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/package.json
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts
create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json
create mode 100644 packages/core/user-profile/core-user-profile-server/README.md
create mode 100644 packages/core/user-profile/core-user-profile-server/index.ts
create mode 100644 packages/core/user-profile/core-user-profile-server/jest.config.js
create mode 100644 packages/core/user-profile/core-user-profile-server/kibana.jsonc
create mode 100644 packages/core/user-profile/core-user-profile-server/package.json
create mode 100644 packages/core/user-profile/core-user-profile-server/src/api_provider.ts
create mode 100644 packages/core/user-profile/core-user-profile-server/src/contracts.ts
create mode 100644 packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts
rename x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts => packages/core/user-profile/core-user-profile-server/src/service.ts (91%)
create mode 100644 packages/core/user-profile/core-user-profile-server/tsconfig.json
create mode 100644 x-pack/plugins/security/public/build_delegate_api.test.ts
create mode 100644 x-pack/plugins/security/public/build_delegate_api.ts
delete mode 100644 x-pack/plugins/security/public/build_security_api.test.ts
delete mode 100644 x-pack/plugins/security/public/build_security_api.ts
create mode 100644 x-pack/plugins/security/server/build_delegate_apis.test.ts
create mode 100644 x-pack/plugins/security/server/build_delegate_apis.ts
delete mode 100644 x-pack/plugins/security/server/build_security_api.test.ts
delete mode 100644 x-pack/plugins/security/server/build_security_api.ts
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index ae22f91bb038d..4a6c4b24a6800 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -313,6 +313,13 @@ packages/core/usage-data/core-usage-data-base-server-internal @elastic/kibana-co
packages/core/usage-data/core-usage-data-server @elastic/kibana-core
packages/core/usage-data/core-usage-data-server-internal @elastic/kibana-core
packages/core/usage-data/core-usage-data-server-mocks @elastic/kibana-core
+packages/core/user-profile/core-user-profile-browser @elastic/kibana-core
+packages/core/user-profile/core-user-profile-browser-internal @elastic/kibana-core
+packages/core/user-profile/core-user-profile-browser-mocks @elastic/kibana-core
+packages/core/user-profile/core-user-profile-common @elastic/kibana-core
+packages/core/user-profile/core-user-profile-server @elastic/kibana-core
+packages/core/user-profile/core-user-profile-server-internal @elastic/kibana-core
+packages/core/user-profile/core-user-profile-server-mocks @elastic/kibana-core
packages/core/user-settings/core-user-settings-server @elastic/kibana-security
packages/core/user-settings/core-user-settings-server-internal @elastic/kibana-security
packages/core/user-settings/core-user-settings-server-mocks @elastic/kibana-security
diff --git a/package.json b/package.json
index fd15d8a4ce34a..5a1689beb3de3 100644
--- a/package.json
+++ b/package.json
@@ -368,6 +368,13 @@
"@kbn/core-usage-data-base-server-internal": "link:packages/core/usage-data/core-usage-data-base-server-internal",
"@kbn/core-usage-data-server": "link:packages/core/usage-data/core-usage-data-server",
"@kbn/core-usage-data-server-internal": "link:packages/core/usage-data/core-usage-data-server-internal",
+ "@kbn/core-user-profile-browser": "link:packages/core/user-profile/core-user-profile-browser",
+ "@kbn/core-user-profile-browser-internal": "link:packages/core/user-profile/core-user-profile-browser-internal",
+ "@kbn/core-user-profile-browser-mocks": "link:packages/core/user-profile/core-user-profile-browser-mocks",
+ "@kbn/core-user-profile-common": "link:packages/core/user-profile/core-user-profile-common",
+ "@kbn/core-user-profile-server": "link:packages/core/user-profile/core-user-profile-server",
+ "@kbn/core-user-profile-server-internal": "link:packages/core/user-profile/core-user-profile-server-internal",
+ "@kbn/core-user-profile-server-mocks": "link:packages/core/user-profile/core-user-profile-server-mocks",
"@kbn/core-user-settings-server": "link:packages/core/user-settings/core-user-settings-server",
"@kbn/core-user-settings-server-internal": "link:packages/core/user-settings/core-user-settings-server-internal",
"@kbn/core-user-settings-server-mocks": "link:packages/core/user-settings/core-user-settings-server-mocks",
diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts
index 63aa61c3eced1..1125c7da5f403 100644
--- a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts
+++ b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts
@@ -232,3 +232,32 @@ describe('#security', () => {
});
});
});
+
+describe('#userProfile', () => {
+ describe('getCurrent', () => {
+ test('calls coreStart.userProfile.getCurrent with the correct parameters', () => {
+ const request = httpServerMock.createKibanaRequest();
+ const coreStart = createCoreRouteHandlerContextParamsMock();
+ const context = new CoreRouteHandlerContext(coreStart, request);
+
+ context.userProfile?.getCurrent({ dataPath: '/data-path' });
+ expect(coreStart.userProfile.getCurrent).toHaveBeenCalledTimes(1);
+ expect(coreStart.userProfile.getCurrent).toHaveBeenCalledWith({
+ request,
+ dataPath: '/data-path',
+ });
+ });
+
+ test('returns the result of coreStart.userProfile.getCurrent', () => {
+ const request = httpServerMock.createKibanaRequest();
+ const coreStart = createCoreRouteHandlerContextParamsMock();
+ const context = new CoreRouteHandlerContext(coreStart, request);
+
+ const stubProfile: any = Symbol.for('stubProfile');
+ coreStart.userProfile.getCurrent.mockReturnValue(stubProfile);
+
+ const profile = context.userProfile?.getCurrent();
+ expect(profile).toBe(stubProfile);
+ });
+ });
+});
diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts
index f8e428f45ed76..85290fc62698c 100644
--- a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts
+++ b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts
@@ -28,6 +28,10 @@ import {
CoreSecurityRouteHandlerContext,
type InternalSecurityServiceStart,
} from '@kbn/core-security-server-internal';
+import {
+ CoreUserProfileRouteHandlerContext,
+ type InternalUserProfileServiceStart,
+} from '@kbn/core-user-profile-server-internal';
/**
* Subset of `InternalCoreStart` used by {@link CoreRouteHandlerContext}
@@ -39,6 +43,7 @@ export interface CoreRouteHandlerContextParams {
uiSettings: InternalUiSettingsServiceStart;
deprecations: InternalDeprecationsServiceStart;
security: InternalSecurityServiceStart;
+ userProfile: InternalUserProfileServiceStart;
}
/**
@@ -52,6 +57,7 @@ export class CoreRouteHandlerContext implements CoreRequestHandlerContext {
#uiSettings?: CoreUiSettingsRouteHandlerContext;
#deprecations?: CoreDeprecationsRouteHandlerContext;
#security?: CoreSecurityRouteHandlerContext;
+ #userProfile?: CoreUserProfileRouteHandlerContext;
constructor(
private readonly coreStart: CoreRouteHandlerContextParams,
@@ -105,4 +111,14 @@ export class CoreRouteHandlerContext implements CoreRequestHandlerContext {
}
return this.#security;
}
+
+ public get userProfile() {
+ if (!this.#userProfile) {
+ this.#userProfile = new CoreUserProfileRouteHandlerContext(
+ this.coreStart.userProfile,
+ this.request
+ );
+ }
+ return this.#userProfile;
+ }
}
diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts
index 5e9f30c93e523..735b9e504b3a3 100644
--- a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts
+++ b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts
@@ -11,6 +11,7 @@ import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks';
import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks';
import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export const createCoreRouteHandlerContextParamsMock = () => {
return {
@@ -19,5 +20,6 @@ export const createCoreRouteHandlerContextParamsMock = () => {
uiSettings: uiSettingsServiceMock.createStartContract(),
deprecations: deprecationsServiceMock.createInternalStartContract(),
security: securityServiceMock.createInternalStart(),
+ userProfile: userProfileServiceMock.createInternalStart(),
};
};
diff --git a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json
index 607c0cf7cea7f..9e5ab96901e86 100644
--- a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json
+++ b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json
@@ -25,6 +25,8 @@
"@kbn/core-deprecations-server-mocks",
"@kbn/core-security-server-internal",
"@kbn/core-security-server-mocks",
+ "@kbn/core-user-profile-server-internal",
+ "@kbn/core-user-profile-server-mocks",
],
"exclude": [
"target/**/*",
diff --git a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts
index 6513775395911..735b30abc3b76 100644
--- a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts
+++ b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts
@@ -12,6 +12,7 @@ import type { SavedObjectsRequestHandlerContext } from '@kbn/core-saved-objects-
import type { DeprecationsRequestHandlerContext } from '@kbn/core-deprecations-server';
import type { UiSettingsRequestHandlerContext } from '@kbn/core-ui-settings-server';
import type { SecurityRequestHandlerContext } from '@kbn/core-security-server';
+import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-server';
/**
* The `core` context provided to route handler.
@@ -33,6 +34,7 @@ export interface CoreRequestHandlerContext {
uiSettings: UiSettingsRequestHandlerContext;
deprecations: DeprecationsRequestHandlerContext;
security: SecurityRequestHandlerContext;
+ userProfile: UserProfileRequestHandlerContext;
}
/**
diff --git a/packages/core/http/core-http-request-handler-context-server/tsconfig.json b/packages/core/http/core-http-request-handler-context-server/tsconfig.json
index 5b20b03ce5918..4606770c753d7 100644
--- a/packages/core/http/core-http-request-handler-context-server/tsconfig.json
+++ b/packages/core/http/core-http-request-handler-context-server/tsconfig.json
@@ -16,7 +16,8 @@
"@kbn/core-saved-objects-server",
"@kbn/core-deprecations-server",
"@kbn/core-ui-settings-server",
- "@kbn/core-security-server"
+ "@kbn/core-security-server",
+ "@kbn/core-user-profile-server"
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts
index cc2404071ecd5..31116e7060b6d 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts
@@ -11,12 +11,17 @@ import type { InternalApplicationSetup } from '@kbn/core-application-browser-int
import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal';
import type { InternalHttpSetup } from '@kbn/core-http-browser-internal';
import type { InternalSecurityServiceSetup } from '@kbn/core-security-browser-internal';
+import type { InternalUserProfileServiceSetup } from '@kbn/core-user-profile-browser-internal';
/** @internal */
export interface InternalCoreSetup
- extends Omit {
+ extends Omit<
+ CoreSetup,
+ 'application' | 'plugins' | 'getStartServices' | 'http' | 'security' | 'userProfile'
+ > {
application: InternalApplicationSetup;
injectedMetadata: InternalInjectedMetadataSetup;
http: InternalHttpSetup;
security: InternalSecurityServiceSetup;
+ userProfile: InternalUserProfileServiceSetup;
}
diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts
index 2bfdeaf1da584..7ac2b4e34f102 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts
@@ -11,12 +11,14 @@ import type { InternalApplicationStart } from '@kbn/core-application-browser-int
import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata-browser-internal';
import type { InternalHttpStart } from '@kbn/core-http-browser-internal';
import type { InternalSecurityServiceStart } from '@kbn/core-security-browser-internal';
+import type { InternalUserProfileServiceStart } from '@kbn/core-user-profile-browser-internal';
/** @internal */
export interface InternalCoreStart
- extends Omit {
+ extends Omit {
application: InternalApplicationStart;
injectedMetadata: InternalInjectedMetadataStart;
http: InternalHttpStart;
security: InternalSecurityServiceStart;
+ userProfile: InternalUserProfileServiceStart;
}
diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json
index ae9e07fa47a54..4fd531018418d 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json
+++ b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json
@@ -16,7 +16,8 @@
"@kbn/core-application-browser-internal",
"@kbn/core-injected-metadata-browser-internal",
"@kbn/core-http-browser-internal",
- "@kbn/core-security-browser-internal"
+ "@kbn/core-security-browser-internal",
+ "@kbn/core-user-profile-browser-internal"
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts
index 8d6f1daddc8e2..1ce30deb63782 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts
@@ -18,6 +18,7 @@ import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks';
import { applicationServiceMock } from '@kbn/core-application-browser-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks';
import { securityServiceMock } from '@kbn/core-security-browser-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks';
import { createCoreStartMock } from './core_start.mock';
export function createCoreSetupMock({
@@ -46,6 +47,7 @@ export function createCoreSetupMock({
deprecations: deprecationsServiceMock.createSetupContract(),
theme: themeServiceMock.createSetupContract(),
security: securityServiceMock.createSetup(),
+ userProfile: userProfileServiceMock.createSetup(),
plugins: {
onSetup: jest.fn(),
onStart: jest.fn(),
diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts
index 8451778dbe62e..b33b22c12f9c8 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts
@@ -22,6 +22,7 @@ import { applicationServiceMock } from '@kbn/core-application-browser-mocks';
import { chromeServiceMock } from '@kbn/core-chrome-browser-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks';
import { securityServiceMock } from '@kbn/core-security-browser-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks';
export function createCoreStartMock({ basePath = '' } = {}) {
const mock = {
@@ -42,6 +43,7 @@ export function createCoreStartMock({ basePath = '' } = {}) {
theme: themeServiceMock.createStartContract(),
fatalErrors: fatalErrorsServiceMock.createStartContract(),
security: securityServiceMock.createStart(),
+ userProfile: userProfileServiceMock.createStart(),
plugins: {
onStart: jest.fn(),
},
diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json
index ba02ede1a594e..b6df8220f8603 100644
--- a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json
+++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json
@@ -27,7 +27,8 @@
"@kbn/core-application-browser-mocks",
"@kbn/core-chrome-browser-mocks",
"@kbn/core-custom-branding-browser-mocks",
- "@kbn/core-security-browser-mocks"
+ "@kbn/core-security-browser-mocks",
+ "@kbn/core-user-profile-browser-mocks"
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts
index ac5861cf5667b..fa276f375414b 100644
--- a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts
@@ -17,6 +17,7 @@ import type { ApplicationSetup } from '@kbn/core-application-browser';
import type { CustomBrandingSetup } from '@kbn/core-custom-branding-browser';
import type { PluginsServiceSetup } from '@kbn/core-plugins-contracts-browser';
import type { SecurityServiceSetup } from '@kbn/core-security-browser';
+import type { UserProfileServiceSetup } from '@kbn/core-user-profile-browser';
import type { CoreStart } from './core_start';
/**
@@ -59,6 +60,8 @@ export interface CoreSetup;
}
diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts
index 5d1f590b75058..2ea7d3b63d151 100644
--- a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts
+++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts
@@ -23,6 +23,7 @@ import type { ChromeStart } from '@kbn/core-chrome-browser';
import type { CustomBrandingStart } from '@kbn/core-custom-branding-browser';
import type { PluginsServiceStart } from '@kbn/core-plugins-contracts-browser';
import type { SecurityServiceStart } from '@kbn/core-security-browser';
+import type { UserProfileServiceStart } from '@kbn/core-user-profile-browser';
/**
* Core services exposed to the `Plugin` start lifecycle
@@ -74,4 +75,6 @@ export interface CoreStart {
plugins: PluginsServiceStart;
/** {@link SecurityServiceStart} */
security: SecurityServiceStart;
+ /** {@link UserProfileServiceStart} */
+ userProfile: UserProfileServiceStart;
}
diff --git a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json
index 7bfe8720f403b..558694c2c1c91 100644
--- a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json
+++ b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json
@@ -28,7 +28,8 @@
"@kbn/core-chrome-browser",
"@kbn/core-custom-branding-browser",
"@kbn/core-plugins-contracts-browser",
- "@kbn/core-security-browser"
+ "@kbn/core-security-browser",
+ "@kbn/core-user-profile-browser"
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts
index 29f07032df027..43a8287e51919 100644
--- a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts
@@ -27,6 +27,7 @@ import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-serve
import type { InternalCustomBrandingSetup } from '@kbn/core-custom-branding-server-internal';
import type { InternalUserSettingsServiceSetup } from '@kbn/core-user-settings-server-internal';
import type { InternalSecurityServiceSetup } from '@kbn/core-security-server-internal';
+import type { InternalUserProfileServiceSetup } from '@kbn/core-user-profile-server-internal';
/** @internal */
export interface InternalCoreSetup {
@@ -51,4 +52,5 @@ export interface InternalCoreSetup {
customBranding: InternalCustomBrandingSetup;
userSettings: InternalUserSettingsServiceSetup;
security: InternalSecurityServiceSetup;
+ userProfile: InternalUserProfileServiceSetup;
}
diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts
index 353b35f92f365..b2c9da09003d2 100644
--- a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts
@@ -19,6 +19,7 @@ import type { InternalUiSettingsServiceStart } from '@kbn/core-ui-settings-serve
import type { CoreUsageDataStart } from '@kbn/core-usage-data-server';
import type { CustomBrandingStart } from '@kbn/core-custom-branding-server';
import type { InternalSecurityServiceStart } from '@kbn/core-security-server-internal';
+import type { InternalUserProfileServiceStart } from '@kbn/core-user-profile-server-internal';
/**
* @internal
@@ -37,4 +38,5 @@ export interface InternalCoreStart {
deprecations: InternalDeprecationsServiceStart;
customBranding: CustomBrandingStart;
security: InternalSecurityServiceStart;
+ userProfile: InternalUserProfileServiceStart;
}
diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json
index dc5f481833ad4..1e5c8cb22233a 100644
--- a/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json
+++ b/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json
@@ -34,7 +34,8 @@
"@kbn/core-custom-branding-server-internal",
"@kbn/core-custom-branding-server",
"@kbn/core-user-settings-server-internal",
- "@kbn/core-security-server-internal"
+ "@kbn/core-security-server-internal",
+ "@kbn/core-user-profile-server-internal"
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts
index 3acd1ff2fb6b0..4f0f8cd7a66dd 100644
--- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts
@@ -27,6 +27,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks';
import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
import { createCoreStartMock } from './core_start.mock';
type CoreSetupMockType = MockedKeys & {
@@ -69,6 +70,7 @@ export function createCoreSetupMock({
deprecations: deprecationsServiceMock.createSetupContract(),
executionContext: executionContextServiceMock.createInternalSetupContract(),
security: securityServiceMock.createSetup(),
+ userProfile: userProfileServiceMock.createSetup(),
coreUsageData: {
registerUsageCounter: coreUsageDataServiceMock.createSetupContract().registerUsageCounter,
},
diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts
index c01c3c4ec616a..1ca7b1a096e39 100644
--- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts
@@ -20,6 +20,7 @@ import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks';
import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export function createCoreStartMock() {
const mock: MockedKeys = {
@@ -35,6 +36,7 @@ export function createCoreStartMock() {
executionContext: executionContextServiceMock.createInternalStartContract(),
customBranding: customBrandingServiceMock.createStartContract(),
security: securityServiceMock.createStart(),
+ userProfile: userProfileServiceMock.createStart(),
plugins: {
onStart: jest.fn(),
},
diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts
index 066ae6633fff8..fe998ddf721b1 100644
--- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts
@@ -27,6 +27,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks';
import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export function createInternalCoreSetupMock() {
const setupDeps = {
@@ -51,6 +52,7 @@ export function createInternalCoreSetupMock() {
customBranding: customBrandingServiceMock.createSetupContract(),
userSettings: userSettingsServiceMock.createSetupContract(),
security: securityServiceMock.createInternalSetup(),
+ userProfile: userProfileServiceMock.createInternalSetup(),
};
return setupDeps;
}
diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts
index 8831435dfbeff..5230ce25a0ead 100644
--- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts
+++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts
@@ -19,6 +19,7 @@ import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks';
import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export function createInternalCoreStartMock() {
const startDeps = {
@@ -35,6 +36,7 @@ export function createInternalCoreStartMock() {
deprecations: deprecationsServiceMock.createInternalStartContract(),
customBranding: customBrandingServiceMock.createStartContract(),
security: securityServiceMock.createInternalStart(),
+ userProfile: userProfileServiceMock.createInternalStart(),
};
return startDeps;
}
diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json
index dfeb7485e9f9c..bacda3278557b 100644
--- a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json
+++ b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json
@@ -36,6 +36,7 @@
"@kbn/core-custom-branding-server-mocks",
"@kbn/core-user-settings-server-mocks",
"@kbn/core-security-server-mocks",
+ "@kbn/core-user-profile-server-mocks",
],
"exclude": [
"target/**/*",
diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts
index eca43897e554f..c590d562a433c 100644
--- a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts
+++ b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts
@@ -26,6 +26,7 @@ import type { CustomBrandingSetup } from '@kbn/core-custom-branding-server';
import type { UserSettingsServiceSetup } from '@kbn/core-user-settings-server';
import type { PluginsServiceSetup } from '@kbn/core-plugins-contracts-server';
import type { SecurityServiceSetup } from '@kbn/core-security-server';
+import type { UserProfileServiceSetup } from '@kbn/core-user-profile-server';
import type { CoreStart } from './core_start';
/**
@@ -79,6 +80,8 @@ export interface CoreSetup deps.security.registerSecurityApi(api),
+ registerSecurityDelegate: (api) => deps.security.registerSecurityDelegate(api),
+ },
+ userProfile: {
+ registerUserProfileDelegate: (delegate) =>
+ deps.userProfile.registerUserProfileDelegate(delegate),
},
plugins: {
onSetup: (...dependencyNames) => runtimeResolver.onSetup(plugin.name, dependencyNames),
@@ -162,6 +166,7 @@ export function createPluginStartContext<
security: {
authc: deps.security.authc,
},
+ userProfile: deps.userProfile,
plugins: {
onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames),
},
diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts
index 72ba2b6312316..d4f693fff25d0 100644
--- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts
+++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts
@@ -42,6 +42,7 @@ import type { CoreSetup, CoreStart } from '@kbn/core-lifecycle-browser';
import { savedObjectsServiceMock } from '@kbn/core-saved-objects-browser-mocks';
import { deprecationsServiceMock } from '@kbn/core-deprecations-browser-mocks';
import { securityServiceMock } from '@kbn/core-security-browser-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks';
export let mockPluginInitializers: Map;
@@ -100,6 +101,7 @@ describe('PluginsService', () => {
uiSettings: uiSettingsServiceMock.createSetupContract(),
theme: themeServiceMock.createSetupContract(),
security: securityServiceMock.createInternalSetup(),
+ userProfile: userProfileServiceMock.createInternalSetup(),
};
mockSetupContext = {
...omit(mockSetupDeps, 'injectedMetadata'),
@@ -107,6 +109,7 @@ describe('PluginsService', () => {
plugins: expect.any(Object),
getStartServices: expect.any(Function),
security: expect.any(Object),
+ userProfile: expect.any(Object),
http: {
...mockSetupDeps.http,
staticAssets: expect.any(Object),
@@ -130,6 +133,7 @@ describe('PluginsService', () => {
deprecations: deprecationsServiceMock.createStartContract(),
theme: themeServiceMock.createStartContract(),
security: securityServiceMock.createInternalStart(),
+ userProfile: userProfileServiceMock.createInternalStart(),
};
mockStartContext = {
...omit(mockStartDeps, 'injectedMetadata'),
@@ -137,6 +141,7 @@ describe('PluginsService', () => {
plugins: expect.any(Object),
chrome: omit(mockStartDeps.chrome, 'getComponent'),
security: expect.any(Object),
+ userProfile: expect.any(Object),
http: {
...mockStartDeps.http,
staticAssets: expect.any(Object),
diff --git a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json
index 1df9acab0451e..e2e502e821362 100644
--- a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json
+++ b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json
@@ -38,6 +38,7 @@
"@kbn/utility-types",
"@kbn/core-plugins-contracts-browser",
"@kbn/core-security-browser-mocks",
+ "@kbn/core-user-profile-browser-mocks",
],
"exclude": [
"target/**/*",
diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts
index 6928c5791c0a8..830df5c94e008 100644
--- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts
+++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts
@@ -285,7 +285,11 @@ export function createPluginSetupContext({
onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames),
},
security: {
- registerSecurityApi: (api) => deps.security.registerSecurityApi(api),
+ registerSecurityDelegate: (api) => deps.security.registerSecurityDelegate(api),
+ },
+ userProfile: {
+ registerUserProfileDelegate: (delegate) =>
+ deps.userProfile.registerUserProfileDelegate(delegate),
},
};
}
@@ -366,5 +370,6 @@ export function createPluginStartContext({
security: {
authc: deps.security.authc,
},
+ userProfile: deps.userProfile,
};
}
diff --git a/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts b/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts
index 638024a2eb8ed..e3c4aa171fa93 100644
--- a/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts
+++ b/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts
@@ -26,6 +26,7 @@ import { coreAppsMock } from '@kbn/core-apps-browser-mocks';
import { loggingSystemMock } from '@kbn/core-logging-browser-mocks';
import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks';
import { securityServiceMock } from '@kbn/core-security-browser-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks';
export const analyticsServiceStartMock = analyticsServiceMock.createAnalyticsServiceStart();
export const MockAnalyticsService = analyticsServiceMock.create();
@@ -163,3 +164,11 @@ export const SecurityServiceConstructor = jest.fn().mockImplementation(() => Moc
jest.doMock('@kbn/core-security-browser-internal', () => ({
SecurityService: SecurityServiceConstructor,
}));
+
+export const MockUserProfileService = userProfileServiceMock.create();
+export const UserProfileServiceConstructor = jest
+ .fn()
+ .mockImplementation(() => MockUserProfileService);
+jest.doMock('@kbn/core-user-profile-browser-internal', () => ({
+ UserProfileService: UserProfileServiceConstructor,
+}));
diff --git a/packages/core/root/core-root-browser-internal/src/core_system.test.ts b/packages/core/root/core-root-browser-internal/src/core_system.test.ts
index bfe995114b842..e2f3a98ee8e03 100644
--- a/packages/core/root/core-root-browser-internal/src/core_system.test.ts
+++ b/packages/core/root/core-root-browser-internal/src/core_system.test.ts
@@ -46,6 +46,8 @@ import {
CustomBrandingServiceConstructor,
MockSecurityService,
SecurityServiceConstructor,
+ MockUserProfileService,
+ UserProfileServiceConstructor,
} from './core_system.test.mocks';
import type { EnvironmentMode } from '@kbn/config';
import { CoreSystem } from './core_system';
@@ -153,6 +155,7 @@ describe('constructor', () => {
expect(LoggingSystemConstructor).toHaveBeenCalledTimes(1);
expect(CustomBrandingServiceConstructor).toHaveBeenCalledTimes(1);
expect(SecurityServiceConstructor).toHaveBeenCalledTimes(1);
+ expect(UserProfileServiceConstructor).toHaveBeenCalledTimes(1);
});
it('passes injectedMetadata param to InjectedMetadataService', () => {
@@ -317,6 +320,11 @@ describe('#setup()', () => {
await setupCore();
expect(MockSecurityService.setup).toHaveBeenCalledTimes(1);
});
+
+ it('calls userProfile#setup()', async () => {
+ await setupCore();
+ expect(MockUserProfileService.setup).toHaveBeenCalledTimes(1);
+ });
});
describe('#start()', () => {
@@ -508,6 +516,11 @@ describe('#start()', () => {
await startCore();
expect(MockSecurityService.start).toHaveBeenCalledTimes(1);
});
+
+ it('calls userProfile#start()', async () => {
+ await startCore();
+ expect(MockUserProfileService.start).toHaveBeenCalledTimes(1);
+ });
});
describe('#stop()', () => {
diff --git a/packages/core/root/core-root-browser-internal/src/core_system.ts b/packages/core/root/core-root-browser-internal/src/core_system.ts
index 1bd06082d0a5e..c9dcbf064823a 100644
--- a/packages/core/root/core-root-browser-internal/src/core_system.ts
+++ b/packages/core/root/core-root-browser-internal/src/core_system.ts
@@ -37,6 +37,7 @@ import type { InternalCoreSetup, InternalCoreStart } from '@kbn/core-lifecycle-b
import { PluginsService } from '@kbn/core-plugins-browser-internal';
import { CustomBrandingService } from '@kbn/core-custom-branding-browser-internal';
import { SecurityService } from '@kbn/core-security-browser-internal';
+import { UserProfileService } from '@kbn/core-user-profile-browser-internal';
import { KBN_LOAD_MARKS } from './events';
import { fetchOptionalMemoryInfo } from './fetch_optional_memory_info';
import {
@@ -105,6 +106,7 @@ export class CoreSystem {
private readonly executionContext: ExecutionContextService;
private readonly customBranding: CustomBrandingService;
private readonly security: SecurityService;
+ private readonly userProfile: UserProfileService;
private fatalErrorsSetup: FatalErrorsSetup | null = null;
constructor(params: CoreSystemParams) {
@@ -130,6 +132,7 @@ export class CoreSystem {
this.stop();
});
this.security = new SecurityService(this.coreContext);
+ this.userProfile = new UserProfileService(this.coreContext);
this.theme = new ThemeService();
this.notifications = new NotificationsService();
this.http = new HttpService();
@@ -238,6 +241,7 @@ export class CoreSystem {
executionContext,
});
const security = this.security.setup();
+ const userProfile = this.userProfile.setup();
this.chrome.setup({ analytics });
const uiSettings = this.uiSettings.setup({ http, injectedMetadata });
const settings = this.settings.setup({ http, injectedMetadata });
@@ -260,6 +264,7 @@ export class CoreSystem {
executionContext,
customBranding,
security,
+ userProfile,
};
// Services that do not expose contracts at setup
@@ -285,6 +290,7 @@ export class CoreSystem {
try {
const analytics = this.analytics.start();
const security = this.security.start();
+ const userProfile = this.userProfile.start();
const injectedMetadata = await this.injectedMetadata.start();
const uiSettings = await this.uiSettings.start();
const settings = await this.settings.start();
@@ -360,6 +366,7 @@ export class CoreSystem {
deprecations,
customBranding,
security,
+ userProfile,
};
await this.plugins.start(core);
@@ -423,6 +430,7 @@ export class CoreSystem {
this.theme.stop();
this.analytics.stop();
this.security.stop();
+ this.userProfile.stop();
this.rootDomElement.textContent = '';
}
diff --git a/packages/core/root/core-root-browser-internal/tsconfig.json b/packages/core/root/core-root-browser-internal/tsconfig.json
index 8029235949a53..152c7d3683e38 100644
--- a/packages/core/root/core-root-browser-internal/tsconfig.json
+++ b/packages/core/root/core-root-browser-internal/tsconfig.json
@@ -64,6 +64,8 @@
"@kbn/core-custom-branding-browser-mocks",
"@kbn/core-security-browser-mocks",
"@kbn/core-security-browser-internal",
+ "@kbn/core-user-profile-browser-mocks",
+ "@kbn/core-user-profile-browser-internal",
],
"exclude": [
"target/**/*",
diff --git a/packages/core/root/core-root-server-internal/src/server.test.mocks.ts b/packages/core/root/core-root-server-internal/src/server.test.mocks.ts
index 6e4f18637ab15..dd44faeb97bd6 100644
--- a/packages/core/root/core-root-server-internal/src/server.test.mocks.ts
+++ b/packages/core/root/core-root-server-internal/src/server.test.mocks.ts
@@ -23,6 +23,7 @@ import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks';
import { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks';
import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export const mockHttpService = httpServiceMock.create();
jest.doMock('@kbn/core-http-server-internal', () => ({
@@ -140,6 +141,11 @@ jest.doMock('@kbn/core-security-server-internal', () => ({
SecurityService: jest.fn(() => mockSecurityService),
}));
+export const mockUserProfileService = userProfileServiceMock.create();
+jest.doMock('@kbn/core-user-profile-server-internal', () => ({
+ UserProfileService: jest.fn(() => mockUserProfileService),
+}));
+
export const mockUsageDataService = coreUsageDataServiceMock.create();
jest.doMock('@kbn/core-usage-data-server-internal', () => ({
CoreUsageDataService: jest.fn(() => mockUsageDataService),
diff --git a/packages/core/root/core-root-server-internal/src/server.test.ts b/packages/core/root/core-root-server-internal/src/server.test.ts
index e226e670d5e31..60073cc5fcfd4 100644
--- a/packages/core/root/core-root-server-internal/src/server.test.ts
+++ b/packages/core/root/core-root-server-internal/src/server.test.ts
@@ -28,6 +28,7 @@ import {
mockCustomBrandingService,
mockUserSettingsService,
mockSecurityService,
+ mockUserProfileService,
} from './server.test.mocks';
import { BehaviorSubject } from 'rxjs';
@@ -129,6 +130,8 @@ test('sets up services on "setup"', async () => {
expect(mockCustomBrandingService.setup).not.toHaveBeenCalled();
expect(mockUserSettingsService.setup).not.toHaveBeenCalled();
expect(mockSecurityService.setup).not.toHaveBeenCalled();
+ expect(mockSecurityService.setup).not.toHaveBeenCalled();
+ expect(mockUserProfileService.setup).not.toHaveBeenCalled();
await server.setup();
@@ -148,6 +151,7 @@ test('sets up services on "setup"', async () => {
expect(mockCustomBrandingService.setup).toHaveBeenCalledTimes(1);
expect(mockUserSettingsService.setup).toHaveBeenCalledTimes(1);
expect(mockSecurityService.setup).toHaveBeenCalledTimes(1);
+ expect(mockUserProfileService.setup).toHaveBeenCalledTimes(1);
});
test('injects legacy dependency to context#setup()', async () => {
@@ -201,6 +205,7 @@ test('runs services on "start"', async () => {
expect(mockDocLinksService.start).not.toHaveBeenCalled();
expect(mockCustomBrandingService.start).not.toHaveBeenCalled();
expect(mockSecurityService.start).not.toHaveBeenCalled();
+ expect(mockUserProfileService.start).not.toHaveBeenCalled();
await server.start();
@@ -213,6 +218,7 @@ test('runs services on "start"', async () => {
expect(mockDocLinksService.start).toHaveBeenCalledTimes(1);
expect(mockCustomBrandingService.start).toHaveBeenCalledTimes(1);
expect(mockSecurityService.start).toHaveBeenCalledTimes(1);
+ expect(mockUserProfileService.start).toHaveBeenCalledTimes(1);
});
test('does not fail on "setup" if there are unused paths detected', async () => {
@@ -241,6 +247,7 @@ test('stops services on "stop"', async () => {
expect(mockLoggingService.stop).not.toHaveBeenCalled();
expect(mockCustomBrandingService.stop).not.toHaveBeenCalled();
expect(mockSecurityService.stop).not.toHaveBeenCalled();
+ expect(mockUserProfileService.stop).not.toHaveBeenCalled();
await server.stop();
@@ -255,6 +262,7 @@ test('stops services on "stop"', async () => {
expect(mockLoggingService.stop).toHaveBeenCalledTimes(1);
expect(mockCustomBrandingService.stop).toHaveBeenCalledTimes(1);
expect(mockSecurityService.stop).toHaveBeenCalledTimes(1);
+ expect(mockUserProfileService.stop).toHaveBeenCalledTimes(1);
});
test(`doesn't preboot core services if config validation fails`, async () => {
diff --git a/packages/core/root/core-root-server-internal/src/server.ts b/packages/core/root/core-root-server-internal/src/server.ts
index b26fcb1dce9bf..1439fa19cb64d 100644
--- a/packages/core/root/core-root-server-internal/src/server.ts
+++ b/packages/core/root/core-root-server-internal/src/server.ts
@@ -52,6 +52,7 @@ import type {
import { DiscoveredPlugins, PluginsService } from '@kbn/core-plugins-server-internal';
import { CoreAppsService } from '@kbn/core-apps-server-internal';
import { SecurityService } from '@kbn/core-security-server-internal';
+import { UserProfileService } from '@kbn/core-user-profile-server-internal';
import { registerServiceConfig } from './register_service_config';
import { MIGRATION_EXCEPTION_CODE } from './constants';
import { coreConfig, type CoreConfigType } from './core_config';
@@ -89,6 +90,7 @@ export class Server {
private readonly customBranding: CustomBrandingService;
private readonly userSettingsService: UserSettingsService;
private readonly security: SecurityService;
+ private readonly userProfile: UserProfileService;
private readonly savedObjectsStartPromise: Promise;
private resolveSavedObjectsStartPromise?: (value: SavedObjectsServiceStart) => void;
@@ -138,6 +140,7 @@ export class Server {
this.customBranding = new CustomBrandingService(core);
this.userSettingsService = new UserSettingsService(core);
this.security = new SecurityService(core);
+ this.userProfile = new UserProfileService(core);
this.savedObjectsStartPromise = new Promise((resolve) => {
this.resolveSavedObjectsStartPromise = resolve;
@@ -258,6 +261,7 @@ export class Server {
const executionContextSetup = this.executionContext.setup();
const docLinksSetup = this.docLinks.setup();
const securitySetup = this.security.setup();
+ const userProfileSetup = this.userProfile.setup();
const httpSetup = await this.http.setup({
context: contextServiceSetup,
@@ -355,6 +359,7 @@ export class Server {
coreUsageData: coreUsageDataSetup,
userSettings: userSettingsServiceSetup,
security: securitySetup,
+ userProfile: userProfileSetup,
};
const pluginsSetup = await this.plugins.setup(coreSetup);
@@ -375,6 +380,7 @@ export class Server {
const analyticsStart = this.analytics.start();
const securityStart = this.security.start();
+ const userProfileStart = this.userProfile.start();
const executionContextStart = this.executionContext.start();
const docLinkStart = this.docLinks.start();
@@ -435,6 +441,7 @@ export class Server {
coreUsageData: coreUsageDataStart,
deprecations: deprecationsStart,
security: securityStart,
+ userProfile: userProfileStart,
};
await this.plugins.start(this.coreStart);
@@ -470,6 +477,7 @@ export class Server {
this.node.stop();
this.deprecations.stop();
this.security.stop();
+ this.userProfile.stop();
}
private registerCoreContext(coreSetup: InternalCoreSetup) {
diff --git a/packages/core/root/core-root-server-internal/tsconfig.json b/packages/core/root/core-root-server-internal/tsconfig.json
index 6eed4c2e59413..528e1aacc0a93 100644
--- a/packages/core/root/core-root-server-internal/tsconfig.json
+++ b/packages/core/root/core-root-server-internal/tsconfig.json
@@ -74,6 +74,8 @@
"@kbn/core-security-server-mocks",
"@kbn/core-security-server-internal",
"@kbn/core-usage-data-server-mocks",
+ "@kbn/core-user-profile-server-mocks",
+ "@kbn/core-user-profile-server-internal",
],
"exclude": [
"target/**/*",
diff --git a/packages/core/security/core-security-browser-internal/src/security_service.test.ts b/packages/core/security/core-security-browser-internal/src/security_service.test.ts
index e848742586785..4362a80532ff7 100644
--- a/packages/core/security/core-security-browser-internal/src/security_service.test.ts
+++ b/packages/core/security/core-security-browser-internal/src/security_service.test.ts
@@ -13,11 +13,11 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { coreContextMock } from '@kbn/core-base-browser-mocks';
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
import { SecurityService } from './security_service';
-const createStubInternalContract = (): CoreSecurityContract => {
- return Symbol('stubContract') as unknown as CoreSecurityContract;
+const createStubInternalContract = (): CoreSecurityDelegateContract => {
+ return Symbol('stubContract') as unknown as CoreSecurityDelegateContract;
};
describe('SecurityService', () => {
@@ -33,14 +33,14 @@ describe('SecurityService', () => {
});
describe('#setup', () => {
- describe('#registerSecurityApi', () => {
+ describe('#registerSecurityDelegate', () => {
it('throws if called more than once', () => {
- const { registerSecurityApi } = service.setup();
+ const { registerSecurityDelegate } = service.setup();
const contract = createStubInternalContract();
- registerSecurityApi(contract);
+ registerSecurityDelegate(contract);
- expect(() => registerSecurityApi(contract)).toThrowErrorMatchingInlineSnapshot(
+ expect(() => registerSecurityDelegate(contract)).toThrowErrorMatchingInlineSnapshot(
`"security API can only be registered once"`
);
});
@@ -62,10 +62,10 @@ describe('SecurityService', () => {
});
it('calls convertSecurityApi with the registered API', () => {
- const { registerSecurityApi } = service.setup();
+ const { registerSecurityDelegate } = service.setup();
const contract = createStubInternalContract();
- registerSecurityApi(contract);
+ registerSecurityDelegate(contract);
service.start();
diff --git a/packages/core/security/core-security-browser-internal/src/security_service.ts b/packages/core/security/core-security-browser-internal/src/security_service.ts
index e3981ab9d8499..fa249c8868ed6 100644
--- a/packages/core/security/core-security-browser-internal/src/security_service.ts
+++ b/packages/core/security/core-security-browser-internal/src/security_service.ts
@@ -8,7 +8,7 @@
import type { Logger } from '@kbn/logging';
import type { CoreContext, CoreService } from '@kbn/core-base-browser-internal';
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
import type {
InternalSecurityServiceSetup,
InternalSecurityServiceStart,
@@ -19,7 +19,7 @@ export class SecurityService
implements CoreService
{
private readonly log: Logger;
- private securityApi?: CoreSecurityContract;
+ private securityApi?: CoreSecurityDelegateContract;
constructor(coreContext: CoreContext) {
this.log = coreContext.logger.get('security-service');
@@ -27,7 +27,7 @@ export class SecurityService
public setup(): InternalSecurityServiceSetup {
return {
- registerSecurityApi: (api) => {
+ registerSecurityDelegate: (api) => {
if (this.securityApi) {
throw new Error('security API can only be registered once');
}
diff --git a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts
index 11841c5cd25bf..80be695e244e6 100644
--- a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts
+++ b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts
@@ -6,12 +6,12 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
import { convertSecurityApi } from './convert_security_api';
describe('convertSecurityApi', () => {
it('returns the API from the source', () => {
- const source: CoreSecurityContract = { authc: { getCurrentUser: jest.fn() } };
+ const source: CoreSecurityDelegateContract = { authc: { getCurrentUser: jest.fn() } };
const output = convertSecurityApi(source);
expect(output.authc.getCurrentUser).toBe(source.authc.getCurrentUser);
});
diff --git a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts
index 2b8dfcfb5e849..a916258c1a773 100644
--- a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts
+++ b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts
@@ -6,11 +6,11 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
import type { InternalSecurityServiceStart } from '../internal_contracts';
export const convertSecurityApi = (
- privateApi: CoreSecurityContract
+ privateApi: CoreSecurityDelegateContract
): InternalSecurityServiceStart => {
// shapes are the same for now given we only have one API exposed.
return privateApi;
diff --git a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts
index 0ea1a7e158e9b..45416820919dc 100644
--- a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts
+++ b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts
@@ -6,11 +6,11 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
import { getDefaultSecurityImplementation } from './default_implementation';
describe('getDefaultSecurityImplementation', () => {
- let implementation: CoreSecurityContract;
+ let implementation: CoreSecurityDelegateContract;
beforeEach(() => {
implementation = getDefaultSecurityImplementation();
diff --git a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts
index 2d55d05a1ce9f..636be1c2eb618 100644
--- a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts
+++ b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts
@@ -6,9 +6,9 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-browser';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
-export const getDefaultSecurityImplementation = (): CoreSecurityContract => {
+export const getDefaultSecurityImplementation = (): CoreSecurityDelegateContract => {
return {
authc: {
getCurrentUser: () => {
diff --git a/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts b/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts
index 46cf384f35816..9fea0a6808170 100644
--- a/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts
+++ b/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts
@@ -14,7 +14,7 @@ import type {
const createSetupMock = () => {
const mock: jest.Mocked = {
- registerSecurityApi: jest.fn(),
+ registerSecurityDelegate: jest.fn(),
};
return mock;
@@ -32,7 +32,7 @@ const createStartMock = () => {
const createInternalSetupMock = () => {
const mock: jest.Mocked = {
- registerSecurityApi: jest.fn(),
+ registerSecurityDelegate: jest.fn(),
};
return mock;
diff --git a/packages/core/security/core-security-browser/index.ts b/packages/core/security/core-security-browser/index.ts
index be698afdb1bd9..531e84dbd84d3 100644
--- a/packages/core/security/core-security-browser/index.ts
+++ b/packages/core/security/core-security-browser/index.ts
@@ -8,4 +8,7 @@
export type { SecurityServiceSetup, SecurityServiceStart } from './src/contracts';
export type { CoreAuthenticationService } from './src/authc';
-export type { CoreSecurityContract, AuthenticationServiceContract } from './src/api_provider';
+export type {
+ CoreSecurityDelegateContract,
+ AuthenticationServiceContract,
+} from './src/api_provider';
diff --git a/packages/core/security/core-security-browser/src/api_provider.ts b/packages/core/security/core-security-browser/src/api_provider.ts
index 846c9295e1c6d..2bcd9bd9b2b97 100644
--- a/packages/core/security/core-security-browser/src/api_provider.ts
+++ b/packages/core/security/core-security-browser/src/api_provider.ts
@@ -14,7 +14,7 @@ import type { CoreAuthenticationService } from './authc';
*
* @public
*/
-export interface CoreSecurityContract {
+export interface CoreSecurityDelegateContract {
authc: AuthenticationServiceContract;
}
diff --git a/packages/core/security/core-security-browser/src/contracts.ts b/packages/core/security/core-security-browser/src/contracts.ts
index b5dfa1b45ec72..8c75b352c5556 100644
--- a/packages/core/security/core-security-browser/src/contracts.ts
+++ b/packages/core/security/core-security-browser/src/contracts.ts
@@ -7,7 +7,7 @@
*/
import type { CoreAuthenticationService } from './authc';
-import type { CoreSecurityContract } from './api_provider';
+import type { CoreSecurityDelegateContract } from './api_provider';
/**
* Setup contract for Core's security service.
@@ -20,7 +20,7 @@ export interface SecurityServiceSetup {
*
* @remark this should **exclusively** be used by the security plugin.
*/
- registerSecurityApi(api: CoreSecurityContract): void;
+ registerSecurityDelegate(api: CoreSecurityDelegateContract): void;
}
/**
diff --git a/packages/core/security/core-security-server-internal/src/security_service.test.ts b/packages/core/security/core-security-server-internal/src/security_service.test.ts
index 4448f4840136b..4f5ae5e86cbab 100644
--- a/packages/core/security/core-security-server-internal/src/security_service.test.ts
+++ b/packages/core/security/core-security-server-internal/src/security_service.test.ts
@@ -13,11 +13,11 @@ import {
import { loggerMock, MockedLogger } from '@kbn/logging-mocks';
import { mockCoreContext } from '@kbn/core-base-server-mocks';
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
import { SecurityService } from './security_service';
-const createStubInternalContract = (): CoreSecurityContract => {
- return Symbol('stubContract') as unknown as CoreSecurityContract;
+const createStubInternalContract = (): CoreSecurityDelegateContract => {
+ return Symbol('stubContract') as unknown as CoreSecurityDelegateContract;
};
describe('SecurityService', () => {
@@ -33,14 +33,14 @@ describe('SecurityService', () => {
});
describe('#setup', () => {
- describe('#registerSecurityApi', () => {
+ describe('#registerSecurityDelegate', () => {
it('throws if called more than once', () => {
- const { registerSecurityApi } = service.setup();
+ const { registerSecurityDelegate } = service.setup();
const contract = createStubInternalContract();
- registerSecurityApi(contract);
+ registerSecurityDelegate(contract);
- expect(() => registerSecurityApi(contract)).toThrowErrorMatchingInlineSnapshot(
+ expect(() => registerSecurityDelegate(contract)).toThrowErrorMatchingInlineSnapshot(
`"security API can only be registered once"`
);
});
@@ -62,10 +62,10 @@ describe('SecurityService', () => {
});
it('calls convertSecurityApi with the registered API', () => {
- const { registerSecurityApi } = service.setup();
+ const { registerSecurityDelegate } = service.setup();
const contract = createStubInternalContract();
- registerSecurityApi(contract);
+ registerSecurityDelegate(contract);
service.start();
diff --git a/packages/core/security/core-security-server-internal/src/security_service.ts b/packages/core/security/core-security-server-internal/src/security_service.ts
index eb9830b6b98e1..826019f773b93 100644
--- a/packages/core/security/core-security-server-internal/src/security_service.ts
+++ b/packages/core/security/core-security-server-internal/src/security_service.ts
@@ -8,7 +8,7 @@
import type { Logger } from '@kbn/logging';
import type { CoreContext, CoreService } from '@kbn/core-base-server-internal';
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
import type {
InternalSecurityServiceSetup,
InternalSecurityServiceStart,
@@ -19,7 +19,7 @@ export class SecurityService
implements CoreService
{
private readonly log: Logger;
- private securityApi?: CoreSecurityContract;
+ private securityApi?: CoreSecurityDelegateContract;
constructor(coreContext: CoreContext) {
this.log = coreContext.logger.get('security-service');
@@ -27,7 +27,7 @@ export class SecurityService
public setup(): InternalSecurityServiceSetup {
return {
- registerSecurityApi: (api) => {
+ registerSecurityDelegate: (api) => {
if (this.securityApi) {
throw new Error('security API can only be registered once');
}
diff --git a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts
index 19ec68cc5cba6..6fe51b6873862 100644
--- a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts
+++ b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts
@@ -6,12 +6,12 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
import { convertSecurityApi } from './convert_security_api';
describe('convertSecurityApi', () => {
it('returns the API from the source', () => {
- const source: CoreSecurityContract = { authc: { getCurrentUser: jest.fn() } };
+ const source: CoreSecurityDelegateContract = { authc: { getCurrentUser: jest.fn() } };
const output = convertSecurityApi(source);
expect(output.authc.getCurrentUser).toBe(source.authc.getCurrentUser);
});
diff --git a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts
index 2d8e985d4b523..31056bf337ff9 100644
--- a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts
+++ b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts
@@ -6,11 +6,11 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
import type { InternalSecurityServiceStart } from '../internal_contracts';
export const convertSecurityApi = (
- privateApi: CoreSecurityContract
+ privateApi: CoreSecurityDelegateContract
): InternalSecurityServiceStart => {
// shapes are the same for now given we only have one API exposed.
return privateApi;
diff --git a/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts b/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts
index 06a48ef34ab9d..17393d5994bf1 100644
--- a/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts
+++ b/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts
@@ -6,11 +6,11 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
import { getDefaultSecurityImplementation } from './default_implementation';
describe('getDefaultSecurityImplementation', () => {
- let implementation: CoreSecurityContract;
+ let implementation: CoreSecurityDelegateContract;
beforeEach(() => {
implementation = getDefaultSecurityImplementation();
diff --git a/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts b/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts
index ebf19119989c1..bd4ce287fd498 100644
--- a/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts
+++ b/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts
@@ -6,9 +6,9 @@
* Side Public License, v 1.
*/
-import type { CoreSecurityContract } from '@kbn/core-security-server';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
-export const getDefaultSecurityImplementation = (): CoreSecurityContract => {
+export const getDefaultSecurityImplementation = (): CoreSecurityDelegateContract => {
return {
authc: {
getCurrentUser: () => null,
diff --git a/packages/core/security/core-security-server-mocks/src/security_service.mock.ts b/packages/core/security/core-security-server-mocks/src/security_service.mock.ts
index 54dd9718471c3..99f86c84461f3 100644
--- a/packages/core/security/core-security-server-mocks/src/security_service.mock.ts
+++ b/packages/core/security/core-security-server-mocks/src/security_service.mock.ts
@@ -18,7 +18,7 @@ import type {
const createSetupMock = () => {
const mock: jest.Mocked = {
- registerSecurityApi: jest.fn(),
+ registerSecurityDelegate: jest.fn(),
};
return mock;
@@ -36,7 +36,7 @@ const createStartMock = () => {
const createInternalSetupMock = () => {
const mock: jest.Mocked = {
- registerSecurityApi: jest.fn(),
+ registerSecurityDelegate: jest.fn(),
};
return mock;
diff --git a/packages/core/security/core-security-server/index.ts b/packages/core/security/core-security-server/index.ts
index e9507cfee04f4..c8dd3efda695c 100644
--- a/packages/core/security/core-security-server/index.ts
+++ b/packages/core/security/core-security-server/index.ts
@@ -8,7 +8,10 @@
export type { SecurityServiceSetup, SecurityServiceStart } from './src/contracts';
export type { CoreAuthenticationService } from './src/authc';
-export type { CoreSecurityContract, AuthenticationServiceContract } from './src/api_provider';
+export type {
+ CoreSecurityDelegateContract,
+ AuthenticationServiceContract,
+} from './src/api_provider';
export type {
SecurityRequestHandlerContext,
AuthcRequestHandlerContext,
diff --git a/packages/core/security/core-security-server/src/api_provider.ts b/packages/core/security/core-security-server/src/api_provider.ts
index 846c9295e1c6d..2bcd9bd9b2b97 100644
--- a/packages/core/security/core-security-server/src/api_provider.ts
+++ b/packages/core/security/core-security-server/src/api_provider.ts
@@ -14,7 +14,7 @@ import type { CoreAuthenticationService } from './authc';
*
* @public
*/
-export interface CoreSecurityContract {
+export interface CoreSecurityDelegateContract {
authc: AuthenticationServiceContract;
}
diff --git a/packages/core/security/core-security-server/src/contracts.ts b/packages/core/security/core-security-server/src/contracts.ts
index b5dfa1b45ec72..8c75b352c5556 100644
--- a/packages/core/security/core-security-server/src/contracts.ts
+++ b/packages/core/security/core-security-server/src/contracts.ts
@@ -7,7 +7,7 @@
*/
import type { CoreAuthenticationService } from './authc';
-import type { CoreSecurityContract } from './api_provider';
+import type { CoreSecurityDelegateContract } from './api_provider';
/**
* Setup contract for Core's security service.
@@ -20,7 +20,7 @@ export interface SecurityServiceSetup {
*
* @remark this should **exclusively** be used by the security plugin.
*/
- registerSecurityApi(api: CoreSecurityContract): void;
+ registerSecurityDelegate(api: CoreSecurityDelegateContract): void;
}
/**
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/README.md b/packages/core/user-profile/core-user-profile-browser-internal/README.md
new file mode 100644
index 0000000000000..51f91f0a7c38f
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-browser-internal
+
+This package contains the internal types and implementation for Core's browser-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/index.ts b/packages/core/user-profile/core-user-profile-browser-internal/index.ts
new file mode 100644
index 0000000000000..f4c8a9ff31eec
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/index.ts
@@ -0,0 +1,12 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+export { UserProfileService } from './src/user_profile_service';
+export type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from './src/internal_contracts';
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js b/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js
new file mode 100644
index 0000000000000..599ca1dfee688
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-browser-internal'],
+};
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc
new file mode 100644
index 0000000000000..00e00c831988e
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-browser-internal",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/package.json b/packages/core/user-profile/core-user-profile-browser-internal/package.json
new file mode 100644
index 0000000000000..71325aba3a547
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-browser-internal",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts
new file mode 100644
index 0000000000000..3b2bca4c39b55
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts
@@ -0,0 +1,15 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type {
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+} from '@kbn/core-user-profile-browser';
+
+export type InternalUserProfileServiceSetup = UserProfileServiceSetup;
+export type InternalUserProfileServiceStart = UserProfileServiceStart;
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts
new file mode 100644
index 0000000000000..81c954d2f0869
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export const getDefaultUserProfileImplementationMock = jest.fn();
+export const convertUserProfileAPIMock = jest.fn();
+
+jest.doMock('./utils', () => {
+ const actual = jest.requireActual('./utils');
+ return {
+ ...actual,
+ getDefaultUserProfileImplementation: getDefaultUserProfileImplementationMock,
+ convertUserProfileAPI: convertUserProfileAPIMock,
+ };
+});
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts
new file mode 100644
index 0000000000000..ec89fa1a7fb02
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts
@@ -0,0 +1,97 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import {
+ convertUserProfileAPIMock,
+ getDefaultUserProfileImplementationMock,
+} from './user_profile_service.test.mocks';
+
+import { loggerMock, MockedLogger } from '@kbn/logging-mocks';
+import { mockCoreContext } from '@kbn/core-base-server-mocks';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import { UserProfileService } from './user_profile_service';
+
+const createStubContract = (): CoreUserProfileDelegateContract => {
+ return Symbol('stubContract') as unknown as CoreUserProfileDelegateContract;
+};
+
+describe('UserProfileService', () => {
+ let coreContext: ReturnType;
+ let service: UserProfileService;
+
+ beforeEach(() => {
+ coreContext = mockCoreContext.create();
+ service = new UserProfileService(coreContext);
+
+ convertUserProfileAPIMock.mockReset();
+ getDefaultUserProfileImplementationMock.mockReset();
+ });
+
+ describe('#setup', () => {
+ describe('#registerUserProfileDelegate', () => {
+ it('throws if called more than once', () => {
+ const { registerUserProfileDelegate } = service.setup();
+
+ const contract = createStubContract();
+ registerUserProfileDelegate(contract);
+
+ expect(() => registerUserProfileDelegate(contract)).toThrowErrorMatchingInlineSnapshot(
+ `"userProfile API can only be registered once"`
+ );
+ });
+ });
+ });
+
+ describe('#start', () => {
+ it('logs a warning if the userProfile API was not registered', () => {
+ service.setup();
+ service.start();
+
+ expect(loggerMock.collect(coreContext.logger as MockedLogger).warn).toMatchInlineSnapshot(`
+ Array [
+ Array [
+ "userProfile API was not registered, using default implementation",
+ ],
+ ]
+ `);
+ });
+
+ it('calls convertUserProfileAPI with the registered API', () => {
+ const { registerUserProfileDelegate } = service.setup();
+
+ const contract = createStubContract();
+ registerUserProfileDelegate(contract);
+
+ service.start();
+
+ expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1);
+ expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract);
+ });
+
+ it('calls convertUserProfileAPI with the default implementation when no API was registered', () => {
+ const contract = createStubContract();
+ getDefaultUserProfileImplementationMock.mockReturnValue(contract);
+
+ service.setup();
+ service.start();
+
+ expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1);
+ expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract);
+ });
+
+ it('returns the result of convertUserProfileAPI as contract', () => {
+ const convertedContract = { stub: true };
+ convertUserProfileAPIMock.mockReturnValue(convertedContract);
+
+ service.setup();
+ const startContract = service.start();
+
+ expect(startContract).toEqual(convertedContract);
+ });
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts
new file mode 100644
index 0000000000000..92dc01d92f603
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts
@@ -0,0 +1,48 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { Logger } from '@kbn/logging';
+import type { CoreContext, CoreService } from '@kbn/core-base-browser-internal';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from './internal_contracts';
+import { getDefaultUserProfileImplementation, convertUserProfileAPI } from './utils';
+
+export class UserProfileService
+ implements CoreService
+{
+ private readonly log: Logger;
+ private delegate?: CoreUserProfileDelegateContract;
+
+ constructor(coreContext: CoreContext) {
+ this.log = coreContext.logger.get('user-profile-service');
+ }
+
+ public setup(): InternalUserProfileServiceSetup {
+ return {
+ registerUserProfileDelegate: (delegate) => {
+ if (this.delegate) {
+ throw new Error('userProfile API can only be registered once');
+ }
+ this.delegate = delegate;
+ },
+ };
+ }
+
+ public start(): InternalUserProfileServiceStart {
+ if (!this.delegate) {
+ this.log.warn('userProfile API was not registered, using default implementation');
+ }
+ const apiContract = this.delegate ?? getDefaultUserProfileImplementation();
+ return convertUserProfileAPI(apiContract);
+ }
+
+ public stop() {}
+}
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts
new file mode 100644
index 0000000000000..123e1357bdcc4
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts
@@ -0,0 +1,76 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { of } from 'rxjs';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type { InternalUserProfileServiceStart } from '../internal_contracts';
+import { convertUserProfileAPI } from './convert_api';
+
+describe('convertUserProfileAPI', () => {
+ let source: jest.Mocked;
+ let output: InternalUserProfileServiceStart;
+
+ beforeEach(() => {
+ source = {
+ userProfile$: of(null),
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ partialUpdate: jest.fn(),
+ };
+ output = convertUserProfileAPI(source);
+ });
+
+ describe('getUserProfile$', () => {
+ it('returns the observable from the source', () => {
+ expect(output.getUserProfile$()).toBe(source.userProfile$);
+ });
+ });
+
+ describe('getCurrent', () => {
+ it('calls the API from the source with the correct parameters', () => {
+ output.getCurrent();
+ expect(source.getCurrent).toHaveBeenCalledTimes(1);
+ expect(source.getCurrent).toHaveBeenCalledWith();
+ });
+ });
+
+ describe('bulkGet', () => {
+ it('calls the API from the source with the correct parameters', () => {
+ const params = { uids: new Set(['fake-uid-1', 'fake-uid-2', 'fake-uid-3']) };
+ output.bulkGet(params);
+ expect(source.bulkGet).toHaveBeenCalledTimes(1);
+ expect(source.bulkGet).toHaveBeenCalledWith(params);
+ });
+ });
+
+ describe('suggest', () => {
+ it('calls the API from the source with the correct parameters', () => {
+ output.suggest('path', { name: 'foo' });
+ expect(source.suggest).toHaveBeenCalledTimes(1);
+ expect(source.suggest).toHaveBeenCalledWith('path', { name: 'foo' });
+ });
+ });
+
+ describe('update', () => {
+ it('calls the API from the source with the correct parameters', () => {
+ output.update({ foo: 'dolly' });
+ expect(source.update).toHaveBeenCalledTimes(1);
+ expect(source.update).toHaveBeenCalledWith({ foo: 'dolly' });
+ });
+ });
+
+ describe('partialUpdate', () => {
+ it('calls the API from the source with the correct parameters', () => {
+ output.partialUpdate({ foo: 'dolly' });
+ expect(source.partialUpdate).toHaveBeenCalledTimes(1);
+ expect(source.partialUpdate).toHaveBeenCalledWith({ foo: 'dolly' });
+ });
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts
new file mode 100644
index 0000000000000..0ef054683bf17
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts
@@ -0,0 +1,23 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type { InternalUserProfileServiceStart } from '../internal_contracts';
+
+export const convertUserProfileAPI = (
+ delegate: CoreUserProfileDelegateContract
+): InternalUserProfileServiceStart => {
+ return {
+ getUserProfile$: () => delegate.userProfile$,
+ getCurrent: delegate.getCurrent.bind(delegate),
+ bulkGet: delegate.bulkGet.bind(delegate),
+ suggest: delegate.suggest.bind(delegate),
+ update: delegate.update.bind(delegate),
+ partialUpdate: delegate.partialUpdate.bind(delegate),
+ };
+};
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts
new file mode 100644
index 0000000000000..717fb3e24ef3d
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts
@@ -0,0 +1,34 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import { getDefaultUserProfileImplementation } from './default_implementation';
+
+describe('getDefaultUserProfileImplementation', () => {
+ let implementation: CoreUserProfileDelegateContract;
+
+ beforeEach(() => {
+ implementation = getDefaultUserProfileImplementation();
+ });
+
+ it('getCurrent resolves to null', async () => {
+ expect(await implementation.getCurrent({ dataPath: '/data-path' })).toBeNull();
+ });
+ it('bulkGet resolves to empty list', async () => {
+ expect(await implementation.bulkGet({ uids: new Set() })).toEqual([]);
+ });
+ it('suggest resolves to empty list', async () => {
+ expect(await implementation.suggest('/suggest', { name: 'foo' })).toEqual([]);
+ });
+ it('update resolves to undefined', async () => {
+ expect(await implementation.update({})).toBeUndefined();
+ });
+ it('partialUpdate resolves to undefined', async () => {
+ expect(await implementation.update({})).toBeUndefined();
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts
new file mode 100644
index 0000000000000..c4bcfa1f29b48
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts
@@ -0,0 +1,26 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { of } from 'rxjs';
+import type {
+ CoreUserProfileDelegateContract,
+ GetUserProfileResponse,
+} from '@kbn/core-user-profile-browser';
+import { UserProfileData } from '@kbn/core-user-profile-common';
+
+export const getDefaultUserProfileImplementation = (): CoreUserProfileDelegateContract => {
+ return {
+ userProfile$: of(null),
+ getCurrent: () =>
+ Promise.resolve(null as unknown as GetUserProfileResponse),
+ bulkGet: () => Promise.resolve([]),
+ suggest: () => Promise.resolve([]),
+ update: () => Promise.resolve(),
+ partialUpdate: () => Promise.resolve(),
+ };
+};
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts
new file mode 100644
index 0000000000000..e7e39fbf3e6f7
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts
@@ -0,0 +1,10 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export { convertUserProfileAPI } from './convert_api';
+export { getDefaultUserProfileImplementation } from './default_implementation';
diff --git a/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json b/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json
new file mode 100644
index 0000000000000..ab75fcaab6575
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node",
+ "react"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-browser",
+ "@kbn/logging-mocks",
+ "@kbn/core-base-server-mocks",
+ "@kbn/logging",
+ "@kbn/core-base-browser-internal",
+ "@kbn/core-user-profile-common",
+ ]
+}
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/README.md b/packages/core/user-profile/core-user-profile-browser-mocks/README.md
new file mode 100644
index 0000000000000..fde320e84e63d
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-browser-mocks
+
+This package contains mocks types for Core's browser-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/index.ts b/packages/core/user-profile/core-user-profile-browser-mocks/index.ts
new file mode 100644
index 0000000000000..b114ce1d93d2a
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export { userProfileServiceMock } from './src/user_profile_service.mock';
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js b/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js
new file mode 100644
index 0000000000000..62a2799bab8b4
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-browser-mocks'],
+};
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc
new file mode 100644
index 0000000000000..49e11fd3d169d
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-browser-mocks",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/package.json b/packages/core/user-profile/core-user-profile-browser-mocks/package.json
new file mode 100644
index 0000000000000..3fb503ad8c242
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-browser-mocks",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts b/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts
new file mode 100644
index 0000000000000..c43dfa6b915c7
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts
@@ -0,0 +1,76 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type {
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+} from '@kbn/core-user-profile-browser';
+import type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from '@kbn/core-user-profile-browser-internal';
+
+const createSetupMock = () => {
+ const mock: jest.Mocked = {
+ registerUserProfileDelegate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createStartMock = () => {
+ const mock: jest.Mocked = {
+ getUserProfile$: jest.fn(),
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ partialUpdate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createInternalSetupMock = () => {
+ const mock: jest.Mocked = {
+ registerUserProfileDelegate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createInternalStartMock = () => {
+ const mock: jest.Mocked = {
+ getUserProfile$: jest.fn(),
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ partialUpdate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createServiceMock = () => {
+ const mock = {
+ setup: jest.fn().mockReturnValue(createSetupMock()),
+ start: jest.fn().mockReturnValue(createStartMock()),
+ stop: jest.fn(),
+ };
+
+ return mock;
+};
+
+export const userProfileServiceMock = {
+ create: createServiceMock,
+ createSetup: createSetupMock,
+ createStart: createStartMock,
+ createInternalSetup: createInternalSetupMock,
+ createInternalStart: createInternalStartMock,
+};
diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json b/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json
new file mode 100644
index 0000000000000..b4f4683993884
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node",
+ "react"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-browser",
+ "@kbn/core-user-profile-browser-internal",
+ ]
+}
diff --git a/packages/core/user-profile/core-user-profile-browser/README.md b/packages/core/user-profile/core-user-profile-browser/README.md
new file mode 100644
index 0000000000000..fc68cd364872d
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-browser
+
+This package contains the public types for Core's browser-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-browser/index.ts b/packages/core/user-profile/core-user-profile-browser/index.ts
new file mode 100644
index 0000000000000..d98d1fa1437c2
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export type { UserProfileServiceSetup, UserProfileServiceStart } from './src/contracts';
+export type { CoreUserProfileDelegateContract } from './src/api_provider';
+export type {
+ UserProfileService,
+ UserProfileSuggestParams,
+ UserProfileBulkGetParams,
+ GetUserProfileResponse,
+ UserProfileGetCurrentParams,
+} from './src/service';
diff --git a/packages/core/user-profile/core-user-profile-browser/jest.config.js b/packages/core/user-profile/core-user-profile-browser/jest.config.js
new file mode 100644
index 0000000000000..4fac3199bb1f3
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-browser'],
+};
diff --git a/packages/core/user-profile/core-user-profile-browser/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc
new file mode 100644
index 0000000000000..376ee21cdb901
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-browser",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-browser/package.json b/packages/core/user-profile/core-user-profile-browser/package.json
new file mode 100644
index 0000000000000..7598349094a73
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-browser",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts b/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts
new file mode 100644
index 0000000000000..6e21886009063
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+import type { Observable } from 'rxjs';
+import type { UserProfileData } from '@kbn/core-user-profile-common';
+import type { UserProfileService } from './service';
+
+export type CoreUserProfileDelegateContract = Omit & {
+ userProfile$: Observable;
+};
diff --git a/packages/core/user-profile/core-user-profile-browser/src/contracts.ts b/packages/core/user-profile/core-user-profile-browser/src/contracts.ts
new file mode 100644
index 0000000000000..dc7b50e9cd171
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/src/contracts.ts
@@ -0,0 +1,31 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { UserProfileService } from './service';
+import type { CoreUserProfileDelegateContract } from './api_provider';
+
+/**
+ * Setup contract for Core's userProfile service.
+ *
+ * @public
+ */
+export interface UserProfileServiceSetup {
+ /**
+ * Register the userProfile implementation that will be used and re-exposed by Core.
+ *
+ * @remark this should **exclusively** be used by the security plugin.
+ */
+ registerUserProfileDelegate(delegate: CoreUserProfileDelegateContract): void;
+}
+
+/**
+ * Start contract for Core's userProfile service.
+ *
+ * @public
+ */
+export type UserProfileServiceStart = UserProfileService;
diff --git a/packages/core/user-profile/core-user-profile-browser/src/service.ts b/packages/core/user-profile/core-user-profile-browser/src/service.ts
new file mode 100644
index 0000000000000..98db65991c9ef
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/src/service.ts
@@ -0,0 +1,135 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { Observable } from 'rxjs';
+import type { AuthenticatedUser } from '@kbn/core-security-common';
+import type {
+ UserProfileData,
+ UserProfileWithSecurity,
+ UserProfile,
+} from '@kbn/core-user-profile-common';
+
+export interface UserProfileService {
+ /**
+ * Retrieve an observable emitting when the user profile is loaded.
+ */
+ getUserProfile$(): Observable;
+
+ /**
+ * Retrieves the user profile of the current user. If the profile isn't available, e.g. for the anonymous users or
+ * users authenticated via authenticating proxies, the `null` value is returned.
+ * @param [params] Get current user profile operation parameters.
+ * @param params.dataPath By default `getCurrent()` returns user information, but does not return any user data. The
+ * optional "dataPath" parameter can be used to return personal data for this user (within `kibana` namespace only).
+ */
+ getCurrent(
+ params?: UserProfileGetCurrentParams
+ ): Promise>;
+
+ /**
+ * Retrieves multiple user profiles by their identifiers.
+ * @param params Bulk get operation parameters.
+ * @param params.uids List of user profile identifiers.
+ * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The
+ * optional "dataPath" parameter can be used to return personal data for the requested user
+ * profiles (within `kibana` namespace only).
+ */
+ bulkGet(
+ params: UserProfileBulkGetParams
+ ): Promise>>;
+
+ /**
+ * Suggests multiple user profiles by search criteria.
+ *
+ * Note: This endpoint is not provided out-of-the-box by the platform. You need to expose your own
+ * version within your app. An example of how to do this can be found in:
+ * `examples/user_profile_examples/server/plugin.ts`
+ *
+ * @param path Path to your app's suggest endpoint.
+ * @param params Suggest operation parameters.
+ * @param params.name Query string used to match name-related fields in user profiles. The
+ * following fields are treated as name-related: username, full_name and email.
+ * @param params.size Desired number of suggestions to return. The default value is 10.
+ * @param params.dataPath By default, suggest API returns user information, but does not return
+ * any user data. The optional "dataPath" parameter can be used to return personal data for this
+ * user (within `kibana` namespace only).
+ */
+ suggest(
+ path: string,
+ params: UserProfileSuggestParams
+ ): Promise>>;
+
+ /**
+ * Updates user profile data of the current user.
+ * @param data Application data to be written (merged with existing data).
+ */
+ update(data: D): Promise;
+
+ /**
+ * Partially updates user profile data of the current user, merging the previous data with the provided data.
+ * @param data Application data to be merged with existing data.
+ */
+ partialUpdate>(data: D): Promise;
+}
+
+/**
+ * Parameters for the get user profile for the current user API.
+ */
+export interface UserProfileGetCurrentParams {
+ /**
+ * By default, get API returns user information, but does not return any user data. The optional "dataPath"
+ * parameter can be used to return personal data for this user (within `kibana` namespace only).
+ */
+ dataPath: string;
+}
+
+export interface GetUserProfileResponse
+ extends UserProfileWithSecurity {
+ /**
+ * Information about the currently authenticated user that owns the profile.
+ */
+ user: UserProfileWithSecurity['user'] & Pick;
+}
+
+/**
+ * Parameters for the bulk get API.
+ */
+export interface UserProfileBulkGetParams {
+ /**
+ * List of user profile identifiers.
+ */
+ uids: Set;
+
+ /**
+ * By default, suggest API returns user information, but does not return any user data. The optional "dataPath"
+ * parameter can be used to return personal data for this user (within `kibana` namespace only).
+ */
+ dataPath?: string;
+}
+
+/**
+ * Parameters for the suggest API.
+ */
+export interface UserProfileSuggestParams {
+ /**
+ * Query string used to match name-related fields in user profiles. The following fields are treated as
+ * name-related: username, full_name and email.
+ */
+ name: string;
+
+ /**
+ * Desired number of suggestions to return. The default value is 10.
+ */
+ size?: number;
+
+ /**
+ * By default, suggest API returns user information, but does not return any user data. The optional "dataPath"
+ * parameter can be used to return personal data for this user (within `kibana` namespace only).
+ */
+ dataPath?: string;
+}
diff --git a/packages/core/user-profile/core-user-profile-browser/tsconfig.json b/packages/core/user-profile/core-user-profile-browser/tsconfig.json
new file mode 100644
index 0000000000000..47b7d8c2017fe
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-browser/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node",
+ "react"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-common",
+ "@kbn/core-security-common",
+ ]
+}
diff --git a/packages/core/user-profile/core-user-profile-common/README.md b/packages/core/user-profile/core-user-profile-common/README.md
new file mode 100644
index 0000000000000..c3d7a6784bf70
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-common
+
+This package contains the common public types for Core's `userProfile` domain.
diff --git a/packages/core/user-profile/core-user-profile-common/index.ts b/packages/core/user-profile/core-user-profile-common/index.ts
new file mode 100644
index 0000000000000..89341d28c117c
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export type {
+ UserProfileData,
+ UserProfileLabels,
+ UserProfileWithSecurity,
+ UserProfile,
+ UserProfileUserInfoWithSecurity,
+ UserProfileUserInfo,
+} from './src/user_profile';
diff --git a/packages/core/user-profile/core-user-profile-common/jest.config.js b/packages/core/user-profile/core-user-profile-common/jest.config.js
new file mode 100644
index 0000000000000..1911410ec00a4
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-common'],
+};
diff --git a/packages/core/user-profile/core-user-profile-common/kibana.jsonc b/packages/core/user-profile/core-user-profile-common/kibana.jsonc
new file mode 100644
index 0000000000000..1cc049fd41717
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-common",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-common/package.json b/packages/core/user-profile/core-user-profile-common/package.json
new file mode 100644
index 0000000000000..fcc5b79e1256b
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-common",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts b/packages/core/user-profile/core-user-profile-common/src/user_profile.ts
similarity index 92%
rename from x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts
rename to packages/core/user-profile/core-user-profile-common/src/user_profile.ts
index 13743974afea1..91e7b82217cba 100644
--- a/x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts
+++ b/packages/core/user-profile/core-user-profile-common/src/user_profile.ts
@@ -1,8 +1,9 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
/**
diff --git a/packages/core/user-profile/core-user-profile-common/tsconfig.json b/packages/core/user-profile/core-user-profile-common/tsconfig.json
new file mode 100644
index 0000000000000..b05325b824a67
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-common/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node",
+ "react"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": []
+}
diff --git a/packages/core/user-profile/core-user-profile-server-internal/README.md b/packages/core/user-profile/core-user-profile-server-internal/README.md
new file mode 100644
index 0000000000000..7e089c466f903
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-server-internal
+
+This package contains the internal types and implementation for Core's server-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-server-internal/index.ts b/packages/core/user-profile/core-user-profile-server-internal/index.ts
new file mode 100644
index 0000000000000..fc8fb9848883c
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/index.ts
@@ -0,0 +1,14 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export { UserProfileService } from './src/user_profile_service';
+export { CoreUserProfileRouteHandlerContext } from './src/user_profile_route_handler_context';
+export type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from './src/internal_contracts';
diff --git a/packages/core/user-profile/core-user-profile-server-internal/jest.config.js b/packages/core/user-profile/core-user-profile-server-internal/jest.config.js
new file mode 100644
index 0000000000000..6bf5e351dbb95
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test/jest_node',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-server-internal'],
+};
diff --git a/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc
new file mode 100644
index 0000000000000..dc23dd4450d28
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-server-internal",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-server-internal/package.json b/packages/core/user-profile/core-user-profile-server-internal/package.json
new file mode 100644
index 0000000000000..0f37653649bf9
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-server-internal",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts b/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts
new file mode 100644
index 0000000000000..b1220eb9adf97
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type {
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+ CoreUserProfileDelegateContract,
+} from '@kbn/core-user-profile-server';
+
+export type InternalUserProfileServiceSetup = UserProfileServiceSetup;
+export type InternalUserProfileServiceStart = UserProfileServiceStart &
+ Pick;
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts
new file mode 100644
index 0000000000000..3fe3652872a93
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts
@@ -0,0 +1,31 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { KibanaRequest } from '@kbn/core-http-server';
+import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-server';
+import type {
+ UserProfileData,
+ UserProfileLabels,
+ UserProfileWithSecurity,
+} from '@kbn/core-user-profile-common';
+import type { InternalUserProfileServiceStart } from './internal_contracts';
+
+export class CoreUserProfileRouteHandlerContext implements UserProfileRequestHandlerContext {
+ constructor(
+ private readonly userProfileStart: InternalUserProfileServiceStart,
+ private readonly request: KibanaRequest
+ ) {}
+
+ getCurrent({
+ dataPath,
+ }: {
+ dataPath?: string;
+ } = {}): Promise | null> {
+ return this.userProfileStart.getCurrent({ request: this.request, dataPath });
+ }
+}
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts
new file mode 100644
index 0000000000000..81c954d2f0869
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export const getDefaultUserProfileImplementationMock = jest.fn();
+export const convertUserProfileAPIMock = jest.fn();
+
+jest.doMock('./utils', () => {
+ const actual = jest.requireActual('./utils');
+ return {
+ ...actual,
+ getDefaultUserProfileImplementation: getDefaultUserProfileImplementationMock,
+ convertUserProfileAPI: convertUserProfileAPIMock,
+ };
+});
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts
new file mode 100644
index 0000000000000..0fdbc5572109e
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts
@@ -0,0 +1,97 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import {
+ convertUserProfileAPIMock,
+ getDefaultUserProfileImplementationMock,
+} from './user_profile_service.test.mocks';
+
+import { loggerMock, MockedLogger } from '@kbn/logging-mocks';
+import { mockCoreContext } from '@kbn/core-base-server-mocks';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+import { UserProfileService } from './user_profile_service';
+
+const createStubContract = (): CoreUserProfileDelegateContract => {
+ return Symbol('stubContract') as unknown as CoreUserProfileDelegateContract;
+};
+
+describe('UserProfileService', () => {
+ let coreContext: ReturnType;
+ let service: UserProfileService;
+
+ beforeEach(() => {
+ coreContext = mockCoreContext.create();
+ service = new UserProfileService(coreContext);
+
+ convertUserProfileAPIMock.mockReset();
+ getDefaultUserProfileImplementationMock.mockReset();
+ });
+
+ describe('#setup', () => {
+ describe('#registerUserProfileDelegate', () => {
+ it('throws if called more than once', () => {
+ const { registerUserProfileDelegate } = service.setup();
+
+ const contract = createStubContract();
+ registerUserProfileDelegate(contract);
+
+ expect(() => registerUserProfileDelegate(contract)).toThrowErrorMatchingInlineSnapshot(
+ `"userProfile API can only be registered once"`
+ );
+ });
+ });
+ });
+
+ describe('#start', () => {
+ it('logs a warning if the userProfile API was not registered', () => {
+ service.setup();
+ service.start();
+
+ expect(loggerMock.collect(coreContext.logger as MockedLogger).warn).toMatchInlineSnapshot(`
+ Array [
+ Array [
+ "userProfile API was not registered, using default implementation",
+ ],
+ ]
+ `);
+ });
+
+ it('calls convertUserProfileAPI with the registered API', () => {
+ const { registerUserProfileDelegate } = service.setup();
+
+ const contract = createStubContract();
+ registerUserProfileDelegate(contract);
+
+ service.start();
+
+ expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1);
+ expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract);
+ });
+
+ it('calls convertUserProfileAPI with the default implementation when no API was registered', () => {
+ const contract = createStubContract();
+ getDefaultUserProfileImplementationMock.mockReturnValue(contract);
+
+ service.setup();
+ service.start();
+
+ expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1);
+ expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract);
+ });
+
+ it('returns the result of convertUserProfileAPI as contract', () => {
+ const convertedContract = { stub: true };
+ convertUserProfileAPIMock.mockReturnValue(convertedContract);
+
+ service.setup();
+ const startContract = service.start();
+
+ expect(startContract).toEqual(convertedContract);
+ });
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts
new file mode 100644
index 0000000000000..3c876c7d807a4
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts
@@ -0,0 +1,48 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { Logger } from '@kbn/logging';
+import type { CoreContext, CoreService } from '@kbn/core-base-server-internal';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+import type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from './internal_contracts';
+import { getDefaultUserProfileImplementation, convertUserProfileAPI } from './utils';
+
+export class UserProfileService
+ implements CoreService
+{
+ private readonly log: Logger;
+ private delegate?: CoreUserProfileDelegateContract;
+
+ constructor(coreContext: CoreContext) {
+ this.log = coreContext.logger.get('user-profile-service');
+ }
+
+ public setup(): InternalUserProfileServiceSetup {
+ return {
+ registerUserProfileDelegate: (delegate) => {
+ if (this.delegate) {
+ throw new Error('userProfile API can only be registered once');
+ }
+ this.delegate = delegate;
+ },
+ };
+ }
+
+ public start(): InternalUserProfileServiceStart {
+ if (!this.delegate) {
+ this.log.warn('userProfile API was not registered, using default implementation');
+ }
+ const apiContract = this.delegate ?? getDefaultUserProfileImplementation();
+ return convertUserProfileAPI(apiContract);
+ }
+
+ public stop() {}
+}
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts
new file mode 100644
index 0000000000000..74822aeea603b
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+import { convertUserProfileAPI } from './convert_api';
+
+describe('convertUserProfileAPI', () => {
+ it('returns the API from the source', () => {
+ const source: CoreUserProfileDelegateContract = {
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ };
+
+ const output = convertUserProfileAPI(source);
+
+ expect(output.getCurrent).toBe(source.getCurrent);
+ expect(output.bulkGet).toBe(source.bulkGet);
+ expect(output.suggest).toBe(source.suggest);
+ expect(output.update).toBe(source.update);
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts
new file mode 100644
index 0000000000000..5cd6edbfa920f
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+import type { InternalUserProfileServiceStart } from '../internal_contracts';
+
+export const convertUserProfileAPI = (
+ delegate: CoreUserProfileDelegateContract
+): InternalUserProfileServiceStart => {
+ return delegate;
+};
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts
new file mode 100644
index 0000000000000..31811dcadb48b
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts
@@ -0,0 +1,36 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { KibanaRequest } from '@kbn/core-http-server';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+import { getDefaultUserProfileImplementation } from './default_implementation';
+
+describe('getDefaultUserProfileImplementation', () => {
+ let implementation: CoreUserProfileDelegateContract;
+
+ const mockRequest = () => {
+ return {} as unknown as KibanaRequest;
+ };
+
+ beforeEach(() => {
+ implementation = getDefaultUserProfileImplementation();
+ });
+
+ it('getCurrent resolves to null', async () => {
+ expect(await implementation.getCurrent({ request: mockRequest() })).toBeNull();
+ });
+ it('bulkGet resolves to empty list', async () => {
+ expect(await implementation.bulkGet({ uids: new Set() })).toEqual([]);
+ });
+ it('suggest resolves to empty list', async () => {
+ expect(await implementation.suggest({})).toEqual([]);
+ });
+ it('update resolves to undefined', async () => {
+ expect(await implementation.update('foo', {})).toBeUndefined();
+ });
+});
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts
new file mode 100644
index 0000000000000..c837696c0158c
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts
@@ -0,0 +1,18 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+
+export const getDefaultUserProfileImplementation = (): CoreUserProfileDelegateContract => {
+ return {
+ getCurrent: () => Promise.resolve(null),
+ bulkGet: () => Promise.resolve([]),
+ suggest: () => Promise.resolve([]),
+ update: () => Promise.resolve(),
+ };
+};
diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts
new file mode 100644
index 0000000000000..e7e39fbf3e6f7
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts
@@ -0,0 +1,10 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export { convertUserProfileAPI } from './convert_api';
+export { getDefaultUserProfileImplementation } from './default_implementation';
diff --git a/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json b/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json
new file mode 100644
index 0000000000000..db09577dded94
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-server",
+ "@kbn/core-http-server",
+ "@kbn/core-user-profile-common",
+ "@kbn/logging",
+ "@kbn/core-base-server-internal",
+ "@kbn/logging-mocks",
+ "@kbn/core-base-server-mocks",
+ ]
+}
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/README.md b/packages/core/user-profile/core-user-profile-server-mocks/README.md
new file mode 100644
index 0000000000000..f1dc294a4198f
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-server-mocks
+
+This package contains mocks types for Core's server-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/index.ts b/packages/core/user-profile/core-user-profile-server-mocks/index.ts
new file mode 100644
index 0000000000000..b114ce1d93d2a
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/index.ts
@@ -0,0 +1,9 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export { userProfileServiceMock } from './src/user_profile_service.mock';
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js b/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js
new file mode 100644
index 0000000000000..746236502cafc
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test/jest_node',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-server-mocks'],
+};
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc
new file mode 100644
index 0000000000000..bd62cf371dbc3
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-server-mocks",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/package.json b/packages/core/user-profile/core-user-profile-server-mocks/package.json
new file mode 100644
index 0000000000000..a77996ce9f5e8
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-server-mocks",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts b/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts
new file mode 100644
index 0000000000000..193428b32a21c
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts
@@ -0,0 +1,81 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type {
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+ UserProfileRequestHandlerContext,
+} from '@kbn/core-user-profile-server';
+import type {
+ InternalUserProfileServiceSetup,
+ InternalUserProfileServiceStart,
+} from '@kbn/core-user-profile-server-internal';
+
+const createSetupMock = () => {
+ const mock: jest.Mocked = {
+ registerUserProfileDelegate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createStartMock = () => {
+ const mock: jest.Mocked = {
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createInternalSetupMock = () => {
+ const mock: jest.Mocked = {
+ registerUserProfileDelegate: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createInternalStartMock = () => {
+ const mock: jest.Mocked = {
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createServiceMock = () => {
+ const mock = {
+ setup: jest.fn().mockReturnValue(createSetupMock()),
+ start: jest.fn().mockReturnValue(createStartMock()),
+ stop: jest.fn(),
+ };
+
+ return mock;
+};
+
+const createRequestHandlerContextMock = () => {
+ const mock: jest.Mocked = {
+ getCurrent: jest.fn(),
+ };
+
+ return mock;
+};
+
+export const userProfileServiceMock = {
+ create: createServiceMock,
+ createSetup: createSetupMock,
+ createStart: createStartMock,
+ createInternalSetup: createInternalSetupMock,
+ createInternalStart: createInternalStartMock,
+ createRequestHandlerContext: createRequestHandlerContextMock,
+};
diff --git a/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json b/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json
new file mode 100644
index 0000000000000..a2f13d1e160c7
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-server",
+ "@kbn/core-user-profile-server-internal",
+ ]
+}
diff --git a/packages/core/user-profile/core-user-profile-server/README.md b/packages/core/user-profile/core-user-profile-server/README.md
new file mode 100644
index 0000000000000..18dd654962b89
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/README.md
@@ -0,0 +1,3 @@
+# @kbn/core-user-profile-server
+
+This package contains the public types for Core's server-side `userProfile` service.
diff --git a/packages/core/user-profile/core-user-profile-server/index.ts b/packages/core/user-profile/core-user-profile-server/index.ts
new file mode 100644
index 0000000000000..a6056a5eb5f0b
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/index.ts
@@ -0,0 +1,18 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export type { UserProfileServiceSetup, UserProfileServiceStart } from './src/contracts';
+export type { CoreUserProfileDelegateContract } from './src/api_provider';
+export type {
+ UserProfileService,
+ UserProfileSuggestParams,
+ UserProfileBulkGetParams,
+ UserProfileRequiredPrivileges,
+ UserProfileGetCurrentParams,
+} from './src/service';
+export type { UserProfileRequestHandlerContext } from './src/request_handler_context';
diff --git a/packages/core/user-profile/core-user-profile-server/jest.config.js b/packages/core/user-profile/core-user-profile-server/jest.config.js
new file mode 100644
index 0000000000000..6b79add0b553d
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/jest.config.js
@@ -0,0 +1,13 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+module.exports = {
+ preset: '@kbn/test/jest_node',
+ rootDir: '../../../..',
+ roots: ['/packages/core/user-profile/core-user-profile-server'],
+};
diff --git a/packages/core/user-profile/core-user-profile-server/kibana.jsonc b/packages/core/user-profile/core-user-profile-server/kibana.jsonc
new file mode 100644
index 0000000000000..8d47dde6b5a6f
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/kibana.jsonc
@@ -0,0 +1,5 @@
+{
+ "type": "shared-common",
+ "id": "@kbn/core-user-profile-server",
+ "owner": "@elastic/kibana-core"
+}
diff --git a/packages/core/user-profile/core-user-profile-server/package.json b/packages/core/user-profile/core-user-profile-server/package.json
new file mode 100644
index 0000000000000..0bc1664de8163
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@kbn/core-user-profile-server",
+ "private": true,
+ "version": "1.0.0",
+ "license": "SSPL-1.0 OR Elastic License 2.0"
+}
\ No newline at end of file
diff --git a/packages/core/user-profile/core-user-profile-server/src/api_provider.ts b/packages/core/user-profile/core-user-profile-server/src/api_provider.ts
new file mode 100644
index 0000000000000..d65140536dfbf
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/src/api_provider.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { UserProfileData } from '@kbn/core-user-profile-common';
+import type { UserProfileService } from './service';
+
+export type CoreUserProfileDelegateContract = UserProfileService & {
+ /**
+ * Updates user preferences by identifier.
+ * @param uid User ID
+ * @param data Application data to be written (merged with existing data).
+ */
+ update(uid: string, data: D): Promise;
+};
diff --git a/packages/core/user-profile/core-user-profile-server/src/contracts.ts b/packages/core/user-profile/core-user-profile-server/src/contracts.ts
new file mode 100644
index 0000000000000..dc7b50e9cd171
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/src/contracts.ts
@@ -0,0 +1,31 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { UserProfileService } from './service';
+import type { CoreUserProfileDelegateContract } from './api_provider';
+
+/**
+ * Setup contract for Core's userProfile service.
+ *
+ * @public
+ */
+export interface UserProfileServiceSetup {
+ /**
+ * Register the userProfile implementation that will be used and re-exposed by Core.
+ *
+ * @remark this should **exclusively** be used by the security plugin.
+ */
+ registerUserProfileDelegate(delegate: CoreUserProfileDelegateContract): void;
+}
+
+/**
+ * Start contract for Core's userProfile service.
+ *
+ * @public
+ */
+export type UserProfileServiceStart = UserProfileService;
diff --git a/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts b/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts
new file mode 100644
index 0000000000000..c6e4914dada19
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import {
+ UserProfileData,
+ UserProfileLabels,
+ UserProfileWithSecurity,
+} from '@kbn/core-user-profile-common';
+
+export interface UserProfileRequestHandlerContext {
+ getCurrent(options?: {
+ dataPath?: string;
+ }): Promise | null>;
+}
diff --git a/x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts b/packages/core/user-profile/core-user-profile-server/src/service.ts
similarity index 91%
rename from x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts
rename to packages/core/user-profile/core-user-profile-server/src/service.ts
index ab68b973139ed..40b422c6d939e 100644
--- a/x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts
+++ b/packages/core/user-profile/core-user-profile-server/src/service.ts
@@ -1,29 +1,31 @@
/*
* 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.
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
*/
-import type { KibanaRequest } from '@kbn/core/server';
+import type { KibanaRequest } from '@kbn/core-http-server';
import type {
UserProfileData,
UserProfileLabels,
UserProfileWithSecurity,
UserProfile,
-} from '@kbn/security-plugin-types-common';
+} from '@kbn/core-user-profile-common';
/**
* A set of methods to work with Kibana user profiles.
*/
-export interface UserProfileServiceStart {
+export interface UserProfileService {
/**
* Retrieves a user profile for the current user extracted from the specified request. If the profile isn't available,
* e.g. for the anonymous users or users authenticated via authenticating proxies, the `null` value is returned.
* @param params Get current user profile operation parameters.
* @param params.request User request instance to get user profile for.
* @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The
- * optional "dataPath" parameter can be used to return personal data for the requested user profiles.
+ * optional "dataPath" parameter can be used to return personal data for the requested user
+ * profiles (within `kibana` namespace only).
*/
getCurrent(
params: UserProfileGetCurrentParams
@@ -34,7 +36,8 @@ export interface UserProfileServiceStart {
* @param params Bulk get operation parameters.
* @param params.uids List of user profile identifiers.
* @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The
- * optional "dataPath" parameter can be used to return personal data for the requested user profiles.
+ * optional "dataPath" parameter can be used to return personal data for the requested user
+ * profiles (within `kibana` namespace only).
*/
bulkGet(
params: UserProfileBulkGetParams
diff --git a/packages/core/user-profile/core-user-profile-server/tsconfig.json b/packages/core/user-profile/core-user-profile-server/tsconfig.json
new file mode 100644
index 0000000000000..85f418a0eb6c9
--- /dev/null
+++ b/packages/core/user-profile/core-user-profile-server/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target/types",
+ "types": [
+ "jest",
+ "node"
+ ]
+ },
+ "include": [
+ "**/*.ts",
+ ],
+ "exclude": [
+ "target/**/*"
+ ],
+ "kbn_references": [
+ "@kbn/core-user-profile-common",
+ "@kbn/core-http-server",
+ ]
+}
diff --git a/src/core/public/index.ts b/src/core/public/index.ts
index b5e08a1c81818..2260b78f90d9a 100644
--- a/src/core/public/index.ts
+++ b/src/core/public/index.ts
@@ -210,8 +210,24 @@ export type {
SecurityServiceSetup,
SecurityServiceStart,
CoreAuthenticationService,
+ CoreSecurityDelegateContract,
} from '@kbn/core-security-browser';
+export type {
+ UserProfile,
+ UserProfileLabels,
+ UserProfileWithSecurity,
+ UserProfileUserInfoWithSecurity,
+ UserProfileUserInfo,
+ UserProfileData,
+} from '@kbn/core-user-profile-common';
+export type {
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+ UserProfileService,
+ CoreUserProfileDelegateContract,
+} from '@kbn/core-user-profile-browser';
+
export type {
OverlayStart,
OverlayBannersStart,
diff --git a/src/core/server/index.ts b/src/core/server/index.ts
index c011a6f98be01..47f5da8bad226 100644
--- a/src/core/server/index.ts
+++ b/src/core/server/index.ts
@@ -130,6 +130,20 @@ export type {
AuthenticationProvider,
} from '@kbn/core-security-common';
+export type {
+ UserProfileUserInfo,
+ UserProfile,
+ UserProfileUserInfoWithSecurity,
+ UserProfileWithSecurity,
+ UserProfileLabels,
+ UserProfileData,
+} from '@kbn/core-user-profile-common';
+export type {
+ UserProfileRequestHandlerContext,
+ UserProfileServiceSetup,
+ UserProfileServiceStart,
+} from '@kbn/core-user-profile-server';
+
export { CspConfig } from '@kbn/core-http-server-internal';
export { CoreKibanaRequest, kibanaResponseFactory } from '@kbn/core-http-router-server-internal';
diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts
index 89fbd1a560758..826ac703d40c6 100644
--- a/src/core/server/mocks.ts
+++ b/src/core/server/mocks.ts
@@ -20,6 +20,7 @@ import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks';
import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks';
import { coreLifecycleMock, coreInternalLifecycleMock } from '@kbn/core-lifecycle-server-mocks';
import { securityServiceMock } from '@kbn/core-security-server-mocks';
+import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
import type { SharedGlobalConfig, PluginInitializerContext } from '@kbn/core-plugins-server';
export { configServiceMock, configDeprecationsMock } from '@kbn/config-mocks';
@@ -47,6 +48,7 @@ export { executionContextServiceMock } from '@kbn/core-execution-context-server-
export { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks';
export { analyticsServiceMock } from '@kbn/core-analytics-server-mocks';
export { securityServiceMock } from '@kbn/core-security-server-mocks';
+export { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks';
export type {
ElasticsearchClientMock,
@@ -135,6 +137,7 @@ function createCoreRequestHandlerContextMock() {
client: deprecationsServiceMock.createClient(),
},
security: securityServiceMock.createRequestHandlerContext(),
+ userProfile: userProfileServiceMock.createRequestHandlerContext(),
};
}
diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json
index ea4b84eedd71d..05ae89cb1be93 100644
--- a/src/core/tsconfig.json
+++ b/src/core/tsconfig.json
@@ -164,6 +164,10 @@
"@kbn/core-security-browser",
"@kbn/core-security-browser-mocks",
"@kbn/core-execution-context-server-internal",
+ "@kbn/core-user-profile-common",
+ "@kbn/core-user-profile-server",
+ "@kbn/core-user-profile-server-mocks",
+ "@kbn/core-user-profile-browser",
],
"exclude": [
"target/**/*",
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 14f4b0a198cce..17e13abcd5b5d 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -620,6 +620,20 @@
"@kbn/core-usage-data-server-internal/*": ["packages/core/usage-data/core-usage-data-server-internal/*"],
"@kbn/core-usage-data-server-mocks": ["packages/core/usage-data/core-usage-data-server-mocks"],
"@kbn/core-usage-data-server-mocks/*": ["packages/core/usage-data/core-usage-data-server-mocks/*"],
+ "@kbn/core-user-profile-browser": ["packages/core/user-profile/core-user-profile-browser"],
+ "@kbn/core-user-profile-browser/*": ["packages/core/user-profile/core-user-profile-browser/*"],
+ "@kbn/core-user-profile-browser-internal": ["packages/core/user-profile/core-user-profile-browser-internal"],
+ "@kbn/core-user-profile-browser-internal/*": ["packages/core/user-profile/core-user-profile-browser-internal/*"],
+ "@kbn/core-user-profile-browser-mocks": ["packages/core/user-profile/core-user-profile-browser-mocks"],
+ "@kbn/core-user-profile-browser-mocks/*": ["packages/core/user-profile/core-user-profile-browser-mocks/*"],
+ "@kbn/core-user-profile-common": ["packages/core/user-profile/core-user-profile-common"],
+ "@kbn/core-user-profile-common/*": ["packages/core/user-profile/core-user-profile-common/*"],
+ "@kbn/core-user-profile-server": ["packages/core/user-profile/core-user-profile-server"],
+ "@kbn/core-user-profile-server/*": ["packages/core/user-profile/core-user-profile-server/*"],
+ "@kbn/core-user-profile-server-internal": ["packages/core/user-profile/core-user-profile-server-internal"],
+ "@kbn/core-user-profile-server-internal/*": ["packages/core/user-profile/core-user-profile-server-internal/*"],
+ "@kbn/core-user-profile-server-mocks": ["packages/core/user-profile/core-user-profile-server-mocks"],
+ "@kbn/core-user-profile-server-mocks/*": ["packages/core/user-profile/core-user-profile-server-mocks/*"],
"@kbn/core-user-settings-server": ["packages/core/user-settings/core-user-settings-server"],
"@kbn/core-user-settings-server/*": ["packages/core/user-settings/core-user-settings-server/*"],
"@kbn/core-user-settings-server-internal": ["packages/core/user-settings/core-user-settings-server-internal"],
diff --git a/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts b/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts
index bffb7939c2fc8..2727f316fe868 100644
--- a/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts
+++ b/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts
@@ -12,4 +12,4 @@ export type {
UserProfileUserInfoWithSecurity,
UserProfile,
UserProfileWithSecurity,
-} from './user_profile';
+} from '@kbn/core-user-profile-common';
diff --git a/x-pack/packages/security/plugin_types_common/tsconfig.json b/x-pack/packages/security/plugin_types_common/tsconfig.json
index 84288bab1b4b9..353f6770352a9 100644
--- a/x-pack/packages/security/plugin_types_common/tsconfig.json
+++ b/x-pack/packages/security/plugin_types_common/tsconfig.json
@@ -11,6 +11,7 @@
],
"kbn_references": [
"@kbn/licensing-plugin",
- "@kbn/core-security-common"
+ "@kbn/core-security-common",
+ "@kbn/core-user-profile-common"
]
}
diff --git a/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts b/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts
index a397a16e5ad3a..eedf6e87a6483 100644
--- a/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts
+++ b/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts
@@ -5,15 +5,18 @@
* 2.0.
*/
-import type {
- UserProfileData,
- AuthenticatedUser,
- UserProfileWithSecurity,
- UserProfile,
-} from '@kbn/security-plugin-types-common';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type { UserProfileData } from '@kbn/core-user-profile-common';
import type { Observable } from 'rxjs';
-export interface UserProfileAPIClient {
+export type {
+ GetUserProfileResponse,
+ UserProfileSuggestParams,
+ UserProfileBulkGetParams,
+ UserProfileGetCurrentParams,
+} from '@kbn/core-user-profile-browser';
+
+export type UserProfileAPIClient = CoreUserProfileDelegateContract & {
readonly userProfile$: Observable;
/**
* Indicates if the user profile data has been loaded from the server.
@@ -23,115 +26,4 @@ export interface UserProfileAPIClient {
readonly userProfileLoaded$: Observable;
/** Flag to indicate if the current user has a user profile. Anonymous users don't have user profiles. */
readonly enabled$: Observable;
- /**
- * Retrieves the user profile of the current user. If the profile isn't available, e.g. for the anonymous users or
- * users authenticated via authenticating proxies, the `null` value is returned.
- * @param [params] Get current user profile operation parameters.
- * @param params.dataPath By default `getCurrent()` returns user information, but does not return any user data. The
- * optional "dataPath" parameter can be used to return personal data for this user.
- */
- getCurrent(
- params?: UserProfileGetCurrentParams
- ): Promise>;
-
- /**
- * Retrieves multiple user profiles by their identifiers.
- * @param params Bulk get operation parameters.
- * @param params.uids List of user profile identifiers.
- * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The
- * optional "dataPath" parameter can be used to return personal data for the requested user profiles.
- */
- bulkGet(
- params: UserProfileBulkGetParams
- ): Promise>>;
-
- /**
- * Suggests multiple user profiles by search criteria.
- *
- * Note: This endpoint is not provided out-of-the-box by the platform. You need to expose your own
- * version within your app. An example of how to do this can be found in:
- * `examples/user_profile_examples/server/plugin.ts`
- *
- * @param path Path to your app's suggest endpoint.
- * @param params Suggest operation parameters.
- * @param params.name Query string used to match name-related fields in user profiles. The
- * following fields are treated as name-related: username, full_name and email.
- * @param params.size Desired number of suggestions to return. The default value is 10.
- * @param params.dataPath By default, suggest API returns user information, but does not return
- * any user data. The optional "dataPath" parameter can be used to return personal data for this
- * user (within `kibana` namespace only).
- */
- suggest(
- path: string,
- params: UserProfileSuggestParams
- ): Promise>>;
-
- /**
- * Updates user profile data of the current user.
- * @param data Application data to be written (merged with existing data).
- */
- update(data: D): Promise;
-
- /**
- * Partially updates user profile data of the current user, merging the previous data with the provided data.
- * @param data Application data to be merged with existing data.
- */
- partialUpdate>(data: D): Promise;
-}
-
-/**
- * Parameters for the get user profile for the current user API.
- */
-export interface UserProfileGetCurrentParams {
- /**
- * By default, get API returns user information, but does not return any user data. The optional "dataPath"
- * parameter can be used to return personal data for this user (within `kibana` namespace only).
- */
- dataPath: string;
-}
-
-export interface GetUserProfileResponse
- extends UserProfileWithSecurity {
- /**
- * Information about the currently authenticated user that owns the profile.
- */
- user: UserProfileWithSecurity['user'] & Pick;
-}
-
-/**
- * Parameters for the bulk get API.
- */
-export interface UserProfileBulkGetParams {
- /**
- * List of user profile identifiers.
- */
- uids: Set;
-
- /**
- * By default, suggest API returns user information, but does not return any user data. The optional "dataPath"
- * parameter can be used to return personal data for this user (within `kibana` namespace only).
- */
- dataPath?: string;
-}
-
-/**
- * Parameters for the suggest API.
- */
-export interface UserProfileSuggestParams {
- /**
- * Query string used to match name-related fields in user profiles. The following fields are treated as
- * name-related: username, full_name and email.
- */
- name: string;
-
- /**
- * Desired number of suggestions to return. The default value is 10.
- */
- size?: number;
-
- /**
- * By default, suggest API returns user information, but does not return any user data. The optional "dataPath"
- * parameter can be used to return personal data for this user (within `kibana` namespace only).
- */
- dataPath?: string;
-}
+};
diff --git a/x-pack/packages/security/plugin_types_public/tsconfig.json b/x-pack/packages/security/plugin_types_public/tsconfig.json
index 23e34902d2c12..28f07062f6807 100644
--- a/x-pack/packages/security/plugin_types_public/tsconfig.json
+++ b/x-pack/packages/security/plugin_types_public/tsconfig.json
@@ -10,6 +10,8 @@
"target/**/*"
],
"kbn_references": [
- "@kbn/security-plugin-types-common"
+ "@kbn/security-plugin-types-common",
+ "@kbn/core-user-profile-browser",
+ "@kbn/core-user-profile-common"
]
}
diff --git a/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts b/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts
index 15be67e7601f0..7817ac8a543e9 100644
--- a/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts
+++ b/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts
@@ -11,4 +11,4 @@ export type {
UserProfileBulkGetParams,
UserProfileRequiredPrivileges,
UserProfileGetCurrentParams,
-} from './user_profile_service';
+} from '@kbn/core-user-profile-server';
diff --git a/x-pack/packages/security/plugin_types_server/tsconfig.json b/x-pack/packages/security/plugin_types_server/tsconfig.json
index 1883d50f328e5..0edcc935ca144 100644
--- a/x-pack/packages/security/plugin_types_server/tsconfig.json
+++ b/x-pack/packages/security/plugin_types_server/tsconfig.json
@@ -13,5 +13,6 @@
"@kbn/config-schema",
"@kbn/core",
"@kbn/security-plugin-types-common",
+ "@kbn/core-user-profile-server",
]
}
diff --git a/x-pack/plugins/fleet/.storybook/context/index.tsx b/x-pack/plugins/fleet/.storybook/context/index.tsx
index 8f118a31e0a17..608414af27887 100644
--- a/x-pack/plugins/fleet/.storybook/context/index.tsx
+++ b/x-pack/plugins/fleet/.storybook/context/index.tsx
@@ -13,7 +13,11 @@ import { createBrowserHistory } from 'history';
import { I18nProvider } from '@kbn/i18n-react';
-import type { PluginsServiceStart, SecurityServiceStart } from '@kbn/core/public';
+import type {
+ PluginsServiceStart,
+ SecurityServiceStart,
+ UserProfileServiceStart,
+} from '@kbn/core/public';
import { CoreScopedHistory } from '@kbn/core/public';
import { getStorybookContextProvider } from '@kbn/custom-integrations-plugin/storybook';
@@ -96,6 +100,7 @@ export const StorybookContext: React.FC<{ storyContext?: Parameters
getTheme: () => ({ darkMode: false }),
},
security: {} as unknown as SecurityServiceStart,
+ userProfile: {} as unknown as UserProfileServiceStart,
plugins: {} as unknown as PluginsServiceStart,
authz: {
fleet: {
diff --git a/x-pack/plugins/security/public/build_delegate_api.test.ts b/x-pack/plugins/security/public/build_delegate_api.test.ts
new file mode 100644
index 0000000000000..f8d4233b3edef
--- /dev/null
+++ b/x-pack/plugins/security/public/build_delegate_api.test.ts
@@ -0,0 +1,141 @@
+/*
+ * 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 { of } from 'rxjs';
+
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type { UserProfileAPIClient } from '@kbn/security-plugin-types-public';
+
+import { authenticationMock } from './authentication/index.mock';
+import { buildSecurityApi, buildUserProfileApi } from './build_delegate_api';
+import { securityMock } from './mocks';
+
+describe('buildSecurityApi', () => {
+ let authc: ReturnType;
+ let api: CoreSecurityDelegateContract;
+
+ beforeEach(() => {
+ authc = authenticationMock.createSetup();
+ api = buildSecurityApi({ authc });
+ });
+
+ describe('authc.getCurrentUser', () => {
+ it('properly delegates to the service', async () => {
+ await api.authc.getCurrentUser();
+
+ expect(authc.getCurrentUser).toHaveBeenCalledTimes(1);
+ });
+
+ it('returns the result from the service', async () => {
+ const delegateReturn = securityMock.createMockAuthenticatedUser();
+
+ authc.getCurrentUser.mockReturnValue(Promise.resolve(delegateReturn));
+
+ const currentUser = await api.authc.getCurrentUser();
+
+ expect(currentUser).toBe(delegateReturn);
+ });
+ });
+});
+
+describe('buildUserProfileApi', () => {
+ let userProfile: jest.Mocked;
+ let api: CoreUserProfileDelegateContract;
+
+ beforeEach(() => {
+ userProfile = {
+ userProfile$: of(null),
+ userProfileLoaded$: of(false),
+ enabled$: of(true),
+ getCurrent: jest.fn(),
+ bulkGet: jest.fn(),
+ suggest: jest.fn(),
+ update: jest.fn(),
+ partialUpdate: jest.fn(),
+ };
+ api = buildUserProfileApi({ userProfile });
+ });
+
+ describe('userProfile$', () => {
+ it('returns the reference from the service', async () => {
+ expect(api.userProfile$).toBe(userProfile.userProfile$);
+ });
+ });
+
+ describe('getCurrent', () => {
+ it('properly delegates to the service', async () => {
+ await api.getCurrent({ dataPath: 'dataPath' });
+
+ expect(userProfile.getCurrent).toHaveBeenCalledTimes(1);
+ expect(userProfile.getCurrent).toHaveBeenCalledWith({ dataPath: 'dataPath' });
+ });
+
+ it('returns the result from the service', async () => {
+ userProfile.getCurrent.mockResolvedValue({ stub: true } as any);
+
+ const returnValue = await api.getCurrent({ dataPath: 'dataPath' });
+
+ expect(returnValue).toEqual({ stub: true });
+ });
+ });
+
+ describe('bulkGet', () => {
+ it('properly delegates to the service', async () => {
+ const uids = new Set(['foo', 'bar']);
+ await api.bulkGet({ uids, dataPath: 'dataPath' });
+
+ expect(userProfile.bulkGet).toHaveBeenCalledTimes(1);
+ expect(userProfile.bulkGet).toHaveBeenCalledWith({ uids, dataPath: 'dataPath' });
+ });
+
+ it('returns the result from the service', async () => {
+ userProfile.bulkGet.mockResolvedValue([]);
+
+ const returnValue = await api.bulkGet({ uids: new Set(), dataPath: 'dataPath' });
+
+ expect(returnValue).toEqual([]);
+ });
+ });
+
+ describe('suggest', () => {
+ it('properly delegates to the service', async () => {
+ await api.suggest('path', { name: 'foo' });
+
+ expect(userProfile.suggest).toHaveBeenCalledTimes(1);
+ expect(userProfile.suggest).toHaveBeenCalledWith('path', { name: 'foo' });
+ });
+
+ it('returns the result from the service', async () => {
+ userProfile.suggest.mockResolvedValue([]);
+
+ const returnValue = await api.suggest('path', { name: 'foo' });
+
+ expect(returnValue).toEqual([]);
+ });
+ });
+
+ describe('update', () => {
+ it('properly delegates to the service', async () => {
+ const updated = { foo: 'bar' };
+ await api.update(updated);
+
+ expect(userProfile.update).toHaveBeenCalledTimes(1);
+ expect(userProfile.update).toHaveBeenCalledWith(updated);
+ });
+ });
+
+ describe('partialUpdate', () => {
+ it('properly delegates to the service', async () => {
+ const updated = { foo: 'bar' };
+ await api.partialUpdate(updated);
+
+ expect(userProfile.partialUpdate).toHaveBeenCalledTimes(1);
+ expect(userProfile.partialUpdate).toHaveBeenCalledWith(updated);
+ });
+ });
+});
diff --git a/x-pack/plugins/security/public/build_delegate_api.ts b/x-pack/plugins/security/public/build_delegate_api.ts
new file mode 100644
index 0000000000000..b8444c19adbe0
--- /dev/null
+++ b/x-pack/plugins/security/public/build_delegate_api.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { CoreSecurityDelegateContract } from '@kbn/core-security-browser';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser';
+import type {
+ AuthenticationServiceSetup,
+ UserProfileAPIClient,
+} from '@kbn/security-plugin-types-public';
+
+export const buildSecurityApi = ({
+ authc,
+}: {
+ authc: AuthenticationServiceSetup;
+}): CoreSecurityDelegateContract => {
+ return {
+ authc: {
+ getCurrentUser: () => authc.getCurrentUser(),
+ },
+ };
+};
+
+export const buildUserProfileApi = ({
+ userProfile,
+}: {
+ userProfile: UserProfileAPIClient;
+}): CoreUserProfileDelegateContract => {
+ return userProfile;
+};
diff --git a/x-pack/plugins/security/public/build_security_api.test.ts b/x-pack/plugins/security/public/build_security_api.test.ts
deleted file mode 100644
index 344e3daea5467..0000000000000
--- a/x-pack/plugins/security/public/build_security_api.test.ts
+++ /dev/null
@@ -1,40 +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 { CoreSecurityContract } from '@kbn/core-security-browser';
-
-import { authenticationMock } from './authentication/index.mock';
-import { buildSecurityApi } from './build_security_api';
-import { securityMock } from './mocks';
-
-describe('buildSecurityApi', () => {
- let authc: ReturnType;
- let api: CoreSecurityContract;
-
- beforeEach(() => {
- authc = authenticationMock.createSetup();
- api = buildSecurityApi({ authc });
- });
-
- describe('authc.getCurrentUser', () => {
- it('properly delegates to the service', async () => {
- await api.authc.getCurrentUser();
-
- expect(authc.getCurrentUser).toHaveBeenCalledTimes(1);
- });
-
- it('returns the result from the service', async () => {
- const delegateReturn = securityMock.createMockAuthenticatedUser();
-
- authc.getCurrentUser.mockReturnValue(Promise.resolve(delegateReturn));
-
- const currentUser = await api.authc.getCurrentUser();
-
- expect(currentUser).toBe(delegateReturn);
- });
- });
-});
diff --git a/x-pack/plugins/security/public/build_security_api.ts b/x-pack/plugins/security/public/build_security_api.ts
deleted file mode 100644
index 5c2849c2266c9..0000000000000
--- a/x-pack/plugins/security/public/build_security_api.ts
+++ /dev/null
@@ -1,21 +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 { CoreSecurityContract } from '@kbn/core-security-browser';
-import type { AuthenticationServiceSetup } from '@kbn/security-plugin-types-public';
-
-export const buildSecurityApi = ({
- authc,
-}: {
- authc: AuthenticationServiceSetup;
-}): CoreSecurityContract => {
- return {
- authc: {
- getCurrentUser: () => authc.getCurrentUser(),
- },
- };
-};
diff --git a/x-pack/plugins/security/public/plugin.test.tsx b/x-pack/plugins/security/public/plugin.test.tsx
index d3dadbfb87665..e58ff7ba5e325 100644
--- a/x-pack/plugins/security/public/plugin.test.tsx
+++ b/x-pack/plugins/security/public/plugin.test.tsx
@@ -84,7 +84,7 @@ describe('Security Plugin', () => {
});
});
- it('calls core.security.registerSecurityApi', () => {
+ it('calls core.security.registerSecurityDelegate', () => {
const coreSetupMock = getCoreSetupMock();
const plugin = new SecurityPlugin(coreMock.createPluginInitializerContext());
@@ -93,7 +93,19 @@ describe('Security Plugin', () => {
licensing: licensingMock.createSetup(),
});
- expect(coreSetupMock.security.registerSecurityApi).toHaveBeenCalledTimes(1);
+ expect(coreSetupMock.security.registerSecurityDelegate).toHaveBeenCalledTimes(1);
+ });
+
+ it('calls core.userProfile.registerUserProfileDelegate', () => {
+ const coreSetupMock = getCoreSetupMock();
+
+ const plugin = new SecurityPlugin(coreMock.createPluginInitializerContext());
+
+ plugin.setup(coreSetupMock, {
+ licensing: licensingMock.createSetup(),
+ });
+
+ expect(coreSetupMock.userProfile.registerUserProfileDelegate).toHaveBeenCalledTimes(1);
});
});
diff --git a/x-pack/plugins/security/public/plugin.tsx b/x-pack/plugins/security/public/plugin.tsx
index 333f8736731ac..9077db924f87c 100644
--- a/x-pack/plugins/security/public/plugin.tsx
+++ b/x-pack/plugins/security/public/plugin.tsx
@@ -36,7 +36,7 @@ import { AnalyticsService } from './analytics';
import { AnonymousAccessService } from './anonymous_access';
import { AuthenticationService } from './authentication';
import { AuthorizationService } from './authorization';
-import { buildSecurityApi } from './build_security_api';
+import { buildSecurityApi, buildUserProfileApi } from './build_delegate_api';
import type { SecurityApiClients } from './components';
import type { ConfigType } from './config';
import { ManagementService, UserAPIClient } from './management';
@@ -143,7 +143,10 @@ export class SecurityPlugin
securityApiClients: this.securityApiClients,
});
- core.security.registerSecurityApi(buildSecurityApi({ authc: this.authc }));
+ core.security.registerSecurityDelegate(buildSecurityApi({ authc: this.authc }));
+ core.userProfile.registerUserProfileDelegate(
+ buildUserProfileApi({ userProfile: this.securityApiClients.userProfiles })
+ );
if (management) {
this.managementService.setup({
diff --git a/x-pack/plugins/security/server/build_delegate_apis.test.ts b/x-pack/plugins/security/server/build_delegate_apis.test.ts
new file mode 100644
index 0000000000000..9511110cdc173
--- /dev/null
+++ b/x-pack/plugins/security/server/build_delegate_apis.test.ts
@@ -0,0 +1,121 @@
+/*
+ * 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 { httpServerMock } from '@kbn/core-http-server-mocks';
+import type { CoreSecurityDelegateContract } from '@kbn/core-security-server';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+
+import { authenticationServiceMock } from './authentication/authentication_service.mock';
+import { buildSecurityApi, buildUserProfileApi } from './build_delegate_apis';
+import { securityMock } from './mocks';
+import { userProfileServiceMock } from './user_profile/user_profile_service.mock';
+
+describe('buildSecurityApi', () => {
+ let authc: ReturnType;
+ let api: CoreSecurityDelegateContract;
+
+ beforeEach(() => {
+ authc = authenticationServiceMock.createStart();
+ api = buildSecurityApi({ getAuthc: () => authc });
+ });
+
+ describe('authc.getCurrentUser', () => {
+ it('properly delegates to the service', () => {
+ const request = httpServerMock.createKibanaRequest();
+ api.authc.getCurrentUser(request);
+
+ expect(authc.getCurrentUser).toHaveBeenCalledTimes(1);
+ expect(authc.getCurrentUser).toHaveBeenCalledWith(request);
+ });
+
+ it('returns the result from the service', async () => {
+ const request = httpServerMock.createKibanaRequest();
+ const delegateReturn = securityMock.createMockAuthenticatedUser();
+
+ authc.getCurrentUser.mockReturnValue(delegateReturn);
+
+ const currentUser = api.authc.getCurrentUser(request);
+
+ expect(currentUser).toBe(delegateReturn);
+ });
+ });
+});
+
+describe('buildUserProfileApi', () => {
+ let userProfile: ReturnType;
+ let api: CoreUserProfileDelegateContract;
+
+ beforeEach(() => {
+ userProfile = userProfileServiceMock.createStart();
+ api = buildUserProfileApi({ getUserProfile: () => userProfile });
+ });
+
+ describe('getCurrent', () => {
+ it('properly delegates to the service', async () => {
+ const request = httpServerMock.createKibanaRequest();
+ await api.getCurrent({ request, dataPath: 'dataPath' });
+
+ expect(userProfile.getCurrent).toHaveBeenCalledTimes(1);
+ expect(userProfile.getCurrent).toHaveBeenCalledWith({ request, dataPath: 'dataPath' });
+ });
+
+ it('returns the result from the service', async () => {
+ const request = httpServerMock.createKibanaRequest();
+
+ userProfile.getCurrent.mockResolvedValue(null);
+
+ const returnValue = await api.getCurrent({ request, dataPath: 'dataPath' });
+
+ expect(returnValue).toBe(null);
+ });
+ });
+
+ describe('bulkGet', () => {
+ it('properly delegates to the service', async () => {
+ const uids = new Set(['foo', 'bar']);
+ await api.bulkGet({ uids, dataPath: 'dataPath' });
+
+ expect(userProfile.bulkGet).toHaveBeenCalledTimes(1);
+ expect(userProfile.bulkGet).toHaveBeenCalledWith({ uids, dataPath: 'dataPath' });
+ });
+
+ it('returns the result from the service', async () => {
+ userProfile.bulkGet.mockResolvedValue([]);
+
+ const returnValue = await api.bulkGet({ uids: new Set(), dataPath: 'dataPath' });
+
+ expect(returnValue).toEqual([]);
+ });
+ });
+
+ describe('suggest', () => {
+ it('properly delegates to the service', async () => {
+ await api.suggest({ name: 'foo' });
+
+ expect(userProfile.suggest).toHaveBeenCalledTimes(1);
+ expect(userProfile.suggest).toHaveBeenCalledWith({ name: 'foo' });
+ });
+
+ it('returns the result from the service', async () => {
+ userProfile.suggest.mockResolvedValue([]);
+
+ const returnValue = await api.suggest({ name: 'foo' });
+
+ expect(returnValue).toEqual([]);
+ });
+ });
+
+ describe('update', () => {
+ it('properly delegates to the service', async () => {
+ const updated = { foo: 'bar' };
+ await api.update('foo', updated);
+
+ expect(userProfile.update).toHaveBeenCalledTimes(1);
+ expect(userProfile.update).toHaveBeenCalledWith('foo', updated);
+ });
+ });
+});
diff --git a/x-pack/plugins/security/server/build_delegate_apis.ts b/x-pack/plugins/security/server/build_delegate_apis.ts
new file mode 100644
index 0000000000000..b4fd4474aaace
--- /dev/null
+++ b/x-pack/plugins/security/server/build_delegate_apis.ts
@@ -0,0 +1,39 @@
+/*
+ * 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 { CoreSecurityDelegateContract } from '@kbn/core-security-server';
+import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server';
+
+import type { InternalAuthenticationServiceStart } from './authentication';
+import type { UserProfileServiceStartInternal } from './user_profile';
+
+export const buildSecurityApi = ({
+ getAuthc,
+}: {
+ getAuthc: () => InternalAuthenticationServiceStart;
+}): CoreSecurityDelegateContract => {
+ return {
+ authc: {
+ getCurrentUser: (request) => {
+ return getAuthc().getCurrentUser(request);
+ },
+ },
+ };
+};
+
+export const buildUserProfileApi = ({
+ getUserProfile,
+}: {
+ getUserProfile: () => UserProfileServiceStartInternal;
+}): CoreUserProfileDelegateContract => {
+ return {
+ getCurrent: (params) => getUserProfile().getCurrent(params),
+ suggest: (params) => getUserProfile().suggest(params),
+ bulkGet: (params) => getUserProfile().bulkGet(params),
+ update: (uids, data) => getUserProfile().update(uids, data),
+ };
+};
diff --git a/x-pack/plugins/security/server/build_security_api.test.ts b/x-pack/plugins/security/server/build_security_api.test.ts
deleted file mode 100644
index ffbf0fb28d3b4..0000000000000
--- a/x-pack/plugins/security/server/build_security_api.test.ts
+++ /dev/null
@@ -1,44 +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 { httpServerMock } from '@kbn/core-http-server-mocks';
-import type { CoreSecurityContract } from '@kbn/core-security-server';
-
-import { authenticationServiceMock } from './authentication/authentication_service.mock';
-import { buildSecurityApi } from './build_security_api';
-import { securityMock } from './mocks';
-
-describe('buildSecurityApi', () => {
- let authc: ReturnType;
- let api: CoreSecurityContract;
-
- beforeEach(() => {
- authc = authenticationServiceMock.createStart();
- api = buildSecurityApi({ getAuthc: () => authc });
- });
-
- describe('authc.getCurrentUser', () => {
- it('properly delegates to the service', () => {
- const request = httpServerMock.createKibanaRequest();
- api.authc.getCurrentUser(request);
-
- expect(authc.getCurrentUser).toHaveBeenCalledTimes(1);
- expect(authc.getCurrentUser).toHaveBeenCalledWith(request);
- });
-
- it('returns the result from the service', async () => {
- const request = httpServerMock.createKibanaRequest();
- const delegateReturn = securityMock.createMockAuthenticatedUser();
-
- authc.getCurrentUser.mockReturnValue(delegateReturn);
-
- const currentUser = api.authc.getCurrentUser(request);
-
- expect(currentUser).toBe(delegateReturn);
- });
- });
-});
diff --git a/x-pack/plugins/security/server/build_security_api.ts b/x-pack/plugins/security/server/build_security_api.ts
deleted file mode 100644
index fa4d5f25f8ffa..0000000000000
--- a/x-pack/plugins/security/server/build_security_api.ts
+++ /dev/null
@@ -1,24 +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 { CoreSecurityContract } from '@kbn/core-security-server';
-
-import type { InternalAuthenticationServiceStart } from './authentication';
-
-export const buildSecurityApi = ({
- getAuthc,
-}: {
- getAuthc: () => InternalAuthenticationServiceStart;
-}): CoreSecurityContract => {
- return {
- authc: {
- getCurrentUser: (request) => {
- return getAuthc().getCurrentUser(request);
- },
- },
- };
-};
diff --git a/x-pack/plugins/security/server/plugin.test.ts b/x-pack/plugins/security/server/plugin.test.ts
index 78da2544922af..be3d00b77cff9 100644
--- a/x-pack/plugins/security/server/plugin.test.ts
+++ b/x-pack/plugins/security/server/plugin.test.ts
@@ -133,10 +133,16 @@ describe('Security Plugin', () => {
`);
});
- it('calls core.security.registerSecurityApi', () => {
+ it('calls core.security.registerSecurityDelegate', () => {
plugin.setup(mockCoreSetup, mockSetupDependencies);
- expect(mockCoreSetup.security.registerSecurityApi).toHaveBeenCalledTimes(1);
+ expect(mockCoreSetup.security.registerSecurityDelegate).toHaveBeenCalledTimes(1);
+ });
+
+ it('calls core.userProfile.registerUserProfileDelegate', () => {
+ plugin.setup(mockCoreSetup, mockSetupDependencies);
+
+ expect(mockCoreSetup.userProfile.registerUserProfileDelegate).toHaveBeenCalledTimes(1);
});
});
diff --git a/x-pack/plugins/security/server/plugin.ts b/x-pack/plugins/security/server/plugin.ts
index 936a581ab2b59..828c8b42ea1b7 100644
--- a/x-pack/plugins/security/server/plugin.ts
+++ b/x-pack/plugins/security/server/plugin.ts
@@ -44,7 +44,7 @@ import type { InternalAuthenticationServiceStart } from './authentication';
import { AuthenticationService } from './authentication';
import type { AuthorizationServiceSetupInternal } from './authorization';
import { AuthorizationService } from './authorization';
-import { buildSecurityApi } from './build_security_api';
+import { buildSecurityApi, buildUserProfileApi } from './build_delegate_apis';
import type { ConfigSchema, ConfigType } from './config';
import { createConfig } from './config';
import { getPrivilegeDeprecationsService, registerKibanaUserRoleDeprecation } from './deprecations';
@@ -310,11 +310,16 @@ export class SecurityPlugin
this.registerDeprecations(core, license);
- core.security.registerSecurityApi(
+ core.security.registerSecurityDelegate(
buildSecurityApi({
getAuthc: this.getAuthentication.bind(this),
})
);
+ core.userProfile.registerUserProfileDelegate(
+ buildUserProfileApi({
+ getUserProfile: this.getUserProfileService.bind(this),
+ })
+ );
defineRoutes({
router: core.http.createRouter(),
diff --git a/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts b/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts
index aad0e201e996b..a6bca14642f62 100644
--- a/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts
+++ b/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts
@@ -8,7 +8,7 @@
import type { ObjectType } from '@kbn/config-schema';
import type { RequestHandler, RouteConfig } from '@kbn/core/server';
import { kibanaResponseFactory } from '@kbn/core/server';
-import { httpServerMock } from '@kbn/core/server/mocks';
+import { coreMock, httpServerMock } from '@kbn/core/server/mocks';
import { defineGetCurrentUserProfileRoute } from './get_current';
import { mockAuthenticatedUser } from '../../../common/model/authenticated_user.mock';
@@ -20,21 +20,24 @@ import { userProfileServiceMock } from '../../user_profile/user_profile_service.
import { routeDefinitionParamsMock } from '../index.mock';
function getMockContext() {
- return {
+ return coreMock.createCustomRequestHandlerContext({
licensing: {
license: { check: jest.fn().mockReturnValue({ check: 'valid' }) },
},
- } as unknown as SecurityRequestHandlerContext;
+ }) as unknown as SecurityRequestHandlerContext;
}
describe('Get current user profile routes', () => {
let router: jest.Mocked;
+ let mockContext: SecurityRequestHandlerContext;
let userProfileService: jest.Mocked;
let authenticationService: ReturnType;
beforeEach(() => {
const routeParamsMock = routeDefinitionParamsMock.create();
router = routeParamsMock.router;
+ mockContext = getMockContext();
+
userProfileService = userProfileServiceMock.createStart();
routeParamsMock.getUserProfileService.mockReturnValue(userProfileService);
@@ -74,7 +77,7 @@ describe('Get current user profile routes', () => {
authenticationService.getCurrentUser.mockReturnValue(null);
await expect(
- routeHandler(getMockContext(), httpServerMock.createKibanaRequest(), kibanaResponseFactory)
+ routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory)
).resolves.toEqual(expect.objectContaining({ status: 404 }));
expect(userProfileService.getCurrent).not.toHaveBeenCalled();
@@ -83,28 +86,32 @@ describe('Get current user profile routes', () => {
it('returns `404` if profile is not available', async () => {
const mockRequest = httpServerMock.createKibanaRequest();
authenticationService.getCurrentUser.mockReturnValue(mockAuthenticatedUser());
- userProfileService.getCurrent.mockResolvedValue(null);
- await expect(
- routeHandler(getMockContext(), mockRequest, kibanaResponseFactory)
- ).resolves.toEqual(expect.objectContaining({ status: 404 }));
+ const coreContextMock = await mockContext.core;
+ (coreContextMock.userProfile.getCurrent as jest.Mock).mockResolvedValue(null);
+
+ await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual(
+ expect.objectContaining({ status: 404 })
+ );
- expect(userProfileService.getCurrent).toBeCalledTimes(1);
- expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest });
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1);
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({});
});
it('fails if `getCurrent` call fails.', async () => {
const unhandledException = new Error('Something went wrong.');
const mockRequest = httpServerMock.createKibanaRequest();
authenticationService.getCurrentUser.mockReturnValue(mockAuthenticatedUser());
- userProfileService.getCurrent.mockRejectedValue(unhandledException);
- await expect(
- routeHandler(getMockContext(), mockRequest, kibanaResponseFactory)
- ).resolves.toEqual(expect.objectContaining({ status: 500, payload: unhandledException }));
+ const coreContextMock = await mockContext.core;
+ (coreContextMock.userProfile.getCurrent as jest.Mock).mockRejectedValue(unhandledException);
+
+ await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual(
+ expect.objectContaining({ status: 500, payload: unhandledException })
+ );
- expect(userProfileService.getCurrent).toBeCalledTimes(1);
- expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest });
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1);
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({});
});
it('returns user profile for the current user.', async () => {
@@ -114,11 +121,11 @@ describe('Get current user profile routes', () => {
authenticationService.getCurrentUser.mockReturnValue(mockUser);
const mockProfile = userProfileMock.createWithSecurity({ uid: 'uid-1' });
- userProfileService.getCurrent.mockResolvedValue(mockProfile);
- await expect(
- routeHandler(getMockContext(), mockRequest, kibanaResponseFactory)
- ).resolves.toEqual(
+ const coreContextMock = await mockContext.core;
+ (coreContextMock.userProfile.getCurrent as jest.Mock).mockResolvedValue(mockProfile);
+
+ await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual(
expect.objectContaining({
status: 200,
payload: {
@@ -131,8 +138,8 @@ describe('Get current user profile routes', () => {
})
);
- expect(userProfileService.getCurrent).toBeCalledTimes(1);
- expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest, dataPath: '*' });
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1);
+ expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({ dataPath: '*' });
});
});
});
diff --git a/x-pack/plugins/security/server/routes/user_profile/get_current.ts b/x-pack/plugins/security/server/routes/user_profile/get_current.ts
index 25cdbf35cba6c..9661570e36b4e 100644
--- a/x-pack/plugins/security/server/routes/user_profile/get_current.ts
+++ b/x-pack/plugins/security/server/routes/user_profile/get_current.ts
@@ -25,16 +25,17 @@ export function defineGetCurrentUserProfileRoute({
},
},
createLicensedRouteHandler(async (context, request, response) => {
- const authenticationService = await getAuthenticationService();
+ const authenticationService = getAuthenticationService();
const currentUser = authenticationService.getCurrentUser(request);
if (!currentUser) {
return response.notFound();
}
+ const { userProfile } = await context.core;
+
let profile: UserProfileWithSecurity | null;
try {
- profile = await getUserProfileService().getCurrent({
- request,
+ profile = await userProfile.getCurrent({
dataPath: request.query.dataPath,
});
} catch (error) {
diff --git a/x-pack/plugins/security/tsconfig.json b/x-pack/plugins/security/tsconfig.json
index 3dde17effc710..61eb1bb0147f3 100644
--- a/x-pack/plugins/security/tsconfig.json
+++ b/x-pack/plugins/security/tsconfig.json
@@ -82,6 +82,8 @@
"@kbn/core-i18n-browser-mocks",
"@kbn/core-theme-browser-mocks",
"@kbn/core-analytics-browser-mocks",
+ "@kbn/core-user-profile-server",
+ "@kbn/core-user-profile-browser"
],
"exclude": [
"target/**/*",
diff --git a/yarn.lock b/yarn.lock
index 47b6a266bd734..5709927c111bf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4286,6 +4286,34 @@
version "0.0.0"
uid ""
+"@kbn/core-user-profile-browser-internal@link:packages/core/user-profile/core-user-profile-browser-internal":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-browser-mocks@link:packages/core/user-profile/core-user-profile-browser-mocks":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-browser@link:packages/core/user-profile/core-user-profile-browser":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-common@link:packages/core/user-profile/core-user-profile-common":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-server-internal@link:packages/core/user-profile/core-user-profile-server-internal":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-server-mocks@link:packages/core/user-profile/core-user-profile-server-mocks":
+ version "0.0.0"
+ uid ""
+
+"@kbn/core-user-profile-server@link:packages/core/user-profile/core-user-profile-server":
+ version "0.0.0"
+ uid ""
+
"@kbn/core-user-settings-server-internal@link:packages/core/user-settings/core-user-settings-server-internal":
version "0.0.0"
uid ""
From 2b51740d9efa3ef42cede12255fba56d36431704 Mon Sep 17 00:00:00 2001
From: Umberto Pepato
Date: Wed, 24 Apr 2024 10:47:45 +0200
Subject: [PATCH 101/183] [Cases] Add missing alerts table dependency to Cases
plugin (#181303)
## Summary
Adds the missing `fieldFormats` dependency needed by the alerts table to
the Cases plugin.
Fixes #181301
## To verify
1. Create a stack rule that fires alerts from `Stack Management > Rules`
(i.e. ElasticSearch Query)
2. Assign a Case action to that rule
3. Wait for alerts to be created
4. Navigate to `Stack Management > Cases` and open the automatically
created case
5. In the case detail page, navigate to the `Alerts` tab
6. Verify that the alerts table renders correctly
---
x-pack/plugins/cases/kibana.jsonc | 1 +
1 file changed, 1 insertion(+)
diff --git a/x-pack/plugins/cases/kibana.jsonc b/x-pack/plugins/cases/kibana.jsonc
index feecbc66ee445..84c04da1fe0f6 100644
--- a/x-pack/plugins/cases/kibana.jsonc
+++ b/x-pack/plugins/cases/kibana.jsonc
@@ -20,6 +20,7 @@
"licensing",
"features",
"triggersActionsUi",
+ "fieldFormats",
"management",
"security",
"notifications",
From 37d47da7711710ded8d30f0514f4da2e1810dc8f Mon Sep 17 00:00:00 2001
From: Gloria Hornero
Date: Wed, 24 Apr 2024 10:48:30 +0200
Subject: [PATCH 102/183] [Security Solution] Labels adjustments (#181371)
Following up from https://github.com/elastic/kibana/pull/180773
## Summary
In this PR we are introducing the `@skipServerlessMKI` label, with it, a
test will be excluded from the execution on any MKI environment but it
will be executed as part of the CI check if the `@serverless` tag is
present.
With the new changes the serverless labels will work as follows:
* `@serverless`: The test is executed as part of the PR check process
and in the periodic pipeline (MKI environment).
* `@serverlessQA`: The test is executed as part of the kibana release
process in the QA environment (MKI environment).
* `@skipInServerless`: The test is skipped from being executed in CI as
part of the PR check and is skipped from being executed in any MKI
environment.
`@skipInServerlessMKI`: The test is skipped from being executed in any
MKI environment but it will continue being executed as part of the PR
process if the `@serverless` tag is present.
**IMPORTANT:**
The skip labels have been created for those tests that use `@serverless`
or `@serverlessQA` labels. The absence of them (`@serverless` or
`@serverlessQA`) will exclude automatically the execution of the test in
the targeted environments.
I.E: A test without `@serverlessQA` will never be executed as part of
the Kibana release process. A test without `@serverless` will never be
executed as part of the PR CI check neither the periodic pipeline.
---
.../run_cypress/parallel_serverless.ts | 3 +-
.../cypress/README.md | 1 +
.../cypress_ci_serverless_qa.config.ts | 2 +-
...ws_suppression_serverless_essentials.cy.ts | 2 +-
.../event_correlation_rule_suppression.cy.ts | 2 +-
...orrelation_rule_suppression_sequence.cy.ts | 2 +-
...le_suppression_serverless_essentials.cy.ts | 2 +-
.../rule_creation/new_terms_rule.cy.ts | 2 +-
.../rule_edit/new_terms_rule.cy.ts | 2 +-
.../value_lists/value_list_items.cy.ts | 2 +-
.../install_update_authorization.cy.ts | 2 +-
.../install_update_error_handling.cy.ts | 2 +-
.../prebuilt_rules/install_workflow.cy.ts | 2 +-
.../prebuilt_rules/management.cy.ts | 2 +-
.../prebuilt_rules/notifications.cy.ts | 4 +-
.../related_integrations.cy.ts | 2 +-
.../bulk_actions/bulk_edit_rules.cy.ts | 6 +-
.../bulk_edit_rules_actions.cy.ts | 2 +-
.../import_export/export_rule.cy.ts | 4 +-
.../rules_table/rules_table_selection.cy.ts | 94 ++++++++++---------
.../e2e/entity_analytics/entity_flyout.cy.ts | 2 +-
.../e2e/explore/inspect/inspect_button.cy.ts | 2 +-
.../e2e/explore/ml/ml_conditional_links.cy.ts | 2 +-
.../e2e/explore/overview/overview.cy.ts | 2 +-
.../unified_components/query_tab.cy.ts | 2 +-
25 files changed, 78 insertions(+), 72 deletions(-)
diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts
index d9418b81b538d..2c5ca1e049fae 100644
--- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts
+++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts
@@ -475,7 +475,8 @@ ${JSON.stringify(argv, null, 2)}
!process.env.KIBANA_MKI_USE_LATEST_COMMIT ||
process.env.KIBANA_MKI_USE_LATEST_COMMIT !== '1'
) {
- cypressConfigFile.env.grepTags = '@serverlessQA --@skipInServerless';
+ cypressConfigFile.env.grepTags =
+ '@serverlessQA --@skipInServerless --@skipInServerlessMKI ';
}
const tier: string = argv.tier;
const endpointAddon: boolean = argv.endpointAddon;
diff --git a/x-pack/test/security_solution_cypress/cypress/README.md b/x-pack/test/security_solution_cypress/cypress/README.md
index d7ec660e1b24d..965d4a3cee13c 100644
--- a/x-pack/test/security_solution_cypress/cypress/README.md
+++ b/x-pack/test/security_solution_cypress/cypress/README.md
@@ -48,6 +48,7 @@ Note that we use tags in order to select which tests we want to execute:
- `@serverlessQA` includes a test in the Serverless test suite for the Kibana release process of serverless. You need to explicitly add this tag to any test you want yo run in CI for the second quality gate. These tests should be stable, otherviswe they will be blocking the release pipeline. They should be alsy critical enough, so that when they fail, there's a high chance of an SDH or blocker issue to be reported.
- `@ess` includes a test in the normal, non-Serverless test suite. You need to explicitly add this tag to any test you want to run against a non-Serverless environment.
- `@skipInEss` excludes a test from the non-Serverless test suite. The test will not be executed as part for the PR process. All the skipped tests should have a link to a ticket describing the reason why the test got skipped.
+- `@skipInServerlessMKI` excludes a test from the execution on any MKI environment (even if it's tagged as `@serverless` or `@serverlessQA`). Could indicate many things, e.g. "the test is flaky in Serverless MKI", "the test has been temporarily excluded, see the comment above why". All the skipped tests should have a link to a ticket describing the reason why the test got skipped.
- `@skipInServerless` excludes a test from the Serverless test suite and Serverless QA environment for both, periodic pipeline and second quality gate (even if it's tagged as `@serverless`). Could indicate many things, e.g. "the test is flaky in Serverless", "the test is Flaky in any type of environment", "the test has been temporarily excluded, see the comment above why". All the skipped tests should have a link to a ticket describing the reason why the test got skipped.
Please, before opening a PR with a new test, make sure that the test fails. If you never see your test fail you don’t know if your test is actually testing the right thing, or testing anything at all.
diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts
index c2c3c9abccda1..d0d5dd3f00154 100644
--- a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts
+++ b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts
@@ -19,7 +19,7 @@ export default defineCypressConfig({
env: {
grepFilterSpecs: true,
grepOmitFiltered: true,
- grepTags: '@serverless --@skipInServerless',
+ grepTags: '@serverless --@skipInServerless --@skipInServerlessMKI',
},
execTimeout: 300000,
pageLoadTimeout: 300000,
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts
index a1aae6c8d7b49..684828e8a42ab 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts
@@ -21,7 +21,7 @@ import { CREATE_RULE_URL } from '../../../../urls/navigation';
describe(
'Detection rules, Alert Suppression for Essentials tier',
{
- tags: ['@serverless'],
+ tags: ['@serverless', '@skipServerlessMKI'],
env: {
ftrConfig: {
productTypes: [
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts
index 700403600e6b1..a93d2d5edb3ab 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts
@@ -37,7 +37,7 @@ const SUPPRESS_BY_FIELDS = ['agent.type'];
describe(
'Detection Rule Creation - EQL Rules - With Alert Suppression',
{
- tags: ['@ess', '@serverless', '@skipInServerless'],
+ tags: ['@ess', '@serverless', '@skipServerlessMKI'],
// alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config
env: {
ftrConfig: {
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts
index 5c9d6a64e4664..1c8f28a2c2c35 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts
@@ -21,7 +21,7 @@ import {
describe(
'Detection Rule Creation - EQL Rules - With Alert Suppression',
{
- tags: ['@ess', '@serverless', '@skipInServerless'],
+ tags: ['@ess', '@serverless', '@skipServerlessMKI'],
// alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config
env: {
ftrConfig: {
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts
index 02e81b3d97304..4830c1c50cc6c 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts
@@ -28,7 +28,7 @@ const SUPPRESS_BY_FIELDS = ['agent.type'];
describe(
'Detection Rule Creation - EQL Rules - With Alert Suppression - Serverless Essentials License',
{
- tags: ['@serverless', '@skipInServerless'],
+ tags: ['@serverless', '@skipServerlessMKI'],
// alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config
env: {
ftrConfig: {
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts
index cb05087f008aa..a93797e8045d2 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts
@@ -74,7 +74,7 @@ import { openRuleManagementPageViaBreadcrumbs } from '../../../../tasks/rules_ma
describe(
'New Terms rules',
{
- tags: ['@ess', '@serverless'],
+ tags: ['@ess', '@serverless', '@skipServerlessMKI'],
env: {
// alertSuppressionForNewTermsRuleEnabled feature flag is also enabled in a global config
kbnServerArgs: [
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts
index 7604903d2b47e..3bfe7839d6252 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts
@@ -44,7 +44,7 @@ const rule = getNewTermsRule();
describe(
'Detection rules, New terms, Edit',
{
- tags: ['@ess', '@serverless'],
+ tags: ['@ess', '@serverless', '@skipServerlessMKI'],
env: {
// alertSuppressionForNewTermsRuleEnabled feature flag is also enabled in a global config
kbnServerArgs: [
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts
index 9dc094153235a..c8fd74fa64397 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts
@@ -43,7 +43,7 @@ import { RULES_MANAGEMENT_URL } from '../../../../urls/rules_management';
describe(
'Value list items',
{
- tags: ['@ess', '@serverless', '@skipInServerless'],
+ tags: ['@ess', '@serverless', '@skipServerlessMKI'],
env: {
ftrConfig: {
kbnServerArgs: [
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts
index 4e2b57e7a5e26..c9349ea6d083c 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts
@@ -68,7 +68,7 @@ const loginPageAsWriteAuthorizedUser = (url: string) => {
// https://github.com/elastic/kibana/issues/179965
describe(
'Detection rules, Prebuilt Rules Installation and Update - Authorization/RBAC',
- { tags: ['@ess', '@serverless', '@skipInServerless'] },
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
() => {
beforeEach(() => {
preventPrebuiltRulesPackageInstallation();
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts
index 0102cfb349edf..f0f5c9c42a8e8 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts
@@ -39,7 +39,7 @@ import { visitRulesManagementTable } from '../../../../tasks/rules_management';
// https://github.com/elastic/kibana/issues/179970
describe(
'Detection rules, Prebuilt Rules Installation and Update - Error handling',
- { tags: ['@ess', '@serverless', '@skipInServerless'] },
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
() => {
beforeEach(() => {
preventPrebuiltRulesPackageInstallation();
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts
index 259440f1c2abd..782672ccb1c45 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts
@@ -32,7 +32,7 @@ import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common';
describe(
'Detection rules, Prebuilt Rules Installation and Update workflow',
- { tags: ['@ess', '@serverless', '@skipInServerless'] },
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
() => {
describe('Installation of prebuilt rules', () => {
const RULE_1 = createRuleAssetSavedObject({
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts
index 63290d850729c..b49426b9b515a 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts
@@ -51,7 +51,7 @@ const rules = Array.from(Array(5)).map((_, i) => {
});
// https://github.com/elastic/kibana/issues/179973
-describe('Prebuilt rules', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
+describe('Prebuilt rules', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => {
beforeEach(() => {
login();
deleteAlertsAndRules();
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts
index 02a59e1b17f2e..f92e4b0f5a1ef 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts
@@ -57,7 +57,7 @@ describe(
// https://github.com/elastic/kibana/issues/179967
it(
'should NOT display install or update notifications when latest rules are installed',
- { tags: ['@skipInServerless'] },
+ { tags: ['@skipInServerlessMKI'] },
() => {
visitRulesManagementTable();
createAndInstallMockedPrebuiltRules([RULE_1]);
@@ -72,7 +72,7 @@ describe(
});
// https://github.com/elastic/kibana/issues/179968
- describe('Notifications', { tags: ['@skipInServerless'] }, () => {
+ describe('Notifications', { tags: ['@skipInServerlessMKI'] }, () => {
beforeEach(() => {
installPrebuiltRuleAssets([RULE_1]);
});
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts
index ad0cc76f623f5..413504800c2a7 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts
@@ -47,7 +47,7 @@ import {
// https://github.com/elastic/kibana/issues/179943
-describe('Related integrations', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
+describe('Related integrations', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => {
const DATA_STREAM_NAME = 'logs-related-integrations-test';
const PREBUILT_RULE_NAME = 'Prebuilt rule with related integrations';
const RULE_RELATED_INTEGRATIONS: IntegrationDefinition[] = [
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts
index c98f28fef2da0..573fc2c556abe 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts
@@ -183,7 +183,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () =>
});
// github.com/elastic/kibana/issues/179954
- it('Only prebuilt rules selected', { tags: ['@skipInServerless'] }, () => {
+ it('Only prebuilt rules selected', { tags: ['@skipInServerlessMKI'] }, () => {
createAndInstallMockedPrebuiltRules(PREBUILT_RULES);
// select Elastic(prebuilt) rules, check if we can't proceed further, as Elastic rules are not editable
@@ -204,7 +204,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () =>
// https://github.com/elastic/kibana/issues/179955
it(
'Prebuilt and custom rules selected: user proceeds with custom rules editing',
- { tags: ['@skipInServerless'] },
+ { tags: ['@skipInServerlessMKI'] },
() => {
getRulesManagementTableRows().then((existedRulesRows) => {
createAndInstallMockedPrebuiltRules(PREBUILT_RULES);
@@ -235,7 +235,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () =>
// https://github.com/elastic/kibana/issues/179956
it(
'Prebuilt and custom rules selected: user cancels action',
- { tags: ['@skipInServerless'] },
+ { tags: ['@skipInServerlessMKI'] },
() => {
createAndInstallMockedPrebuiltRules(PREBUILT_RULES);
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts
index 5762e273e9686..251932e6e8b30 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts
@@ -75,7 +75,7 @@ const expectedSlackMessage = 'Slack action test message';
// https://github.com/elastic/kibana/issues/179958
describe(
'Detection rules, bulk edit of rule actions',
- { tags: ['@ess', '@serverless', '@skipInServerless'] },
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
() => {
beforeEach(() => {
login();
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts
index 36bdcd7c23379..cc270d41c10a6 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts
@@ -96,7 +96,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => {
// https://github.com/elastic/kibana/issues/179959
it(
'shows a modal saying that no rules can be exported if all the selected rules are prebuilt',
- { tags: ['@skipInServerless'] },
+ { tags: ['@skipInServerlessMKI'] },
function () {
createAndInstallMockedPrebuiltRules(prebuiltRules);
@@ -164,7 +164,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => {
});
// https://github.com/elastic/kibana/issues/180029
- it('exports custom rules with exceptions', { tags: ['@skipInServerless'] }, function () {
+ it('exports custom rules with exceptions', { tags: ['@skipInServerlessMKI'] }, function () {
// one rule with exception, one without it
const expectedNumberCustomRulesToBeExported = 2;
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts
index b07069b65a4ef..e79f6d1e751bc 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts
@@ -35,65 +35,69 @@ const RULE_2 = createRuleAssetSavedObject({
});
// https://github.com/elastic/kibana/issues/179961
-describe('Rules table: selection', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
- beforeEach(() => {
- login();
- /* Create and install two mock rules */
- createAndInstallMockedPrebuiltRules([RULE_1, RULE_2]);
- visit(RULES_MANAGEMENT_URL);
- waitForPrebuiltDetectionRulesToBeLoaded();
- disableAutoRefresh();
- });
+describe(
+ 'Rules table: selection',
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
+ () => {
+ beforeEach(() => {
+ login();
+ /* Create and install two mock rules */
+ createAndInstallMockedPrebuiltRules([RULE_1, RULE_2]);
+ visit(RULES_MANAGEMENT_URL);
+ waitForPrebuiltDetectionRulesToBeLoaded();
+ disableAutoRefresh();
+ });
- it('should correctly update the selection label when rules are individually selected and unselected', () => {
- waitForPrebuiltDetectionRulesToBeLoaded();
+ it('should correctly update the selection label when rules are individually selected and unselected', () => {
+ waitForPrebuiltDetectionRulesToBeLoaded();
- selectRulesByName(['Test rule 1', 'Test rule 2']);
+ selectRulesByName(['Test rule 1', 'Test rule 2']);
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '2');
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '2');
- unselectRulesByName(['Test rule 1', 'Test rule 2']);
+ unselectRulesByName(['Test rule 1', 'Test rule 2']);
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
- });
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
+ });
- it('should correctly update the selection label when rules are bulk selected and then bulk un-selected', () => {
- waitForPrebuiltDetectionRulesToBeLoaded();
+ it('should correctly update the selection label when rules are bulk selected and then bulk un-selected', () => {
+ waitForPrebuiltDetectionRulesToBeLoaded();
- cy.get(SELECT_ALL_RULES_BTN).click();
+ cy.get(SELECT_ALL_RULES_BTN).click();
- getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount);
- });
+ getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount);
+ });
- // Un-select all rules via the Bulk Selection button from the Utility bar
- cy.get(SELECT_ALL_RULES_BTN).click();
+ // Un-select all rules via the Bulk Selection button from the Utility bar
+ cy.get(SELECT_ALL_RULES_BTN).click();
- // Current selection should be 0 rules
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
- // Bulk selection button should be back to displaying all rules
- getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
- cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount);
+ // Current selection should be 0 rules
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
+ // Bulk selection button should be back to displaying all rules
+ getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
+ cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount);
+ });
});
- });
- it('should correctly update the selection label when rules are bulk selected and then unselected via the table select all checkbox', () => {
- waitForPrebuiltDetectionRulesToBeLoaded();
+ it('should correctly update the selection label when rules are bulk selected and then unselected via the table select all checkbox', () => {
+ waitForPrebuiltDetectionRulesToBeLoaded();
- cy.get(SELECT_ALL_RULES_BTN).click();
+ cy.get(SELECT_ALL_RULES_BTN).click();
- getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount);
- });
+ getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount);
+ });
- // Un-select all rules via the Un-select All checkbox from the table
- cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click();
+ // Un-select all rules via the Un-select All checkbox from the table
+ cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click();
- // Current selection should be 0 rules
- cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
- // Bulk selection button should be back to displaying all rules
- getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
- cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount);
+ // Current selection should be 0 rules
+ cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0');
+ // Bulk selection button should be back to displaying all rules
+ getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => {
+ cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount);
+ });
});
- });
-});
+ }
+);
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts
index 18a1cc218ec0e..0b98ae36f1ec9 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts
@@ -144,7 +144,7 @@ describe(
});
// https://github.com/elastic/kibana/issues/179248
- describe('Managed data section', { tags: ['@skipInServerless'] }, () => {
+ describe('Managed data section', { tags: ['@skipInServerlessMKI'] }, () => {
beforeEach(() => {
mockFleetInstalledIntegrations([
{
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts
index e015d26887148..484ef1e9ed475 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts
@@ -27,7 +27,7 @@ const DATA_VIEW = 'auditbeat-*';
// FLAKY: https://github.com/elastic/kibana/issues/178367
describe.skip(
'Inspect Explore pages',
- { tags: ['@ess', '@serverless', '@skipInServerless'] },
+ { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] },
() => {
before(() => {
// illegal_argument_exception: unknown setting [index.lifecycle.name]
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts
index bcd132c56d10a..70ac94ca3a163 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts
@@ -27,7 +27,7 @@ import {
} from '../../../urls/ml_conditional_links';
// FLAKY: https://github.com/elastic/kibana/issues/180748
-describe.skip('ml conditional links', { tags: ['@ess', '@skipInServerless'] }, () => {
+describe.skip('ml conditional links', { tags: ['@ess', '@skipInServerlessMKI'] }, () => {
beforeEach(() => {
login();
});
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts
index 8ad3315bf36b1..78135fbd77235 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts
@@ -66,7 +66,7 @@ describe('Overview Page', { tags: ['@ess', '@serverless'] }, () => {
});
});
-describe('Overview page with no data', { tags: '@skipInServerless' }, () => {
+describe('Overview page with no data', { tags: '@skipInServerlessMKI' }, () => {
it('Splash screen should be here', () => {
login();
visitWithTimeRange(OVERVIEW_URL);
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts
index c54b593472dcd..625beff4fe21a 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts
@@ -28,7 +28,7 @@ import { ALERTS_URL } from '../../../../urls/navigation';
describe(
'Unsaved Timeline query tab',
{
- tags: ['@ess', '@serverless', '@skipInServerless'],
+ tags: ['@ess', '@serverless', '@skipInServerlessMKI'],
env: {
ftrConfig: {
kbnServerArgs: [
From 800289c506aeceb7e1dffa650481d7e10dc5e70c Mon Sep 17 00:00:00 2001
From: Konrad Szwarc
Date: Wed, 24 Apr 2024 10:59:00 +0200
Subject: [PATCH 103/183] [EDR Workflows] Proper undefined routeState handling
(#181432)
https://github.com/elastic/kibana/issues/181261
Check if `routeState` is defined before accessing it's properties in
`useCallback` dependency list.
With changes:
https://github.com/elastic/kibana/assets/29123534/4561c5d6-e354-4e0b-ac8a-dd231a26d722
Cypress tests when no undefined check is performed (application throws):
![Screenshot 2024-04-23 at 14 46
37](https://github.com/elastic/kibana/assets/29123534/ed7817dc-f11c-4f5e-bdf3-c6ee9f4c8ea6)
---
.../e2e/artifacts/artifact_tabs_in_policy_details.cy.ts | 6 ++++++
.../public/management/cypress/fixtures/artifacts_page.ts | 9 +++++----
.../management/pages/policy/view/tabs/policy_tabs.tsx | 2 +-
3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts
index b6040691c485f..3feb681f47f5c 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts
@@ -56,6 +56,10 @@ const getRoleWithoutArtifactPrivilege = (privilegePrefix: string) => {
const visitArtifactTab = (tabId: string) => {
visitPolicyDetailsPage();
+ clickArtifactTab(tabId);
+};
+
+const clickArtifactTab = (tabId: string) => {
cy.get(`#${tabId}`).click();
};
@@ -135,6 +139,8 @@ describe('Artifact tabs in Policy Details page', { tags: ['@ess', '@serverless']
cy.getByTestSubj('backToOrigin').click();
cy.getByTestSubj('policyDetailsPage').should('exist');
+ clickArtifactTab(testData.nextTabId); // Make sure the next tab is accessible and backLink doesn't throw errors
+ cy.getByTestSubj('policyDetailsPage');
});
});
diff --git a/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts b/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts
index bbd173b60cb88..f47818208cb8f 100644
--- a/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts
@@ -21,6 +21,7 @@ interface ArtifactsFixtureType {
title: string;
pagePrefix: string;
tabId: string;
+ nextTabId: string;
artifactName: string;
privilegePrefix: string;
urlPath: string;
@@ -46,6 +47,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
title: 'Trusted applications',
pagePrefix: 'trustedAppsListPage',
tabId: 'trustedApps',
+ nextTabId: 'eventFilters',
artifactName: 'Trusted application name',
privilegePrefix: 'trusted_applications_',
create: {
@@ -142,7 +144,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
},
urlPath: 'trusted_apps',
emptyState: 'trustedAppsListPage-emptyState',
-
createRequestBody: {
list_id: ENDPOINT_ARTIFACT_LISTS.trustedApps.id,
entries: [
@@ -172,6 +173,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
title: 'Event Filters',
pagePrefix: 'EventFiltersListPage',
tabId: 'eventFilters',
+ nextTabId: 'blocklists',
artifactName: 'Event filter name',
privilegePrefix: 'event_filters_',
create: {
@@ -274,7 +276,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
},
urlPath: 'event_filters',
emptyState: 'EventFiltersListPage-emptyState',
-
createRequestBody: {
list_id: ENDPOINT_ARTIFACT_LISTS.eventFilters.id,
entries: [
@@ -292,6 +293,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
title: 'Blocklist',
pagePrefix: 'blocklistPage',
tabId: 'blocklists',
+ nextTabId: 'hostIsolationExceptions',
artifactName: 'Blocklist name',
privilegePrefix: 'blocklist_',
create: {
@@ -397,7 +399,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
},
urlPath: 'blocklist',
emptyState: 'blocklistPage-emptyState',
-
createRequestBody: {
list_id: ENDPOINT_ARTIFACT_LISTS.blocklists.id,
entries: [
@@ -421,6 +422,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
title: 'Host isolation exceptions',
pagePrefix: 'hostIsolationExceptionsListPage',
tabId: 'hostIsolationExceptions',
+ nextTabId: 'trustedApps',
artifactName: 'Host Isolation exception name',
privilegePrefix: 'host_isolation_exceptions_',
create: {
@@ -499,7 +501,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [
},
urlPath: 'host_isolation_exceptions',
emptyState: 'hostIsolationExceptionsListPage-emptyState',
-
createRequestBody: {
list_id: ENDPOINT_ARTIFACT_LISTS.hostIsolationExceptions.id,
entries: [
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx
index 5b37aa798effd..fd7e8793535e2 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx
@@ -457,7 +457,7 @@ export const PolicyTabs = React.memo(() => {
cancelUnsavedChangesModal,
history,
policyId,
- routeState.backLink,
+ routeState?.backLink,
unsavedChangesModal.showModal,
]
);
From ba76b505b1faa2e3ca69d8eb2d822843fb8a6440 Mon Sep 17 00:00:00 2001
From: Dario Gieselaar
Date: Wed, 24 Apr 2024 11:28:59 +0200
Subject: [PATCH 104/183] [Obs AI Assistant] Instructions & Claude improvements
(#181058)
When we send over a conversation to the LLM for completion, we include a
system message. System messages are a way for the consumer (in this
case, us as developers) to control the LLM's behavior.
This system message was previously constructed by using a concept called
`ContextDefinition` - originally this was a way to define a set of
functions and behavior for a specific context, e.g. core functionality,
APM-specific functionality, platform-specific functionality etc. However
we never actually did anything with this, and much of its intended
functionality is now captured with the screen context API.
In https://github.com/elastic/kibana/issues/179736, we added user
instructions, which are ways for the user to control the Assistant's
behaviour, by appending to the system message we construct with the
registered context definitions.
With this PR, we are making several changes:
- Remove the concept of concept definitions entirely
- Replace it with `registerInstruction`, which allows the consumer to
register pieces of text that will be included in the system message.
- `registerInstruction` _also_ takes a callback. That callback receives
the available function names for that specific chat request. For
instance, when we reach the function call limit, the LLM will have no
functions to call. This allows consumers to cater their instructions to
this specific scenario, which somewhat limits the possibility of the LLM
calling a function that it is not allowed to - Claude is especially
prone to this (likely related to the fact we use simulated function
calling).
This leads to the following functional changes:
- A system message is now constructed by combining the registered
instructions (system-specific) with the knowledge base and request
instructions (user-specific)
- `GET /internal/observability_ai_assistant/functions` no longer returns
the contexts. Instead it returns the system message
- `GET /internal/observability_ai_assistant/chat/complete` now creates a
system message at the start, and overrides the system message from the
request.
- For each invocation of `chat`, it re-calculates the system message by
"materializing" the registered instructions with the available function
names for that chat invocation
Additionally, I've made some attempted improvements to simulated
function calling:
- simplified the system message
- more emphasis on generating valid JSON (e.g. I saw multiline
delimiters `"""` which are not supported)
- more emphasis on not providing any input if the function does not
accept any parameters. e.g. Claude was trying to provide entire search
requests or SPL-like query strings as input, which led to
hallucinations)
There are also some other changes, which I've commented on in the file
changes.
**Addendum: I have pushed some more changes, related to the evaluation
framework (and running it with Claude). Will comment inline in
[`9ebd207`
(#181058)](https://github.com/elastic/kibana/pull/181058/commits/9ebd207acd47c33077627356c464958240c9d446).**
---
.../get_apm_dataset_info.ts | 1 -
.../get_apm_downstream_dependencies.ts | 4 +-
.../get_apm_services_list.ts | 1 -
.../assistant_functions/get_apm_timeseries.ts | 1 -
.../apm/server/assistant_functions/index.ts | 2 +-
.../common/functions/types.ts | 9 -
.../common/types.ts | 2 +
.../utils/emit_with_concatenated_message.ts | 41 ++--
.../common/utils/extend_system_message.tsx | 22 --
.../utils/filter_function_definitions.ts | 8 +-
...throw_serialized_chat_completion_errors.ts | 14 +-
.../message_panel/esql_code_block.tsx | 64 ++++--
.../components/message_panel/message_text.tsx | 13 +-
.../public/hooks/use_chat.test.ts | 8 +-
.../public/hooks/use_chat.ts | 10 +-
.../public/index.ts | 2 -
.../public/mock.tsx | 10 +-
.../public/service/create_chat_service.ts | 17 +-
.../service/create_mock_chat_service.ts | 9 +-
.../service/get_assistant_system_message.ts | 28 ---
.../public/storybook_mock.tsx | 9 +-
.../public/types.ts | 8 +-
.../public/utils/builders.ts | 2 -
.../scripts/evaluation/evaluation.ts | 19 +-
.../scripts/evaluation/kibana_client.ts | 188 +++++++++++-------
.../evaluation/scenarios/apm/index.spec.ts | 40 ++--
.../scenarios/elasticsearch/index.spec.ts | 4 +-
.../evaluation/scenarios/esql/index.spec.ts | 25 +--
.../server/functions/context.ts | 9 -
.../server/functions/elasticsearch.ts | 3 +-
.../server/functions/execute_connector.ts | 1 -
.../functions/get_dataset_info/index.ts | 1 -
.../server/functions/index.ts | 135 ++++++-------
.../server/functions/kibana.ts | 1 -
.../server/functions/summarize.ts | 8 +-
.../server/routes/functions/route.ts | 32 ++-
.../chat_function_client/index.test.ts | 6 -
.../service/chat_function_client/index.ts | 31 ++-
.../bedrock/process_bedrock_stream.test.ts | 4 +-
.../get_system_message_instructions.ts | 23 +--
.../parse_inline_function_calls.ts | 28 +--
.../server/service/client/index.test.ts | 49 ++---
.../server/service/client/index.ts | 116 ++++++-----
.../server/service/types.ts | 18 +-
.../catch_function_limit_exceeded_error.ts | 66 ++++++
...t_system_message_from_instructions.test.ts | 78 ++++++++
.../get_system_message_from_instructions.ts | 62 ++++++
.../service/util/replace_system_message.ts | 21 ++
.../components/chat/chat_body.stories.tsx | 8 +-
.../components/chat/chat_flyout.stories.tsx | 4 +-
.../public/utils/builders.ts | 6 +-
.../public/utils/create_mock_chat_service.ts | 13 +-
.../server/functions/alerts.ts | 1 -
.../server/functions/changes/index.ts | 1 -
.../correct_common_esql_mistakes.test.ts | 19 ++
.../query/correct_common_esql_mistakes.ts | 4 +-
.../query/correct_query_with_actions.ts | 1 +
.../server/functions/query/index.ts | 74 +++++--
.../functions/query/validate_esql_query.ts | 71 +++++++
.../server/functions/visualize_esql.ts | 39 +---
.../server/rule_connector/index.test.ts | 6 +-
.../server/rule_connector/index.ts | 11 +-
62 files changed, 960 insertions(+), 551 deletions(-)
delete mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx
delete mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts
create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts
diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts
index a2821ff913f0b..e0f3f82128ddd 100644
--- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts
+++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts
@@ -20,7 +20,6 @@ export function registerGetApmDatasetInfoFunction({
registerFunction(
{
name: 'get_apm_dataset_info',
- contexts: ['core'],
visibility: FunctionVisibility.AssistantOnly,
description: `Use this function to get information about APM data.`,
parameters: {
diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts
index 419cdcd1e6dce..c1d1c511dac4d 100644
--- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts
+++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts
@@ -16,7 +16,6 @@ export function registerGetApmDownstreamDependenciesFunction({
registerFunction(
{
name: 'get_apm_downstream_dependencies',
- contexts: ['core'],
description: `Get the downstream dependencies (services or uninstrumented backends) for a
service. This allows you to map the downstream dependency name to a service, by
returning both span.destination.service.resource and service.name. Use this to
@@ -39,7 +38,8 @@ export function registerGetApmDownstreamDependenciesFunction({
},
'service.environment': {
type: 'string',
- description: 'The environment that the service is running in',
+ description:
+ 'The environment that the service is running in. Leave empty to query for all environments.',
},
start: {
type: 'string',
diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts
index 325d73b55070d..1ca34117f5f9d 100644
--- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts
+++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts
@@ -22,7 +22,6 @@ export function registerGetApmServicesListFunction({
registerFunction(
{
name: 'get_apm_services_list',
- contexts: ['apm'],
description: `Gets a list of services`,
descriptionForUser: i18n.translate(
'xpack.apm.observabilityAiAssistant.functions.registerGetApmServicesList.descriptionForUser',
diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts
index 4d5cd841ff4d1..63bdbd422c658 100644
--- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts
+++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts
@@ -122,7 +122,6 @@ export function registerGetApmTimeseriesFunction({
}: FunctionRegistrationParameters) {
registerFunction(
{
- contexts: ['core'],
name: 'get_apm_timeseries',
description: `Visualise and analyse different APM metrics, like throughput, failure rate, or latency, for any service or all services, or any or all of its dependencies, both as a timeseries and as a single statistic. A visualisation will be displayed above your reply - DO NOT attempt to display or generate an image yourself, or any other placeholder. Additionally, the function will return any changes, such as spikes, step and trend changes, or dips. You can also use it to compare data by requesting two different time ranges, or for instance two different service versions.`,
parameters,
diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts
index eebbcf021426c..ccc643cf4dc76 100644
--- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts
+++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts
@@ -48,7 +48,7 @@ export function registerAssistantFunctions({
ruleDataClient: IRuleDataClient;
plugins: APMRouteHandlerResources['plugins'];
}): RegistrationCallback {
- return async ({ resources, functions: { registerContext, registerFunction } }) => {
+ return async ({ resources, functions: { registerFunction } }) => {
const apmRouteHandlerResources: MinimalAPMRouteHandlerResources = {
context: resources.context,
request: resources.request,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts
index 12feb88bb6582..bd786e9ba3c75 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts
@@ -28,11 +28,6 @@ export type CompatibleJSONSchema = {
description?: string;
};
-export interface ContextDefinition {
- name: string;
- description: string;
-}
-
export type FunctionResponse =
| {
content?: any;
@@ -46,10 +41,6 @@ export interface FunctionDefinition void;
-
-export type ContextRegistry = Map;
export type FunctionRegistry = Map;
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts
index a51db2ebc0fc6..77e9fd33532ca 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts
@@ -94,6 +94,8 @@ export interface UserInstruction {
text: string;
}
+export type UserInstructionOrPlainText = string | UserInstruction;
+
export interface ObservabilityAIAssistantScreenContextRequest {
screenDescription?: string;
data?: Array<{
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts
index b3df0af4b2eb4..af283b78698f1 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { concat, last, mergeMap, Observable, shareReplay, withLatestFrom } from 'rxjs';
+import { concat, from, last, mergeMap, Observable, shareReplay, withLatestFrom } from 'rxjs';
import {
ChatCompletionChunkEvent,
MessageAddEvent,
@@ -16,8 +16,32 @@ import {
ConcatenatedMessage,
} from './concatenate_chat_completion_chunks';
+type ConcatenateMessageCallback = (
+ concatenatedMessage: ConcatenatedMessage
+) => Promise;
+
+function mergeWithEditedMessage(
+ originalMessage: ConcatenatedMessage,
+ chunkEvent: ChatCompletionChunkEvent,
+ callback?: ConcatenateMessageCallback
+): Observable {
+ return from(
+ (callback ? callback(originalMessage) : Promise.resolve(originalMessage)).then((message) => {
+ const next: MessageAddEvent = {
+ type: StreamingChatResponseEventType.MessageAdd as const,
+ id: chunkEvent.id,
+ message: {
+ '@timestamp': new Date().toISOString(),
+ ...message,
+ },
+ };
+ return next;
+ })
+ );
+}
+
export function emitWithConcatenatedMessage(
- callback?: (concatenatedMessage: ConcatenatedMessage) => Promise
+ callback?: ConcatenateMessageCallback
): (
source$: Observable
) => Observable {
@@ -30,17 +54,8 @@ export function emitWithConcatenatedMessage(
concatenateChatCompletionChunks(),
last(),
withLatestFrom(source$),
- mergeMap(async ([message, chunkEvent]) => {
- const next: MessageAddEvent = {
- type: StreamingChatResponseEventType.MessageAdd as const,
- id: chunkEvent.id,
- message: {
- '@timestamp': new Date().toISOString(),
- ...(callback ? await callback(message) : message),
- },
- };
-
- return next;
+ mergeMap(([message, chunkEvent]) => {
+ return mergeWithEditedMessage(message, chunkEvent, callback);
})
)
);
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx
deleted file mode 100644
index 77a7d99c763ee..0000000000000
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx
+++ /dev/null
@@ -1,22 +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 { Message } from '../types';
-
-export function extendSystemMessage(messages: Message[], extensions: string[]) {
- const [systemMessage, ...rest] = messages;
-
- const extendedSystemMessage: Message = {
- ...systemMessage,
- message: {
- ...systemMessage.message,
- content: `${systemMessage.message.content}\n\n${extensions.join('\n\n').trim()}`,
- },
- };
-
- return [extendedSystemMessage].concat(rest);
-}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts
index 63b7661ee105a..b9d41fb498056 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts
@@ -8,22 +8,18 @@
import type { FunctionDefinition } from '../functions/types';
export function filterFunctionDefinitions({
- contexts,
filter,
definitions,
}: {
- contexts?: string[];
filter?: string;
definitions: FunctionDefinition[];
}) {
- return contexts || filter
+ return filter
? definitions.filter((fn) => {
- const matchesContext =
- !contexts || fn.contexts.some((context) => contexts.includes(context));
const matchesFilter =
!filter || fn.name.includes(filter) || fn.description.includes(filter);
- return matchesContext && matchesFilter;
+ return matchesFilter;
})
: definitions;
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts
index 8e4718158280b..2c23109a1bac0 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts
@@ -5,20 +5,21 @@
* 2.0.
*/
-import { filter, Observable, tap } from 'rxjs';
+import { filter, OperatorFunction, tap } from 'rxjs';
import {
ChatCompletionError,
ChatCompletionErrorCode,
type StreamingChatResponseEvent,
StreamingChatResponseEventType,
type ChatCompletionErrorEvent,
+ BufferFlushEvent,
} from '../conversation_complete';
-export function throwSerializedChatCompletionErrors() {
- return (
- source$: Observable
- ): Observable> => {
- return source$.pipe(
+export function throwSerializedChatCompletionErrors<
+ T extends StreamingChatResponseEvent | BufferFlushEvent
+>(): OperatorFunction> {
+ return (source$) =>
+ source$.pipe(
tap((event) => {
// de-serialise error
if (event.type === StreamingChatResponseEventType.ChatCompletionError) {
@@ -33,5 +34,4 @@ export function throwSerializedChatCompletionErrors() {
event.type !== StreamingChatResponseEventType.ChatCompletionError
)
);
- };
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx
index 4fe05d323572f..24347c3aadb5e 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx
@@ -10,6 +10,7 @@ import {
EuiFlexGroup,
EuiFlexItem,
EuiPanel,
+ UseEuiTheme,
useEuiTheme,
} from '@elastic/eui';
import { css } from '@emotion/css';
@@ -17,6 +18,47 @@ import { i18n } from '@kbn/i18n';
import React from 'react';
import { ChatActionClickHandler, ChatActionClickType } from '../chat/types';
+const getCodeBlockClassName = (theme: UseEuiTheme) => css`
+ background-color: ${theme.euiTheme.colors.lightestShade};
+ .euiCodeBlock__pre {
+ margin-bottom: 0;
+ padding: ${theme.euiTheme.size.m};
+ min-block-size: 48px;
+ }
+ .euiCodeBlock__controls {
+ inset-block-start: ${theme.euiTheme.size.m};
+ inset-inline-end: ${theme.euiTheme.size.m};
+ }
+`;
+
+function CodeBlockWrapper({ children }: { children: React.ReactNode }) {
+ const theme = useEuiTheme();
+ return (
+
+ {children}
+
+ );
+}
+
+export function CodeBlock({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
+
export function EsqlCodeBlock({
value,
actionsDisabled,
@@ -26,26 +68,8 @@ export function EsqlCodeBlock({
actionsDisabled: boolean;
onActionClick: ChatActionClickHandler;
}) {
- const theme = useEuiTheme();
-
return (
-
+
@@ -87,6 +111,6 @@ export function EsqlCodeBlock({
-
+
);
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx
index 337ae9503fe65..85fa0f4609903 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx
@@ -21,7 +21,7 @@ import type { Code, InlineCode, Parent, Text } from 'mdast';
import React, { useMemo, useRef } from 'react';
import type { Node } from 'unist';
import { ChatActionClickHandler } from '../chat/types';
-import { EsqlCodeBlock } from './esql_code_block';
+import { CodeBlock, EsqlCodeBlock } from './esql_code_block';
interface Props {
content: string;
@@ -104,6 +104,9 @@ const esqlLanguagePlugin = () => {
if (node.type === 'code' && node.lang === 'esql') {
node.type = 'esql';
+ } else if (node.type === 'code') {
+ // switch to type that allows us to control rendering
+ node.type = 'codeBlock';
}
};
@@ -131,6 +134,14 @@ export function MessageText({ loading, content, onActionClick }: Props) {
processingPlugins[1][1].components = {
...components,
cursor: Cursor,
+ codeBlock: (props) => {
+ return (
+ <>
+ {props.value}
+
+ >
+ );
+ },
esql: (props) => {
return (
<>
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts
index 838feb18330e7..1f36b49175eea 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts
@@ -26,11 +26,17 @@ const mockChatService: MockedChatService = {
chat: jest.fn(),
complete: jest.fn(),
sendAnalyticsEvent: jest.fn(),
- getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]),
getFunctions: jest.fn().mockReturnValue([]),
hasFunction: jest.fn().mockReturnValue(false),
hasRenderFunction: jest.fn().mockReturnValue(true),
renderFunction: jest.fn(),
+ getSystemMessage: jest.fn().mockReturnValue({
+ '@timestamp': new Date().toISOString(),
+ message: {
+ content: 'system',
+ role: MessageRole.System,
+ },
+ }),
};
const addErrorMock = jest.fn();
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts
index 2ab4fd294dffa..7291557642669 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts
@@ -18,11 +18,7 @@ import {
isTokenLimitReachedError,
StreamingChatResponseEventType,
} from '../../common';
-import {
- getAssistantSystemMessage,
- type ObservabilityAIAssistantChatService,
- type ObservabilityAIAssistantService,
-} from '..';
+import type { ObservabilityAIAssistantChatService, ObservabilityAIAssistantService } from '..';
import { useKibana } from './use_kibana';
import { useOnce } from './use_once';
import { useUserPreferredLanguage } from './use_user_preferred_language';
@@ -75,13 +71,11 @@ function useChatWithoutContext({
persist,
}: UseChatPropsWithoutContext): UseChatResult {
const [chatState, setChatState] = useState(ChatState.Ready);
-
const systemMessage = useMemo(() => {
- return getAssistantSystemMessage({ contexts: chatService.getContexts() });
+ return chatService.getSystemMessage();
}, [chatService]);
useOnce(initialMessages);
-
useOnce(initialConversationId);
const [conversationId, setConversationId] = useState(initialConversationId);
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
index d42c96715523e..52d2511f9877f 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts
@@ -57,8 +57,6 @@ export {
VISUALIZE_ESQL_USER_INTENTIONS,
} from '../common/functions/visualize_esql';
-export { getAssistantSystemMessage } from './service/get_assistant_system_message';
-
export { isSupportedConnectorType } from '../common';
export { FunctionVisibility } from '../common';
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx
index c38307e920641..28b05433b2e1e 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx
@@ -9,7 +9,7 @@ import { noop } from 'lodash';
import React from 'react';
import { Observable, of } from 'rxjs';
import type { StreamingChatResponseEventWithoutError } from '../common/conversation_complete';
-import { ScreenContextActionDefinition } from '../common/types';
+import { MessageRole, ScreenContextActionDefinition } from '../common/types';
import type { ObservabilityAIAssistantAPIClient } from './api';
import type {
ObservabilityAIAssistantChatService,
@@ -23,7 +23,6 @@ export const mockChatService: ObservabilityAIAssistantChatService = {
sendAnalyticsEvent: noop,
chat: (options) => new Observable(),
complete: (options) => new Observable(),
- getContexts: () => [],
getFunctions: () => [buildFunctionElasticsearch(), buildFunctionServiceSummary()],
renderFunction: (name) => (
@@ -35,6 +34,13 @@ export const mockChatService: ObservabilityAIAssistantChatService = {
),
hasFunction: () => true,
hasRenderFunction: () => true,
+ getSystemMessage: () => ({
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: '',
+ },
+ }),
};
export const mockService: ObservabilityAIAssistantService = {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts
index 09c12004591aa..4995aa1b584ba 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts
@@ -22,6 +22,7 @@ import {
switchMap,
timestamp,
} from 'rxjs';
+import { Message, MessageRole } from '../../common';
import {
type BufferFlushEvent,
StreamingChatResponseEventType,
@@ -106,7 +107,7 @@ export async function createChatService({
const renderFunctionRegistry: Map
> = new Map();
- const [{ functionDefinitions, contextDefinitions }] = await Promise.all([
+ const [{ functionDefinitions, systemMessage }] = await Promise.all([
apiClient('GET /internal/observability_ai_assistant/functions', {
signal: setupAbortSignal,
}),
@@ -133,9 +134,7 @@ export async function createChatService({
const client: Pick = {
chat(name: string, { connectorId, messages, function: callFunctions = 'auto', signal }) {
return new Observable((subscriber) => {
- const contexts = ['core', 'apm'];
-
- const functions = getFunctions({ contexts }).filter((fn) => {
+ const functions = getFunctions().filter((fn) => {
const visibility = fn.visibility ?? FunctionVisibility.All;
return (
@@ -270,7 +269,6 @@ export async function createChatService({
onActionClick,
});
},
- getContexts: () => contextDefinitions,
getFunctions,
hasFunction: (name: string) => {
return functionRegistry.has(name);
@@ -278,6 +276,15 @@ export async function createChatService({
hasRenderFunction: (name: string) => {
return renderFunctionRegistry.has(name);
},
+ getSystemMessage: (): Message => {
+ return {
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: systemMessage,
+ },
+ };
+ },
...client,
};
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts
index caef109f237fc..fc26499b1f63e 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts
@@ -6,6 +6,7 @@
*/
import type { DeeplyMockedKeys } from '@kbn/utility-types-jest';
+import { MessageRole } from '../../common';
import type { ObservabilityAIAssistantChatService } from '../types';
type MockedChatService = DeeplyMockedKeys;
@@ -15,11 +16,17 @@ export const createMockChatService = (): MockedChatService => {
chat: jest.fn(),
complete: jest.fn(),
sendAnalyticsEvent: jest.fn(),
- getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]),
getFunctions: jest.fn().mockReturnValue([]),
hasFunction: jest.fn().mockReturnValue(false),
hasRenderFunction: jest.fn().mockReturnValue(true),
renderFunction: jest.fn(),
+ getSystemMessage: jest.fn().mockReturnValue({
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: 'system',
+ },
+ }),
};
return mockChatService;
};
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts
deleted file mode 100644
index b1050b8caa4a9..0000000000000
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts
+++ /dev/null
@@ -1,28 +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 { without } from 'lodash';
-import { MessageRole } from '../../common';
-import { ContextDefinition } from '../../common/functions/types';
-import type { Message } from '../../common/types';
-
-export function getAssistantSystemMessage({
- contexts,
-}: {
- contexts: ContextDefinition[];
-}): Message {
- const coreContext = contexts.find((context) => context.name === 'core')!;
-
- const otherContexts = without(contexts.concat(), coreContext);
- return {
- '@timestamp': new Date().toISOString(),
- message: {
- role: MessageRole.System as const,
- content: [coreContext, ...otherContexts].map((context) => context.description).join('\n'),
- },
- };
-}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx
index 01c2f658e360b..1d9d79838bd3a 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx
@@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n';
import { noop } from 'lodash';
import React from 'react';
import { Observable, of } from 'rxjs';
+import { MessageRole } from '.';
import type { StreamingChatResponseEventWithoutError } from '../common/conversation_complete';
import type { ObservabilityAIAssistantAPIClient } from './api';
import type { ObservabilityAIAssistantChatService, ObservabilityAIAssistantService } from './types';
@@ -17,7 +18,6 @@ export const createStorybookChatService = (): ObservabilityAIAssistantChatServic
sendAnalyticsEvent: () => {},
chat: (options) => new Observable(),
complete: (options) => new Observable(),
- getContexts: () => [],
getFunctions: () => [buildFunctionElasticsearch(), buildFunctionServiceSummary()],
renderFunction: (name) => (
@@ -29,6 +29,13 @@ export const createStorybookChatService = (): ObservabilityAIAssistantChatServic
),
hasFunction: () => true,
hasRenderFunction: () => true,
+ getSystemMessage: () => ({
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: '',
+ },
+ }),
});
export const createStorybookService = (): ObservabilityAIAssistantService => ({
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts
index 071e8e748ebf4..0567324e164dc 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts
@@ -14,11 +14,7 @@ import type {
MessageAddEvent,
StreamingChatResponseEventWithoutError,
} from '../common/conversation_complete';
-import type {
- ContextDefinition,
- FunctionDefinition,
- FunctionResponse,
-} from '../common/functions/types';
+import type { FunctionDefinition, FunctionResponse } from '../common/functions/types';
import type {
Message,
ObservabilityAIAssistantScreenContext,
@@ -60,9 +56,9 @@ export interface ObservabilityAIAssistantChatService {
signal: AbortSignal;
responseLanguage: string;
}) => Observable
;
- getContexts: () => ContextDefinition[];
getFunctions: (options?: { contexts?: string[]; filter?: string }) => FunctionDefinition[];
hasFunction: (name: string) => boolean;
+ getSystemMessage: () => Message;
hasRenderFunction: (name: string) => boolean;
renderFunction: (
name: string,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts
index a7f9df09b47a5..e233bf6da5d11 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts
@@ -10,7 +10,6 @@ import type { FunctionDefinition } from '../../common/functions/types';
export function buildFunction(): FunctionDefinition {
return {
name: 'elasticsearch',
- contexts: ['core'],
description: 'Call Elasticsearch APIs on behalf of the user',
descriptionForUser: 'Call Elasticsearch APIs on behalf of the user',
parameters: {
@@ -36,7 +35,6 @@ export const buildFunctionElasticsearch = buildFunction;
export function buildFunctionServiceSummary(): FunctionDefinition {
return {
name: 'get_service_summary',
- contexts: ['core'],
description:
'Gets a summary of a single service, including: the language, service version, deployments, infrastructure, alerting, etc. ',
descriptionForUser: 'Get a summary for a single service.',
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts
index 24797ab42269e..650a5cedceaa8 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts
@@ -125,7 +125,7 @@ function runEvaluations() {
const mocha = new Mocha({
grep: argv.grep,
- timeout: '5m',
+ timeout: '10m',
});
const chatClient = kibanaClient.createChatClient({
@@ -253,7 +253,7 @@ function runEvaluations() {
mocha.addFile(filename);
}
- return new Promise((resolve, reject) => {
+ return new Promise((resolve, reject) => {
mocha.run((failures: any) => {
if (failures) {
log.write(table.table(failedScenarios, tableConfig));
@@ -262,6 +262,21 @@ function runEvaluations() {
}
resolve();
});
+ }).finally(() => {
+ const score = results
+ .flatMap((result) => result.scores)
+ .reduce(
+ (prev, result) => {
+ prev.score += result.score;
+ prev.total += 1;
+ return prev;
+ },
+ { score: 0, total: 0 }
+ );
+
+ log.write('-------------------------------------------');
+ log.write(`Scored ${score.score} out of ${score.total}`);
+ log.write('-------------------------------------------');
});
},
{
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts
index a3385be2950ff..7604b7bca4a17 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts
@@ -5,13 +5,26 @@
* 2.0.
*/
-import axios, { AxiosInstance, AxiosResponse } from 'axios';
-import { isArray, pick, remove } from 'lodash';
-import { concatMap, filter, lastValueFrom, toArray } from 'rxjs';
-import { format, parse, UrlObject } from 'url';
import { ToolingLog } from '@kbn/tooling-log';
+import axios, { AxiosInstance, AxiosResponse, isAxiosError } from 'axios';
+import { isArray, pick, remove } from 'lodash';
import pRetry from 'p-retry';
-import { Message, MessageRole } from '../../common';
+import {
+ concatMap,
+ defer,
+ filter,
+ from,
+ lastValueFrom,
+ of,
+ OperatorFunction,
+ retry,
+ switchMap,
+ timer,
+ toArray,
+} from 'rxjs';
+import { format, parse, UrlObject } from 'url';
+import { inspect } from 'util';
+import { ChatCompletionErrorCode, isChatCompletionError, Message, MessageRole } from '../../common';
import { isSupportedConnectorType } from '../../common/connectors';
import {
BufferFlushEvent,
@@ -21,16 +34,14 @@ import {
MessageAddEvent,
StreamingChatResponseEvent,
StreamingChatResponseEventType,
- TokenCountEvent,
} from '../../common/conversation_complete';
+import { FunctionDefinition } from '../../common/functions/types';
import { ObservabilityAIAssistantScreenContext } from '../../common/types';
import { concatenateChatCompletionChunks } from '../../common/utils/concatenate_chat_completion_chunks';
import { throwSerializedChatCompletionErrors } from '../../common/utils/throw_serialized_chat_completion_errors';
import { APIReturnType, ObservabilityAIAssistantAPIClientRequestParamsOf } from '../../public';
-import { getAssistantSystemMessage } from '../../public/service/get_assistant_system_message';
import { streamIntoObservable } from '../../server/service/util/stream_into_observable';
import { EvaluationResult } from './types';
-import { FunctionDefinition } from '../../common/functions/types';
// eslint-disable-next-line spaced-comment
///
@@ -170,13 +181,13 @@ export class KibanaClient {
async function getFunctions() {
const {
- data: { functionDefinitions, contextDefinitions },
+ data: { functionDefinitions },
}: AxiosResponse> =
await that.axios.get(
that.getUrl({ pathname: '/internal/observability_ai_assistant/functions' })
);
- return { functionDefinitions, contextDefinitions };
+ return { functionDefinitions };
}
let currentTitle: string = '';
@@ -202,6 +213,61 @@ export class KibanaClient {
unregister: () => void;
}> = [];
+ function serializeAndHandleRetryableErrors<
+ T extends StreamingChatResponseEvent
+ >(): OperatorFunction> {
+ return (source$) => {
+ const processed$ = source$.pipe(
+ concatMap((buffer: Buffer) =>
+ buffer
+ .toString('utf-8')
+ .split('\n')
+ .map((line) => line.trim())
+ .filter(Boolean)
+ .map((line) => JSON.parse(line) as T | BufferFlushEvent)
+ ),
+ throwSerializedChatCompletionErrors(),
+ retry({
+ count: 1,
+ delay: (error) => {
+ that.log.error('Error in stream');
+
+ if (isAxiosError(error)) {
+ that.log.error(
+ inspect(
+ {
+ message: error.message,
+ status: error.status,
+ response: error.response?.data,
+ },
+ { depth: 10 }
+ )
+ );
+ } else {
+ that.log.error(inspect(error, { depth: 10 }));
+ }
+
+ if (
+ isChatCompletionError(error) &&
+ error.code !== ChatCompletionErrorCode.InternalError
+ ) {
+ that.log.info(`Not retrying error ${error.code}`);
+ return of();
+ }
+ that.log.info(`Retrying in 5s`);
+ return timer(5000);
+ },
+ }),
+ filter(
+ (event): event is Exclude =>
+ event.type !== StreamingChatResponseEventType.BufferFlush
+ )
+ );
+
+ return processed$;
+ };
+ }
+
async function chat(
name: string,
{
@@ -216,46 +282,37 @@ export class KibanaClient {
connectorIdOverride?: string;
}
) {
- const params: ObservabilityAIAssistantAPIClientRequestParamsOf<'POST /internal/observability_ai_assistant/chat'>['params']['body'] =
- {
- name,
- messages,
- connectorId: connectorIdOverride || connectorId,
- functions: functions.map((fn) => pick(fn, 'name', 'description', 'parameters')),
- functionCall,
- };
- const stream$ = streamIntoObservable(
- (
- await that.axios.post(
- that.getUrl({
- pathname: '/internal/observability_ai_assistant/chat',
- }),
- params,
- { responseType: 'stream', timeout: NaN }
- )
- ).data
- ).pipe(
- concatMap((buffer: Buffer) =>
- buffer
- .toString('utf-8')
- .split('\n')
- .map((line) => line.trim())
- .filter(Boolean)
- .map(
- (line) =>
- JSON.parse(line) as StreamingChatResponseEvent | BufferFlushEvent | TokenCountEvent
- )
- ),
+ that.log.info('Chat', name);
+
+ const chat$ = defer(() => {
+ that.log.debug(`Calling chat API`);
+ const params: ObservabilityAIAssistantAPIClientRequestParamsOf<'POST /internal/observability_ai_assistant/chat'>['params']['body'] =
+ {
+ name,
+ messages,
+ connectorId: connectorIdOverride || connectorId,
+ functions: functions.map((fn) => pick(fn, 'name', 'description', 'parameters')),
+ functionCall,
+ };
+
+ return that.axios.post(
+ that.getUrl({
+ pathname: '/internal/observability_ai_assistant/chat',
+ }),
+ params,
+ { responseType: 'stream', timeout: NaN }
+ );
+ }).pipe(
+ switchMap((response) => streamIntoObservable(response.data)),
+ serializeAndHandleRetryableErrors(),
filter(
- (line): line is ChatCompletionChunkEvent | ChatCompletionErrorEvent =>
- line.type === StreamingChatResponseEventType.ChatCompletionChunk ||
- line.type === StreamingChatResponseEventType.ChatCompletionError
+ (line): line is ChatCompletionChunkEvent =>
+ line.type === StreamingChatResponseEventType.ChatCompletionChunk
),
- throwSerializedChatCompletionErrors(),
concatenateChatCompletionChunks()
);
- const message = await lastValueFrom(stream$);
+ const message = await lastValueFrom(chat$);
return message.message;
}
@@ -264,9 +321,8 @@ export class KibanaClient {
return {
chat: async (message) => {
- const { functionDefinitions, contextDefinitions } = await getFunctions();
+ const { functionDefinitions } = await getFunctions();
const messages = [
- getAssistantSystemMessage({ contexts: contextDefinitions }),
...getMessages(message).map((msg) => ({
message: msg,
'@timestamp': new Date().toISOString(),
@@ -275,6 +331,7 @@ export class KibanaClient {
return chat('chat', { messages, functions: functionDefinitions });
},
complete: async (...args) => {
+ that.log.info(`Complete`);
let messagesArg: StringOrMessageList;
let conversationId: string | undefined;
let options: Options = {};
@@ -301,18 +358,17 @@ export class KibanaClient {
options = args[2];
}
- const { contextDefinitions } = await getFunctions();
const messages = [
- getAssistantSystemMessage({ contexts: contextDefinitions }),
...getMessages(messagesArg!).map((msg) => ({
message: msg,
'@timestamp': new Date().toISOString(),
})),
];
- const stream$ = streamIntoObservable(
- (
- await that.axios.post(
+ const stream$ = defer(() => {
+ that.log.debug(`Calling /chat/complete API`);
+ return from(
+ that.axios.post(
that.getUrl({
pathname: '/internal/observability_ai_assistant/chat/complete',
}),
@@ -326,28 +382,17 @@ export class KibanaClient {
},
{ responseType: 'stream', timeout: NaN }
)
- ).data
- ).pipe(
- concatMap((buffer: Buffer) =>
- buffer
- .toString('utf-8')
- .split('\n')
- .map((line) => line.trim())
- .filter(Boolean)
- .map(
- (line) =>
- JSON.parse(line) as
- | StreamingChatResponseEvent
- | BufferFlushEvent
- | TokenCountEvent
- )
- ),
+ );
+ }).pipe(
+ switchMap((response) => {
+ return streamIntoObservable(response.data);
+ }),
+ serializeAndHandleRetryableErrors(),
filter(
(event): event is MessageAddEvent | ConversationCreateEvent =>
event.type === StreamingChatResponseEventType.MessageAdd ||
event.type === StreamingChatResponseEventType.ConversationCreate
),
- throwSerializedChatCompletionErrors(),
toArray()
);
@@ -401,7 +446,9 @@ export class KibanaClient {
This is the conversation:
- ${JSON.stringify(messages)}`,
+ ${JSON.stringify(
+ messages.map((msg) => pick(msg, 'content', 'name', 'function_call', 'role'))
+ )}`,
},
},
],
@@ -437,7 +484,6 @@ export class KibanaClient {
},
required: ['criteria'],
},
- contexts: [],
description: 'Call this function to return scores for the criteria',
},
],
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts
index 24a1b21f95237..6d715dd911dbf 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts
@@ -91,33 +91,31 @@ describe('apm', () => {
);
});
- it('service summary, troughput, dependencies and errors', async () => {
- let conversation = await chatClient.complete(
- 'What is the status of the service ai-assistant-service in the test environment?'
+ it('service throughput', async () => {
+ const conversation = await chatClient.complete(
+ 'What is the average throughput per minute for the ai-assistant-service service over the past 4 hours?'
);
- conversation = await chatClient.complete(
- conversation.conversationId!,
- conversation.messages.concat({
- content:
- 'What is the average throughput for the ai-assistant-service service over the past 4 hours?',
- role: MessageRole.User,
- })
- );
+ const result = await chatClient.evaluate(conversation, [
+ 'Uses the get_apm_dataset_info function to get information about the APM data streams',
+ 'Uses the query function to generate an ES|QL query',
+ 'Generates a valid ES|QL query that returns the throughput over the past 4 hours.',
+ 'Uses the execute_query function to get the results for the generated query',
+ 'Summarizes the results for the user',
+ 'Calculates a throughput of 30 transactions per minute',
+ ]);
- conversation = await chatClient.complete(
- conversation.conversationId!,
- conversation.messages.concat({
- content: 'What are the downstream dependencies of the ai-assistant-service-front service?',
- role: MessageRole.User,
- })
+ expect(result.passed).to.be(true);
+ });
+
+ it('service dependencies', async () => {
+ const conversation = await chatClient.complete(
+ 'What are the downstream dependencies of the ai-assistant-service-front service?'
);
const result = await chatClient.evaluate(conversation, [
- 'Uses get_apm_service_summary to obtain the status of the ai-assistant-service service',
- 'Executes get_apm_timeseries to obtain the throughput of the services ai-assistant-service for the last 4 hours',
- 'Gives a summary of the throughput stats for ai-assistant-service',
- 'Provides the downstream dependencies of ai-assistant-service-front',
+ 'Uses the get_apm_downstream_dependencies function with the `service.name` parameter being "ai-assistant-service-front"',
+ 'Returns the results to the user ("ai-assistant-service-back" is the only dependency)',
]);
expect(result.passed).to.be(true);
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts
index 1dba311a64495..20f78d487a4bf 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts
@@ -61,8 +61,8 @@ describe('elasticsearch functions', () => {
const conversation = await chatClient.complete('How many documents are in the index kb?');
const result = await chatClient.evaluate(conversation, [
- 'Calls the Elasticsearch function',
- 'Finds how many documents are in that index',
+ 'Calls the `elasticsearch` function OR the `query` function',
+ 'Finds how many documents are in that index (one document)',
]);
expect(result.passed).to.be(true);
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts
index 4dfaa6df835c1..3bd6fc6a0c207 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts
@@ -34,7 +34,7 @@ async function evaluateEsqlQuery({
: []),
...(execute
? [`The query successfully executed without an error`]
- : [`The query was not executed`]),
+ : [`The query was not executed, it was only explained`]),
...criteria,
]);
@@ -154,7 +154,8 @@ describe('ES|QL query generation', () => {
question:
'From employees, I want to sort the documents by salary, and then return 10 results per page, and then see the second page',
criteria: [
- 'The assistant should mention that pagination is currently not supported in ES|QL',
+ 'The assistant should clearly mention that pagination is currently not supported in ES|QL',
+ 'IF the assistant decides to execute the query, it should correctly execute, and the Assistant should clearly mention pagination is not currently supported',
],
});
});
@@ -180,7 +181,7 @@ describe('ES|QL query generation', () => {
it('logs avg cpu', async () => {
await evaluateEsqlQuery({
question:
- 'My metric data (ECS) is in .ds-metrics-apm* Show me a query that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m. ',
+ 'My metrics data is in `metrics-*`. I want to see what a query would look like that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m.',
expected: `FROM .ds-metrics-apm*
| WHERE @timestamp >= NOW() - 15 minutes
| EVAL bucket = DATE_TRUNC(1 minute, @timestamp)
@@ -193,7 +194,7 @@ describe('ES|QL query generation', () => {
it('metricbeat avg cpu', async () => {
await evaluateEsqlQuery({
- question: `From metricbeat*, using ES|QL, show me a query to see the percentage of CPU time (system.cpu.system.pct) normalized by the number of CPU cores (system.cpu.cores), broken down by hostname`,
+ question: `Assume my data is in \`metricbeat*\`. Show me a query to see the percentage of CPU time (system.cpu.system.pct) normalized by the number of CPU cores (system.cpu.cores), broken down by host name`,
expected: `FROM metricbeat*
| EVAL system_pct_normalized = TO_DOUBLE(system.cpu.system.pct) / system.cpu.cores
| STATS avg_system_pct_normalized = AVG(system_pct_normalized) BY host.name
@@ -205,7 +206,7 @@ describe('ES|QL query generation', () => {
it('postgres avg duration dissect', async () => {
await evaluateEsqlQuery({
question:
- 'Show me an ESQL query to extract the query duration from postgres log messages in postgres-logs*, with this format "2021-01-01 00:00:00 UTC [12345]: [1-1] user=postgres,db=mydb,app=[unknown],client=127.0.0.1 LOG: duration: 123.456 ms statement: SELECT * FROM my_table", using ECS fields, and calculate the avg',
+ 'Show me an example ESQL query to extract the query duration from postgres log messages in postgres-logs*, with this format:\n `2021-01-01 00:00:00 UTC [12345]: [1-1] user=postgres,db=mydb,app=[unknown],client=127.0.0.1 LOG: duration: 123.456 ms statement: SELECT * FROM my_table`. \n Use ECS fields, and calculate the avg.',
expected: `FROM postgres-logs*
| DISSECT message "%{}: duration: %{query_duration} ms %{}"
| EVAL duration_double = TO_DOUBLE(duration)
@@ -256,14 +257,12 @@ describe('ES|QL query generation', () => {
);
});
- it('metrics avg duration', async () => {
+ // histograms are not supported yet in ES|QL
+ it.skip('metrics avg duration', async () => {
await evaluateEsqlQuery({
question:
'Execute a query for metrics-apm*, filtering on metricset.name:service_transaction and metricset.interval:1m, the average duration (via transaction.duration.histogram), in 50 buckets.',
execute: true,
- criteria: [
- 'The assistant know that transaction.duration.histogram cannot be used in ESQL and proposes an alertative solution',
- ],
});
});
@@ -274,8 +273,7 @@ describe('ES|QL query generation', () => {
expected: `FROM traces-apm*
| WHERE @timestamp >= NOW() - 24 hours
| EVAL is_failure = CASE(event.outcome == "failure", 1, 0), is_success = CASE(event.outcome == "success", 1, 0)
- | STATS total_requests = COUNT(*), avg_duration = AVG(transaction.duration.us), total_failures = SUM(is_failure), total_success = SUM(is_success) BY service.name
- | EVAL success_rate = total_success / (total_failures + total_success)
+ | STATS total_requests = COUNT(*), avg_duration = AVG(transaction.duration.us), success_rate = SUM(is_success) / COUNT(*) BY service.name
| KEEP service.name, avg_duration, success_rate, total_requests`,
execute: true,
});
@@ -328,9 +326,12 @@ describe('ES|QL query generation', () => {
expected: `FROM logs-apm*
| SORT @timestamp DESC
| EVAL formatted_date = DATE_FORMAT("hh:mm a, d 'of' MMMM yyyy", @timestamp)
- | KEEP formatted_date, log.level, message
+ | KEEP formatted_date, processor.event, message
| LIMIT 5`,
execute: true,
+ criteria: [
+ 'The Assistant uses KEEP, to make sure the AT LEAST the formatted date, processor event and message fields are displayed. More columns are fine, fewer are not',
+ ],
});
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts
index 15d34d36a4ffc..7c785392dfaf4 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts
@@ -35,7 +35,6 @@ export function registerContextFunction({
functions.registerFunction(
{
name: 'context',
- contexts: ['core'],
description:
'This function provides context as to what the user is looking at on their screen, and recalled documents from the knowledge base that matches their query',
visibility: FunctionVisibility.AssistantOnly,
@@ -68,10 +67,6 @@ export function registerContextFunction({
const { queries, categories } = args;
async function getContext() {
- const systemMessage = messages.find(
- (message) => message.message.role === MessageRole.System
- );
-
const screenDescription = compact(
screenContexts.map((context) => context.screenDescription)
).join('\n\n');
@@ -93,10 +88,6 @@ export function registerContextFunction({
return { content };
}
- if (!systemMessage) {
- throw new Error('No system message found');
- }
-
const userMessage = last(
messages.filter((message) => message.message.role === MessageRole.User)
);
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts
index 05900a2d47555..61a8b6adf3ed3 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts
@@ -14,7 +14,6 @@ export function registerElasticsearchFunction({
functions.registerFunction(
{
name: 'elasticsearch',
- contexts: ['core'],
description:
'Call Elasticsearch APIs on behalf of the user. Make sure the request body is valid for the API that you are using. Only call this function when the user has explicitly requested it.',
descriptionForUser: 'Call Elasticsearch APIs on behalf of the user',
@@ -47,7 +46,7 @@ export function registerElasticsearchFunction({
body,
});
- return { content: response };
+ return { content: { response } };
}
);
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts
index 8e668d0295ba5..0088e35a6f6af 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts
@@ -15,7 +15,6 @@ export function registerExecuteConnectorFunction({
functions.registerFunction(
{
name: 'execute_connector',
- contexts: ['core'],
description: 'Use this function when user explicitly asks to call a kibana connector.',
visibility: FunctionVisibility.AssistantOnly,
parameters: {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts
index bfd0ef43d546c..1554df10175a2 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts
@@ -16,7 +16,6 @@ export function registerGetDatasetInfoFunction({
functions.registerFunction(
{
name: 'get_dataset_info',
- contexts: ['core'],
visibility: FunctionVisibility.AssistantOnly,
description: `Use this function to get information about indices/datasets available and the fields available on them.
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts
index c24c8d9f38803..7f706046a693c 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts
@@ -34,97 +34,84 @@ export const registerFunctions: RegistrationCallback = async ({
const isServerless = !!resources.plugins.serverless;
- return client.getKnowledgeBaseStatus().then((response) => {
- const isReady = response.ready;
+ functions.registerInstruction(`You are a helpful assistant for Elastic Observability. Your goal is to help the Elastic Observability users to quickly assess what is happening in their observed systems. You can help them visualise and analyze data, investigate their systems, perform root cause analysis or identify optimisation opportunities.
- let description = dedent(
- `You are a helpful assistant for Elastic Observability. Your goal is to help the Elastic Observability users to quickly assess what is happening in their observed systems. You can help them visualise and analyze data, investigate their systems, perform root cause analysis or identify optimisation opportunities.
+ It's very important to not assume what the user is meaning. Ask them for clarification if needed.
- It's very important to not assume what the user is meaning. Ask them for clarification if needed.
+ If you are unsure about which function should be used and with what arguments, ask the user for clarification or confirmation.
- If you are unsure about which function should be used and with what arguments, ask the user for clarification or confirmation.
+ In KQL ("kqlFilter")) escaping happens with double quotes, not single quotes. Some characters that need escaping are: ':()\\\
+ /\". Always put a field value in double quotes. Best: service.name:\"opbeans-go\". Wrong: service.name:opbeans-go. This is very important!
- In KQL ("kqlFilter")) escaping happens with double quotes, not single quotes. Some characters that need escaping are: ':()\\\
- /\". Always put a field value in double quotes. Best: service.name:\"opbeans-go\". Wrong: service.name:opbeans-go. This is very important!
+ You can use Github-flavored Markdown in your responses. If a function returns an array, consider using a Markdown table to format the response.
+
+ Note that ES|QL (the Elasticsearch Query Language which is a new piped language) is the preferred query language.
- You can use Github-flavored Markdown in your responses. If a function returns an array, consider using a Markdown table to format the response.
+ DO NOT UNDER ANY CIRCUMSTANCES USE ES|QL syntax (\`service.name == "foo"\`) with "kqlFilter" (\`service.name:"foo"\`).
+
+ The user is able to change the language which they want you to reply in on the settings page of the AI Assistant for Observability, which can be found in the ${
+ isServerless ? `Project settings.` : `Stack Management app under the option AI Assistants`
+ }.
+ If the user asks how to change the language, reply in the same language the user asked in.`);
- Note that ES|QL (the Elasticsearch Query Language which is a new piped language) is the preferred query language.
+ const { ready: isReady } = await client.getKnowledgeBaseStatus();
- You MUST use the "query" function when the user wants to:
- - visualize data
- - run any arbitrary query
- - breakdown or filter ES|QL queries that are displayed on the current page
- - convert queries from another language to ES|QL
- - asks general questions about ES|QL
+ functions.registerInstruction(({ availableFunctionNames }) => {
+ const instructions: string[] = [];
- DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself.
- DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "query" function for this.
-
- DO NOT UNDER ANY CIRCUMSTANCES USE ES|QL syntax (\`service.name == "foo"\`) with "kqlFilter" (\`service.name:"foo"\`).
-
- Even if the "context" function was used before that, follow it up with the "query" function. If a query fails, do not attempt to correct it yourself. Again you should call the "query" function,
- even if it has been called before.
-
- When the "visualize_query" function has been called, a visualization has been displayed to the user. DO NOT UNDER ANY CIRCUMSTANCES follow up a "visualize_query" function call with your own visualization attempt.
- If the "execute_query" function has been called, summarize these results for the user. The user does not see a visualization in this case.
-
- You MUST use the get_dataset_info function ${
- functions.hasFunction('get_apm_dataset_info') ? 'or get_apm_dataset_info' : ''
- } function before calling the "query" or "changes" function.
-
- If a function requires an index, you MUST use the results from the dataset info functions.
+ if (availableFunctionNames.includes('get_dataset_info')) {
+ instructions.push(`You MUST use the get_dataset_info function ${
+ functions.hasFunction('get_apm_dataset_info') ? 'or get_apm_dataset_info' : ''
+ } function before calling the "query" or "changes" function.
+
+ If a function requires an index, you MUST use the results from the dataset info functions.`);
+ }
- ${
- functions.hasFunction('get_data_on_screen')
- ? `You have access to data on the screen by calling the "get_data_on_screen" function.
+ if (availableFunctionNames.includes('get_data_on_screen')) {
+ instructions.push(`You have access to data on the screen by calling the "get_data_on_screen" function.
Use it to help the user understand what they are looking at. A short summary of what they are looking at is available in the return of the "context" function.
- Data that is compact enough automatically gets included in the response for the "context" function.
- `
- : ''
- }
-
- The user is able to change the language which they want you to reply in on the settings page of the AI Assistant for Observability, which can be found in the ${
- isServerless ? `Project settings.` : `Stack Management app under the option AI Assistants`
- }.
- If the user asks how to change the language, reply in the same language the user asked in.
- `
- );
+ Data that is compact enough automatically gets included in the response for the "context" function.`);
+ }
if (isReady) {
- description += `You can use the "summarize" functions to store new information you have learned in a knowledge database. Once you have established that you did not know the answer to a question, and the user gave you this information, it's important that you create a summarisation of what you have learned and store it in the knowledge database. Don't create a new summarization if you see a similar summarization in the conversation, instead, update the existing one by re-using its ID.
- All summaries MUST be created in English, even if the conversation was carried out in a different language.
-
- Additionally, you can use the "context" function to retrieve relevant information from the knowledge database.
-
- `;
-
- registerSummarizationFunction(registrationParameters);
+ if (availableFunctionNames.includes('summarize')) {
+ instructions.push(`You can use the "summarize" functions to store new information you have learned in a knowledge database.
+ Only use this function when the user asks for it.
+ All summaries MUST be created in English, even if the conversation was carried out in a different language.`);
+ }
+
+ if (availableFunctionNames.includes('context')) {
+ instructions.push(
+ `Additionally, you can use the "context" function to retrieve relevant information from the knowledge database.`
+ );
+ }
} else {
- description += `You do not have a working memory. If the user expects you to remember the previous conversations, tell them they can set up the knowledge base.`;
+ instructions.push(
+ `You do not have a working memory. If the user expects you to remember the previous conversations, tell them they can set up the knowledge base.`
+ );
}
+ return instructions.map((instruction) => dedent(instruction));
+ });
- registerContextFunction({ ...registrationParameters, isKnowledgeBaseAvailable: isReady });
+ if (isReady) {
+ registerSummarizationFunction(registrationParameters);
+ }
- registerElasticsearchFunction(registrationParameters);
- const request = registrationParameters.resources.request;
+ registerContextFunction({ ...registrationParameters, isKnowledgeBaseAvailable: isReady });
- if ('id' in request) {
- registerKibanaFunction({
- ...registrationParameters,
- resources: {
- ...registrationParameters.resources,
- request,
- },
- });
- }
- registerGetDatasetInfoFunction(registrationParameters);
+ registerElasticsearchFunction(registrationParameters);
+ const request = registrationParameters.resources.request;
- registerExecuteConnectorFunction(registrationParameters);
-
- functions.registerContext({
- name: 'core',
- description: dedent(description),
+ if ('id' in request) {
+ registerKibanaFunction({
+ ...registrationParameters,
+ resources: {
+ ...registrationParameters.resources,
+ request,
+ },
});
- });
+ }
+ registerGetDatasetInfoFunction(registrationParameters);
+
+ registerExecuteConnectorFunction(registrationParameters);
};
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts
index 4af123a43f891..f939e3a79799b 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts
@@ -20,7 +20,6 @@ export function registerKibanaFunction({
functions.registerFunction(
{
name: 'kibana',
- contexts: ['core'],
description:
'Call Kibana APIs on behalf of the user. Only call this function when the user has explicitly requested it, and you know how to call it, for example by querying the knowledge base or having the user explain it to you. Assume that pathnames, bodies and query parameters may have changed since your knowledge cut off date.',
descriptionForUser: 'Call Kibana APIs on behalf of the user',
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts
index 39b73aefa89f6..4ff8e3ee4da91 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts
@@ -15,9 +15,11 @@ export function registerSummarizationFunction({
functions.registerFunction(
{
name: 'summarize',
- contexts: ['core'],
- description:
- "Use this function to summarize things learned from the conversation. You can score the learnings with a confidence metric, whether it is a correction on a previous learning. An embedding will be created that you can recall later with a semantic search. There is no need to ask the user for permission to store something you have learned, unless you do not feel confident. When you create this summarisation, make sure you craft it in a way that can be recalled with a semantic search later, and that it would have answered the user's original request.",
+ description: `Use this function to store facts in the knowledge database if the user requests it.
+ You can score the learnings with a confidence metric, whether it is a correction on a previous learning.
+ An embedding will be created that you can recall later with a semantic search.
+ When you create this summarisation, make sure you craft it in a way that can be recalled with a semantic
+ search later, and that it would have answered the user's original request.`,
descriptionForUser:
'This function allows the Elastic Assistant to summarize things from the conversation.',
parameters: {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts
index 9b48dc3f472d1..58c93737b6617 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts
@@ -7,9 +7,10 @@
import { notImplemented } from '@hapi/boom';
import { nonEmptyStringRt, toBooleanRt } from '@kbn/io-ts-utils';
import * as t from 'io-ts';
-import { ContextDefinition, FunctionDefinition } from '../../../common/functions/types';
+import { FunctionDefinition } from '../../../common/functions/types';
import { KnowledgeBaseEntryRole } from '../../../common/types';
import type { RecalledEntry } from '../../service/knowledge_base_service';
+import { getSystemMessageFromInstructions } from '../../service/util/get_system_message_from_instructions';
import { createObservabilityAIAssistantServerRoute } from '../create_observability_ai_assistant_server_route';
const getFunctionsRoute = createObservabilityAIAssistantServerRoute({
@@ -21,7 +22,7 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({
resources
): Promise<{
functionDefinitions: FunctionDefinition[];
- contextDefinitions: ContextDefinition[];
+ systemMessage: string;
}> => {
const { service, request } = resources;
@@ -32,16 +33,29 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({
const client = await service.getClient({ request });
- const functionClient = await service.getFunctionClient({
- signal: controller.signal,
- resources,
- client,
- screenContexts: [],
- });
+ const [functionClient, knowledgeBaseInstructions] = await Promise.all([
+ service.getFunctionClient({
+ signal: controller.signal,
+ resources,
+ client,
+ screenContexts: [],
+ }),
+ // error is caught in client
+ client.fetchKnowledgeBaseInstructions(),
+ ]);
+
+ const functionDefinitions = functionClient.getFunctions().map((fn) => fn.definition);
+
+ const availableFunctionNames = functionDefinitions.map((def) => def.name);
return {
functionDefinitions: functionClient.getFunctions().map((fn) => fn.definition),
- contextDefinitions: functionClient.getContexts(),
+ systemMessage: getSystemMessageFromInstructions({
+ registeredInstructions: functionClient.getInstructions(),
+ knowledgeBaseInstructions,
+ requestInstructions: [],
+ availableFunctionNames,
+ }),
};
},
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts
index a55098c5ec4fe..9ecbd450cba30 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts
@@ -20,14 +20,9 @@ describe('chatFunctionClient', () => {
});
client = new ChatFunctionClient([]);
- client.registerContext({
- description: '',
- name: 'core',
- });
client.registerFunction(
{
- contexts: ['core'],
description: '',
name: 'myFunction',
parameters: {
@@ -93,7 +88,6 @@ describe('chatFunctionClient', () => {
expect(functions[0]).toEqual({
definition: {
- contexts: ['core'],
description: expect.any(String),
name: 'get_data_on_screen',
parameters: expect.any(Object),
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts
index ea09024a137e7..d0b019d635c12 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts
@@ -9,16 +9,17 @@
import Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';
import dedent from 'dedent';
import { compact, keyBy } from 'lodash';
-import {
- FunctionVisibility,
- type ContextDefinition,
- type ContextRegistry,
- type FunctionResponse,
- type RegisterContextDefinition,
-} from '../../../common/functions/types';
+import { FunctionVisibility, type FunctionResponse } from '../../../common/functions/types';
import type { Message, ObservabilityAIAssistantScreenContextRequest } from '../../../common/types';
import { filterFunctionDefinitions } from '../../../common/utils/filter_function_definitions';
-import type { ChatFn, FunctionHandler, FunctionHandlerRegistry, RegisterFunction } from '../types';
+import type {
+ ChatFn,
+ FunctionHandler,
+ FunctionHandlerRegistry,
+ RegisteredInstruction,
+ RegisterFunction,
+ RegisterInstruction,
+} from '../types';
export class FunctionArgsValidationError extends Error {
constructor(public readonly errors: ErrorObject[]) {
@@ -31,7 +32,7 @@ const ajv = new Ajv({
});
export class ChatFunctionClient {
- private readonly contextRegistry: ContextRegistry = new Map();
+ private readonly instructions: RegisteredInstruction[] = [];
private readonly functionRegistry: FunctionHandlerRegistry = new Map();
private readonly validators: Map = new Map();
@@ -46,7 +47,6 @@ export class ChatFunctionClient {
this.registerFunction(
{
name: 'get_data_on_screen',
- contexts: ['core'],
description: dedent(`Get data that is on the screen:
${allData.map((data) => `${data.name}: ${data.description}`).join('\n')}
`),
@@ -89,8 +89,8 @@ export class ChatFunctionClient {
this.functionRegistry.set(definition.name, { definition, respond });
};
- registerContext: RegisterContextDefinition = (context) => {
- this.contextRegistry.set(context.name, context);
+ registerInstruction: RegisterInstruction = (instruction) => {
+ this.instructions.push(instruction);
};
validate(name: string, parameters: unknown) {
@@ -105,8 +105,8 @@ export class ChatFunctionClient {
}
}
- getContexts(): ContextDefinition[] {
- return Array.from(this.contextRegistry.values());
+ getInstructions(): RegisteredInstruction[] {
+ return this.instructions;
}
hasAction(name: string) {
@@ -114,10 +114,8 @@ export class ChatFunctionClient {
}
getFunctions({
- contexts,
filter,
}: {
- contexts?: string[];
filter?: string;
} = {}): FunctionHandler[] {
const allFunctions = Array.from(this.functionRegistry.values());
@@ -125,7 +123,6 @@ export class ChatFunctionClient {
const functionsByName = keyBy(allFunctions, (definition) => definition.definition.name);
const matchingDefinitions = filterFunctionDefinitions({
- contexts,
filter,
definitions: allFunctions.map((fn) => fn.definition),
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts
index ee426db515322..90f7d6f5ee69c 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts
@@ -173,7 +173,9 @@ describe('processBedrockStream', () => {
);
}
- await expect(fn).rejects.toThrowErrorMatchingInlineSnapshot(`"no elements in sequence"`);
+ await expect(fn).rejects.toThrowErrorMatchingInlineSnapshot(
+ `"Unexpected token 'i', \\"invalid json\\" is not valid JSON"`
+ );
});
it('successfully invokes a function without parameters', async () => {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts
index dd74052ce7bbe..dae509e169e10 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts
@@ -16,26 +16,18 @@ export function getSystemMessageInstructions({
if (functions?.length) {
return `In this environment, you have access to a set of tools you can use to answer the user's question.
- When deciding what tool to use, keep in mind that you can call other tools in successive requests, so decide what tool
- would be a good first step.
-
- You MUST only invoke a single tool, and invoke it once. Other invocations will be ignored.
- You MUST wait for the results before invoking another.
- You can call multiple tools in successive messages. This means you can chain tool calls. If any tool was used in a previous
- message, consider whether it still makes sense to follow it up with another tool call.
-
${
functions?.find((fn) => fn.name === 'context')
? `The "context" tool is ALWAYS used after a user question. Even if it was used before, your job is to answer the last user question,
even if the "context" tool was executed after that. Consider the tools you need to answer the user's question.`
: ''
}
-
- Rather than explaining how you would call a tool, just generate the JSON to call the tool. It will automatically be
- executed and returned to you.
- These results are generally not visible to the user. Treat them as if they are not,
- unless specified otherwise.
+ DO NOT call a tool when it is not listed.
+ ONLY define input that is defined in the tool properties.
+ If a tool does not have properties, leave them out.
+
+ It is EXTREMELY important that you generate valid JSON between the \`\`\`json and \`\`\` delimiters.
You may call them like this.
@@ -77,7 +69,8 @@ export function getSystemMessageInstructions({
${TOOL_USE_START}
\`\`\`json
{
- "name": "my_tool_without_parameters"
+ "name": "my_tool_without_parameters",
+ "input": {}
}
\`\`\`\
${TOOL_USE_END}
@@ -95,5 +88,5 @@ export function getSystemMessageInstructions({
`;
}
- return `No tools are available anymore. Ignore everything that was said about tools before. DO NOT UNDER ANY CIRCUMSTANCES call any tool, regardless of whether it was previously called.`;
+ return `No tools are available anymore. DO NOT UNDER ANY CIRCUMSTANCES call any tool, regardless of whether it was previously called.`;
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts
index db32eb581249c..49fc87b908112 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts
@@ -43,13 +43,15 @@ export function parseInlineFunctionCalls({ logger }: { logger: Logger }) {
function parseFunctionCall(id: string, buffer: string) {
logger.debug('Parsing function call:\n' + buffer);
- const functionCallBody = buffer
- .replace(TOOL_USE_START, '')
- .replace(TOOL_USE_END, '')
- .trim()
- .replace(/^```(json?)/, '')
- .replace(/```$/, '')
- .trim();
+ const match = buffer.match(
+ /<\|tool_use_start\|>\s*```json\n?(.*?)(\n```\s*).*<\|tool_use_end\|>/s
+ );
+
+ const functionCallBody = match?.[1];
+
+ if (!functionCallBody) {
+ throw createInternalServerError(`Invalid function call syntax`);
+ }
const parsedFunctionCall = JSON.parse(functionCallBody) as {
name?: string;
@@ -109,11 +111,13 @@ export function parseInlineFunctionCalls({ logger }: { logger: Logger }) {
if (functionCallBuffer.includes(TOOL_USE_END)) {
const [beforeEndSignal, afterEndSignal] = functionCallBuffer.split(TOOL_USE_END);
- parseFunctionCall(id, beforeEndSignal + TOOL_USE_END);
-
- functionCallBuffer = '';
-
- next(afterEndSignal);
+ try {
+ parseFunctionCall(id, beforeEndSignal + TOOL_USE_END);
+ functionCallBuffer = '';
+ next(afterEndSignal);
+ } catch (error) {
+ subscriber.error(error);
+ }
}
} else {
functionCallBuffer = '';
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts
index 0dfef2bb50643..a35e50d538bcb 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts
@@ -33,6 +33,8 @@ type ChunkDelta = CreateChatCompletionResponseChunk['choices'][number]['delta'];
type LlmSimulator = ReturnType;
+const EXPECTED_STORED_SYSTEM_MESSAGE = `system\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nYou MUST respond in the users preferred language which is: English.`;
+
const nextTick = () => {
return new Promise(process.nextTick);
};
@@ -120,6 +122,7 @@ describe('Observability AI Assistant client', () => {
hasAction: jest.fn(),
getActions: jest.fn(),
validate: jest.fn(),
+ getInstructions: jest.fn(),
} as any;
let llmSimulator: LlmSimulator;
@@ -156,6 +159,8 @@ describe('Observability AI Assistant client', () => {
knowledgeBaseServiceMock.getInstructions.mockResolvedValue([]);
+ functionClientMock.getInstructions.mockReturnValue(['system']);
+
return new ObservabilityAIAssistantClient({
actionsClient: actionsClientMock,
esClient: {
@@ -342,8 +347,8 @@ describe('Observability AI Assistant client', () => {
last_updated: expect.any(String),
token_count: {
completion: 2,
- prompt: 100,
- total: 102,
+ prompt: 156,
+ total: 158,
},
},
type: StreamingChatResponseEventType.ConversationCreate,
@@ -401,8 +406,8 @@ describe('Observability AI Assistant client', () => {
last_updated: expect.any(String),
token_count: {
completion: 8,
- prompt: 284,
- total: 292,
+ prompt: 340,
+ total: 348,
},
},
type: StreamingChatResponseEventType.ConversationCreate,
@@ -419,8 +424,8 @@ describe('Observability AI Assistant client', () => {
title: 'An auto-generated title',
token_count: {
completion: 8,
- prompt: 284,
- total: 292,
+ prompt: 340,
+ total: 348,
},
},
labels: {},
@@ -434,8 +439,7 @@ describe('Observability AI Assistant client', () => {
{
'@timestamp': expect.any(String),
message: {
- content:
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.',
+ content: EXPECTED_STORED_SYSTEM_MESSAGE,
role: MessageRole.System,
},
},
@@ -546,8 +550,8 @@ describe('Observability AI Assistant client', () => {
last_updated: expect.any(String),
token_count: {
completion: 2,
- prompt: 100,
- total: 102,
+ prompt: 156,
+ total: 158,
},
},
type: StreamingChatResponseEventType.ConversationUpdate,
@@ -565,8 +569,8 @@ describe('Observability AI Assistant client', () => {
title: 'My stored conversation',
token_count: {
completion: 2,
- prompt: 100,
- total: 102,
+ prompt: 156,
+ total: 158,
},
},
labels: {},
@@ -580,8 +584,7 @@ describe('Observability AI Assistant client', () => {
{
'@timestamp': expect.any(String),
message: {
- content:
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.',
+ content: EXPECTED_STORED_SYSTEM_MESSAGE,
role: MessageRole.System,
},
},
@@ -801,8 +804,7 @@ describe('Observability AI Assistant client', () => {
'@timestamp': expect.any(String),
message: {
role: MessageRole.System,
- content:
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.',
+ content: EXPECTED_STORED_SYSTEM_MESSAGE,
},
},
{
@@ -934,8 +936,7 @@ describe('Observability AI Assistant client', () => {
{
'@timestamp': expect.any(String),
message: {
- content:
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.',
+ content: EXPECTED_STORED_SYSTEM_MESSAGE,
role: MessageRole.System,
},
},
@@ -1307,7 +1308,7 @@ describe('Observability AI Assistant client', () => {
async function requestAlertsFunctionCall() {
const body = JSON.parse(
(actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body
- );
+ ) as OpenAI.ChatCompletionCreateParams;
let nextLlmCallPromise: Promise;
@@ -1326,7 +1327,7 @@ describe('Observability AI Assistant client', () => {
await nextTick();
- for (let i = 0; i <= maxFunctionCalls; i++) {
+ for (let i = 0; i <= maxFunctionCalls + 1; i++) {
await requestAlertsFunctionCall();
}
@@ -1337,7 +1338,7 @@ describe('Observability AI Assistant client', () => {
expect(functionClientMock.executeFunction).toHaveBeenCalledTimes(maxFunctionCalls);
});
- it('does not give the LLM the choice to call a function anymore', () => {
+ it('asks the LLM to suggest next steps', () => {
const firstBody = JSON.parse(
(actionsClientMock.execute.mock.calls[0][0].params as any).subActionParams.body
);
@@ -1345,7 +1346,7 @@ describe('Observability AI Assistant client', () => {
(actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body
);
- expect(firstBody.tools.length).toBe(1);
+ expect(firstBody.tools.length).toEqual(1);
expect(body.tools).toBeUndefined();
});
@@ -1546,7 +1547,7 @@ describe('Observability AI Assistant client', () => {
await nextTick();
expect(chatSpy.mock.calls[0][1].messages[0].message.content).toEqual(
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.'
+ EXPECTED_STORED_SYSTEM_MESSAGE
);
});
@@ -1576,7 +1577,7 @@ describe('Observability AI Assistant client', () => {
await nextTick();
expect(chatSpy.mock.calls[0][1].messages[0].message.content).toEqual(
- 'This is a system message\n\nYou MUST respond in the users preferred language which is: Orcish.'
+ EXPECTED_STORED_SYSTEM_MESSAGE.replace('English', 'Orcish')
);
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts
index 0800cf816579a..e4cb53be99754 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts
@@ -14,11 +14,12 @@ import apm from 'elastic-apm-node';
import { decode, encode } from 'gpt-tokenizer';
import { findLastIndex, last, merge, noop, omit, pick, take } from 'lodash';
import {
- catchError,
filter,
+ identity,
isObservable,
last as lastOperator,
lastValueFrom,
+ map,
Observable,
shareReplay,
tap,
@@ -26,16 +27,12 @@ import {
} from 'rxjs';
import { Readable } from 'stream';
import { v4 } from 'uuid';
-import { withTokenBudget } from '../../../common/utils/with_token_budget';
-import { extendSystemMessage } from '../../../common/utils/extend_system_message';
import { ObservabilityAIAssistantConnectorType } from '../../../common/connectors';
import {
ChatCompletionChunkEvent,
ChatCompletionErrorEvent,
createConversationNotFoundError,
- createFunctionLimitExceededError,
createTokenLimitReachedError,
- isFunctionNotFoundError,
MessageAddEvent,
StreamingChatResponseEventType,
TokenCountEvent,
@@ -65,12 +62,15 @@ import {
RecalledEntry,
} from '../knowledge_base_service';
import type { ChatFn, ObservabilityAIAssistantResourceNames } from '../types';
+import { catchFunctionLimitExceededError } from '../util/catch_function_limit_exceeded_error';
import { getAccessQuery } from '../util/get_access_query';
+import { getSystemMessageFromInstructions } from '../util/get_system_message_from_instructions';
import { rejectTokenCountEvents } from '../util/reject_token_count_events';
+import { replaceSystemMessage } from '../util/replace_system_message';
import { createBedrockClaudeAdapter } from './adapters/bedrock/bedrock_claude_adapter';
+import { failOnNonExistingFunctionCall } from './adapters/fail_on_non_existing_function_call';
import { createOpenAiAdapter } from './adapters/openai_adapter';
import { LlmApiAdapter } from './adapters/types';
-import { failOnNonExistingFunctionCall } from './adapters/fail_on_non_existing_function_call';
export class ObservabilityAIAssistantClient {
constructor(
@@ -172,21 +172,32 @@ export class ObservabilityAIAssistantClient {
kibanaPublicUrl,
simulateFunctionCalling,
isPublic = false,
+ instructions: requestInstructions = [],
} = params;
const isConversationUpdate = persist && !!params.conversationId;
const conversationId = persist ? params.conversationId || v4() : '';
const title = params.title || '';
const responseLanguage = params.responseLanguage || 'English';
- const requestInstructions = params.instructions || [];
+
+ const registeredInstructions = functionClient.getInstructions();
+
+ const knowledgeBaseInstructions: UserInstruction[] = [];
+
+ if (responseLanguage) {
+ requestInstructions.push(
+ `You MUST respond in the users preferred language which is: ${responseLanguage}.`
+ );
+ }
+
+ let storedSystemMessage: string = ''; // will be set as soon as kb instructions are loaded
if (persist && !isConversationUpdate && kibanaPublicUrl) {
- const systemMessage = messages.find(
- (message) => message.message.role === MessageRole.System
+ registeredInstructions.push(
+ `This conversation will be persisted in Kibana and available at this url: ${
+ kibanaPublicUrl + `/app/observabilityAIAssistant/conversations/${conversationId}`
+ }.`
);
- systemMessage!.message.content += `This conversation will be persisted in Kibana and available at this url: ${
- kibanaPublicUrl + `/app/observabilityAIAssistant/conversations/${conversationId}`
- }.`;
}
const tokenCountResult = {
@@ -281,17 +292,24 @@ export class ObservabilityAIAssistantClient {
return await next(nextMessages.concat(contextFunctionRequest));
} else if (isUserMessage) {
- const functions =
- numFunctionsCalled >= MAX_FUNCTION_CALLS ? [] : allFunctions.concat(allActions);
+ const functionCallsExceeded = numFunctionsCalled > MAX_FUNCTION_CALLS;
+ const functions = functionCallsExceeded ? [] : allFunctions.concat(allActions);
const spanName =
lastMessage.message.name && lastMessage.message.name !== 'context'
? 'function_response'
: 'user_message';
+ const systemMessageForChatRequest = getSystemMessageFromInstructions({
+ registeredInstructions,
+ requestInstructions,
+ knowledgeBaseInstructions,
+ availableFunctionNames: functions.map((fn) => fn.name) || [],
+ });
+
const response$ = (
await chatWithTokenCountIncrement(spanName, {
- messages: nextMessages,
+ messages: replaceSystemMessage(systemMessageForChatRequest, nextMessages),
connectorId,
signal,
functions,
@@ -299,12 +317,7 @@ export class ObservabilityAIAssistantClient {
).pipe(
emitWithConcatenatedMessage(),
shareReplay(),
- catchError((error) => {
- if (isFunctionNotFoundError(error) && functions.length === 0) {
- throw createFunctionLimitExceededError();
- }
- throw error;
- })
+ Boolean(functions.length) ? identity : catchFunctionLimitExceededError()
);
response$.subscribe({
@@ -319,6 +332,18 @@ export class ObservabilityAIAssistantClient {
(event): event is MessageAddEvent =>
event.type === StreamingChatResponseEventType.MessageAdd
),
+ // LLMs like to hallucinate parameters if the function does not define
+ // them, and it can lead to other hallicunations down the line
+ map((messageEvent) => {
+ const fnName = messageEvent.message.message.function_call?.name;
+
+ if (fnName && !functions.find((fn) => fn.name === fnName)?.parameters) {
+ const clone = { ...messageEvent };
+ clone.message.message.function_call!.arguments = '';
+ return clone;
+ }
+ return messageEvent;
+ }),
toArray()
)
);
@@ -379,7 +404,7 @@ export class ObservabilityAIAssistantClient {
chat: chatWithTokenCountIncrement,
connectorId,
name: functionCallName,
- messages: nextMessages,
+ messages: replaceSystemMessage(storedSystemMessage, nextMessages),
args: lastMessage.message.function_call!.arguments,
signal,
})
@@ -513,7 +538,7 @@ export class ObservabilityAIAssistantClient {
omit(conversation._source, 'messages'),
// update messages
- { messages: nextMessages },
+ { messages: replaceSystemMessage(storedSystemMessage, nextMessages) },
// update token count
{
@@ -528,6 +553,7 @@ export class ObservabilityAIAssistantClient {
}
)
);
+
subscriber.next({
type: StreamingChatResponseEventType.ConversationUpdate,
conversation: updatedConversation.conversation,
@@ -545,7 +571,7 @@ export class ObservabilityAIAssistantClient {
token_count: tokenCountResult,
id: conversationId,
},
- messages: nextMessages,
+ messages: replaceSystemMessage(storedSystemMessage, nextMessages),
labels: {},
numeric_labels: {},
public: isPublic,
@@ -560,14 +586,18 @@ export class ObservabilityAIAssistantClient {
subscriber.complete();
};
- this.resolveInstructions(requestInstructions)
- .then((instructions) => {
- return next(
- extendSystemMessage(messages, [
- `You MUST respond in the users preferred language which is: ${responseLanguage}.`,
- instructions,
- ])
- );
+ this.fetchKnowledgeBaseInstructions()
+ .then((loadedKnowledgeBaseInstructions) => {
+ knowledgeBaseInstructions.push(...loadedKnowledgeBaseInstructions);
+
+ storedSystemMessage = getSystemMessageFromInstructions({
+ registeredInstructions,
+ requestInstructions,
+ knowledgeBaseInstructions,
+ availableFunctionNames: allFunctions.map((fn) => fn.name),
+ });
+
+ return next(messages);
})
.catch((error) => {
if (!signal.aborted) {
@@ -972,30 +1002,12 @@ export class ObservabilityAIAssistantClient {
return this.dependencies.knowledgeBaseService.deleteEntry({ id });
};
- private resolveInstructions = async (requestInstructions: Array) => {
+ fetchKnowledgeBaseInstructions = async () => {
const knowledgeBaseInstructions = await this.dependencies.knowledgeBaseService.getInstructions(
this.dependencies.namespace,
this.dependencies.user
);
- if (requestInstructions.length + knowledgeBaseInstructions.length === 0) {
- return '';
- }
-
- const priorityInstructions = requestInstructions.map((instruction) =>
- typeof instruction === 'string' ? { doc_id: v4(), text: instruction } : instruction
- );
- const overrideIds = priorityInstructions.map((instruction) => instruction.doc_id);
- const instructions = priorityInstructions.concat(
- knowledgeBaseInstructions.filter((instruction) => !overrideIds.includes(instruction.doc_id))
- );
-
- const instructionsWithinBudget = withTokenBudget(instructions, 1000);
-
- const instructionsPrompt = `What follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n`;
-
- return `${instructionsPrompt}${instructionsWithinBudget
- .map((instruction) => instruction.text)
- .join('\n\n')}`;
+ return knowledgeBaseInstructions;
};
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts
index 90cc6f3693e41..241ecd1350c68 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts
@@ -13,7 +13,11 @@ import type {
FunctionDefinition,
FunctionResponse,
} from '../../common/functions/types';
-import type { Message, ObservabilityAIAssistantScreenContextRequest } from '../../common/types';
+import type {
+ Message,
+ ObservabilityAIAssistantScreenContextRequest,
+ UserInstructionOrPlainText,
+} from '../../common/types';
import type { ObservabilityAIAssistantRouteHandlerResources } from '../routes/types';
import { ChatFunctionClient } from './chat_function_client';
import type { ObservabilityAIAssistantClient } from './client';
@@ -43,6 +47,18 @@ export interface FunctionHandler {
respond: RespondFunction;
}
+export type RegisteredInstruction = UserInstructionOrPlainText | RegisterInstructionCallback;
+
+type RegisterInstructionCallback = ({
+ availableFunctionNames,
+}: {
+ availableFunctionNames: string[];
+}) => UserInstructionOrPlainText | UserInstructionOrPlainText[] | undefined;
+
+export type RegisterInstruction = (
+ ...instructions: Array
+) => void;
+
export type RegisterFunction = <
TParameters extends CompatibleJSONSchema = any,
TResponse extends FunctionResponse = any,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts
new file mode 100644
index 0000000000000..25eecc7e7723e
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts
@@ -0,0 +1,66 @@
+/*
+ * 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 { i18n } from '@kbn/i18n';
+import { catchError, filter, of, OperatorFunction, shareReplay, throwError } from 'rxjs';
+import {
+ ChatCompletionChunkEvent,
+ MessageAddEvent,
+ MessageRole,
+ StreamingChatResponseEventType,
+} from '../../../common';
+import { isFunctionNotFoundError } from '../../../common/conversation_complete';
+import { emitWithConcatenatedMessage } from '../../../common/utils/emit_with_concatenated_message';
+
+export function catchFunctionLimitExceededError(): OperatorFunction<
+ ChatCompletionChunkEvent | MessageAddEvent,
+ ChatCompletionChunkEvent | MessageAddEvent
+> {
+ return (source$) => {
+ const shared$ = source$.pipe(shareReplay());
+ const chunksWithoutErrors$ = shared$.pipe(
+ catchError(() => of()),
+ shareReplay()
+ );
+
+ return shared$.pipe(
+ catchError((error) => {
+ if (isFunctionNotFoundError(error)) {
+ const withInjectedErrorMessage$ = chunksWithoutErrors$.pipe(
+ filter(
+ (msg): msg is ChatCompletionChunkEvent =>
+ msg.type === StreamingChatResponseEventType.ChatCompletionChunk
+ ),
+ emitWithConcatenatedMessage(async (concatenatedMessage) => {
+ return {
+ ...concatenatedMessage,
+ message: {
+ ...concatenatedMessage.message,
+ content: `${concatenatedMessage.message.content}\n\n${i18n.translate(
+ 'xpack.observabilityAiAssistant.functionCallLimitExceeded',
+ {
+ defaultMessage:
+ '\n\nNote: the Assistant tried to call a function, even though the limit was exceeded',
+ }
+ )}`,
+ function_call: {
+ name: '',
+ arguments: '',
+ trigger: MessageRole.Assistant,
+ },
+ },
+ };
+ })
+ );
+
+ return withInjectedErrorMessage$;
+ }
+ return throwError(() => error);
+ })
+ );
+ };
+}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts
new file mode 100644
index 0000000000000..9706871a63c62
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts
@@ -0,0 +1,78 @@
+/*
+ * 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 { getSystemMessageFromInstructions } from './get_system_message_from_instructions';
+
+describe('getSystemMessageFromInstructions', () => {
+ it('handles plain instructions', () => {
+ expect(
+ getSystemMessageFromInstructions({
+ registeredInstructions: ['first', 'second'],
+ knowledgeBaseInstructions: [],
+ requestInstructions: [],
+ availableFunctionNames: [],
+ })
+ ).toEqual(`first\n\nsecond`);
+ });
+
+ it('handles callbacks', () => {
+ expect(
+ getSystemMessageFromInstructions({
+ registeredInstructions: [
+ 'first',
+ ({ availableFunctionNames }) => {
+ return availableFunctionNames[0];
+ },
+ ],
+ knowledgeBaseInstructions: [],
+ requestInstructions: [],
+ availableFunctionNames: ['myFunction'],
+ })
+ ).toEqual(`first\n\nmyFunction`);
+ });
+
+ it('overrides kb instructions with request instructions', () => {
+ expect(
+ getSystemMessageFromInstructions({
+ registeredInstructions: ['first'],
+ knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }],
+ requestInstructions: [{ doc_id: 'second', text: 'second_request' }],
+ availableFunctionNames: [],
+ })
+ ).toEqual(
+ `first\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nsecond_request`
+ );
+ });
+
+ it('includes kb instructions if there is no request instruction', () => {
+ expect(
+ getSystemMessageFromInstructions({
+ registeredInstructions: ['first'],
+ knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }],
+ requestInstructions: [],
+ availableFunctionNames: [],
+ })
+ ).toEqual(
+ `first\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nsecond_kb`
+ );
+ });
+
+ it('handles undefined values', () => {
+ expect(
+ getSystemMessageFromInstructions({
+ registeredInstructions: [
+ 'first',
+ ({ availableFunctionNames }) => {
+ return undefined;
+ },
+ ],
+ knowledgeBaseInstructions: [],
+ requestInstructions: [],
+ availableFunctionNames: [],
+ })
+ ).toEqual(`first`);
+ });
+});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts
new file mode 100644
index 0000000000000..4ea5aaecb67f9
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts
@@ -0,0 +1,62 @@
+/*
+ * 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 { compact } from 'lodash';
+import { v4 } from 'uuid';
+import { UserInstruction } from '../../../common/types';
+import { withTokenBudget } from '../../../common/utils/with_token_budget';
+import { RegisteredInstruction } from '../types';
+
+export function getSystemMessageFromInstructions({
+ registeredInstructions,
+ knowledgeBaseInstructions,
+ requestInstructions,
+ availableFunctionNames,
+}: {
+ registeredInstructions: RegisteredInstruction[];
+ knowledgeBaseInstructions: UserInstruction[];
+ requestInstructions: Array;
+ availableFunctionNames: string[];
+}): string {
+ const allRegisteredInstructions = compact(
+ registeredInstructions.flatMap((instruction) => {
+ if (typeof instruction === 'function') {
+ return instruction({ availableFunctionNames });
+ }
+ return instruction;
+ })
+ );
+
+ const requestInstructionsWithId = requestInstructions.map((instruction) =>
+ typeof instruction === 'string' ? { doc_id: v4(), text: instruction } : instruction
+ );
+
+ const requestOverrideIds = requestInstructionsWithId.map((instruction) => instruction.doc_id);
+
+ // all request instructions, and those from the KB that are not defined as a request instruction
+ const allUserInstructions = requestInstructionsWithId.concat(
+ knowledgeBaseInstructions.filter(
+ (instruction) => !requestOverrideIds.includes(instruction.doc_id)
+ )
+ );
+
+ const instructionsWithinBudget = withTokenBudget(allUserInstructions, 1000);
+
+ return [
+ ...allRegisteredInstructions,
+ ...(instructionsWithinBudget.length
+ ? [
+ `What follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:`,
+ ...instructionsWithinBudget,
+ ]
+ : []),
+ ]
+ .map((instruction) => {
+ return typeof instruction === 'string' ? instruction : instruction.text;
+ })
+ .join('\n\n');
+}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts
new file mode 100644
index 0000000000000..c8c3b251c53e5
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts
@@ -0,0 +1,21 @@
+/*
+ * 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 { Message, MessageRole } from '../../../common';
+
+export function replaceSystemMessage(systemMessage: string, messages: Message[]): Message[] {
+ return [
+ {
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: systemMessage,
+ },
+ },
+ ...messages.filter((msg) => msg.message.role !== MessageRole.System),
+ ];
+}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx
index a6768198441da..b556617726fef 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx
@@ -7,12 +7,10 @@
import { ComponentMeta, ComponentStoryObj } from '@storybook/react';
import React from 'react';
-import {
- getAssistantSystemMessage,
- MessageRole,
-} from '@kbn/observability-ai-assistant-plugin/public';
+import { MessageRole } from '@kbn/observability-ai-assistant-plugin/public';
import { KibanaReactStorybookDecorator } from '../../utils/storybook_decorator';
import { ChatBody as Component } from './chat_body';
+import { buildSystemMessage } from '../../utils/builders';
const meta: ComponentMeta = {
component: Component,
@@ -25,7 +23,7 @@ const defaultProps: ComponentStoryObj = {
args: {
initialTitle: 'My Conversation',
initialMessages: [
- getAssistantSystemMessage({ contexts: [] }),
+ buildSystemMessage(),
{
'@timestamp': new Date().toISOString(),
message: {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx
index 827c15ed44be2..edae806698662 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx
@@ -7,7 +7,7 @@
import { ComponentStory } from '@storybook/react';
import React from 'react';
-import { getAssistantSystemMessage } from '@kbn/observability-ai-assistant-plugin/public';
+import { buildSystemMessage } from '../../utils/builders';
import { KibanaReactStorybookDecorator } from '../../utils/storybook_decorator';
import { ChatFlyout as Component } from './chat_flyout';
@@ -30,7 +30,7 @@ const Template: ComponentStory = (props: ChatFlyoutProps) => {
const defaultProps: ChatFlyoutProps = {
isOpen: true,
initialTitle: 'How is this working',
- initialMessages: [getAssistantSystemMessage({ contexts: [] })],
+ initialMessages: [buildSystemMessage()],
onClose: () => {},
};
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts
index 57bdf17bd9a73..c92915897baf0 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts
@@ -12,7 +12,6 @@ import {
type Message,
MessageRole,
} from '@kbn/observability-ai-assistant-plugin/common';
-import { getAssistantSystemMessage } from '@kbn/observability-ai-assistant-plugin/public';
type BuildMessageProps = DeepPartial & {
message: {
@@ -104,7 +103,7 @@ export function buildFunctionResponseMessage(
);
}
-export function buildConversation(params?: Partial) {
+export function buildConversation(params?: Partial): Conversation {
return {
'@timestamp': '',
user: {
@@ -115,10 +114,11 @@ export function buildConversation(params?: Partial) {
title: '',
last_updated: '',
},
- messages: [getAssistantSystemMessage({ contexts: [] })],
+ messages: [buildSystemMessage()],
labels: {},
numeric_labels: {},
namespace: '',
+ public: false,
...params,
};
}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts
index 07fde4462abb6..460722c49be64 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts
@@ -6,7 +6,10 @@
*/
import type { DeeplyMockedKeys } from '@kbn/utility-types-jest';
-import type { ObservabilityAIAssistantChatService } from '@kbn/observability-ai-assistant-plugin/public';
+import {
+ MessageRole,
+ ObservabilityAIAssistantChatService,
+} from '@kbn/observability-ai-assistant-plugin/public';
type MockedChatService = DeeplyMockedKeys;
@@ -15,11 +18,17 @@ export const createMockChatService = (): MockedChatService => {
chat: jest.fn(),
complete: jest.fn(),
sendAnalyticsEvent: jest.fn(),
- getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]),
getFunctions: jest.fn().mockReturnValue([]),
hasFunction: jest.fn().mockReturnValue(false),
hasRenderFunction: jest.fn().mockReturnValue(true),
renderFunction: jest.fn(),
+ getSystemMessage: jest.fn().mockReturnValue({
+ '@timestamp': new Date().toISOString(),
+ message: {
+ role: MessageRole.System,
+ content: '',
+ },
+ }),
};
return mockChatService;
};
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts
index f287c26e6cd83..7b62ca4f5a6d2 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts
@@ -47,7 +47,6 @@ export function registerAlertsFunction({
functions.registerFunction(
{
name: 'alerts',
- contexts: ['core'],
description:
'Get alerts for Observability. Display the response in tabular format if appropriate.',
descriptionForUser: 'Get alerts for Observability',
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts
index c86fe66a4c6e2..89ebfa90cb774 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts
@@ -28,7 +28,6 @@ export function registerChangesFunction({
{
name: 'changes',
description: 'Returns change points like spikes and dips for logs and metrics.',
- contexts: ['core'],
parameters: changesFunctionParameters,
},
async ({
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts
index e9490a725a640..dd21e8d082eb9 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts
@@ -108,5 +108,24 @@ describe('correctCommonEsqlMistakes', () => {
| WHERE statement LIKE "SELECT%"
| STATS avg_duration = AVG(duration)`
);
+
+ expectQuery(
+ `FROM metrics-apm*
+ | WHERE metricset.name == "service_destination" AND @timestamp > NOW() - 24 hours
+ | EVAL total_events = span.destination.service.response_time.count
+ | EVAL total_latency = span.destination.service.response_time.sum.us
+ | EVAL is_failure = CASE(event.outcome == "failure", 1, 0)
+ | STATS
+ avg_throughput = AVG(total_events),
+ avg_latency_per_request = AVG(total_latency / total_events),
+ failure_rate = AVG(is_failure)
+ BY span.destination.service.resource`,
+ `FROM metrics-apm*
+ | WHERE metricset.name == "service_destination" AND @timestamp > NOW() - 24 hours
+ | EVAL total_events = span.destination.service.response_time.count
+ | EVAL total_latency = span.destination.service.response_time.sum.us
+ | EVAL is_failure = CASE(event.outcome == "failure", 1, 0)
+ | STATS avg_throughput = AVG(total_events), avg_latency_per_request = AVG(total_latency / total_events), failure_rate = AVG(is_failure) BY span.destination.service.resource`
+ );
});
});
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts
index 8b3f18359ce09..01d6e67fe217a 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts
@@ -104,7 +104,7 @@ function isValidColumnName(column: string) {
}
function escapeColumns(line: string) {
- const [, command, body] = line.match(/^([A-Za-z_]+)(.*)$/) ?? ['', '', ''];
+ const [, command, body] = line.match(/^([A-Za-z_]+)(.*)$/s) ?? ['', '', ''];
const escapedBody = split(body.trim(), ',')
.map((statement) => {
@@ -198,7 +198,7 @@ function escapeExpressionsInSort(sortCommand: string) {
export function correctCommonEsqlMistakes(content: string, log: Logger) {
return content.replaceAll(/```esql\n(.*?)\n```/gms, (_, query: string) => {
- const commands = splitIntoCommands(query);
+ const commands = splitIntoCommands(query.trim());
const formattedCommands: string[] = commands.map(({ name, command }, index) => {
let formattedCommand = command;
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
index 213b7e967970a..15b050c3a3897 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts
@@ -22,6 +22,7 @@ const fixedQueryByOneAction = async (queryString: string) => {
const correctText = firstAction.edits[0].text;
const problematicString = queryString.substring(range.startColumn - 1, range.endColumn - 1);
const fixedQuery = queryString.replace(problematicString, correctText);
+
return {
query: fixedQuery,
shouldRunAgain: Boolean(actions.length),
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts
index 7c33b119340aa..2cf8600d9db2f 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts
@@ -23,9 +23,10 @@ import {
} from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks';
import { emitWithConcatenatedMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/emit_with_concatenated_message';
import { createFunctionResponseMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/create_function_response_message';
+import { ESQLSearchReponse } from '@kbn/es-types';
import type { FunctionRegistrationParameters } from '..';
import { correctCommonEsqlMistakes } from './correct_common_esql_mistakes';
-import { correctQueryWithActions } from './correct_query_with_actions';
+import { validateEsqlQuery } from './validate_esql_query';
const readFile = promisify(Fs.readFile);
const readdir = promisify(Fs.readdir);
@@ -68,15 +69,30 @@ const loadEsqlDocs = once(async () => {
);
});
-export function registerQueryFunction({
- client,
- functions,
- resources,
-}: FunctionRegistrationParameters) {
+export function registerQueryFunction({ functions, resources }: FunctionRegistrationParameters) {
+ functions.registerInstruction(({ availableFunctionNames }) =>
+ availableFunctionNames.includes('query')
+ ? `You MUST use the "query" function when the user wants to:
+ - visualize data
+ - run any arbitrary query
+ - breakdown or filter ES|QL queries that are displayed on the current page
+ - convert queries from another language to ES|QL
+ - asks general questions about ES|QL
+
+ DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself.
+ DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "query" function for this.
+
+ Even if the "context" function was used before that, follow it up with the "query" function. If a query fails, do not attempt to correct it yourself. Again you should call the "query" function,
+ even if it has been called before.
+
+ When the "visualize_query" function has been called, a visualization has been displayed to the user. DO NOT UNDER ANY CIRCUMSTANCES follow up a "visualize_query" function call with your own visualization attempt.
+ If the "execute_query" function has been called, summarize these results for the user. The user does not see a visualization in this case.`
+ : undefined
+ );
+
functions.registerFunction(
{
name: 'execute_query',
- contexts: ['core'],
visibility: FunctionVisibility.UserOnly,
description:
'Display the results of an ES|QL query. ONLY use this if the "query" function has been used before or if the user or screen context has provided a query you can use.',
@@ -91,25 +107,39 @@ export function registerQueryFunction({
} as const,
},
async ({ arguments: { query } }) => {
- const response = await (
- await resources.context.core
- ).elasticsearch.client.asCurrentUser.transport.request({
+ const client = (await resources.context.core).elasticsearch.client.asCurrentUser;
+ const { error, errorMessages } = await validateEsqlQuery({
+ query,
+ client,
+ });
+
+ if (!!error) {
+ return {
+ content: {
+ message: 'The query failed to execute',
+ error,
+ errorMessages,
+ },
+ };
+ }
+ const response = (await client.transport.request({
method: 'POST',
path: '_query',
body: {
query,
version: ESQL_LATEST_VERSION,
},
- });
+ })) as ESQLSearchReponse;
- return { content: response };
+ return {
+ content: response,
+ };
}
);
functions.registerFunction(
{
name: 'query',
- contexts: ['core'],
- description: `This function generates, executes and/or visualizes a query based on the user's request. It also explains how ES|QL works and how to convert queries from one language to another. Make sure you call one of the get_dataset functions first if you need index or field names. This function takes no arguments.`,
+ description: `This function generates, executes and/or visualizes a query based on the user's request. It also explains how ES|QL works and how to convert queries from one language to another. Make sure you call one of the get_dataset functions first if you need index or field names. This function takes no input.`,
visibility: FunctionVisibility.AssistantOnly,
},
async ({ messages, connectorId, chat }, signal) => {
@@ -140,10 +170,16 @@ export function registerQueryFunction({
Extract data? Request \`DISSECT\` AND \`GROK\`.
Convert a column based on a set of conditionals? Request \`EVAL\` and \`CASE\`.
+ ONLY use ${VisualizeESQLUserIntention.executeAndReturnResults} if you are absolutely sure
+ it is executable. If one of the get_dataset_info functions were not called before, OR if
+ one of the get_dataset_info functions returned no data, opt for an explanation only and
+ mention that there is no data for these indices. You can still use
+ ${VisualizeESQLUserIntention.generateQueryOnly} and generate an example ES|QL query.
+
For determining the intention of the user, the following options are available:
${VisualizeESQLUserIntention.generateQueryOnly}: the user only wants to generate the query,
- but not run it.
+ but not run it, or they ask a general question about ES|QL.
${VisualizeESQLUserIntention.executeAndReturnResults}: the user wants to execute the query,
and have the assistant return/analyze/summarize the results. they don't need a
@@ -356,10 +392,9 @@ export function registerQueryFunction({
if (msg.message.function_call.name) {
return msg;
}
- let esqlQuery = correctCommonEsqlMistakes(msg.message.content, resources.logger).match(
- /```esql([\s\S]*?)```/
- )?.[1];
- esqlQuery = await correctQueryWithActions(esqlQuery ?? '');
+ const esqlQuery = correctCommonEsqlMistakes(msg.message.content, resources.logger)
+ .match(/```esql([\s\S]*?)```/)?.[1]
+ ?.trim();
let functionCall: ConcatenatedMessage['message']['function_call'] | undefined;
@@ -401,6 +436,7 @@ export function registerQueryFunction({
name: 'query',
content: {},
data: {
+ // add the included docs for debugging
documentation: {
intention: args.intention,
keywords,
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts
new file mode 100644
index 0000000000000..dafba4352634e
--- /dev/null
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts
@@ -0,0 +1,71 @@
+/*
+ * 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 { validateQuery } from '@kbn/esql-validation-autocomplete';
+import { getAstAndSyntaxErrors } from '@kbn/esql-ast';
+import type { ElasticsearchClient } from '@kbn/core/server';
+import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
+import { ESQLSearchReponse } from '@kbn/es-types';
+import { esFieldTypeToKibanaFieldType, type KBN_FIELD_TYPES } from '@kbn/field-types';
+
+export async function validateEsqlQuery({
+ query,
+ client,
+}: {
+ query: string;
+ client: ElasticsearchClient;
+}): Promise<{
+ columns?: Array<{
+ id: string;
+ name: string;
+ meta: {
+ type: KBN_FIELD_TYPES;
+ };
+ }>;
+ error?: Error;
+ errorMessages?: string[];
+}> {
+ const { errors } = await validateQuery(query, getAstAndSyntaxErrors, {
+ // setting this to true, we don't want to validate the index / fields existence
+ ignoreOnMissingCallbacks: true,
+ });
+
+ const errorMessages = errors?.map((error) => {
+ return 'text' in error ? error.text : error.message;
+ });
+
+ // With limit 0 I get only the columns, it is much more performant
+ const performantQuery = `${query} | limit 0`;
+
+ return client.transport
+ .request({
+ method: 'POST',
+ path: '_query',
+ body: {
+ query: performantQuery,
+ version: ESQL_LATEST_VERSION,
+ },
+ })
+ .then((res) => {
+ const esqlResponse = res as ESQLSearchReponse;
+
+ const columns =
+ esqlResponse.columns?.map(({ name, type }) => ({
+ id: name,
+ name,
+ meta: { type: esFieldTypeToKibanaFieldType(type) },
+ })) ?? [];
+
+ return { columns };
+ })
+ .catch((error) => {
+ return {
+ error,
+ errorMessages,
+ };
+ });
+}
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts
index e8b2320b917c1..1a7d64c0d324f 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts
@@ -4,14 +4,10 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import { esFieldTypeToKibanaFieldType } from '@kbn/field-types';
-import type { ESQLSearchReponse } from '@kbn/es-types';
-import { validateQuery } from '@kbn/esql-validation-autocomplete';
-import { getAstAndSyntaxErrors } from '@kbn/esql-ast';
-import { ESQL_LATEST_VERSION } from '@kbn/esql-utils';
import { VisualizeESQLUserIntention } from '@kbn/observability-ai-assistant-plugin/common/functions/visualize_esql';
import { visualizeESQLFunction } from '../../common/functions/visualize_esql';
import { FunctionRegistrationParameters } from '.';
+import { validateEsqlQuery } from './query/validate_esql_query';
const getMessageForLLM = (
intention: VisualizeESQLUserIntention,
@@ -34,37 +30,12 @@ export function registerVisualizeESQLFunction({
functions.registerFunction(
visualizeESQLFunction,
async ({ arguments: { query, intention }, connectorId, messages }, signal) => {
- // recomputing the errors here as the user might click the Visualize query button
- // and call the function manually.
- const { errors } = await validateQuery(query, getAstAndSyntaxErrors, {
- // setting this to true, we don't want to validate the index / fields existence
- ignoreOnMissingCallbacks: true,
+ const { columns, errorMessages } = await validateEsqlQuery({
+ query,
+ client: (await resources.context.core).elasticsearch.client.asCurrentUser,
});
- const errorMessages = errors?.map((error) => {
- return 'text' in error ? error.text : error.message;
- });
- // With limit 0 I get only the columns, it is much more performant
- const performantQuery = `${query} | limit 0`;
- const coreContext = await resources.context.core;
-
- const response = (await (
- await coreContext
- ).elasticsearch.client.asCurrentUser.transport.request({
- method: 'POST',
- path: '_query',
- body: {
- query: performantQuery,
- version: ESQL_LATEST_VERSION,
- },
- })) as ESQLSearchReponse;
- const columns =
- response.columns?.map(({ name, type }) => ({
- id: name,
- name,
- meta: { type: esFieldTypeToKibanaFieldType(type) },
- })) ?? [];
- const message = getMessageForLLM(intention, query, Boolean(errorMessages.length));
+ const message = getMessageForLLM(intention, query, Boolean(errorMessages?.length));
return {
data: {
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
index 7990f353062da..190ce8c9ef95c 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts
@@ -82,7 +82,8 @@ describe('observabilityAIAssistant rule_connector', () => {
service: {
getClient: async () => ({ complete: completeMock }),
getFunctionClient: async () => ({
- getContexts: () => [{ name: 'core', description: 'my_system_message' }],
+ getFunctions: () => [],
+ getInstructions: () => [],
}),
},
context: {
@@ -119,6 +120,7 @@ describe('observabilityAIAssistant rule_connector', () => {
expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' });
expect(initResources).toHaveBeenCalledTimes(1);
expect(completeMock).toHaveBeenCalledTimes(1);
+
expect(completeMock).toHaveBeenCalledWith(
expect.objectContaining({
persist: true,
@@ -130,7 +132,7 @@ describe('observabilityAIAssistant rule_connector', () => {
'@timestamp': expect.any(String),
message: {
role: MessageRole.System,
- content: 'my_system_message',
+ content: '',
},
},
{
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
index 567c326945ef8..b46fec93d1dd1 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts
@@ -32,6 +32,7 @@ import {
} from '@kbn/observability-ai-assistant-plugin/common';
import { concatenateChatCompletionChunks } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks';
import { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types';
+import { getSystemMessageFromInstructions } from '@kbn/observability-ai-assistant-plugin/server/service/util/get_system_message_from_instructions';
import { convertSchemaToOpenApi } from './convert_schema_to_open_api';
import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
@@ -171,9 +172,6 @@ async function executor(
});
});
- const systemMessage = functionClient
- .getContexts()
- .find((def) => def.name === 'core')?.description;
const backgroundInstruction = getBackgroundProcessInstruction(
execOptions.params.rule,
execOptions.params.alerts
@@ -193,7 +191,12 @@ async function executor(
'@timestamp': new Date().toISOString(),
message: {
role: MessageRole.System,
- content: systemMessage,
+ content: getSystemMessageFromInstructions({
+ availableFunctionNames: functionClient.getFunctions().map((fn) => fn.definition.name),
+ registeredInstructions: functionClient.getInstructions(),
+ knowledgeBaseInstructions: [],
+ requestInstructions: [],
+ }),
},
},
{
From 9d5abba33898de51b41d3b9397db05e66b13f16b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?=
Date: Wed, 24 Apr 2024 11:35:36 +0200
Subject: [PATCH 105/183] [Search] Move Attach Index to top (#181446)
## Summary
https://github.com/elastic/kibana/assets/1410658/de571e71-88c1-4576-94ee-55763ba8af98
### Checklist
Delete any items that are not applicable to this PR.
- [ ] 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/packages/kbn-i18n/README.md)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [ ] Any UI touched in this PR is usable by keyboard only (learn more
about [keyboard accessibility](https://webaim.org/techniques/keyboard/))
- [ ] Any UI touched in this PR does not create any new axe failures
(run axe in browser:
[FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/),
[Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))
- [ ] 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)
- [ ] This renders correctly on smaller devices using a responsive
layout. (You can test this [in your
browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))
- [ ] This was checked for [cross-browser
compatibility](https://www.elastic.co/support/matrix#matrix_browsers)
---
.../connector_configuration.tsx | 533 +++++++++---------
.../native_connector_configuration.tsx | 191 ++++---
2 files changed, 350 insertions(+), 374 deletions(-)
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx
index 09814ebab8b7c..3f05c4d305110 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx
@@ -96,307 +96,278 @@ export const ConnectorConfiguration: React.FC = () => {
-
- ) : (
- i18n.translate(
- 'xpack.enterpriseSearch.content.connectorDetail.configuration.apiKey.noApiKeyLabel',
- {
- defaultMessage:
- 'Before you can generate an API key, you need to attach an index. Scroll to the bottom of this page for instructions.',
- }
- )
- ),
- status: hasApiKey ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.generateApiKey.title',
+ {
+ <>
+
+
+ >
+ }
+ {connector.index_name && (
+ <>
+
+
-
-
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.configurationFileLink',
- { defaultMessage: 'example config file' }
- )}
-
- ),
- }}
- />
-
-
-
- {getConnectorTemplate({
- apiKeyData,
- connectorData: {
- id: connector.id,
- service_type: connector.service_type,
- },
- host: cloudContext.elasticsearchUrl,
- })}
-
-
-
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.deploymentModeLink',
- { defaultMessage: 'documentation' }
- )}
-
- ),
- }}
+ children: (
+
-
- >
- ),
- status:
- !connector.status || connector.status === ConnectorStatus.CREATED
- ? 'incomplete'
- : 'complete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.deployConnector.title',
+ ),
+ status: hasApiKey ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.generateApiKey.title',
+ {
+ defaultMessage: 'Generate an API key',
+ }
+ ),
+ titleSize: 'xs',
+ },
{
- defaultMessage: 'Set up and deploy connector',
- }
- ),
- titleSize: 'xs',
- },
- {
- children: (
-
- updateConnectorConfiguration({
- configuration,
- connectorId: connector.id,
- })
- }
- subscriptionLink={docLinks.licenseManagement}
- stackManagementLink={http.basePath.prepend(
- '/app/management/stack/license_management'
- )}
- >
- {!connector.status || connector.status === ConnectorStatus.CREATED ? (
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnectorText',
- {
- defaultMessage:
- 'Your connector has not connected to Search. Troubleshoot your configuration and refresh the page.',
- }
- )}
-
- fetchConnector({ connectorId: connector.id })}
- isLoading={isLoading}
- >
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnector.button.label',
- {
- defaultMessage: 'Recheck now',
- }
- )}
-
-
- ) : (
-
- )}
-
- {connector.status && hasAdvancedFilteringFeature && !!advancedSnippet && (
-
+
+
+
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.configurationFileLink',
+ { defaultMessage: 'example config file' }
+ )}
+
+ ),
+ }}
+ />
+
+
+
+ {getConnectorTemplate({
+ apiKeyData,
+ connectorData: {
+ id: connector.id,
+ service_type: connector.service_type,
+ },
+ host: cloudContext.elasticsearchUrl,
+ })}
+
+
+
+
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.deploymentModeLink',
+ { defaultMessage: 'documentation' }
+ )}
+
+ ),
+ }}
+ />
+
+ >
+ ),
+ status:
+ !connector.status || connector.status === ConnectorStatus.CREATED
+ ? 'incomplete'
+ : 'complete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.deployConnector.title',
+ {
+ defaultMessage: 'Set up and deploy connector',
+ }
+ ),
+ titleSize: 'xs',
+ },
+ {
+ children: (
+
+ updateConnectorConfiguration({
+ configuration,
+ connectorId: connector.id,
+ })
+ }
+ subscriptionLink={docLinks.licenseManagement}
+ stackManagementLink={http.basePath.prepend(
+ '/app/management/stack/license_management'
)}
- iconType="iInCircle"
- color="warning"
>
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.advancedSyncRulesDocs',
- { defaultMessage: 'Advanced Sync Rules' }
- )}
-
- ),
- }}
- />
-
- )}
-
- ),
- status:
- connector.status === ConnectorStatus.CONNECTED ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.enhance.title',
- {
- defaultMessage: 'Configure your connector',
- }
- ),
- titleSize: 'xs',
- },
- {
- children: (
-
- {!connector.index_name && (
-
-
-
-
+ {!connector.status || connector.status === ConnectorStatus.CREATED ? (
+
{i18n.translate(
- 'xpack.enterpriseSearch.content.connectors.configuration.connectorNoIndexCallOut.description',
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnectorText',
{
defaultMessage:
- "You won't be able to start syncing content until your connector is attached to an index.",
+ 'Your connector has not connected to Search. Troubleshoot your configuration and refresh the page.',
}
)}
-
-
-
-
- )}
-
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.scheduleSync.description',
- {
- defaultMessage:
- 'Finalize your connector by triggering a one-time sync, or setting a recurring sync to keep your data source in sync over time',
- }
+
+ fetchConnector({ connectorId: connector.id })}
+ isLoading={isLoading}
+ >
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnector.button.label',
+ {
+ defaultMessage: 'Recheck now',
+ }
+ )}
+
+
+ ) : (
+
)}
-
-
-
-
-
-
+ {connector.status && hasAdvancedFilteringFeature && !!advancedSnippet && (
+
+
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.advancedSyncRulesDocs',
+ { defaultMessage: 'Advanced Sync Rules' }
+ )}
+
+ ),
+ }}
+ />
+
+ )}
+
+ ),
+ status:
+ connector.status === ConnectorStatus.CONNECTED ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.enhance.title',
+ {
+ defaultMessage: 'Configure your connector',
+ }
+ ),
+ titleSize: 'xs',
+ },
+ {
+ children: (
+
+
+
{i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.button.label',
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.scheduleSync.description',
{
- defaultMessage: 'Set schedule and sync',
+ defaultMessage:
+ 'Finalize your connector by triggering a one-time sync, or setting a recurring sync to keep your data source in sync over time',
}
)}
-
+
-
-
+
+
+
+
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.button.label',
+ {
+ defaultMessage: 'Set schedule and sync',
+ }
+ )}
+
+
+
+
+
+
-
-
- ),
- status: connector.scheduling.full.enabled ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.title',
- {
- defaultMessage: 'Sync your data',
- }
- ),
- titleSize: 'xs',
- },
- ]}
- />
+ ),
+ status: connector.scheduling.full.enabled ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.title',
+ {
+ defaultMessage: 'Sync your data',
+ }
+ ),
+ titleSize: 'xs',
+ },
+ ]}
+ />
+ >
+ )}
- {
- <>
-
-
- >
- }
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx
index cc89fc84c2432..4660ad75fe905 100644
--- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx
@@ -142,106 +142,111 @@ export const NativeConnectorConfiguration: React.FC = () => {
>
)}
- ,
- status: hasResearched ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.researchConfigurationTitle',
+ {
+ <>
+
+
+ >
+ }
+ {connector.index_name && (
+ <>
+
+
- ),
- status: hasConfigured ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.configurationTitle',
+ children: ,
+ status: hasResearched ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.researchConfigurationTitle',
+ {
+ defaultMessage: 'Research configuration requirements',
+ }
+ ),
+ titleSize: 'xs',
+ },
{
- defaultMessage: 'Configuration',
- }
- ),
- titleSize: 'xs',
- },
- {
- children: (
-
- ),
- status: hasApiKey ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.manageApiKeyTitle',
+ children: (
+
+ ),
+ status: hasConfigured ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.configurationTitle',
+ {
+ defaultMessage: 'Configuration',
+ }
+ ),
+ titleSize: 'xs',
+ },
{
- defaultMessage: 'Manage API key',
- }
- ),
- titleSize: 'xs',
- },
- {
- children: (
-
-
-
-
-
-
-
-
-
-
- {i18n.translate(
- 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnectorAdvancedConfiguration.schedulingButtonLabel',
- {
- defaultMessage: 'Set schedule and sync',
- }
- )}
-
+ children: (
+
+ ),
+ status: hasApiKey ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.manageApiKeyTitle',
+ {
+ defaultMessage: 'Manage API key',
+ }
+ ),
+ titleSize: 'xs',
+ },
+ {
+ children: (
+
+
+
+
+
-
-
+
+
+
+
+ {i18n.translate(
+ 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnectorAdvancedConfiguration.schedulingButtonLabel',
+ {
+ defaultMessage: 'Set schedule and sync',
+ }
+ )}
+
+
+
+
+
+
-
-
- ),
- status: hasConfiguredAdvanced ? 'complete' : 'incomplete',
- title: i18n.translate(
- 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.advancedConfigurationTitle',
- {
- defaultMessage: 'Sync your data',
- }
- ),
- titleSize: 'xs',
- },
- ]}
- />
+ ),
+ status: hasConfiguredAdvanced ? 'complete' : 'incomplete',
+ title: i18n.translate(
+ 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.advancedConfigurationTitle',
+ {
+ defaultMessage: 'Sync your data',
+ }
+ ),
+ titleSize: 'xs',
+ },
+ ]}
+ />
+ >
+ )}
- {
- <>
-
-
- >
- }
From 42e6f0cd73f9d80944136925f844757a0d775dc2 Mon Sep 17 00:00:00 2001
From: Angela Chuang <6295984+angorayc@users.noreply.github.com>
Date: Wed, 24 Apr 2024 10:41:21 +0100
Subject: [PATCH 106/183] [SecuritySolution] Add "exist filter" when value
count is filtered in Lens cell action (#181151)
## Summary
Original issue and steps to reproduce:
https://github.com/elastic/kibana/issues/181120
Before:
https://github.com/elastic/kibana/assets/6295984/10c7a2ce-d814-4750-8481-8f05b55384f8
After:
https://github.com/elastic/kibana/assets/6295984/00dfbcb6-244b-4f2b-8dd4-a1f7435385cf
### Checklist
Delete any items that are not applicable to this PR.
- [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
---------
Co-authored-by: Sergi Massaneda
---
.../src/actions/filter/add_filter.ts | 41 ++++
.../src/actions/filter/create_filter.ts | 5 +-
.../src/actions/filter/filter_in.ts | 6 +-
.../src/actions/filter/filter_out.ts | 7 +-
.../src/actions/filter/index.ts | 1 +
packages/kbn-cell-actions/src/index.ts | 1 +
.../actions/filter/lens/create_action.test.ts | 190 ++++++++++++++++++
.../actions/filter/lens/create_action.ts | 40 +++-
8 files changed, 270 insertions(+), 21 deletions(-)
create mode 100644 packages/kbn-cell-actions/src/actions/filter/add_filter.ts
create mode 100644 x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts
diff --git a/packages/kbn-cell-actions/src/actions/filter/add_filter.ts b/packages/kbn-cell-actions/src/actions/filter/add_filter.ts
new file mode 100644
index 0000000000000..484a2bd9792cb
--- /dev/null
+++ b/packages/kbn-cell-actions/src/actions/filter/add_filter.ts
@@ -0,0 +1,41 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type { FilterManager } from '@kbn/data-plugin/public';
+import type { DefaultActionsSupportedValue } from '../types';
+import { createExistsFilter, createFilter } from './create_filter';
+
+interface AddFilterParams {
+ filterManager: FilterManager;
+ key: string;
+ value: DefaultActionsSupportedValue;
+ negate: boolean;
+ dataViewId?: string;
+}
+
+export const addFilter = ({ filterManager, key, value, negate, dataViewId }: AddFilterParams) => {
+ filterManager.addFilters(createFilter({ key, value, negate, dataViewId }));
+};
+
+interface AddExistsFilterParams {
+ filterManager: FilterManager;
+ key: string;
+ negate: boolean;
+ dataViewId?: string;
+}
+export const addExistsFilter = ({
+ filterManager,
+ key,
+ negate,
+ dataViewId,
+}: AddExistsFilterParams) => {
+ filterManager.addFilters(createExistsFilter({ key, negate, dataViewId }));
+};
+
+export const isEmptyFilterValue = (value: Array) =>
+ value.length === 0 || value.every((v) => v === '');
diff --git a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts
index fe10ab7df43d6..a34786ebb693a 100644
--- a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts
+++ b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts
@@ -15,10 +15,7 @@ import {
} from '@kbn/es-query';
import { DefaultActionsSupportedValue } from '../types';
-export const isEmptyFilterValue = (value: Array) =>
- value.length === 0 || value.every((v) => v === '');
-
-const createExistsFilter = ({
+export const createExistsFilter = ({
key,
negate,
dataViewId,
diff --git a/packages/kbn-cell-actions/src/actions/filter/filter_in.ts b/packages/kbn-cell-actions/src/actions/filter/filter_in.ts
index 8dd4487bfd944..9e88b97208ba7 100644
--- a/packages/kbn-cell-actions/src/actions/filter/filter_in.ts
+++ b/packages/kbn-cell-actions/src/actions/filter/filter_in.ts
@@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n';
import type { FilterManager, KBN_FIELD_TYPES } from '@kbn/data-plugin/public';
import { NotificationsStart } from '@kbn/core-notifications-browser';
-import { createFilter, isEmptyFilterValue } from './create_filter';
+import { addFilter, isEmptyFilterValue } from './add_filter';
import { FILTER_CELL_ACTION_TYPE } from '../../constants';
import { createCellActionFactory } from '../factory';
import {
@@ -77,12 +77,12 @@ export const addFilterIn = ({
dataViewId?: string;
}) => {
if (filterManager != null) {
- const filter = createFilter({
+ addFilter({
+ filterManager,
key: fieldName,
value,
negate: isEmptyFilterValue(value),
dataViewId,
});
- filterManager.addFilters(filter);
}
};
diff --git a/packages/kbn-cell-actions/src/actions/filter/filter_out.ts b/packages/kbn-cell-actions/src/actions/filter/filter_out.ts
index e20d7c267b910..56cea2541143e 100644
--- a/packages/kbn-cell-actions/src/actions/filter/filter_out.ts
+++ b/packages/kbn-cell-actions/src/actions/filter/filter_out.ts
@@ -8,7 +8,8 @@
import { i18n } from '@kbn/i18n';
import type { FilterManager, KBN_FIELD_TYPES } from '@kbn/data-plugin/public';
import { NotificationsStart } from '@kbn/core-notifications-browser';
-import { createFilter, isEmptyFilterValue } from './create_filter';
+import { addFilter, isEmptyFilterValue } from './add_filter';
+
import { FILTER_CELL_ACTION_TYPE } from '../../constants';
import { createCellActionFactory } from '../factory';
import {
@@ -81,12 +82,12 @@ export const addFilterOut = ({
dataViewId?: string;
}) => {
if (filterManager != null) {
- const filter = createFilter({
+ addFilter({
+ filterManager,
key: fieldName,
value,
negate: !isEmptyFilterValue(value),
dataViewId,
});
- filterManager.addFilters(filter);
}
};
diff --git a/packages/kbn-cell-actions/src/actions/filter/index.ts b/packages/kbn-cell-actions/src/actions/filter/index.ts
index 19a32c05db6cb..61908d4700dce 100644
--- a/packages/kbn-cell-actions/src/actions/filter/index.ts
+++ b/packages/kbn-cell-actions/src/actions/filter/index.ts
@@ -8,3 +8,4 @@
export { createFilterInActionFactory, addFilterIn } from './filter_in';
export { createFilterOutActionFactory, addFilterOut } from './filter_out';
+export { addExistsFilter } from './add_filter';
diff --git a/packages/kbn-cell-actions/src/index.ts b/packages/kbn-cell-actions/src/index.ts
index 4e478baec441f..4b7dde4cdcaf1 100644
--- a/packages/kbn-cell-actions/src/index.ts
+++ b/packages/kbn-cell-actions/src/index.ts
@@ -34,6 +34,7 @@ export {
createFilterOutActionFactory,
addFilterIn,
addFilterOut,
+ addExistsFilter,
} from './actions/filter';
// Action factory
diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts
new file mode 100644
index 0000000000000..1efbbc9960146
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts
@@ -0,0 +1,190 @@
+/*
+ * 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 { addExistsFilter, addFilterIn, addFilterOut } from '@kbn/cell-actions';
+import { of } from 'rxjs';
+import type { CellValueContext } from '@kbn/embeddable-plugin/public';
+import type { CreateFilterLensActionParams } from './create_action';
+import { createFilterLensAction } from './create_action';
+import type { Trigger } from '@kbn/ui-actions-plugin/public';
+
+jest.mock('@kbn/cell-actions', () => ({
+ addFilterIn: jest.fn(),
+ addFilterOut: jest.fn(),
+ addExistsFilter: jest.fn(),
+}));
+
+jest.mock('../../../timelines/store', () => ({
+ timelineSelectors: {
+ getTimelineByIdSelector: jest.fn().mockReturnValue(() => ({})),
+ },
+}));
+
+describe('createFilterLensAction', () => {
+ const mockServices = {
+ timelineFilterManager: 'mockTimelineFilterManager',
+ data: { query: { filterManager: 'mockFilterManager' } },
+ application: { currentAppId$: of('appId') },
+ topValuesPopover: {
+ closePopover: jest.fn(),
+ },
+ notifications: {
+ toasts: {
+ addWarning: jest.fn(),
+ },
+ },
+ };
+ const mockStore = {
+ getState: jest.fn(),
+ };
+
+ const mockUserCountData = [
+ {
+ columnMeta: {
+ field: 'user.count',
+ sourceParams: {
+ type: 'value_count',
+ indexPatternId: 'indexPatternId',
+ },
+ },
+ value: [1],
+ },
+ ] as unknown as CellValueContext['data'];
+
+ const mockUserNameData = [
+ {
+ columnMeta: {
+ field: 'user.name',
+ sourceParams: {
+ type: 'string',
+ indexPatternId: 'indexPatternId',
+ },
+ },
+ value: 'elastic',
+ },
+ ] as unknown as CellValueContext['data'];
+
+ const mockTrigger = {
+ id: 'triggerId',
+ title: 'triggerTitle',
+ description: 'triggerDescription',
+ } as Trigger;
+
+ const params = {
+ id: 'embeddable_filterIn',
+ order: 0,
+ store: mockStore,
+ services: mockServices,
+ } as unknown as CreateFilterLensActionParams;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should create a "filter In" action with the field value', async () => {
+ const { execute } = createFilterLensAction(params);
+ await execute({
+ data: mockUserNameData,
+ trigger: mockTrigger,
+ });
+ expect(addFilterIn).toHaveBeenCalledWith({
+ filterManager: 'mockFilterManager',
+ fieldName: 'user.name',
+ value: ['elastic'],
+ dataViewId: 'indexPatternId',
+ });
+ expect(addFilterOut).not.toHaveBeenCalled();
+ });
+
+ it('should create a "filter Out" action with the field value', async () => {
+ const testParams = {
+ ...params,
+ id: 'embeddable_filterOut',
+ negate: true,
+ };
+ const { execute } = createFilterLensAction(testParams);
+ await execute({
+ data: mockUserNameData,
+ trigger: mockTrigger,
+ });
+ expect(addFilterIn).not.toHaveBeenCalled();
+ expect(addFilterOut).toHaveBeenCalledWith({
+ filterManager: 'mockFilterManager',
+ fieldName: 'user.name',
+ value: ['elastic'],
+ dataViewId: 'indexPatternId',
+ });
+ });
+
+ it('should create an "exists" filter when value type equals "value_count"', async () => {
+ const { execute } = createFilterLensAction(params);
+ await execute({
+ data: mockUserCountData,
+ trigger: mockTrigger,
+ });
+ expect(addExistsFilter).toHaveBeenCalledWith({
+ filterManager: 'mockFilterManager',
+ key: 'user.count',
+ negate: false,
+ dataViewId: 'indexPatternId',
+ });
+ });
+
+ it('should create an "Not exists" filter when value type equals "value_count"', async () => {
+ const testParams = {
+ ...params,
+ negate: true,
+ };
+ const { execute } = createFilterLensAction(testParams);
+ await execute({
+ data: mockUserCountData,
+ trigger: mockTrigger,
+ });
+ expect(addExistsFilter).toHaveBeenCalledWith({
+ filterManager: 'mockFilterManager',
+ key: 'user.count',
+ negate: true,
+ dataViewId: 'indexPatternId',
+ });
+ expect(addFilterIn).not.toHaveBeenCalled();
+ });
+
+ it('should show a warning toast when the value is not supported', async () => {
+ const { execute } = createFilterLensAction(params);
+ await execute({
+ data: [
+ {
+ columnMeta: {
+ field: 'user.name',
+ sourceParams: {
+ type: 'string',
+ indexPatternId: 'indexPatternId',
+ },
+ },
+ value: [[1], '1', 'foo'],
+ },
+ ] as unknown as CellValueContext['data'],
+ trigger: mockTrigger,
+ });
+ expect(mockServices.notifications.toasts.addWarning).toHaveBeenCalled();
+ });
+
+ it('should not create a filter when the field is missing', async () => {
+ const { execute } = createFilterLensAction(params);
+ await execute({
+ data: [
+ {
+ columnMeta: {},
+ value: 'elastic',
+ },
+ ] as unknown as CellValueContext['data'],
+ trigger: mockTrigger,
+ });
+ expect(addFilterIn).not.toHaveBeenCalled();
+ expect(addFilterOut).not.toHaveBeenCalled();
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts
index e0da4447506cf..ecfe71bc3a112 100644
--- a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts
+++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { addFilterIn, addFilterOut } from '@kbn/cell-actions';
+import { addExistsFilter, addFilterIn, addFilterOut } from '@kbn/cell-actions';
import {
isValueSupportedByDefaultActions,
valueToArray,
@@ -31,19 +31,21 @@ function isDataColumnsValid(data?: CellValueContext['data']): boolean {
);
}
+export interface CreateFilterLensActionParams {
+ id: string;
+ order: number;
+ store: SecurityAppStore;
+ services: StartServices;
+ negate?: boolean;
+}
+
export const createFilterLensAction = ({
id,
order,
store,
services,
negate,
-}: {
- id: string;
- order: number;
- store: SecurityAppStore;
- services: StartServices;
- negate?: boolean;
-}) => {
+}: CreateFilterLensActionParams) => {
const { application, notifications, data: dataService, topValuesPopover } = services;
let currentAppId: string | undefined;
@@ -72,6 +74,7 @@ export const createFilterLensAction = ({
isInSecurityApp(currentAppId),
execute: async ({ data }) => {
const field = data[0]?.columnMeta?.field;
+ const isCounter = data[0]?.columnMeta?.sourceParams?.type === 'value_count';
const rawValue = data[0]?.value;
const mayBeDataViewId = data[0]?.columnMeta?.sourceParams?.indexPatternId;
const dataViewId = typeof mayBeDataViewId === 'string' ? mayBeDataViewId : undefined;
@@ -87,15 +90,30 @@ export const createFilterLensAction = ({
topValuesPopover.closePopover();
- const addFilter = negate === true ? addFilterOut : addFilterIn;
-
const timeline = getTimelineById(store.getState(), TimelineId.active);
// timeline is open add the filter to timeline, otherwise add filter to global filters
const filterManager = timeline?.show
? services.timelineFilterManager
: dataService.query.filterManager;
- addFilter({ filterManager, fieldName: field, value, dataViewId });
+ // If value type is value_count, we want to filter an `Exists` filter instead of a `Term` filter
+ if (isCounter) {
+ addExistsFilter({
+ filterManager,
+ key: field,
+ negate: !!negate,
+ dataViewId,
+ });
+ return;
+ }
+
+ const addFilter = negate === true ? addFilterOut : addFilterIn;
+ addFilter({
+ filterManager,
+ fieldName: field,
+ value,
+ dataViewId,
+ });
},
});
};
From 214833af0bc45dad269529a1904cfbb934da945e Mon Sep 17 00:00:00 2001
From: Dario Gieselaar
Date: Wed, 24 Apr 2024 11:51:58 +0200
Subject: [PATCH 107/183] [Obs AI Assistant] Hide unavailable connectors
(#181455)
Hides unavailable connectors (e.g. due to license mismatches).
---
.../server/routes/connectors/route.ts | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts
index 79134b9fef8d0..24d63d3f7fa06 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts
@@ -20,9 +20,24 @@ const listConnectorsRoute = createObservabilityAIAssistantServerRoute({
await plugins.actions.start()
).getActionsClientWithRequest(request);
- const connectors = await actionsClient.getAll();
+ const [availableTypes, connectors] = await Promise.all([
+ actionsClient
+ .listTypes({
+ includeSystemActionTypes: false,
+ })
+ .then((types) =>
+ types
+ .filter((type) => type.enabled && type.enabledInLicense && type.enabledInConfig)
+ .map((type) => type.id)
+ ),
+ actionsClient.getAll(),
+ ]);
- return connectors.filter((connector) => isSupportedConnectorType(connector.actionTypeId));
+ return connectors.filter(
+ (connector) =>
+ availableTypes.includes(connector.actionTypeId) &&
+ isSupportedConnectorType(connector.actionTypeId)
+ );
},
});
From c17ba8cd1078a2885fd8baa7ab8c9faaf6e39671 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cau=C3=AA=20Marcondes?=
<55978943+cauemarcondes@users.noreply.github.com>
Date: Wed, 24 Apr 2024 11:08:26 +0100
Subject: [PATCH 108/183] [Profiling] Adding "estimated value" label on sample
columns (#181449)
The service samples and transaction samples are estimated values, so I'm
adding a tooltip to make it clear for users.
---
.../apm_transactions.tsx | 42 +++++++++++++++----
1 file changed, 34 insertions(+), 8 deletions(-)
diff --git a/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx b/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx
index 9d5986deca9b2..54ce9ebc9eddb 100644
--- a/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx
+++ b/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx
@@ -12,7 +12,9 @@ import {
EuiFieldSearch,
EuiFlexGroup,
EuiFlexItem,
+ EuiIcon,
EuiLink,
+ EuiToolTip,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { isEmpty } from 'lodash';
@@ -78,6 +80,22 @@ const findServicesAndTransactions = (
};
};
+function EstimatedLabel({ label }: { label: string }) {
+ return (
+
+ <>
+ {label}
+ >
+
+ );
+}
+
+const SAMPLES_COLUMN_WIDTH = '152px';
+
export function APMTransactions({ functionName, serviceNames }: Props) {
const {
query: { rangeFrom, rangeTo },
@@ -199,11 +217,15 @@ export function APMTransactions({ functionName, serviceNames }: Props) {
},
{
field: 'serviceSamples',
- name: i18n.translate('xpack.profiling.apmTransactions.columns.serviceSamplesName', {
- defaultMessage: 'Service Samples',
- }),
- width: '150px',
+ width: SAMPLES_COLUMN_WIDTH,
sortable: true,
+ name: (
+
+ ),
render(_, { serviceSamples }) {
return asNumber(serviceSamples);
},
@@ -239,10 +261,14 @@ export function APMTransactions({ functionName, serviceNames }: Props) {
},
{
field: 'transactionSamples',
- name: i18n.translate('xpack.profiling.apmTransactions.columns.transactionSamples', {
- defaultMessage: 'Transaction Samples',
- }),
- width: '150px',
+ name: (
+
+ ),
+ width: SAMPLES_COLUMN_WIDTH,
render(_, { transactionSamples }) {
if (isLoadingTransactions) {
return '--';
From 67a2eb54c98678b546b08bf6f810f44bd31e1055 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?=
Date: Wed, 24 Apr 2024 12:36:41 +0200
Subject: [PATCH 109/183] [Obs AI Assistant] Hide insight components when
license is incorrect or there are no configured connectors (#181519)
Closes https://github.com/elastic/kibana/issues/181435
---
.../public/components/insight/insight.tsx | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx
index fb06d77efee8b..6c96287a28132 100644
--- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx
+++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx
@@ -16,8 +16,10 @@ import {
EuiCallOut,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
-import { cloneDeep, isArray, last, once } from 'lodash';
+import { cloneDeep, isArray, isEmpty, last, once } from 'lodash';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import useObservable from 'react-use/lib/useObservable';
+import { ILicense } from '@kbn/licensing-plugin/public';
import { MessageRole, type Message } from '../../../common/types';
import { ObservabilityAIAssistantChatServiceContext } from '../../context/observability_ai_assistant_chat_service_context';
import { useAbortableAsync } from '../../hooks/use_abortable_async';
@@ -290,9 +292,20 @@ export function Insight({
};
const {
- services: { http },
+ services: {
+ http,
+ plugins: {
+ start: { licensing },
+ },
+ },
} = useKibana();
+ const license = useObservable(licensing.license$);
+ const hasEnterpriseLicense = license?.hasAtLeast('enterprise');
+ if (isEmpty(connectors.connectors) || !hasEnterpriseLicense) {
+ return null;
+ }
+
let children: React.ReactNode = null;
if (
From e1ec9ee17e89e1299778cc639f7f4ea085471861 Mon Sep 17 00:00:00 2001
From: Abdul Wahab Zahid
Date: Wed, 24 Apr 2024 13:20:31 +0200
Subject: [PATCH 110/183] [Dataset quality] Flyout Summary section (#179479)
Closes https://github.com/elastic/kibana/issues/170492
## Summary
The PR Implements the Dataset Quality Flyout summary KPIs: "Docs count",
"Size", "Services", "Hosts" and "Degraded docs".
|Stateful|Serverless|
|:---:|:---|
|||
"Show all" links for "Services" and "Hosts" metrics depend on some
development in APM and Infra plugins and therefore will be implemented
in a follow up issue.
Note that "Size" metric is excluded on Serverless as the endpoint uses
ES's `_stats` endpoint which is not available on Serverless (at the time
of creation of this PR). The code contains some conditions and cases to
tackle this, which should be considered as a temporary measure. All of
the code related to these changes should either be removed or modified
once there's a way to calculate the size of an index/dataStream on
Serverless (see [related
](https://github.com/elastic/kibana/issues/178954)). The following
changes are made in particular:
- Size UI component on the Flyout will be hidden on Serverless
- `dataset_quality/data_streams/{dataStream}/details` endpoint will
return `NaN` for size on Serverless
- Unit, integration and end-to-end tests on Serverless handle
"sizeBytes" property accordingly
---
.github/CODEOWNERS | 1 +
.../dataset_quality/common/api_types.ts | 14 +-
.../dataset_quality/common/constants.ts | 7 +
.../common/data_streams_stats/types.ts | 13 +-
.../dataset_quality/common/translations.ts | 27 ++
.../summary_panel/estimated_data.tsx | 5 +-
.../dataset_quality/table/columns.tsx | 5 +-
.../table/degraded_docs_percentage_link.tsx | 3 +-
.../components/flyout/dataset_summary.tsx | 19 +-
.../degraded_docs_trend/degraded_docs.tsx | 166 ++-----
.../degraded_docs_chart.tsx | 51 +-
.../degraded_docs_trend/lens_attributes.ts | 2 +-
.../public/components/flyout/fields_list.tsx | 13 +-
.../public/components/flyout/flyout.tsx | 71 ++-
.../flyout/flyout_summary/flyout_summary.tsx | 104 +++++
.../flyout_summary/flyout_summary_header.tsx | 78 ++++
.../flyout_summary_kpi_item.tsx | 100 ++++
.../flyout_summary/flyout_summary_kpis.tsx | 77 +++
.../flyout_summary/get_summary_kpis.test.ts | 156 +++++++
.../flyout/flyout_summary/get_summary_kpis.ts | 137 ++++++
.../flyout/integration_actions_menu.tsx | 24 +-
.../components/flyout/integration_summary.tsx | 14 +-
.../hooks/use_dataset_quality_flyout.tsx | 27 +-
.../hooks/use_dataset_quality_table.tsx | 8 +-
.../public/hooks/use_degraded_docs_chart.tsx | 58 ++-
.../public/hooks/use_link_to_logs_explorer.ts | 3 +
.../data_stream_details_client.ts | 30 +-
.../services/data_stream_details/types.ts | 3 +
.../src/notifications.ts | 9 +
.../src/state_machine.ts | 118 +++--
.../dataset_quality_controller/src/types.ts | 18 +-
.../dataset_quality/public/types.ts | 5 +-
.../get_data_stream_details.test.ts | 439 +++++++++++-------
.../get_data_stream_settings.test.ts | 227 +++++++++
.../get_data_stream_details/index.ts | 149 +++++-
.../server/routes/data_streams/routes.ts | 52 ++-
.../dataset_quality/tsconfig.json | 4 +-
.../data_streams/data_stream_details.spec.ts | 26 +-
.../data_streams/data_stream_settings.spec.ts | 106 +++++
.../utils/data_stream.ts | 17 +-
.../apps/dataset_quality/data/logs_data.ts | 8 +-
.../dataset_quality/dataset_quality_flyout.ts | 133 ++++++
.../dataset_quality_summary.ts | 2 +-
.../page_objects/dataset_quality.ts | 61 ++-
.../common/reporting/generate_csv_discover.ts | 4 +-
.../test_suites/observability/config.ts | 5 +-
.../common/dataset_quality_api_supertest.ts | 129 +++++
.../common/services.ts | 38 ++
.../data_stream_details.ts | 96 ++++
.../data_stream_settings.ts | 101 ++++
.../dataset_quality_api_integration/index.ts | 14 +
.../utils/data_stream.ts | 26 ++
.../utils/expect_to_reject.ts | 17 +
.../utils/index.ts | 9 +
.../test_suites/observability/index.ts | 1 +
.../dataset_quality/data/logs_data.ts | 6 +-
.../dataset_quality/dataset_quality_flyout.ts | 150 +++++-
.../dataset_quality_summary.ts | 4 +-
x-pack/test_serverless/tsconfig.json | 1 +
59 files changed, 2725 insertions(+), 466 deletions(-)
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_header.tsx
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpi_item.tsx
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpis.tsx
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.test.ts
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.ts
create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_settings.test.ts
create mode 100644 x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/services.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/data_stream.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/expect_to_reject.ts
create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/index.ts
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 4a6c4b24a6800..0c57ef0d7dc9a 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1133,6 +1133,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql
# Logs
/x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team
/x-pack/test/dataset_quality_api_integration @elastic/obs-ux-logs-team
+/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration @elastic/obs-ux-logs-team
/x-pack/test/functional/apps/observability_logs_explorer @elastic/obs-ux-logs-team
/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer @elastic/obs-ux-logs-team
/x-pack/test/functional/apps/dataset_quality @elastic/obs-ux-logs-team
diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts
index ae098c08c8ec8..4dac346e2a26a 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts
+++ b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts
@@ -76,9 +76,19 @@ export const degradedDocsRt = rt.type({
export type DegradedDocs = rt.TypeOf;
+export const dataStreamSettingsRt = rt.partial({
+ createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless
+});
+
+export type DataStreamSettings = rt.TypeOf;
+
export const dataStreamDetailsRt = rt.partial({
- createdOn: rt.number,
lastActivity: rt.number,
+ degradedDocsCount: rt.number,
+ docsCount: rt.number,
+ sizeBytes: rt.union([rt.null, rt.number]), // rt.null is only needed for https://github.com/elastic/kibana/issues/178954
+ services: rt.record(rt.string, rt.array(rt.string)),
+ hosts: rt.record(rt.string, rt.array(rt.string)),
});
export type DataStreamDetails = rt.TypeOf;
@@ -95,6 +105,8 @@ export const getDataStreamsDegradedDocsStatsResponseRt = rt.exact(
})
);
+export const getDataStreamsSettingsResponseRt = rt.exact(dataStreamSettingsRt);
+
export const getDataStreamsDetailsResponseRt = rt.exact(dataStreamDetailsRt);
export const dataStreamsEstimatedDataInBytesRT = rt.type({
diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts
index 325cae3dc99b3..a5be06438d3c8 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts
+++ b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts
@@ -18,4 +18,11 @@ export const DEFAULT_SORT_DIRECTION = 'asc';
export const NONE = 'none';
export const DEFAULT_TIME_RANGE = { from: 'now-24h', to: 'now' };
+export const DEFAULT_DATEPICKER_REFRESH = { value: 60000, pause: false };
+
export const DEFAULT_DEGRADED_DOCS = { percentage: 0, count: 0 };
+
+export const NUMBER_FORMAT = '0,0.[000]';
+export const BYTE_NUMBER_FORMAT = '0.0 b';
+
+export const MAX_HOSTS_METRIC_VALUE = 50;
diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts
index 7fbbf4d8f3e90..66fbffd452dc6 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts
+++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts
@@ -30,8 +30,17 @@ export type GetDataStreamsDegradedDocsStatsResponse =
export type DataStreamDegradedDocsStatServiceResponse = DegradedDocsStatType[];
export type DegradedDocsStatType = GetDataStreamsDegradedDocsStatsResponse['degradedDocs'][0];
-export type GetDataStreamDetailsParams =
+export type GetDataStreamSettingsParams =
+ APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>['params']['path'];
+export type GetDataStreamSettingsResponse =
+ APIReturnType<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>;
+
+type GetDataStreamDetailsPathParams =
APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>['params']['path'];
+type GetDataStreamDetailsQueryParams =
+ APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>['params']['query'];
+export type GetDataStreamDetailsParams = GetDataStreamDetailsPathParams &
+ GetDataStreamDetailsQueryParams;
export type GetDataStreamDetailsResponse =
APIReturnType<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>;
@@ -47,4 +56,4 @@ export type GetIntegrationDashboardsResponse =
export type DashboardType = GetIntegrationDashboardsResponse['dashboards'][0];
export type { DataStreamStat } from './data_stream_stat';
-export type { DataStreamDetails } from '../api_types';
+export type { DataStreamDetails, DataStreamSettings } from '../api_types';
diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts
index c2441a648566f..d31f3d537eb22 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts
+++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts
@@ -88,6 +88,10 @@ export const flyoutIntegrationNameText = i18n.translate(
}
);
+export const flyoutSummaryText = i18n.translate('xpack.datasetQuality.flyoutSummaryTitle', {
+ defaultMessage: 'Summary',
+});
+
export const flyoutDegradedDocsText = i18n.translate(
'xpack.datasetQuality.flyout.degradedDocsTitle',
{
@@ -110,6 +114,29 @@ export const flyoutDegradedDocsPercentageText = i18n.translate(
}
);
+export const flyoutDocsCountTotalText = i18n.translate(
+ 'xpack.datasetQuality.flyoutDocsCountTotal',
+ {
+ defaultMessage: 'Docs count (total)',
+ }
+);
+
+export const flyoutSizeText = i18n.translate('xpack.datasetQuality.flyoutSizeText', {
+ defaultMessage: 'Size',
+});
+
+export const flyoutServicesText = i18n.translate('xpack.datasetQuality.flyoutServicesText', {
+ defaultMessage: 'Services',
+});
+
+export const flyoutHostsText = i18n.translate('xpack.datasetQuality.flyoutHostsText', {
+ defaultMessage: 'Hosts',
+});
+
+export const flyoutShowAllText = i18n.translate('xpack.datasetQuality.flyoutShowAllText', {
+ defaultMessage: 'Show all',
+});
+
/*
Summary Panel
*/
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx
index 803cd6ab50a6a..f44bd78316916 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx
+++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx
@@ -6,9 +6,10 @@
*/
import React from 'react';
+import { formatNumber } from '@elastic/eui';
-import { formatBytes } from '@kbn/formatters';
import { useSummaryPanelContext } from '../../../hooks';
+import { BYTE_NUMBER_FORMAT } from '../../../../common/constants';
import {
summaryPanelEstimatedDataText,
summaryPanelEstimatedDataTooltipText,
@@ -22,7 +23,7 @@ export function EstimatedData() {
);
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx
index 1fb229e1b7155..1558e2ce50615 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx
+++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx
@@ -16,6 +16,7 @@ import {
EuiToolTip,
EuiButtonIcon,
EuiText,
+ formatNumber,
EuiSkeletonRectangle,
} from '@elastic/eui';
import { FieldFormatsStart } from '@kbn/field-formats-plugin/public';
@@ -24,10 +25,10 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import React from 'react';
import { css } from '@emotion/react';
-import { formatBytes } from '@kbn/formatters';
import {
DEGRADED_QUALITY_MINIMUM_PERCENTAGE,
POOR_QUALITY_MINIMUM_PERCENTAGE,
+ BYTE_NUMBER_FORMAT,
} from '../../../../common/constants';
import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat';
import { QualityIndicator } from '../../quality_indicator';
@@ -207,7 +208,7 @@ export const getDatasetQualityTableColumns = ({
borderRadius="m"
isLoading={loadingDataStreamStats}
>
- {formatBytes(dataStreamStat.sizeBytes || 0)}
+ {formatNumber(dataStreamStat.sizeBytes || 0, BYTE_NUMBER_FORMAT)}
),
width: '100px',
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx
index 70f33c5a134bc..d8aade6d74e51 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx
+++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx
@@ -7,6 +7,7 @@
import { EuiSkeletonRectangle, EuiFlexGroup, EuiLink } from '@elastic/eui';
import React from 'react';
+import { _IGNORED } from '../../../../common/es_fields';
import { useLinkToLogsExplorer } from '../../../hooks';
import { QualityPercentageIndicator } from '../../quality_indicator';
import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat';
@@ -24,7 +25,7 @@ export const DegradedDocsPercentageLink = ({
const logsExplorerLinkProps = useLinkToLogsExplorer({
dataStreamStat,
- query: { language: 'kuery', query: '_ignored:*' },
+ query: { language: 'kuery', query: `${_IGNORED}: *` },
});
return (
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx
index a0954ab44e49b..052f4b63f0da6 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx
+++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx
@@ -8,7 +8,7 @@
import React from 'react';
import { FieldFormatsStart } from '@kbn/field-formats-plugin/public';
import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/field-types';
-import { DataStreamDetails } from '../../../common/data_streams_stats';
+import { DataStreamDetails, DataStreamSettings } from '../../../common/data_streams_stats';
import {
flyoutDatasetCreatedOnText,
flyoutDatasetDetailsText,
@@ -18,18 +18,27 @@ import { FieldsList, FieldsListLoading } from './fields_list';
interface DatasetSummaryProps {
fieldFormats: FieldFormatsStart;
+ dataStreamSettings?: DataStreamSettings;
+ dataStreamSettingsLoading: boolean;
dataStreamDetails?: DataStreamDetails;
+ dataStreamDetailsLoading: boolean;
}
-export function DatasetSummary({ dataStreamDetails, fieldFormats }: DatasetSummaryProps) {
+export function DatasetSummary({
+ dataStreamSettings,
+ dataStreamSettingsLoading,
+ dataStreamDetails,
+ dataStreamDetailsLoading,
+ fieldFormats,
+}: DatasetSummaryProps) {
const dataFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [
ES_FIELD_TYPES.DATE,
]);
const formattedLastActivity = dataStreamDetails?.lastActivity
? dataFormatter.convert(dataStreamDetails?.lastActivity)
: '-';
- const formattedCreatedOn = dataStreamDetails?.createdOn
- ? dataFormatter.convert(dataStreamDetails.createdOn)
+ const formattedCreatedOn = dataStreamSettings?.createdOn
+ ? dataFormatter.convert(dataStreamSettings.createdOn)
: '-';
return (
@@ -39,10 +48,12 @@ export function DatasetSummary({ dataStreamDetails, fieldFormats }: DatasetSumma
{
fieldTitle: flyoutDatasetLastActivityText,
fieldValue: formattedLastActivity,
+ isLoading: dataStreamDetailsLoading,
},
{
fieldTitle: flyoutDatasetCreatedOnText,
fieldValue: formattedCreatedOn,
+ isLoading: dataStreamSettingsLoading,
},
]}
/>
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx
index 9a5348ed1495d..89087a26a1960 100644
--- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx
+++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx
@@ -5,166 +5,94 @@
* 2.0.
*/
-import React, { useCallback, useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import { css } from '@emotion/react';
import { FormattedMessage } from '@kbn/i18n-react';
import {
EuiFlexGroup,
+ EuiFlexItem,
EuiPanel,
EuiSpacer,
EuiTitle,
- EuiText,
- EuiSuperDatePicker,
- OnRefreshProps,
EuiToolTip,
EuiIcon,
EuiCode,
+ OnTimeChangeProps,
EuiSkeletonRectangle,
} from '@elastic/eui';
-import {
- UnifiedBreakdownFieldSelector,
- fieldSupportsBreakdown,
-} from '@kbn/unified-histogram-plugin/public';
-import type { DataView, DataViewField } from '@kbn/data-views-plugin/common';
+import { UnifiedBreakdownFieldSelector } from '@kbn/unified-histogram-plugin/public';
+import type { DataViewField } from '@kbn/data-views-plugin/common';
+import { useDegradedDocsChart } from '../../../hooks';
-import { useCreateDataView } from '../../../hooks';
-import { indexNameToDataStreamParts } from '../../../../common/utils';
-import { DEFAULT_LOGS_DATA_VIEW, DEFAULT_TIME_RANGE } from '../../../../common/constants';
+import { DEFAULT_TIME_RANGE, DEFAULT_DATEPICKER_REFRESH } from '../../../../common/constants';
import { flyoutDegradedDocsText } from '../../../../common/translations';
import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller';
-import { useDatasetQualityContext } from '../../dataset_quality/context';
import { DegradedDocsChart } from './degraded_docs_chart';
-const DEFAULT_REFRESH = { value: 60000, pause: false };
-
export function DegradedDocs({
dataStream,
- timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_REFRESH },
- breakdownField,
+ timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_DATEPICKER_REFRESH },
+ lastReloadTime,
+ onTimeRangeChange,
}: {
dataStream?: string;
timeRange?: TimeRangeConfig;
- breakdownField?: string;
+ lastReloadTime: number;
+ onTimeRangeChange: (props: Pick) => void;
}) {
- const { service } = useDatasetQualityContext();
- const { dataView } = useCreateDataView({
- indexPatternString: getDataViewIndexPattern(dataStream),
- });
+ const { dataView, breakdown, ...chartProps } = useDegradedDocsChart({ dataStream });
const [breakdownDataViewField, setBreakdownDataViewField] = useState